diff --git a/.docker/.env b/.docker/.env index e50d4f6b5b1c15372029abec7a4fb924a70781ad..f72626ab5ef38013f5672b522006ea410925ead0 100644 --- a/.docker/.env +++ b/.docker/.env @@ -1,9 +1,13 @@ +APP_VERSION=1.9 +FLUENTBIT_VERSION=4.0.0 +GRAFANA_VERSION=11.4.0 MARIADB_VERSION=11.3.2 -POSTGRES_VERSION=17.0.0 -KEYCLOAK_VERSION=26.0.4 -RABBITMQ_VERSION=3.13.7 -OPENSEARCH_VERSION=2.10.0 -NGINX_VERSION=1.27.3-alpine3.20-slim +KEYCLOAK_VERSION=26.2.4 +MYSQLD_EXPORTER_VERSION=0.15.1 +NGINX_VERSION=1.28.0 OPENLDAP_VERSION=2.6.8 -SEAWEEDFS_VERSION=3.71.0 -PROMETHEUS_VERSION=2.54.1 \ No newline at end of file +OPENSEARCH_VERSION=2.18.0 +POSTGRES_VERSION=17.0.0 +PROMETHEUS_VERSION=2.54.1 +RABBITMQ_VERSION=3.13.1 +SEAWEEDFS_VERSION=3.87.0 diff --git a/.docker/docker-compose.yml b/.docker/docker-compose.yml index 49c5261b6c32b4590f7e3bb130ebbbc67c7ac350..f6f63db234df42d46156470391db7d7b3f8fb5c7 100644 --- a/.docker/docker-compose.yml +++ b/.docker/docker-compose.yml @@ -1,57 +1,3 @@ -x-resources-nano: &resources-nano - resources: - reservations: - cpus: '0.1' - memory: 128M - limits: - cpus: '0.15' - memory: 192M - -x-resources-micro: &resources-micro - resources: - reservations: - cpus: '0.25' - memory: 256M - limits: - cpus: '0.375' - memory: 384M - -x-resources-nano-hm: &resources-micro-hm - resources: - reservations: - cpus: '0.25' - memory: 256M - limits: - cpus: '0.375' - memory: 4096M - -x-resources-small: &resources-small - resources: - reservations: - cpus: '0.5' - memory: 512M - limits: - cpus: '0.75' - memory: 768M - -x-resources-medium: &resources-medium - resources: - reservations: - cpus: '0.5' - memory: 1024M - limits: - cpus: '0.75' - memory: 1536M - -x-resources-large: &resources-large - resources: - reservations: - cpus: '1' - memory: 2048M - limits: - cpus: '1.5' - memory: 3072M - x-healthcheck-params: &healthcheck-params interval: 30s timeout: 10s @@ -66,29 +12,49 @@ volumes: identity-service-data: metric-db-data: dashboard-ui-data: + dashboard-db-data: services: dbrepo-metadata-db: restart: "no" container_name: dbrepo-metadata-db hostname: metadata-db - image: docker.io/bitnami/mariadb:${MARIADB_VERSION} + image: docker.io/bitnami/mariadb-galera:${MARIADB_VERSION} volumes: - - metadata-db-data:/var/lib/mysql + - metadata-db-data:/bitnami/mariadb - ./config/1_setup-schema.sql:/docker-entrypoint-initdb.d/1_setup-schema.sql - ./config/2_setup-data.sql:/docker-entrypoint-initdb.d/2_setup-data.sql ports: - "3306:3306" environment: + MARIADB_GALERA_MARIABACKUP_PASSWORD: "${METADATA_DB_BACKUP_PASSWORD:-dbrepo}" MARIADB_DATABASE: "${METADATA_DB:-dbrepo}" - MARIADB_EXTRA_FLAGS: "${METADATA_DB_EXTRA_FLAGS:---max_connections=155 --max-statement-time=60}" + MARIADB_PASSWORD: "${READONLY_PASSWORD:-readonly}" MARIADB_ROOT_PASSWORD: "${METADATA_DB_PASSWORD:-dbrepo}" + MARIADB_SKIP_TEST_DB: "yes" + MARIADB_USER: "${READONLY_USERNAME:-readonly}" healthcheck: - test: /opt/bitnami/scripts/mariadb/healthcheck.sh --connect --innodb_initialized + test: /opt/bitnami/scripts/mariadb-galera/healthcheck.sh --connect --innodb_initialized <<: *healthcheck-params - deploy: - <<: *resources-micro-hm - platform: linux/amd64 + logging: + driver: json-file + + dbrepo-metadata-db-metrics: + restart: "no" + container_name: dbrepo-metadata-db-metrics + hostname: metadata-db-metrics + image: docker.io/bitnami/mysqld-exporter:${MYSQLD_EXPORTER_VERSION} + command: + - --mysqld.address=metadata-db:3306 + - --config.my-cnf=/.my.cnf + volumes: + - ./config/metrics.cnf:/.my.cnf + healthcheck: + test: -h + <<: *healthcheck-params + depends_on: + dbrepo-metadata-db: + condition: service_healthy logging: driver: json-file @@ -96,23 +62,40 @@ services: restart: "no" container_name: dbrepo-data-db hostname: data-db - image: docker.io/bitnami/mariadb:${MARIADB_VERSION} + image: docker.io/bitnami/mariadb-galera:${MARIADB_VERSION} volumes: - - data-db-data:/var/lib/mysql + - data-db-data:/bitnami/mariadb - ./config/1_grant-user.sql:/docker-entrypoint-initdb.d/1_grant-user.sql ports: - "3307:3306" environment: - MARIADB_EXTRA_FLAGS: "${DATA_DB_EXTRA_FLAGS:---max_connections=155 --max-statement-time=60}" + MARIADB_GALERA_MARIABACKUP_PASSWORD: "${DATA_DB_BACKUP_PASSWORD:-dbrepo}" MARIADB_PASSWORD: "${READONLY_PASSWORD:-readonly}" MARIADB_ROOT_PASSWORD: "${DATA_DB_PASSWORD:-dbrepo}" + MARIADB_SKIP_TEST_DB: "yes" MARIADB_USER: "${READONLY_USERNAME:-readonly}" healthcheck: - test: /opt/bitnami/scripts/mariadb/healthcheck.sh --connect --innodb_initialized + test: /opt/bitnami/scripts/mariadb-galera/healthcheck.sh --connect --innodb_initialized <<: *healthcheck-params - deploy: - <<: *resources-micro-hm - platform: linux/amd64 + logging: + driver: json-file + + dbrepo-data-db-metrics: + restart: "no" + container_name: dbrepo-data-db-metrics + hostname: data-db-metrics + image: docker.io/bitnami/mysqld-exporter:${MYSQLD_EXPORTER_VERSION} + command: + - --mysqld.address=data-db:3306 + - --config.my-cnf=/.my.cnf + volumes: + - ./config/metrics.cnf:/.my.cnf + healthcheck: + test: -h + <<: *healthcheck-params + depends_on: + dbrepo-data-db: + condition: service_healthy logging: driver: json-file @@ -131,9 +114,23 @@ services: healthcheck: test: "psql -U ${AUTH_DB_USERNAME:-keycloak} -h 127.0.0.1 -p 5432 -d ${AUTH_DB_NAME:-keycloak} -c 'select version();'" <<: *healthcheck-params - deploy: - <<: *resources-micro - platform: linux/amd64 + logging: + driver: json-file + + dbrepo-dashboard-db: + restart: "no" + container_name: dbrepo-dashboard-db + hostname: dashboard-db + image: docker.io/bitnami/postgresql:${POSTGRES_VERSION} + volumes: + - dashboard-db-data:/bitnami/postgresql + environment: + POSTGRESQL_DATABASE: "${DASHBOARD_DB_NAME:-grafana}" + POSTGRESQL_USERNAME: "${DASHBOARD_DB_USERNAME:-grafana}" + POSTGRESQL_PASSWORD: "${DASHBOARD_DB_PASSWORD:-dbrepo}" + healthcheck: + test: "psql -U ${DASHBOARD_DB_USERNAME:-grafana} -h 127.0.0.1 -p 5432 -d ${DASHBOARD_DB_NAME:-grafana} -c 'select version();'" + <<: *healthcheck-params logging: driver: json-file @@ -161,16 +158,13 @@ services: KEYCLOAK_DATABASE_USER: "${AUTH_DB_USERNAME:-keycloak}" KEYCLOAK_DATABASE_PASSWORD: "${AUTH_DB_PASSWORD:-dbrepo}" KEYCLOAK_HOSTNAME: "${BASE_URL:-http://localhost}" - KEYCLOAK_HOSTNAME_ADMIN: "http://localhost:8080" + KEYCLOAK_HOSTNAME_ADMIN: "${BASE_URL:-http://localhost}:8080" METADATA_SERVICE_ENDPOINT: "${METADATA_SERVICE_ENDPOINT:-http://metadata-service:8080}" SYSTEM_USERNAME: "${SYSTEM_USERNAME:-admin}" SYSTEM_PASSWORD: "${SYSTEM_PASSWORD:-admin}" healthcheck: test: curl -fsS localhost:8080/realms/master <<: *healthcheck-params - deploy: - <<: *resources-medium - platform: linux/amd64 depends_on: dbrepo-identity-service: condition: service_healthy @@ -183,7 +177,7 @@ services: init: true restart: "no" container_name: dbrepo-auth-service-init - image: registry.datalab.tuwien.ac.at/dbrepo/auth-service-init:1.8.1 + image: registry.datalab.tuwien.ac.at/dbrepo/auth-service-init:${APP_VERSION} environment: AUTH_SERVICE_ENDPOINT: ${AUTH_SERVICE_ENDPOINT:-http://auth-service:8080} METADATA_DB: "${METADATA_DB:-dbrepo}" @@ -192,14 +186,11 @@ services: READONLY_USERNAME: "${READONLY_USERNAME:-readonly}" SYSTEM_USERNAME: "${SYSTEM_USERNAME:-admin}" SYSTEM_PASSWORD: ${SYSTEM_PASSWORD:-admin} - deploy: - <<: *resources-nano - platform: linux/amd64 depends_on: dbrepo-auth-service: condition: service_healthy dbrepo-gateway-service: - condition: service_healthy + condition: service_started dbrepo-metadata-db: condition: service_healthy logging: @@ -209,7 +200,7 @@ services: restart: "no" container_name: dbrepo-metadata-service hostname: metadata-service - image: registry.datalab.tuwien.ac.at/dbrepo/metadata-service:1.8.1 + image: registry.datalab.tuwien.ac.at/dbrepo/metadata-service:${APP_VERSION} environment: ADMIN_EMAIL: "${ADMIN_EMAIL:-noreply@localhost}" ANALYSE_SERVICE_ENDPOINT: "${ANALYSE_SERVICE_ENDPOINT:-http://analyse-service:8080}" @@ -251,9 +242,6 @@ services: healthcheck: test: curl -sSL localhost:8080/actuator/health/liveness | grep 'UP' || exit 1 <<: *healthcheck-params - deploy: - <<: *resources-small - platform: linux/amd64 depends_on: dbrepo-auth-service: condition: service_healthy @@ -274,7 +262,7 @@ services: restart: "no" container_name: dbrepo-analyse-service hostname: analyse-service - image: registry.datalab.tuwien.ac.at/dbrepo/analyse-service:1.8.1 + image: registry.datalab.tuwien.ac.at/dbrepo/analyse-service:${APP_VERSION} environment: AUTH_SERVICE_CLIENT: ${AUTH_SERVICE_CLIENT:-dbrepo-client} AUTH_SERVICE_CLIENT_SECRET: ${AUTH_SERVICE_CLIENT:-MUwRc7yfXSJwX8AdRMWaQC3Nep1VjwgG} @@ -291,9 +279,6 @@ services: healthcheck: test: curl -sSL localhost:8080/health | grep 'UP' || exit 1 <<: *healthcheck-params - deploy: - <<: *resources-micro - platform: linux/amd64 logging: driver: json-file @@ -319,9 +304,6 @@ services: healthcheck: test: rabbitmq-diagnostics -q is_running | grep 'is fully booted and running' <<: *healthcheck-params - deploy: - <<: *resources-micro - platform: linux/amd64 logging: driver: json-file @@ -337,9 +319,6 @@ services: healthcheck: test: curl -sSL 127.0.0.1:9200 <<: *healthcheck-params - deploy: - <<: *resources-medium - platform: linux/amd64 logging: driver: json-file @@ -347,7 +326,7 @@ services: restart: "no" container_name: dbrepo-search-service hostname: search-service - image: registry.datalab.tuwien.ac.at/dbrepo/search-service:1.8.1 + image: registry.datalab.tuwien.ac.at/dbrepo/search-service:${APP_VERSION} environment: AUTH_SERVICE_CLIENT: ${AUTH_SERVICE_CLIENT:-dbrepo-client} AUTH_SERVICE_CLIENT_SECRET: ${AUTH_SERVICE_CLIENT_SECRET:-MUwRc7yfXSJwX8AdRMWaQC3Nep1VjwgG} @@ -362,9 +341,6 @@ services: healthcheck: test: curl -sSL localhost:8080/health | grep 'UP' || exit 1 <<: *healthcheck-params - deploy: - <<: *resources-micro - platform: linux/amd64 logging: driver: json-file @@ -372,7 +348,7 @@ services: restart: "no" container_name: dbrepo-ui hostname: ui - image: registry.datalab.tuwien.ac.at/dbrepo/ui:1.8.1 + image: registry.datalab.tuwien.ac.at/dbrepo/ui:${APP_VERSION} environment: NUXT_PUBLIC_API_CLIENT: "${BASE_URL:-http://localhost}" NUXT_PUBLIC_API_SERVER: "${BASE_URL:-http://gateway-service}" @@ -389,9 +365,6 @@ services: healthcheck: test: curl -fsSL 127.0.0.1:3000 && curl -fsSL 127.0.0.1:3000/health <<: *healthcheck-params - deploy: - <<: *resources-micro - platform: linux/amd64 depends_on: dbrepo-search-service: condition: service_healthy @@ -404,17 +377,11 @@ services: restart: "no" container_name: dbrepo-gateway-service hostname: gateway-service - image: docker.io/nginx:${NGINX_VERSION} + image: docker.io/bitnami/nginx:${NGINX_VERSION} ports: - "80:8080" volumes: - - ./config/dbrepo.conf:/etc/nginx/conf.d/default.conf - healthcheck: - test: lsof -i TCP:80 || exit 1 - <<: *healthcheck-params - deploy: - <<: *resources-nano - platform: linux/amd64 + - ./dbrepo-gateway-service/dbrepo.conf:/opt/bitnami/nginx/conf/server_blocks/dbrepo.conf:ro depends_on: dbrepo-analyse-service: condition: service_healthy @@ -437,7 +404,7 @@ services: restart: "no" container_name: dbrepo-identity-service hostname: identity-service - image: bitnami/openldap:2.6.8-debian-12-r1 + image: docker.io/bitnami/openldap:${OPENLDAP_VERSION} environment: LDAP_ADMIN_USERNAME: "${IDENTITY_SERVICE_ADMIN_USERNAME:-admin}" LDAP_ADMIN_PASSWORD: "${IDENTITY_SERVICE_ADMIN_PASSWORD:-admin}" @@ -451,9 +418,6 @@ services: healthcheck: test: "ldapwhoami -H ldap://localhost:1389 -D ${IDENTITY_SERVICE_ADMIN_DN:-cn=admin,dc=dbrepo,dc=at} -w ${IDENTITY_SERVICE_ADMIN_PASSWORD:-admin} || exit 1" <<: *healthcheck-params - deploy: - <<: *resources-nano - platform: linux/amd64 logging: driver: json-file @@ -462,7 +426,7 @@ services: init: true container_name: dbrepo-search-service-init hostname: search-service-init - image: registry.datalab.tuwien.ac.at/dbrepo/search-service-init:1.8.1 + image: registry.datalab.tuwien.ac.at/dbrepo/search-service-init:${APP_VERSION} environment: LOG_LEVEL: ${LOG_LEVEL:-info} METADATA_SERVICE_ENDPOINT: ${METADATA_SERVICE_ENDPOINT:-http://metadata-service:8080} @@ -470,9 +434,6 @@ services: OPENSEARCH_PORT: ${OPENSEARCH_PORT:-9200} SYSTEM_USERNAME: "${SYSTEM_USERNAME:-admin}" SYSTEM_PASSWORD: "${SYSTEM_PASSWORD:-admin}" - deploy: - <<: *resources-nano - platform: linux/amd64 depends_on: dbrepo-search-db: condition: service_healthy @@ -486,16 +447,13 @@ services: init: true container_name: dbrepo-dashboard-service-init hostname: search-dashboard-init - image: registry.datalab.tuwien.ac.at/dbrepo/dashboard-service-init:1.8.1 + image: registry.datalab.tuwien.ac.at/dbrepo/dashboard-service-init:${APP_VERSION} environment: LOG_LEVEL: ${LOG_LEVEL:-info} DASHBOARD_UI_ENDPOINT: "${DASHBOARD_UI_ENDPOINT:-http://dashboard-ui:3000}" METADATA_SERVICE_ENDPOINT: ${METADATA_SERVICE_ENDPOINT:-http://metadata-service:8080} SYSTEM_USERNAME: "${SYSTEM_USERNAME:-admin}" SYSTEM_PASSWORD: "${SYSTEM_PASSWORD:-admin}" - deploy: - <<: *resources-nano - platform: linux/amd64 depends_on: dbrepo-dashboard-ui: condition: service_healthy @@ -518,9 +476,6 @@ services: healthcheck: test: echo "cluster.check" | weed shell | grep "checking master.*ok" || exit 1 <<: *healthcheck-params - deploy: - <<: *resources-nano - platform: linux/amd64 logging: driver: json-file @@ -535,9 +490,6 @@ services: healthcheck: test: promtool check healthy <<: *healthcheck-params - deploy: - <<: *resources-nano - platform: linux/amd64 logging: driver: json-file @@ -546,15 +498,12 @@ services: init: true container_name: dbrepo-storage-service-init hostname: storage-service-init - image: registry.datalab.tuwien.ac.at/dbrepo/storage-service-init:1.8.1 + image: registry.datalab.tuwien.ac.at/dbrepo/storage-service-init:${APP_VERSION} environment: S3_ACCESS_KEY_ID: ${S3_ACCESS_KEY_ID:-seaweedfsadmin} S3_BUCKET: "${S3_BUCKET:-dbrepo}" S3_SECRET_ACCESS_KEY: ${S3_SECRET_ACCESS_KEY:-seaweedfsadmin} STORAGE_ENDPOINT: ${STORAGE_ENDPOINT:-http://storage-service:9000} - deploy: - <<: *resources-nano - platform: linux/amd64 depends_on: dbrepo-storage-service: condition: service_healthy @@ -565,7 +514,7 @@ services: restart: "no" container_name: dbrepo-data-service hostname: data-service - image: registry.datalab.tuwien.ac.at/dbrepo/data-service:1.8.1 + image: registry.datalab.tuwien.ac.at/dbrepo/data-service:${APP_VERSION} environment: AUTH_SERVICE_CLIENT: "${AUTH_SERVICE_CLIENT:-dbrepo-client}" AUTH_SERVICE_CLIENT_SECRET: "${AUTH_SERVICE_CLIENT:-MUwRc7yfXSJwX8AdRMWaQC3Nep1VjwgG}" @@ -600,9 +549,6 @@ services: healthcheck: test: curl -sSL localhost:8080/actuator/health/liveness | grep 'UP' || exit 1 <<: *healthcheck-params - deploy: - <<: *resources-large - platform: linux/amd64 depends_on: dbrepo-data-db: condition: service_healthy @@ -613,15 +559,24 @@ services: restart: "no" container_name: dbrepo-dashboard-ui hostname: dashboard-ui - image: registry.datalab.tuwien.ac.at/dbrepo/dashboard-ui:1.8.1 + image: docker.io/bitnami/grafana:${GRAFANA_VERSION} ports: - "3000:3000" volumes: - - dashboard-ui-data:/opt/bitnami/grafana/data + - ./config/dashboards:/app/dashboards + - ./config/grafana.ini:/opt/bitnami/grafana/conf/grafana.ini + - ./config/ldap.toml:/opt/bitnami/grafana/conf/ldap.toml + - ./config/provisioning/dashboards/provider.yaml:/opt/bitnami/grafana/conf/provisioning/dashboards/provider.yaml + - ./config/provisioning/datasources/infinity.yaml:/opt/bitnami/grafana/conf/provisioning/datasources/infinity.yaml + - ./config/provisioning/datasources/prometheus.yaml:/opt/bitnami/grafana/conf/provisioning/datasources/prometheus.yaml + - ./config/provisioning/datasources/opensearch.yaml:/opt/bitnami/grafana/conf/provisioning/datasources/opensearch.yaml environment: BASE_URL: "${BASE_URL:-http://localhost}" + DASHBOARD_DB_NAME: "${DASHBOARD_DB_NAME:-grafana}" + DASHBOARD_DB_USERNAME: "${DASHBOARD_DB_USERNAME:-grafana}" + DASHBOARD_DB_PASSWORD: "${DASHBOARD_DB_PASSWORD:-dbrepo}" GF_SERVER_ROOT_URL: http://dashboard-ui:3000/dashboard/ - GF_INSTALL_PLUGINS: "yesoreyeram-infinity-datasource" + GF_INSTALL_PLUGINS: "yesoreyeram-infinity-datasource,grafana-opensearch-datasource" GF_SECURITY_DISABLE_INITIAL_ADMIN_CREATION: "true" LDAP_ADMIN_USERNAME: "${IDENTITY_SERVICE_ADMIN_USERNAME:-admin}" LDAP_ADMIN_PASSWORD: "${IDENTITY_SERVICE_ADMIN_PASSWORD:-admin}" @@ -629,9 +584,6 @@ services: healthcheck: test: curl -fsSL --head 127.0.0.1:3000 <<: *healthcheck-params - deploy: - <<: *resources-nano - platform: linux/amd64 extra_hosts: - "localhost:host-gateway" logging: @@ -641,9 +593,7 @@ services: restart: "no" container_name: dbrepo-dashboard-service hostname: dashboard-service - image: registry.datalab.tuwien.ac.at/dbrepo/dashboard-service:1.8.1 - ports: - - "4070:8080" + image: registry.datalab.tuwien.ac.at/dbrepo/dashboard-service:${APP_VERSION} environment: AUTH_SERVICE_ENDPOINT: ${AUTH_SERVICE_ENDPOINT:-http://auth-service:8080} BASE_URL: "${BASE_URL:-http://localhost}" @@ -653,9 +603,6 @@ services: healthcheck: test: curl -fsSL --head 127.0.0.1:8080/health <<: *healthcheck-params - deploy: - <<: *resources-micro - platform: linux/amd64 depends_on: dbrepo-dashboard-ui: condition: service_healthy diff --git a/.docs/.openapi/api-analyse.yaml b/.docs/.openapi/api-analyse-service.yaml similarity index 99% rename from .docs/.openapi/api-analyse.yaml rename to .docs/.openapi/api-analyse-service.yaml index f859315e1f901d4a12fa6c56f99266a77748bd66..287da431362cba6b19ff3783011daa183ae2b889 100644 --- a/.docs/.openapi/api-analyse.yaml +++ b/.docs/.openapi/api-analyse-service.yaml @@ -111,7 +111,7 @@ }, "externalDocs": { "description": "Sourcecode Documentation", - "url": "https://www.ifs.tuwien.ac.at/infrastructures/dbrepo/1.8/" + "url": "https://www.ifs.tuwien.ac.at/infrastructures/dbrepo/1.9/" }, "info": { "contact": { @@ -124,7 +124,7 @@ "url": "https://www.apache.org/licenses/LICENSE-2.0" }, "title": "Database Repository Analyse Service API", - "version": "1.8.1" + "version": "1.9.0" }, "openapi": "3.0.0", "paths": { diff --git a/.docs/.openapi/api-dashboard-service.yaml b/.docs/.openapi/api-dashboard-service.yaml new file mode 100644 index 0000000000000000000000000000000000000000..10a0140d0965d69e1c3b147588b58935973031f3 --- /dev/null +++ b/.docs/.openapi/api-dashboard-service.yaml @@ -0,0 +1,231 @@ +{ + "components": { + "schemas": { + "ApiError": { + "properties": { + "code": { + "example": "error.dashboard.create", + "type": "string" + }, + "message": { + "example": "Message", + "type": "string" + }, + "status": { + "example": "BAD_REQUEST", + "type": "string" + } + }, + "type": "object" + } + }, + "securitySchemes": { + "basicAuth": { + "in": "header", + "scheme": "basic", + "type": "http" + }, + "bearerAuth": { + "bearerFormat": "JWT", + "in": "header", + "scheme": "bearer", + "type": "http" + } + } + }, + "externalDocs": { + "description": "Sourcecode Documentation", + "url": "https://www.ifs.tuwien.ac.at/infrastructures/dbrepo/1.7/" + }, + "info": { + "contact": { + "email": "andreas.rauber@tuwien.ac.at", + "name": "Prof. Andreas Rauber" + }, + "description": "Service that manages the dashboards", + "license": { + "name": "Apache 2.0", + "url": "https://www.apache.org/licenses/LICENSE-2.0" + }, + "title": "Database Repository Dashboard Service API", + "version": "1.9.0" + }, + "openapi": "3.0.0", + "paths": { + "/api/dashboard": { + "post": { + "consumes": [ + "application/json" + ], + "description": "Creates a dashboard in the Dashboard UI. Requires role `system`.", + "operationId": "create_dashboard", + "parameters": [ + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "properties": { + "database_name": { + "example": "some_database", + "type": "string" + }, + "is_public": { + "example": true, + "type": "boolean" + }, + "is_schema_public": { + "example": true, + "type": "boolean" + }, + "owner_username": { + "example": "foobar", + "type": "string" + } + }, + "required": [ + "is_public", + "is_schema_public", + "database_name", + "owner_username" + ], + "type": "object" + } + } + ], + "produces": [ + "application/json" + ], + "responses": { + "201": { + "content": { + "application/json": { + "schema": { + "type": "object" + } + } + }, + "description": "Created dashboard successfully" + }, + "409": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiError" + } + } + }, + "description": "Dashboard exists with same name" + }, + "500": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiError" + } + } + }, + "description": "Unexpected system error" + } + }, + "security": [ + { + "bearerAuth": [] + }, + { + "basicAuth": [] + } + ], + "summary": "Create dashboard", + "tags": [ + "dashboard-endpoint" + ] + } + }, + "/api/dashboard/{uid}": { + "put": { + "consumes": [ + "application/json" + ], + "description": "Updates a dashboard in the Dashboard UI. Requires role `system`.", + "operationId": "update_dashboard", + "parameters": [ + { + "in": "path", + "name": "uid", + "required": true, + "schema": { + "format": "uuid", + "type": "string" + } + }, + { + "in": "body", + "name": "body", + "required": true, + "schema": { + "type": "object" + } + } + ], + "produces": [ + "application/json" + ], + "responses": { + "202": { + "content": { + "application/json": { + "schema": { + "type": "object" + } + } + }, + "description": "Updated dashboard successfully" + }, + "404": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiError" + } + } + }, + "description": "Dashboard not found" + }, + "500": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiError" + } + } + }, + "description": "Unexpected system error" + } + }, + "security": [ + { + "bearerAuth": [] + }, + { + "basicAuth": [] + } + ], + "summary": "Update dashboard", + "tags": [ + "dashboard-endpoint" + ] + } + } + }, + "servers": [ + { + "description": "Generated server url", + "url": "http://localhost" + }, + { + "description": "Sandbox", + "url": "https://test.dbrepo.tuwien.ac.at" + } + ] +} diff --git a/.docs/.openapi/api-dashboard.yaml b/.docs/.openapi/api-dashboard.yaml deleted file mode 100644 index 54a27444f68e0760fded5be2a5b9d1770a1d8c39..0000000000000000000000000000000000000000 --- a/.docs/.openapi/api-dashboard.yaml +++ /dev/null @@ -1 +0,0 @@ -"<!doctype html> <html lang=en> <title>500 Internal Server Error</title> <h1>Internal Server Error</h1> <p>The server encountered an internal error and was unable to complete your request. Either the server is overloaded or there is an error in the application.</p>" diff --git a/.docs/.openapi/api-data-service.yaml b/.docs/.openapi/api-data-service.yaml new file mode 100644 index 0000000000000000000000000000000000000000..c3947778ccf83e0f1521e86e66710b6891229b3b --- /dev/null +++ b/.docs/.openapi/api-data-service.yaml @@ -0,0 +1,3884 @@ +{ + "openapi": "3.1.0", + "info": { + "title": "Database Repository Data Service API", + "description": "Service that manages the data", + "contact": { + "name": "Prof. Andreas Rauber", + "email": "andreas.rauber@tuwien.ac.at" + }, + "license": { + "name": "Apache 2.0", + "url": "https://www.apache.org/licenses/LICENSE-2.0" + }, + "version": "1.9.0" + }, + "externalDocs": { + "description": "Sourcecode Documentation", + "url": "https://www.ifs.tuwien.ac.at/infrastructures/dbrepo/1.9.0/system-services-metadata/" + }, + "servers": [ + { + "url": "http://localhost", + "description": "Development instance" + }, + { + "url": "https://test.dbrepo.tuwien.ac.at", + "description": "Staging instance" + } + ], + "paths": { + "/api/database/{databaseId}/view/{viewId}/data": { + "get": { + "tags": [ + "view-endpoint" + ], + "summary": "Get view data", + "description": "Gets data from a view of a database. For private databases, the user needs at least *READ* access to the associated database.", + "operationId": "getData", + "parameters": [ + { + "name": "databaseId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "viewId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "page", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "format": "int64" + } + }, + { + "name": "size", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "format": "int64" + } + }, + { + "name": "timestamp", + "in": "query", + "required": false, + "schema": { + "type": "string", + "format": "date-time" + } + }, + { + "name": "Accept", + "in": "header", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Retrieved view data", + "headers": { + "Access-Control-Expose-Headers": { + "description": "Expose `X-Count` custom header", + "required": true, + "style": "simple", + "schema": { + "type": "string" + } + }, + "X-Count": { + "description": "Number of rows", + "required": true, + "style": "simple", + "schema": { + "type": "integer", + "format": "int64" + } + } + }, + "content": { + "application/json": { + "schema": { + "type": "string" + } + }, + "text/csv": {} + } + }, + "400": { + "description": "Request pagination is malformed", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "403": { + "description": "Not allowed to retrieve view data", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "404": { + "description": "Failed to find view in metadata database", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "406": { + "description": "Failed to format data", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "409": { + "description": "View schema could not be mapped", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "503": { + "description": "Failed to establish connection with the metadata service", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + } + }, + "security": [ + { + "basicAuth": [] + }, + { + "bearerAuth": [] + } + ] + }, + "head": { + "tags": [ + "view-endpoint" + ], + "summary": "Get view data", + "description": "Gets data from a view of a database. For private databases, the user needs at least *READ* access to the associated database.", + "operationId": "getData_1", + "parameters": [ + { + "name": "databaseId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "viewId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "page", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "format": "int64" + } + }, + { + "name": "size", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "format": "int64" + } + }, + { + "name": "timestamp", + "in": "query", + "required": false, + "schema": { + "type": "string", + "format": "date-time" + } + }, + { + "name": "Accept", + "in": "header", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Retrieved view data", + "headers": { + "Access-Control-Expose-Headers": { + "description": "Expose `X-Count` custom header", + "required": true, + "style": "simple", + "schema": { + "type": "string" + } + }, + "X-Count": { + "description": "Number of rows", + "required": true, + "style": "simple", + "schema": { + "type": "integer", + "format": "int64" + } + } + }, + "content": { + "application/json": { + "schema": { + "type": "string" + } + }, + "text/csv": {} + } + }, + "400": { + "description": "Request pagination is malformed", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "403": { + "description": "Not allowed to retrieve view data", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "404": { + "description": "Failed to find view in metadata database", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "406": { + "description": "Failed to format data", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "409": { + "description": "View schema could not be mapped", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "503": { + "description": "Failed to establish connection with the metadata service", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + } + }, + "security": [ + { + "basicAuth": [] + }, + { + "bearerAuth": [] + } + ] + } + }, + "/api/database/{databaseId}/table/{tableId}/data": { + "get": { + "tags": [ + "table-endpoint" + ], + "summary": "Get table data", + "description": "Gets data from a table with id. For a table in a private database, the user needs to have at least *READ* access to the associated database. Requests with HTTP method **GET** return the full dataset, requests with HTTP method **HEAD** only the number of tuples in the `X-Count` header.", + "operationId": "getData_2", + "parameters": [ + { + "name": "databaseId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "tableId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "timestamp", + "in": "query", + "required": false, + "schema": { + "type": "string", + "format": "date-time" + } + }, + { + "name": "page", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "format": "int64" + } + }, + { + "name": "size", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "format": "int64" + } + }, + { + "name": "Accept", + "in": "header", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Get table data", + "headers": { + "Access-Control-Expose-Headers": { + "description": "Expose `X-Count` custom header", + "required": true, + "style": "simple", + "schema": { + "type": "string" + } + }, + "X-Count": { + "description": "Number of rows", + "required": true, + "style": "simple", + "schema": { + "type": "integer", + "format": "int64" + } + } + }, + "content": { + "application/json": { + "schema": { + "type": "string" + } + }, + "text/csv": {} + } + }, + "400": { + "description": "Request pagination or table data select query is malformed", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "403": { + "description": "Not allowed to get table data", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "404": { + "description": "Failed to find table in metadata database", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "406": { + "description": "Failed to format data", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "503": { + "description": "Failed to establish connection with the metadata service", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + } + }, + "security": [ + { + "basicAuth": [] + }, + { + "bearerAuth": [] + } + ] + }, + "put": { + "tags": [ + "table-endpoint" + ], + "summary": "Update tuple", + "description": "Updates a data tuple into a table, then the table statistics are updated. The user needs to have at least *WRITE_OWN* access to the associated database. Requires role `insert-table-data`.", + "operationId": "updateRawTuple", + "parameters": [ + { + "name": "databaseId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "tableId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "Authorization", + "in": "header", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TupleUpdateDto" + } + } + }, + "required": true + }, + "responses": { + "202": { + "description": "Updated table data" + }, + "400": { + "description": "Request pagination or table data select query is malformed", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "403": { + "description": "Update table data not allowed", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "404": { + "description": "Failed to find table in metadata database", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "503": { + "description": "Failed to establish connection with the metadata service", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + } + }, + "security": [ + { + "basicAuth": [] + }, + { + "bearerAuth": [] + } + ] + }, + "post": { + "tags": [ + "table-endpoint" + ], + "summary": "Insert tuple", + "description": "Inserts a data tuple into a table, then the table statistics are updated. The user needs to have at least *WRITE_OWN* access to the associated database. Requires role `insert-table-data`.", + "operationId": "insertRawTuple", + "parameters": [ + { + "name": "databaseId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "tableId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "Authorization", + "in": "header", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TupleDto" + } + } + }, + "required": true + }, + "responses": { + "201": { + "description": "Created table data" + }, + "400": { + "description": "Request pagination or table data select query is malformed", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "403": { + "description": "Create table data not allowed", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "404": { + "description": "Failed to find table in metadata database or blob in storage service", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "503": { + "description": "Failed to establish connection with the metadata service or storage service", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + } + }, + "security": [ + { + "basicAuth": [] + }, + { + "bearerAuth": [] + } + ] + }, + "delete": { + "tags": [ + "table-endpoint" + ], + "summary": "Delete tuple", + "description": "Deletes a data tuple into a table, then the table statistics are updated. The user needs to have at least *WRITE_OWN* access to the associated database. Requires role `delete-table-data`.", + "operationId": "deleteRawTuple", + "parameters": [ + { + "name": "databaseId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "tableId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "Authorization", + "in": "header", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TupleDeleteDto" + } + } + }, + "required": true + }, + "responses": { + "202": { + "description": "Deleted table data" + }, + "400": { + "description": "Request pagination or table data select query is malformed", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "403": { + "description": "Delete table data not allowed", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "404": { + "description": "Failed to find table in metadata database", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "503": { + "description": "Failed to establish connection with the metadata service", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + } + }, + "security": [ + { + "basicAuth": [] + }, + { + "bearerAuth": [] + } + ] + }, + "head": { + "tags": [ + "table-endpoint" + ], + "summary": "Get table data", + "description": "Gets data from a table with id. For a table in a private database, the user needs to have at least *READ* access to the associated database. Requests with HTTP method **GET** return the full dataset, requests with HTTP method **HEAD** only the number of tuples in the `X-Count` header.", + "operationId": "getData_3", + "parameters": [ + { + "name": "databaseId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "tableId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "timestamp", + "in": "query", + "required": false, + "schema": { + "type": "string", + "format": "date-time" + } + }, + { + "name": "page", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "format": "int64" + } + }, + { + "name": "size", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "format": "int64" + } + }, + { + "name": "Accept", + "in": "header", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Get table data", + "headers": { + "Access-Control-Expose-Headers": { + "description": "Expose `X-Count` custom header", + "required": true, + "style": "simple", + "schema": { + "type": "string" + } + }, + "X-Count": { + "description": "Number of rows", + "required": true, + "style": "simple", + "schema": { + "type": "integer", + "format": "int64" + } + } + }, + "content": { + "application/json": { + "schema": { + "type": "string" + } + }, + "text/csv": {} + } + }, + "400": { + "description": "Request pagination or table data select query is malformed", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "403": { + "description": "Not allowed to get table data", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "404": { + "description": "Failed to find table in metadata database", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "406": { + "description": "Failed to format data", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "503": { + "description": "Failed to establish connection with the metadata service", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + } + }, + "security": [ + { + "basicAuth": [] + }, + { + "bearerAuth": [] + } + ] + } + }, + "/api/database/{databaseId}/subset/{subsetId}/data": { + "get": { + "tags": [ + "subset-endpoint" + ], + "summary": "Get subset data", + "description": "Gets data of subset with id. For private databases, the user needs at least *READ* access to the associated database. Requests with HTTP method **GET** return the subset dataset, requests with HTTP method **HEAD** only the number of rows in the subset dataset in the `X-Count` header", + "operationId": "getData_4", + "parameters": [ + { + "name": "databaseId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "subsetId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "Accept", + "in": "header", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "timestamp", + "in": "query", + "required": false, + "schema": { + "type": "string", + "format": "date-time" + } + }, + { + "name": "page", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "format": "int64" + } + }, + { + "name": "size", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "format": "int64" + } + } + ], + "responses": { + "200": { + "description": "Retrieved subset data", + "headers": { + "Access-Control-Expose-Headers": { + "description": "Reverse proxy exposing of custom headers", + "required": true, + "style": "simple", + "schema": { + "type": "string" + } + }, + "X-Count": { + "description": "Number of rows", + "style": "simple", + "schema": { + "type": "string", + "format": "uuid" + } + }, + "X-Id": { + "description": "The subset id", + "required": true, + "style": "simple", + "schema": { + "type": "string", + "format": "uuid" + } + }, + "X-Headers": { + "description": "The list of headers separated by comma", + "style": "simple", + "schema": { + "type": "string" + } + } + }, + "content": { + "application/json": { + "schema": { + "type": "string" + } + }, + "text/csv": {} + } + }, + "400": { + "description": "Invalid pagination", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "403": { + "description": "Not allowed to retrieve subset data", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "404": { + "description": "Failed to find database in metadata database or query in query store of the data database", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "406": { + "description": "Failed to format data", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "503": { + "description": "Failed to communicate with database", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + } + }, + "security": [ + { + "bearerAuth": [] + }, + { + "basicAuth": [] + } + ] + }, + "head": { + "tags": [ + "subset-endpoint" + ], + "summary": "Get subset data", + "description": "Gets data of subset with id. For private databases, the user needs at least *READ* access to the associated database. Requests with HTTP method **GET** return the subset dataset, requests with HTTP method **HEAD** only the number of rows in the subset dataset in the `X-Count` header", + "operationId": "getData_5", + "parameters": [ + { + "name": "databaseId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "subsetId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "Accept", + "in": "header", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "timestamp", + "in": "query", + "required": false, + "schema": { + "type": "string", + "format": "date-time" + } + }, + { + "name": "page", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "format": "int64" + } + }, + { + "name": "size", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "format": "int64" + } + } + ], + "responses": { + "200": { + "description": "Retrieved subset data", + "headers": { + "Access-Control-Expose-Headers": { + "description": "Reverse proxy exposing of custom headers", + "required": true, + "style": "simple", + "schema": { + "type": "string" + } + }, + "X-Count": { + "description": "Number of rows", + "style": "simple", + "schema": { + "type": "string", + "format": "uuid" + } + }, + "X-Id": { + "description": "The subset id", + "required": true, + "style": "simple", + "schema": { + "type": "string", + "format": "uuid" + } + }, + "X-Headers": { + "description": "The list of headers separated by comma", + "style": "simple", + "schema": { + "type": "string" + } + } + }, + "content": { + "application/json": { + "schema": { + "type": "string" + } + }, + "text/csv": {} + } + }, + "400": { + "description": "Invalid pagination", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "403": { + "description": "Not allowed to retrieve subset data", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "404": { + "description": "Failed to find database in metadata database or query in query store of the data database", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "406": { + "description": "Failed to format data", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "503": { + "description": "Failed to communicate with database", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + } + }, + "security": [ + { + "bearerAuth": [] + }, + { + "basicAuth": [] + } + ] + } + }, + "/api/database/{databaseId}/subset/{queryId}": { + "put": { + "tags": [ + "subset-endpoint" + ], + "summary": "Persist subset", + "description": "Persists a subset with id. Requires role `persist-query`.", + "operationId": "persist", + "parameters": [ + { + "name": "databaseId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "queryId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/QueryPersistDto" + } + } + }, + "required": true + }, + "responses": { + "202": { + "description": "Persisted subset", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/QueryDto" + } + } + } + }, + "400": { + "description": "Malformed select query", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "403": { + "description": "Not allowed to persist subset", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "404": { + "description": "Failed to find database in metadata database or query in query store of the data database", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "417": { + "description": "Failed to persist subset", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "503": { + "description": "Failed to communicate with database", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + } + }, + "security": [ + { + "bearerAuth": [] + }, + { + "basicAuth": [] + } + ] + } + }, + "/api/upload": { + "post": { + "tags": [ + "upload-endpoint" + ], + "summary": "Uploads a multipart file", + "description": "Uploads a multipart file to the Storage Service. Requires role `upload-file`.", + "operationId": "create", + "requestBody": { + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "file": { + "type": "string", + "format": "binary" + } + }, + "required": [ + "file" + ] + } + } + }, + "required": true + }, + "responses": { + "201": { + "description": "Uploaded the file", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ViewDto" + } + } + } + }, + "503": { + "description": "Failed to establish connection with the storage service", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + } + }, + "security": [ + { + "basicAuth": [] + }, + { + "bearerAuth": [] + } + ] + } + }, + "/api/database/{databaseId}/table/{tableId}/data/import": { + "post": { + "tags": [ + "table-endpoint" + ], + "summary": "Import dataset", + "description": "Imports a dataset in a table. Then update the table statistics. The user needs to have at least *WRITE_OWN* access to the associated database when importing into a owned table. Otherwise *WRITE_ALL* access in needed. Requires role `insert-table-data`.", + "operationId": "importDataset", + "parameters": [ + { + "name": "databaseId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "tableId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "Authorization", + "in": "header", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ImportDto" + } + } + }, + "required": true + }, + "responses": { + "202": { + "description": "Imported dataset successfully" + }, + "400": { + "description": "Dataset and/or query are malformed", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "403": { + "description": "Import table dataset not allowed", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "404": { + "description": "Failed to find table in metadata database", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "503": { + "description": "Failed to establish connection with the metadata service", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + } + }, + "security": [ + { + "basicAuth": [] + }, + { + "bearerAuth": [] + } + ] + } + }, + "/api/database/{databaseId}/subset": { + "get": { + "tags": [ + "subset-endpoint" + ], + "summary": "Find subsets", + "description": "Finds subsets in the query store. When the database schema is marked as hidden, the user needs to be authorized, have at least read-access to the database. The result can be optionally filtered by setting `persisted`. When set to *true*, only persisted queries are returned, otherwise only non-persisted queries are returned.", + "operationId": "list", + "parameters": [ + { + "name": "databaseId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "persisted", + "in": "query", + "required": false, + "schema": { + "type": "boolean" + } + } + ], + "responses": { + "200": { + "description": "Found subsets", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/QueryDto" + } + } + } + } + }, + "403": { + "description": "Not allowed to find subsets", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "404": { + "description": "Failed to find database or user in metadata database or query in query store of the data database", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "503": { + "description": "Failed to communicate with database", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + } + }, + "security": [ + { + "basicAuth": [] + }, + { + "bearerAuth": [] + } + ] + }, + "post": { + "tags": [ + "subset-endpoint" + ], + "summary": "Create subset", + "description": "Creates a subset in the query store of the data database. Can also be used without authentication if (and only if) the database is marked as public (i.e. when `is_public` = `is_schema_public` is set to `true`). Otherwise at least read access is required.", + "operationId": "create_1", + "parameters": [ + { + "name": "databaseId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "timestamp", + "in": "query", + "required": false, + "schema": { + "type": "string", + "format": "date-time" + } + }, + { + "name": "page", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "format": "int64" + } + }, + { + "name": "size", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "format": "int64" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SubsetDto" + } + } + }, + "required": true + }, + "responses": { + "201": { + "description": "Created subset", + "content": { + "application/json": { + "schema": { + "type": "string" + } + } + } + }, + "400": { + "description": "Malformed select query", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "403": { + "description": "Not allowed to find subset", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "404": { + "description": "Failed to find database in metadata database or query in query store of the data database", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "406": { + "description": "Failed to format data", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "417": { + "description": "Failed to insert query into query store of data database", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "501": { + "description": "Failed to execute query as it contains non-supported keywords", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "503": { + "description": "Failed to communicate with database", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + } + }, + "security": [ + { + "basicAuth": [] + }, + { + "bearerAuth": [] + } + ] + } + }, + "/api/database/{databaseId}/table/{tableId}/history": { + "get": { + "tags": [ + "table-endpoint" + ], + "summary": "Get history", + "description": "Gets the insert/delete operations history performed. For tables in private databases, the user needs to have at least *READ* access to the associated database.", + "operationId": "getHistory", + "parameters": [ + { + "name": "databaseId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "tableId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "size", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "format": "int64" + } + } + ], + "responses": { + "200": { + "description": "Found table history", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/TableHistoryDto" + } + } + } + } + }, + "400": { + "description": "Invalid pagination size request, must be > 0", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "403": { + "description": "Find table history not allowed", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "404": { + "description": "Failed to find table history in data database", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "503": { + "description": "Failed to establish connection with the metadata service", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + } + }, + "security": [ + { + "basicAuth": [] + }, + { + "bearerAuth": [] + } + ] + } + }, + "/api/database/{databaseId}/subset/{subsetId}": { + "get": { + "tags": [ + "subset-endpoint" + ], + "summary": "Find subset", + "description": "Finds a subset in the data database. When the database schema is marked as hidden, the user needs to be authorized, have at least read-access to the database. Requests with HTTP header `Accept=application/json` return the metadata, requests with HTTP header `Accept=text/csv` return the data as downloadable file.", + "operationId": "findById", + "parameters": [ + { + "name": "databaseId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "subsetId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "timestamp", + "in": "query", + "required": false, + "schema": { + "type": "string", + "format": "date-time" + } + } + ], + "responses": { + "200": { + "description": "Found subset", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/QueryDto" + } + }, + "text/csv": {} + } + }, + "400": { + "description": "Malformed select query", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "403": { + "description": "Not allowed to find subset", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "404": { + "description": "Failed to find database in metadata database or query in query store of the data database", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "406": { + "description": "Failed to find acceptable representation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "503": { + "description": "Failed to communicate with database", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + } + }, + "security": [ + { + "basicAuth": [] + }, + { + "bearerAuth": [] + } + ] + } + } + }, + "components": { + "schemas": { + "ApiErrorDto": { + "type": "object", + "properties": { + "status": { + "type": "string", + "enum": [ + "100 CONTINUE", + "101 SWITCHING_PROTOCOLS", + "102 PROCESSING", + "103 EARLY_HINTS", + "103 CHECKPOINT", + "200 OK", + "201 CREATED", + "202 ACCEPTED", + "203 NON_AUTHORITATIVE_INFORMATION", + "204 NO_CONTENT", + "205 RESET_CONTENT", + "206 PARTIAL_CONTENT", + "207 MULTI_STATUS", + "208 ALREADY_REPORTED", + "226 IM_USED", + "300 MULTIPLE_CHOICES", + "301 MOVED_PERMANENTLY", + "302 FOUND", + "302 MOVED_TEMPORARILY", + "303 SEE_OTHER", + "304 NOT_MODIFIED", + "305 USE_PROXY", + "307 TEMPORARY_REDIRECT", + "308 PERMANENT_REDIRECT", + "400 BAD_REQUEST", + "401 UNAUTHORIZED", + "402 PAYMENT_REQUIRED", + "403 FORBIDDEN", + "404 NOT_FOUND", + "405 METHOD_NOT_ALLOWED", + "406 NOT_ACCEPTABLE", + "407 PROXY_AUTHENTICATION_REQUIRED", + "408 REQUEST_TIMEOUT", + "409 CONFLICT", + "410 GONE", + "411 LENGTH_REQUIRED", + "412 PRECONDITION_FAILED", + "413 PAYLOAD_TOO_LARGE", + "413 REQUEST_ENTITY_TOO_LARGE", + "414 URI_TOO_LONG", + "414 REQUEST_URI_TOO_LONG", + "415 UNSUPPORTED_MEDIA_TYPE", + "416 REQUESTED_RANGE_NOT_SATISFIABLE", + "417 EXPECTATION_FAILED", + "418 I_AM_A_TEAPOT", + "419 INSUFFICIENT_SPACE_ON_RESOURCE", + "420 METHOD_FAILURE", + "421 DESTINATION_LOCKED", + "422 UNPROCESSABLE_ENTITY", + "423 LOCKED", + "424 FAILED_DEPENDENCY", + "425 TOO_EARLY", + "426 UPGRADE_REQUIRED", + "428 PRECONDITION_REQUIRED", + "429 TOO_MANY_REQUESTS", + "431 REQUEST_HEADER_FIELDS_TOO_LARGE", + "451 UNAVAILABLE_FOR_LEGAL_REASONS", + "500 INTERNAL_SERVER_ERROR", + "501 NOT_IMPLEMENTED", + "502 BAD_GATEWAY", + "503 SERVICE_UNAVAILABLE", + "504 GATEWAY_TIMEOUT", + "505 HTTP_VERSION_NOT_SUPPORTED", + "506 VARIANT_ALSO_NEGOTIATES", + "507 INSUFFICIENT_STORAGE", + "508 LOOP_DETECTED", + "509 BANDWIDTH_LIMIT_EXCEEDED", + "510 NOT_EXTENDED", + "511 NETWORK_AUTHENTICATION_REQUIRED" + ], + "example": "NOT_FOUND" + }, + "message": { + "type": "string", + "example": "Error message" + }, + "code": { + "type": "string", + "example": "error.service.code" + } + }, + "required": [ + "code", + "message", + "status" + ] + }, + "TupleUpdateDto": { + "type": "object", + "properties": { + "data": { + "type": "object", + "additionalProperties": { + "type": "object" + }, + "example": { + "key": "value" + } + }, + "keys": { + "type": "object", + "additionalProperties": { + "type": "object" + }, + "example": { + "id": 1 + } + } + }, + "required": [ + "data", + "keys" + ] + }, + "QueryPersistDto": { + "type": "object", + "properties": { + "persist": { + "type": "boolean", + "example": true + } + }, + "required": [ + "persist" + ] + }, + "CreatorBriefDto": { + "type": "object", + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "e41f94a6-2b94-4a12-ac0e-678684e1c070" + }, + "affiliation": { + "type": "string", + "example": "Brown University" + }, + "creator_name": { + "type": "string", + "example": "Carberry, Josiah" + }, + "name_type": { + "type": "string", + "enum": [ + "Personal", + "Organizational" + ], + "example": "Personal" + }, + "name_identifier": { + "type": "string", + "example": "0000-0002-1825-0097" + }, + "name_identifier_scheme": { + "type": "string", + "enum": [ + "ORCID", + "ROR", + "ISNI", + "GRID" + ], + "example": "ORCID" + }, + "affiliation_identifier": { + "type": "string", + "example": "https://ror.org/05gq02987" + }, + "affiliation_identifier_scheme": { + "type": "string", + "enum": [ + "ROR", + "GRID", + "ISNI" + ], + "example": "ROR" + } + }, + "required": [ + "creator_name", + "id" + ] + }, + "IdentifierBriefDto": { + "type": "object", + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "b97cd56b-66ca-4354-9e6c-f47210cfaaec" + }, + "type": { + "type": "string", + "enum": [ + "database", + "subset", + "table", + "view" + ], + "example": "database" + }, + "creators": { + "type": "array", + "items": { + "$ref": "#/components/schemas/CreatorBriefDto" + } + }, + "titles": { + "type": "array", + "items": { + "$ref": "#/components/schemas/IdentifierTitleDto" + } + }, + "descriptions": { + "type": "array", + "items": { + "$ref": "#/components/schemas/IdentifierDescriptionDto" + } + }, + "doi": { + "type": "string", + "example": "10.1038/nphys1170" + }, + "publisher": { + "type": "string", + "example": "TU Wien" + }, + "status": { + "type": "string", + "enum": [ + "draft", + "published" + ], + "example": "draft" + }, + "database_id": { + "type": "string", + "format": "uuid", + "example": "fc29f89c-86a8-4020-9e36-4d954736c6cc" + }, + "query_id": { + "type": "string", + "format": "uuid", + "example": 1 + }, + "table_id": { + "type": "string", + "format": "uuid", + "example": 1 + }, + "view_id": { + "type": "string", + "format": "uuid", + "example": 1 + }, + "publication_year": { + "type": "integer", + "format": "int32", + "example": 2022 + }, + "owned_by": { + "type": "string", + "format": "uuid", + "example": "2f45ef7a-7f9b-4667-9156-152c87fe1ca5" + } + }, + "required": [ + "creators", + "database_id", + "descriptions", + "id", + "owned_by", + "publication_year", + "publisher", + "status", + "titles", + "type" + ] + }, + "IdentifierDescriptionDto": { + "type": "object", + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "e0e9692c-910b-4b60-b53a-fc7c358a917d" + }, + "description": { + "type": "string", + "example": "Air quality reports at Stephansplatz, Vienna" + }, + "language": { + "type": "string", + "enum": [ + "ab", + "aa", + "af", + "ak", + "sq", + "am", + "ar", + "an", + "hy", + "as", + "av", + "ae", + "ay", + "az", + "bm", + "ba", + "eu", + "be", + "bn", + "bh", + "bi", + "bs", + "br", + "bg", + "my", + "ca", + "km", + "ch", + "ce", + "ny", + "zh", + "cu", + "cv", + "kw", + "co", + "cr", + "hr", + "cs", + "da", + "dv", + "nl", + "dz", + "en", + "eo", + "et", + "ee", + "fo", + "fj", + "fi", + "fr", + "ff", + "gd", + "gl", + "lg", + "ka", + "de", + "ki", + "el", + "kl", + "gn", + "gu", + "ht", + "ha", + "he", + "hz", + "hi", + "ho", + "hu", + "is", + "io", + "ig", + "id", + "ia", + "ie", + "iu", + "ik", + "ga", + "it", + "ja", + "jv", + "kn", + "kr", + "ks", + "kk", + "rw", + "kv", + "kg", + "ko", + "kj", + "ku", + "ky", + "lo", + "la", + "lv", + "lb", + "li", + "ln", + "lt", + "lu", + "mk", + "mg", + "ms", + "ml", + "mt", + "gv", + "mi", + "mr", + "mh", + "ro", + "mn", + "na", + "nv", + "nd", + "ng", + "ne", + "se", + "no", + "nb", + "nn", + "ii", + "oc", + "oj", + "or", + "om", + "os", + "pi", + "pa", + "ps", + "fa", + "pl", + "pt", + "qu", + "rm", + "rn", + "ru", + "sm", + "sg", + "sa", + "sc", + "sr", + "sn", + "sd", + "si", + "sk", + "sl", + "so", + "st", + "nr", + "es", + "su", + "sw", + "ss", + "sv", + "tl", + "ty", + "tg", + "ta", + "tt", + "te", + "th", + "bo", + "ti", + "to", + "ts", + "tn", + "tr", + "tk", + "tw", + "ug", + "uk", + "ur", + "uz", + "ve", + "vi", + "vo", + "wa", + "cy", + "fy", + "wo", + "xh", + "yi", + "yo", + "za", + "zu" + ], + "example": "en" + }, + "type": { + "type": "string", + "enum": [ + "Abstract", + "Methods", + "SeriesInformation", + "TableOfContents", + "TechnicalInfo", + "Other" + ], + "example": "Abstract" + } + }, + "required": [ + "id" + ] + }, + "IdentifierTitleDto": { + "type": "object", + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "70ce5164-fd74-413f-8712-f996b91defbf" + }, + "title": { + "type": "string", + "example": "Airquality Demonstrator" + }, + "language": { + "type": "string", + "enum": [ + "ab", + "aa", + "af", + "ak", + "sq", + "am", + "ar", + "an", + "hy", + "as", + "av", + "ae", + "ay", + "az", + "bm", + "ba", + "eu", + "be", + "bn", + "bh", + "bi", + "bs", + "br", + "bg", + "my", + "ca", + "km", + "ch", + "ce", + "ny", + "zh", + "cu", + "cv", + "kw", + "co", + "cr", + "hr", + "cs", + "da", + "dv", + "nl", + "dz", + "en", + "eo", + "et", + "ee", + "fo", + "fj", + "fi", + "fr", + "ff", + "gd", + "gl", + "lg", + "ka", + "de", + "ki", + "el", + "kl", + "gn", + "gu", + "ht", + "ha", + "he", + "hz", + "hi", + "ho", + "hu", + "is", + "io", + "ig", + "id", + "ia", + "ie", + "iu", + "ik", + "ga", + "it", + "ja", + "jv", + "kn", + "kr", + "ks", + "kk", + "rw", + "kv", + "kg", + "ko", + "kj", + "ku", + "ky", + "lo", + "la", + "lv", + "lb", + "li", + "ln", + "lt", + "lu", + "mk", + "mg", + "ms", + "ml", + "mt", + "gv", + "mi", + "mr", + "mh", + "ro", + "mn", + "na", + "nv", + "nd", + "ng", + "ne", + "se", + "no", + "nb", + "nn", + "ii", + "oc", + "oj", + "or", + "om", + "os", + "pi", + "pa", + "ps", + "fa", + "pl", + "pt", + "qu", + "rm", + "rn", + "ru", + "sm", + "sg", + "sa", + "sc", + "sr", + "sn", + "sd", + "si", + "sk", + "sl", + "so", + "st", + "nr", + "es", + "su", + "sw", + "ss", + "sv", + "tl", + "ty", + "tg", + "ta", + "tt", + "te", + "th", + "bo", + "ti", + "to", + "ts", + "tn", + "tr", + "tk", + "tw", + "ug", + "uk", + "ur", + "uz", + "ve", + "vi", + "vo", + "wa", + "cy", + "fy", + "wo", + "xh", + "yi", + "yo", + "za", + "zu" + ], + "example": "en" + }, + "type": { + "type": "string", + "enum": [ + "AlternativeTitle", + "Subtitle", + "TranslatedTitle", + "Other" + ] + } + }, + "required": [ + "id" + ] + }, + "QueryDto": { + "type": "object", + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "83ea2326-f8f6-4263-baf8-cdf88a54efc7" + }, + "owner": { + "$ref": "#/components/schemas/UserBriefDto" + }, + "execution": { + "type": "string", + "format": "date-time", + "example": "2021-03-12T15:26:21Z" + }, + "query": { + "type": "string", + "example": "SELECT `id` FROM `air_quality`" + }, + "type": { + "type": "string", + "enum": [ + "query", + "view" + ], + "example": "query" + }, + "identifiers": { + "type": "array", + "items": { + "$ref": "#/components/schemas/IdentifierBriefDto" + } + }, + "database_id": { + "type": "string", + "format": "uuid", + "example": "fc29f89c-86a8-4020-9e36-4d954736c6cc" + }, + "query_normalized": { + "type": "string", + "example": "SELECT `id` FROM `air_quality`" + }, + "query_hash": { + "type": "string", + "example": "17e682f060b5f8e47ea04c5c4855908b0a5ad612022260fe50e11ecb0cc0ab76" + }, + "is_persisted": { + "type": "boolean", + "example": true + }, + "result_hash": { + "type": "string", + "example": "17e682f060b5f8e47ea04c5c4855908b0a5ad612022260fe50e11ecb0cc0ab76" + }, + "result_number": { + "type": "integer", + "format": "int64", + "example": 1 + } + }, + "required": [ + "database_id", + "execution", + "id", + "identifiers", + "is_persisted", + "owner", + "query", + "query_hash", + "query_normalized" + ] + }, + "UserBriefDto": { + "type": "object", + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "1ffc7b0e-9aeb-4e8b-b8f1-68f3936155b4" + }, + "username": { + "type": "string", + "description": "Only contains lowercase characters", + "example": "jcarberry" + }, + "name": { + "type": "string", + "example": "Josiah Carberry" + }, + "orcid": { + "type": "string", + "example": "0000-0002-1825-0097" + }, + "qualified_name": { + "type": "string", + "example": "Josiah Carberry — @jcarberry" + }, + "given_name": { + "type": "string", + "example": "Josiah" + }, + "family_name": { + "type": "string", + "example": "Carberry" + } + }, + "required": [ + "id", + "username" + ] + }, + "CreatorDto": { + "type": "object", + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "e41f94a6-2b94-4a12-ac0e-678684e1c070" + }, + "firstname": { + "type": "string", + "example": "Josiah" + }, + "lastname": { + "type": "string", + "example": "Carberry" + }, + "affiliation": { + "type": "string", + "example": "Brown University" + }, + "creator_name": { + "type": "string", + "example": "Carberry, Josiah" + }, + "name_type": { + "type": "string", + "enum": [ + "Personal", + "Organizational" + ], + "example": "Personal" + }, + "name_identifier": { + "type": "string", + "example": "0000-0002-1825-0097" + }, + "name_identifier_scheme": { + "type": "string", + "enum": [ + "ORCID", + "ROR", + "ISNI", + "GRID" + ], + "example": "ORCID" + }, + "name_identifier_scheme_uri": { + "type": "string", + "example": "https://orcid.org/" + }, + "affiliation_identifier": { + "type": "string", + "example": "https://ror.org/05gq02987" + }, + "affiliation_identifier_scheme": { + "type": "string", + "enum": [ + "ROR", + "GRID", + "ISNI" + ], + "example": "ROR" + }, + "affiliation_identifier_scheme_uri": { + "type": "string", + "example": "https://ror.org/" + } + }, + "required": [ + "creator_name", + "id" + ] + }, + "EnumDto": { + "type": "object", + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "5343bb3d-14d3-4eb7-a86f-b8fc553cb315" + }, + "value": { + "type": "string", + "example": 3 + } + }, + "required": [ + "id", + "value" + ] + }, + "IdentifierDto": { + "type": "object", + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "b97cd56b-66ca-4354-9e6c-f47210cfaaec" + }, + "links": { + "$ref": "#/components/schemas/LinksDto" + }, + "type": { + "type": "string", + "enum": [ + "database", + "subset", + "table", + "view" + ], + "example": "database" + }, + "titles": { + "type": "array", + "items": { + "$ref": "#/components/schemas/IdentifierTitleDto" + } + }, + "descriptions": { + "type": "array", + "items": { + "$ref": "#/components/schemas/IdentifierDescriptionDto" + } + }, + "funders": { + "type": "array", + "items": { + "$ref": "#/components/schemas/IdentifierFunderDto" + } + }, + "query": { + "type": "string", + "example": "SELECT `id`, `value`, `location` FROM `air_quality` WHERE `location` = \"09:STEF\"" + }, + "execution": { + "type": "string", + "format": "date-time", + "example": "2021-03-12T15:26:21Z" + }, + "doi": { + "type": "string", + "example": "10.1038/nphys1170" + }, + "publisher": { + "type": "string", + "example": "TU Wien" + }, + "owner": { + "$ref": "#/components/schemas/UserBriefDto" + }, + "language": { + "type": "string", + "enum": [ + "ab", + "aa", + "af", + "ak", + "sq", + "am", + "ar", + "an", + "hy", + "as", + "av", + "ae", + "ay", + "az", + "bm", + "ba", + "eu", + "be", + "bn", + "bh", + "bi", + "bs", + "br", + "bg", + "my", + "ca", + "km", + "ch", + "ce", + "ny", + "zh", + "cu", + "cv", + "kw", + "co", + "cr", + "hr", + "cs", + "da", + "dv", + "nl", + "dz", + "en", + "eo", + "et", + "ee", + "fo", + "fj", + "fi", + "fr", + "ff", + "gd", + "gl", + "lg", + "ka", + "de", + "ki", + "el", + "kl", + "gn", + "gu", + "ht", + "ha", + "he", + "hz", + "hi", + "ho", + "hu", + "is", + "io", + "ig", + "id", + "ia", + "ie", + "iu", + "ik", + "ga", + "it", + "ja", + "jv", + "kn", + "kr", + "ks", + "kk", + "rw", + "kv", + "kg", + "ko", + "kj", + "ku", + "ky", + "lo", + "la", + "lv", + "lb", + "li", + "ln", + "lt", + "lu", + "mk", + "mg", + "ms", + "ml", + "mt", + "gv", + "mi", + "mr", + "mh", + "ro", + "mn", + "na", + "nv", + "nd", + "ng", + "ne", + "se", + "no", + "nb", + "nn", + "ii", + "oc", + "oj", + "or", + "om", + "os", + "pi", + "pa", + "ps", + "fa", + "pl", + "pt", + "qu", + "rm", + "rn", + "ru", + "sm", + "sg", + "sa", + "sc", + "sr", + "sn", + "sd", + "si", + "sk", + "sl", + "so", + "st", + "nr", + "es", + "su", + "sw", + "ss", + "sv", + "tl", + "ty", + "tg", + "ta", + "tt", + "te", + "th", + "bo", + "ti", + "to", + "ts", + "tn", + "tr", + "tk", + "tw", + "ug", + "uk", + "ur", + "uz", + "ve", + "vi", + "vo", + "wa", + "cy", + "fy", + "wo", + "xh", + "yi", + "yo", + "za", + "zu" + ] + }, + "licenses": { + "type": "array", + "items": { + "$ref": "#/components/schemas/LicenseDto" + } + }, + "creators": { + "type": "array", + "items": { + "$ref": "#/components/schemas/CreatorDto" + } + }, + "status": { + "type": "string", + "enum": [ + "draft", + "published" + ], + "example": "draft" + }, + "database_id": { + "type": "string", + "format": "uuid", + "example": null + }, + "query_id": { + "type": "string", + "format": "uuid", + "example": null + }, + "table_id": { + "type": "string", + "format": "uuid", + "example": null + }, + "view_id": { + "type": "string", + "format": "uuid", + "example": null + }, + "query_normalized": { + "type": "string", + "example": "SELECT `id`, `value`, `location` FROM `air_quality` WHERE `location` = \"09:STEF\"" + }, + "related_identifiers": { + "type": "array", + "items": { + "$ref": "#/components/schemas/RelatedIdentifierDto" + } + }, + "query_hash": { + "type": "string", + "description": "query hash in sha512" + }, + "result_hash": { + "type": "string", + "example": "34fe82cda2c53f13f8d90cfd7a3469e3a939ff311add50dce30d9136397bf8e5" + }, + "result_number": { + "type": "integer", + "format": "int64", + "example": 1 + }, + "publication_day": { + "type": "integer", + "format": "int32", + "example": 15 + }, + "publication_month": { + "type": "integer", + "format": "int32", + "example": 12 + }, + "publication_year": { + "type": "integer", + "format": "int32", + "example": 2022 + } + }, + "required": [ + "creators", + "database_id", + "descriptions", + "funders", + "id", + "language", + "licenses", + "links", + "owner", + "publication_year", + "publisher", + "query", + "query_hash", + "query_normalized", + "status", + "titles", + "type" + ] + }, + "IdentifierFunderDto": { + "type": "object", + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "39693413-e0ce-46da-ad5e-029c0556d439" + }, + "funder_name": { + "type": "string", + "example": "European Commission" + }, + "funder_identifier": { + "type": "string", + "example": "http://doi.org/10.13039/501100000780" + }, + "funder_identifier_type": { + "type": "string", + "enum": [ + "Crossref Funder ID", + "ROR", + "GND", + "ISNI", + "Other" + ], + "example": "Crossref Funder ID" + }, + "scheme_uri": { + "type": "string", + "example": "http://doi.org/" + }, + "award_number": { + "type": "string", + "example": 824087 + }, + "award_title": { + "type": "string", + "example": "EOSC-Life" + } + }, + "required": [ + "funder_name", + "id" + ] + }, + "LicenseDto": { + "type": "object", + "properties": { + "identifier": { + "type": "string", + "example": "MIT" + }, + "uri": { + "type": "string", + "example": "https://opensource.org/licenses/MIT" + }, + "description": { + "type": "string", + "example": "A short and simple permissive license with conditions only requiring preservation of copyright and license notices. Licensed works, modifications, and larger works may be distributed under different terms and without source code." + } + }, + "required": [ + "identifier", + "uri" + ] + }, + "LinksDto": { + "type": "object", + "properties": { + "self": { + "type": "string", + "example": "http://example.com/api/" + }, + "data": { + "type": "string", + "example": "http://example.com" + }, + "self_html": { + "type": "string", + "example": "http://example.com" + }, + "dashboard_html": { + "type": "string", + "example": "http://example.com/d/defi2baxqawaod" + } + }, + "required": [ + "self", + "self_html" + ] + }, + "RelatedIdentifierDto": { + "type": "object", + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "ce9d11f0-60a2-448d-a3e4-44719a443e8a" + }, + "value": { + "type": "string", + "example": "10.70124/dc4zh-9ce78" + }, + "type": { + "type": "string", + "enum": [ + "DOI", + "URL", + "URN", + "ARK", + "arXiv", + "bibcode", + "EAN13", + "EISSN", + "Handle", + "IGSN", + "ISBN", + "ISTC", + "LISSN", + "LSID", + "PMID", + "PURL", + "UPC", + "w3id" + ], + "example": "DOI" + }, + "relation": { + "type": "string", + "enum": [ + "IsCitedBy", + "Cites", + "IsSupplementTo", + "IsSupplementedBy", + "IsContinuedBy", + "Continues", + "IsDescribedBy", + "Describes", + "HasMetadata", + "IsMetadataFor", + "HasVersion", + "IsVersionOf", + "IsNewVersionOf", + "IsPreviousVersionOf", + "IsPartOf", + "HasPart", + "IsPublishedIn", + "IsReferencedBy", + "References", + "IsDocumentedBy", + "Documents", + "IsCompiledBy", + "Compiles", + "IsVariantFormOf", + "IsOriginalFormOf", + "IsIdenticalTo", + "IsReviewedBy", + "Reviews", + "IsDerivedFrom", + "IsSourceOf", + "IsRequiredBy", + "Requires", + "IsObsoletedBy", + "Obsoletes" + ], + "example": "Cites" + } + }, + "required": [ + "id", + "relation", + "type", + "value" + ] + }, + "SetDto": { + "type": "object", + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "7eb4eded-bacc-4a91-84db-a9ae6ddafda7" + }, + "value": { + "type": "string", + "example": 3 + } + }, + "required": [ + "id", + "value" + ] + }, + "ViewColumnDto": { + "type": "object", + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "6aec3a91-2e0b-4e92-a16a-9c3c5e892da1" + }, + "name": { + "type": "string", + "example": "Given Name", + "maxLength": 64, + "minLength": 0 + }, + "size": { + "type": "integer", + "format": "int64", + "example": 255 + }, + "d": { + "type": "integer", + "format": "int64", + "example": 0 + }, + "description": { + "type": "string", + "example": "Column comment", + "maxLength": 2048, + "minLength": 0 + }, + "enums": { + "type": "array", + "description": "enum values, only considered when type = ENUM", + "items": { + "$ref": "#/components/schemas/EnumDto" + } + }, + "sets": { + "type": "array", + "description": "enum values, only considered when type = ENUM", + "items": { + "$ref": "#/components/schemas/SetDto" + } + }, + "database_id": { + "type": "string", + "format": "uuid", + "example": "2b5b2b03-fdd0-40d6-afe0-e5d02fd839e4" + }, + "ord": { + "type": "integer", + "format": "int32", + "example": 0 + }, + "internal_name": { + "type": "string", + "example": "given_name", + "maxLength": 64, + "minLength": 0 + }, + "index_length": { + "type": "integer", + "format": "int64", + "example": 255 + }, + "length": { + "type": "integer", + "format": "int64", + "example": 255 + }, + "type": { + "type": "string", + "enum": [ + "char", + "varchar", + "binary", + "varbinary", + "tinyblob", + "tinytext", + "text", + "blob", + "mediumtext", + "mediumblob", + "longtext", + "longblob", + "enum", + "set", + "serial", + "bit", + "tinyint", + "bool", + "smallint", + "mediumint", + "int", + "bigint", + "float", + "double", + "decimal", + "date", + "datetime", + "timestamp", + "time", + "year" + ], + "example": "varchar" + }, + "is_null_allowed": { + "type": "boolean", + "example": false + } + }, + "required": [ + "database_id", + "id", + "internal_name", + "is_null_allowed", + "name", + "ord", + "type" + ] + }, + "ViewDto": { + "type": "object", + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "787439d0-e85e-400c-a7e6-996a023bfad9" + }, + "name": { + "type": "string", + "example": "Air Quality" + }, + "identifiers": { + "type": "array", + "items": { + "$ref": "#/components/schemas/IdentifierDto" + } + }, + "query": { + "type": "string", + "example": "SELECT `id` FROM `air_quality` ORDER BY `value` DESC" + }, + "owner": { + "$ref": "#/components/schemas/UserBriefDto" + }, + "columns": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ViewColumnDto" + } + }, + "created": { + "type": "string", + "format": "date-time", + "example": "2022-01-01 08:00:00.000" + }, + "last_retrieved": { + "type": "string", + "format": "date-time", + "example": "2025-01-23T12:09:01" + }, + "database_id": { + "type": "string", + "format": "uuid", + "example": "fc29f89c-86a8-4020-9e36-4d954736c6cc" + }, + "internal_name": { + "type": "string", + "example": "air_quality" + }, + "is_public": { + "type": "boolean", + "example": true + }, + "is_schema_public": { + "type": "boolean", + "example": true + }, + "initial_view": { + "type": "boolean", + "description": "True if it is the default view for the database", + "example": true + }, + "query_hash": { + "type": "string", + "example": "7de03e818900b6ea6d58ad0306d4a741d658c6df3d1964e89ed2395d8c7e7916" + } + }, + "required": [ + "columns", + "created", + "database_id", + "id", + "identifiers", + "internal_name", + "name", + "owner", + "query", + "query_hash" + ] + }, + "TupleDto": { + "type": "object", + "properties": { + "data": { + "type": "object", + "additionalProperties": { + "type": "object" + }, + "example": { + "key": "value" + } + } + }, + "required": [ + "data" + ] + }, + "ImportDto": { + "type": "object", + "properties": { + "location": { + "type": "string", + "example": "file.csv" + }, + "header": { + "type": "boolean", + "description": "If true, the first line contains the column names, otherwise it contains only data", + "example": true + }, + "separator": { + "type": "string", + "example": "," + }, + "quote": { + "type": "string", + "example": "\"" + }, + "line_termination": { + "type": "string", + "example": "\\r\\n" + } + }, + "required": [ + "header", + "location", + "separator" + ] + }, + "FilterDto": { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": [ + "where", + "or", + "and" + ], + "example": "where" + }, + "value": { + "type": "string", + "example": 1 + }, + "column_id": { + "type": "string", + "format": "uuid", + "example": "14128033-54b5-4818-a489-21b0dded86e2" + }, + "operator_id": { + "type": "string", + "format": "uuid", + "example": "67c5b54d-2eb0-4f42-8dc1-a504562e9f32" + } + }, + "required": [ + "column_id", + "operator_id", + "type" + ] + }, + "OrderDto": { + "type": "object", + "properties": { + "direction": { + "type": "string", + "enum": [ + "asc", + "desc" + ], + "example": "asc" + }, + "column_id": { + "type": "string", + "format": "uuid", + "example": "e891ba86-0258-41a6-a8d9-ff58bc10b618" + } + }, + "required": [ + "column_id" + ] + }, + "SubsetDto": { + "type": "object", + "properties": { + "columns": { + "type": "array", + "example": [ + "e891ba86-0258-41a6-a8d9-ff58bc10b618" + ], + "items": { + "type": "string", + "format": "uuid" + } + }, + "filter": { + "type": "array", + "items": { + "$ref": "#/components/schemas/FilterDto" + } + }, + "order": { + "type": "array", + "items": { + "$ref": "#/components/schemas/OrderDto" + } + }, + "datasource_id": { + "type": "string", + "format": "uuid", + "example": "f7df2a7d-4ade-4c78-97b0-7c744d0893c7" + }, + "datasource_type": { + "type": "string", + "enum": [ + "table", + "view" + ] + } + }, + "required": [ + "columns", + "datasource_id", + "datasource_type" + ] + }, + "TableHistoryDto": { + "type": "object", + "properties": { + "timestamp": { + "type": "string", + "format": "date-time", + "example": "2021-03-12T15:26:21Z" + }, + "event": { + "type": "string", + "enum": [ + "insert", + "delete" + ], + "example": "INSERT" + }, + "total": { + "type": "integer", + "format": "int64", + "example": 1 + } + }, + "required": [ + "event", + "timestamp", + "total" + ] + }, + "TupleDeleteDto": { + "type": "object", + "properties": { + "keys": { + "type": "object", + "additionalProperties": { + "type": "object" + }, + "example": { + "id": 1 + } + } + }, + "required": [ + "keys" + ] + } + }, + "securitySchemes": { + "basicAuth": { + "type": "http", + "scheme": "basic" + }, + "bearerAuth": { + "type": "http", + "scheme": "bearer", + "bearerFormat": "JWT" + } + } + } +} diff --git a/.docs/.openapi/api-data.yaml b/.docs/.openapi/api-data.yaml deleted file mode 100644 index 9a82e8019fab78d2494981e8ada2d4f64bcb9391..0000000000000000000000000000000000000000 --- a/.docs/.openapi/api-data.yaml +++ /dev/null @@ -1,2872 +0,0 @@ -openapi: 3.1.0 -info: - title: Database Repository Data Service API - description: Service that manages the data - contact: - name: Prof. Andreas Rauber - email: andreas.rauber@tuwien.ac.at - license: - name: Apache 2.0 - url: https://www.apache.org/licenses/LICENSE-2.0 - version: 1.8.1 -externalDocs: - description: Sourcecode Documentation - url: https://www.ifs.tuwien.ac.at/infrastructures/dbrepo/1.8/system-services-metadata/ -servers: -- url: http://localhost - description: Development instance -- url: https://test.dbrepo.tuwien.ac.at - description: Staging instance -paths: - /api/database/{databaseId}/view/{viewId}/data: - get: - tags: - - view-endpoint - summary: Get view data - description: "Gets data from a view of a database. For private databases, the\ - \ user needs at least *READ* access to the associated database." - operationId: getData - parameters: - - name: databaseId - in: path - required: true - schema: - type: string - format: uuid - - name: viewId - in: path - required: true - schema: - type: string - format: uuid - - name: page - in: query - required: false - schema: - type: integer - format: int64 - - name: size - in: query - required: false - schema: - type: integer - format: int64 - - name: timestamp - in: query - required: false - schema: - type: string - format: date-time - - name: Accept - in: header - required: true - schema: - type: string - responses: - "200": - description: Retrieved view data - headers: - Access-Control-Expose-Headers: - description: Expose `X-Count` custom header - required: true - style: simple - schema: - type: string - X-Count: - description: Number of rows - required: true - style: simple - schema: - type: integer - format: int64 - content: - application/json: - schema: - type: string - text/csv: {} - "400": - description: Request pagination is malformed - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "403": - description: Not allowed to retrieve view data - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "404": - description: Failed to find view in metadata database - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "406": - description: Failed to format data - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "409": - description: View schema could not be mapped - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "503": - description: Failed to establish connection with the metadata service - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - security: - - basicAuth: [] - - bearerAuth: [] - head: - tags: - - view-endpoint - summary: Get view data - description: "Gets data from a view of a database. For private databases, the\ - \ user needs at least *READ* access to the associated database." - operationId: getData_1 - parameters: - - name: databaseId - in: path - required: true - schema: - type: string - format: uuid - - name: viewId - in: path - required: true - schema: - type: string - format: uuid - - name: page - in: query - required: false - schema: - type: integer - format: int64 - - name: size - in: query - required: false - schema: - type: integer - format: int64 - - name: timestamp - in: query - required: false - schema: - type: string - format: date-time - - name: Accept - in: header - required: true - schema: - type: string - responses: - "200": - description: Retrieved view data - headers: - Access-Control-Expose-Headers: - description: Expose `X-Count` custom header - required: true - style: simple - schema: - type: string - X-Count: - description: Number of rows - required: true - style: simple - schema: - type: integer - format: int64 - content: - application/json: - schema: - type: string - text/csv: {} - "400": - description: Request pagination is malformed - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "403": - description: Not allowed to retrieve view data - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "404": - description: Failed to find view in metadata database - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "406": - description: Failed to format data - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "409": - description: View schema could not be mapped - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "503": - description: Failed to establish connection with the metadata service - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - security: - - basicAuth: [] - - bearerAuth: [] - /api/database/{databaseId}/table/{tableId}/data: - get: - tags: - - table-endpoint - summary: Get table data - description: "Gets data from a table with id. For a table in a private database,\ - \ the user needs to have at least *READ* access to the associated database.\ - \ Requests with HTTP method **GET** return the full dataset, requests with\ - \ HTTP method **HEAD** only the number of tuples in the `X-Count` header." - operationId: getData_2 - parameters: - - name: databaseId - in: path - required: true - schema: - type: string - format: uuid - - name: tableId - in: path - required: true - schema: - type: string - format: uuid - - name: timestamp - in: query - required: false - schema: - type: string - format: date-time - - name: page - in: query - required: false - schema: - type: integer - format: int64 - - name: size - in: query - required: false - schema: - type: integer - format: int64 - - name: Accept - in: header - required: true - schema: - type: string - responses: - "200": - description: Get table data - headers: - Access-Control-Expose-Headers: - description: Expose `X-Count` custom header - required: true - style: simple - schema: - type: string - X-Count: - description: Number of rows - required: true - style: simple - schema: - type: integer - format: int64 - content: - application/json: - schema: - type: string - text/csv: {} - "400": - description: Request pagination or table data select query is malformed - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "403": - description: Not allowed to get table data - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "404": - description: Failed to find table in metadata database - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "406": - description: Failed to format data - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "503": - description: Failed to establish connection with the metadata service - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - security: - - basicAuth: [] - - bearerAuth: [] - put: - tags: - - table-endpoint - summary: Update tuple - description: "Updates a data tuple into a table, then the table statistics are\ - \ updated. The user needs to have at least *WRITE_OWN* access to the associated\ - \ database. Requires role `insert-table-data`." - operationId: updateRawTuple - parameters: - - name: databaseId - in: path - required: true - schema: - type: string - format: uuid - - name: tableId - in: path - required: true - schema: - type: string - format: uuid - - name: Authorization - in: header - required: true - schema: - type: string - requestBody: - content: - application/json: - schema: - $ref: "#/components/schemas/TupleUpdateDto" - required: true - responses: - "202": - description: Updated table data - "400": - description: Request pagination or table data select query is malformed - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "403": - description: Update table data not allowed - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "404": - description: Failed to find table in metadata database - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "503": - description: Failed to establish connection with the metadata service - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - security: - - basicAuth: [] - - bearerAuth: [] - post: - tags: - - table-endpoint - summary: Insert tuple - description: "Inserts a data tuple into a table, then the table statistics are\ - \ updated. The user needs to have at least *WRITE_OWN* access to the associated\ - \ database. Requires role `insert-table-data`." - operationId: insertRawTuple - parameters: - - name: databaseId - in: path - required: true - schema: - type: string - format: uuid - - name: tableId - in: path - required: true - schema: - type: string - format: uuid - - name: Authorization - in: header - required: true - schema: - type: string - requestBody: - content: - application/json: - schema: - $ref: "#/components/schemas/TupleDto" - required: true - responses: - "201": - description: Created table data - "400": - description: Request pagination or table data select query is malformed - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "403": - description: Create table data not allowed - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "404": - description: Failed to find table in metadata database or blob in storage - service - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "503": - description: Failed to establish connection with the metadata service or - storage service - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - security: - - basicAuth: [] - - bearerAuth: [] - delete: - tags: - - table-endpoint - summary: Delete tuple - description: "Deletes a data tuple into a table, then the table statistics are\ - \ updated. The user needs to have at least *WRITE_OWN* access to the associated\ - \ database. Requires role `delete-table-data`." - operationId: deleteRawTuple - parameters: - - name: databaseId - in: path - required: true - schema: - type: string - format: uuid - - name: tableId - in: path - required: true - schema: - type: string - format: uuid - - name: Authorization - in: header - required: true - schema: - type: string - requestBody: - content: - application/json: - schema: - $ref: "#/components/schemas/TupleDeleteDto" - required: true - responses: - "202": - description: Deleted table data - "400": - description: Request pagination or table data select query is malformed - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "403": - description: Delete table data not allowed - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "404": - description: Failed to find table in metadata database - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "503": - description: Failed to establish connection with the metadata service - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - security: - - basicAuth: [] - - bearerAuth: [] - head: - tags: - - table-endpoint - summary: Get table data - description: "Gets data from a table with id. For a table in a private database,\ - \ the user needs to have at least *READ* access to the associated database.\ - \ Requests with HTTP method **GET** return the full dataset, requests with\ - \ HTTP method **HEAD** only the number of tuples in the `X-Count` header." - operationId: getData_3 - parameters: - - name: databaseId - in: path - required: true - schema: - type: string - format: uuid - - name: tableId - in: path - required: true - schema: - type: string - format: uuid - - name: timestamp - in: query - required: false - schema: - type: string - format: date-time - - name: page - in: query - required: false - schema: - type: integer - format: int64 - - name: size - in: query - required: false - schema: - type: integer - format: int64 - - name: Accept - in: header - required: true - schema: - type: string - responses: - "200": - description: Get table data - headers: - Access-Control-Expose-Headers: - description: Expose `X-Count` custom header - required: true - style: simple - schema: - type: string - X-Count: - description: Number of rows - required: true - style: simple - schema: - type: integer - format: int64 - content: - application/json: - schema: - type: string - text/csv: {} - "400": - description: Request pagination or table data select query is malformed - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "403": - description: Not allowed to get table data - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "404": - description: Failed to find table in metadata database - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "406": - description: Failed to format data - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "503": - description: Failed to establish connection with the metadata service - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - security: - - basicAuth: [] - - bearerAuth: [] - /api/database/{databaseId}/subset/{subsetId}/data: - get: - tags: - - subset-endpoint - summary: Get subset data - description: "Gets data of subset with id. For private databases, the user needs\ - \ at least *READ* access to the associated database. Requests with HTTP method\ - \ **GET** return the subset dataset, requests with HTTP method **HEAD** only\ - \ the number of rows in the subset dataset in the `X-Count` header" - operationId: getData_4 - parameters: - - name: databaseId - in: path - required: true - schema: - type: string - format: uuid - - name: subsetId - in: path - required: true - schema: - type: string - format: uuid - - name: Accept - in: header - required: true - schema: - type: string - - name: timestamp - in: query - required: false - schema: - type: string - format: date-time - - name: page - in: query - required: false - schema: - type: integer - format: int64 - - name: size - in: query - required: false - schema: - type: integer - format: int64 - responses: - "200": - description: Retrieved subset data - headers: - Access-Control-Expose-Headers: - description: Reverse proxy exposing of custom headers - required: true - style: simple - schema: - type: string - X-Count: - description: Number of rows - style: simple - schema: - type: string - format: uuid - X-Id: - description: The subset id - required: true - style: simple - schema: - type: string - format: uuid - X-Headers: - description: The list of headers separated by comma - style: simple - schema: - type: string - content: - application/json: - schema: - type: string - text/csv: {} - "400": - description: Invalid pagination - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "403": - description: Not allowed to retrieve subset data - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "404": - description: Failed to find database in metadata database or query in query - store of the data database - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "406": - description: Failed to format data - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "503": - description: Failed to communicate with database - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - security: - - bearerAuth: [] - - basicAuth: [] - head: - tags: - - subset-endpoint - summary: Get subset data - description: "Gets data of subset with id. For private databases, the user needs\ - \ at least *READ* access to the associated database. Requests with HTTP method\ - \ **GET** return the subset dataset, requests with HTTP method **HEAD** only\ - \ the number of rows in the subset dataset in the `X-Count` header" - operationId: getData_5 - parameters: - - name: databaseId - in: path - required: true - schema: - type: string - format: uuid - - name: subsetId - in: path - required: true - schema: - type: string - format: uuid - - name: Accept - in: header - required: true - schema: - type: string - - name: timestamp - in: query - required: false - schema: - type: string - format: date-time - - name: page - in: query - required: false - schema: - type: integer - format: int64 - - name: size - in: query - required: false - schema: - type: integer - format: int64 - responses: - "200": - description: Retrieved subset data - headers: - Access-Control-Expose-Headers: - description: Reverse proxy exposing of custom headers - required: true - style: simple - schema: - type: string - X-Count: - description: Number of rows - style: simple - schema: - type: string - format: uuid - X-Id: - description: The subset id - required: true - style: simple - schema: - type: string - format: uuid - X-Headers: - description: The list of headers separated by comma - style: simple - schema: - type: string - content: - application/json: - schema: - type: string - text/csv: {} - "400": - description: Invalid pagination - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "403": - description: Not allowed to retrieve subset data - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "404": - description: Failed to find database in metadata database or query in query - store of the data database - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "406": - description: Failed to format data - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "503": - description: Failed to communicate with database - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - security: - - bearerAuth: [] - - basicAuth: [] - /api/database/{databaseId}/subset/{queryId}: - put: - tags: - - subset-endpoint - summary: Persist subset - description: Persists a subset with id. Requires role `persist-query`. - operationId: persist - parameters: - - name: databaseId - in: path - required: true - schema: - type: string - format: uuid - - name: queryId - in: path - required: true - schema: - type: string - format: uuid - requestBody: - content: - application/json: - schema: - $ref: "#/components/schemas/QueryPersistDto" - required: true - responses: - "202": - description: Persisted subset - content: - application/json: - schema: - $ref: "#/components/schemas/QueryDto" - "400": - description: Malformed select query - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "403": - description: Not allowed to persist subset - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "404": - description: Failed to find database in metadata database or query in query - store of the data database - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "417": - description: Failed to persist subset - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "503": - description: Failed to communicate with database - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - security: - - bearerAuth: [] - - basicAuth: [] - /api/upload: - post: - tags: - - upload-endpoint - summary: Uploads a multipart file - description: Uploads a multipart file to the Storage Service. Requires role - `upload-file`. - operationId: create - requestBody: - content: - application/json: - schema: - type: object - properties: - file: - type: string - format: binary - required: - - file - required: true - responses: - "201": - description: Uploaded the file - content: - application/json: - schema: - $ref: "#/components/schemas/ViewDto" - "503": - description: Failed to establish connection with the storage service - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - security: - - basicAuth: [] - - bearerAuth: [] - /api/database/{databaseId}/table/{tableId}/data/import: - post: - tags: - - table-endpoint - summary: Import dataset - description: Imports a dataset in a table. Then update the table statistics. - The user needs to have at least *WRITE_OWN* access to the associated database - when importing into a owned table. Otherwise *WRITE_ALL* access in needed. - Requires role `insert-table-data`. - operationId: importDataset - parameters: - - name: databaseId - in: path - required: true - schema: - type: string - format: uuid - - name: tableId - in: path - required: true - schema: - type: string - format: uuid - - name: Authorization - in: header - required: true - schema: - type: string - requestBody: - content: - application/json: - schema: - $ref: "#/components/schemas/ImportDto" - required: true - responses: - "202": - description: Imported dataset successfully - "400": - description: Dataset and/or query are malformed - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "403": - description: Import table dataset not allowed - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "404": - description: Failed to find table in metadata database - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "503": - description: Failed to establish connection with the metadata service - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - security: - - basicAuth: [] - - bearerAuth: [] - /api/database/{databaseId}/subset: - get: - tags: - - subset-endpoint - summary: Find subsets - description: "Finds subsets in the query store. When the database schema is\ - \ marked as hidden, the user needs to be authorized, have at least read-access\ - \ to the database. The result can be optionally filtered by setting `persisted`.\ - \ When set to *true*, only persisted queries are returned, otherwise only\ - \ non-persisted queries are returned." - operationId: list - parameters: - - name: databaseId - in: path - required: true - schema: - type: string - format: uuid - - name: persisted - in: query - required: false - schema: - type: boolean - responses: - "200": - description: Found subsets - content: - application/json: - schema: - type: array - items: - $ref: "#/components/schemas/QueryDto" - "403": - description: Not allowed to find subsets - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "404": - description: Failed to find database in metadata database or query in query - store of the data database - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "503": - description: Failed to communicate with database - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - security: - - basicAuth: [] - - bearerAuth: [] - post: - tags: - - subset-endpoint - summary: Create subset - description: Creates a subset in the query store of the data database. Can also - be used without authentication if (and only if) the database is marked as - public (i.e. when `is_public` = `is_schema_public` is set to `true`). Otherwise - at least read access is required. - operationId: create_1 - parameters: - - name: databaseId - in: path - required: true - schema: - type: string - format: uuid - - name: timestamp - in: query - required: false - schema: - type: string - format: date-time - - name: page - in: query - required: false - schema: - type: integer - format: int64 - - name: size - in: query - required: false - schema: - type: integer - format: int64 - requestBody: - content: - application/json: - schema: - $ref: "#/components/schemas/SubsetDto" - required: true - responses: - "201": - description: Created subset - content: - application/json: - schema: - type: string - "400": - description: Malformed select query - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "403": - description: Not allowed to find subset - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "404": - description: Failed to find database in metadata database or query in query - store of the data database - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "406": - description: Failed to format data - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "417": - description: Failed to insert query into query store of data database - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "501": - description: Failed to execute query as it contains non-supported keywords - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "503": - description: Failed to communicate with database - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - security: - - basicAuth: [] - - bearerAuth: [] - /api/database/{databaseId}/table/{tableId}/history: - get: - tags: - - table-endpoint - summary: Get history - description: "Gets the insert/delete operations history performed. For tables\ - \ in private databases, the user needs to have at least *READ* access to the\ - \ associated database." - operationId: getHistory - parameters: - - name: databaseId - in: path - required: true - schema: - type: string - format: uuid - - name: tableId - in: path - required: true - schema: - type: string - format: uuid - - name: size - in: query - required: false - schema: - type: integer - format: int64 - responses: - "200": - description: Found table history - content: - application/json: - schema: - type: array - items: - $ref: "#/components/schemas/TableHistoryDto" - "400": - description: "Invalid pagination size request, must be > 0" - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "403": - description: Find table history not allowed - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "404": - description: Failed to find table history in data database - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "503": - description: Failed to establish connection with the metadata service - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - security: - - basicAuth: [] - - bearerAuth: [] - /api/database/{databaseId}/subset/{subsetId}: - get: - tags: - - subset-endpoint - summary: Find subset - description: "Finds a subset in the data database. When the database schema\ - \ is marked as hidden, the user needs to be authorized, have at least read-access\ - \ to the database. Requests with HTTP header `Accept=application/json` return\ - \ the metadata, requests with HTTP header `Accept=text/csv` return the data\ - \ as downloadable file." - operationId: findById - parameters: - - name: databaseId - in: path - required: true - schema: - type: string - format: uuid - - name: subsetId - in: path - required: true - schema: - type: string - format: uuid - - name: timestamp - in: query - required: false - schema: - type: string - format: date-time - responses: - "200": - description: Found subset - content: - application/json: - schema: - $ref: "#/components/schemas/QueryDto" - text/csv: {} - "400": - description: Malformed select query - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "403": - description: Not allowed to find subset - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "404": - description: Failed to find database in metadata database or query in query - store of the data database - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "406": - description: Failed to find acceptable representation - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "503": - description: Failed to communicate with database - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - security: - - basicAuth: [] - - bearerAuth: [] -components: - schemas: - ApiErrorDto: - type: object - properties: - status: - type: string - enum: - - 100 CONTINUE - - 101 SWITCHING_PROTOCOLS - - 102 PROCESSING - - 103 EARLY_HINTS - - 103 CHECKPOINT - - 200 OK - - 201 CREATED - - 202 ACCEPTED - - 203 NON_AUTHORITATIVE_INFORMATION - - 204 NO_CONTENT - - 205 RESET_CONTENT - - 206 PARTIAL_CONTENT - - 207 MULTI_STATUS - - 208 ALREADY_REPORTED - - 226 IM_USED - - 300 MULTIPLE_CHOICES - - 301 MOVED_PERMANENTLY - - 302 FOUND - - 302 MOVED_TEMPORARILY - - 303 SEE_OTHER - - 304 NOT_MODIFIED - - 305 USE_PROXY - - 307 TEMPORARY_REDIRECT - - 308 PERMANENT_REDIRECT - - 400 BAD_REQUEST - - 401 UNAUTHORIZED - - 402 PAYMENT_REQUIRED - - 403 FORBIDDEN - - 404 NOT_FOUND - - 405 METHOD_NOT_ALLOWED - - 406 NOT_ACCEPTABLE - - 407 PROXY_AUTHENTICATION_REQUIRED - - 408 REQUEST_TIMEOUT - - 409 CONFLICT - - 410 GONE - - 411 LENGTH_REQUIRED - - 412 PRECONDITION_FAILED - - 413 PAYLOAD_TOO_LARGE - - 413 REQUEST_ENTITY_TOO_LARGE - - 414 URI_TOO_LONG - - 414 REQUEST_URI_TOO_LONG - - 415 UNSUPPORTED_MEDIA_TYPE - - 416 REQUESTED_RANGE_NOT_SATISFIABLE - - 417 EXPECTATION_FAILED - - 418 I_AM_A_TEAPOT - - 419 INSUFFICIENT_SPACE_ON_RESOURCE - - 420 METHOD_FAILURE - - 421 DESTINATION_LOCKED - - 422 UNPROCESSABLE_ENTITY - - 423 LOCKED - - 424 FAILED_DEPENDENCY - - 425 TOO_EARLY - - 426 UPGRADE_REQUIRED - - 428 PRECONDITION_REQUIRED - - 429 TOO_MANY_REQUESTS - - 431 REQUEST_HEADER_FIELDS_TOO_LARGE - - 451 UNAVAILABLE_FOR_LEGAL_REASONS - - 500 INTERNAL_SERVER_ERROR - - 501 NOT_IMPLEMENTED - - 502 BAD_GATEWAY - - 503 SERVICE_UNAVAILABLE - - 504 GATEWAY_TIMEOUT - - 505 HTTP_VERSION_NOT_SUPPORTED - - 506 VARIANT_ALSO_NEGOTIATES - - 507 INSUFFICIENT_STORAGE - - 508 LOOP_DETECTED - - 509 BANDWIDTH_LIMIT_EXCEEDED - - 510 NOT_EXTENDED - - 511 NETWORK_AUTHENTICATION_REQUIRED - example: NOT_FOUND - message: - type: string - example: Error message - code: - type: string - example: error.service.code - required: - - code - - message - - status - TupleUpdateDto: - type: object - properties: - data: - type: object - additionalProperties: - type: object - example: - key: value - keys: - type: object - additionalProperties: - type: object - example: - id: 1 - required: - - data - - keys - QueryPersistDto: - type: object - properties: - persist: - type: boolean - example: true - required: - - persist - CreatorBriefDto: - type: object - properties: - id: - type: string - format: uuid - example: e41f94a6-2b94-4a12-ac0e-678684e1c070 - affiliation: - type: string - example: Brown University - creator_name: - type: string - example: "Carberry, Josiah" - name_type: - type: string - enum: - - Personal - - Organizational - example: Personal - name_identifier: - type: string - example: 0000-0002-1825-0097 - name_identifier_scheme: - type: string - enum: - - ORCID - - ROR - - ISNI - - GRID - example: ORCID - affiliation_identifier: - type: string - example: https://ror.org/05gq02987 - affiliation_identifier_scheme: - type: string - enum: - - ROR - - GRID - - ISNI - example: ROR - required: - - creator_name - - id - IdentifierBriefDto: - type: object - properties: - id: - type: string - format: uuid - example: b97cd56b-66ca-4354-9e6c-f47210cfaaec - type: - type: string - enum: - - database - - subset - - table - - view - example: database - creators: - type: array - items: - $ref: "#/components/schemas/CreatorBriefDto" - titles: - type: array - items: - $ref: "#/components/schemas/IdentifierTitleDto" - descriptions: - type: array - items: - $ref: "#/components/schemas/IdentifierDescriptionDto" - doi: - type: string - example: 10.1038/nphys1170 - publisher: - type: string - example: TU Wien - status: - type: string - enum: - - draft - - published - example: draft - database_id: - type: string - format: uuid - example: fc29f89c-86a8-4020-9e36-4d954736c6cc - query_id: - type: string - format: uuid - example: 1 - table_id: - type: string - format: uuid - example: 1 - view_id: - type: string - format: uuid - example: 1 - publication_year: - type: integer - format: int32 - example: 2022 - owned_by: - type: string - format: uuid - example: 2f45ef7a-7f9b-4667-9156-152c87fe1ca5 - required: - - creators - - database_id - - descriptions - - id - - owned_by - - publication_year - - publisher - - status - - titles - - type - IdentifierDescriptionDto: - type: object - properties: - id: - type: string - format: uuid - example: e0e9692c-910b-4b60-b53a-fc7c358a917d - description: - type: string - example: "Air quality reports at Stephansplatz, Vienna" - language: - type: string - enum: - - ab - - aa - - af - - ak - - sq - - am - - ar - - an - - hy - - as - - av - - ae - - ay - - az - - bm - - ba - - eu - - be - - bn - - bh - - bi - - bs - - br - - bg - - my - - ca - - km - - ch - - ce - - ny - - zh - - cu - - cv - - kw - - co - - cr - - hr - - cs - - da - - dv - - nl - - dz - - en - - eo - - et - - ee - - fo - - fj - - fi - - fr - - ff - - gd - - gl - - lg - - ka - - de - - ki - - el - - kl - - gn - - gu - - ht - - ha - - he - - hz - - hi - - ho - - hu - - is - - io - - ig - - id - - ia - - ie - - iu - - ik - - ga - - it - - ja - - jv - - kn - - kr - - ks - - kk - - rw - - kv - - kg - - ko - - kj - - ku - - ky - - lo - - la - - lv - - lb - - li - - ln - - lt - - lu - - mk - - mg - - ms - - ml - - mt - - gv - - mi - - mr - - mh - - ro - - mn - - na - - nv - - nd - - ng - - ne - - se - - "no" - - nb - - nn - - ii - - oc - - oj - - or - - om - - os - - pi - - pa - - ps - - fa - - pl - - pt - - qu - - rm - - rn - - ru - - sm - - sg - - sa - - sc - - sr - - sn - - sd - - si - - sk - - sl - - so - - st - - nr - - es - - su - - sw - - ss - - sv - - tl - - ty - - tg - - ta - - tt - - te - - th - - bo - - ti - - to - - ts - - tn - - tr - - tk - - tw - - ug - - uk - - ur - - uz - - ve - - vi - - vo - - wa - - cy - - fy - - wo - - xh - - yi - - yo - - za - - zu - example: en - type: - type: string - enum: - - Abstract - - Methods - - SeriesInformation - - TableOfContents - - TechnicalInfo - - Other - example: Abstract - required: - - id - IdentifierTitleDto: - type: object - properties: - id: - type: string - format: uuid - example: 70ce5164-fd74-413f-8712-f996b91defbf - title: - type: string - example: Airquality Demonstrator - language: - type: string - enum: - - ab - - aa - - af - - ak - - sq - - am - - ar - - an - - hy - - as - - av - - ae - - ay - - az - - bm - - ba - - eu - - be - - bn - - bh - - bi - - bs - - br - - bg - - my - - ca - - km - - ch - - ce - - ny - - zh - - cu - - cv - - kw - - co - - cr - - hr - - cs - - da - - dv - - nl - - dz - - en - - eo - - et - - ee - - fo - - fj - - fi - - fr - - ff - - gd - - gl - - lg - - ka - - de - - ki - - el - - kl - - gn - - gu - - ht - - ha - - he - - hz - - hi - - ho - - hu - - is - - io - - ig - - id - - ia - - ie - - iu - - ik - - ga - - it - - ja - - jv - - kn - - kr - - ks - - kk - - rw - - kv - - kg - - ko - - kj - - ku - - ky - - lo - - la - - lv - - lb - - li - - ln - - lt - - lu - - mk - - mg - - ms - - ml - - mt - - gv - - mi - - mr - - mh - - ro - - mn - - na - - nv - - nd - - ng - - ne - - se - - "no" - - nb - - nn - - ii - - oc - - oj - - or - - om - - os - - pi - - pa - - ps - - fa - - pl - - pt - - qu - - rm - - rn - - ru - - sm - - sg - - sa - - sc - - sr - - sn - - sd - - si - - sk - - sl - - so - - st - - nr - - es - - su - - sw - - ss - - sv - - tl - - ty - - tg - - ta - - tt - - te - - th - - bo - - ti - - to - - ts - - tn - - tr - - tk - - tw - - ug - - uk - - ur - - uz - - ve - - vi - - vo - - wa - - cy - - fy - - wo - - xh - - yi - - yo - - za - - zu - example: en - type: - type: string - enum: - - AlternativeTitle - - Subtitle - - TranslatedTitle - - Other - required: - - id - QueryDto: - type: object - properties: - id: - type: string - format: uuid - example: 83ea2326-f8f6-4263-baf8-cdf88a54efc7 - owner: - $ref: "#/components/schemas/UserBriefDto" - execution: - type: string - format: date-time - example: 2021-03-12T15:26:21Z - query: - type: string - example: SELECT `id` FROM `air_quality` - type: - type: string - enum: - - query - - view - example: query - identifiers: - type: array - items: - $ref: "#/components/schemas/IdentifierBriefDto" - database_id: - type: string - format: uuid - example: fc29f89c-86a8-4020-9e36-4d954736c6cc - query_normalized: - type: string - example: SELECT `id` FROM `air_quality` - query_hash: - type: string - example: 17e682f060b5f8e47ea04c5c4855908b0a5ad612022260fe50e11ecb0cc0ab76 - is_persisted: - type: boolean - example: true - result_hash: - type: string - example: 17e682f060b5f8e47ea04c5c4855908b0a5ad612022260fe50e11ecb0cc0ab76 - result_number: - type: integer - format: int64 - example: 1 - required: - - database_id - - execution - - id - - identifiers - - is_persisted - - owner - - query - - query_hash - - query_normalized - UserBriefDto: - type: object - properties: - id: - type: string - format: uuid - example: 1ffc7b0e-9aeb-4e8b-b8f1-68f3936155b4 - username: - type: string - description: Only contains lowercase characters - example: jcarberry - name: - type: string - example: Josiah Carberry - orcid: - type: string - example: 0000-0002-1825-0097 - qualified_name: - type: string - example: Josiah Carberry — @jcarberry - given_name: - type: string - example: Josiah - family_name: - type: string - example: Carberry - required: - - id - - username - CreatorDto: - type: object - properties: - id: - type: string - format: uuid - example: e41f94a6-2b94-4a12-ac0e-678684e1c070 - firstname: - type: string - example: Josiah - lastname: - type: string - example: Carberry - affiliation: - type: string - example: Brown University - creator_name: - type: string - example: "Carberry, Josiah" - name_type: - type: string - enum: - - Personal - - Organizational - example: Personal - name_identifier: - type: string - example: 0000-0002-1825-0097 - name_identifier_scheme: - type: string - enum: - - ORCID - - ROR - - ISNI - - GRID - example: ORCID - name_identifier_scheme_uri: - type: string - example: https://orcid.org/ - affiliation_identifier: - type: string - example: https://ror.org/05gq02987 - affiliation_identifier_scheme: - type: string - enum: - - ROR - - GRID - - ISNI - example: ROR - affiliation_identifier_scheme_uri: - type: string - example: https://ror.org/ - required: - - creator_name - - id - EnumDto: - type: object - properties: - id: - type: string - format: uuid - example: 5343bb3d-14d3-4eb7-a86f-b8fc553cb315 - value: - type: string - example: 3 - required: - - id - - value - IdentifierDto: - type: object - properties: - id: - type: string - format: uuid - example: b97cd56b-66ca-4354-9e6c-f47210cfaaec - links: - $ref: "#/components/schemas/LinksDto" - type: - type: string - enum: - - database - - subset - - table - - view - example: database - titles: - type: array - items: - $ref: "#/components/schemas/IdentifierTitleDto" - descriptions: - type: array - items: - $ref: "#/components/schemas/IdentifierDescriptionDto" - funders: - type: array - items: - $ref: "#/components/schemas/IdentifierFunderDto" - query: - type: string - example: "SELECT `id`, `value`, `location` FROM `air_quality` WHERE `location`\ - \ = \"09:STEF\"" - execution: - type: string - format: date-time - example: 2021-03-12T15:26:21Z - doi: - type: string - example: 10.1038/nphys1170 - publisher: - type: string - example: TU Wien - owner: - $ref: "#/components/schemas/UserBriefDto" - language: - type: string - enum: - - ab - - aa - - af - - ak - - sq - - am - - ar - - an - - hy - - as - - av - - ae - - ay - - az - - bm - - ba - - eu - - be - - bn - - bh - - bi - - bs - - br - - bg - - my - - ca - - km - - ch - - ce - - ny - - zh - - cu - - cv - - kw - - co - - cr - - hr - - cs - - da - - dv - - nl - - dz - - en - - eo - - et - - ee - - fo - - fj - - fi - - fr - - ff - - gd - - gl - - lg - - ka - - de - - ki - - el - - kl - - gn - - gu - - ht - - ha - - he - - hz - - hi - - ho - - hu - - is - - io - - ig - - id - - ia - - ie - - iu - - ik - - ga - - it - - ja - - jv - - kn - - kr - - ks - - kk - - rw - - kv - - kg - - ko - - kj - - ku - - ky - - lo - - la - - lv - - lb - - li - - ln - - lt - - lu - - mk - - mg - - ms - - ml - - mt - - gv - - mi - - mr - - mh - - ro - - mn - - na - - nv - - nd - - ng - - ne - - se - - "no" - - nb - - nn - - ii - - oc - - oj - - or - - om - - os - - pi - - pa - - ps - - fa - - pl - - pt - - qu - - rm - - rn - - ru - - sm - - sg - - sa - - sc - - sr - - sn - - sd - - si - - sk - - sl - - so - - st - - nr - - es - - su - - sw - - ss - - sv - - tl - - ty - - tg - - ta - - tt - - te - - th - - bo - - ti - - to - - ts - - tn - - tr - - tk - - tw - - ug - - uk - - ur - - uz - - ve - - vi - - vo - - wa - - cy - - fy - - wo - - xh - - yi - - yo - - za - - zu - licenses: - type: array - items: - $ref: "#/components/schemas/LicenseDto" - creators: - type: array - items: - $ref: "#/components/schemas/CreatorDto" - status: - type: string - enum: - - draft - - published - example: draft - database_id: - type: string - format: uuid - example: null - query_id: - type: string - format: uuid - example: null - table_id: - type: string - format: uuid - example: null - view_id: - type: string - format: uuid - example: null - query_normalized: - type: string - example: "SELECT `id`, `value`, `location` FROM `air_quality` WHERE `location`\ - \ = \"09:STEF\"" - related_identifiers: - type: array - items: - $ref: "#/components/schemas/RelatedIdentifierDto" - query_hash: - type: string - description: query hash in sha512 - result_hash: - type: string - example: 34fe82cda2c53f13f8d90cfd7a3469e3a939ff311add50dce30d9136397bf8e5 - result_number: - type: integer - format: int64 - example: 1 - publication_day: - type: integer - format: int32 - example: 15 - publication_month: - type: integer - format: int32 - example: 12 - publication_year: - type: integer - format: int32 - example: 2022 - required: - - creators - - database_id - - descriptions - - funders - - id - - language - - licenses - - links - - owner - - publication_year - - publisher - - query - - query_hash - - query_normalized - - status - - titles - - type - IdentifierFunderDto: - type: object - properties: - id: - type: string - format: uuid - example: 39693413-e0ce-46da-ad5e-029c0556d439 - funder_name: - type: string - example: European Commission - funder_identifier: - type: string - example: http://doi.org/10.13039/501100000780 - funder_identifier_type: - type: string - enum: - - Crossref Funder ID - - ROR - - GND - - ISNI - - Other - example: Crossref Funder ID - scheme_uri: - type: string - example: http://doi.org/ - award_number: - type: string - example: 824087 - award_title: - type: string - example: EOSC-Life - required: - - funder_name - - id - LicenseDto: - type: object - properties: - identifier: - type: string - example: MIT - uri: - type: string - example: https://opensource.org/licenses/MIT - description: - type: string - example: "A short and simple permissive license with conditions only requiring\ - \ preservation of copyright and license notices. Licensed works, modifications,\ - \ and larger works may be distributed under different terms and without\ - \ source code." - required: - - identifier - - uri - LinksDto: - type: object - properties: - self: - type: string - example: http://example.com/api/ - data: - type: string - example: http://example.com - self_html: - type: string - example: http://example.com - dashboard_html: - type: string - example: http://example.com/d/defi2baxqawaod - required: - - self - - self_html - RelatedIdentifierDto: - type: object - properties: - id: - type: string - format: uuid - example: ce9d11f0-60a2-448d-a3e4-44719a443e8a - value: - type: string - example: 10.70124/dc4zh-9ce78 - type: - type: string - enum: - - DOI - - URL - - URN - - ARK - - arXiv - - bibcode - - EAN13 - - EISSN - - Handle - - IGSN - - ISBN - - ISTC - - LISSN - - LSID - - PMID - - PURL - - UPC - - w3id - example: DOI - relation: - type: string - enum: - - IsCitedBy - - Cites - - IsSupplementTo - - IsSupplementedBy - - IsContinuedBy - - Continues - - IsDescribedBy - - Describes - - HasMetadata - - IsMetadataFor - - HasVersion - - IsVersionOf - - IsNewVersionOf - - IsPreviousVersionOf - - IsPartOf - - HasPart - - IsPublishedIn - - IsReferencedBy - - References - - IsDocumentedBy - - Documents - - IsCompiledBy - - Compiles - - IsVariantFormOf - - IsOriginalFormOf - - IsIdenticalTo - - IsReviewedBy - - Reviews - - IsDerivedFrom - - IsSourceOf - - IsRequiredBy - - Requires - - IsObsoletedBy - - Obsoletes - example: Cites - required: - - id - - relation - - type - - value - SetDto: - type: object - properties: - id: - type: string - format: uuid - example: 7eb4eded-bacc-4a91-84db-a9ae6ddafda7 - value: - type: string - example: 3 - required: - - id - - value - ViewColumnDto: - type: object - properties: - id: - type: string - format: uuid - example: 6aec3a91-2e0b-4e92-a16a-9c3c5e892da1 - name: - type: string - example: Given Name - maxLength: 64 - minLength: 0 - size: - type: integer - format: int64 - example: 255 - d: - type: integer - format: int64 - example: 0 - description: - type: string - example: Column comment - maxLength: 2048 - minLength: 0 - enums: - type: array - description: "enum values, only considered when type = ENUM" - items: - $ref: "#/components/schemas/EnumDto" - sets: - type: array - description: "enum values, only considered when type = ENUM" - items: - $ref: "#/components/schemas/SetDto" - database_id: - type: string - format: uuid - example: 2b5b2b03-fdd0-40d6-afe0-e5d02fd839e4 - ord: - type: integer - format: int32 - example: 0 - internal_name: - type: string - example: given_name - maxLength: 64 - minLength: 0 - index_length: - type: integer - format: int64 - example: 255 - length: - type: integer - format: int64 - example: 255 - type: - type: string - enum: - - char - - varchar - - binary - - varbinary - - tinyblob - - tinytext - - text - - blob - - mediumtext - - mediumblob - - longtext - - longblob - - enum - - set - - serial - - bit - - tinyint - - bool - - smallint - - mediumint - - int - - bigint - - float - - double - - decimal - - date - - datetime - - timestamp - - time - - year - example: varchar - is_null_allowed: - type: boolean - example: false - required: - - database_id - - id - - internal_name - - is_null_allowed - - name - - ord - - type - ViewDto: - type: object - properties: - id: - type: string - format: uuid - example: 787439d0-e85e-400c-a7e6-996a023bfad9 - name: - type: string - example: Air Quality - identifiers: - type: array - items: - $ref: "#/components/schemas/IdentifierDto" - query: - type: string - example: SELECT `id` FROM `air_quality` ORDER BY `value` DESC - owner: - $ref: "#/components/schemas/UserBriefDto" - columns: - type: array - items: - $ref: "#/components/schemas/ViewColumnDto" - created: - type: string - format: date-time - example: 2022-01-01 08:00:00.000 - last_retrieved: - type: string - format: date-time - example: 2025-01-23T12:09:01 - database_id: - type: string - format: uuid - example: fc29f89c-86a8-4020-9e36-4d954736c6cc - internal_name: - type: string - example: air_quality - is_public: - type: boolean - example: true - is_schema_public: - type: boolean - example: true - initial_view: - type: boolean - description: True if it is the default view for the database - example: true - query_hash: - type: string - example: 7de03e818900b6ea6d58ad0306d4a741d658c6df3d1964e89ed2395d8c7e7916 - required: - - columns - - created - - database_id - - id - - identifiers - - internal_name - - name - - owner - - query - - query_hash - TupleDto: - type: object - properties: - data: - type: object - additionalProperties: - type: object - example: - key: value - required: - - data - ImportDto: - type: object - properties: - location: - type: string - example: file.csv - header: - type: boolean - description: "If true, the first line contains the column names, otherwise\ - \ it contains only data" - example: true - separator: - type: string - example: "," - quote: - type: string - example: '"' - line_termination: - type: string - example: \r\n - required: - - header - - location - - separator - FilterDto: - type: object - properties: - type: - type: string - enum: - - where - - or - - and - example: where - value: - type: string - example: 1 - column_id: - type: string - format: uuid - example: 14128033-54b5-4818-a489-21b0dded86e2 - operator_id: - type: string - format: uuid - example: 67c5b54d-2eb0-4f42-8dc1-a504562e9f32 - required: - - column_id - - operator_id - - type - - value - OrderDto: - type: object - properties: - direction: - type: string - enum: - - asc - - desc - example: asc - column_id: - type: string - format: uuid - example: e891ba86-0258-41a6-a8d9-ff58bc10b618 - required: - - column_id - SubsetDto: - type: object - properties: - columns: - type: array - example: - - e891ba86-0258-41a6-a8d9-ff58bc10b618 - items: - type: string - format: uuid - filter: - type: array - items: - $ref: "#/components/schemas/FilterDto" - order: - type: array - items: - $ref: "#/components/schemas/OrderDto" - datasource_id: - type: string - format: uuid - example: f7df2a7d-4ade-4c78-97b0-7c744d0893c7 - datasource_type: - type: string - enum: - - table - - view - required: - - columns - - datasource_id - - datasource_type - TableHistoryDto: - type: object - properties: - timestamp: - type: string - format: date-time - example: 2021-03-12T15:26:21Z - event: - type: string - enum: - - insert - - delete - example: INSERT - total: - type: integer - format: int64 - example: 1 - required: - - event - - timestamp - - total - TupleDeleteDto: - type: object - properties: - keys: - type: object - additionalProperties: - type: object - example: - id: 1 - required: - - keys - securitySchemes: - basicAuth: - type: http - scheme: basic - bearerAuth: - type: http - scheme: bearer - bearerFormat: JWT diff --git a/.docs/.openapi/api-metadata-service.yaml b/.docs/.openapi/api-metadata-service.yaml new file mode 100644 index 0000000000000000000000000000000000000000..231e1d3c2e3516dd3be5c7bccb40dd6602dfb337 --- /dev/null +++ b/.docs/.openapi/api-metadata-service.yaml @@ -0,0 +1,9754 @@ +{ + "openapi": "3.1.0", + "info": { + "title": "Database Repository Metadata Service API", + "description": "Service that manages the metadata", + "contact": { + "name": "Prof. Andreas Rauber", + "email": "andreas.rauber@tuwien.ac.at" + }, + "license": { + "name": "Apache 2.0", + "url": "https://www.apache.org/licenses/LICENSE-2.0" + }, + "version": "1.9.0" + }, + "externalDocs": { + "description": "Sourcecode Documentation", + "url": "https://www.ifs.tuwien.ac.at/infrastructures/dbrepo/1.9.0/system-services-metadata/" + }, + "servers": [ + { + "url": "http://localhost", + "description": "Development instance" + }, + { + "url": "https://test.dbrepo.tuwien.ac.at", + "description": "Staging instance" + } + ], + "paths": { + "/api/user/{userId}": { + "get": { + "tags": [ + "user-endpoint" + ], + "summary": "Get user", + "description": "Gets own user information from the metadata database. Requires authentication. Foreign user information can only be obtained if additional role `find-foreign-user` is present. Finding information about internal users results in a 404 error.", + "operationId": "find", + "parameters": [ + { + "name": "userId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "responses": { + "200": { + "description": "Found user", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UserDto" + } + } + } + }, + "403": { + "description": "Find user is not permitted", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "404": { + "description": "User was not found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + } + }, + "security": [ + { + "bearerAuth": [] + }, + { + "basicAuth": [] + } + ] + }, + "put": { + "tags": [ + "user-endpoint" + ], + "summary": "Update user", + "description": "Updates user with id. Requires role `modify-user-information`.", + "operationId": "modify", + "parameters": [ + { + "name": "userId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UserUpdateDto" + } + } + }, + "required": true + }, + "responses": { + "202": { + "description": "Modified user information", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UserDto" + } + } + } + }, + "400": { + "description": "Modify user query is malformed", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "403": { + "description": "Not allowed to modify user metadata", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "404": { + "description": "Failed to find database/user in metadata database", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "503": { + "description": "Failed to modify user at auth service", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + } + }, + "security": [ + { + "bearerAuth": [] + }, + { + "basicAuth": [] + } + ] + }, + "head": { + "tags": [ + "user-endpoint" + ], + "summary": "Get user", + "description": "Gets own user information from the metadata database. Requires authentication. Foreign user information can only be obtained if additional role `find-foreign-user` is present. Finding information about internal users results in a 404 error.", + "operationId": "find_1", + "parameters": [ + { + "name": "userId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "responses": { + "200": { + "description": "Found user", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UserDto" + } + } + } + }, + "403": { + "description": "Find user is not permitted", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "404": { + "description": "User was not found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + } + }, + "security": [ + { + "bearerAuth": [] + }, + { + "basicAuth": [] + } + ] + } + }, + "/api/database": { + "get": { + "tags": [ + "database-endpoint" + ], + "summary": "List databases", + "description": "Lists all databases in the metadata database. Requests with HTTP method **GET** return the list of databases, requests with HTTP method **HEAD** only the number in the `X-Count` header.", + "operationId": "list", + "parameters": [ + { + "name": "internal_name", + "in": "query", + "required": false, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "List of databases", + "headers": { + "Access-Control-Expose-Headers": { + "description": "Expose `X-Count` custom header", + "required": true, + "style": "simple", + "schema": { + "type": "string" + } + }, + "X-Count": { + "description": "Number of databases", + "required": true, + "style": "simple", + "schema": { + "type": "integer", + "format": "int64" + } + } + }, + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/DatabaseBriefDto" + } + } + } + } + } + } + }, + "post": { + "tags": [ + "database-endpoint" + ], + "summary": "Create database", + "description": "Creates a database in the container with id. Requires roles `create-database`.", + "operationId": "create", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateDatabaseDto" + } + } + }, + "required": true + }, + "responses": { + "201": { + "description": "Created a new database", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DatabaseBriefDto" + } + } + } + }, + "400": { + "description": "Database create query is malformed or image is not supported", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "403": { + "description": "Database create permission is missing or grant permissions at broker service failed", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "404": { + "description": "Failed to fin container/user/database in metadata database", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "409": { + "description": "Query store could not be created", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "423": { + "description": "Database quota exceeded", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "502": { + "description": "Connection to search service failed", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "503": { + "description": "Failed to save in search service", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + } + }, + "security": [ + { + "bearerAuth": [] + }, + { + "basicAuth": [] + } + ] + }, + "head": { + "tags": [ + "database-endpoint" + ], + "summary": "List databases", + "description": "Lists all databases in the metadata database. Requests with HTTP method **GET** return the list of databases, requests with HTTP method **HEAD** only the number in the `X-Count` header.", + "operationId": "list_1", + "parameters": [ + { + "name": "internal_name", + "in": "query", + "required": false, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "List of databases", + "headers": { + "Access-Control-Expose-Headers": { + "description": "Expose `X-Count` custom header", + "required": true, + "style": "simple", + "schema": { + "type": "string" + } + }, + "X-Count": { + "description": "Number of databases", + "required": true, + "style": "simple", + "schema": { + "type": "integer", + "format": "int64" + } + } + }, + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/DatabaseBriefDto" + } + } + } + } + } + } + } + }, + "/api/database/{databaseId}/access/{userId}": { + "get": { + "tags": [ + "access-endpoint" + ], + "summary": "Find/Check access", + "description": "Finds or checks access of a user with given id to a database with given id. Requests with HTTP method **GET** return the access object, requests with HTTP method **HEAD** only the status. When the user has at least *READ* access, the status 200 is returned, 403 otherwise. Requires role `check-database-access` or `check-foreign-database-access`.", + "operationId": "find_2", + "parameters": [ + { + "name": "databaseId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "userId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "responses": { + "200": { + "description": "Found database access", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DatabaseAccessDto" + } + } + } + }, + "403": { + "description": "No access to this database", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "404": { + "description": "Database not found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + } + }, + "security": [ + { + "bearerAuth": [] + }, + { + "basicAuth": [] + } + ] + }, + "put": { + "tags": [ + "access-endpoint" + ], + "summary": "Modify access", + "description": "Modifies access of a user with given id to database with given id. Requires role `update-database-access`.", + "operationId": "update", + "parameters": [ + { + "name": "databaseId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "userId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateAccessDto" + } + } + }, + "required": true + }, + "responses": { + "202": { + "description": "Modified access" + }, + "400": { + "description": "Modify access query or database connection is malformed", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "403": { + "description": "Modify access not permitted when no access is granted in the first place", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "404": { + "description": "Database or user not found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "502": { + "description": "Access could not be updated due to connection error in the data service", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "503": { + "description": "Access could not be updated in the data service", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + } + }, + "security": [ + { + "bearerAuth": [] + }, + { + "basicAuth": [] + } + ] + }, + "post": { + "tags": [ + "access-endpoint" + ], + "summary": "Give access", + "description": "Give a user with given id access to some database with given id. Requires role `create-database-access`.", + "operationId": "create_1", + "parameters": [ + { + "name": "databaseId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "userId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateAccessDto" + } + } + }, + "required": true + }, + "responses": { + "202": { + "description": "Granting access succeeded", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DatabaseAccessDto" + } + } + } + }, + "400": { + "description": "Granting access query or database connection is malformed", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "403": { + "description": "Failed giving access", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "404": { + "description": "Database or user not found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "502": { + "description": "Access could not be created due to connection error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "503": { + "description": "Access could not be created in the data service", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + } + }, + "security": [ + { + "bearerAuth": [] + }, + { + "basicAuth": [] + } + ] + }, + "delete": { + "tags": [ + "access-endpoint" + ], + "summary": "Delete access", + "description": "Delete access of a user with id to a database with id. Requires role `delete-database-access`.", + "operationId": "revoke", + "parameters": [ + { + "name": "databaseId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "userId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "responses": { + "202": { + "description": "Deleted access" + }, + "400": { + "description": "Modify access query or database connection is malformed", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "403": { + "description": "Revoke of access not permitted as no access was found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "404": { + "description": "User, database with access was not found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "502": { + "description": "Access could not be created due to connection error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "503": { + "description": "Access could not be revoked in the data service", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + } + }, + "security": [ + { + "bearerAuth": [] + }, + { + "basicAuth": [] + } + ] + }, + "head": { + "tags": [ + "access-endpoint" + ], + "summary": "Find/Check access", + "description": "Finds or checks access of a user with given id to a database with given id. Requests with HTTP method **GET** return the access object, requests with HTTP method **HEAD** only the status. When the user has at least *READ* access, the status 200 is returned, 403 otherwise. Requires role `check-database-access` or `check-foreign-database-access`.", + "operationId": "find_3", + "parameters": [ + { + "name": "databaseId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "userId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "responses": { + "200": { + "description": "Found database access", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DatabaseAccessDto" + } + } + } + }, + "403": { + "description": "No access to this database", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "404": { + "description": "Database not found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + } + }, + "security": [ + { + "bearerAuth": [] + }, + { + "basicAuth": [] + } + ] + } + }, + "/api/ontology/{ontologyId}": { + "get": { + "tags": [ + "ontology-endpoint" + ], + "summary": "Find ontology", + "description": "Finds an ontology with id in the metadata database.", + "operationId": "find_4", + "parameters": [ + { + "name": "ontologyId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "responses": { + "200": { + "description": "Find one ontology", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/OntologyDto" + } + } + } + }, + "404": { + "description": "Could not find ontology", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + } + } + }, + "put": { + "tags": [ + "ontology-endpoint" + ], + "summary": "Update ontology", + "description": "Updates an ontology with id. Requires role `update-ontology`.", + "operationId": "update_1", + "parameters": [ + { + "name": "ontologyId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/OntologyModifyDto" + } + } + }, + "required": true + }, + "responses": { + "202": { + "description": "Updated ontology successfully", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/OntologyDto" + } + } + } + }, + "404": { + "description": "Could not find ontology", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + } + }, + "security": [ + { + "bearerAuth": [] + }, + { + "basicAuth": [] + } + ] + }, + "delete": { + "tags": [ + "ontology-endpoint" + ], + "summary": "Delete ontology", + "description": "Deletes an ontology with given id. Requires role `delete-ontology`.", + "operationId": "delete", + "parameters": [ + { + "name": "ontologyId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "responses": { + "202": { + "description": "Deleted ontology successfully", + "content": { + "application/json": {} + } + }, + "404": { + "description": "Could not find ontology", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + } + }, + "security": [ + { + "bearerAuth": [] + }, + { + "basicAuth": [] + } + ] + } + }, + "/api/message/{messageId}": { + "put": { + "tags": [ + "message-endpoint" + ], + "summary": "Update message", + "description": "Updates a message with id. Requires role `update-maintenance-message`.", + "operationId": "update_2", + "parameters": [ + { + "name": "messageId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/BannerMessageUpdateDto" + } + } + }, + "required": true + }, + "responses": { + "202": { + "description": "Updated message", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/BannerMessageBriefDto" + } + } + } + }, + "404": { + "description": "Could not find message", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + } + }, + "security": [ + { + "bearerAuth": [] + }, + { + "basicAuth": [] + } + ] + }, + "delete": { + "tags": [ + "message-endpoint" + ], + "summary": "Delete message", + "description": "Deletes a message with id. Requires role `delete-maintenance-message`.", + "operationId": "delete_1", + "parameters": [ + { + "name": "messageId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "responses": { + "202": { + "description": "Deleted message", + "content": { + "application/json": {} + } + }, + "404": { + "description": "Could not find message", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + } + }, + "security": [ + { + "bearerAuth": [] + }, + { + "basicAuth": [] + } + ] + } + }, + "/api/image/{imageId}": { + "get": { + "tags": [ + "image-endpoint" + ], + "summary": "Find image", + "description": "Finds a container image in the metadata database.", + "operationId": "findById", + "parameters": [ + { + "name": "imageId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "responses": { + "200": { + "description": "Found image", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ImageDto" + } + } + } + }, + "404": { + "description": "Image could not be found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + } + } + }, + "put": { + "tags": [ + "image-endpoint" + ], + "summary": "Update image", + "description": "Updates container image in the metadata database. Requires role `modify-image`.", + "operationId": "update_3", + "parameters": [ + { + "name": "imageId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ImageChangeDto" + } + } + }, + "required": true + }, + "responses": { + "202": { + "description": "Updated image successfully", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ImageDto" + } + } + } + }, + "404": { + "description": "Image could not be found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + } + }, + "security": [ + { + "bearerAuth": [] + }, + { + "basicAuth": [] + } + ] + }, + "delete": { + "tags": [ + "image-endpoint" + ], + "summary": "Delete image", + "description": "Deletes a container image in the metadata database. Requires role `delete-image`.", + "operationId": "delete_2", + "parameters": [ + { + "name": "imageId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "responses": { + "202": { + "description": "Deleted image successfully" + }, + "404": { + "description": "Image could not be found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + } + }, + "security": [ + { + "bearerAuth": [] + }, + { + "basicAuth": [] + } + ] + } + }, + "/api/identifier/{identifierId}": { + "get": { + "tags": [ + "identifier-endpoint" + ], + "summary": "Find identifier", + "description": "Finds an identifier with id. The response format depends on the HTTP `Accept` header set on the request.", + "operationId": "find_5", + "parameters": [ + { + "name": "identifierId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "Accept", + "in": "header", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Found identifier successfully", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/IdentifierDto" + } + }, + "application/ld+json": { + "schema": { + "$ref": "#/components/schemas/LdDatasetDto" + } + }, + "text/xml": {}, + "text/bibliography": {}, + "text/bibliography; style=apa": {}, + "text/bibliography; style=ieee": {}, + "text/bibliography; style=bibtex": {} + } + }, + "400": { + "description": "Identifier could not be exported, the requested style is not known", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "403": { + "description": "Not allowed to view identifier", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "404": { + "description": "Identifier could not be found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "406": { + "description": "Failed to find acceptable representation", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "409": { + "description": "Exported resource was not found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "410": { + "description": "Failed to retrieve from S3 endpoint", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "502": { + "description": "Connection to data service failed", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "503": { + "description": "Failed to find in data service", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + } + } + }, + "put": { + "tags": [ + "identifier-endpoint" + ], + "summary": "Save identifier", + "description": "Saves an identifier with id as a draft identifier. Identifiers can only be created for objects the user has at least *READ* access in the associated database (requires role `create-identifier`) or for any object in any database (requires role `create-foreign-identifier`).", + "operationId": "save", + "parameters": [ + { + "name": "identifierId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/IdentifierSaveDto" + } + } + }, + "required": true + }, + "responses": { + "202": { + "description": "Saved identifier", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/IdentifierDto" + } + } + } + }, + "400": { + "description": "Identifier form contains invalid request data", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "403": { + "description": "Insufficient access rights or authorities", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "404": { + "description": "Failed to find database, table or view", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "502": { + "description": "Connection to search service failed", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "503": { + "description": "Failed to save in search service", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + } + }, + "security": [ + { + "bearerAuth": [] + }, + { + "basicAuth": [] + } + ] + }, + "delete": { + "tags": [ + "identifier-endpoint" + ], + "summary": "Delete identifier", + "description": "Deletes an identifier with id. Requires role `delete-identifier`.", + "operationId": "delete_3", + "parameters": [ + { + "name": "identifierId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "responses": { + "202": { + "description": "Deleted identifier" + }, + "403": { + "description": "Deleting identifier not permitted", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "404": { + "description": "Identifier or database could not be found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "502": { + "description": "Connection to search service failed", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "503": { + "description": "Failed to delete in search service", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + } + }, + "security": [ + { + "bearerAuth": [] + }, + { + "basicAuth": [] + } + ] + } + }, + "/api/identifier/{identifierId}/publish": { + "put": { + "tags": [ + "identifier-endpoint" + ], + "summary": "Publish identifier", + "description": "Publishes an identifier with id. A published identifier cannot be changed anymore. Requires role `publish-identifier`.", + "operationId": "publish", + "parameters": [ + { + "name": "identifierId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "responses": { + "202": { + "description": "Published identifier", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/IdentifierDto" + } + } + } + }, + "400": { + "description": "Identifier form contains invalid request data", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "403": { + "description": "Insufficient access rights or authorities", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "404": { + "description": "Failed to find database, table or view", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "502": { + "description": "Connection to search service failed", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "503": { + "description": "Failed to save in search service", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + } + }, + "security": [ + { + "bearerAuth": [] + }, + { + "basicAuth": [] + } + ] + } + }, + "/api/database/{databaseId}/visibility": { + "put": { + "tags": [ + "database-endpoint" + ], + "summary": "Update database visibility", + "description": "Updates the database with id on the visibility. Only the database owner can perform this operation. Requires role `modify-database-visibility`.", + "operationId": "visibility", + "parameters": [ + { + "name": "databaseId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DatabaseModifyVisibilityDto" + } + } + }, + "required": true + }, + "responses": { + "202": { + "description": "Visibility modified successfully", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DatabaseBriefDto" + } + } + } + }, + "400": { + "description": "The visibility payload is malformed", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "403": { + "description": "Visibility modification is not permitted", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "404": { + "description": "Failed to find database in metadata database", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "502": { + "description": "Connection to search service failed", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "503": { + "description": "Failed to save in search service", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + } + }, + "security": [ + { + "bearerAuth": [] + }, + { + "basicAuth": [] + } + ] + } + }, + "/api/database/{databaseId}/view/{viewId}": { + "get": { + "tags": [ + "view-endpoint" + ], + "summary": "Get view", + "description": "Gets a view with id in the metadata database.", + "operationId": "find_6", + "parameters": [ + { + "name": "databaseId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "viewId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "responses": { + "200": { + "description": "Find view successfully", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ViewDto" + } + } + } + }, + "403": { + "description": "Find view is not permitted", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "404": { + "description": "Database, view or user could not be found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + } + }, + "security": [ + { + "bearerAuth": [] + }, + { + "basicAuth": [] + } + ] + }, + "put": { + "tags": [ + "view-endpoint" + ], + "summary": "Update view", + "description": "Updates a view with id. This can only be performed by the view owner or database owner. Requires role `create-database-view`.", + "operationId": "update_4", + "parameters": [ + { + "name": "databaseId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "viewId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ViewUpdateDto" + } + } + }, + "required": true + }, + "responses": { + "202": { + "description": "Update view successfully", + "content": { + "*/*": { + "schema": { + "$ref": "#/components/schemas/ViewBriefDto" + } + } + } + }, + "400": { + "description": "Update view query is malformed", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "403": { + "description": "Update not allowed", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "404": { + "description": "Database or View could not be found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "502": { + "description": "Connection to search service failed", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "503": { + "description": "Failed to save in search service", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + } + }, + "security": [ + { + "bearerAuth": [] + }, + { + "basicAuth": [] + } + ] + }, + "delete": { + "tags": [ + "view-endpoint" + ], + "summary": "Delete view", + "description": "Deletes a view with id. Requires role `delete-database-view`.", + "operationId": "delete_4", + "parameters": [ + { + "name": "databaseId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "viewId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "responses": { + "202": { + "description": "Delete view successfully" + }, + "400": { + "description": "Delete view query is malformed", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "403": { + "description": "Deletion not allowed", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "404": { + "description": "Database, view or user could not be found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "423": { + "description": "Delete view resulted in an invalid query statement", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "502": { + "description": "Connection to search service failed", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "503": { + "description": "Failed to save in search service", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + } + }, + "security": [ + { + "bearerAuth": [] + }, + { + "basicAuth": [] + } + ] + } + }, + "/api/database/{databaseId}/table/{tableId}": { + "get": { + "tags": [ + "table-endpoint" + ], + "summary": "Find table", + "description": "Finds a table with id. When a table is hidden (i.e. when `is_public` is `false`), then the user needs to have at least read access and the role `find-table`. When the `system` role is present, the endpoint responds with additional connection metadata in the header.", + "operationId": "findById_1", + "parameters": [ + { + "name": "databaseId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "tableId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "responses": { + "200": { + "description": "Find table successfully", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TableDto" + } + } + } + }, + "403": { + "description": "Access to the database is forbidden", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "404": { + "description": "Table, database or container could not be found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + } + }, + "security": [ + { + "bearerAuth": [] + }, + { + "basicAuth": [] + } + ] + }, + "put": { + "tags": [ + "table-endpoint" + ], + "summary": "Update table", + "description": "Updates a table in the database with id. Requires role `update-table`.", + "operationId": "update_5", + "parameters": [ + { + "name": "databaseId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "tableId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TableUpdateDto" + } + } + }, + "required": true + }, + "responses": { + "202": { + "description": "Updated the table", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TableBriefDto" + } + } + } + }, + "400": { + "description": "Update table visibility payload is malformed", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "403": { + "description": "Update table visibility not permitted", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "404": { + "description": "Table could not be found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "502": { + "description": "Connection to search service failed", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "503": { + "description": "Failed to save in search service", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + } + }, + "security": [ + { + "bearerAuth": [] + }, + { + "basicAuth": [] + } + ] + }, + "delete": { + "tags": [ + "table-endpoint" + ], + "summary": "Delete table", + "description": "Deletes a table with id. Only the owner of a table can perform this action (requires role `delete-table`) or anyone can delete a table (requires role `delete-foreign-table`).", + "operationId": "delete_5", + "parameters": [ + { + "name": "databaseId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "tableId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "responses": { + "202": { + "description": "Delete table successfully" + }, + "400": { + "description": "Delete table query resulted in an invalid query statement", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "403": { + "description": "Access to the database is forbidden", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "404": { + "description": "Table, database or container could not be found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "502": { + "description": "Connection to search service failed", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "503": { + "description": "Failed to save in search service", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + } + }, + "security": [ + { + "bearerAuth": [] + }, + { + "basicAuth": [] + } + ] + } + }, + "/api/database/{databaseId}/table/{tableId}/statistic": { + "put": { + "tags": [ + "table-endpoint" + ], + "summary": "Update statistics", + "description": "Updates basic statistical properties (min, max, mean, median, std.dev) for numerical columns in a table with id. This action can only be performed by the table owner. Requires role `update-table-statistic`.", + "operationId": "updateStatistic", + "parameters": [ + { + "name": "databaseId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "tableId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "responses": { + "202": { + "description": "Updated table statistics successfully" + }, + "400": { + "description": "Failed to map column statistic to known columns", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "403": { + "description": "Not the owner", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "404": { + "description": "Failed to find database/table in metadata database", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "502": { + "description": "Connection to search service failed", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "503": { + "description": "Failed to save in search service", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + } + }, + "security": [ + { + "bearerAuth": [] + }, + { + "basicAuth": [] + } + ] + } + }, + "/api/database/{databaseId}/table/{tableId}/column/{columnId}": { + "put": { + "tags": [ + "table-endpoint" + ], + "summary": "Update semantics", + "description": "Updates column semantics of a table column with id. Only the table owner with at least *READ* access to the associated database can update the column semantics (requires role `modify-table-column-semantics`) or foreign table columns if role `modify-foreign-table-column-semantics`.", + "operationId": "updateColumn", + "parameters": [ + { + "name": "databaseId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "tableId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "columnId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ColumnSemanticsUpdateDto" + } + } + }, + "required": true + }, + "responses": { + "202": { + "description": "Updated column semantics successfully", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ColumnDto" + } + } + } + }, + "400": { + "description": "Update semantic concept query is malformed or update unit of measurement query is malformed", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "403": { + "description": "Access to the database is forbidden", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "404": { + "description": "Failed to find user/table/database/ontology in metadata database", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "502": { + "description": "Connection to search service failed", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "503": { + "description": "Failed to save in search service", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + } + }, + "security": [ + { + "bearerAuth": [] + }, + { + "basicAuth": [] + } + ] + } + }, + "/api/database/{databaseId}/owner": { + "put": { + "tags": [ + "database-endpoint" + ], + "summary": "Update database owner", + "description": "Updates the database with id on the owner. Only the database owner can perform this operation. Requires role `modify-database-owner`.", + "operationId": "transfer", + "parameters": [ + { + "name": "databaseId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DatabaseTransferDto" + } + } + }, + "required": true + }, + "responses": { + "202": { + "description": "Transfer of ownership was successful", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DatabaseBriefDto" + } + } + } + }, + "400": { + "description": "Owner payload is malformed", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "404": { + "description": "Database or user could not be found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "403": { + "description": "Transfer of ownership is not permitted", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "502": { + "description": "Connection to search service failed", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "503": { + "description": "Failed to save in search service", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + } + }, + "security": [ + { + "bearerAuth": [] + }, + { + "basicAuth": [] + } + ] + } + }, + "/api/database/{databaseId}/metadata/view": { + "put": { + "tags": [ + "database-endpoint" + ], + "summary": "Update database view schemas", + "description": "Updates the database with id with generated metadata from view that are not yet known to the database. Only the database owner can perform this operation. Requires role `find-database`.", + "operationId": "refreshViewMetadata", + "parameters": [ + { + "name": "databaseId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "responses": { + "200": { + "description": "Refreshed database views metadata", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DatabaseBriefDto" + } + } + } + }, + "403": { + "description": "Refresh view metadata is not permitted", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "404": { + "description": "Failed to find database in metadata database", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "502": { + "description": "Connection to search service failed", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "503": { + "description": "Failed to save in search service", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + } + }, + "security": [ + { + "bearerAuth": [] + }, + { + "basicAuth": [] + } + ] + } + }, + "/api/database/{databaseId}/metadata/table": { + "put": { + "tags": [ + "database-endpoint" + ], + "summary": "Update database table schemas", + "description": "Updates the database with id with generated metadata from tables that are not yet known to the database. Only the database owner can perform this operation. Requires role `find-database`.", + "operationId": "refreshTableMetadata", + "parameters": [ + { + "name": "databaseId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "responses": { + "200": { + "description": "Refreshed database tables metadata", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DatabaseBriefDto" + } + } + } + }, + "400": { + "description": "Failed to parse payload at search service", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "403": { + "description": "Not allowed to refresh table metadata", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "404": { + "description": "Failed to find database in metadata database", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "502": { + "description": "Connection to search service failed", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "503": { + "description": "Failed to save in search service", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + } + }, + "security": [ + { + "bearerAuth": [] + }, + { + "basicAuth": [] + } + ] + } + }, + "/api/database/{databaseId}/image": { + "get": { + "tags": [ + "database-endpoint" + ], + "summary": "Get database preview image", + "description": "Gets the database with id on the preview image.", + "operationId": "findPreviewImage", + "parameters": [ + { + "name": "databaseId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "responses": { + "200": { + "description": "View of image was successful", + "content": { + "*/*": { + "schema": { + "type": "string", + "format": "byte" + } + } + } + }, + "404": { + "description": "Database or user could not be found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + } + }, + "security": [ + { + "bearerAuth": [] + }, + { + "basicAuth": [] + } + ] + }, + "put": { + "tags": [ + "database-endpoint" + ], + "summary": "Update database preview image", + "description": "Updates the database with id on the preview image. Only the database owner can perform this operation. Requires role `modify-database-image`.", + "operationId": "modifyImage", + "parameters": [ + { + "name": "databaseId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DatabaseModifyImageDto" + } + } + }, + "required": true + }, + "responses": { + "202": { + "description": "Modify of image was successful", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DatabaseBriefDto" + } + } + } + }, + "403": { + "description": "Modify of image is not permitted", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "404": { + "description": "Database could not be found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "410": { + "description": "File was not found in the Storage Service", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "502": { + "description": "Connection to search service failed", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "503": { + "description": "Failed to save in search service", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + } + }, + "security": [ + { + "bearerAuth": [] + }, + { + "basicAuth": [] + } + ] + } + }, + "/api/database/{databaseId}/dashboard": { + "put": { + "tags": [ + "database-endpoint" + ], + "summary": "Update database dashboard uid", + "description": "Updates the dashboard uid for a database with given id. Only the database owner can perform this operation. Requires role `system`.", + "operationId": "modifyDashboard", + "parameters": [ + { + "name": "databaseId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DatabaseModifyDashboardDto" + } + } + }, + "required": true + }, + "responses": { + "202": { + "description": "Modify of dashboard uid was successful", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DatabaseBriefDto" + } + } + } + }, + "400": { + "description": "Malformed payload", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "404": { + "description": "Database could not be found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "502": { + "description": "Connection to search service failed", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "503": { + "description": "Failed to save in search service", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + } + }, + "security": [ + { + "bearerAuth": [] + }, + { + "basicAuth": [] + } + ] + } + }, + "/api/ontology": { + "get": { + "tags": [ + "ontology-endpoint" + ], + "summary": "List ontologies", + "description": "Lists all ontologies known to the metadata database.", + "operationId": "findAll", + "responses": { + "200": { + "description": "List ontologies", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/OntologyBriefDto" + } + } + } + } + } + } + }, + "post": { + "tags": [ + "ontology-endpoint" + ], + "summary": "Create ontology", + "description": "Creates an ontology in the metadata database. Requires role `create-ontology`.", + "operationId": "create_2", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/OntologyCreateDto" + } + } + }, + "required": true + }, + "responses": { + "201": { + "description": "Registered ontology successfully", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/OntologyDto" + } + } + } + } + }, + "security": [ + { + "bearerAuth": [] + }, + { + "basicAuth": [] + } + ] + } + }, + "/api/message": { + "get": { + "tags": [ + "message-endpoint" + ], + "summary": "List messages", + "description": "Lists messages known to the metadata database. Messages can be filtered be filtered with the optional `active` parameter. If set to *true*, only active messages (that is, messages whose end time has not been reached) will be returned. Otherwise only inactive messages are returned. If not set, active and inactive messages are returned.", + "operationId": "list_2", + "parameters": [ + { + "name": "active", + "in": "query", + "required": false, + "schema": { + "type": "boolean" + } + } + ], + "responses": { + "200": { + "description": "List messages", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/BannerMessageDto" + } + } + } + } + } + } + }, + "post": { + "tags": [ + "message-endpoint" + ], + "summary": "Create message", + "description": "Creates a message in the metadata database. Requires role `create-maintenance-message`.", + "operationId": "create_3", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/BannerMessageCreateDto" + } + } + }, + "required": true + }, + "responses": { + "201": { + "description": "Created message", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/BannerMessageBriefDto" + } + } + } + } + }, + "security": [ + { + "bearerAuth": [] + }, + { + "basicAuth": [] + } + ] + } + }, + "/api/image": { + "get": { + "tags": [ + "image-endpoint" + ], + "summary": "List images", + "description": "Lists all container images known to the metadata database.", + "operationId": "findAll_1", + "responses": { + "200": { + "description": "List images", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ImageBriefDto" + } + } + } + } + } + } + }, + "post": { + "tags": [ + "image-endpoint" + ], + "summary": "Create image", + "description": "Creates a container image in the metadata database. Requires role `create-image`.", + "operationId": "create_4", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ImageCreateDto" + } + } + }, + "required": true + }, + "responses": { + "201": { + "description": "Created image", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ImageDto" + } + } + } + }, + "400": { + "description": "Image specification is invalid", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "409": { + "description": "Image already exists", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + } + }, + "security": [ + { + "bearerAuth": [] + }, + { + "basicAuth": [] + } + ] + } + }, + "/api/identifier": { + "get": { + "tags": [ + "identifier-endpoint" + ], + "summary": "List identifiers", + "description": "Lists all identifiers known to the metadata database", + "operationId": "findAll_2", + "parameters": [ + { + "name": "type", + "in": "query", + "required": false, + "schema": { + "type": "string", + "enum": [ + "database", + "subset", + "table", + "view" + ] + } + }, + { + "name": "status", + "in": "query", + "required": false, + "schema": { + "type": "string", + "enum": [ + "draft", + "published" + ] + } + }, + { + "name": "dbid", + "in": "query", + "required": false, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "qid", + "in": "query", + "required": false, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "vid", + "in": "query", + "required": false, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "tid", + "in": "query", + "required": false, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "Accept", + "in": "header", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Found identifiers successfully", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "type": "array", + "items": { + "$ref": "#/components/schemas/IdentifierBriefDto" + } + } + } + }, + "application/ld+json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/LdDatasetDto" + } + } + } + } + } + } + }, + "post": { + "tags": [ + "identifier-endpoint" + ], + "summary": "Create identifier", + "description": "Create an identifier with id to create a draft identifier. Identifiers can only be created for objects the user has at least *READ* access in the associated database (requires role `create-identifier`) or for any object in any database (requires role `create-foreign-identifier`).", + "operationId": "create_5", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateIdentifierDto" + } + } + }, + "required": true + }, + "responses": { + "201": { + "description": "Drafted identifier", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/IdentifierDto" + } + } + } + }, + "400": { + "description": "Identifier form contains invalid request data", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "403": { + "description": "Insufficient access rights or authorities", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "404": { + "description": "Failed to find database, table or view", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "502": { + "description": "Connection to search service failed", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "503": { + "description": "Failed to save in search service", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + } + }, + "security": [ + { + "bearerAuth": [] + }, + { + "basicAuth": [] + } + ] + } + }, + "/api/database/{databaseId}/view": { + "get": { + "tags": [ + "view-endpoint" + ], + "summary": "List views", + "description": "Lists views known to the metadata database.", + "operationId": "findAll_3", + "parameters": [ + { + "name": "databaseId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "responses": { + "200": { + "description": "Find views successfully", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ViewBriefDto" + } + } + } + } + }, + "404": { + "description": "Database or user could not be found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + } + }, + "security": [ + { + "bearerAuth": [] + }, + { + "basicAuth": [] + } + ] + }, + "post": { + "tags": [ + "view-endpoint" + ], + "summary": "Create view", + "description": "Creates a view. This can only be performed by the database owner. Requires role `create-database-view`.", + "operationId": "create_6", + "parameters": [ + { + "name": "databaseId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateViewDto" + } + } + }, + "required": true + }, + "responses": { + "201": { + "description": "Create view successfully", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ViewBriefDto" + } + } + } + }, + "400": { + "description": "Create view query is malformed", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "403": { + "description": "Credentials missing", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "404": { + "description": "Failed to find database/user in metadata database.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "409": { + "description": "View exists with name", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "423": { + "description": "Create view resulted in an invalid query statement", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "502": { + "description": "Connection to search service failed", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "503": { + "description": "Failed to save in search service", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + } + }, + "security": [ + { + "bearerAuth": [] + }, + { + "basicAuth": [] + } + ] + } + }, + "/api/database/{databaseId}/table": { + "get": { + "tags": [ + "table-endpoint" + ], + "summary": "List tables", + "description": "Lists all tables known to the metadata database. When a database has a hidden schema (i.e. when `is_schema_public` is `false`), then the user needs to have at least read access and the role `list-tables`.", + "operationId": "list_3", + "parameters": [ + { + "name": "databaseId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "responses": { + "200": { + "description": "List tables", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/TableBriefDto" + } + } + } + } + }, + "403": { + "description": "List tables not permitted", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "404": { + "description": "Database could not be found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + } + }, + "security": [ + { + "bearerAuth": [] + }, + { + "basicAuth": [] + } + ] + }, + "post": { + "tags": [ + "table-endpoint" + ], + "summary": "Create table", + "description": "Creates a table in the database with id. Requires role `create-table`.", + "operationId": "create_7", + "parameters": [ + { + "name": "databaseId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateTableDto" + } + } + }, + "required": true + }, + "responses": { + "201": { + "description": "Created a new table", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TableBriefDto" + } + } + } + }, + "400": { + "description": "Create table query is malformed", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "403": { + "description": "Create table not permitted", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "404": { + "description": "Database, container or user could not be found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "409": { + "description": "Create table conflicts with existing table name", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "502": { + "description": "Connection to search service failed", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "503": { + "description": "Failed to save in search service", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + } + }, + "security": [ + { + "bearerAuth": [] + }, + { + "basicAuth": [] + } + ] + } + }, + "/api/container": { + "get": { + "tags": [ + "container-endpoint" + ], + "summary": "List containers", + "description": "List all containers in the metadata database.", + "operationId": "findAll_4", + "parameters": [ + { + "name": "limit", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "format": "int32" + } + } + ], + "responses": { + "200": { + "description": "List containers", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ContainerBriefDto" + } + } + } + } + } + } + }, + "post": { + "tags": [ + "container-endpoint" + ], + "summary": "Create container", + "description": "Creates a container in the metadata database. Requires role `create-container`.", + "operationId": "create_8", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CreateContainerDto" + } + } + }, + "required": true + }, + "responses": { + "201": { + "description": "Created a new container", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ContainerDto" + } + } + } + }, + "400": { + "description": "Container payload malformed", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "403": { + "description": "Create container not permitted, need authority `create-container`", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "404": { + "description": "Container image or user could not be found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "409": { + "description": "Container name already exists", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + } + }, + "security": [ + { + "bearerAuth": [] + }, + { + "basicAuth": [] + } + ] + } + }, + "/api/user": { + "get": { + "tags": [ + "user-endpoint" + ], + "summary": "List users", + "description": "Lists users known to the metadata database. Internal users are omitted from the result list. If the optional query parameter `username` is present, the result list can be filtered by matching this exact username.", + "operationId": "findAll_5", + "parameters": [ + { + "name": "username", + "in": "query", + "required": false, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "List users", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/UserBriefDto" + } + } + } + } + } + } + } + }, + "/api/unit": { + "get": { + "tags": [ + "unit-endpoint" + ], + "summary": "List units", + "description": "Lists units known to the metadata database.", + "operationId": "findAll_6", + "responses": { + "200": { + "description": "Find all semantic units", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/UnitDto" + } + } + } + } + } + } + } + }, + "/api/ontology/{ontologyId}/entity": { + "get": { + "tags": [ + "ontology-endpoint" + ], + "summary": "Find entities", + "description": "Finds semantic entities by label or uri in an ontology with id. Requires role `execute-semantic-query`.", + "operationId": "find_7", + "parameters": [ + { + "name": "ontologyId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "label", + "in": "query", + "required": false, + "schema": { + "type": "string" + } + }, + { + "name": "uri", + "in": "query", + "required": false, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Found entities", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/EntityDto" + } + } + } + } + }, + "400": { + "description": "Filter params are invalid", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "404": { + "description": "Could not find ontology", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "417": { + "description": "Generated query or uri is malformed", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "422": { + "description": "Ontology does not have rdf or sparql endpoint", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + } + }, + "security": [ + { + "bearerAuth": [] + }, + { + "basicAuth": [] + } + ] + } + }, + "/api/oai": { + "get": { + "tags": [ + "metadata-endpoint" + ], + "summary": "Get record", + "operationId": "identify", + "parameters": [ + { + "name": "verb", + "in": "query" + }, + { + "name": "parameters", + "in": "query", + "required": true, + "schema": { + "$ref": "#/components/schemas/OaiListIdentifiersParameters" + } + } + ], + "responses": { + "200": { + "description": "List containers", + "content": { + "text/xml": { + "schema": { + "type": "string" + } + } + } + } + } + } + }, + "/api/message/message/{messageId}": { + "get": { + "tags": [ + "message-endpoint" + ], + "summary": "Find message", + "description": "Finds a message with id in the metadata database.", + "operationId": "find_8", + "parameters": [ + { + "name": "messageId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "responses": { + "200": { + "description": "Get messages", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/BannerMessageDto" + } + } + } + }, + "404": { + "description": "Could not find message", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + } + } + } + }, + "/api/license": { + "get": { + "tags": [ + "license-endpoint" + ], + "summary": "List licenses", + "description": "Lists licenses known to the metadata database.", + "operationId": "list_4", + "responses": { + "200": { + "description": "List of licenses", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/LicenseDto" + } + } + } + } + } + } + } + }, + "/api/identifier/retrieve": { + "get": { + "tags": [ + "identifier-endpoint" + ], + "summary": "Retrieve PID metadata", + "description": "Retrieves Persistent Identifier (PID) metadata from external endpoints. Supported PIDs are: ORCID, ROR, DOI.", + "operationId": "retrieve", + "parameters": [ + { + "name": "url", + "in": "query", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Retrieved metadata from identifier", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/IdentifierDto" + } + } + } + }, + "404": { + "description": "Failed to find metadata for identifier", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + } + } + } + }, + "/api/database/{databaseId}": { + "get": { + "tags": [ + "database-endpoint" + ], + "summary": "Find database", + "description": "Finds a database with id.", + "operationId": "findById_2", + "parameters": [ + { + "name": "databaseId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "responses": { + "200": { + "description": "Database found successfully", + "headers": { + "X-Username": { + "description": "The authentication username", + "style": "simple", + "schema": { + "type": "string" + } + }, + "Access-Control-Expose-Headers": { + "description": "Expose custom headers", + "style": "simple", + "schema": { + "type": "string" + } + }, + "X-Password": { + "description": "The authentication password", + "style": "simple", + "schema": { + "type": "string" + } + } + }, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/DatabaseBriefDto" + } + } + } + }, + "403": { + "description": "Not allowed to view database", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "404": { + "description": "Database could not be found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + } + }, + "security": [ + { + "bearerAuth": [] + }, + { + "basicAuth": [] + } + ] + } + }, + "/api/database/{databaseId}/table/{tableId}/suggest": { + "get": { + "tags": [ + "table-endpoint" + ], + "summary": "Suggest semantics", + "description": "Suggests semantic concepts for a table. This action can only be performed by the table owner. Requires role `table-semantic-analyse`.", + "operationId": "analyseTable", + "parameters": [ + { + "name": "databaseId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "tableId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "responses": { + "200": { + "description": "Suggested table semantics successfully", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/EntityDto" + } + } + } + } + }, + "400": { + "description": "Failed to parse statistic in search service", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "403": { + "description": "Not the table owner.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "404": { + "description": "Failed to find database/table in metadata database", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "417": { + "description": "Generated query is malformed", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "422": { + "description": "Ontology does not have rdf or sparql endpoint", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + } + }, + "security": [ + { + "bearerAuth": [] + }, + { + "basicAuth": [] + } + ] + } + }, + "/api/database/{databaseId}/table/{tableId}/column/{columnId}/suggest": { + "get": { + "tags": [ + "table-endpoint" + ], + "summary": "Suggest semantics", + "description": "Suggests column semantics. Requires role `table-semantic-analyse`.", + "operationId": "analyseTableColumn", + "parameters": [ + { + "name": "databaseId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "tableId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + }, + { + "name": "columnId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "responses": { + "200": { + "description": "Suggested table column semantics successfully", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/TableColumnEntityDto" + } + } + } + } + }, + "400": { + "description": "Generated query is malformed", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "404": { + "description": "Failed to find database/table in metadata database", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "422": { + "description": "Ontology does not have rdf or sparql endpoint", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + } + }, + "security": [ + { + "bearerAuth": [] + }, + { + "basicAuth": [] + } + ] + } + }, + "/api/container/{containerId}": { + "get": { + "tags": [ + "container-endpoint" + ], + "summary": "Find container", + "description": "Finds a container in the metadata database.", + "operationId": "findById_3", + "parameters": [ + { + "name": "containerId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "responses": { + "200": { + "description": "Found container", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ContainerDto" + } + } + } + }, + "404": { + "description": "Container image could not be found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + } + } + }, + "delete": { + "tags": [ + "container-endpoint" + ], + "summary": "Delete container", + "description": "Deletes a container in the metadata database. Requires role `delete-container`.", + "operationId": "delete_6", + "parameters": [ + { + "name": "containerId", + "in": "path", + "required": true, + "schema": { + "type": "string", + "format": "uuid" + } + } + ], + "responses": { + "202": { + "description": "Deleted container" + }, + "403": { + "description": "Create container not permitted, need authority `delete-container`", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + }, + "404": { + "description": "Container not found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiErrorDto" + } + } + } + } + }, + "security": [ + { + "bearerAuth": [] + }, + { + "basicAuth": [] + } + ] + } + }, + "/api/concept": { + "get": { + "tags": [ + "concept-endpoint" + ], + "summary": "List concepts", + "description": "List all semantic concepts known to the metadata database", + "operationId": "findAll_7", + "responses": { + "200": { + "description": "List concepts", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ConceptDto" + } + } + } + } + } + } + } + } + }, + "components": { + "schemas": { + "UserAttributesDto": { + "type": "object", + "properties": { + "theme": { + "type": "string", + "example": "light" + }, + "orcid": { + "type": "string", + "example": "https://orcid.org/0000-0002-1825-0097" + }, + "affiliation": { + "type": "string", + "example": "Brown University" + }, + "language": { + "type": "string", + "example": "en" + } + }, + "required": [ + "language", + "theme" + ] + }, + "UserDto": { + "type": "object", + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "1ffc7b0e-9aeb-4e8b-b8f1-68f3936155b4" + }, + "name": { + "type": "string", + "example": "Josiah Carberry" + }, + "username": { + "type": "string", + "example": "username" + }, + "password": { + "type": "string", + "example": "p4ssw0rd" + }, + "attributes": { + "$ref": "#/components/schemas/UserAttributesDto" + }, + "last_retrieved": { + "type": "string", + "format": "date-time", + "example": "2025-01-23T12:09:01" + }, + "qualified_name": { + "type": "string", + "example": "Josiah Carberry — @jcarberry" + }, + "given_name": { + "type": "string", + "example": "Josiah" + }, + "family_name": { + "type": "string", + "example": "Carberry" + } + }, + "required": [ + "attributes", + "id", + "password", + "username" + ] + }, + "ApiErrorDto": { + "type": "object", + "properties": { + "status": { + "type": "string", + "enum": [ + "100 CONTINUE", + "101 SWITCHING_PROTOCOLS", + "102 PROCESSING", + "103 EARLY_HINTS", + "103 CHECKPOINT", + "200 OK", + "201 CREATED", + "202 ACCEPTED", + "203 NON_AUTHORITATIVE_INFORMATION", + "204 NO_CONTENT", + "205 RESET_CONTENT", + "206 PARTIAL_CONTENT", + "207 MULTI_STATUS", + "208 ALREADY_REPORTED", + "226 IM_USED", + "300 MULTIPLE_CHOICES", + "301 MOVED_PERMANENTLY", + "302 FOUND", + "302 MOVED_TEMPORARILY", + "303 SEE_OTHER", + "304 NOT_MODIFIED", + "305 USE_PROXY", + "307 TEMPORARY_REDIRECT", + "308 PERMANENT_REDIRECT", + "400 BAD_REQUEST", + "401 UNAUTHORIZED", + "402 PAYMENT_REQUIRED", + "403 FORBIDDEN", + "404 NOT_FOUND", + "405 METHOD_NOT_ALLOWED", + "406 NOT_ACCEPTABLE", + "407 PROXY_AUTHENTICATION_REQUIRED", + "408 REQUEST_TIMEOUT", + "409 CONFLICT", + "410 GONE", + "411 LENGTH_REQUIRED", + "412 PRECONDITION_FAILED", + "413 PAYLOAD_TOO_LARGE", + "413 REQUEST_ENTITY_TOO_LARGE", + "414 URI_TOO_LONG", + "414 REQUEST_URI_TOO_LONG", + "415 UNSUPPORTED_MEDIA_TYPE", + "416 REQUESTED_RANGE_NOT_SATISFIABLE", + "417 EXPECTATION_FAILED", + "418 I_AM_A_TEAPOT", + "419 INSUFFICIENT_SPACE_ON_RESOURCE", + "420 METHOD_FAILURE", + "421 DESTINATION_LOCKED", + "422 UNPROCESSABLE_ENTITY", + "423 LOCKED", + "424 FAILED_DEPENDENCY", + "425 TOO_EARLY", + "426 UPGRADE_REQUIRED", + "428 PRECONDITION_REQUIRED", + "429 TOO_MANY_REQUESTS", + "431 REQUEST_HEADER_FIELDS_TOO_LARGE", + "451 UNAVAILABLE_FOR_LEGAL_REASONS", + "500 INTERNAL_SERVER_ERROR", + "501 NOT_IMPLEMENTED", + "502 BAD_GATEWAY", + "503 SERVICE_UNAVAILABLE", + "504 GATEWAY_TIMEOUT", + "505 HTTP_VERSION_NOT_SUPPORTED", + "506 VARIANT_ALSO_NEGOTIATES", + "507 INSUFFICIENT_STORAGE", + "508 LOOP_DETECTED", + "509 BANDWIDTH_LIMIT_EXCEEDED", + "510 NOT_EXTENDED", + "511 NETWORK_AUTHENTICATION_REQUIRED" + ], + "example": "NOT_FOUND" + }, + "message": { + "type": "string", + "example": "Error message" + }, + "code": { + "type": "string", + "example": "error.service.code" + } + }, + "required": [ + "code", + "message", + "status" + ] + }, + "CreatorBriefDto": { + "type": "object", + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "e41f94a6-2b94-4a12-ac0e-678684e1c070" + }, + "affiliation": { + "type": "string", + "example": "Brown University" + }, + "creator_name": { + "type": "string", + "example": "Carberry, Josiah" + }, + "name_type": { + "type": "string", + "enum": [ + "Personal", + "Organizational" + ], + "example": "Personal" + }, + "name_identifier": { + "type": "string", + "example": "0000-0002-1825-0097" + }, + "name_identifier_scheme": { + "type": "string", + "enum": [ + "ORCID", + "ROR", + "ISNI", + "GRID" + ], + "example": "ORCID" + }, + "affiliation_identifier": { + "type": "string", + "example": "https://ror.org/05gq02987" + }, + "affiliation_identifier_scheme": { + "type": "string", + "enum": [ + "ROR", + "GRID", + "ISNI" + ], + "example": "ROR" + } + }, + "required": [ + "creator_name", + "id" + ] + }, + "DatabaseBriefDto": { + "type": "object", + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "fc29f89c-86a8-4020-9e36-4d954736c6cc" + }, + "name": { + "type": "string", + "example": "Air Quality" + }, + "description": { + "type": "string", + "example": "Air Quality" + }, + "identifiers": { + "type": "array", + "items": { + "$ref": "#/components/schemas/IdentifierBriefDto" + } + }, + "contact": { + "$ref": "#/components/schemas/UserBriefDto" + }, + "internal_name": { + "type": "string", + "example": "air_quality" + }, + "is_public": { + "type": "boolean", + "example": true + }, + "is_schema_public": { + "type": "boolean", + "example": true + }, + "owner_id": { + "type": "string", + "format": "uuid", + "example": "2f45ef7a-7f9b-4667-9156-152c87fe1ca5" + }, + "preview_image": { + "type": "string" + } + }, + "required": [ + "contact", + "id", + "identifiers", + "internal_name", + "is_public", + "is_schema_public", + "name", + "owner_id" + ] + }, + "IdentifierBriefDto": { + "type": "object", + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "b97cd56b-66ca-4354-9e6c-f47210cfaaec" + }, + "type": { + "type": "string", + "enum": [ + "database", + "subset", + "table", + "view" + ], + "example": "database" + }, + "creators": { + "type": "array", + "items": { + "$ref": "#/components/schemas/CreatorBriefDto" + } + }, + "titles": { + "type": "array", + "items": { + "$ref": "#/components/schemas/IdentifierTitleDto" + } + }, + "descriptions": { + "type": "array", + "items": { + "$ref": "#/components/schemas/IdentifierDescriptionDto" + } + }, + "doi": { + "type": "string", + "example": "10.1038/nphys1170" + }, + "publisher": { + "type": "string", + "example": "TU Wien" + }, + "status": { + "type": "string", + "enum": [ + "draft", + "published" + ], + "example": "draft" + }, + "database_id": { + "type": "string", + "format": "uuid", + "example": "fc29f89c-86a8-4020-9e36-4d954736c6cc" + }, + "query_id": { + "type": "string", + "format": "uuid", + "example": 1 + }, + "table_id": { + "type": "string", + "format": "uuid", + "example": 1 + }, + "view_id": { + "type": "string", + "format": "uuid", + "example": 1 + }, + "publication_year": { + "type": "integer", + "format": "int32", + "example": 2022 + }, + "owned_by": { + "type": "string", + "format": "uuid", + "example": "2f45ef7a-7f9b-4667-9156-152c87fe1ca5" + } + }, + "required": [ + "creators", + "database_id", + "descriptions", + "id", + "owned_by", + "publication_year", + "publisher", + "status", + "titles", + "type" + ] + }, + "IdentifierDescriptionDto": { + "type": "object", + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "e0e9692c-910b-4b60-b53a-fc7c358a917d" + }, + "description": { + "type": "string", + "example": "Air quality reports at Stephansplatz, Vienna" + }, + "language": { + "type": "string", + "enum": [ + "ab", + "aa", + "af", + "ak", + "sq", + "am", + "ar", + "an", + "hy", + "as", + "av", + "ae", + "ay", + "az", + "bm", + "ba", + "eu", + "be", + "bn", + "bh", + "bi", + "bs", + "br", + "bg", + "my", + "ca", + "km", + "ch", + "ce", + "ny", + "zh", + "cu", + "cv", + "kw", + "co", + "cr", + "hr", + "cs", + "da", + "dv", + "nl", + "dz", + "en", + "eo", + "et", + "ee", + "fo", + "fj", + "fi", + "fr", + "ff", + "gd", + "gl", + "lg", + "ka", + "de", + "ki", + "el", + "kl", + "gn", + "gu", + "ht", + "ha", + "he", + "hz", + "hi", + "ho", + "hu", + "is", + "io", + "ig", + "id", + "ia", + "ie", + "iu", + "ik", + "ga", + "it", + "ja", + "jv", + "kn", + "kr", + "ks", + "kk", + "rw", + "kv", + "kg", + "ko", + "kj", + "ku", + "ky", + "lo", + "la", + "lv", + "lb", + "li", + "ln", + "lt", + "lu", + "mk", + "mg", + "ms", + "ml", + "mt", + "gv", + "mi", + "mr", + "mh", + "ro", + "mn", + "na", + "nv", + "nd", + "ng", + "ne", + "se", + "no", + "nb", + "nn", + "ii", + "oc", + "oj", + "or", + "om", + "os", + "pi", + "pa", + "ps", + "fa", + "pl", + "pt", + "qu", + "rm", + "rn", + "ru", + "sm", + "sg", + "sa", + "sc", + "sr", + "sn", + "sd", + "si", + "sk", + "sl", + "so", + "st", + "nr", + "es", + "su", + "sw", + "ss", + "sv", + "tl", + "ty", + "tg", + "ta", + "tt", + "te", + "th", + "bo", + "ti", + "to", + "ts", + "tn", + "tr", + "tk", + "tw", + "ug", + "uk", + "ur", + "uz", + "ve", + "vi", + "vo", + "wa", + "cy", + "fy", + "wo", + "xh", + "yi", + "yo", + "za", + "zu" + ], + "example": "en" + }, + "type": { + "type": "string", + "enum": [ + "Abstract", + "Methods", + "SeriesInformation", + "TableOfContents", + "TechnicalInfo", + "Other" + ], + "example": "Abstract" + } + }, + "required": [ + "id" + ] + }, + "IdentifierTitleDto": { + "type": "object", + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "70ce5164-fd74-413f-8712-f996b91defbf" + }, + "title": { + "type": "string", + "example": "Airquality Demonstrator" + }, + "language": { + "type": "string", + "enum": [ + "ab", + "aa", + "af", + "ak", + "sq", + "am", + "ar", + "an", + "hy", + "as", + "av", + "ae", + "ay", + "az", + "bm", + "ba", + "eu", + "be", + "bn", + "bh", + "bi", + "bs", + "br", + "bg", + "my", + "ca", + "km", + "ch", + "ce", + "ny", + "zh", + "cu", + "cv", + "kw", + "co", + "cr", + "hr", + "cs", + "da", + "dv", + "nl", + "dz", + "en", + "eo", + "et", + "ee", + "fo", + "fj", + "fi", + "fr", + "ff", + "gd", + "gl", + "lg", + "ka", + "de", + "ki", + "el", + "kl", + "gn", + "gu", + "ht", + "ha", + "he", + "hz", + "hi", + "ho", + "hu", + "is", + "io", + "ig", + "id", + "ia", + "ie", + "iu", + "ik", + "ga", + "it", + "ja", + "jv", + "kn", + "kr", + "ks", + "kk", + "rw", + "kv", + "kg", + "ko", + "kj", + "ku", + "ky", + "lo", + "la", + "lv", + "lb", + "li", + "ln", + "lt", + "lu", + "mk", + "mg", + "ms", + "ml", + "mt", + "gv", + "mi", + "mr", + "mh", + "ro", + "mn", + "na", + "nv", + "nd", + "ng", + "ne", + "se", + "no", + "nb", + "nn", + "ii", + "oc", + "oj", + "or", + "om", + "os", + "pi", + "pa", + "ps", + "fa", + "pl", + "pt", + "qu", + "rm", + "rn", + "ru", + "sm", + "sg", + "sa", + "sc", + "sr", + "sn", + "sd", + "si", + "sk", + "sl", + "so", + "st", + "nr", + "es", + "su", + "sw", + "ss", + "sv", + "tl", + "ty", + "tg", + "ta", + "tt", + "te", + "th", + "bo", + "ti", + "to", + "ts", + "tn", + "tr", + "tk", + "tw", + "ug", + "uk", + "ur", + "uz", + "ve", + "vi", + "vo", + "wa", + "cy", + "fy", + "wo", + "xh", + "yi", + "yo", + "za", + "zu" + ], + "example": "en" + }, + "type": { + "type": "string", + "enum": [ + "AlternativeTitle", + "Subtitle", + "TranslatedTitle", + "Other" + ] + } + }, + "required": [ + "id" + ] + }, + "UserBriefDto": { + "type": "object", + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "1ffc7b0e-9aeb-4e8b-b8f1-68f3936155b4" + }, + "username": { + "type": "string", + "description": "Only contains lowercase characters", + "example": "jcarberry" + }, + "name": { + "type": "string", + "example": "Josiah Carberry" + }, + "orcid": { + "type": "string", + "example": "0000-0002-1825-0097" + }, + "qualified_name": { + "type": "string", + "example": "Josiah Carberry — @jcarberry" + }, + "given_name": { + "type": "string", + "example": "Josiah" + }, + "family_name": { + "type": "string", + "example": "Carberry" + } + }, + "required": [ + "id", + "username" + ] + }, + "DatabaseAccessDto": { + "type": "object", + "properties": { + "user": { + "$ref": "#/components/schemas/UserBriefDto" + }, + "type": { + "type": "string", + "enum": [ + "read", + "write_own", + "write_all" + ], + "example": "read" + } + }, + "required": [ + "type", + "user" + ] + }, + "UserUpdateDto": { + "type": "object", + "properties": { + "firstname": { + "type": "string", + "example": "Josiah" + }, + "lastname": { + "type": "string", + "example": "Carberry" + }, + "affiliation": { + "type": "string", + "example": "Brown University" + }, + "orcid": { + "type": "string", + "example": "0000-0002-1825-0097" + }, + "theme": { + "type": "string", + "example": "dark" + }, + "language": { + "type": "string", + "example": "en" + } + }, + "required": [ + "language", + "theme" + ] + }, + "OntologyModifyDto": { + "type": "object", + "properties": { + "uri": { + "type": "string", + "example": "Ontology URI" + }, + "prefix": { + "type": "string", + "example": "Ontology prefix" + }, + "sparql_endpoint": { + "type": "string", + "example": "Ontology SPARQL endpoint" + }, + "rdf_path": { + "type": "string", + "example": "rdf/om-2.0.rdf" + } + }, + "required": [ + "prefix", + "uri" + ] + }, + "OntologyDto": { + "type": "object", + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "7c491e40-082a-47b8-b82c-51d03c520466" + }, + "uri": { + "type": "string", + "example": "http://www.wikidata.org/" + }, + "prefix": { + "type": "string", + "example": "wd" + }, + "sparql": { + "type": "boolean", + "example": true + }, + "rdf": { + "type": "boolean", + "example": false + }, + "uri_pattern": { + "type": "string", + "example": "http://www.wikidata.org/entity/.*" + }, + "sparql_endpoint": { + "type": "string", + "example": "https://query.wikidata.org/sparql" + }, + "rdf_path": { + "type": "string", + "example": "rdf/om-2.0.rdf" + } + }, + "required": [ + "id", + "prefix", + "rdf", + "sparql", + "uri" + ] + }, + "BannerMessageUpdateDto": { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": [ + "error", + "warning", + "info" + ] + }, + "message": { + "type": "string", + "example": "Maintenance starts on 8am on Monday" + }, + "link": { + "type": "string", + "example": "https://example.com" + }, + "link_text": { + "type": "string", + "example": "More" + }, + "display_start": { + "type": "string", + "format": "date-time", + "example": "2021-03-12T15:26:21Z" + }, + "display_end": { + "type": "string", + "format": "date-time", + "example": "2021-03-12T15:26:21Z" + } + }, + "required": [ + "message", + "type" + ] + }, + "BannerMessageBriefDto": { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": [ + "error", + "warning", + "info" + ] + }, + "message": { + "type": "string", + "example": "Maintenance starts on 8am on Monday" + }, + "link": { + "type": "string", + "example": "https://example.com" + }, + "link_text": { + "type": "string", + "example": "More" + } + }, + "required": [ + "message", + "type" + ] + }, + "ImageChangeDto": { + "type": "object", + "properties": { + "registry": { + "type": "string", + "example": "docker.io/library" + }, + "defaultPort": { + "type": "integer", + "format": "int32", + "example": 5432, + "maximum": 65535, + "minimum": 1024 + }, + "dialect": { + "type": "string", + "example": "Postgres" + }, + "driver_class": { + "type": "string", + "example": "org.postgresql.Driver" + }, + "jdbc_method": { + "type": "string", + "example": "postgresql" + } + }, + "required": [ + "dialect", + "driver_class", + "jdbc_method", + "registry" + ] + }, + "DataTypeDto": { + "type": "object", + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "816f55d5-1098-4f60-a4af-c8121c04dcca" + }, + "value": { + "type": "string", + "example": "time" + }, + "documentation": { + "type": "string", + "example": "https://mariadb.com/kb/en/time/" + }, + "display_name": { + "type": "string", + "example": "TIME(fsp)" + }, + "size_min": { + "type": "integer", + "format": "int32", + "example": 0 + }, + "size_max": { + "type": "integer", + "format": "int32", + "example": 6 + }, + "size_default": { + "type": "integer", + "format": "int32", + "example": 0 + }, + "size_required": { + "type": "boolean", + "example": false + }, + "d_min": { + "type": "integer", + "format": "int32" + }, + "d_max": { + "type": "integer", + "format": "int32" + }, + "d_default": { + "type": "integer", + "format": "int32" + }, + "d_required": { + "type": "boolean" + }, + "data_hint": { + "type": "string", + "example": "e.g. HH:MM:SS, HH:MM, HHMMSS, H:M:S" + }, + "type_hint": { + "type": "string", + "example": "fsp=microsecond precision, min. 0, max. 6" + }, + "is_quoted": { + "type": "boolean", + "description": "frontend needs to quote this data type", + "example": false + }, + "is_buildable": { + "type": "boolean", + "description": "frontend can build this data type", + "example": true + } + }, + "required": [ + "display_name", + "documentation", + "id", + "is_buildable", + "is_quoted", + "value" + ] + }, + "ImageDto": { + "type": "object", + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "816f55d5-1098-4f60-a4af-c8121c04dcce" + }, + "name": { + "type": "string", + "example": "mariadb" + }, + "version": { + "type": "string", + "example": 10.5 + }, + "operators": { + "type": "array", + "items": { + "$ref": "#/components/schemas/OperatorDto" + } + }, + "default": { + "type": "boolean", + "example": false + }, + "data_types": { + "type": "array", + "items": { + "$ref": "#/components/schemas/DataTypeDto" + } + } + }, + "required": [ + "data_types", + "default", + "id", + "name", + "operators", + "version" + ] + }, + "OperatorDto": { + "type": "object", + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "816f55d5-1098-4f60-a4af-c8121c04dccf" + }, + "value": { + "type": "string", + "example": "XOR" + }, + "documentation": { + "type": "string", + "example": "https://mariadb.com/kb/en/xor/" + }, + "display_name": { + "type": "string", + "example": "XOR" + } + }, + "required": [ + "display_name", + "documentation", + "id", + "value" + ] + }, + "IdentifierSaveDto": { + "type": "object", + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "68e11675-1e0f-4d24-a6d9-887ad1c4445d" + }, + "type": { + "type": "string", + "enum": [ + "database", + "subset", + "table", + "view" + ], + "example": "database" + }, + "doi": { + "type": "string", + "example": "10.1111/11111111" + }, + "titles": { + "type": "array", + "items": { + "$ref": "#/components/schemas/SaveIdentifierTitleDto" + } + }, + "descriptions": { + "type": "array", + "items": { + "$ref": "#/components/schemas/SaveIdentifierDescriptionDto" + } + }, + "funders": { + "type": "array", + "items": { + "$ref": "#/components/schemas/SaveIdentifierFunderDto" + } + }, + "licenses": { + "type": "array", + "items": { + "$ref": "#/components/schemas/LicenseDto" + } + }, + "publisher": { + "type": "string", + "example": "TU Wien" + }, + "language": { + "type": "string", + "enum": [ + "ab", + "aa", + "af", + "ak", + "sq", + "am", + "ar", + "an", + "hy", + "as", + "av", + "ae", + "ay", + "az", + "bm", + "ba", + "eu", + "be", + "bn", + "bh", + "bi", + "bs", + "br", + "bg", + "my", + "ca", + "km", + "ch", + "ce", + "ny", + "zh", + "cu", + "cv", + "kw", + "co", + "cr", + "hr", + "cs", + "da", + "dv", + "nl", + "dz", + "en", + "eo", + "et", + "ee", + "fo", + "fj", + "fi", + "fr", + "ff", + "gd", + "gl", + "lg", + "ka", + "de", + "ki", + "el", + "kl", + "gn", + "gu", + "ht", + "ha", + "he", + "hz", + "hi", + "ho", + "hu", + "is", + "io", + "ig", + "id", + "ia", + "ie", + "iu", + "ik", + "ga", + "it", + "ja", + "jv", + "kn", + "kr", + "ks", + "kk", + "rw", + "kv", + "kg", + "ko", + "kj", + "ku", + "ky", + "lo", + "la", + "lv", + "lb", + "li", + "ln", + "lt", + "lu", + "mk", + "mg", + "ms", + "ml", + "mt", + "gv", + "mi", + "mr", + "mh", + "ro", + "mn", + "na", + "nv", + "nd", + "ng", + "ne", + "se", + "no", + "nb", + "nn", + "ii", + "oc", + "oj", + "or", + "om", + "os", + "pi", + "pa", + "ps", + "fa", + "pl", + "pt", + "qu", + "rm", + "rn", + "ru", + "sm", + "sg", + "sa", + "sc", + "sr", + "sn", + "sd", + "si", + "sk", + "sl", + "so", + "st", + "nr", + "es", + "su", + "sw", + "ss", + "sv", + "tl", + "ty", + "tg", + "ta", + "tt", + "te", + "th", + "bo", + "ti", + "to", + "ts", + "tn", + "tr", + "tk", + "tw", + "ug", + "uk", + "ur", + "uz", + "ve", + "vi", + "vo", + "wa", + "cy", + "fy", + "wo", + "xh", + "yi", + "yo", + "za", + "zu" + ] + }, + "creators": { + "type": "array", + "items": { + "$ref": "#/components/schemas/SaveIdentifierCreatorDto" + } + }, + "database_id": { + "type": "string", + "format": "uuid", + "example": null + }, + "query_id": { + "type": "string", + "format": "uuid", + "example": null + }, + "view_id": { + "type": "string", + "format": "uuid", + "example": null + }, + "table_id": { + "type": "string", + "format": "uuid", + "example": null + }, + "publication_day": { + "type": "integer", + "format": "int32", + "example": 15 + }, + "publication_month": { + "type": "integer", + "format": "int32", + "example": 12 + }, + "publication_year": { + "type": "integer", + "format": "int32", + "example": 2022 + }, + "related_identifiers": { + "type": "array", + "items": { + "$ref": "#/components/schemas/SaveRelatedIdentifierDto" + } + } + }, + "required": [ + "creators", + "database_id", + "id", + "publication_year", + "publisher", + "titles", + "type" + ] + }, + "LicenseDto": { + "type": "object", + "properties": { + "identifier": { + "type": "string", + "example": "MIT" + }, + "uri": { + "type": "string", + "example": "https://opensource.org/licenses/MIT" + }, + "description": { + "type": "string", + "example": "A short and simple permissive license with conditions only requiring preservation of copyright and license notices. Licensed works, modifications, and larger works may be distributed under different terms and without source code." + } + }, + "required": [ + "identifier", + "uri" + ] + }, + "SaveIdentifierCreatorDto": { + "type": "object", + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "da9dd034-00a8-4517-b93d-d1b2adfee418" + }, + "firstname": { + "type": "string", + "example": "Josiah" + }, + "lastname": { + "type": "string", + "example": "Carberry" + }, + "affiliation": { + "type": "string", + "example": "Wesleyan University" + }, + "creator_name": { + "type": "string", + "example": "Carberry, Josiah" + }, + "name_type": { + "type": "string", + "enum": [ + "Personal", + "Organizational" + ], + "example": "Personal" + }, + "name_identifier": { + "type": "string", + "example": "0000-0002-1825-0097" + }, + "name_identifier_scheme": { + "type": "string", + "enum": [ + "ORCID", + "ROR", + "ISNI", + "GRID" + ], + "example": "ORCID" + }, + "affiliation_identifier": { + "type": "string", + "example": "https://ror.org/04d836q62" + }, + "affiliation_identifier_scheme": { + "type": "string", + "enum": [ + "ROR", + "GRID", + "ISNI" + ], + "example": "ROR" + } + }, + "required": [ + "creator_name", + "id" + ] + }, + "SaveIdentifierDescriptionDto": { + "type": "object", + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "35bd84d8-b181-43c8-b786-4d024e4f843c" + }, + "description": { + "type": "string", + "example": "Air quality reports at Stephansplatz, Vienna" + }, + "language": { + "type": "string", + "enum": [ + "ab", + "aa", + "af", + "ak", + "sq", + "am", + "ar", + "an", + "hy", + "as", + "av", + "ae", + "ay", + "az", + "bm", + "ba", + "eu", + "be", + "bn", + "bh", + "bi", + "bs", + "br", + "bg", + "my", + "ca", + "km", + "ch", + "ce", + "ny", + "zh", + "cu", + "cv", + "kw", + "co", + "cr", + "hr", + "cs", + "da", + "dv", + "nl", + "dz", + "en", + "eo", + "et", + "ee", + "fo", + "fj", + "fi", + "fr", + "ff", + "gd", + "gl", + "lg", + "ka", + "de", + "ki", + "el", + "kl", + "gn", + "gu", + "ht", + "ha", + "he", + "hz", + "hi", + "ho", + "hu", + "is", + "io", + "ig", + "id", + "ia", + "ie", + "iu", + "ik", + "ga", + "it", + "ja", + "jv", + "kn", + "kr", + "ks", + "kk", + "rw", + "kv", + "kg", + "ko", + "kj", + "ku", + "ky", + "lo", + "la", + "lv", + "lb", + "li", + "ln", + "lt", + "lu", + "mk", + "mg", + "ms", + "ml", + "mt", + "gv", + "mi", + "mr", + "mh", + "ro", + "mn", + "na", + "nv", + "nd", + "ng", + "ne", + "se", + "no", + "nb", + "nn", + "ii", + "oc", + "oj", + "or", + "om", + "os", + "pi", + "pa", + "ps", + "fa", + "pl", + "pt", + "qu", + "rm", + "rn", + "ru", + "sm", + "sg", + "sa", + "sc", + "sr", + "sn", + "sd", + "si", + "sk", + "sl", + "so", + "st", + "nr", + "es", + "su", + "sw", + "ss", + "sv", + "tl", + "ty", + "tg", + "ta", + "tt", + "te", + "th", + "bo", + "ti", + "to", + "ts", + "tn", + "tr", + "tk", + "tw", + "ug", + "uk", + "ur", + "uz", + "ve", + "vi", + "vo", + "wa", + "cy", + "fy", + "wo", + "xh", + "yi", + "yo", + "za", + "zu" + ], + "example": "en" + }, + "type": { + "type": "string", + "enum": [ + "Abstract", + "Methods", + "SeriesInformation", + "TableOfContents", + "TechnicalInfo", + "Other" + ], + "example": "Abstract" + } + }, + "required": [ + "description", + "id" + ] + }, + "SaveIdentifierFunderDto": { + "type": "object", + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "1c6b9212-a315-44b9-946c-3682a7a0e517" + }, + "funder_name": { + "type": "string", + "example": "European Commission" + }, + "funder_identifier": { + "type": "string", + "example": "http://doi.org/10.13039/501100000780" + }, + "funder_identifier_type": { + "type": "string", + "enum": [ + "Crossref Funder ID", + "ROR", + "GND", + "ISNI", + "Other" + ], + "example": "Crossref Funder ID" + }, + "scheme_uri": { + "type": "string", + "example": "http://doi.org/" + }, + "award_number": { + "type": "string", + "example": 824087 + }, + "award_title": { + "type": "string", + "example": "EOSC-Life" + } + }, + "required": [ + "funder_name", + "id" + ] + }, + "SaveIdentifierTitleDto": { + "type": "object", + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "2af9f40e-eaf5-4ea1-861a-1a696587bf29" + }, + "title": { + "type": "string", + "example": "Airquality Demonstrator" + }, + "language": { + "type": "string", + "enum": [ + "ab", + "aa", + "af", + "ak", + "sq", + "am", + "ar", + "an", + "hy", + "as", + "av", + "ae", + "ay", + "az", + "bm", + "ba", + "eu", + "be", + "bn", + "bh", + "bi", + "bs", + "br", + "bg", + "my", + "ca", + "km", + "ch", + "ce", + "ny", + "zh", + "cu", + "cv", + "kw", + "co", + "cr", + "hr", + "cs", + "da", + "dv", + "nl", + "dz", + "en", + "eo", + "et", + "ee", + "fo", + "fj", + "fi", + "fr", + "ff", + "gd", + "gl", + "lg", + "ka", + "de", + "ki", + "el", + "kl", + "gn", + "gu", + "ht", + "ha", + "he", + "hz", + "hi", + "ho", + "hu", + "is", + "io", + "ig", + "id", + "ia", + "ie", + "iu", + "ik", + "ga", + "it", + "ja", + "jv", + "kn", + "kr", + "ks", + "kk", + "rw", + "kv", + "kg", + "ko", + "kj", + "ku", + "ky", + "lo", + "la", + "lv", + "lb", + "li", + "ln", + "lt", + "lu", + "mk", + "mg", + "ms", + "ml", + "mt", + "gv", + "mi", + "mr", + "mh", + "ro", + "mn", + "na", + "nv", + "nd", + "ng", + "ne", + "se", + "no", + "nb", + "nn", + "ii", + "oc", + "oj", + "or", + "om", + "os", + "pi", + "pa", + "ps", + "fa", + "pl", + "pt", + "qu", + "rm", + "rn", + "ru", + "sm", + "sg", + "sa", + "sc", + "sr", + "sn", + "sd", + "si", + "sk", + "sl", + "so", + "st", + "nr", + "es", + "su", + "sw", + "ss", + "sv", + "tl", + "ty", + "tg", + "ta", + "tt", + "te", + "th", + "bo", + "ti", + "to", + "ts", + "tn", + "tr", + "tk", + "tw", + "ug", + "uk", + "ur", + "uz", + "ve", + "vi", + "vo", + "wa", + "cy", + "fy", + "wo", + "xh", + "yi", + "yo", + "za", + "zu" + ], + "example": "en" + }, + "type": { + "type": "string", + "enum": [ + "AlternativeTitle", + "Subtitle", + "TranslatedTitle", + "Other" + ], + "example": "Subtitle" + } + }, + "required": [ + "id", + "title" + ] + }, + "SaveRelatedIdentifierDto": { + "type": "object", + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "5bb272c7-7421-4f74-83ac-0486812d0f44" + }, + "value": { + "type": "string", + "example": "10.70124/dc4zh-9ce78" + }, + "type": { + "type": "string", + "enum": [ + "DOI", + "URL", + "URN", + "ARK", + "arXiv", + "bibcode", + "EAN13", + "EISSN", + "Handle", + "IGSN", + "ISBN", + "ISTC", + "LISSN", + "LSID", + "PMID", + "PURL", + "UPC", + "w3id" + ], + "example": "DOI" + }, + "relation": { + "type": "string", + "enum": [ + "IsCitedBy", + "Cites", + "IsSupplementTo", + "IsSupplementedBy", + "IsContinuedBy", + "Continues", + "IsDescribedBy", + "Describes", + "HasMetadata", + "IsMetadataFor", + "HasVersion", + "IsVersionOf", + "IsNewVersionOf", + "IsPreviousVersionOf", + "IsPartOf", + "HasPart", + "IsPublishedIn", + "IsReferencedBy", + "References", + "IsDocumentedBy", + "Documents", + "IsCompiledBy", + "Compiles", + "IsVariantFormOf", + "IsOriginalFormOf", + "IsIdenticalTo", + "IsReviewedBy", + "Reviews", + "IsDerivedFrom", + "IsSourceOf", + "IsRequiredBy", + "Requires", + "IsObsoletedBy", + "Obsoletes" + ], + "example": "Cites" + } + }, + "required": [ + "id", + "relation", + "type", + "value" + ] + }, + "CreatorDto": { + "type": "object", + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "e41f94a6-2b94-4a12-ac0e-678684e1c070" + }, + "firstname": { + "type": "string", + "example": "Josiah" + }, + "lastname": { + "type": "string", + "example": "Carberry" + }, + "affiliation": { + "type": "string", + "example": "Brown University" + }, + "creator_name": { + "type": "string", + "example": "Carberry, Josiah" + }, + "name_type": { + "type": "string", + "enum": [ + "Personal", + "Organizational" + ], + "example": "Personal" + }, + "name_identifier": { + "type": "string", + "example": "0000-0002-1825-0097" + }, + "name_identifier_scheme": { + "type": "string", + "enum": [ + "ORCID", + "ROR", + "ISNI", + "GRID" + ], + "example": "ORCID" + }, + "name_identifier_scheme_uri": { + "type": "string", + "example": "https://orcid.org/" + }, + "affiliation_identifier": { + "type": "string", + "example": "https://ror.org/05gq02987" + }, + "affiliation_identifier_scheme": { + "type": "string", + "enum": [ + "ROR", + "GRID", + "ISNI" + ], + "example": "ROR" + }, + "affiliation_identifier_scheme_uri": { + "type": "string", + "example": "https://ror.org/" + } + }, + "required": [ + "creator_name", + "id" + ] + }, + "IdentifierDto": { + "type": "object", + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "b97cd56b-66ca-4354-9e6c-f47210cfaaec" + }, + "links": { + "$ref": "#/components/schemas/LinksDto" + }, + "type": { + "type": "string", + "enum": [ + "database", + "subset", + "table", + "view" + ], + "example": "database" + }, + "titles": { + "type": "array", + "items": { + "$ref": "#/components/schemas/IdentifierTitleDto" + } + }, + "descriptions": { + "type": "array", + "items": { + "$ref": "#/components/schemas/IdentifierDescriptionDto" + } + }, + "funders": { + "type": "array", + "items": { + "$ref": "#/components/schemas/IdentifierFunderDto" + } + }, + "query": { + "type": "string", + "example": "SELECT `id`, `value`, `location` FROM `air_quality` WHERE `location` = \"09:STEF\"" + }, + "execution": { + "type": "string", + "format": "date-time", + "example": "2021-03-12T15:26:21Z" + }, + "doi": { + "type": "string", + "example": "10.1038/nphys1170" + }, + "publisher": { + "type": "string", + "example": "TU Wien" + }, + "owner": { + "$ref": "#/components/schemas/UserBriefDto" + }, + "language": { + "type": "string", + "enum": [ + "ab", + "aa", + "af", + "ak", + "sq", + "am", + "ar", + "an", + "hy", + "as", + "av", + "ae", + "ay", + "az", + "bm", + "ba", + "eu", + "be", + "bn", + "bh", + "bi", + "bs", + "br", + "bg", + "my", + "ca", + "km", + "ch", + "ce", + "ny", + "zh", + "cu", + "cv", + "kw", + "co", + "cr", + "hr", + "cs", + "da", + "dv", + "nl", + "dz", + "en", + "eo", + "et", + "ee", + "fo", + "fj", + "fi", + "fr", + "ff", + "gd", + "gl", + "lg", + "ka", + "de", + "ki", + "el", + "kl", + "gn", + "gu", + "ht", + "ha", + "he", + "hz", + "hi", + "ho", + "hu", + "is", + "io", + "ig", + "id", + "ia", + "ie", + "iu", + "ik", + "ga", + "it", + "ja", + "jv", + "kn", + "kr", + "ks", + "kk", + "rw", + "kv", + "kg", + "ko", + "kj", + "ku", + "ky", + "lo", + "la", + "lv", + "lb", + "li", + "ln", + "lt", + "lu", + "mk", + "mg", + "ms", + "ml", + "mt", + "gv", + "mi", + "mr", + "mh", + "ro", + "mn", + "na", + "nv", + "nd", + "ng", + "ne", + "se", + "no", + "nb", + "nn", + "ii", + "oc", + "oj", + "or", + "om", + "os", + "pi", + "pa", + "ps", + "fa", + "pl", + "pt", + "qu", + "rm", + "rn", + "ru", + "sm", + "sg", + "sa", + "sc", + "sr", + "sn", + "sd", + "si", + "sk", + "sl", + "so", + "st", + "nr", + "es", + "su", + "sw", + "ss", + "sv", + "tl", + "ty", + "tg", + "ta", + "tt", + "te", + "th", + "bo", + "ti", + "to", + "ts", + "tn", + "tr", + "tk", + "tw", + "ug", + "uk", + "ur", + "uz", + "ve", + "vi", + "vo", + "wa", + "cy", + "fy", + "wo", + "xh", + "yi", + "yo", + "za", + "zu" + ] + }, + "licenses": { + "type": "array", + "items": { + "$ref": "#/components/schemas/LicenseDto" + } + }, + "creators": { + "type": "array", + "items": { + "$ref": "#/components/schemas/CreatorDto" + } + }, + "status": { + "type": "string", + "enum": [ + "draft", + "published" + ], + "example": "draft" + }, + "database_id": { + "type": "string", + "format": "uuid", + "example": null + }, + "query_id": { + "type": "string", + "format": "uuid", + "example": null + }, + "table_id": { + "type": "string", + "format": "uuid", + "example": null + }, + "view_id": { + "type": "string", + "format": "uuid", + "example": null + }, + "query_normalized": { + "type": "string", + "example": "SELECT `id`, `value`, `location` FROM `air_quality` WHERE `location` = \"09:STEF\"" + }, + "related_identifiers": { + "type": "array", + "items": { + "$ref": "#/components/schemas/RelatedIdentifierDto" + } + }, + "query_hash": { + "type": "string", + "description": "query hash in sha512" + }, + "result_hash": { + "type": "string", + "example": "34fe82cda2c53f13f8d90cfd7a3469e3a939ff311add50dce30d9136397bf8e5" + }, + "result_number": { + "type": "integer", + "format": "int64", + "example": 1 + }, + "publication_day": { + "type": "integer", + "format": "int32", + "example": 15 + }, + "publication_month": { + "type": "integer", + "format": "int32", + "example": 12 + }, + "publication_year": { + "type": "integer", + "format": "int32", + "example": 2022 + } + }, + "required": [ + "creators", + "database_id", + "descriptions", + "funders", + "id", + "language", + "licenses", + "links", + "owner", + "publication_year", + "publisher", + "query", + "query_hash", + "query_normalized", + "status", + "titles", + "type" + ] + }, + "IdentifierFunderDto": { + "type": "object", + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "39693413-e0ce-46da-ad5e-029c0556d439" + }, + "funder_name": { + "type": "string", + "example": "European Commission" + }, + "funder_identifier": { + "type": "string", + "example": "http://doi.org/10.13039/501100000780" + }, + "funder_identifier_type": { + "type": "string", + "enum": [ + "Crossref Funder ID", + "ROR", + "GND", + "ISNI", + "Other" + ], + "example": "Crossref Funder ID" + }, + "scheme_uri": { + "type": "string", + "example": "http://doi.org/" + }, + "award_number": { + "type": "string", + "example": 824087 + }, + "award_title": { + "type": "string", + "example": "EOSC-Life" + } + }, + "required": [ + "funder_name", + "id" + ] + }, + "LinksDto": { + "type": "object", + "properties": { + "self": { + "type": "string", + "example": "http://example.com/api/" + }, + "data": { + "type": "string", + "example": "http://example.com" + }, + "self_html": { + "type": "string", + "example": "http://example.com" + }, + "dashboard_html": { + "type": "string", + "example": "http://example.com/d/defi2baxqawaod" + } + }, + "required": [ + "self", + "self_html" + ] + }, + "RelatedIdentifierDto": { + "type": "object", + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "ce9d11f0-60a2-448d-a3e4-44719a443e8a" + }, + "value": { + "type": "string", + "example": "10.70124/dc4zh-9ce78" + }, + "type": { + "type": "string", + "enum": [ + "DOI", + "URL", + "URN", + "ARK", + "arXiv", + "bibcode", + "EAN13", + "EISSN", + "Handle", + "IGSN", + "ISBN", + "ISTC", + "LISSN", + "LSID", + "PMID", + "PURL", + "UPC", + "w3id" + ], + "example": "DOI" + }, + "relation": { + "type": "string", + "enum": [ + "IsCitedBy", + "Cites", + "IsSupplementTo", + "IsSupplementedBy", + "IsContinuedBy", + "Continues", + "IsDescribedBy", + "Describes", + "HasMetadata", + "IsMetadataFor", + "HasVersion", + "IsVersionOf", + "IsNewVersionOf", + "IsPreviousVersionOf", + "IsPartOf", + "HasPart", + "IsPublishedIn", + "IsReferencedBy", + "References", + "IsDocumentedBy", + "Documents", + "IsCompiledBy", + "Compiles", + "IsVariantFormOf", + "IsOriginalFormOf", + "IsIdenticalTo", + "IsReviewedBy", + "Reviews", + "IsDerivedFrom", + "IsSourceOf", + "IsRequiredBy", + "Requires", + "IsObsoletedBy", + "Obsoletes" + ], + "example": "Cites" + } + }, + "required": [ + "id", + "relation", + "type", + "value" + ] + }, + "DatabaseModifyVisibilityDto": { + "type": "object", + "properties": { + "is_public": { + "type": "boolean", + "example": true + }, + "is_schema_public": { + "type": "boolean", + "example": true + }, + "is_dashboard_enabled": { + "type": "boolean", + "example": true + } + }, + "required": [ + "is_dashboard_enabled", + "is_public", + "is_schema_public" + ] + }, + "ViewUpdateDto": { + "type": "object", + "properties": { + "is_public": { + "type": "boolean", + "example": true + }, + "is_schema_public": { + "type": "boolean", + "example": true + } + }, + "required": [ + "is_public", + "is_schema_public" + ] + }, + "ViewBriefDto": { + "type": "object", + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "787439d0-e85e-400c-a7e6-996a023bfad9" + }, + "name": { + "type": "string", + "example": "Air Quality" + }, + "query": { + "type": "string", + "example": "SELECT `id` FROM `air_quality` ORDER BY `value` DESC" + }, + "database_id": { + "type": "string", + "format": "uuid", + "example": "2b5b2b03-fdd0-40d6-afe0-e5d02fd839e4" + }, + "internal_name": { + "type": "string", + "example": "air_quality" + }, + "is_public": { + "type": "boolean", + "example": true + }, + "is_schema_public": { + "type": "boolean", + "example": true + }, + "initial_view": { + "type": "boolean", + "description": "True if it is the default view for the database", + "example": true + }, + "query_hash": { + "type": "string", + "example": "7de03e818900b6ea6d58ad0306d4a741d658c6df3d1964e89ed2395d8c7e7916" + }, + "owned_by": { + "type": "string", + "format": "uuid", + "example": "ac750fcf-ea02-4fce-85ac-d73857e18b35" + } + }, + "required": [ + "database_id", + "id", + "internal_name", + "name", + "query", + "query_hash" + ] + }, + "TableUpdateDto": { + "type": "object", + "properties": { + "description": { + "type": "string", + "example": "Air Quality in Austria", + "maxLength": 180, + "minLength": 0 + }, + "is_public": { + "type": "boolean", + "example": true + }, + "is_schema_public": { + "type": "boolean", + "example": true + } + }, + "required": [ + "is_public", + "is_schema_public" + ] + }, + "TableBriefDto": { + "type": "object", + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "41ed10e0-687b-4e18-8521-810f5cffbce1" + }, + "name": { + "type": "string", + "example": "Air Quality" + }, + "description": { + "type": "string", + "example": "Air Quality in Austria" + }, + "database_id": { + "type": "string", + "format": "uuid", + "example": "a8fec026-dfaf-4b1d-8f6c-f01720d91705" + }, + "internal_name": { + "type": "string", + "example": "air_quality" + }, + "is_versioned": { + "type": "boolean", + "example": true + }, + "is_public": { + "type": "boolean", + "example": true + }, + "is_schema_public": { + "type": "boolean", + "example": true + }, + "owned_by": { + "type": "string", + "format": "uuid", + "example": "78337b80-5699-45db-8111-cec86439ab6b" + } + }, + "required": [ + "database_id", + "id", + "internal_name", + "is_public", + "is_schema_public", + "is_versioned", + "name", + "owned_by" + ] + }, + "ColumnSemanticsUpdateDto": { + "type": "object", + "properties": { + "concept_uri": { + "type": "string" + }, + "unit_uri": { + "type": "string" + } + } + }, + "ColumnDto": { + "type": "object", + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "a453e444-e00d-41ca-902c-11e9c54b39f1" + }, + "name": { + "type": "string", + "example": "Given Name", + "maxLength": 64, + "minLength": 0 + }, + "alias": { + "type": "string", + "example": "firstname" + }, + "size": { + "type": "integer", + "format": "int64", + "example": 255 + }, + "d": { + "type": "integer", + "format": "int64", + "example": 0 + }, + "mean": { + "type": "number", + "example": 45.4 + }, + "median": { + "type": "number", + "example": 51 + }, + "concept": { + "$ref": "#/components/schemas/ConceptBriefDto" + }, + "unit": { + "$ref": "#/components/schemas/UnitBriefDto" + }, + "description": { + "type": "string", + "example": "Column comment", + "maxLength": 2048, + "minLength": 0 + }, + "enums": { + "type": "array", + "description": "enum values, only considered when type = ENUM", + "items": { + "$ref": "#/components/schemas/EnumDto" + } + }, + "sets": { + "type": "array", + "description": "enum values, only considered when type = ENUM", + "items": { + "$ref": "#/components/schemas/SetDto" + } + }, + "database_id": { + "type": "string", + "format": "uuid", + "example": "911f9052-c58c-4e1c-b3f2-66af2107be16" + }, + "table_id": { + "type": "string", + "format": "uuid", + "example": "bfffa915-a547-4466-9c65-ddc0d38fdb08" + }, + "ord": { + "type": "integer", + "format": "int32", + "example": 0 + }, + "internal_name": { + "type": "string", + "example": "given_name", + "maxLength": 64, + "minLength": 0 + }, + "index_length": { + "type": "integer", + "format": "int64", + "example": 255 + }, + "length": { + "type": "integer", + "format": "int64", + "example": 255 + }, + "type": { + "type": "string", + "enum": [ + "char", + "varchar", + "binary", + "varbinary", + "tinyblob", + "tinytext", + "text", + "blob", + "mediumtext", + "mediumblob", + "longtext", + "longblob", + "enum", + "set", + "serial", + "bit", + "tinyint", + "bool", + "smallint", + "mediumint", + "int", + "bigint", + "float", + "double", + "decimal", + "date", + "datetime", + "timestamp", + "time", + "year" + ], + "example": "varchar" + }, + "data_length": { + "type": "integer", + "format": "int64", + "example": 34300 + }, + "max_data_length": { + "type": "integer", + "format": "int64", + "example": 34300 + }, + "num_rows": { + "type": "integer", + "format": "int64", + "example": 32 + }, + "val_min": { + "type": "number", + "example": 0 + }, + "val_max": { + "type": "number", + "example": 100 + }, + "std_dev": { + "type": "number", + "example": 5.32 + }, + "is_null_allowed": { + "type": "boolean", + "example": false + } + }, + "required": [ + "database_id", + "id", + "internal_name", + "is_null_allowed", + "name", + "ord", + "table_id", + "type" + ] + }, + "ConceptBriefDto": { + "type": "object", + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "8cabc011-4bdf-44d4-9d33-b2648e2ddbf1" + }, + "uri": { + "type": "string", + "example": "http://www.wikidata.org/entity/Q202444" + }, + "name": { + "type": "string", + "example": "given name" + }, + "description": { + "type": "string", + "example": "name typically used to differentiate people from the same family, clan, or other social group who have a common last name" + } + }, + "required": [ + "id", + "uri" + ] + }, + "EnumDto": { + "type": "object", + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "5343bb3d-14d3-4eb7-a86f-b8fc553cb315" + }, + "value": { + "type": "string", + "example": 3 + } + }, + "required": [ + "id", + "value" + ] + }, + "SetDto": { + "type": "object", + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "7eb4eded-bacc-4a91-84db-a9ae6ddafda7" + }, + "value": { + "type": "string", + "example": 3 + } + }, + "required": [ + "id", + "value" + ] + }, + "UnitBriefDto": { + "type": "object", + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "ba1935e8-6817-488f-af0a-f54389af9000" + }, + "uri": { + "type": "string", + "example": "http://www.wikidata.org/entity/Q1422583" + }, + "name": { + "type": "string", + "example": "importance" + }, + "description": { + "type": "string", + "example": "subjective magnitude of value, meaning, or purpose" + } + }, + "required": [ + "id", + "uri" + ] + }, + "DatabaseTransferDto": { + "type": "object", + "properties": { + "id": { + "type": "string", + "format": "uuid" + } + }, + "required": [ + "id" + ] + }, + "DatabaseModifyImageDto": { + "type": "object", + "properties": { + "key": { + "type": "string" + } + } + }, + "DatabaseModifyDashboardDto": { + "type": "object", + "properties": { + "uid": { + "type": "string" + } + }, + "required": [ + "uid" + ] + }, + "CreateAccessDto": { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": [ + "read", + "write_own", + "write_all" + ], + "example": "read" + } + }, + "required": [ + "type" + ] + }, + "OntologyCreateDto": { + "type": "object", + "properties": { + "uri": { + "type": "string", + "example": "Ontology URI" + }, + "prefix": { + "type": "string", + "example": "Ontology prefix" + }, + "sparql_endpoint": { + "type": "string", + "example": "Ontology SPARQL endpoint" + } + }, + "required": [ + "prefix", + "uri" + ] + }, + "BannerMessageCreateDto": { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": [ + "error", + "warning", + "info" + ] + }, + "message": { + "type": "string", + "example": "Maintenance starts on 8am on Monday" + }, + "link": { + "type": "string", + "example": "https://example.com" + }, + "link_text": { + "type": "string", + "example": "More" + }, + "display_start": { + "type": "string", + "format": "date-time", + "example": "2021-03-12T15:26:21Z" + }, + "display_end": { + "type": "string", + "format": "date-time", + "example": "2021-03-12T15:26:21Z" + } + }, + "required": [ + "message", + "type" + ] + }, + "ImageCreateDto": { + "type": "object", + "properties": { + "registry": { + "type": "string", + "example": "docker.io/library" + }, + "name": { + "type": "string", + "example": "mariadb" + }, + "version": { + "type": "string" + }, + "dialect": { + "type": "string" + }, + "is_default": { + "type": "boolean", + "example": false + }, + "driver_class": { + "type": "string" + }, + "jdbc_method": { + "type": "string" + }, + "default_port": { + "type": "integer", + "format": "int32", + "maximum": 65535, + "minimum": 1024 + } + }, + "required": [ + "default_port", + "dialect", + "driver_class", + "is_default", + "jdbc_method", + "name", + "registry", + "version" + ] + }, + "CreateIdentifierDto": { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": [ + "database", + "subset", + "table", + "view" + ], + "example": "database" + }, + "doi": { + "type": "string", + "example": "10.1111/11111111" + }, + "titles": { + "type": "array", + "items": { + "$ref": "#/components/schemas/SaveIdentifierTitleDto" + } + }, + "descriptions": { + "type": "array", + "items": { + "$ref": "#/components/schemas/SaveIdentifierDescriptionDto" + } + }, + "funders": { + "type": "array", + "items": { + "$ref": "#/components/schemas/SaveIdentifierFunderDto" + } + }, + "licenses": { + "type": "array", + "items": { + "$ref": "#/components/schemas/LicenseDto" + } + }, + "publisher": { + "type": "string", + "example": "TU Wien" + }, + "language": { + "type": "string", + "enum": [ + "ab", + "aa", + "af", + "ak", + "sq", + "am", + "ar", + "an", + "hy", + "as", + "av", + "ae", + "ay", + "az", + "bm", + "ba", + "eu", + "be", + "bn", + "bh", + "bi", + "bs", + "br", + "bg", + "my", + "ca", + "km", + "ch", + "ce", + "ny", + "zh", + "cu", + "cv", + "kw", + "co", + "cr", + "hr", + "cs", + "da", + "dv", + "nl", + "dz", + "en", + "eo", + "et", + "ee", + "fo", + "fj", + "fi", + "fr", + "ff", + "gd", + "gl", + "lg", + "ka", + "de", + "ki", + "el", + "kl", + "gn", + "gu", + "ht", + "ha", + "he", + "hz", + "hi", + "ho", + "hu", + "is", + "io", + "ig", + "id", + "ia", + "ie", + "iu", + "ik", + "ga", + "it", + "ja", + "jv", + "kn", + "kr", + "ks", + "kk", + "rw", + "kv", + "kg", + "ko", + "kj", + "ku", + "ky", + "lo", + "la", + "lv", + "lb", + "li", + "ln", + "lt", + "lu", + "mk", + "mg", + "ms", + "ml", + "mt", + "gv", + "mi", + "mr", + "mh", + "ro", + "mn", + "na", + "nv", + "nd", + "ng", + "ne", + "se", + "no", + "nb", + "nn", + "ii", + "oc", + "oj", + "or", + "om", + "os", + "pi", + "pa", + "ps", + "fa", + "pl", + "pt", + "qu", + "rm", + "rn", + "ru", + "sm", + "sg", + "sa", + "sc", + "sr", + "sn", + "sd", + "si", + "sk", + "sl", + "so", + "st", + "nr", + "es", + "su", + "sw", + "ss", + "sv", + "tl", + "ty", + "tg", + "ta", + "tt", + "te", + "th", + "bo", + "ti", + "to", + "ts", + "tn", + "tr", + "tk", + "tw", + "ug", + "uk", + "ur", + "uz", + "ve", + "vi", + "vo", + "wa", + "cy", + "fy", + "wo", + "xh", + "yi", + "yo", + "za", + "zu" + ] + }, + "creators": { + "type": "array", + "items": { + "$ref": "#/components/schemas/SaveIdentifierCreatorDto" + } + }, + "database_id": { + "type": "string", + "format": "uuid", + "example": "d002e8d5-8db4-4ff7-ab3a-bc3f52d9ec44" + }, + "query_id": { + "type": "string", + "format": "uuid", + "example": null + }, + "view_id": { + "type": "string", + "format": "uuid", + "example": null + }, + "table_id": { + "type": "string", + "format": "uuid", + "example": null + }, + "publication_day": { + "type": "integer", + "format": "int32", + "example": 15 + }, + "publication_month": { + "type": "integer", + "format": "int32", + "example": 12 + }, + "publication_year": { + "type": "integer", + "format": "int32", + "example": 2022 + }, + "related_identifiers": { + "type": "array", + "items": { + "$ref": "#/components/schemas/SaveRelatedIdentifierDto" + } + } + }, + "required": [ + "creators", + "database_id", + "publication_year", + "publisher", + "titles", + "type" + ] + }, + "CreateDatabaseDto": { + "type": "object", + "properties": { + "name": { + "type": "string", + "example": "Air Quality" + }, + "container_id": { + "type": "string", + "format": "uuid", + "example": "0888e108-d521-46e2-9d3e-82099185305b" + }, + "is_public": { + "type": "boolean", + "example": true + }, + "is_schema_public": { + "type": "boolean", + "example": true + } + }, + "required": [ + "container_id", + "is_public", + "is_schema_public", + "name" + ] + }, + "CreateViewDto": { + "type": "object", + "properties": { + "name": { + "type": "string", + "example": "Air Quality", + "maxLength": 63, + "minLength": 1 + }, + "query": { + "$ref": "#/components/schemas/SubsetDto" + }, + "is_public": { + "type": "boolean", + "example": true + }, + "is_schema_public": { + "type": "boolean", + "example": true + } + }, + "required": [ + "is_public", + "is_schema_public", + "name", + "query" + ] + }, + "FilterDto": { + "type": "object", + "properties": { + "type": { + "type": "string", + "enum": [ + "where", + "or", + "and" + ], + "example": "where" + }, + "value": { + "type": "string", + "example": 1 + }, + "column_id": { + "type": "string", + "format": "uuid", + "example": "14128033-54b5-4818-a489-21b0dded86e2" + }, + "operator_id": { + "type": "string", + "format": "uuid", + "example": "67c5b54d-2eb0-4f42-8dc1-a504562e9f32" + } + }, + "required": [ + "column_id", + "operator_id", + "type" + ] + }, + "OrderDto": { + "type": "object", + "properties": { + "direction": { + "type": "string", + "enum": [ + "asc", + "desc" + ], + "example": "asc" + }, + "column_id": { + "type": "string", + "format": "uuid", + "example": "e891ba86-0258-41a6-a8d9-ff58bc10b618" + } + }, + "required": [ + "column_id" + ] + }, + "SubsetDto": { + "type": "object", + "properties": { + "columns": { + "type": "array", + "example": [ + "e891ba86-0258-41a6-a8d9-ff58bc10b618" + ], + "items": { + "type": "string", + "format": "uuid" + } + }, + "filter": { + "type": "array", + "items": { + "$ref": "#/components/schemas/FilterDto" + } + }, + "order": { + "type": "array", + "items": { + "$ref": "#/components/schemas/OrderDto" + } + }, + "datasource_id": { + "type": "string", + "format": "uuid", + "example": "f7df2a7d-4ade-4c78-97b0-7c744d0893c7" + }, + "datasource_type": { + "type": "string", + "enum": [ + "table", + "view" + ] + } + }, + "required": [ + "columns", + "datasource_id", + "datasource_type" + ] + }, + "CreateForeignKeyDto": { + "type": "object", + "properties": { + "columns": { + "type": "array", + "example": [ + "id" + ], + "items": { + "type": "string" + } + }, + "referenced_table": { + "type": "string", + "example": "sensor" + }, + "referenced_columns": { + "type": "array", + "example": [ + "other_id" + ], + "items": { + "type": "string" + } + }, + "on_update": { + "type": "string", + "enum": [ + "restrict", + "cascade", + "set_null", + "no_action", + "set_default" + ], + "example": "cascade" + }, + "on_delete": { + "type": "string", + "enum": [ + "restrict", + "cascade", + "set_null", + "no_action", + "set_default" + ], + "example": "cascade" + } + }, + "required": [ + "columns", + "referenced_columns", + "referenced_table" + ] + }, + "CreateTableColumnDto": { + "type": "object", + "properties": { + "name": { + "type": "string", + "example": "Date" + }, + "type": { + "type": "string", + "enum": [ + "char", + "varchar", + "binary", + "varbinary", + "tinyblob", + "tinytext", + "text", + "blob", + "mediumtext", + "mediumblob", + "longtext", + "longblob", + "enum", + "set", + "serial", + "bit", + "tinyint", + "bool", + "smallint", + "mediumint", + "int", + "bigint", + "float", + "double", + "decimal", + "date", + "datetime", + "timestamp", + "time", + "year" + ], + "example": "varchar" + }, + "size": { + "type": "integer", + "format": "int64", + "example": 255 + }, + "d": { + "type": "integer", + "format": "int64", + "example": 0 + }, + "description": { + "type": "string", + "example": "Formatted as YYYY-MM-dd", + "maxLength": 2048, + "minLength": 0 + }, + "enums": { + "type": "array", + "description": "enum values, only considered when type = ENUM", + "items": { + "type": "string" + } + }, + "sets": { + "type": "array", + "description": "set values, only considered when type = SET", + "items": { + "type": "string" + } + }, + "index_length": { + "type": "integer", + "format": "int64" + }, + "null_allowed": { + "type": "boolean", + "example": true + }, + "concept_uri": { + "type": "string" + }, + "unit_uri": { + "type": "string" + } + }, + "required": [ + "name", + "null_allowed", + "type" + ] + }, + "CreateTableConstraintsDto": { + "type": "object", + "properties": { + "uniques": { + "type": "array", + "items": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "checks": { + "type": "array", + "items": { + "type": "string" + }, + "uniqueItems": true + }, + "foreign_keys": { + "type": "array", + "items": { + "$ref": "#/components/schemas/CreateForeignKeyDto" + } + }, + "primary_key": { + "type": "array", + "items": { + "type": "string" + }, + "uniqueItems": true + } + }, + "required": [ + "checks", + "foreign_keys", + "primary_key", + "uniques" + ] + }, + "CreateTableDto": { + "type": "object", + "properties": { + "name": { + "type": "string", + "example": "Air Quality", + "maxLength": 64, + "minLength": 1 + }, + "description": { + "type": "string", + "example": "Air Quality in Austria", + "maxLength": 180, + "minLength": 0 + }, + "columns": { + "type": "array", + "items": { + "$ref": "#/components/schemas/CreateTableColumnDto" + } + }, + "constraints": { + "$ref": "#/components/schemas/CreateTableConstraintsDto" + }, + "is_public": { + "type": "boolean", + "example": true + }, + "is_schema_public": { + "type": "boolean", + "example": true + } + }, + "required": [ + "columns", + "constraints", + "is_public", + "is_schema_public", + "name" + ] + }, + "CreateContainerDto": { + "type": "object", + "properties": { + "name": { + "type": "string", + "example": "Air Quality" + }, + "host": { + "type": "string", + "description": "Hostname of container", + "example": "data-db2" + }, + "port": { + "type": "integer", + "format": "int32", + "description": "Port of container", + "example": 3306 + }, + "quota": { + "type": "integer", + "format": "int64", + "example": 50 + }, + "image_id": { + "type": "string", + "format": "uuid", + "description": "Image ID", + "example": "2360f3c4-85e0-4fac-a7c6-73b296b9dde2" + }, + "ui_host": { + "type": "string", + "example": "example.com" + }, + "ui_port": { + "type": "integer", + "format": "int32", + "example": 3306 + }, + "privileged_username": { + "type": "string", + "description": "Username of privileged user", + "example": "root" + }, + "privileged_password": { + "type": "string", + "description": "Password of privileged user", + "example": "dbrepo" + } + }, + "required": [ + "host", + "image_id", + "name", + "privileged_password", + "privileged_username", + "quota" + ] + }, + "ContainerDto": { + "type": "object", + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "7ddb7e87-b965-43a2-9a24-4fa406d998f4" + }, + "name": { + "type": "string", + "example": "Air Quality" + }, + "image": { + "$ref": "#/components/schemas/ImageDto" + }, + "quota": { + "type": "integer", + "format": "int64", + "example": 50 + }, + "count": { + "type": "integer", + "format": "int64", + "example": 10 + }, + "username": { + "type": "string", + "example": "username" + }, + "password": { + "type": "string", + "example": "p4ssw0rd" + }, + "last_retrieved": { + "type": "string", + "format": "date-time", + "example": "2025-01-23T12:09:01" + }, + "internal_name": { + "type": "string", + "example": "air_quality" + } + }, + "required": [ + "count", + "id", + "image", + "internal_name", + "name" + ] + }, + "ColumnBriefDto": { + "type": "object", + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "a453e444-e00d-41ca-902c-11e9c54b39f1" + }, + "name": { + "type": "string", + "example": "Given Name", + "maxLength": 64, + "minLength": 0 + }, + "alias": { + "type": "string", + "example": "firstname" + }, + "database_id": { + "type": "string", + "format": "uuid", + "example": "911f9052-c58c-4e1c-b3f2-66af2107be16" + }, + "table_id": { + "type": "string", + "format": "uuid", + "example": "bfffa915-a547-4466-9c65-ddc0d38fdb08" + }, + "internal_name": { + "type": "string", + "example": "given_name", + "maxLength": 64, + "minLength": 0 + }, + "type": { + "type": "string", + "enum": [ + "char", + "varchar", + "binary", + "varbinary", + "tinyblob", + "tinytext", + "text", + "blob", + "mediumtext", + "mediumblob", + "longtext", + "longblob", + "enum", + "set", + "serial", + "bit", + "tinyint", + "bool", + "smallint", + "mediumint", + "int", + "bigint", + "float", + "double", + "decimal", + "date", + "datetime", + "timestamp", + "time", + "year" + ], + "example": "varchar" + } + }, + "required": [ + "database_id", + "id", + "internal_name", + "name", + "table_id", + "type" + ] + }, + "UnitDto": { + "type": "object", + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "ba1935e8-6817-488f-af0a-f54389af9000" + }, + "uri": { + "type": "string" + }, + "name": { + "type": "string" + }, + "description": { + "type": "string" + }, + "columns": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ColumnBriefDto" + } + } + }, + "required": [ + "columns", + "id", + "uri" + ] + }, + "OntologyBriefDto": { + "type": "object", + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "7c491e40-082a-47b8-b82c-51d03c520466" + }, + "uri": { + "type": "string", + "example": "http://www.wikidata.org/" + }, + "prefix": { + "type": "string", + "example": "wd" + }, + "sparql": { + "type": "boolean", + "example": true + }, + "rdf": { + "type": "boolean", + "example": false + }, + "uri_pattern": { + "type": "string", + "example": "http://www.wikidata.org/entity/.*" + } + }, + "required": [ + "id", + "prefix", + "rdf", + "sparql", + "uri" + ] + }, + "EntityDto": { + "type": "object", + "properties": { + "uri": { + "type": "string", + "example": "https://www.wikidata.org/entity/Q1686799" + }, + "label": { + "type": "string", + "example": "Apache Jena" + }, + "description": { + "type": "string", + "example": "open source semantic web framework for Java" + } + }, + "required": [ + "label", + "uri" + ] + }, + "OaiListIdentifiersParameters": { + "type": "object", + "properties": { + "metadataPrefix": { + "type": "string" + }, + "from": { + "type": "string" + }, + "until": { + "type": "string" + }, + "set": { + "type": "string" + }, + "resumptionToken": { + "type": "string" + }, + "parametersString": { + "type": "string" + }, + "fromDate": { + "type": "string", + "format": "date-time" + }, + "untilDate": { + "type": "string", + "format": "date-time" + } + } + }, + "BannerMessageDto": { + "type": "object", + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "ae3f795b-a3da-4ebe-bdc4-21a8ce631e6f" + }, + "type": { + "type": "string", + "enum": [ + "error", + "warning", + "info" + ], + "example": "WARNING" + }, + "message": { + "type": "string", + "example": "Maintenance starts on 8am on Monday" + }, + "link": { + "type": "string", + "example": "https://example.com" + }, + "link_text": { + "type": "string", + "example": "More" + }, + "display_start": { + "type": "string", + "format": "date-time", + "example": "2021-03-12T15:26:21Z" + }, + "display_end": { + "type": "string", + "format": "date-time", + "example": "2021-03-12T15:26:21Z" + } + }, + "required": [ + "id", + "message", + "type" + ] + }, + "ImageBriefDto": { + "type": "object", + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "816f55d5-1098-4f60-a4af-c8121c04dcce" + }, + "name": { + "type": "string", + "example": "mariadb" + }, + "version": { + "type": "string", + "example": 10.5 + }, + "default": { + "type": "boolean", + "example": false + } + }, + "required": [ + "default", + "id", + "name", + "version" + ] + }, + "LdCreatorDto": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "sameAs": { + "type": "string" + }, + "givenName": { + "type": "string" + }, + "familyName": { + "type": "string" + }, + "@type": { + "type": "string" + } + }, + "required": [ + "@type", + "name" + ] + }, + "LdDatasetDto": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "description": { + "type": "string" + }, + "url": { + "type": "string" + }, + "identifier": { + "type": "array", + "items": { + "type": "string" + } + }, + "license": { + "type": "string" + }, + "creator": { + "type": "array", + "items": { + "$ref": "#/components/schemas/LdCreatorDto" + } + }, + "citation": { + "type": "string" + }, + "hasPart": { + "type": "array", + "items": { + "$ref": "#/components/schemas/LdDatasetDto" + } + }, + "temporalCoverage": { + "type": "string" + }, + "version": { + "type": "string", + "format": "date-time" + }, + "@context": { + "type": "string" + }, + "@type": { + "type": "string" + } + }, + "required": [ + "@context", + "@type", + "citation", + "creator", + "description", + "hasPart", + "identifier", + "name", + "temporalCoverage", + "url", + "version" + ] + }, + "ViewColumnDto": { + "type": "object", + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "6aec3a91-2e0b-4e92-a16a-9c3c5e892da1" + }, + "name": { + "type": "string", + "example": "Given Name", + "maxLength": 64, + "minLength": 0 + }, + "size": { + "type": "integer", + "format": "int64", + "example": 255 + }, + "d": { + "type": "integer", + "format": "int64", + "example": 0 + }, + "description": { + "type": "string", + "example": "Column comment", + "maxLength": 2048, + "minLength": 0 + }, + "enums": { + "type": "array", + "description": "enum values, only considered when type = ENUM", + "items": { + "$ref": "#/components/schemas/EnumDto" + } + }, + "sets": { + "type": "array", + "description": "enum values, only considered when type = ENUM", + "items": { + "$ref": "#/components/schemas/SetDto" + } + }, + "database_id": { + "type": "string", + "format": "uuid", + "example": "2b5b2b03-fdd0-40d6-afe0-e5d02fd839e4" + }, + "ord": { + "type": "integer", + "format": "int32", + "example": 0 + }, + "internal_name": { + "type": "string", + "example": "given_name", + "maxLength": 64, + "minLength": 0 + }, + "index_length": { + "type": "integer", + "format": "int64", + "example": 255 + }, + "length": { + "type": "integer", + "format": "int64", + "example": 255 + }, + "type": { + "type": "string", + "enum": [ + "char", + "varchar", + "binary", + "varbinary", + "tinyblob", + "tinytext", + "text", + "blob", + "mediumtext", + "mediumblob", + "longtext", + "longblob", + "enum", + "set", + "serial", + "bit", + "tinyint", + "bool", + "smallint", + "mediumint", + "int", + "bigint", + "float", + "double", + "decimal", + "date", + "datetime", + "timestamp", + "time", + "year" + ], + "example": "varchar" + }, + "is_null_allowed": { + "type": "boolean", + "example": false + } + }, + "required": [ + "database_id", + "id", + "internal_name", + "is_null_allowed", + "name", + "ord", + "type" + ] + }, + "ViewDto": { + "type": "object", + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "787439d0-e85e-400c-a7e6-996a023bfad9" + }, + "name": { + "type": "string", + "example": "Air Quality" + }, + "identifiers": { + "type": "array", + "items": { + "$ref": "#/components/schemas/IdentifierDto" + } + }, + "query": { + "type": "string", + "example": "SELECT `id` FROM `air_quality` ORDER BY `value` DESC" + }, + "owner": { + "$ref": "#/components/schemas/UserBriefDto" + }, + "columns": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ViewColumnDto" + } + }, + "created": { + "type": "string", + "format": "date-time", + "example": "2022-01-01 08:00:00.000" + }, + "last_retrieved": { + "type": "string", + "format": "date-time", + "example": "2025-01-23T12:09:01" + }, + "database_id": { + "type": "string", + "format": "uuid", + "example": "fc29f89c-86a8-4020-9e36-4d954736c6cc" + }, + "internal_name": { + "type": "string", + "example": "air_quality" + }, + "is_public": { + "type": "boolean", + "example": true + }, + "is_schema_public": { + "type": "boolean", + "example": true + }, + "initial_view": { + "type": "boolean", + "description": "True if it is the default view for the database", + "example": true + }, + "query_hash": { + "type": "string", + "example": "7de03e818900b6ea6d58ad0306d4a741d658c6df3d1964e89ed2395d8c7e7916" + } + }, + "required": [ + "columns", + "created", + "database_id", + "id", + "identifiers", + "internal_name", + "name", + "owner", + "query", + "query_hash" + ] + }, + "ConstraintsDto": { + "type": "object", + "properties": { + "uniques": { + "type": "array", + "items": { + "$ref": "#/components/schemas/UniqueDto" + } + }, + "checks": { + "type": "array", + "example": [ + "value > 1" + ], + "items": { + "type": "string" + }, + "uniqueItems": true + }, + "foreign_keys": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ForeignKeyDto" + } + }, + "primary_key": { + "type": "array", + "items": { + "$ref": "#/components/schemas/PrimaryKeyDto" + }, + "uniqueItems": true + } + } + }, + "ForeignKeyBriefDto": { + "type": "object", + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "f2b740ec-0b13-4d07-88a9-529d354bba6a" + } + } + }, + "ForeignKeyDto": { + "type": "object", + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "f2b740ec-0b13-4d07-88a9-529d354bba6a" + }, + "name": { + "type": "string", + "example": "fk_name" + }, + "references": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ForeignKeyReferenceDto" + } + }, + "table": { + "$ref": "#/components/schemas/TableBriefDto" + }, + "referenced_table": { + "$ref": "#/components/schemas/TableBriefDto" + }, + "on_update": { + "type": "string", + "enum": [ + "restrict", + "cascade", + "set_null", + "no_action", + "set_default" + ], + "example": "restrict" + }, + "on_delete": { + "type": "string", + "enum": [ + "restrict", + "cascade", + "set_null", + "no_action", + "set_default" + ], + "example": "restrict" + } + }, + "required": [ + "name", + "referenced_table", + "references", + "table" + ] + }, + "ForeignKeyReferenceDto": { + "type": "object", + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "f2b740ec-0b13-4d07-88a9-529d354bba6a" + }, + "column": { + "$ref": "#/components/schemas/ColumnBriefDto" + }, + "foreign_key": { + "$ref": "#/components/schemas/ForeignKeyBriefDto" + }, + "referenced_column": { + "$ref": "#/components/schemas/ColumnBriefDto" + } + }, + "required": [ + "column", + "foreign_key", + "referenced_column" + ] + }, + "PrimaryKeyDto": { + "type": "object", + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "d984f9d7-e8a7-4b81-b59a-862db1871f18" + }, + "table": { + "$ref": "#/components/schemas/TableBriefDto" + }, + "column": { + "$ref": "#/components/schemas/ColumnBriefDto" + } + }, + "required": [ + "column", + "table" + ] + }, + "TableDto": { + "type": "object", + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "d346f844-b84c-490f-9aec-725a2dc8f820" + }, + "name": { + "type": "string", + "example": "Air Quality" + }, + "alias": { + "type": "string", + "example": "a" + }, + "identifiers": { + "type": "array", + "items": { + "$ref": "#/components/schemas/IdentifierDto" + } + }, + "owner": { + "$ref": "#/components/schemas/UserBriefDto" + }, + "description": { + "type": "string", + "example": "Air Quality in Austria", + "maxLength": 2048, + "minLength": 0 + }, + "columns": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ColumnDto" + } + }, + "constraints": { + "$ref": "#/components/schemas/ConstraintsDto" + }, + "created": { + "type": "string", + "format": "date-time", + "example": "2022-01-01 08:00:00.000" + }, + "last_retrieved": { + "type": "string", + "format": "date-time", + "example": "2025-01-23T12:09:01" + }, + "database_id": { + "type": "string", + "format": "uuid", + "example": "fc29f89c-86a8-4020-9e36-4d954736c6cc" + }, + "internal_name": { + "type": "string", + "example": "air_quality" + }, + "is_versioned": { + "type": "boolean", + "example": true + }, + "is_schema_public": { + "type": "boolean", + "example": true + }, + "queue_name": { + "type": "string", + "example": "air_quality" + }, + "queue_type": { + "type": "string", + "example": "quorum" + }, + "routing_key": { + "type": "string", + "example": "dbrepo.1.2" + }, + "is_public": { + "type": "boolean", + "example": true + }, + "num_rows": { + "type": "integer", + "format": "int64", + "example": 5 + }, + "data_length": { + "type": "integer", + "format": "int64", + "description": "in bytes", + "example": 16384 + }, + "max_data_length": { + "type": "integer", + "format": "int64", + "description": "in bytes", + "example": 0 + }, + "avg_row_length": { + "type": "integer", + "format": "int64", + "description": "in bytes", + "example": 3276 + } + }, + "required": [ + "columns", + "constraints", + "created", + "database_id", + "id", + "internal_name", + "is_public", + "is_schema_public", + "is_versioned", + "name", + "owner", + "queue_name", + "routing_key" + ] + }, + "UniqueDto": { + "type": "object", + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "d984f9d7-e8a7-4b81-b59a-862db1871f13" + }, + "name": { + "type": "string", + "example": "uk_name" + }, + "table": { + "$ref": "#/components/schemas/TableBriefDto" + }, + "columns": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ColumnBriefDto" + } + } + }, + "required": [ + "columns", + "id", + "name", + "table" + ] + }, + "TableColumnEntityDto": { + "type": "object", + "properties": { + "uri": { + "type": "string", + "example": "https://www.wikidata.org/entity/Q1686799" + }, + "label": { + "type": "string", + "example": "Apache Jena" + }, + "description": { + "type": "string", + "example": "open source semantic web framework for Java" + }, + "database_id": { + "type": "string", + "format": "uuid", + "example": "475b4107-a64d-4495-a7ef-3cb0dadd4804" + }, + "table_id": { + "type": "string", + "format": "uuid", + "example": "9a9208af-90ea-4382-9a11-0c8f6d89bd1f" + }, + "column_id": { + "type": "string", + "format": "uuid", + "example": "297860e3-3b29-451c-ae8a-a85ed5941018" + } + }, + "required": [ + "column_id", + "database_id", + "table_id", + "uri" + ] + }, + "ContainerBriefDto": { + "type": "object", + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "7ddb7e87-b965-43a2-9a24-4fa406d998f4" + }, + "hash": { + "type": "string", + "example": "f829dd8a884182d0da846f365dee1221fd16610a14c81b8f9f295ff162749e50" + }, + "name": { + "type": "string", + "example": "Air Quality" + }, + "image": { + "$ref": "#/components/schemas/ImageBriefDto" + }, + "quota": { + "type": "integer", + "format": "int32", + "example": 50 + }, + "count": { + "type": "integer", + "format": "int32", + "example": 10 + }, + "internal_name": { + "type": "string", + "example": "air-quality" + } + }, + "required": [ + "count", + "hash", + "id", + "image", + "internal_name", + "name", + "quota" + ] + }, + "ConceptDto": { + "type": "object", + "properties": { + "id": { + "type": "string", + "format": "uuid", + "example": "8cabc011-4bdf-44d4-9d33-b2648e2ddbf1" + }, + "uri": { + "type": "string" + }, + "name": { + "type": "string" + }, + "description": { + "type": "string" + }, + "columns": { + "type": "array", + "items": { + "$ref": "#/components/schemas/ColumnBriefDto" + } + } + }, + "required": [ + "columns", + "id", + "uri" + ] + } + }, + "securitySchemes": { + "basicAuth": { + "type": "http", + "scheme": "basic" + }, + "bearerAuth": { + "type": "http", + "scheme": "bearer", + "bearerFormat": "JWT" + } + } + } +} diff --git a/.docs/.openapi/api-metadata.yaml b/.docs/.openapi/api-metadata.yaml deleted file mode 100644 index 97304bf8c33767013fc9e55ccd5c315001e1f073..0000000000000000000000000000000000000000 --- a/.docs/.openapi/api-metadata.yaml +++ /dev/null @@ -1,7097 +0,0 @@ -openapi: 3.1.0 -info: - title: Database Repository Metadata Service API - description: Service that manages the metadata - contact: - name: Prof. Andreas Rauber - email: andreas.rauber@tuwien.ac.at - license: - name: Apache 2.0 - url: https://www.apache.org/licenses/LICENSE-2.0 - version: 1.8.1 -externalDocs: - description: Sourcecode Documentation - url: https://www.ifs.tuwien.ac.at/infrastructures/dbrepo/1.8/system-services-metadata/ -servers: -- url: http://localhost - description: Development instance -- url: https://test.dbrepo.tuwien.ac.at - description: Staging instance -paths: - /api/user/{userId}: - get: - tags: - - user-endpoint - summary: Get user - description: Gets own user information from the metadata database. Requires - authentication. Foreign user information can only be obtained if additional - role `find-foreign-user` is present. Finding information about internal users - results in a 404 error. - operationId: find - parameters: - - name: userId - in: path - required: true - schema: - type: string - format: uuid - responses: - "200": - description: Found user - content: - application/json: - schema: - $ref: "#/components/schemas/UserDto" - "403": - description: Find user is not permitted - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "404": - description: User was not found - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - security: - - bearerAuth: [] - - basicAuth: [] - put: - tags: - - user-endpoint - summary: Update user - description: Updates user with id. Requires role `modify-user-information`. - operationId: modify - parameters: - - name: userId - in: path - required: true - schema: - type: string - format: uuid - requestBody: - content: - application/json: - schema: - $ref: "#/components/schemas/UserUpdateDto" - required: true - responses: - "202": - description: Modified user information - content: - application/json: - schema: - $ref: "#/components/schemas/UserDto" - "400": - description: Modify user query is malformed - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "403": - description: Not allowed to modify user metadata - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "404": - description: Failed to find database/user in metadata database - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "503": - description: Failed to modify user at auth service - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - security: - - bearerAuth: [] - - basicAuth: [] - head: - tags: - - user-endpoint - summary: Get user - description: Gets own user information from the metadata database. Requires - authentication. Foreign user information can only be obtained if additional - role `find-foreign-user` is present. Finding information about internal users - results in a 404 error. - operationId: find_1 - parameters: - - name: userId - in: path - required: true - schema: - type: string - format: uuid - responses: - "200": - description: Found user - content: - application/json: - schema: - $ref: "#/components/schemas/UserDto" - "403": - description: Find user is not permitted - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "404": - description: User was not found - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - security: - - bearerAuth: [] - - basicAuth: [] - /api/database: - get: - tags: - - database-endpoint - summary: List databases - description: "Lists all databases in the metadata database. Requests with HTTP\ - \ method **GET** return the list of databases, requests with HTTP method **HEAD**\ - \ only the number in the `X-Count` header." - operationId: list - parameters: - - name: internal_name - in: query - required: false - schema: - type: string - responses: - "200": - description: List of databases - headers: - Access-Control-Expose-Headers: - description: Expose `X-Count` custom header - required: true - style: simple - schema: - type: string - X-Count: - description: Number of databases - required: true - style: simple - schema: - type: integer - format: int64 - content: - application/json: - schema: - type: array - items: - $ref: "#/components/schemas/DatabaseBriefDto" - post: - tags: - - database-endpoint - summary: Create database - description: Creates a database in the container with id. Requires roles `create-database`. - operationId: create - requestBody: - content: - application/json: - schema: - $ref: "#/components/schemas/CreateDatabaseDto" - required: true - responses: - "201": - description: Created a new database - content: - application/json: - schema: - $ref: "#/components/schemas/DatabaseBriefDto" - "400": - description: Database create query is malformed or image is not supported - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "403": - description: Database create permission is missing or grant permissions - at broker service failed - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "404": - description: Failed to fin container/user/database in metadata database - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "409": - description: Query store could not be created - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "423": - description: Database quota exceeded - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "502": - description: Connection to search service failed - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "503": - description: Failed to save in search service - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - security: - - bearerAuth: [] - - basicAuth: [] - head: - tags: - - database-endpoint - summary: List databases - description: "Lists all databases in the metadata database. Requests with HTTP\ - \ method **GET** return the list of databases, requests with HTTP method **HEAD**\ - \ only the number in the `X-Count` header." - operationId: list_1 - parameters: - - name: internal_name - in: query - required: false - schema: - type: string - responses: - "200": - description: List of databases - headers: - Access-Control-Expose-Headers: - description: Expose `X-Count` custom header - required: true - style: simple - schema: - type: string - X-Count: - description: Number of databases - required: true - style: simple - schema: - type: integer - format: int64 - content: - application/json: - schema: - type: array - items: - $ref: "#/components/schemas/DatabaseBriefDto" - /api/database/{databaseId}/access/{userId}: - get: - tags: - - access-endpoint - summary: Find/Check access - description: "Finds or checks access of a user with given id to a database with\ - \ given id. Requests with HTTP method **GET** return the access object, requests\ - \ with HTTP method **HEAD** only the status. When the user has at least *READ*\ - \ access, the status 200 is returned, 403 otherwise. Requires role `check-database-access`\ - \ or `check-foreign-database-access`." - operationId: find_2 - parameters: - - name: databaseId - in: path - required: true - schema: - type: string - format: uuid - - name: userId - in: path - required: true - schema: - type: string - format: uuid - responses: - "200": - description: Found database access - content: - application/json: - schema: - $ref: "#/components/schemas/DatabaseAccessDto" - "403": - description: No access to this database - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "404": - description: Database not found - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - security: - - bearerAuth: [] - - basicAuth: [] - put: - tags: - - access-endpoint - summary: Modify access - description: Modifies access of a user with given id to database with given - id. Requires role `update-database-access`. - operationId: update - parameters: - - name: databaseId - in: path - required: true - schema: - type: string - format: uuid - - name: userId - in: path - required: true - schema: - type: string - format: uuid - requestBody: - content: - application/json: - schema: - $ref: "#/components/schemas/CreateAccessDto" - required: true - responses: - "202": - description: Modified access - "400": - description: Modify access query or database connection is malformed - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "403": - description: Modify access not permitted when no access is granted in the - first place - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "404": - description: Database or user not found - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "502": - description: Access could not be updated due to connection error in the - data service - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "503": - description: Access could not be updated in the data service - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - security: - - bearerAuth: [] - - basicAuth: [] - post: - tags: - - access-endpoint - summary: Give access - description: Give a user with given id access to some database with given id. - Requires role `create-database-access`. - operationId: create_1 - parameters: - - name: databaseId - in: path - required: true - schema: - type: string - format: uuid - - name: userId - in: path - required: true - schema: - type: string - format: uuid - requestBody: - content: - application/json: - schema: - $ref: "#/components/schemas/CreateAccessDto" - required: true - responses: - "202": - description: Granting access succeeded - content: - application/json: - schema: - $ref: "#/components/schemas/DatabaseAccessDto" - "400": - description: Granting access query or database connection is malformed - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "403": - description: Failed giving access - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "404": - description: Database or user not found - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "502": - description: Access could not be created due to connection error - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "503": - description: Access could not be created in the data service - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - security: - - bearerAuth: [] - - basicAuth: [] - delete: - tags: - - access-endpoint - summary: Delete access - description: Delete access of a user with id to a database with id. Requires - role `delete-database-access`. - operationId: revoke - parameters: - - name: databaseId - in: path - required: true - schema: - type: string - format: uuid - - name: userId - in: path - required: true - schema: - type: string - format: uuid - responses: - "202": - description: Deleted access - "400": - description: Modify access query or database connection is malformed - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "403": - description: Revoke of access not permitted as no access was found - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "404": - description: "User, database with access was not found" - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "502": - description: Access could not be created due to connection error - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "503": - description: Access could not be revoked in the data service - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - security: - - bearerAuth: [] - - basicAuth: [] - head: - tags: - - access-endpoint - summary: Find/Check access - description: "Finds or checks access of a user with given id to a database with\ - \ given id. Requests with HTTP method **GET** return the access object, requests\ - \ with HTTP method **HEAD** only the status. When the user has at least *READ*\ - \ access, the status 200 is returned, 403 otherwise. Requires role `check-database-access`\ - \ or `check-foreign-database-access`." - operationId: find_3 - parameters: - - name: databaseId - in: path - required: true - schema: - type: string - format: uuid - - name: userId - in: path - required: true - schema: - type: string - format: uuid - responses: - "200": - description: Found database access - content: - application/json: - schema: - $ref: "#/components/schemas/DatabaseAccessDto" - "403": - description: No access to this database - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "404": - description: Database not found - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - security: - - bearerAuth: [] - - basicAuth: [] - /api/ontology/{ontologyId}: - get: - tags: - - ontology-endpoint - summary: Find ontology - description: Finds an ontology with id in the metadata database. - operationId: find_4 - parameters: - - name: ontologyId - in: path - required: true - schema: - type: string - format: uuid - responses: - "200": - description: Find one ontology - content: - application/json: - schema: - $ref: "#/components/schemas/OntologyDto" - "404": - description: Could not find ontology - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - put: - tags: - - ontology-endpoint - summary: Update ontology - description: Updates an ontology with id. Requires role `update-ontology`. - operationId: update_1 - parameters: - - name: ontologyId - in: path - required: true - schema: - type: string - format: uuid - requestBody: - content: - application/json: - schema: - $ref: "#/components/schemas/OntologyModifyDto" - required: true - responses: - "202": - description: Updated ontology successfully - content: - application/json: - schema: - $ref: "#/components/schemas/OntologyDto" - "404": - description: Could not find ontology - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - security: - - bearerAuth: [] - - basicAuth: [] - delete: - tags: - - ontology-endpoint - summary: Delete ontology - description: Deletes an ontology with given id. Requires role `delete-ontology`. - operationId: delete - parameters: - - name: ontologyId - in: path - required: true - schema: - type: string - format: uuid - responses: - "202": - description: Deleted ontology successfully - content: - application/json: {} - "404": - description: Could not find ontology - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - security: - - bearerAuth: [] - - basicAuth: [] - /api/message/{messageId}: - put: - tags: - - message-endpoint - summary: Update message - description: Updates a message with id. Requires role `update-maintenance-message`. - operationId: update_2 - parameters: - - name: messageId - in: path - required: true - schema: - type: string - format: uuid - requestBody: - content: - application/json: - schema: - $ref: "#/components/schemas/BannerMessageUpdateDto" - required: true - responses: - "202": - description: Updated message - content: - application/json: - schema: - $ref: "#/components/schemas/BannerMessageBriefDto" - "404": - description: Could not find message - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - security: - - bearerAuth: [] - - basicAuth: [] - delete: - tags: - - message-endpoint - summary: Delete message - description: Deletes a message with id. Requires role `delete-maintenance-message`. - operationId: delete_1 - parameters: - - name: messageId - in: path - required: true - schema: - type: string - format: uuid - responses: - "202": - description: Deleted message - content: - application/json: {} - "404": - description: Could not find message - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - security: - - bearerAuth: [] - - basicAuth: [] - /api/image/{imageId}: - get: - tags: - - image-endpoint - summary: Find image - description: Finds a container image in the metadata database. - operationId: findById - parameters: - - name: imageId - in: path - required: true - schema: - type: string - format: uuid - responses: - "200": - description: Found image - content: - application/json: - schema: - $ref: "#/components/schemas/ImageDto" - "404": - description: Image could not be found - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - put: - tags: - - image-endpoint - summary: Update image - description: Updates container image in the metadata database. Requires role - `modify-image`. - operationId: update_3 - parameters: - - name: imageId - in: path - required: true - schema: - type: string - format: uuid - requestBody: - content: - application/json: - schema: - $ref: "#/components/schemas/ImageChangeDto" - required: true - responses: - "202": - description: Updated image successfully - content: - application/json: - schema: - $ref: "#/components/schemas/ImageDto" - "404": - description: Image could not be found - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - security: - - bearerAuth: [] - - basicAuth: [] - delete: - tags: - - image-endpoint - summary: Delete image - description: Deletes a container image in the metadata database. Requires role - `delete-image`. - operationId: delete_2 - parameters: - - name: imageId - in: path - required: true - schema: - type: string - format: uuid - responses: - "202": - description: Deleted image successfully - "404": - description: Image could not be found - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - security: - - bearerAuth: [] - - basicAuth: [] - /api/identifier/{identifierId}: - get: - tags: - - identifier-endpoint - summary: Find identifier - description: Finds an identifier with id. The response format depends on the - HTTP `Accept` header set on the request. - operationId: find_5 - parameters: - - name: identifierId - in: path - required: true - schema: - type: string - format: uuid - - name: Accept - in: header - required: true - schema: - type: string - responses: - "200": - description: Found identifier successfully - content: - application/json: - schema: - $ref: "#/components/schemas/IdentifierDto" - application/ld+json: - schema: - $ref: "#/components/schemas/LdDatasetDto" - text/xml: {} - text/bibliography: {} - text/bibliography; style=apa: {} - text/bibliography; style=ieee: {} - text/bibliography; style=bibtex: {} - "400": - description: "Identifier could not be exported, the requested style is not\ - \ known" - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "403": - description: Not allowed to view identifier - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "404": - description: Identifier could not be found - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "406": - description: Failed to find acceptable representation - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "409": - description: Exported resource was not found - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "410": - description: Failed to retrieve from S3 endpoint - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "502": - description: Connection to data service failed - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "503": - description: Failed to find in data service - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - put: - tags: - - identifier-endpoint - summary: Save identifier - description: Saves an identifier with id as a draft identifier. Identifiers - can only be created for objects the user has at least *READ* access in the - associated database (requires role `create-identifier`) or for any object - in any database (requires role `create-foreign-identifier`). - operationId: save - parameters: - - name: identifierId - in: path - required: true - schema: - type: string - format: uuid - requestBody: - content: - application/json: - schema: - $ref: "#/components/schemas/IdentifierSaveDto" - required: true - responses: - "202": - description: Saved identifier - content: - application/json: - schema: - $ref: "#/components/schemas/IdentifierDto" - "400": - description: Identifier form contains invalid request data - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "403": - description: Insufficient access rights or authorities - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "404": - description: "Failed to find database, table or view" - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "502": - description: Connection to search service failed - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "503": - description: Failed to save in search service - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - security: - - bearerAuth: [] - - basicAuth: [] - delete: - tags: - - identifier-endpoint - summary: Delete identifier - description: Deletes an identifier with id. Requires role `delete-identifier`. - operationId: delete_3 - parameters: - - name: identifierId - in: path - required: true - schema: - type: string - format: uuid - responses: - "202": - description: Deleted identifier - "403": - description: Deleting identifier not permitted - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "404": - description: Identifier or database could not be found - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "502": - description: Connection to search service failed - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "503": - description: Failed to delete in search service - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - security: - - bearerAuth: [] - - basicAuth: [] - /api/identifier/{identifierId}/publish: - put: - tags: - - identifier-endpoint - summary: Publish identifier - description: Publishes an identifier with id. A published identifier cannot - be changed anymore. Requires role `publish-identifier`. - operationId: publish - parameters: - - name: identifierId - in: path - required: true - schema: - type: string - format: uuid - responses: - "202": - description: Published identifier - content: - application/json: - schema: - $ref: "#/components/schemas/IdentifierDto" - "400": - description: Identifier form contains invalid request data - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "403": - description: Insufficient access rights or authorities - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "404": - description: "Failed to find database, table or view" - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "502": - description: Connection to search service failed - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "503": - description: Failed to save in search service - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - security: - - bearerAuth: [] - - basicAuth: [] - /api/database/{databaseId}/visibility: - put: - tags: - - database-endpoint - summary: Update database visibility - description: Updates the database with id on the visibility. Only the database - owner can perform this operation. Requires role `modify-database-visibility`. - operationId: visibility - parameters: - - name: databaseId - in: path - required: true - schema: - type: string - format: uuid - requestBody: - content: - application/json: - schema: - $ref: "#/components/schemas/DatabaseModifyVisibilityDto" - required: true - responses: - "202": - description: Visibility modified successfully - content: - application/json: - schema: - $ref: "#/components/schemas/DatabaseBriefDto" - "400": - description: The visibility payload is malformed - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "403": - description: Visibility modification is not permitted - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "404": - description: Failed to find database in metadata database - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "502": - description: Connection to search service failed - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "503": - description: Failed to save in search service - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - security: - - bearerAuth: [] - - basicAuth: [] - /api/database/{databaseId}/view/{viewId}: - get: - tags: - - view-endpoint - summary: Get view - description: Gets a view with id in the metadata database. - operationId: find_6 - parameters: - - name: databaseId - in: path - required: true - schema: - type: string - format: uuid - - name: viewId - in: path - required: true - schema: - type: string - format: uuid - responses: - "200": - description: Find view successfully - content: - application/json: - schema: - $ref: "#/components/schemas/ViewDto" - "403": - description: Find view is not permitted - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "404": - description: "Database, view or user could not be found" - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - security: - - bearerAuth: [] - - basicAuth: [] - put: - tags: - - view-endpoint - summary: Update view - description: Updates a view with id. This can only be performed by the view - owner or database owner. Requires role `create-database-view`. - operationId: update_4 - parameters: - - name: databaseId - in: path - required: true - schema: - type: string - format: uuid - - name: viewId - in: path - required: true - schema: - type: string - format: uuid - requestBody: - content: - application/json: - schema: - $ref: "#/components/schemas/ViewUpdateDto" - required: true - responses: - "202": - description: Update view successfully - content: - '*/*': - schema: - $ref: "#/components/schemas/ViewBriefDto" - "400": - description: Update view query is malformed - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "403": - description: Update not allowed - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "404": - description: Database or View could not be found - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "502": - description: Connection to search service failed - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "503": - description: Failed to save in search service - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - security: - - bearerAuth: [] - - basicAuth: [] - delete: - tags: - - view-endpoint - summary: Delete view - description: Deletes a view with id. Requires role `delete-database-view`. - operationId: delete_4 - parameters: - - name: databaseId - in: path - required: true - schema: - type: string - format: uuid - - name: viewId - in: path - required: true - schema: - type: string - format: uuid - responses: - "202": - description: Delete view successfully - "400": - description: Delete view query is malformed - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "403": - description: Deletion not allowed - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "404": - description: "Database, view or user could not be found" - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "423": - description: Delete view resulted in an invalid query statement - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "502": - description: Connection to search service failed - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "503": - description: Failed to save in search service - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - security: - - bearerAuth: [] - - basicAuth: [] - /api/database/{databaseId}/table/{tableId}: - get: - tags: - - table-endpoint - summary: Find table - description: "Finds a table with id. When a table is hidden (i.e. when `is_public`\ - \ is `false`), then the user needs to have at least read access and the role\ - \ `find-table`. When the `system` role is present, the endpoint responds with\ - \ additional connection metadata in the header." - operationId: findById_1 - parameters: - - name: databaseId - in: path - required: true - schema: - type: string - format: uuid - - name: tableId - in: path - required: true - schema: - type: string - format: uuid - responses: - "200": - description: Find table successfully - content: - application/json: - schema: - $ref: "#/components/schemas/TableDto" - "403": - description: Access to the database is forbidden - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "404": - description: "Table, database or container could not be found" - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - security: - - bearerAuth: [] - - basicAuth: [] - put: - tags: - - table-endpoint - summary: Update table - description: Updates a table in the database with id. Requires role `update-table`. - operationId: update_5 - parameters: - - name: databaseId - in: path - required: true - schema: - type: string - format: uuid - - name: tableId - in: path - required: true - schema: - type: string - format: uuid - requestBody: - content: - application/json: - schema: - $ref: "#/components/schemas/TableUpdateDto" - required: true - responses: - "202": - description: Updated the table - content: - application/json: - schema: - $ref: "#/components/schemas/TableBriefDto" - "400": - description: Update table visibility payload is malformed - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "403": - description: Update table visibility not permitted - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "404": - description: Table could not be found - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "502": - description: Connection to search service failed - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "503": - description: Failed to save in search service - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - security: - - bearerAuth: [] - - basicAuth: [] - delete: - tags: - - table-endpoint - summary: Delete table - description: Deletes a table with id. Only the owner of a table can perform - this action (requires role `delete-table`) or anyone can delete a table (requires - role `delete-foreign-table`). - operationId: delete_5 - parameters: - - name: databaseId - in: path - required: true - schema: - type: string - format: uuid - - name: tableId - in: path - required: true - schema: - type: string - format: uuid - responses: - "202": - description: Delete table successfully - "400": - description: Delete table query resulted in an invalid query statement - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "403": - description: Access to the database is forbidden - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "404": - description: "Table, database or container could not be found" - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "502": - description: Connection to search service failed - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "503": - description: Failed to save in search service - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - security: - - bearerAuth: [] - - basicAuth: [] - /api/database/{databaseId}/table/{tableId}/statistic: - put: - tags: - - table-endpoint - summary: Update statistics - description: "Updates basic statistical properties (min, max, mean, median,\ - \ std.dev) for numerical columns in a table with id. This action can only\ - \ be performed by the table owner. Requires role `update-table-statistic`." - operationId: updateStatistic - parameters: - - name: databaseId - in: path - required: true - schema: - type: string - format: uuid - - name: tableId - in: path - required: true - schema: - type: string - format: uuid - responses: - "202": - description: Updated table statistics successfully - "400": - description: Failed to map column statistic to known columns - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "403": - description: Not the owner - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "404": - description: Failed to find database/table in metadata database - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "502": - description: Connection to search service failed - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "503": - description: Failed to save in search service - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - security: - - bearerAuth: [] - - basicAuth: [] - /api/database/{databaseId}/table/{tableId}/column/{columnId}: - put: - tags: - - table-endpoint - summary: Update semantics - description: Updates column semantics of a table column with id. Only the table - owner with at least *READ* access to the associated database can update the - column semantics (requires role `modify-table-column-semantics`) or foreign - table columns if role `modify-foreign-table-column-semantics`. - operationId: updateColumn - parameters: - - name: databaseId - in: path - required: true - schema: - type: string - format: uuid - - name: tableId - in: path - required: true - schema: - type: string - format: uuid - - name: columnId - in: path - required: true - schema: - type: string - format: uuid - requestBody: - content: - application/json: - schema: - $ref: "#/components/schemas/ColumnSemanticsUpdateDto" - required: true - responses: - "202": - description: Updated column semantics successfully - content: - application/json: - schema: - $ref: "#/components/schemas/ColumnDto" - "400": - description: Update semantic concept query is malformed or update unit of - measurement query is malformed - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "403": - description: Access to the database is forbidden - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "404": - description: Failed to find user/table/database/ontology in metadata database - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "502": - description: Connection to search service failed - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "503": - description: Failed to save in search service - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - security: - - bearerAuth: [] - - basicAuth: [] - /api/database/{databaseId}/owner: - put: - tags: - - database-endpoint - summary: Update database owner - description: Updates the database with id on the owner. Only the database owner - can perform this operation. Requires role `modify-database-owner`. - operationId: transfer - parameters: - - name: databaseId - in: path - required: true - schema: - type: string - format: uuid - requestBody: - content: - application/json: - schema: - $ref: "#/components/schemas/DatabaseTransferDto" - required: true - responses: - "202": - description: Transfer of ownership was successful - content: - application/json: - schema: - $ref: "#/components/schemas/DatabaseBriefDto" - "400": - description: Owner payload is malformed - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "404": - description: Database or user could not be found - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "403": - description: Transfer of ownership is not permitted - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "502": - description: Connection to search service failed - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "503": - description: Failed to save in search service - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - security: - - bearerAuth: [] - - basicAuth: [] - /api/database/{databaseId}/metadata/view: - put: - tags: - - database-endpoint - summary: Update database view schemas - description: Updates the database with id with generated metadata from view - that are not yet known to the database. Only the database owner can perform - this operation. Requires role `find-database`. - operationId: refreshViewMetadata - parameters: - - name: databaseId - in: path - required: true - schema: - type: string - format: uuid - responses: - "200": - description: Refreshed database views metadata - content: - application/json: - schema: - $ref: "#/components/schemas/DatabaseBriefDto" - "403": - description: Refresh view metadata is not permitted - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "404": - description: Failed to find database in metadata database - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "502": - description: Connection to search service failed - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "503": - description: Failed to save in search service - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - security: - - bearerAuth: [] - - basicAuth: [] - /api/database/{databaseId}/metadata/table: - put: - tags: - - database-endpoint - summary: Update database table schemas - description: Updates the database with id with generated metadata from tables - that are not yet known to the database. Only the database owner can perform - this operation. Requires role `find-database`. - operationId: refreshTableMetadata - parameters: - - name: databaseId - in: path - required: true - schema: - type: string - format: uuid - responses: - "200": - description: Refreshed database tables metadata - content: - application/json: - schema: - $ref: "#/components/schemas/DatabaseBriefDto" - "400": - description: Failed to parse payload at search service - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "403": - description: Not allowed to refresh table metadata - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "404": - description: Failed to find database in metadata database - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "502": - description: Connection to search service failed - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "503": - description: Failed to save in search service - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - security: - - bearerAuth: [] - - basicAuth: [] - /api/database/{databaseId}/image: - get: - tags: - - database-endpoint - summary: Get database preview image - description: Gets the database with id on the preview image. - operationId: findPreviewImage - parameters: - - name: databaseId - in: path - required: true - schema: - type: string - format: uuid - responses: - "200": - description: View of image was successful - content: - '*/*': - schema: - type: string - format: byte - "404": - description: Database or user could not be found - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - security: - - bearerAuth: [] - - basicAuth: [] - put: - tags: - - database-endpoint - summary: Update database preview image - description: Updates the database with id on the preview image. Only the database - owner can perform this operation. Requires role `modify-database-image`. - operationId: modifyImage - parameters: - - name: databaseId - in: path - required: true - schema: - type: string - format: uuid - requestBody: - content: - application/json: - schema: - $ref: "#/components/schemas/DatabaseModifyImageDto" - required: true - responses: - "202": - description: Modify of image was successful - content: - application/json: - schema: - $ref: "#/components/schemas/DatabaseBriefDto" - "403": - description: Modify of image is not permitted - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "404": - description: Database could not be found - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "410": - description: File was not found in the Storage Service - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "502": - description: Connection to search service failed - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "503": - description: Failed to save in search service - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - security: - - bearerAuth: [] - - basicAuth: [] - /api/database/{databaseId}/dashboard: - put: - tags: - - database-endpoint - summary: Update database dashboard uid - description: Updates the dashboard uid for a database with given id. Only the - database owner can perform this operation. Requires role `system`. - operationId: modifyDashboard - parameters: - - name: databaseId - in: path - required: true - schema: - type: string - format: uuid - requestBody: - content: - application/json: - schema: - $ref: "#/components/schemas/DatabaseModifyDashboardDto" - required: true - responses: - "202": - description: Modify of dashboard uid was successful - content: - application/json: - schema: - $ref: "#/components/schemas/DatabaseBriefDto" - "400": - description: Malformed payload - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "404": - description: Database could not be found - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "502": - description: Connection to search service failed - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "503": - description: Failed to save in search service - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - security: - - bearerAuth: [] - - basicAuth: [] - /api/ontology: - get: - tags: - - ontology-endpoint - summary: List ontologies - description: Lists all ontologies known to the metadata database. - operationId: findAll - responses: - "200": - description: List ontologies - content: - application/json: - schema: - type: array - items: - $ref: "#/components/schemas/OntologyBriefDto" - post: - tags: - - ontology-endpoint - summary: Create ontology - description: Creates an ontology in the metadata database. Requires role `create-ontology`. - operationId: create_2 - requestBody: - content: - application/json: - schema: - $ref: "#/components/schemas/OntologyCreateDto" - required: true - responses: - "201": - description: Registered ontology successfully - content: - application/json: - schema: - $ref: "#/components/schemas/OntologyDto" - security: - - bearerAuth: [] - - basicAuth: [] - /api/message: - get: - tags: - - message-endpoint - summary: List messages - description: "Lists messages known to the metadata database. Messages can be\ - \ filtered be filtered with the optional `active` parameter. If set to *true*,\ - \ only active messages (that is, messages whose end time has not been reached)\ - \ will be returned. Otherwise only inactive messages are returned. If not\ - \ set, active and inactive messages are returned." - operationId: list_2 - parameters: - - name: active - in: query - required: false - schema: - type: boolean - responses: - "200": - description: List messages - content: - application/json: - schema: - type: array - items: - $ref: "#/components/schemas/BannerMessageDto" - post: - tags: - - message-endpoint - summary: Create message - description: Creates a message in the metadata database. Requires role `create-maintenance-message`. - operationId: create_3 - requestBody: - content: - application/json: - schema: - $ref: "#/components/schemas/BannerMessageCreateDto" - required: true - responses: - "201": - description: Created message - content: - application/json: - schema: - $ref: "#/components/schemas/BannerMessageBriefDto" - security: - - bearerAuth: [] - - basicAuth: [] - /api/image: - get: - tags: - - image-endpoint - summary: List images - description: Lists all container images known to the metadata database. - operationId: findAll_1 - responses: - "200": - description: List images - content: - application/json: - schema: - type: array - items: - $ref: "#/components/schemas/ImageBriefDto" - post: - tags: - - image-endpoint - summary: Create image - description: Creates a container image in the metadata database. Requires role - `create-image`. - operationId: create_4 - requestBody: - content: - application/json: - schema: - $ref: "#/components/schemas/ImageCreateDto" - required: true - responses: - "201": - description: Created image - content: - application/json: - schema: - $ref: "#/components/schemas/ImageDto" - "400": - description: Image specification is invalid - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "409": - description: Image already exists - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - security: - - bearerAuth: [] - - basicAuth: [] - /api/identifier: - get: - tags: - - identifier-endpoint - summary: List identifiers - description: Lists all identifiers known to the metadata database - operationId: findAll_2 - parameters: - - name: type - in: query - required: false - schema: - type: string - enum: - - database - - subset - - table - - view - - name: status - in: query - required: false - schema: - type: string - enum: - - draft - - published - - name: dbid - in: query - required: false - schema: - type: string - format: uuid - - name: qid - in: query - required: false - schema: - type: string - format: uuid - - name: vid - in: query - required: false - schema: - type: string - format: uuid - - name: tid - in: query - required: false - schema: - type: string - format: uuid - - name: Accept - in: header - required: true - schema: - type: string - responses: - "200": - description: Found identifiers successfully - content: - application/json: - schema: - type: array - items: - type: array - items: - $ref: "#/components/schemas/IdentifierBriefDto" - application/ld+json: - schema: - type: array - items: - $ref: "#/components/schemas/LdDatasetDto" - post: - tags: - - identifier-endpoint - summary: Create identifier - description: Create an identifier with id to create a draft identifier. Identifiers - can only be created for objects the user has at least *READ* access in the - associated database (requires role `create-identifier`) or for any object - in any database (requires role `create-foreign-identifier`). - operationId: create_5 - requestBody: - content: - application/json: - schema: - $ref: "#/components/schemas/CreateIdentifierDto" - required: true - responses: - "201": - description: Drafted identifier - content: - application/json: - schema: - $ref: "#/components/schemas/IdentifierDto" - "400": - description: Identifier form contains invalid request data - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "403": - description: Insufficient access rights or authorities - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "404": - description: "Failed to find database, table or view" - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "502": - description: Connection to search service failed - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "503": - description: Failed to save in search service - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - security: - - bearerAuth: [] - - basicAuth: [] - /api/database/{databaseId}/view: - get: - tags: - - view-endpoint - summary: List views - description: Lists views known to the metadata database. - operationId: findAll_3 - parameters: - - name: databaseId - in: path - required: true - schema: - type: string - format: uuid - responses: - "200": - description: Find views successfully - content: - application/json: - schema: - type: array - items: - $ref: "#/components/schemas/ViewBriefDto" - "404": - description: Database or user could not be found - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - security: - - bearerAuth: [] - - basicAuth: [] - post: - tags: - - view-endpoint - summary: Create view - description: Creates a view. This can only be performed by the database owner. - Requires role `create-database-view`. - operationId: create_6 - parameters: - - name: databaseId - in: path - required: true - schema: - type: string - format: uuid - requestBody: - content: - application/json: - schema: - $ref: "#/components/schemas/CreateViewDto" - required: true - responses: - "201": - description: Create view successfully - content: - application/json: - schema: - $ref: "#/components/schemas/ViewBriefDto" - "400": - description: Create view query is malformed - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "403": - description: Credentials missing - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "404": - description: Failed to find database/user in metadata database. - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "409": - description: View exists with name - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "423": - description: Create view resulted in an invalid query statement - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "502": - description: Connection to search service failed - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "503": - description: Failed to save in search service - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - security: - - bearerAuth: [] - - basicAuth: [] - /api/database/{databaseId}/table: - get: - tags: - - table-endpoint - summary: List tables - description: "Lists all tables known to the metadata database. When a database\ - \ has a hidden schema (i.e. when `is_schema_public` is `false`), then the\ - \ user needs to have at least read access and the role `list-tables`." - operationId: list_3 - parameters: - - name: databaseId - in: path - required: true - schema: - type: string - format: uuid - responses: - "200": - description: List tables - content: - application/json: - schema: - type: array - items: - $ref: "#/components/schemas/TableBriefDto" - "403": - description: List tables not permitted - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "404": - description: Database could not be found - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - security: - - bearerAuth: [] - - basicAuth: [] - post: - tags: - - table-endpoint - summary: Create table - description: Creates a table in the database with id. Requires role `create-table`. - operationId: create_7 - parameters: - - name: databaseId - in: path - required: true - schema: - type: string - format: uuid - requestBody: - content: - application/json: - schema: - $ref: "#/components/schemas/CreateTableDto" - required: true - responses: - "201": - description: Created a new table - content: - application/json: - schema: - $ref: "#/components/schemas/TableBriefDto" - "400": - description: Create table query is malformed - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "403": - description: Create table not permitted - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "404": - description: "Database, container or user could not be found" - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "409": - description: Create table conflicts with existing table name - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "502": - description: Connection to search service failed - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "503": - description: Failed to save in search service - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - security: - - bearerAuth: [] - - basicAuth: [] - /api/container: - get: - tags: - - container-endpoint - summary: List containers - description: List all containers in the metadata database. - operationId: findAll_4 - parameters: - - name: limit - in: query - required: false - schema: - type: integer - format: int32 - responses: - "200": - description: List containers - content: - application/json: - schema: - type: array - items: - $ref: "#/components/schemas/ContainerBriefDto" - post: - tags: - - container-endpoint - summary: Create container - description: Creates a container in the metadata database. Requires role `create-container`. - operationId: create_8 - requestBody: - content: - application/json: - schema: - $ref: "#/components/schemas/CreateContainerDto" - required: true - responses: - "201": - description: Created a new container - content: - application/json: - schema: - $ref: "#/components/schemas/ContainerDto" - "400": - description: Container payload malformed - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "403": - description: "Create container not permitted, need authority `create-container`" - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "404": - description: Container image or user could not be found - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "409": - description: Container name already exists - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - security: - - bearerAuth: [] - - basicAuth: [] - /api/user: - get: - tags: - - user-endpoint - summary: List users - description: "Lists users known to the metadata database. Internal users are\ - \ omitted from the result list. If the optional query parameter `username`\ - \ is present, the result list can be filtered by matching this exact username." - operationId: findAll_5 - parameters: - - name: username - in: query - required: false - schema: - type: string - responses: - "200": - description: List users - content: - application/json: - schema: - type: array - items: - $ref: "#/components/schemas/UserBriefDto" - /api/unit: - get: - tags: - - unit-endpoint - summary: List units - description: Lists units known to the metadata database. - operationId: findAll_6 - responses: - "200": - description: Find all semantic units - content: - application/json: - schema: - type: array - items: - $ref: "#/components/schemas/UnitDto" - /api/ontology/{ontologyId}/entity: - get: - tags: - - ontology-endpoint - summary: Find entities - description: Finds semantic entities by label or uri in an ontology with id. - Requires role `execute-semantic-query`. - operationId: find_7 - parameters: - - name: ontologyId - in: path - required: true - schema: - type: string - format: uuid - - name: label - in: query - required: false - schema: - type: string - - name: uri - in: query - required: false - schema: - type: string - responses: - "200": - description: Found entities - content: - application/json: - schema: - type: array - items: - $ref: "#/components/schemas/EntityDto" - "400": - description: Filter params are invalid - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "404": - description: Could not find ontology - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "417": - description: Generated query or uri is malformed - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "422": - description: Ontology does not have rdf or sparql endpoint - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - security: - - bearerAuth: [] - - basicAuth: [] - /api/oai: - get: - tags: - - metadata-endpoint - summary: Get record - operationId: identify - parameters: - - name: verb - in: query - - name: parameters - in: query - required: true - schema: - $ref: "#/components/schemas/OaiListIdentifiersParameters" - responses: - "200": - description: List containers - content: - text/xml: - schema: - type: string - /api/message/message/{messageId}: - get: - tags: - - message-endpoint - summary: Find message - description: Finds a message with id in the metadata database. - operationId: find_8 - parameters: - - name: messageId - in: path - required: true - schema: - type: string - format: uuid - responses: - "200": - description: Get messages - content: - application/json: - schema: - $ref: "#/components/schemas/BannerMessageDto" - "404": - description: Could not find message - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - /api/license: - get: - tags: - - license-endpoint - summary: List licenses - description: Lists licenses known to the metadata database. - operationId: list_4 - responses: - "200": - description: List of licenses - content: - application/json: - schema: - type: array - items: - $ref: "#/components/schemas/LicenseDto" - /api/identifier/retrieve: - get: - tags: - - identifier-endpoint - summary: Retrieve PID metadata - description: "Retrieves Persistent Identifier (PID) metadata from external endpoints.\ - \ Supported PIDs are: ORCID, ROR, DOI." - operationId: retrieve - parameters: - - name: url - in: query - required: true - schema: - type: string - responses: - "200": - description: Retrieved metadata from identifier - content: - application/json: - schema: - $ref: "#/components/schemas/IdentifierDto" - "404": - description: Failed to find metadata for identifier - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - /api/database/{databaseId}: - get: - tags: - - database-endpoint - summary: Find database - description: Finds a database with id. - operationId: findById_2 - parameters: - - name: databaseId - in: path - required: true - schema: - type: string - format: uuid - responses: - "200": - description: Database found successfully - headers: - X-Username: - description: The authentication username - style: simple - schema: - type: string - Access-Control-Expose-Headers: - description: Expose custom headers - style: simple - schema: - type: string - X-Password: - description: The authentication password - style: simple - schema: - type: string - content: - application/json: - schema: - $ref: "#/components/schemas/DatabaseBriefDto" - "403": - description: Not allowed to view database - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "404": - description: Database could not be found - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - security: - - bearerAuth: [] - - basicAuth: [] - /api/database/{databaseId}/table/{tableId}/suggest: - get: - tags: - - table-endpoint - summary: Suggest semantics - description: Suggests semantic concepts for a table. This action can only be - performed by the table owner. Requires role `table-semantic-analyse`. - operationId: analyseTable - parameters: - - name: databaseId - in: path - required: true - schema: - type: string - format: uuid - - name: tableId - in: path - required: true - schema: - type: string - format: uuid - responses: - "200": - description: Suggested table semantics successfully - content: - application/json: - schema: - type: array - items: - $ref: "#/components/schemas/EntityDto" - "400": - description: Failed to parse statistic in search service - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "403": - description: Not the table owner. - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "404": - description: Failed to find database/table in metadata database - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "417": - description: Generated query is malformed - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "422": - description: Ontology does not have rdf or sparql endpoint - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - security: - - bearerAuth: [] - - basicAuth: [] - /api/database/{databaseId}/table/{tableId}/column/{columnId}/suggest: - get: - tags: - - table-endpoint - summary: Suggest semantics - description: Suggests column semantics. Requires role `table-semantic-analyse`. - operationId: analyseTableColumn - parameters: - - name: databaseId - in: path - required: true - schema: - type: string - format: uuid - - name: tableId - in: path - required: true - schema: - type: string - format: uuid - - name: columnId - in: path - required: true - schema: - type: string - format: uuid - responses: - "200": - description: Suggested table column semantics successfully - content: - application/json: - schema: - type: array - items: - $ref: "#/components/schemas/TableColumnEntityDto" - "400": - description: Generated query is malformed - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "404": - description: Failed to find database/table in metadata database - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "422": - description: Ontology does not have rdf or sparql endpoint - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - security: - - bearerAuth: [] - - basicAuth: [] - /api/container/{containerId}: - get: - tags: - - container-endpoint - summary: Find container - description: Finds a container in the metadata database. - operationId: findById_3 - parameters: - - name: containerId - in: path - required: true - schema: - type: string - format: uuid - responses: - "200": - description: Found container - content: - application/json: - schema: - $ref: "#/components/schemas/ContainerDto" - "404": - description: Container image could not be found - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - delete: - tags: - - container-endpoint - summary: Delete container - description: Deletes a container in the metadata database. Requires role `delete-container`. - operationId: delete_6 - parameters: - - name: containerId - in: path - required: true - schema: - type: string - format: uuid - responses: - "202": - description: Deleted container - "403": - description: "Create container not permitted, need authority `delete-container`" - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - "404": - description: Container not found - content: - application/json: - schema: - $ref: "#/components/schemas/ApiErrorDto" - security: - - bearerAuth: [] - - basicAuth: [] - /api/concept: - get: - tags: - - concept-endpoint - summary: List concepts - description: List all semantic concepts known to the metadata database - operationId: findAll_7 - responses: - "200": - description: List concepts - content: - application/json: - schema: - type: array - items: - $ref: "#/components/schemas/ConceptDto" -components: - schemas: - UserAttributesDto: - type: object - properties: - theme: - type: string - example: light - orcid: - type: string - example: https://orcid.org/0000-0002-1825-0097 - affiliation: - type: string - example: Brown University - language: - type: string - example: en - required: - - language - - theme - UserDto: - type: object - properties: - id: - type: string - format: uuid - example: 1ffc7b0e-9aeb-4e8b-b8f1-68f3936155b4 - name: - type: string - example: Josiah Carberry - username: - type: string - example: username - password: - type: string - example: p4ssw0rd - attributes: - $ref: "#/components/schemas/UserAttributesDto" - last_retrieved: - type: string - format: date-time - example: 2025-01-23T12:09:01 - qualified_name: - type: string - example: Josiah Carberry — @jcarberry - given_name: - type: string - example: Josiah - family_name: - type: string - example: Carberry - required: - - attributes - - id - - password - - username - ApiErrorDto: - type: object - properties: - status: - type: string - enum: - - 100 CONTINUE - - 101 SWITCHING_PROTOCOLS - - 102 PROCESSING - - 103 EARLY_HINTS - - 103 CHECKPOINT - - 200 OK - - 201 CREATED - - 202 ACCEPTED - - 203 NON_AUTHORITATIVE_INFORMATION - - 204 NO_CONTENT - - 205 RESET_CONTENT - - 206 PARTIAL_CONTENT - - 207 MULTI_STATUS - - 208 ALREADY_REPORTED - - 226 IM_USED - - 300 MULTIPLE_CHOICES - - 301 MOVED_PERMANENTLY - - 302 FOUND - - 302 MOVED_TEMPORARILY - - 303 SEE_OTHER - - 304 NOT_MODIFIED - - 305 USE_PROXY - - 307 TEMPORARY_REDIRECT - - 308 PERMANENT_REDIRECT - - 400 BAD_REQUEST - - 401 UNAUTHORIZED - - 402 PAYMENT_REQUIRED - - 403 FORBIDDEN - - 404 NOT_FOUND - - 405 METHOD_NOT_ALLOWED - - 406 NOT_ACCEPTABLE - - 407 PROXY_AUTHENTICATION_REQUIRED - - 408 REQUEST_TIMEOUT - - 409 CONFLICT - - 410 GONE - - 411 LENGTH_REQUIRED - - 412 PRECONDITION_FAILED - - 413 PAYLOAD_TOO_LARGE - - 413 REQUEST_ENTITY_TOO_LARGE - - 414 URI_TOO_LONG - - 414 REQUEST_URI_TOO_LONG - - 415 UNSUPPORTED_MEDIA_TYPE - - 416 REQUESTED_RANGE_NOT_SATISFIABLE - - 417 EXPECTATION_FAILED - - 418 I_AM_A_TEAPOT - - 419 INSUFFICIENT_SPACE_ON_RESOURCE - - 420 METHOD_FAILURE - - 421 DESTINATION_LOCKED - - 422 UNPROCESSABLE_ENTITY - - 423 LOCKED - - 424 FAILED_DEPENDENCY - - 425 TOO_EARLY - - 426 UPGRADE_REQUIRED - - 428 PRECONDITION_REQUIRED - - 429 TOO_MANY_REQUESTS - - 431 REQUEST_HEADER_FIELDS_TOO_LARGE - - 451 UNAVAILABLE_FOR_LEGAL_REASONS - - 500 INTERNAL_SERVER_ERROR - - 501 NOT_IMPLEMENTED - - 502 BAD_GATEWAY - - 503 SERVICE_UNAVAILABLE - - 504 GATEWAY_TIMEOUT - - 505 HTTP_VERSION_NOT_SUPPORTED - - 506 VARIANT_ALSO_NEGOTIATES - - 507 INSUFFICIENT_STORAGE - - 508 LOOP_DETECTED - - 509 BANDWIDTH_LIMIT_EXCEEDED - - 510 NOT_EXTENDED - - 511 NETWORK_AUTHENTICATION_REQUIRED - example: NOT_FOUND - message: - type: string - example: Error message - code: - type: string - example: error.service.code - required: - - code - - message - - status - CreatorBriefDto: - type: object - properties: - id: - type: string - format: uuid - example: e41f94a6-2b94-4a12-ac0e-678684e1c070 - affiliation: - type: string - example: Brown University - creator_name: - type: string - example: "Carberry, Josiah" - name_type: - type: string - enum: - - Personal - - Organizational - example: Personal - name_identifier: - type: string - example: 0000-0002-1825-0097 - name_identifier_scheme: - type: string - enum: - - ORCID - - ROR - - ISNI - - GRID - example: ORCID - affiliation_identifier: - type: string - example: https://ror.org/05gq02987 - affiliation_identifier_scheme: - type: string - enum: - - ROR - - GRID - - ISNI - example: ROR - required: - - creator_name - - id - DatabaseBriefDto: - type: object - properties: - id: - type: string - format: uuid - example: fc29f89c-86a8-4020-9e36-4d954736c6cc - name: - type: string - example: Air Quality - description: - type: string - example: Air Quality - identifiers: - type: array - items: - $ref: "#/components/schemas/IdentifierBriefDto" - contact: - $ref: "#/components/schemas/UserBriefDto" - internal_name: - type: string - example: air_quality - is_public: - type: boolean - example: true - is_schema_public: - type: boolean - example: true - owner_id: - type: string - format: uuid - example: 2f45ef7a-7f9b-4667-9156-152c87fe1ca5 - preview_image: - type: string - required: - - contact - - id - - identifiers - - internal_name - - is_public - - is_schema_public - - name - - owner_id - IdentifierBriefDto: - type: object - properties: - id: - type: string - format: uuid - example: b97cd56b-66ca-4354-9e6c-f47210cfaaec - type: - type: string - enum: - - database - - subset - - table - - view - example: database - creators: - type: array - items: - $ref: "#/components/schemas/CreatorBriefDto" - titles: - type: array - items: - $ref: "#/components/schemas/IdentifierTitleDto" - descriptions: - type: array - items: - $ref: "#/components/schemas/IdentifierDescriptionDto" - doi: - type: string - example: 10.1038/nphys1170 - publisher: - type: string - example: TU Wien - status: - type: string - enum: - - draft - - published - example: draft - database_id: - type: string - format: uuid - example: fc29f89c-86a8-4020-9e36-4d954736c6cc - query_id: - type: string - format: uuid - example: 1 - table_id: - type: string - format: uuid - example: 1 - view_id: - type: string - format: uuid - example: 1 - publication_year: - type: integer - format: int32 - example: 2022 - owned_by: - type: string - format: uuid - example: 2f45ef7a-7f9b-4667-9156-152c87fe1ca5 - required: - - creators - - database_id - - descriptions - - id - - owned_by - - publication_year - - publisher - - status - - titles - - type - IdentifierDescriptionDto: - type: object - properties: - id: - type: string - format: uuid - example: e0e9692c-910b-4b60-b53a-fc7c358a917d - description: - type: string - example: "Air quality reports at Stephansplatz, Vienna" - language: - type: string - enum: - - ab - - aa - - af - - ak - - sq - - am - - ar - - an - - hy - - as - - av - - ae - - ay - - az - - bm - - ba - - eu - - be - - bn - - bh - - bi - - bs - - br - - bg - - my - - ca - - km - - ch - - ce - - ny - - zh - - cu - - cv - - kw - - co - - cr - - hr - - cs - - da - - dv - - nl - - dz - - en - - eo - - et - - ee - - fo - - fj - - fi - - fr - - ff - - gd - - gl - - lg - - ka - - de - - ki - - el - - kl - - gn - - gu - - ht - - ha - - he - - hz - - hi - - ho - - hu - - is - - io - - ig - - id - - ia - - ie - - iu - - ik - - ga - - it - - ja - - jv - - kn - - kr - - ks - - kk - - rw - - kv - - kg - - ko - - kj - - ku - - ky - - lo - - la - - lv - - lb - - li - - ln - - lt - - lu - - mk - - mg - - ms - - ml - - mt - - gv - - mi - - mr - - mh - - ro - - mn - - na - - nv - - nd - - ng - - ne - - se - - "no" - - nb - - nn - - ii - - oc - - oj - - or - - om - - os - - pi - - pa - - ps - - fa - - pl - - pt - - qu - - rm - - rn - - ru - - sm - - sg - - sa - - sc - - sr - - sn - - sd - - si - - sk - - sl - - so - - st - - nr - - es - - su - - sw - - ss - - sv - - tl - - ty - - tg - - ta - - tt - - te - - th - - bo - - ti - - to - - ts - - tn - - tr - - tk - - tw - - ug - - uk - - ur - - uz - - ve - - vi - - vo - - wa - - cy - - fy - - wo - - xh - - yi - - yo - - za - - zu - example: en - type: - type: string - enum: - - Abstract - - Methods - - SeriesInformation - - TableOfContents - - TechnicalInfo - - Other - example: Abstract - required: - - id - IdentifierTitleDto: - type: object - properties: - id: - type: string - format: uuid - example: 70ce5164-fd74-413f-8712-f996b91defbf - title: - type: string - example: Airquality Demonstrator - language: - type: string - enum: - - ab - - aa - - af - - ak - - sq - - am - - ar - - an - - hy - - as - - av - - ae - - ay - - az - - bm - - ba - - eu - - be - - bn - - bh - - bi - - bs - - br - - bg - - my - - ca - - km - - ch - - ce - - ny - - zh - - cu - - cv - - kw - - co - - cr - - hr - - cs - - da - - dv - - nl - - dz - - en - - eo - - et - - ee - - fo - - fj - - fi - - fr - - ff - - gd - - gl - - lg - - ka - - de - - ki - - el - - kl - - gn - - gu - - ht - - ha - - he - - hz - - hi - - ho - - hu - - is - - io - - ig - - id - - ia - - ie - - iu - - ik - - ga - - it - - ja - - jv - - kn - - kr - - ks - - kk - - rw - - kv - - kg - - ko - - kj - - ku - - ky - - lo - - la - - lv - - lb - - li - - ln - - lt - - lu - - mk - - mg - - ms - - ml - - mt - - gv - - mi - - mr - - mh - - ro - - mn - - na - - nv - - nd - - ng - - ne - - se - - "no" - - nb - - nn - - ii - - oc - - oj - - or - - om - - os - - pi - - pa - - ps - - fa - - pl - - pt - - qu - - rm - - rn - - ru - - sm - - sg - - sa - - sc - - sr - - sn - - sd - - si - - sk - - sl - - so - - st - - nr - - es - - su - - sw - - ss - - sv - - tl - - ty - - tg - - ta - - tt - - te - - th - - bo - - ti - - to - - ts - - tn - - tr - - tk - - tw - - ug - - uk - - ur - - uz - - ve - - vi - - vo - - wa - - cy - - fy - - wo - - xh - - yi - - yo - - za - - zu - example: en - type: - type: string - enum: - - AlternativeTitle - - Subtitle - - TranslatedTitle - - Other - required: - - id - UserBriefDto: - type: object - properties: - id: - type: string - format: uuid - example: 1ffc7b0e-9aeb-4e8b-b8f1-68f3936155b4 - username: - type: string - description: Only contains lowercase characters - example: jcarberry - name: - type: string - example: Josiah Carberry - orcid: - type: string - example: 0000-0002-1825-0097 - qualified_name: - type: string - example: Josiah Carberry — @jcarberry - given_name: - type: string - example: Josiah - family_name: - type: string - example: Carberry - required: - - id - - username - DatabaseAccessDto: - type: object - properties: - user: - $ref: "#/components/schemas/UserBriefDto" - type: - type: string - enum: - - read - - write_own - - write_all - example: read - required: - - type - - user - UserUpdateDto: - type: object - properties: - firstname: - type: string - example: Josiah - lastname: - type: string - example: Carberry - affiliation: - type: string - example: Brown University - orcid: - type: string - example: 0000-0002-1825-0097 - theme: - type: string - example: dark - language: - type: string - example: en - required: - - language - - theme - OntologyModifyDto: - type: object - properties: - uri: - type: string - example: Ontology URI - prefix: - type: string - example: Ontology prefix - sparql_endpoint: - type: string - example: Ontology SPARQL endpoint - rdf_path: - type: string - example: rdf/om-2.0.rdf - required: - - prefix - - uri - OntologyDto: - type: object - properties: - id: - type: string - format: uuid - example: 7c491e40-082a-47b8-b82c-51d03c520466 - uri: - type: string - example: http://www.wikidata.org/ - prefix: - type: string - example: wd - sparql: - type: boolean - example: true - rdf: - type: boolean - example: false - uri_pattern: - type: string - example: http://www.wikidata.org/entity/.* - sparql_endpoint: - type: string - example: https://query.wikidata.org/sparql - rdf_path: - type: string - example: rdf/om-2.0.rdf - required: - - id - - prefix - - rdf - - sparql - - uri - BannerMessageUpdateDto: - type: object - properties: - type: - type: string - enum: - - error - - warning - - info - message: - type: string - example: Maintenance starts on 8am on Monday - link: - type: string - example: https://example.com - link_text: - type: string - example: More - display_start: - type: string - format: date-time - example: 2021-03-12T15:26:21Z - display_end: - type: string - format: date-time - example: 2021-03-12T15:26:21Z - required: - - message - - type - BannerMessageBriefDto: - type: object - properties: - type: - type: string - enum: - - error - - warning - - info - message: - type: string - example: Maintenance starts on 8am on Monday - link: - type: string - example: https://example.com - link_text: - type: string - example: More - required: - - message - - type - ImageChangeDto: - type: object - properties: - registry: - type: string - example: docker.io/library - defaultPort: - type: integer - format: int32 - example: 5432 - maximum: 65535 - minimum: 1024 - dialect: - type: string - example: Postgres - driver_class: - type: string - example: org.postgresql.Driver - jdbc_method: - type: string - example: postgresql - required: - - dialect - - driver_class - - jdbc_method - - registry - DataTypeDto: - type: object - properties: - id: - type: string - format: uuid - example: 816f55d5-1098-4f60-a4af-c8121c04dcca - value: - type: string - example: time - documentation: - type: string - example: https://mariadb.com/kb/en/time/ - display_name: - type: string - example: TIME(fsp) - size_min: - type: integer - format: int32 - example: 0 - size_max: - type: integer - format: int32 - example: 6 - size_default: - type: integer - format: int32 - example: 0 - size_required: - type: boolean - example: false - d_min: - type: integer - format: int32 - d_max: - type: integer - format: int32 - d_default: - type: integer - format: int32 - d_required: - type: boolean - data_hint: - type: string - example: "e.g. HH:MM:SS, HH:MM, HHMMSS, H:M:S" - type_hint: - type: string - example: "fsp=microsecond precision, min. 0, max. 6" - is_quoted: - type: boolean - description: frontend needs to quote this data type - example: false - is_buildable: - type: boolean - description: frontend can build this data type - example: true - required: - - display_name - - documentation - - id - - is_buildable - - is_quoted - - value - ImageDto: - type: object - properties: - id: - type: string - format: uuid - example: 816f55d5-1098-4f60-a4af-c8121c04dcce - name: - type: string - example: mariadb - version: - type: string - example: 10.5 - operators: - type: array - items: - $ref: "#/components/schemas/OperatorDto" - default: - type: boolean - example: false - data_types: - type: array - items: - $ref: "#/components/schemas/DataTypeDto" - required: - - data_types - - default - - id - - name - - operators - - version - OperatorDto: - type: object - properties: - id: - type: string - format: uuid - example: 816f55d5-1098-4f60-a4af-c8121c04dccf - value: - type: string - example: XOR - documentation: - type: string - example: https://mariadb.com/kb/en/xor/ - display_name: - type: string - example: XOR - required: - - display_name - - documentation - - id - - value - IdentifierSaveDto: - type: object - properties: - id: - type: string - format: uuid - example: 68e11675-1e0f-4d24-a6d9-887ad1c4445d - type: - type: string - enum: - - database - - subset - - table - - view - example: database - doi: - type: string - example: 10.1111/11111111 - titles: - type: array - items: - $ref: "#/components/schemas/SaveIdentifierTitleDto" - descriptions: - type: array - items: - $ref: "#/components/schemas/SaveIdentifierDescriptionDto" - funders: - type: array - items: - $ref: "#/components/schemas/SaveIdentifierFunderDto" - licenses: - type: array - items: - $ref: "#/components/schemas/LicenseDto" - publisher: - type: string - example: TU Wien - language: - type: string - enum: - - ab - - aa - - af - - ak - - sq - - am - - ar - - an - - hy - - as - - av - - ae - - ay - - az - - bm - - ba - - eu - - be - - bn - - bh - - bi - - bs - - br - - bg - - my - - ca - - km - - ch - - ce - - ny - - zh - - cu - - cv - - kw - - co - - cr - - hr - - cs - - da - - dv - - nl - - dz - - en - - eo - - et - - ee - - fo - - fj - - fi - - fr - - ff - - gd - - gl - - lg - - ka - - de - - ki - - el - - kl - - gn - - gu - - ht - - ha - - he - - hz - - hi - - ho - - hu - - is - - io - - ig - - id - - ia - - ie - - iu - - ik - - ga - - it - - ja - - jv - - kn - - kr - - ks - - kk - - rw - - kv - - kg - - ko - - kj - - ku - - ky - - lo - - la - - lv - - lb - - li - - ln - - lt - - lu - - mk - - mg - - ms - - ml - - mt - - gv - - mi - - mr - - mh - - ro - - mn - - na - - nv - - nd - - ng - - ne - - se - - "no" - - nb - - nn - - ii - - oc - - oj - - or - - om - - os - - pi - - pa - - ps - - fa - - pl - - pt - - qu - - rm - - rn - - ru - - sm - - sg - - sa - - sc - - sr - - sn - - sd - - si - - sk - - sl - - so - - st - - nr - - es - - su - - sw - - ss - - sv - - tl - - ty - - tg - - ta - - tt - - te - - th - - bo - - ti - - to - - ts - - tn - - tr - - tk - - tw - - ug - - uk - - ur - - uz - - ve - - vi - - vo - - wa - - cy - - fy - - wo - - xh - - yi - - yo - - za - - zu - creators: - type: array - items: - $ref: "#/components/schemas/SaveIdentifierCreatorDto" - database_id: - type: string - format: uuid - example: null - query_id: - type: string - format: uuid - example: null - view_id: - type: string - format: uuid - example: null - table_id: - type: string - format: uuid - example: null - publication_day: - type: integer - format: int32 - example: 15 - publication_month: - type: integer - format: int32 - example: 12 - publication_year: - type: integer - format: int32 - example: 2022 - related_identifiers: - type: array - items: - $ref: "#/components/schemas/SaveRelatedIdentifierDto" - required: - - creators - - database_id - - id - - publication_year - - publisher - - titles - - type - LicenseDto: - type: object - properties: - identifier: - type: string - example: MIT - uri: - type: string - example: https://opensource.org/licenses/MIT - description: - type: string - example: "A short and simple permissive license with conditions only requiring\ - \ preservation of copyright and license notices. Licensed works, modifications,\ - \ and larger works may be distributed under different terms and without\ - \ source code." - required: - - identifier - - uri - SaveIdentifierCreatorDto: - type: object - properties: - id: - type: string - format: uuid - example: da9dd034-00a8-4517-b93d-d1b2adfee418 - firstname: - type: string - example: Josiah - lastname: - type: string - example: Carberry - affiliation: - type: string - example: Wesleyan University - creator_name: - type: string - example: "Carberry, Josiah" - name_type: - type: string - enum: - - Personal - - Organizational - example: Personal - name_identifier: - type: string - example: 0000-0002-1825-0097 - name_identifier_scheme: - type: string - enum: - - ORCID - - ROR - - ISNI - - GRID - example: ORCID - affiliation_identifier: - type: string - example: https://ror.org/04d836q62 - affiliation_identifier_scheme: - type: string - enum: - - ROR - - GRID - - ISNI - example: ROR - required: - - creator_name - - id - SaveIdentifierDescriptionDto: - type: object - properties: - id: - type: string - format: uuid - example: 35bd84d8-b181-43c8-b786-4d024e4f843c - description: - type: string - example: "Air quality reports at Stephansplatz, Vienna" - language: - type: string - enum: - - ab - - aa - - af - - ak - - sq - - am - - ar - - an - - hy - - as - - av - - ae - - ay - - az - - bm - - ba - - eu - - be - - bn - - bh - - bi - - bs - - br - - bg - - my - - ca - - km - - ch - - ce - - ny - - zh - - cu - - cv - - kw - - co - - cr - - hr - - cs - - da - - dv - - nl - - dz - - en - - eo - - et - - ee - - fo - - fj - - fi - - fr - - ff - - gd - - gl - - lg - - ka - - de - - ki - - el - - kl - - gn - - gu - - ht - - ha - - he - - hz - - hi - - ho - - hu - - is - - io - - ig - - id - - ia - - ie - - iu - - ik - - ga - - it - - ja - - jv - - kn - - kr - - ks - - kk - - rw - - kv - - kg - - ko - - kj - - ku - - ky - - lo - - la - - lv - - lb - - li - - ln - - lt - - lu - - mk - - mg - - ms - - ml - - mt - - gv - - mi - - mr - - mh - - ro - - mn - - na - - nv - - nd - - ng - - ne - - se - - "no" - - nb - - nn - - ii - - oc - - oj - - or - - om - - os - - pi - - pa - - ps - - fa - - pl - - pt - - qu - - rm - - rn - - ru - - sm - - sg - - sa - - sc - - sr - - sn - - sd - - si - - sk - - sl - - so - - st - - nr - - es - - su - - sw - - ss - - sv - - tl - - ty - - tg - - ta - - tt - - te - - th - - bo - - ti - - to - - ts - - tn - - tr - - tk - - tw - - ug - - uk - - ur - - uz - - ve - - vi - - vo - - wa - - cy - - fy - - wo - - xh - - yi - - yo - - za - - zu - example: en - type: - type: string - enum: - - Abstract - - Methods - - SeriesInformation - - TableOfContents - - TechnicalInfo - - Other - example: Abstract - required: - - description - - id - SaveIdentifierFunderDto: - type: object - properties: - id: - type: string - format: uuid - example: 1c6b9212-a315-44b9-946c-3682a7a0e517 - funder_name: - type: string - example: European Commission - funder_identifier: - type: string - example: http://doi.org/10.13039/501100000780 - funder_identifier_type: - type: string - enum: - - Crossref Funder ID - - ROR - - GND - - ISNI - - Other - example: Crossref Funder ID - scheme_uri: - type: string - example: http://doi.org/ - award_number: - type: string - example: 824087 - award_title: - type: string - example: EOSC-Life - required: - - funder_name - - id - SaveIdentifierTitleDto: - type: object - properties: - id: - type: string - format: uuid - example: 2af9f40e-eaf5-4ea1-861a-1a696587bf29 - title: - type: string - example: Airquality Demonstrator - language: - type: string - enum: - - ab - - aa - - af - - ak - - sq - - am - - ar - - an - - hy - - as - - av - - ae - - ay - - az - - bm - - ba - - eu - - be - - bn - - bh - - bi - - bs - - br - - bg - - my - - ca - - km - - ch - - ce - - ny - - zh - - cu - - cv - - kw - - co - - cr - - hr - - cs - - da - - dv - - nl - - dz - - en - - eo - - et - - ee - - fo - - fj - - fi - - fr - - ff - - gd - - gl - - lg - - ka - - de - - ki - - el - - kl - - gn - - gu - - ht - - ha - - he - - hz - - hi - - ho - - hu - - is - - io - - ig - - id - - ia - - ie - - iu - - ik - - ga - - it - - ja - - jv - - kn - - kr - - ks - - kk - - rw - - kv - - kg - - ko - - kj - - ku - - ky - - lo - - la - - lv - - lb - - li - - ln - - lt - - lu - - mk - - mg - - ms - - ml - - mt - - gv - - mi - - mr - - mh - - ro - - mn - - na - - nv - - nd - - ng - - ne - - se - - "no" - - nb - - nn - - ii - - oc - - oj - - or - - om - - os - - pi - - pa - - ps - - fa - - pl - - pt - - qu - - rm - - rn - - ru - - sm - - sg - - sa - - sc - - sr - - sn - - sd - - si - - sk - - sl - - so - - st - - nr - - es - - su - - sw - - ss - - sv - - tl - - ty - - tg - - ta - - tt - - te - - th - - bo - - ti - - to - - ts - - tn - - tr - - tk - - tw - - ug - - uk - - ur - - uz - - ve - - vi - - vo - - wa - - cy - - fy - - wo - - xh - - yi - - yo - - za - - zu - example: en - type: - type: string - enum: - - AlternativeTitle - - Subtitle - - TranslatedTitle - - Other - example: Subtitle - required: - - id - - title - SaveRelatedIdentifierDto: - type: object - properties: - id: - type: string - format: uuid - example: 5bb272c7-7421-4f74-83ac-0486812d0f44 - value: - type: string - example: 10.70124/dc4zh-9ce78 - type: - type: string - enum: - - DOI - - URL - - URN - - ARK - - arXiv - - bibcode - - EAN13 - - EISSN - - Handle - - IGSN - - ISBN - - ISTC - - LISSN - - LSID - - PMID - - PURL - - UPC - - w3id - example: DOI - relation: - type: string - enum: - - IsCitedBy - - Cites - - IsSupplementTo - - IsSupplementedBy - - IsContinuedBy - - Continues - - IsDescribedBy - - Describes - - HasMetadata - - IsMetadataFor - - HasVersion - - IsVersionOf - - IsNewVersionOf - - IsPreviousVersionOf - - IsPartOf - - HasPart - - IsPublishedIn - - IsReferencedBy - - References - - IsDocumentedBy - - Documents - - IsCompiledBy - - Compiles - - IsVariantFormOf - - IsOriginalFormOf - - IsIdenticalTo - - IsReviewedBy - - Reviews - - IsDerivedFrom - - IsSourceOf - - IsRequiredBy - - Requires - - IsObsoletedBy - - Obsoletes - example: Cites - required: - - id - - relation - - type - - value - CreatorDto: - type: object - properties: - id: - type: string - format: uuid - example: e41f94a6-2b94-4a12-ac0e-678684e1c070 - firstname: - type: string - example: Josiah - lastname: - type: string - example: Carberry - affiliation: - type: string - example: Brown University - creator_name: - type: string - example: "Carberry, Josiah" - name_type: - type: string - enum: - - Personal - - Organizational - example: Personal - name_identifier: - type: string - example: 0000-0002-1825-0097 - name_identifier_scheme: - type: string - enum: - - ORCID - - ROR - - ISNI - - GRID - example: ORCID - name_identifier_scheme_uri: - type: string - example: https://orcid.org/ - affiliation_identifier: - type: string - example: https://ror.org/05gq02987 - affiliation_identifier_scheme: - type: string - enum: - - ROR - - GRID - - ISNI - example: ROR - affiliation_identifier_scheme_uri: - type: string - example: https://ror.org/ - required: - - creator_name - - id - IdentifierDto: - type: object - properties: - id: - type: string - format: uuid - example: b97cd56b-66ca-4354-9e6c-f47210cfaaec - links: - $ref: "#/components/schemas/LinksDto" - type: - type: string - enum: - - database - - subset - - table - - view - example: database - titles: - type: array - items: - $ref: "#/components/schemas/IdentifierTitleDto" - descriptions: - type: array - items: - $ref: "#/components/schemas/IdentifierDescriptionDto" - funders: - type: array - items: - $ref: "#/components/schemas/IdentifierFunderDto" - query: - type: string - example: "SELECT `id`, `value`, `location` FROM `air_quality` WHERE `location`\ - \ = \"09:STEF\"" - execution: - type: string - format: date-time - example: 2021-03-12T15:26:21Z - doi: - type: string - example: 10.1038/nphys1170 - publisher: - type: string - example: TU Wien - owner: - $ref: "#/components/schemas/UserBriefDto" - language: - type: string - enum: - - ab - - aa - - af - - ak - - sq - - am - - ar - - an - - hy - - as - - av - - ae - - ay - - az - - bm - - ba - - eu - - be - - bn - - bh - - bi - - bs - - br - - bg - - my - - ca - - km - - ch - - ce - - ny - - zh - - cu - - cv - - kw - - co - - cr - - hr - - cs - - da - - dv - - nl - - dz - - en - - eo - - et - - ee - - fo - - fj - - fi - - fr - - ff - - gd - - gl - - lg - - ka - - de - - ki - - el - - kl - - gn - - gu - - ht - - ha - - he - - hz - - hi - - ho - - hu - - is - - io - - ig - - id - - ia - - ie - - iu - - ik - - ga - - it - - ja - - jv - - kn - - kr - - ks - - kk - - rw - - kv - - kg - - ko - - kj - - ku - - ky - - lo - - la - - lv - - lb - - li - - ln - - lt - - lu - - mk - - mg - - ms - - ml - - mt - - gv - - mi - - mr - - mh - - ro - - mn - - na - - nv - - nd - - ng - - ne - - se - - "no" - - nb - - nn - - ii - - oc - - oj - - or - - om - - os - - pi - - pa - - ps - - fa - - pl - - pt - - qu - - rm - - rn - - ru - - sm - - sg - - sa - - sc - - sr - - sn - - sd - - si - - sk - - sl - - so - - st - - nr - - es - - su - - sw - - ss - - sv - - tl - - ty - - tg - - ta - - tt - - te - - th - - bo - - ti - - to - - ts - - tn - - tr - - tk - - tw - - ug - - uk - - ur - - uz - - ve - - vi - - vo - - wa - - cy - - fy - - wo - - xh - - yi - - yo - - za - - zu - licenses: - type: array - items: - $ref: "#/components/schemas/LicenseDto" - creators: - type: array - items: - $ref: "#/components/schemas/CreatorDto" - status: - type: string - enum: - - draft - - published - example: draft - database_id: - type: string - format: uuid - example: null - query_id: - type: string - format: uuid - example: null - table_id: - type: string - format: uuid - example: null - view_id: - type: string - format: uuid - example: null - query_normalized: - type: string - example: "SELECT `id`, `value`, `location` FROM `air_quality` WHERE `location`\ - \ = \"09:STEF\"" - related_identifiers: - type: array - items: - $ref: "#/components/schemas/RelatedIdentifierDto" - query_hash: - type: string - description: query hash in sha512 - result_hash: - type: string - example: 34fe82cda2c53f13f8d90cfd7a3469e3a939ff311add50dce30d9136397bf8e5 - result_number: - type: integer - format: int64 - example: 1 - publication_day: - type: integer - format: int32 - example: 15 - publication_month: - type: integer - format: int32 - example: 12 - publication_year: - type: integer - format: int32 - example: 2022 - required: - - creators - - database_id - - descriptions - - funders - - id - - language - - licenses - - links - - owner - - publication_year - - publisher - - query - - query_hash - - query_normalized - - status - - titles - - type - IdentifierFunderDto: - type: object - properties: - id: - type: string - format: uuid - example: 39693413-e0ce-46da-ad5e-029c0556d439 - funder_name: - type: string - example: European Commission - funder_identifier: - type: string - example: http://doi.org/10.13039/501100000780 - funder_identifier_type: - type: string - enum: - - Crossref Funder ID - - ROR - - GND - - ISNI - - Other - example: Crossref Funder ID - scheme_uri: - type: string - example: http://doi.org/ - award_number: - type: string - example: 824087 - award_title: - type: string - example: EOSC-Life - required: - - funder_name - - id - LinksDto: - type: object - properties: - self: - type: string - example: http://example.com/api/ - data: - type: string - example: http://example.com - self_html: - type: string - example: http://example.com - dashboard_html: - type: string - example: http://example.com/d/defi2baxqawaod - required: - - self - - self_html - RelatedIdentifierDto: - type: object - properties: - id: - type: string - format: uuid - example: ce9d11f0-60a2-448d-a3e4-44719a443e8a - value: - type: string - example: 10.70124/dc4zh-9ce78 - type: - type: string - enum: - - DOI - - URL - - URN - - ARK - - arXiv - - bibcode - - EAN13 - - EISSN - - Handle - - IGSN - - ISBN - - ISTC - - LISSN - - LSID - - PMID - - PURL - - UPC - - w3id - example: DOI - relation: - type: string - enum: - - IsCitedBy - - Cites - - IsSupplementTo - - IsSupplementedBy - - IsContinuedBy - - Continues - - IsDescribedBy - - Describes - - HasMetadata - - IsMetadataFor - - HasVersion - - IsVersionOf - - IsNewVersionOf - - IsPreviousVersionOf - - IsPartOf - - HasPart - - IsPublishedIn - - IsReferencedBy - - References - - IsDocumentedBy - - Documents - - IsCompiledBy - - Compiles - - IsVariantFormOf - - IsOriginalFormOf - - IsIdenticalTo - - IsReviewedBy - - Reviews - - IsDerivedFrom - - IsSourceOf - - IsRequiredBy - - Requires - - IsObsoletedBy - - Obsoletes - example: Cites - required: - - id - - relation - - type - - value - DatabaseModifyVisibilityDto: - type: object - properties: - is_public: - type: boolean - example: true - is_schema_public: - type: boolean - example: true - is_dashboard_enabled: - type: boolean - example: true - required: - - is_dashboard_enabled - - is_public - - is_schema_public - ViewUpdateDto: - type: object - properties: - is_public: - type: boolean - example: true - is_schema_public: - type: boolean - example: true - required: - - is_public - - is_schema_public - ViewBriefDto: - type: object - properties: - id: - type: string - format: uuid - example: 787439d0-e85e-400c-a7e6-996a023bfad9 - name: - type: string - example: Air Quality - query: - type: string - example: SELECT `id` FROM `air_quality` ORDER BY `value` DESC - database_id: - type: string - format: uuid - example: 2b5b2b03-fdd0-40d6-afe0-e5d02fd839e4 - internal_name: - type: string - example: air_quality - is_public: - type: boolean - example: true - is_schema_public: - type: boolean - example: true - initial_view: - type: boolean - description: True if it is the default view for the database - example: true - query_hash: - type: string - example: 7de03e818900b6ea6d58ad0306d4a741d658c6df3d1964e89ed2395d8c7e7916 - owned_by: - type: string - format: uuid - example: ac750fcf-ea02-4fce-85ac-d73857e18b35 - required: - - database_id - - id - - internal_name - - name - - query - - query_hash - TableUpdateDto: - type: object - properties: - description: - type: string - example: Air Quality in Austria - maxLength: 180 - minLength: 0 - is_public: - type: boolean - example: true - is_schema_public: - type: boolean - example: true - required: - - is_public - - is_schema_public - TableBriefDto: - type: object - properties: - id: - type: string - format: uuid - example: 41ed10e0-687b-4e18-8521-810f5cffbce1 - name: - type: string - example: Air Quality - description: - type: string - example: Air Quality in Austria - database_id: - type: string - format: uuid - example: a8fec026-dfaf-4b1d-8f6c-f01720d91705 - internal_name: - type: string - example: air_quality - is_versioned: - type: boolean - example: true - is_public: - type: boolean - example: true - is_schema_public: - type: boolean - example: true - owned_by: - type: string - format: uuid - example: 78337b80-5699-45db-8111-cec86439ab6b - required: - - database_id - - id - - internal_name - - is_public - - is_schema_public - - is_versioned - - name - - owned_by - ColumnSemanticsUpdateDto: - type: object - properties: - concept_uri: - type: string - unit_uri: - type: string - ColumnDto: - type: object - properties: - id: - type: string - format: uuid - example: a453e444-e00d-41ca-902c-11e9c54b39f1 - name: - type: string - example: Given Name - maxLength: 64 - minLength: 0 - alias: - type: string - example: firstname - size: - type: integer - format: int64 - example: 255 - d: - type: integer - format: int64 - example: 0 - mean: - type: number - example: 45.4 - median: - type: number - example: 51 - concept: - $ref: "#/components/schemas/ConceptBriefDto" - unit: - $ref: "#/components/schemas/UnitBriefDto" - description: - type: string - example: Column comment - maxLength: 2048 - minLength: 0 - enums: - type: array - description: "enum values, only considered when type = ENUM" - items: - $ref: "#/components/schemas/EnumDto" - sets: - type: array - description: "enum values, only considered when type = ENUM" - items: - $ref: "#/components/schemas/SetDto" - database_id: - type: string - format: uuid - example: 911f9052-c58c-4e1c-b3f2-66af2107be16 - table_id: - type: string - format: uuid - example: bfffa915-a547-4466-9c65-ddc0d38fdb08 - ord: - type: integer - format: int32 - example: 0 - internal_name: - type: string - example: given_name - maxLength: 64 - minLength: 0 - index_length: - type: integer - format: int64 - example: 255 - length: - type: integer - format: int64 - example: 255 - type: - type: string - enum: - - char - - varchar - - binary - - varbinary - - tinyblob - - tinytext - - text - - blob - - mediumtext - - mediumblob - - longtext - - longblob - - enum - - set - - serial - - bit - - tinyint - - bool - - smallint - - mediumint - - int - - bigint - - float - - double - - decimal - - date - - datetime - - timestamp - - time - - year - example: varchar - data_length: - type: integer - format: int64 - example: 34300 - max_data_length: - type: integer - format: int64 - example: 34300 - num_rows: - type: integer - format: int64 - example: 32 - val_min: - type: number - example: 0 - val_max: - type: number - example: 100 - std_dev: - type: number - example: 5.32 - is_null_allowed: - type: boolean - example: false - required: - - database_id - - id - - internal_name - - is_null_allowed - - name - - ord - - table_id - - type - ConceptBriefDto: - type: object - properties: - id: - type: string - format: uuid - example: 8cabc011-4bdf-44d4-9d33-b2648e2ddbf1 - uri: - type: string - example: http://www.wikidata.org/entity/Q202444 - name: - type: string - example: given name - description: - type: string - example: "name typically used to differentiate people from the same family,\ - \ clan, or other social group who have a common last name" - required: - - id - - uri - EnumDto: - type: object - properties: - id: - type: string - format: uuid - example: 5343bb3d-14d3-4eb7-a86f-b8fc553cb315 - value: - type: string - example: 3 - required: - - id - - value - SetDto: - type: object - properties: - id: - type: string - format: uuid - example: 7eb4eded-bacc-4a91-84db-a9ae6ddafda7 - value: - type: string - example: 3 - required: - - id - - value - UnitBriefDto: - type: object - properties: - id: - type: string - format: uuid - example: ba1935e8-6817-488f-af0a-f54389af9000 - uri: - type: string - example: http://www.wikidata.org/entity/Q1422583 - name: - type: string - example: importance - description: - type: string - example: "subjective magnitude of value, meaning, or purpose" - required: - - id - - uri - DatabaseTransferDto: - type: object - properties: - id: - type: string - format: uuid - required: - - id - DatabaseModifyImageDto: - type: object - properties: - key: - type: string - DatabaseModifyDashboardDto: - type: object - properties: - uid: - type: string - required: - - uid - CreateAccessDto: - type: object - properties: - type: - type: string - enum: - - read - - write_own - - write_all - example: read - required: - - type - OntologyCreateDto: - type: object - properties: - uri: - type: string - example: Ontology URI - prefix: - type: string - example: Ontology prefix - sparql_endpoint: - type: string - example: Ontology SPARQL endpoint - required: - - prefix - - uri - BannerMessageCreateDto: - type: object - properties: - type: - type: string - enum: - - error - - warning - - info - message: - type: string - example: Maintenance starts on 8am on Monday - link: - type: string - example: https://example.com - link_text: - type: string - example: More - display_start: - type: string - format: date-time - example: 2021-03-12T15:26:21Z - display_end: - type: string - format: date-time - example: 2021-03-12T15:26:21Z - required: - - message - - type - ImageCreateDto: - type: object - properties: - registry: - type: string - example: docker.io/library - name: - type: string - example: mariadb - version: - type: string - dialect: - type: string - is_default: - type: boolean - example: false - driver_class: - type: string - jdbc_method: - type: string - default_port: - type: integer - format: int32 - maximum: 65535 - minimum: 1024 - required: - - default_port - - dialect - - driver_class - - is_default - - jdbc_method - - name - - registry - - version - CreateIdentifierDto: - type: object - properties: - type: - type: string - enum: - - database - - subset - - table - - view - example: database - doi: - type: string - example: 10.1111/11111111 - titles: - type: array - items: - $ref: "#/components/schemas/SaveIdentifierTitleDto" - descriptions: - type: array - items: - $ref: "#/components/schemas/SaveIdentifierDescriptionDto" - funders: - type: array - items: - $ref: "#/components/schemas/SaveIdentifierFunderDto" - licenses: - type: array - items: - $ref: "#/components/schemas/LicenseDto" - publisher: - type: string - example: TU Wien - language: - type: string - enum: - - ab - - aa - - af - - ak - - sq - - am - - ar - - an - - hy - - as - - av - - ae - - ay - - az - - bm - - ba - - eu - - be - - bn - - bh - - bi - - bs - - br - - bg - - my - - ca - - km - - ch - - ce - - ny - - zh - - cu - - cv - - kw - - co - - cr - - hr - - cs - - da - - dv - - nl - - dz - - en - - eo - - et - - ee - - fo - - fj - - fi - - fr - - ff - - gd - - gl - - lg - - ka - - de - - ki - - el - - kl - - gn - - gu - - ht - - ha - - he - - hz - - hi - - ho - - hu - - is - - io - - ig - - id - - ia - - ie - - iu - - ik - - ga - - it - - ja - - jv - - kn - - kr - - ks - - kk - - rw - - kv - - kg - - ko - - kj - - ku - - ky - - lo - - la - - lv - - lb - - li - - ln - - lt - - lu - - mk - - mg - - ms - - ml - - mt - - gv - - mi - - mr - - mh - - ro - - mn - - na - - nv - - nd - - ng - - ne - - se - - "no" - - nb - - nn - - ii - - oc - - oj - - or - - om - - os - - pi - - pa - - ps - - fa - - pl - - pt - - qu - - rm - - rn - - ru - - sm - - sg - - sa - - sc - - sr - - sn - - sd - - si - - sk - - sl - - so - - st - - nr - - es - - su - - sw - - ss - - sv - - tl - - ty - - tg - - ta - - tt - - te - - th - - bo - - ti - - to - - ts - - tn - - tr - - tk - - tw - - ug - - uk - - ur - - uz - - ve - - vi - - vo - - wa - - cy - - fy - - wo - - xh - - yi - - yo - - za - - zu - creators: - type: array - items: - $ref: "#/components/schemas/SaveIdentifierCreatorDto" - database_id: - type: string - format: uuid - example: d002e8d5-8db4-4ff7-ab3a-bc3f52d9ec44 - query_id: - type: string - format: uuid - example: null - view_id: - type: string - format: uuid - example: null - table_id: - type: string - format: uuid - example: null - publication_day: - type: integer - format: int32 - example: 15 - publication_month: - type: integer - format: int32 - example: 12 - publication_year: - type: integer - format: int32 - example: 2022 - related_identifiers: - type: array - items: - $ref: "#/components/schemas/SaveRelatedIdentifierDto" - required: - - creators - - database_id - - publication_year - - publisher - - titles - - type - CreateDatabaseDto: - type: object - properties: - name: - type: string - example: Air Quality - container_id: - type: string - format: uuid - example: 0888e108-d521-46e2-9d3e-82099185305b - is_public: - type: boolean - example: true - is_schema_public: - type: boolean - example: true - required: - - container_id - - is_public - - is_schema_public - - name - CreateViewDto: - type: object - properties: - name: - type: string - example: Air Quality - maxLength: 63 - minLength: 1 - query: - $ref: "#/components/schemas/SubsetDto" - is_public: - type: boolean - example: true - is_schema_public: - type: boolean - example: true - required: - - is_public - - is_schema_public - - name - - query - FilterDto: - type: object - properties: - type: - type: string - enum: - - where - - or - - and - example: where - value: - type: string - example: 1 - column_id: - type: string - format: uuid - example: 14128033-54b5-4818-a489-21b0dded86e2 - operator_id: - type: string - format: uuid - example: 67c5b54d-2eb0-4f42-8dc1-a504562e9f32 - required: - - column_id - - operator_id - - type - - value - OrderDto: - type: object - properties: - direction: - type: string - enum: - - asc - - desc - example: asc - column_id: - type: string - format: uuid - example: e891ba86-0258-41a6-a8d9-ff58bc10b618 - required: - - column_id - SubsetDto: - type: object - properties: - columns: - type: array - example: - - e891ba86-0258-41a6-a8d9-ff58bc10b618 - items: - type: string - format: uuid - filter: - type: array - items: - $ref: "#/components/schemas/FilterDto" - order: - type: array - items: - $ref: "#/components/schemas/OrderDto" - datasource_id: - type: string - format: uuid - example: f7df2a7d-4ade-4c78-97b0-7c744d0893c7 - datasource_type: - type: string - enum: - - table - - view - required: - - columns - - datasource_id - - datasource_type - CreateForeignKeyDto: - type: object - properties: - columns: - type: array - example: - - id - items: - type: string - referenced_table: - type: string - example: sensor - referenced_columns: - type: array - example: - - other_id - items: - type: string - on_update: - type: string - enum: - - restrict - - cascade - - set_null - - no_action - - set_default - example: cascade - on_delete: - type: string - enum: - - restrict - - cascade - - set_null - - no_action - - set_default - example: cascade - required: - - columns - - referenced_columns - - referenced_table - CreateTableColumnDto: - type: object - properties: - name: - type: string - example: Date - type: - type: string - enum: - - char - - varchar - - binary - - varbinary - - tinyblob - - tinytext - - text - - blob - - mediumtext - - mediumblob - - longtext - - longblob - - enum - - set - - serial - - bit - - tinyint - - bool - - smallint - - mediumint - - int - - bigint - - float - - double - - decimal - - date - - datetime - - timestamp - - time - - year - example: varchar - size: - type: integer - format: int64 - example: 255 - d: - type: integer - format: int64 - example: 0 - description: - type: string - example: Formatted as YYYY-MM-dd - maxLength: 2048 - minLength: 0 - enums: - type: array - description: "enum values, only considered when type = ENUM" - items: - type: string - sets: - type: array - description: "set values, only considered when type = SET" - items: - type: string - index_length: - type: integer - format: int64 - null_allowed: - type: boolean - example: true - concept_uri: - type: string - unit_uri: - type: string - required: - - name - - null_allowed - - type - CreateTableConstraintsDto: - type: object - properties: - uniques: - type: array - items: - type: array - items: - type: string - checks: - type: array - items: - type: string - uniqueItems: true - foreign_keys: - type: array - items: - $ref: "#/components/schemas/CreateForeignKeyDto" - primary_key: - type: array - items: - type: string - uniqueItems: true - required: - - checks - - foreign_keys - - primary_key - - uniques - CreateTableDto: - type: object - properties: - name: - type: string - example: Air Quality - maxLength: 64 - minLength: 1 - description: - type: string - example: Air Quality in Austria - maxLength: 180 - minLength: 0 - columns: - type: array - items: - $ref: "#/components/schemas/CreateTableColumnDto" - constraints: - $ref: "#/components/schemas/CreateTableConstraintsDto" - is_public: - type: boolean - example: true - is_schema_public: - type: boolean - example: true - required: - - columns - - constraints - - is_public - - is_schema_public - - name - CreateContainerDto: - type: object - properties: - name: - type: string - example: Air Quality - host: - type: string - description: Hostname of container - example: data-db2 - port: - type: integer - format: int32 - description: Port of container - example: 3306 - quota: - type: integer - format: int64 - example: 50 - image_id: - type: string - format: uuid - description: Image ID - example: 2360f3c4-85e0-4fac-a7c6-73b296b9dde2 - ui_host: - type: string - example: example.com - ui_port: - type: integer - format: int32 - example: 3306 - privileged_username: - type: string - description: Username of privileged user - example: root - privileged_password: - type: string - description: Password of privileged user - example: dbrepo - required: - - host - - image_id - - name - - privileged_password - - privileged_username - - quota - ContainerDto: - type: object - properties: - id: - type: string - format: uuid - example: 7ddb7e87-b965-43a2-9a24-4fa406d998f4 - name: - type: string - example: Air Quality - image: - $ref: "#/components/schemas/ImageDto" - quota: - type: integer - format: int64 - example: 50 - count: - type: integer - format: int64 - example: 10 - username: - type: string - example: username - password: - type: string - example: p4ssw0rd - last_retrieved: - type: string - format: date-time - example: 2025-01-23T12:09:01 - internal_name: - type: string - example: air_quality - required: - - count - - id - - image - - internal_name - - name - ColumnBriefDto: - type: object - properties: - id: - type: string - format: uuid - example: a453e444-e00d-41ca-902c-11e9c54b39f1 - name: - type: string - example: Given Name - maxLength: 64 - minLength: 0 - alias: - type: string - example: firstname - database_id: - type: string - format: uuid - example: 911f9052-c58c-4e1c-b3f2-66af2107be16 - table_id: - type: string - format: uuid - example: bfffa915-a547-4466-9c65-ddc0d38fdb08 - internal_name: - type: string - example: given_name - maxLength: 64 - minLength: 0 - type: - type: string - enum: - - char - - varchar - - binary - - varbinary - - tinyblob - - tinytext - - text - - blob - - mediumtext - - mediumblob - - longtext - - longblob - - enum - - set - - serial - - bit - - tinyint - - bool - - smallint - - mediumint - - int - - bigint - - float - - double - - decimal - - date - - datetime - - timestamp - - time - - year - example: varchar - required: - - database_id - - id - - internal_name - - name - - table_id - - type - UnitDto: - type: object - properties: - id: - type: string - format: uuid - example: ba1935e8-6817-488f-af0a-f54389af9000 - uri: - type: string - name: - type: string - description: - type: string - columns: - type: array - items: - $ref: "#/components/schemas/ColumnBriefDto" - required: - - columns - - id - - uri - OntologyBriefDto: - type: object - properties: - id: - type: string - format: uuid - example: 7c491e40-082a-47b8-b82c-51d03c520466 - uri: - type: string - example: http://www.wikidata.org/ - prefix: - type: string - example: wd - sparql: - type: boolean - example: true - rdf: - type: boolean - example: false - uri_pattern: - type: string - example: http://www.wikidata.org/entity/.* - required: - - id - - prefix - - rdf - - sparql - - uri - EntityDto: - type: object - properties: - uri: - type: string - example: https://www.wikidata.org/entity/Q1686799 - label: - type: string - example: Apache Jena - description: - type: string - example: open source semantic web framework for Java - required: - - label - - uri - OaiListIdentifiersParameters: - type: object - properties: - metadataPrefix: - type: string - from: - type: string - until: - type: string - set: - type: string - resumptionToken: - type: string - parametersString: - type: string - fromDate: - type: string - format: date-time - untilDate: - type: string - format: date-time - BannerMessageDto: - type: object - properties: - id: - type: string - format: uuid - example: ae3f795b-a3da-4ebe-bdc4-21a8ce631e6f - type: - type: string - enum: - - error - - warning - - info - example: WARNING - message: - type: string - example: Maintenance starts on 8am on Monday - link: - type: string - example: https://example.com - link_text: - type: string - example: More - display_start: - type: string - format: date-time - example: 2021-03-12T15:26:21Z - display_end: - type: string - format: date-time - example: 2021-03-12T15:26:21Z - required: - - id - - message - - type - ImageBriefDto: - type: object - properties: - id: - type: string - format: uuid - example: 816f55d5-1098-4f60-a4af-c8121c04dcce - name: - type: string - example: mariadb - version: - type: string - example: 10.5 - default: - type: boolean - example: false - required: - - default - - id - - name - - version - LdCreatorDto: - type: object - properties: - name: - type: string - sameAs: - type: string - givenName: - type: string - familyName: - type: string - '@type': - type: string - required: - - '@type' - - name - LdDatasetDto: - type: object - properties: - name: - type: string - description: - type: string - url: - type: string - identifier: - type: array - items: - type: string - license: - type: string - creator: - type: array - items: - $ref: "#/components/schemas/LdCreatorDto" - citation: - type: string - hasPart: - type: array - items: - $ref: "#/components/schemas/LdDatasetDto" - temporalCoverage: - type: string - version: - type: string - format: date-time - '@context': - type: string - '@type': - type: string - required: - - '@context' - - '@type' - - citation - - creator - - description - - hasPart - - identifier - - name - - temporalCoverage - - url - - version - ViewColumnDto: - type: object - properties: - id: - type: string - format: uuid - example: 6aec3a91-2e0b-4e92-a16a-9c3c5e892da1 - name: - type: string - example: Given Name - maxLength: 64 - minLength: 0 - size: - type: integer - format: int64 - example: 255 - d: - type: integer - format: int64 - example: 0 - description: - type: string - example: Column comment - maxLength: 2048 - minLength: 0 - enums: - type: array - description: "enum values, only considered when type = ENUM" - items: - $ref: "#/components/schemas/EnumDto" - sets: - type: array - description: "enum values, only considered when type = ENUM" - items: - $ref: "#/components/schemas/SetDto" - database_id: - type: string - format: uuid - example: 2b5b2b03-fdd0-40d6-afe0-e5d02fd839e4 - ord: - type: integer - format: int32 - example: 0 - internal_name: - type: string - example: given_name - maxLength: 64 - minLength: 0 - index_length: - type: integer - format: int64 - example: 255 - length: - type: integer - format: int64 - example: 255 - type: - type: string - enum: - - char - - varchar - - binary - - varbinary - - tinyblob - - tinytext - - text - - blob - - mediumtext - - mediumblob - - longtext - - longblob - - enum - - set - - serial - - bit - - tinyint - - bool - - smallint - - mediumint - - int - - bigint - - float - - double - - decimal - - date - - datetime - - timestamp - - time - - year - example: varchar - is_null_allowed: - type: boolean - example: false - required: - - database_id - - id - - internal_name - - is_null_allowed - - name - - ord - - type - ViewDto: - type: object - properties: - id: - type: string - format: uuid - example: 787439d0-e85e-400c-a7e6-996a023bfad9 - name: - type: string - example: Air Quality - identifiers: - type: array - items: - $ref: "#/components/schemas/IdentifierDto" - query: - type: string - example: SELECT `id` FROM `air_quality` ORDER BY `value` DESC - owner: - $ref: "#/components/schemas/UserBriefDto" - columns: - type: array - items: - $ref: "#/components/schemas/ViewColumnDto" - created: - type: string - format: date-time - example: 2022-01-01 08:00:00.000 - last_retrieved: - type: string - format: date-time - example: 2025-01-23T12:09:01 - database_id: - type: string - format: uuid - example: fc29f89c-86a8-4020-9e36-4d954736c6cc - internal_name: - type: string - example: air_quality - is_public: - type: boolean - example: true - is_schema_public: - type: boolean - example: true - initial_view: - type: boolean - description: True if it is the default view for the database - example: true - query_hash: - type: string - example: 7de03e818900b6ea6d58ad0306d4a741d658c6df3d1964e89ed2395d8c7e7916 - required: - - columns - - created - - database_id - - id - - identifiers - - internal_name - - name - - owner - - query - - query_hash - ConstraintsDto: - type: object - properties: - uniques: - type: array - items: - $ref: "#/components/schemas/UniqueDto" - checks: - type: array - example: - - value > 1 - items: - type: string - uniqueItems: true - foreign_keys: - type: array - items: - $ref: "#/components/schemas/ForeignKeyDto" - primary_key: - type: array - items: - $ref: "#/components/schemas/PrimaryKeyDto" - uniqueItems: true - ForeignKeyBriefDto: - type: object - properties: - id: - type: string - format: uuid - example: f2b740ec-0b13-4d07-88a9-529d354bba6a - ForeignKeyDto: - type: object - properties: - id: - type: string - format: uuid - example: f2b740ec-0b13-4d07-88a9-529d354bba6a - name: - type: string - example: fk_name - references: - type: array - items: - $ref: "#/components/schemas/ForeignKeyReferenceDto" - table: - $ref: "#/components/schemas/TableBriefDto" - referenced_table: - $ref: "#/components/schemas/TableBriefDto" - on_update: - type: string - enum: - - restrict - - cascade - - set_null - - no_action - - set_default - example: restrict - on_delete: - type: string - enum: - - restrict - - cascade - - set_null - - no_action - - set_default - example: restrict - required: - - name - - referenced_table - - references - - table - ForeignKeyReferenceDto: - type: object - properties: - id: - type: string - format: uuid - example: f2b740ec-0b13-4d07-88a9-529d354bba6a - column: - $ref: "#/components/schemas/ColumnBriefDto" - foreign_key: - $ref: "#/components/schemas/ForeignKeyBriefDto" - referenced_column: - $ref: "#/components/schemas/ColumnBriefDto" - required: - - column - - foreign_key - - referenced_column - PrimaryKeyDto: - type: object - properties: - id: - type: string - format: uuid - example: d984f9d7-e8a7-4b81-b59a-862db1871f18 - table: - $ref: "#/components/schemas/TableBriefDto" - column: - $ref: "#/components/schemas/ColumnBriefDto" - required: - - column - - table - TableDto: - type: object - properties: - id: - type: string - format: uuid - example: d346f844-b84c-490f-9aec-725a2dc8f820 - name: - type: string - example: Air Quality - alias: - type: string - example: a - identifiers: - type: array - items: - $ref: "#/components/schemas/IdentifierDto" - owner: - $ref: "#/components/schemas/UserBriefDto" - description: - type: string - example: Air Quality in Austria - maxLength: 2048 - minLength: 0 - columns: - type: array - items: - $ref: "#/components/schemas/ColumnDto" - constraints: - $ref: "#/components/schemas/ConstraintsDto" - created: - type: string - format: date-time - example: 2022-01-01 08:00:00.000 - last_retrieved: - type: string - format: date-time - example: 2025-01-23T12:09:01 - database_id: - type: string - format: uuid - example: fc29f89c-86a8-4020-9e36-4d954736c6cc - internal_name: - type: string - example: air_quality - is_versioned: - type: boolean - example: true - is_schema_public: - type: boolean - example: true - queue_name: - type: string - example: air_quality - queue_type: - type: string - example: quorum - routing_key: - type: string - example: dbrepo.1.2 - is_public: - type: boolean - example: true - num_rows: - type: integer - format: int64 - example: 5 - data_length: - type: integer - format: int64 - description: in bytes - example: 16384 - max_data_length: - type: integer - format: int64 - description: in bytes - example: 0 - avg_row_length: - type: integer - format: int64 - description: in bytes - example: 3276 - required: - - columns - - constraints - - created - - database_id - - id - - internal_name - - is_public - - is_schema_public - - is_versioned - - name - - owner - - queue_name - - routing_key - UniqueDto: - type: object - properties: - id: - type: string - format: uuid - example: d984f9d7-e8a7-4b81-b59a-862db1871f13 - name: - type: string - example: uk_name - table: - $ref: "#/components/schemas/TableBriefDto" - columns: - type: array - items: - $ref: "#/components/schemas/ColumnBriefDto" - required: - - columns - - id - - name - - table - TableColumnEntityDto: - type: object - properties: - uri: - type: string - example: https://www.wikidata.org/entity/Q1686799 - label: - type: string - example: Apache Jena - description: - type: string - example: open source semantic web framework for Java - database_id: - type: string - format: uuid - example: 475b4107-a64d-4495-a7ef-3cb0dadd4804 - table_id: - type: string - format: uuid - example: 9a9208af-90ea-4382-9a11-0c8f6d89bd1f - column_id: - type: string - format: uuid - example: 297860e3-3b29-451c-ae8a-a85ed5941018 - required: - - column_id - - database_id - - table_id - - uri - ContainerBriefDto: - type: object - properties: - id: - type: string - format: uuid - example: 7ddb7e87-b965-43a2-9a24-4fa406d998f4 - hash: - type: string - example: f829dd8a884182d0da846f365dee1221fd16610a14c81b8f9f295ff162749e50 - name: - type: string - example: Air Quality - image: - $ref: "#/components/schemas/ImageBriefDto" - quota: - type: integer - format: int32 - example: 50 - count: - type: integer - format: int32 - example: 10 - internal_name: - type: string - example: air-quality - required: - - count - - hash - - id - - image - - internal_name - - name - - quota - ConceptDto: - type: object - properties: - id: - type: string - format: uuid - example: 8cabc011-4bdf-44d4-9d33-b2648e2ddbf1 - uri: - type: string - name: - type: string - description: - type: string - columns: - type: array - items: - $ref: "#/components/schemas/ColumnBriefDto" - required: - - columns - - id - - uri - securitySchemes: - basicAuth: - type: http - scheme: basic - bearerAuth: - type: http - scheme: bearer - bearerFormat: JWT diff --git a/.docs/.openapi/api-search.yaml b/.docs/.openapi/api-search-service.yaml similarity index 99% rename from .docs/.openapi/api-search.yaml rename to .docs/.openapi/api-search-service.yaml index 4e2eb82ce413b578f0cb6d7b36b8bf819c8cadd2..ee2f2a21adb14b8ca19448b9dcc5e291fddb5603 100644 --- a/.docs/.openapi/api-search.yaml +++ b/.docs/.openapi/api-search-service.yaml @@ -128,7 +128,7 @@ "url": "https://www.apache.org/licenses/LICENSE-2.0" }, "title": "Database Repository Search Service API", - "version": "1.8.1" + "version": "1.9.0" }, "openapi": "3.0.0", "paths": { diff --git a/.docs/.openapi/api.base.yaml b/.docs/.openapi/api.base.yaml index cbb093262e474657926eb0e9f917d1f445988837..240f63f7cb7d4ec21363dee8c37bb5c360e22278 100644 --- a/.docs/.openapi/api.base.yaml +++ b/.docs/.openapi/api.base.yaml @@ -11,7 +11,7 @@ components: type: http externalDocs: description: Project Website - url: https://www.ifs.tuwien.ac.at/infrastructures/dbrepo/1.8/ + url: https://www.ifs.tuwien.ac.at/infrastructures/dbrepo/1.9/ info: contact: email: andreas.rauber@tuwien.ac.at @@ -24,7 +24,7 @@ info: name: Apache 2.0 url: https://www.apache.org/licenses/LICENSE-2.0 title: DBRepo REST API - version: 1.8.1 + version: 1.9.0 openapi: 3.1.0 servers: - description: Test Instance diff --git a/.docs/.openapi/api.yaml b/.docs/.openapi/api.yaml index bb80ed24381b373cc0ae147a594c919dffe90813..3ed4b4aea0880a0f2f874f2e042930eb411752c0 100644 --- a/.docs/.openapi/api.yaml +++ b/.docs/.openapi/api.yaml @@ -16,7 +16,7 @@ info: name: Apache 2.0 url: 'https://www.apache.org/licenses/LICENSE-2.0' title: DBRepo REST API - version: 1.8.1 + version: 1.9.0 servers: - description: Test Instance url: 'https://test.dbrepo.tuwien.ac.at' @@ -24,7 +24,7 @@ servers: url: 'http://localhost' externalDocs: description: Project Website - url: 'https://www.ifs.tuwien.ac.at/infrastructures/dbrepo/1.8/' + url: 'https://www.ifs.tuwien.ac.at/infrastructures/dbrepo/1.9/' paths: /api/analyse/datatypes: get: @@ -1193,8 +1193,8 @@ paths: $ref: '#/components/schemas/ApiErrorDto' '404': description: >- - Failed to find database in metadata database or query in query store - of the data database + Failed to find database or user in metadata database or query in + query store of the data database content: application/json: schema: @@ -5252,7 +5252,7 @@ components: execution: type: string format: date-time - example: '2021-03-12T15:26:21.000Z' + example: '2021-03-12T15:26:21Z' query: type: string example: SELECT `id` FROM `air_quality` @@ -5430,7 +5430,7 @@ components: execution: type: string format: date-time - example: '2021-03-12T15:26:21.000Z' + example: '2021-03-12T15:26:21Z' doi: type: string example: 10.1038/nphys1170 @@ -5991,11 +5991,11 @@ components: created: type: string format: date-time - example: '2022-01-01T08:00:00.000Z' + example: '2022-01-01 08:00:00.000' last_retrieved: type: string format: date-time - example: '2025-01-23T12:09:01.000Z' + example: '2025-01-23T12:09:01' database_id: type: string format: uuid @@ -6088,7 +6088,6 @@ components: - column_id - operator_id - type - - value OrderDto: type: object properties: @@ -6141,7 +6140,7 @@ components: timestamp: type: string format: date-time - example: '2021-03-12T15:26:21.000Z' + example: '2021-03-12T15:26:21Z' event: type: string enum: @@ -6206,7 +6205,7 @@ components: last_retrieved: type: string format: date-time - example: '2025-01-23T12:09:01.000Z' + example: '2025-01-23T12:09:01' qualified_name: type: string example: Josiah Carberry — @jcarberry @@ -6376,11 +6375,11 @@ components: display_start: type: string format: date-time - example: '2021-03-12T15:26:21.000Z' + example: '2021-03-12T15:26:21Z' display_end: type: string format: date-time - example: '2021-03-12T15:26:21.000Z' + example: '2021-03-12T15:26:21Z' required: - message - type @@ -7778,11 +7777,11 @@ components: display_start: type: string format: date-time - example: '2021-03-12T15:26:21.000Z' + example: '2021-03-12T15:26:21Z' display_end: type: string format: date-time - example: '2021-03-12T15:26:21.000Z' + example: '2021-03-12T15:26:21Z' required: - message - type @@ -8376,7 +8375,7 @@ components: last_retrieved: type: string format: date-time - example: '2025-01-23T12:09:01.000Z' + example: '2025-01-23T12:09:01' internal_name: type: string example: air_quality @@ -8566,11 +8565,11 @@ components: display_start: type: string format: date-time - example: '2021-03-12T15:26:21.000Z' + example: '2021-03-12T15:26:21Z' display_end: type: string format: date-time - example: '2021-03-12T15:26:21.000Z' + example: '2021-03-12T15:26:21Z' required: - id - message @@ -8793,11 +8792,11 @@ components: created: type: string format: date-time - example: '2022-01-01T08:00:00.000Z' + example: '2022-01-01 08:00:00.000' last_retrieved: type: string format: date-time - example: '2025-01-23T12:09:01.000Z' + example: '2025-01-23T12:09:01' database_id: type: string format: uuid diff --git a/.docs/.openapi/openapi-generate.sh b/.docs/.openapi/openapi-generate.sh index aeab907799cf93e130b1a0596cdca7e68c34116d..4ed8d11c8fbd8c2049e377b5c27b4010fba3d00f 100644 --- a/.docs/.openapi/openapi-generate.sh +++ b/.docs/.openapi/openapi-generate.sh @@ -1,24 +1,51 @@ #!/bin/bash -declare -A services -services[4050]=analyse -services[4060]=search -services[4070]=dashboard -services[9093]=data -services[9099]=metadata +ENDPOINTS="analyse-service:8080,search-service:8080,dashboard-service:8080,data-service:8080,metadata-service:8080" # requires https://github.com/mikefarah/yq/ -> v4.44.3 +function ip () { + HOSTNAME=$(hostname $1) + IP=$(docker inspect -f "{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}" "dbrepo-$HOSTNAME") + echo $IP +} + function retrieve () { - if [[ "$2" == analyse ]] || [[ "$2" == search ]] || [[ "$2" == dashboard ]]; then - echo "... retrieve json api from localhost:$1" - curl -sSL "http://localhost:$1/api-$2.json" | yq -o=json - > "./.docs/.openapi/api-$2.yaml" + IP=$(ip $1) + if [[ $IP == "" ]]; then + echo "FATAL: failed to find ip for endpoint: $1" + exit 1 + fi + URL=$(url $1) + HOSTNAME=$(hostname $1) + echo "... retrieve json api from URL: $URL" + touch "./.docs/.openapi/api-$HOSTNAME.yaml" + curl -sSL $URL | yq -o=json - > "./.docs/.openapi/api-$HOSTNAME.yaml" +} + +function url () { + HOSTNAME=$(hostname $1) + PORT=$(port $1) + if [[ "$HOSTNAME" == "analyse-service" ]] || [[ "$HOSTNAME" == "search-service" ]] || [[ "$HOSTNAME" == "dashboard-service" ]]; then + echo "http://$IP:$PORT/api-docs.json" else - echo "... retrieve yaml api from localhost:$1" - curl -sSL "http://localhost:$1/v3/api-docs.yaml" > "./.docs/.openapi/api-$2.yaml" + echo "http://$IP:$PORT/v3/api-docs.yaml" fi } -for key in "${!services[@]}"; do - echo "Generating ${services[$key]} API" - retrieve "$key" "${services[$key]}" -done +function hostname () { + IN="$1" + arrIN=(${IN//:/ }) + echo ${arrIN[0]} +} + +function port () { + IN="$1" + arrIN=(${IN//:/ }) + echo ${arrIN[1]} +} + +IFS=',' read -ra ARR <<< "$ENDPOINTS" +for ENDPOINT in "${ARR[@]}"; do + echo "Request OpenAPI definition for endpoint: $ENDPOINT" + retrieve $ENDPOINT +done \ No newline at end of file diff --git a/.docs/.openapi/openapi-merge.json b/.docs/.openapi/openapi-merge.json index 6e41b75f580bb4e49a068f30665436632fca5acb..32dd1991c6dcf0d6229b6659028ef32f37154cb3 100644 --- a/.docs/.openapi/openapi-merge.json +++ b/.docs/.openapi/openapi-merge.json @@ -4,16 +4,16 @@ "inputFile": "./api.base.yaml" }, { - "inputFile": "./api-analyse.yaml" + "inputFile": "./api-analyse-service.yaml" }, { - "inputFile": "./api-data.yaml" + "inputFile": "./api-data-service.yaml" }, { - "inputFile": "./api-metadata.yaml" + "inputFile": "./api-metadata-service.yaml" }, { - "inputFile": "./api-search.yaml" + "inputFile": "./api-search-service.yaml" } ], "output": "./api.yaml" diff --git a/.docs/api/analyse-service.md b/.docs/api/analyse-service.md index 6a6bb5f5064a96e78088d5aebf18e5e49816b813..c487af938fff53ed9839c1cc147ac9d1bb596e9e 100644 --- a/.docs/api/analyse-service.md +++ b/.docs/api/analyse-service.md @@ -6,7 +6,7 @@ author: Martin Weise !!! debug "Debug Information" - Image: [`registry.datalab.tuwien.ac.at/dbrepo/analyse-service:1.4.7`](https://hub.docker.com/r/dbrepo/analyse-service) + Image: [`registry.datalab.tuwien.ac.at/dbrepo/analyse-service:1.9.0`](https://hub.docker.com/r/dbrepo/analyse-service) * Ports: 5000/tcp * Prometheus: `http://<hostname>:5000/metrics` diff --git a/.docs/api/auth-service.md b/.docs/api/auth-service.md index 7b28901a9b9d49a01d48a313187f86832509a03b..d7a138234674009676e3bf854881a2ceaa696c5b 100644 --- a/.docs/api/auth-service.md +++ b/.docs/api/auth-service.md @@ -6,7 +6,7 @@ author: Martin Weise !!! debug "Debug Information" - Image: [`docker.io/bitnami/keycloak:26.0.0-debian-12-r1`](https://hub.docker.com/r/bitnami/keycloak) + Image: [`docker.io/bitnami/keycloak:26.0.4`](https://hub.docker.com/r/bitnami/keycloak) * Ports: 8080/tcp * UI: `http://<hostname>:8080/` diff --git a/.docs/api/broker-service.md b/.docs/api/broker-service.md index 18bf4fe8b449a78db5c91166830a8d29d2573e51..b5b09c1b9cadd4b199ca3e660cfad501c2e77b5d 100644 --- a/.docs/api/broker-service.md +++ b/.docs/api/broker-service.md @@ -6,7 +6,7 @@ author: Martin Weise !!! debug "Debug Information" - Image: [`bitnami/rabbitmq:3.12.13-debian-12-r2`](https://hub.docker.com/r/bitnami/rabbitmq) + Image: [`bitnami/rabbitmq:3.13.7`](https://hub.docker.com/r/bitnami/rabbitmq) * Ports: 5672/tcp, 15672/tcp, 15692/tcp * AMQP: `amqp://<hostname>:5672` diff --git a/.docs/api/data-db.md b/.docs/api/data-db.md index f84ab8aad1d9c513db17e693bff445c7aaa74a34..4edbe8d2f1c6da1d22212cee3896da3ea4d16644 100644 --- a/.docs/api/data-db.md +++ b/.docs/api/data-db.md @@ -4,7 +4,7 @@ author: Martin Weise !!! debug "Debug Information" - Image: [`docker.io/bitnami/mariadb-galera:11.3.2-debian-12-r9`](https://hub.docker.com/r/bitnami/mariadb-galera) + Image: [`docker.io/bitnami/mariadb:11.3.2`](https://hub.docker.com/r/bitnami/mariadb-galera) * Ports: 3306/tcp * JDBC: `jdbc://mariadb:<hostname>:3306` diff --git a/.docs/api/data-service.md b/.docs/api/data-service.md index 66089a1cd69492c4f47f3048de1bcb31ac53c8a3..8ea7bf2a97afea8f7a7caf913b02f04cea762c17 100644 --- a/.docs/api/data-service.md +++ b/.docs/api/data-service.md @@ -6,7 +6,7 @@ author: Martin Weise !!! debug "Debug Information" - Image: [`registry.datalab.tuwien.ac.at/dbrepo/data-service:1.4.7`](https://hub.docker.com/r/dbrepo/data-service) + Image: [`registry.datalab.tuwien.ac.at/dbrepo/data-service:1.9.0`](https://hub.docker.com/r/dbrepo/data-service) * Ports: 9093/tcp * Info: `http://<hostname>:9093/actuator/info` diff --git a/.docs/api/gateway-service.md b/.docs/api/gateway-service.md index 9a44f9635b32ecc0d238ed1c1a0e918157ecd046..7eccf52f47b759932ea2e998dd57f3e1144e33d9 100644 --- a/.docs/api/gateway-service.md +++ b/.docs/api/gateway-service.md @@ -6,7 +6,7 @@ author: Martin Weise !!! debug "Debug Information" - Image: [`docker.io/nginx:1.27.0-alpine3.19-slim`](https://hub.docker.com/r/nginx) + Image: [`docker.io/nginx:1.27.3-alpine3.20-slim`](https://hub.docker.com/r/nginx) * Ports: 80/tcp diff --git a/.docs/api/identity-service.md b/.docs/api/identity-service.md index 3a1ae2bb5509d38fd653eebaa587976371eaabdd..98678d6bcb190f7787a539d5b2cbf78a29ba31d0 100644 --- a/.docs/api/identity-service.md +++ b/.docs/api/identity-service.md @@ -6,7 +6,7 @@ author: Martin Weise !!! debug "Debug Information" - Image: [`docker.io/openldap:2.6.8-debian-12-r1`](https://hub.docker.com/r/openldap) + Image: [`docker.io/bitnami/openldap:2.6.8`](https://hub.docker.com/r/openldap) * Ports: 1389/tcp, 1636/tcp diff --git a/.docs/api/metadata-db.md b/.docs/api/metadata-db.md index a8e7b9c2fb20997a4e34d28c5c5a99dcc214e8fa..47a340aea3b23c2cb9ba33ba231293f4f6a30cc8 100644 --- a/.docs/api/metadata-db.md +++ b/.docs/api/metadata-db.md @@ -4,7 +4,7 @@ author: Martin Weise !!! debug "Debug Information" - Image: [`docker.io/bitnami/mariadb-galera:11.3.2-debian-12-r9`](https://hub.docker.com/r/bitnami/mariadb-galera) + Image: [`docker.io/bitnami/mariadb:11.3.2`](https://hub.docker.com/r/bitnami/mariadb-galera) * Ports: 3306/tcp * JDBC: `jdbc://mariadb:<hostname>:3306` diff --git a/.docs/api/metadata-service.md b/.docs/api/metadata-service.md index a9218b4733dc0e1fe737bfe331d00a6eaec00656..b4066332a944bd07996ccb123f1bb51a32455493 100644 --- a/.docs/api/metadata-service.md +++ b/.docs/api/metadata-service.md @@ -6,7 +6,7 @@ author: Martin Weise !!! debug "Debug Information" - Image: [`registry.datalab.tuwien.ac.at/dbrepo/metadata-service:1.4.7`](https://hub.docker.com/r/dbrepo/metadata-service) + Image: [`registry.datalab.tuwien.ac.at/dbrepo/metadata-service:1.9.0`](https://hub.docker.com/r/dbrepo/metadata-service) * Ports: 9099/tcp * Info: `http://<hostname>:9099/actuator/info` diff --git a/.docs/api/metric-db.md b/.docs/api/metric-db.md index f1fe9c11abdf8cd8fb97b19b4cc658be42c1c7ca..83e63f264628d7a6a11aae7f1db80e4d9684c008 100644 --- a/.docs/api/metric-db.md +++ b/.docs/api/metric-db.md @@ -6,7 +6,7 @@ author: Martin Weise !!! debug "Debug Information" - Image: [`bitnami/prometheus:2.54.1-debian-12-r4`](https://hub.docker.com/r/bitnami/prometheus) + Image: [`bitnami/prometheus:2.54.1`](https://hub.docker.com/r/bitnami/prometheus) * Ports: 8080/tcp diff --git a/.docs/api/search-service.md b/.docs/api/search-service.md index ede6eefd657b29fed767ac84352de1a582b5c073..6797e5d2225b5ba9755ebf7176204b3e9cac4cdf 100644 --- a/.docs/api/search-service.md +++ b/.docs/api/search-service.md @@ -6,7 +6,7 @@ author: Martin Weise !!! debug "Debug Information" - Image: [`registry.datalab.tuwien.ac.at/dbrepo/search-service:1.4.7`](https://hub.docker.com/r/dbrepo/search-service) + Image: [`registry.datalab.tuwien.ac.at/dbrepo/search-service:1.9.0`](https://hub.docker.com/r/dbrepo/search-service) * Ports: 4000/tcp * Health: `http://<hostname>:4000/api/search/health` diff --git a/.docs/api/storage-service.md b/.docs/api/storage-service.md index 5994929a5deb8e8f87fe33265823043a3387c72e..9236a0c3022bde164f3ca14497ee2cad76d82a11 100644 --- a/.docs/api/storage-service.md +++ b/.docs/api/storage-service.md @@ -6,7 +6,7 @@ author: Martin Weise !!! debug "Debug Information" - Image: [`docker.io/chrislusf/seaweedfs:3.59`](https://hub.docker.com/r/chrislusf/seaweedfs) + Image: [`docker.io/chrislusf/seaweedfs:3.71.0`](https://hub.docker.com/r/chrislusf/seaweedfs) * Ports: 8888/tcp, 9000/tcp * Prometheus: `http://<hostname>:9091/metrics` diff --git a/.docs/api/ui.md b/.docs/api/ui.md index 5393c9ff790f5eaf45607f78e42cf7f418720c1e..5bd5688bc752cface92bf41b3b33b1253810e7aa 100644 --- a/.docs/api/ui.md +++ b/.docs/api/ui.md @@ -6,7 +6,7 @@ author: Martin Weise !!! debug "Debug Information" - Image: [`registry.datalab.tuwien.ac.at/dbrepo/ui:1.4.7`](https://hub.docker.com/r/dbrepo/ui) + Image: [`registry.datalab.tuwien.ac.at/dbrepo/ui:1.9.0`](https://hub.docker.com/r/dbrepo/ui) * Ports: 3000/tcp diff --git a/.docs/changelog.md b/.docs/changelog.md index fd2e7b0d9cf3b7852a919c2f05cf11f56a181710..5b8e76b0526ef462c7bd176a9a13ec0e6c322220 100644 --- a/.docs/changelog.md +++ b/.docs/changelog.md @@ -2,13 +2,32 @@ author: Martin Weise --- -## v1.8.2 (2025-04-??) +## v1.9.0 (2025-05-??) + +#### Fixes + +* Fixed a bug where titles, descriptions, creators, etc. were not sorted to the user-specified ordering + in [#531](https://gitlab.phaidra.org/fair-data-austria-db-repository/fda-services/-/issues/531). + +#### Changes + +* Improved S3-related mechanisms to de-duplicate uploaded datasets and remove them on successful import, various + structured logging improvements + in [#528](https://gitlab.phaidra.org/fair-data-austria-db-repository/fda-services/-/issues/528). + +## v1.8.2 (2025-05-15) + +#### Fixes + +* Fixed a bug in the UI where the resource status was displayed as identifier when a draft identifier has been created. #### Features * Added structured logging through the `fluentd` protocol via the lightweight fluentbit in a separate [Logging Service](../api/logging-service) in [#524](https://gitlab.phaidra.org/fair-data-austria-db-repository/fda-services/-/issues/524). +* Added a separate database for the Dashboard Service for high-availability deployment of Grafana + in [#526](https://gitlab.phaidra.org/fair-data-austria-db-repository/fda-services/-/issues/526). #### Changes diff --git a/.docs/concepts/logging.md b/.docs/concepts/logging.md new file mode 100644 index 0000000000000000000000000000000000000000..e205a7fbc9f7789a924c7ea6e3dea825d4471200 --- /dev/null +++ b/.docs/concepts/logging.md @@ -0,0 +1,41 @@ +--- +author: Martin Weise +--- + +:octicons-tag-16:{ title="Minimum version" } 1.8.2 + +DBRepo uses the lightweight open-source logging framework [fluentbit](https://fluentbit.io) to collect, parse and +forward logs to the [Search Database](../../api/search-db). + +!!! info "Only available in the Kubernetes deployment" + +## Collection + +The [Data Service](../../api/data-service) and [Metadata Service](../../api/metadata-service) use Slf4j as logging +facade. Logs are collected with a sidecar in each pod. They are collected with the `tail` plugin from the log files. +For the Data-, Metadata-, Analyse-, Dashboard- and Search Services, the application log is located in +`/var/log/app/service/<name>/app.log` (e.g. `/var/log/app/service/search/app.log` for the Search Service). All log to +console (`/dev/stdout`) as well to the log file simultaneously. The log files are structured and formatted according to +the [Elastic Common Schema](https://www.elastic.co/docs/reference/ecs/logging/intro) (ECS) format such that no parsing +(except `@timestamp`) is needed. + +## Parse + +The logs are parsed directly in the config file of the sidecar. The config file is always located in +`/opt/bitnami/fluent-bit/conf/parsers.conf` and contains the parsing regex. By default, the pre-defined `docker` +parser is used that performs lightweight parsing by just parsing the logs as JSON. + +## Storage + +After parsing, the logs are sent to the [Search Database](../../api/search-db) where they are stored as documents in +the index `logging`. + +## Insights + +The logs can be inspected in the operational dashboard in `https://<hostname>/dashboard/d/aejhojr0mrpj4c` to gain +insight on potential errors. + +<figure markdown> + +<figcaption>Figure 1: Operational Dashboard for Logging</figcaption> +</figure> diff --git a/.docs/images/architecture.drawio b/.docs/images/architecture.drawio index 588ede83e27578b9cb42d9b10551609333fae6d3..bc93b1622773bfa8eca538dadb348868e5905ffd 100644 --- a/.docs/images/architecture.drawio +++ b/.docs/images/architecture.drawio @@ -1,12 +1,9 @@ -<mxfile host="Electron" agent="Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/26.2.2 Chrome/134.0.6998.178 Electron/35.1.2 Safari/537.36" version="26.2.2" pages="9"> +<mxfile host="Electron" agent="Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/26.2.15 Chrome/134.0.6998.205 Electron/35.2.1 Safari/537.36" version="26.2.15" pages="9"> <diagram id="mvBsv1rP8O80Qe3yGnn_" name="docker-compose"> - <mxGraphModel dx="985" dy="565" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="1169" pageHeight="827" math="0" shadow="0"> + <mxGraphModel dx="982" dy="396" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="1169" pageHeight="827" math="0" shadow="0"> <root> <mxCell id="0" /> <mxCell id="1" parent="0" /> - <mxCell id="uDJ2bVtIrgoZBCZFZmDG-26" value="" style="rounded=1;whiteSpace=wrap;html=1;fillColor=none;dashed=1;arcSize=6;" parent="1" vertex="1"> - <mxGeometry x="700" y="574.61" width="150" height="105" as="geometry" /> - </mxCell> <mxCell id="FWEJ_FGA9GBXbfwohBE8-97" value="" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=0;exitDx=0;exitDy=0;entryX=0.75;entryY=1;entryDx=0;entryDy=0;jumpStyle=arc;startArrow=classic;startFill=1;" parent="1" source="FWEJ_FGA9GBXbfwohBE8-101" target="FWEJ_FGA9GBXbfwohBE8-119" edge="1"> <mxGeometry relative="1" as="geometry"> <Array as="points"> @@ -135,13 +132,13 @@ <mxPoint x="3" as="offset" /> </mxGeometry> </mxCell> - <mxCell id="FWEJ_FGA9GBXbfwohBE8-106" value="" style="shape=cylinder3;whiteSpace=wrap;html=1;boundedLbl=1;backgroundOutline=1;size=8.600000000000023;fillColor=#E6E6E6;strokeColor=#000000;" parent="1" vertex="1"> + <mxCell id="FWEJ_FGA9GBXbfwohBE8-106" value="<i>mariadb</i>" style="shape=cylinder3;whiteSpace=wrap;html=1;boundedLbl=1;backgroundOutline=1;size=8.600000000000023;fillColor=#E6E6E6;strokeColor=#000000;" parent="1" vertex="1"> <mxGeometry x="750" y="256" width="50" height="64" as="geometry" /> </mxCell> <mxCell id="FWEJ_FGA9GBXbfwohBE8-107" value="search-db" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;spacing=-1;" parent="1" vertex="1"> <mxGeometry x="732.5" y="320.5" width="85" height="17" as="geometry" /> </mxCell> - <mxCell id="FWEJ_FGA9GBXbfwohBE8-111" value="" style="shape=cylinder3;whiteSpace=wrap;html=1;boundedLbl=1;backgroundOutline=1;size=8.600000000000023;fillColor=#E6E6E6;strokeColor=#000000;" parent="1" vertex="1"> + <mxCell id="FWEJ_FGA9GBXbfwohBE8-111" value="psql" style="shape=cylinder3;whiteSpace=wrap;html=1;boundedLbl=1;backgroundOutline=1;size=8.600000000000023;fillColor=#E6E6E6;strokeColor=#000000;fontStyle=2" parent="1" vertex="1"> <mxGeometry x="560" y="584" width="50" height="64" as="geometry" /> </mxCell> <mxCell id="FWEJ_FGA9GBXbfwohBE8-112" value="auth-db" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;spacing=-1;" parent="1" vertex="1"> @@ -218,7 +215,7 @@ <mxCell id="FWEJ_FGA9GBXbfwohBE8-137" value="" style="shape=cylinder3;whiteSpace=wrap;html=1;boundedLbl=1;backgroundOutline=1;size=8.600000000000023;fillColor=#E6E6E6;strokeColor=#000000;" parent="1" vertex="1"> <mxGeometry x="369.5" y="594" width="50" height="64" as="geometry" /> </mxCell> - <mxCell id="FWEJ_FGA9GBXbfwohBE8-138" value="" style="rounded=1;whiteSpace=wrap;html=1;fillColor=none;dashed=1;arcSize=6;" parent="1" vertex="1"> + <mxCell id="FWEJ_FGA9GBXbfwohBE8-138" value="mariadb-galera" style="rounded=1;whiteSpace=wrap;html=1;fillColor=none;dashed=1;arcSize=6;fontStyle=2" parent="1" vertex="1"> <mxGeometry x="320" y="575" width="150" height="105" as="geometry" /> </mxCell> <mxCell id="FWEJ_FGA9GBXbfwohBE8-139" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;dashed=1;entryX=1.004;entryY=0.397;entryDx=0;entryDy=0;entryPerimeter=0;" parent="1" source="FWEJ_FGA9GBXbfwohBE8-129" target="FWEJ_FGA9GBXbfwohBE8-138" edge="1"> @@ -265,11 +262,11 @@ <mxPoint x="4" y="34" as="offset" /> </mxGeometry> </mxCell> - <mxCell id="a_cl7nsyDpLQFaXOHeFD-3" value="" style="shape=cylinder3;whiteSpace=wrap;html=1;boundedLbl=1;backgroundOutline=1;size=8.600000000000023;fillColor=#E6E6E6;strokeColor=#000000;" parent="1" vertex="1"> - <mxGeometry x="559.5" y="318" width="50" height="64" as="geometry" /> + <mxCell id="a_cl7nsyDpLQFaXOHeFD-3" value="prom" style="shape=cylinder3;whiteSpace=wrap;html=1;boundedLbl=1;backgroundOutline=1;size=8.600000000000023;fillColor=#E6E6E6;strokeColor=#000000;fontStyle=2;fontSize=12;" parent="1" vertex="1"> + <mxGeometry x="370" y="164" width="50" height="64" as="geometry" /> </mxCell> <mxCell id="a_cl7nsyDpLQFaXOHeFD-4" value="metric-db" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;spacing=-1;" parent="1" vertex="1"> - <mxGeometry x="542" y="382" width="85" height="17" as="geometry" /> + <mxGeometry x="352" y="228" width="85" height="17" as="geometry" /> </mxCell> <mxCell id="uDJ2bVtIrgoZBCZFZmDG-6" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=1;entryY=0.5;entryDx=0;entryDy=0;endSize=4;" parent="1" source="uDJ2bVtIrgoZBCZFZmDG-5" target="FWEJ_FGA9GBXbfwohBE8-105" edge="1"> <mxGeometry relative="1" as="geometry" /> @@ -289,7 +286,7 @@ <mxCell id="uDJ2bVtIrgoZBCZFZmDG-10" value="init" style="rounded=1;whiteSpace=wrap;html=1;fontStyle=1" parent="1" vertex="1"> <mxGeometry x="280" y="272" width="40" height="12" as="geometry" /> </mxCell> - <mxCell id="uDJ2bVtIrgoZBCZFZmDG-12" value="<b>Dashboard UI</b><div><i>grafana</i></div>" style="rounded=1;whiteSpace=wrap;html=1;" parent="1" vertex="1"> + <mxCell id="uDJ2bVtIrgoZBCZFZmDG-12" value="<b>Dashboard UI</b><div><i>grafana</i></div>" style="rounded=1;whiteSpace=wrap;html=1;fillColor=#E6E6E6;fontColor=#000000;strokeColor=#000000;" parent="1" vertex="1"> <mxGeometry x="520" y="258" width="130" height="40" as="geometry" /> </mxCell> <mxCell id="uDJ2bVtIrgoZBCZFZmDG-17" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0;entryY=0.5;entryDx=0;entryDy=0;endSize=4;" parent="1" source="uDJ2bVtIrgoZBCZFZmDG-14" target="FWEJ_FGA9GBXbfwohBE8-104" edge="1"> @@ -336,6 +333,23 @@ <mxPoint x="1" y="-12" as="offset" /> </mxGeometry> </mxCell> + <mxCell id="CEhTLEpK94wtDmjaM6P2-1" value="<i>psql</i>" style="shape=cylinder3;whiteSpace=wrap;html=1;boundedLbl=1;backgroundOutline=1;size=8.600000000000023;fillColor=#E6E6E6;strokeColor=#000000;" vertex="1" parent="1"> + <mxGeometry x="560" y="328" width="50" height="64" as="geometry" /> + </mxCell> + <mxCell id="CEhTLEpK94wtDmjaM6P2-2" value="dashboard-db" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;spacing=-1;" vertex="1" parent="1"> + <mxGeometry x="542.5" y="392" width="85" height="17" as="geometry" /> + </mxCell> + <mxCell id="CEhTLEpK94wtDmjaM6P2-3" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;entryPerimeter=0;" edge="1" parent="1" source="uDJ2bVtIrgoZBCZFZmDG-12" target="CEhTLEpK94wtDmjaM6P2-1"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="CEhTLEpK94wtDmjaM6P2-4" value="JDBC" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="CEhTLEpK94wtDmjaM6P2-3"> + <mxGeometry x="-0.3333" relative="1" as="geometry"> + <mxPoint y="1" as="offset" /> + </mxGeometry> + </mxCell> + <mxCell id="uDJ2bVtIrgoZBCZFZmDG-26" value="mariadb-galera" style="rounded=1;whiteSpace=wrap;html=1;fillColor=none;dashed=1;arcSize=6;fontStyle=2" parent="1" vertex="1"> + <mxGeometry x="700" y="574.61" width="150" height="105" as="geometry" /> + </mxCell> </root> </mxGraphModel> </diagram> diff --git a/.docs/images/architecture.svg b/.docs/images/architecture.svg index 369974785eeda30172c581771c30a8b0ec270a69..0cdb8411394fcd6f98ffbc43492d1b38aa74e458 100644 --- a/.docs/images/architecture.svg +++ b/.docs/images/architecture.svg @@ -1,3 +1,3 @@ <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> -<svg xmlns="http://www.w3.org/2000/svg" style="background: #ffffff; background-color: #ffffff; color-scheme: light;" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="611px" height="614px" viewBox="-0.5 -0.5 611 614"><defs/><rect fill="#ffffff" width="100%" height="100%" x="0" y="0" style="fill: rgb(255, 255, 255);"/><g><g data-cell-id="0"><g data-cell-id="1"><g data-cell-id="uDJ2bVtIrgoZBCZFZmDG-26"><g><rect x="420" y="505.61" width="150" height="105" rx="6.3" ry="6.3" fill="none" stroke="#000000" stroke-dasharray="3 3" pointer-events="all" style="stroke: rgb(0, 0, 0);"/></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-97"><g><path d="M 495.01 428.63 L 495.03 411 L 380 411 L 380 171 L 337.49 171 L 337.5 153.37" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: rgb(0, 0, 0);"/><path d="M 495 433.88 L 491.51 426.88 L 495.01 428.63 L 498.51 426.89 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/><path d="M 337.5 148.12 L 341 155.12 L 337.5 153.37 L 334 155.12 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-98"><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 172px; margin-left: 361px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; background-color: #ffffff; "><div style="display: inline-block; font-size: 11px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; ">HTTP</div></div></div></foreignObject><image x="346.5" y="166" width="29" height="15.75" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHQAAAA/CAYAAAAxBeyIAAAAAXNSR0IArs4c6QAAA/xJREFUeF7tm78vNEEYx78rEoUG0VGJHxGJSIiIQuFHkKAglCRErVKQUChIUPgDRChPUIqCwu9EQSHRiEgkNKIhUQg5mXvf2/f23tubW7Nr5jbf7dzMPM8z388882uXFY1Go+ATGgUsAg0Ny1hHCDRcPAk0ZDwJlEDDpkDI+sM1lEBDpkDIusMMDTPQ1dVVjI+P213s7OzE3t6eUpeLi4vx8vJi27i6ukJdXZ399/7+Pjo6OpR8yBqPjIxgfX0dv+krMabS0lI8Pj7KwnSU5+fno6CgAKJtY2MjWltb0dPTg9zc3LR2HBlKoJ40T1k5PnhUgaYyLuDOzs46ki65HoGqM3RYCBJo3FFfXx82NzeRl5f3X/TagT49PWF3dzcjWaenp/H8/GzXnZqaQllZmbRtZWUlWlpa8Ju+0mXo/Pw8KioqXOP++vrC6+sr7u/vcXZ2hqOjIyRfuQ8MDGBra8s8oFIaCRXKy8txd3dn/3J+fo6mpiYvJjKu66ev5DXUa9y3t7exafbw8NARfyQSwdDQkOM37RmascIA/BRZ5tdPX6pARawfHx9ob2/H8fGxHXp1dTVubm4IVAZTlJsGVMR0fX2N2tpaR/gie0Ws8YcZ6kLXRKAi1JqaGkdWbmxsYHh4mEBlWWoq0MHBQcdmaHFxEZOTkwSarUDHxsawtrZmhz8zM4O5uTkCzVag4riys7Njh7+ysoKJiQkCzVagyUvB9vY2+vv7CTQbgV5eXqK+vt4OPScnJ3bRUlRUlBlQcZuRuIOSiZCqfGFhAe/v73ZR8uW8F5t+blRkfv305dc5tK2tDScnJ3boqV6epD22yDr9k3ICBbzeFD08PGB0dBQHBwf/MtGycHFxgYaGhswvFn4CTNaGQIHl5WVUVVW5SiXubd/e3iBAnp6exl5hfn5+OuqLna3Y4SY/zFANFwuyQS8rF+dOcf5M9fCmKIuAiqxeWlpCb2+vK3MCNRSoeNdZWFiIkpISNDc3o6urC93d3bAsK20CE6gGoF43RbIpOLGcQAnUy3gBZB+JebHm59lQ5tdPX36cQ2XxxsuZoczQTMfKn3rMUMQ+xUz8jJNr6N8x5Oc0KBuWfvoi0F+YBglUpoBLOadcTrmuQ8fPaVA2Pv30xSmXU65svPHqz6tCzFCuoa5jRtuU63UUs755CvAffs1johQRgSrJZ15jAjWPiVJEBKokn3mNCdQ8JkoREaiSfOY1JlDzmChFRKBK8pnXmEDNY6IUEYEqyWdeYwI1j4lSROm/2lUyzcY6FCBQHaoH6JNAAxRXh2kC1aF6gD4JNEBxdZgmUB2qB+iTQAMUV4dpAtWheoA+CTRAcXWYJlAdqgfok0ADFFeH6W97Qt2suZ3FFgAAAABJRU5ErkJggg=="/></switch></g></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-143"><g><path d="M 115.01 428.63 L 115.03 411 L 220 411 L 220 171 L 272.51 171 L 272.5 153.37" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: rgb(0, 0, 0);"/><path d="M 115 433.88 L 111.51 426.88 L 115.01 428.63 L 118.51 426.89 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/><path d="M 272.5 148.12 L 276 155.12 L 272.5 153.37 L 269 155.12 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-144"><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 171px; margin-left: 240px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; background-color: #ffffff; "><div style="display: inline-block; font-size: 11px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; ">HTTP</div></div></div></foreignObject><image x="225.5" y="165" width="29" height="15.75" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHQAAAA/CAYAAAAxBeyIAAAAAXNSR0IArs4c6QAAA/xJREFUeF7tm78vNEEYx78rEoUG0VGJHxGJSIiIQuFHkKAglCRErVKQUChIUPgDRChPUIqCwu9EQSHRiEgkNKIhUQg5mXvf2/f23tubW7Nr5jbf7dzMPM8z388882uXFY1Go+ATGgUsAg0Ny1hHCDRcPAk0ZDwJlEDDpkDI+sM1lEBDpkDIusMMDTPQ1dVVjI+P213s7OzE3t6eUpeLi4vx8vJi27i6ukJdXZ399/7+Pjo6OpR8yBqPjIxgfX0dv+krMabS0lI8Pj7KwnSU5+fno6CgAKJtY2MjWltb0dPTg9zc3LR2HBlKoJ40T1k5PnhUgaYyLuDOzs46ki65HoGqM3RYCBJo3FFfXx82NzeRl5f3X/TagT49PWF3dzcjWaenp/H8/GzXnZqaQllZmbRtZWUlWlpa8Ju+0mXo/Pw8KioqXOP++vrC6+sr7u/vcXZ2hqOjIyRfuQ8MDGBra8s8oFIaCRXKy8txd3dn/3J+fo6mpiYvJjKu66ev5DXUa9y3t7exafbw8NARfyQSwdDQkOM37RmascIA/BRZ5tdPX6pARawfHx9ob2/H8fGxHXp1dTVubm4IVAZTlJsGVMR0fX2N2tpaR/gie0Ws8YcZ6kLXRKAi1JqaGkdWbmxsYHh4mEBlWWoq0MHBQcdmaHFxEZOTkwSarUDHxsawtrZmhz8zM4O5uTkCzVag4riys7Njh7+ysoKJiQkCzVagyUvB9vY2+vv7CTQbgV5eXqK+vt4OPScnJ3bRUlRUlBlQcZuRuIOSiZCqfGFhAe/v73ZR8uW8F5t+blRkfv305dc5tK2tDScnJ3boqV6epD22yDr9k3ICBbzeFD08PGB0dBQHBwf/MtGycHFxgYaGhswvFn4CTNaGQIHl5WVUVVW5SiXubd/e3iBAnp6exl5hfn5+OuqLna3Y4SY/zFANFwuyQS8rF+dOcf5M9fCmKIuAiqxeWlpCb2+vK3MCNRSoeNdZWFiIkpISNDc3o6urC93d3bAsK20CE6gGoF43RbIpOLGcQAnUy3gBZB+JebHm59lQ5tdPX36cQ2XxxsuZoczQTMfKn3rMUMQ+xUz8jJNr6N8x5Oc0KBuWfvoi0F+YBglUpoBLOadcTrmuQ8fPaVA2Pv30xSmXU65svPHqz6tCzFCuoa5jRtuU63UUs755CvAffs1johQRgSrJZ15jAjWPiVJEBKokn3mNCdQ8JkoREaiSfOY1JlDzmChFRKBK8pnXmEDNY6IUEYEqyWdeYwI1j4lSROm/2lUyzcY6FCBQHaoH6JNAAxRXh2kC1aF6gD4JNEBxdZgmUB2qB+iTQAMUV4dpAtWheoA+CTRAcXWYJlAdqgfok0ADFFeH6W97Qt2suZ3FFgAAAABJRU5ErkJggg=="/></switch></g></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-77"><g><path d="M 376.37 137 L 388 137 L 388 331 L 495.03 331 L 495.01 346.63" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: rgb(0, 0, 0);"/><path d="M 371.12 137 L 378.12 133.5 L 376.37 137 L 378.12 140.5 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/><path d="M 495 351.88 L 491.51 344.88 L 495.01 346.63 L 498.51 344.89 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-78"><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 295px; margin-left: 450px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; background-color: #ffffff; "><div style="display: inline-block; font-size: 11px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; ">HTTP</div></div></div></foreignObject><image x="435.5" y="289" width="29" height="15.75" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHQAAAA/CAYAAAAxBeyIAAAAAXNSR0IArs4c6QAAA/xJREFUeF7tm78vNEEYx78rEoUG0VGJHxGJSIiIQuFHkKAglCRErVKQUChIUPgDRChPUIqCwu9EQSHRiEgkNKIhUQg5mXvf2/f23tubW7Nr5jbf7dzMPM8z388882uXFY1Go+ATGgUsAg0Ny1hHCDRcPAk0ZDwJlEDDpkDI+sM1lEBDpkDIusMMDTPQ1dVVjI+P213s7OzE3t6eUpeLi4vx8vJi27i6ukJdXZ399/7+Pjo6OpR8yBqPjIxgfX0dv+krMabS0lI8Pj7KwnSU5+fno6CgAKJtY2MjWltb0dPTg9zc3LR2HBlKoJ40T1k5PnhUgaYyLuDOzs46ki65HoGqM3RYCBJo3FFfXx82NzeRl5f3X/TagT49PWF3dzcjWaenp/H8/GzXnZqaQllZmbRtZWUlWlpa8Ju+0mXo/Pw8KioqXOP++vrC6+sr7u/vcXZ2hqOjIyRfuQ8MDGBra8s8oFIaCRXKy8txd3dn/3J+fo6mpiYvJjKu66ev5DXUa9y3t7exafbw8NARfyQSwdDQkOM37RmascIA/BRZ5tdPX6pARawfHx9ob2/H8fGxHXp1dTVubm4IVAZTlJsGVMR0fX2N2tpaR/gie0Ws8YcZ6kLXRKAi1JqaGkdWbmxsYHh4mEBlWWoq0MHBQcdmaHFxEZOTkwSarUDHxsawtrZmhz8zM4O5uTkCzVag4riys7Njh7+ysoKJiQkCzVagyUvB9vY2+vv7CTQbgV5eXqK+vt4OPScnJ3bRUlRUlBlQcZuRuIOSiZCqfGFhAe/v73ZR8uW8F5t+blRkfv305dc5tK2tDScnJ3boqV6epD22yDr9k3ICBbzeFD08PGB0dBQHBwf/MtGycHFxgYaGhswvFn4CTNaGQIHl5WVUVVW5SiXubd/e3iBAnp6exl5hfn5+OuqLna3Y4SY/zFANFwuyQS8rF+dOcf5M9fCmKIuAiqxeWlpCb2+vK3MCNRSoeNdZWFiIkpISNDc3o6urC93d3bAsK20CE6gGoF43RbIpOLGcQAnUy3gBZB+JebHm59lQ5tdPX36cQ2XxxsuZoczQTMfKn3rMUMQ+xUz8jJNr6N8x5Oc0KBuWfvoi0F+YBglUpoBLOadcTrmuQ8fPaVA2Pv30xSmXU65svPHqz6tCzFCuoa5jRtuU63UUs755CvAffs1johQRgSrJZ15jAjWPiVJEBKokn3mNCdQ8JkoREaiSfOY1JlDzmChFRKBK8pnXmEDNY6IUEYEqyWdeYwI1j4lSROm/2lUyzcY6FCBQHaoH6JNAAxRXh2kC1aF6gD4JNEBxdZgmUB2qB+iTQAMUV4dpAtWheoA+CTRAcXWYJlAdqgfok0ADFFeH6W97Qt2suZ3FFgAAAABJRU5ErkJggg=="/></switch></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-79"><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 331px; margin-left: 450px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; background-color: #ffffff; "><div style="display: inline-block; font-size: 11px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; ">HTTP</div></div></div></foreignObject><image x="435.5" y="325" width="29" height="15.75" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHQAAAA/CAYAAAAxBeyIAAAAAXNSR0IArs4c6QAAA/xJREFUeF7tm78vNEEYx78rEoUG0VGJHxGJSIiIQuFHkKAglCRErVKQUChIUPgDRChPUIqCwu9EQSHRiEgkNKIhUQg5mXvf2/f23tubW7Nr5jbf7dzMPM8z388882uXFY1Go+ATGgUsAg0Ny1hHCDRcPAk0ZDwJlEDDpkDI+sM1lEBDpkDIusMMDTPQ1dVVjI+P213s7OzE3t6eUpeLi4vx8vJi27i6ukJdXZ399/7+Pjo6OpR8yBqPjIxgfX0dv+krMabS0lI8Pj7KwnSU5+fno6CgAKJtY2MjWltb0dPTg9zc3LR2HBlKoJ40T1k5PnhUgaYyLuDOzs46ki65HoGqM3RYCBJo3FFfXx82NzeRl5f3X/TagT49PWF3dzcjWaenp/H8/GzXnZqaQllZmbRtZWUlWlpa8Ju+0mXo/Pw8KioqXOP++vrC6+sr7u/vcXZ2hqOjIyRfuQ8MDGBra8s8oFIaCRXKy8txd3dn/3J+fo6mpiYvJjKu66ev5DXUa9y3t7exafbw8NARfyQSwdDQkOM37RmascIA/BRZ5tdPX6pARawfHx9ob2/H8fGxHXp1dTVubm4IVAZTlJsGVMR0fX2N2tpaR/gie0Ws8YcZ6kLXRKAi1JqaGkdWbmxsYHh4mEBlWWoq0MHBQcdmaHFxEZOTkwSarUDHxsawtrZmhz8zM4O5uTkCzVag4riys7Njh7+ysoKJiQkCzVagyUvB9vY2+vv7CTQbgV5eXqK+vt4OPScnJ3bRUlRUlBlQcZuRuIOSiZCqfGFhAe/v73ZR8uW8F5t+blRkfv305dc5tK2tDScnJ3boqV6epD22yDr9k3ICBbzeFD08PGB0dBQHBwf/MtGycHFxgYaGhswvFn4CTNaGQIHl5WVUVVW5SiXubd/e3iBAnp6exl5hfn5+OuqLna3Y4SY/zFANFwuyQS8rF+dOcf5M9fCmKIuAiqxeWlpCb2+vK3MCNRSoeNdZWFiIkpISNDc3o6urC93d3bAsK20CE6gGoF43RbIpOLGcQAnUy3gBZB+JebHm59lQ5tdPX36cQ2XxxsuZoczQTMfKn3rMUMQ+xUz8jJNr6N8x5Oc0KBuWfvoi0F+YBglUpoBLOadcTrmuQ8fPaVA2Pv30xSmXU65svPHqz6tCzFCuoa5jRtuU63UUs755CvAffs1johQRgSrJZ15jAjWPiVJEBKokn3mNCdQ8JkoREaiSfOY1JlDzmChFRKBK8pnXmEDNY6IUEYEqyWdeYwI1j4lSROm/2lUyzcY6FCBQHaoH6JNAAxRXh2kC1aF6gD4JNEBxdZgmUB2qB+iTQAMUV4dpAtWheoA+CTRAcXWYJlAdqgfok0ADFFeH6W97Qt2suZ3FFgAAAABJRU5ErkJggg=="/></switch></g></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-81"><g><path d="M 305 399.37 L 305 428.63" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: rgb(0, 0, 0);"/><path d="M 305 394.12 L 308.5 401.12 L 305 399.37 L 301.5 401.12 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/><path d="M 305 433.88 L 301.5 426.88 L 305 428.63 L 308.5 426.88 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 409px; margin-left: 305px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; background-color: #ffffff; "><div style="display: inline-block; font-size: 11px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; ">LDAP</div></div></div></foreignObject><image x="290.5" y="403" width="29" height="15.75" xlink:href="data:image/png;base64,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"/></switch></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-82"><g><rect x="72.5" y="589" width="85" height="20" fill="none" stroke="none" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 89px; height: 1px; padding-top: 599px; margin-left: 71px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">data-db</div></div></div></foreignObject><image x="71" y="592.5" width="89" height="17" xlink:href="data:image/png;base64,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"/></switch></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-83"><g><path d="M 82.5 428.63 L 82.5 393" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: rgb(0, 0, 0);"/><path d="M 82.5 433.88 L 79 426.88 L 82.5 428.63 L 86 426.88 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-84"><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 411px; margin-left: 83px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; background-color: #ffffff; "><div style="display: inline-block; font-size: 11px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; ">AMQP</div></div></div></foreignObject><image x="67" y="405" width="32" height="15.75" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIAAAAA/CAYAAAAoosBrAAAAAXNSR0IArs4c6QAADUhJREFUeF7tnHeQFEUUxh+ISDKAKEEBQTIUKskIAorIkXMSYwkKJhRFECQYMICgIjkntQo9wJKoYI6FoIgKCIogJgwlBlDgrF9X9VRvb5ievbkT7ub9dbfb3dP9+usXvtezBbKysrIkknyrgQIRAPLt3quFRwDI3/sfASCf738EgAgAURCYrzEQxQD5evujIDCfb38EgAgAQXmAJk2ayFtvvRWjuOXLl0u7du3SUuaXX34p1apVi+s7ceJEuf3229Ma0+y0detWqVmzZtw4L730krRt2zat8T/++GNZuXKlfPDBB7J9+3b59ttv5c8//xTCqRNPPFFKly6tnnnuuedK69atpXHjxlKwYMHAz0qmm1QDFShQQE466SQpWbKkVK1aVc4//3y1zgsuuCBht0AxwOeffy61a9eOG4jNBwTpSLJForyNGzemM2RMn2HDhsnYsWOzDYDDhw/LvHnz5IknnpAtW7YEmlfFihUVmPv37y/Fixd37psOAJINXr9+fXnyySflkksuiWkSCACDBg0STqYtxx13nHzzzTdSvnx558XphqkWuWnTJjnnnHMCj6k7cCLPOussNTdbgliAzZs3y1VXXSWffPJJ2nOhY6VKlWTatGnSqlUrp3HCBAAPxAqNGTNG7rvvPu/5zgA4ePCgnHHGGfLzzz+rzmz23r17vYEefPDBmIGdVigi9iKZ5JEjR1T3O+64QyZMmOA6VFy7devWyWWXXaY+N8flf1cALFu2THr16iV///133PiY+ubNmyuQnXbaaXL88cfLjz/+qPTy+uuvy9dffx3XBxP92GOPyeDBg33XZeuG8RcvXpyy3z///CO//fabYK1Z/2effRbX/qmnnpJbb71Vfe4MgEWLFqlToGX69OmCed23b5/6qEqVKmozWWAQsRfZqFEj+fDDD9UQKBX/ysLTkWuvvVaZbaRevXoxJ9gFAOvXr5eWLVsK5t8UNn306NFy8cUXp/TtKJ+D8dxzz6n4wBRAcPfdd6dclq2bE044QQ4cOBBIFWvXrpUbb7xRdu3a5fUrUqSIEBvhmpwBcOmll8obb7yhBilUqJB8//33cu+998rMmTO9gV955RXvxLnO0l4koHr44Ye97kuXLpUOHTq4Due1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"/></switch></g></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-85"><g><rect x="50" y="435" width="130" height="40" rx="6" ry="6" fill="#ffffff" stroke="#000000" pointer-events="all" style="fill: rgb(255, 255, 255); stroke: rgb(0, 0, 0);"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 128px; height: 1px; padding-top: 455px; margin-left: 51px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; font-weight: bold; white-space: normal; word-wrap: normal; ">Data Service</div></div></div></foreignObject><image x="51" y="448.5" width="128" height="17" xlink:href="data:image/png;base64,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"/></switch></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-86"><g><path d="M 115.03 481.37 L 115.03 500.03 L 114.63 518.63" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: rgb(0, 0, 0);"/><path d="M 115.03 476.12 L 118.53 483.12 L 115.03 481.37 L 111.53 483.12 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/><path d="M 114.52 523.88 L 111.17 516.81 L 114.63 518.63 L 118.17 516.96 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-87"><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 498px; margin-left: 115px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; background-color: #ffffff; "><div style="display: inline-block; font-size: 11px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; ">JDBC</div></div></div></foreignObject><image x="100.5" y="492" width="29" height="15.75" xlink:href="data:image/png;base64,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"/></switch></g></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-88"><g><path d="M 186.37 373 L 233.63 373" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: rgb(0, 0, 0);"/><path d="M 181.12 373 L 188.12 369.5 L 186.37 373 L 188.12 376.5 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/><path d="M 238.88 373 L 231.88 376.5 L 233.63 373 L 231.88 369.5 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-89"><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 373px; margin-left: 210px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; background-color: #ffffff; "><div style="display: inline-block; font-size: 11px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; ">LDAP</div></div></div></foreignObject><image x="195.5" y="367" width="29" height="15.75" xlink:href="data:image/png;base64,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"/></switch></g></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-90"><g><path d="M 115.01 346.63 L 115.03 331 L 210 331 L 210 137 L 233.63 137" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: rgb(0, 0, 0);"/><path d="M 115 351.88 L 111.51 344.88 L 115.01 346.63 L 118.51 344.89 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/><path d="M 238.88 137 L 231.88 140.5 L 233.63 137 L 231.88 133.5 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-91"><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 331px; margin-left: 190px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; background-color: #ffffff; "><div style="display: inline-block; font-size: 11px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; "><div>AMQP,<br />MQTT</div></div></div></div></foreignObject><image x="173" y="318.5" width="34" height="28.75" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIgAAABzCAYAAABD70qIAAAAAXNSR0IArs4c6QAAFVpJREFUeF7tnQW0XTXThnNxp7gVd3cv7sXdXYsXd3coUqC4Fddixd0pXgoUdy9eoEDhfv+Tv3PWnNwtyd776sms9a2P3rMje/LuZPLOZNLU3NzcbKJEDaRooCkCJGIjSwMRIBEfmRqIAIkAiQCJGCiugTiDFNddQ5SMAGmIYS7+khEgxXXXECUjQBpimIu/ZDBAlltuOfPMM8/UtXj33Xebddddt1AvPvjgAzP77LO3KHvuueea/fbbr1CdutC7775r5pprrhb13HPPPWadddYpVP8bb7xh7r//fjNo0CDz/vvvmy+//NL8/vvvBs5xwgknNJNPPrltc6GFFjJrrbWWWWKJJcxoo40W3FaabjJ5i6YmM9FEE5lJJpnEzDbbbGbJJZe077nUUksFt0+BIIC88847Zp555mnREOAAJEUkTQko97XXXitSZV2ZI444wpx66qmlAfLvv/+aa665xpx99tnmrbfeCurXDDPMYMG+++67m/HHH9+7bBGApFW+yCKLmPPOO8/06NHDu/1ggPTu3dvwZbsy+uijm88++8xMO+20QY3zcJYSXn/9dbPgggsG1ykF+KJnmmkm2zdXQmaQN99802yzzTZm8ODBhftCwRlnnNFccsklZo011vCqp0qA0CCz2AknnGCOPPJIr/aDAPLXX3+Z6aabzvzwww+2csDw1Vdf1Ro66aSTghqWgq4SeIn//vvP/rz//vubc845x/tl3Acfe+wxs8oqq9g/63r5ty9A7rrrLrPllluaP//8s0U/WEpWWmklC8IpppjCjDnmmOa7776zennyySfNJ5980qJMU1OTOeOMM8xBBx2U+16ubqj/hhtuyCz3999/m59//tkw2/P+b7/9dovn+/bta/bZZ5/c9oMAcv3119uvSOTSSy81TN/Dhg2zf5plllnsbIACQsRVwuKLL25eeuklWwVKZ31HMUVkhx12sMsCssACC9TNAD4Aefzxx81qq61mWF60AIrjjz/eLLvsspm2BYPDh3PTTTdZ+0QLIDn44IMzX8vVzdhjj21GjBgRpIqHH37Y7LrrrubTTz+tlRtnnHEMthlLX5542yArrLCCeeqpp2x9Y4wxhvnmm2/MYYcdZi6//PJaG4888kjti81rWH53lQDoTjnllFrxO++806y//vq+1dWe++OPP8xUU01lhg8fbv/Wq1cvc9FFF9V+zwMIswDr9rffflsrwwBdddVVdkYJEYz6DTbYoDb7UpYZ7b777stcbqoACG0BDgxlZjcR9NGvX7/c1/ACiLsTwDLn5R566KG6F9x8883t1xIirhKY/q688kqD/YGg2AEDBoRUaZ+97rrrzLbbbmv/my8GcOy4447eAFl99dUNX58I4HjwwQcNH0oRQYcrrrii/bBEWJqYZcYdd9zEKqsCCJWff/75Zt9996210717d/P555/nvooXQA488EBrvYug/K233tpOvTQkL40SWRImm2yy3IblAVcJZ511luHrP+aYY+wjLC98zaz3IaIHeO211zabbbaZ2X777b0A8uKLL7bYFlax7X7ggQdMz54965abrKWmSoAwE04zzTR1bTOz5C0zuQDB6ME4FVtjggkmsNPueOONZ5WNsdWnT5+a4gESux1fcZXA8rLeeuuZ+eabr1ZF6OAAUl5cjN0rrrjC2kY77bSTF0A23HBDw9ImApfw/PPPB9tXSTrQdhG/s7P58MMPDTtBV6oECHVj08k48m94HGy+LMkFyI033mi22mqrWh0777xznd3BFDnvvPPWfocnCeEJXCUcd9xx5thjj7VEE9MyEsqJnH766dY+QsYaayw7w912221mt912ywXIr7/+aiaddNI6w5Rlk+WzCmHLjMGs5YknnkhcuqoGyKyzzmo++uijWtOPPvqoWXnllcsBBIudFxB59tlnzTLLLFNXKSwd07LIc889Z5ZeemkvfbpKOOqoo8yJJ55o9+sARSSEE2H2EZButNFG5vbbb7f8wx577JELEGwrliQRGElmzKI7qSQloJsXXnih9tOhhx5qTjvttFafQVj6f/zxxyCdZs4g0Mhzzjlnbd3iv4cOHdriRdjywhKKYAxiaPqICxBIHLaGrI8zzzxzrW1fTuSVV14xiy22WK1peAyWrIsvvtjuZETSdjEMFnaBCDbDwIEDfV7F+xm3DQxf/RFKRVXOICy72IsiLLnff/99rr2YCRD26RiNIkzdhxxySAtFMC1jAGFcItDJX3/9tfVL5EkaQCjH9AcXgfhyIlDa7ITcMr4AwW+hAcFMdvTRR+e9RtDv2DfYOSJsx/XupjUAAuF4wAEH1Nr0XbZTAYJxCuJAGQL3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"/></switch></g></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-92"><g><rect x="50" y="353" width="130" height="40" rx="6" ry="6" fill="#e6e6e6" stroke="#000000" pointer-events="all" style="fill: rgb(230, 230, 230); stroke: rgb(0, 0, 0);"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 128px; height: 1px; padding-top: 373px; margin-left: 51px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "><b>Broker Service</b><div><i>rabbitmq</i></div></div></div></div></foreignObject><image x="51" y="359" width="128" height="32" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAgAAAACACAYAAAB9V9ELAAAAAXNSR0IArs4c6QAAIABJREFUeF7tnQXYPU9Vxw+CAtIlLY00CooIKKk0SEqbCEqoICCgpDRKd3eDdIOIIAoqoRICBq1S0iF6Pzw7eDyemZ29d3ff+3vf73me3/OH985OfGd25zun5jgmEQJCQAgIASEgBI4cAsc5ciPWgIWAEBACQkAICAETAdAiEAJCQAgIASFwBBEQATiCk64hCwEhIASEgBAQAdAaEAJCQAgIASFwBBEQATiCk64hCwEhIASEgBAQAdAaEAJCQAgIASFwBBEQATiCk64hCwEhIASEgBAQAdAaEAJCQAgIASFwBBEQATiCk36MD/nXzOwJlTH8mJm9+xgfn7ovBDIEPr5Z92dMfnjpZs3/vCATAtsgIAKwDWp65iAREAFYH/0fMLNzm9l5zOwUZnYSM/tBM/uGmX3FzP7TzD5qZh82s39bv3tHokURgCMxzesOUgRgHbyvZGav3qEpPrRfNrMvDR/aD5jZX5nZK83sP3ao91h8VARgnVnjtHkDM7vOZp39hJkdr7PZfxrW+tPN7C87n1GxcQREAMYxUomJCIgATARsy+K7EoBas/81fGzvZmZ/u2XfjrXHRACWnbGTmtnvm9ltzOwEOzb1ejNjvv51x3r0uJkIgFbB7AiIAMwOaVrhUgSgNPbfZnbP4d86Izq4VkQAlsP+h83sVWZ2/hmbQEN1FTN754x1HsWqwO/0ycBfM5Cso4iJxrwjAiIAOwLY+fjSBKB04/4bu+ydO/t0rBYTAVhm5k5sZu8xs7MvUP0nzOzHzezTC9StKoWAENgSARGALYGb+NhaBOA7ZnZJM3vHxP4dS8VFAJaZrUea2a0aVX/dzP5s4xPwvsHRD78UHAHPamaXMLMLjHTryWb2q8t0XbUKASGwDQIiANugNv2ZFgEgjAeba02YoxOZ2ZmHzf2mZnbKRnmcr35xehePmSdEAOafKtYX3vts6Jk82sz+wMw+12j6p8yMTZ5IgUy+bWbnkD/A/JOnGoXAtgiIAGyL3LTnWgTgaWb2SxOqIwwL738+uJnwIT/thPqOtaIiAPPP2LXN7EWVap9jZjfqbPJUg63/bJXyv7Uhrw/vrEvFhIAQWBgBEYCFAR6qn5MAUCXqVlSxNcF7GxVtJn9sZr+T/PDmjYr3cu7vaBF+3czOZ2YnH/5OONi7RiD7PjP7aTO7rJn9zJC85NRD7Djx4p81M2zCf74p85bhH6fDXtmFAFzczBhn5t3+3qHf9LElnGKvbGaXN7MfMTPGBj5fHE7R/zAQtJcPY+0Z1zXMDE1QFKI8vt/McPJEMO/c0cwYB+2C9R3M7ME9jTTKUMcDK79fYYPLGyfUf73Nmnl+KE//P7nRADxjoo8K4/xZM7vMRruAgyJjRkuBYyFEl1DYV2xMEK9rrPfY9V3X/2+b2Y0reFzTzF42AauHbbQqt62UZ02whorMFQVwws27x5yCK/j+kJmdZlhLnzezfxnCN8GVeS9rb8Kwvld0iXdlm37omQoCIgDrLI25CQC9Rh2LNiAT/v6Fym/32LzUd09+I4zwIsPfH7/ZpG+elGkRgOMOJ8W7DhtjL7LEjT9gUB9/q+OhbQkAGwgbRqYd4ePKxxBiUpNzbX4AO2Lj2XjHhLwN9zGzh3RsTmxwEJNMTjYk2sH089Sk7TkIAJs/9WRyUTP7m7HBut9JGsS42UhIDsQ/5rhGSLOqIaJ/2NByxWf+eZMn43cbWgxfftf1z4aJBi6TJ030yAcj1mUUSDIe//592JUAMC+805gbT9c5n/844DqF1FD1ku9KZ9dVrAcBEYAelHYvswQB4AQEc4/ytcFnoMbca6c9srjx4v7ysBlno64RAFS/nPq8BmEqam8fks6MeYpvQwDwcH+bmV0o6RQndzQWLY0KqVafOeC6zbjQGLQ0C+AKOcnkTJsTPv1HQ8FHPMocBKC2KdIWm8YTpw56y/J8j+692fggkdsIjoycqFun1l3XP6mmPzVoI2IfPzNs3D2n5tac43MRHTJ3IQBoTtAw4ay5jTxl0Ab2aOqWfle26b+eqSAgArDO0pibAHBq4PSQCWo7VHw1IcFLZofl44WjISc2Np1MMgJAWVT5c4SPoSbGt6GVOGYqAeC0/idmdvVkQJywmJs3NfC6iZnhp9Fz6q9Vw+aOOaR2Cr7gsMFnz59380c26F+oVD4HAcAHhY98Jh8bCFJtvc35BtU0T1PaYG3ja7Dk+n/MJqTxlpUGWL89UTj3bZhD2Kj/ItS/LQFAYwH5PecUEJOyLzaz646QqzXelR2Hocc9AiIA66yHOQkAqvYXbGK2r1XpOhtFtMH6orfYqAAfmzxLTnc2V5y+ahIJACdSQsN+svEMGwj2fuy2mCY4bZ+lUZ7NkjLfrJSZSgCwj9++UtfNBrt0rTtsvvg8ZN7xhMWBIymeGRsfWuy29A+7fRTU4rVoD3wJSO+cCfP8ws3JmHnPZA4CgNMexK8mjI9EU5AE1skSwlxAtDLhxI29HC3RV4doAspftVIe+/YbKr/Nsf4hc5DeTO63Wbt36QDo/ZWIiY9UNuttCADfd8wVaKAyQVMBOfi7zfxSlsu0LtboO2aWP6r8vta70gGtivQiIALQi9Ru5XYlAGxAnLQ5Xdx6SKqS9QhnKNpqqSBx7Htc8jA5BP7UqfH56PMRxdSAHZrwLp5FFV2kdYrBB+E3Ns89N2nrhkMfuFQmE0LOsAFnMoUAEHdeU1+jZqb/LYHcQEaiYDbA3JHZxi81OKXhbOUFbQMZ9rCrRuGinQ9WOkI6XTY0BA0Cc4JNHUdGtC4QtjlU9LTT0hzRPps/2hK0TG8d1kKPWngE5u86UaL1ydYDKnccLrMQRIhd5gDJJgqpwokyyhzrn+8mGhE0ZlHYTNHotITNEmfRTO5V8dHZhgC01j/1cc9DND1detCYFcdf30fMi5D3f086vta7MraW9PsEBEQAJoC1Q9E1EgHxYcb+xoVBLWltoOU5bKmw/ZbjFrkI+Ahin47CpsCHhBNbTdhA2cyyNcgHhg8NH5wovQSA9tnUstM41wmzEbSEzHW19LWofzMSVeqr2ZkfNHjxx3ZRz2bEwJfjxEk4HmaSJYRNC21H5mdQa4/T+F8P6mpOkpACPMmnSg0vSCn9qm2WtMMJl1TDUdAOkNZ4yvopZXvWP3PJO5IJxAySVhM0BGiEMoEMZmthKgHgvQK3LC8DxAitHXOXyfXN7HmV39AEYZLysua70oBVP01FQARgKmLblV+SAKA6Ri2HB3KP89EYAXh2I8zJj771EcucmDLkntWIMccZEa/3KD0EgA2Vm+iyhElsCqjqs9OhbwuSQFtRIFio+zEB1ARShAbl+KEAqmxOjbHtMQKAdgDzyxi52251/u9T5ANAozCFBPg22bDRihBCxgZSM2vEfrLhZTZqCGLRftTGxu9ovqJgJmMjm7J+KNu7/omYqW2ghApisqgJxJJNMwqn8Zo5bSoBqOFCm8wN0Swtqc0JGsALhwfXfFd2XeN63iEgArDOcliCAPCxxbmNDxYn3bH49TLS1gbKiR97MBvVmHDaQ92dCd72La/68kzrI0XMOHbeKGMEgJAwnLBQAUfhg41moMeO/aEhKiLWgaYFlfSY1FSibBzx5sYxAsDG/JKxBmf6nf6R0S9+5Lepno2ZE2NLE0S4W02rwS2XRAW0BFMIaz9qejDT4HMSSfFc658+QXCyddZaIxDAmpMrEQyPqAx2KgFohXb2rCdyHWTJxvjuYHrxIYprvivbrEM9U0FABGCdpbEEAfA9x2GODYL4/potuZRvfQA5uWXe8hEl7NvY+LOTIrH0tSiCWA/Psxlnd82zkWcZ5Vr955SME1Zmy6Y+PmhjYYb0kbCpzM7Jb/g04NswJo+qaDewy7LBemkRAFTqaBzmsLWP9bn8zncBj2/8TfCB2OU7wQZM8h0uqcryPNAOp/VMaB8t0ZhwiVEWT08imujcOMf6L/3hfYvqcH5jrgjRzXJx1KJweOaMg89NNt6pBACTTC3sj76hoZpD1n5X5uiz6hgQ2OXFFoj9CCxNAEpPIALED7ecwlofwF6PcryFa8lhOPVdsR+a6imKKrKMhq3+c+rGQzsT4vhJptMjJAWKYVg9z/WU4YQXs7+1CAA27qv1VLxQGcgc6xetB9qT7EranqbZyAkTi/J7A2nrqWNqGZzcCF/zMsf6L/W1nDdxdM0cYNEOkCUzCqapWlQDZacSALQimVMlpKSWQGwqvpRf+13Zpo96poKACMA6S6NFAPhA3WmkG8Sgc2ELpxwysxHqx8enJnxoayen1gcwph+t1c8JG7NDJlNvfaupyqn7DIk5YsyHodZnTqKcZjkZjQlhU5kD2dhzPb8T0ke6XC8tAsDpuRbG2NPe3GVwcEOTgraFEyZkMNPgZO3ieIm92AtZIElvvISgQUAT42WO9e/rw3GSdzJKdocCPink28jwwsGzFYI7hQBQfy2rJrb91rdj6jys/a5M7Z/KNxAQAVhneewaBhh7SUw4m8L9K+pZ0tCiPs/UfK0PIDb9ng0SApKdbujnWCKWOJaaFzfluPPg7yd8wMdmE1UxH+sxB0BOb/hWLCGZhqRFAMgdUPMYX6J/U+uEmKIZ4LSN3Tg6Pvr6sPVzfbDfnIimGIvImNqnUh5HVUxCvQSgd/37+mqhiJy0UbV70w33a2SOrbyvpKgmqqImUwgA7RK+mwnvwI9uC2jy3NrvyoxdV1UiAOusgbkJQOk16mROOZnUYulbBCBzUMvqboUJTSUAJNIBn0y4iIiEKb0f8J7ZHPPQpo7W+HraaJUhOgG1qZcWAbjdcJ/Aru2u8TwaGzb0lskC9Tf5JooQMdLjU7FN/9EuYGLoXT+969/Xh90ep74sUyRmE59lEqddLgyK0nOF9xQC0HKsxDk3S4m9Db4H8a5s2089lyAgArDOsliKALQyyJF9L0tiM+ZFT+KVMZnTBNCKJuBUFE8yPSYAUsoSZlUuN/LjwTZKbHQr0uHnNmru11ZAmEpwxrDk9xYB4ObGh/ZUsidl2Ahf0wjfi579rWRSPd7qU4c9x/qPbUJo0IJEYd7KzZvlFsOYIIpnWG81k1qpcwoBwHcmy6FBXbVMg1NxLOXXfle27aeeEwE4sDWwFAGAwOH4l9kU8XbPHLbm+ACiQoyhbAXcqU6AJExBLRwFmz1RAtH7vdV/blHjd05aqHMhF5mMxXq3LmohHe6vzLyS9pEAoMqfcoOfh6R1uyE2ea+1al1FjMqc0/GcMsf6j/2ppRf29naSdGWhnLXcELGNKQSAZyEA2bXXRN1kybu2xXjtd2Xbfuo5EYADWwNLEQB8ASAAmfoReyL22ShzfAD5sGDjzOy92HlRi/YIHyJO5JkmCts/PgBT+h9tuCQ8yZLBUCeZCFtX8BJ+l/WLjHxscHPKQRIAvPwxtZCeln/lfxPbfcktB9mKdSdCxV81jeMpN9VlkmWd27JL33tsjvUf+4BzH4Q7yzpZQhFxjiW5VZReJ8+pBABbf03Vz5y3rr6egjFpwtd8V6b0TWVHEJAJYJ0lshQB4AXnRc+ENL3ZyXquD2DLe5/0reREHxO84WsXF8WTYqlrSv9JJ0yyluwkRJpUNBk1b+naZS0kmMHJqvbc2Jiz3w+KAKA5wis9y5hIP/FVwGdhqkAcMEFlQmIfzABFyHFAHzLBPyRL8zu1P778lPUzpR1yaGRhfL85XBrFSR+TVpRev4OpBKDlW4Gz5piTK+muSYmcCad+rwFc812ZMicqO4KACMA6S2QpAtC6lhT1dxYTP9cHkNBFohAyyWLds3Kkeq1l1ePDzwYQZWr/2XBqt/AxBjKmZdLyTu8Jl+SKXdSwJBTCj4F/RGWQSS3KQREA+sENfFnGRX7jw85mPjW/P6QuhjqWMWdqfZJXZaFpaLdwLMS0UxMurSGtbcG4/DdLwkMdU9dP7xeCTZVcE1HQbrAGCReMAgnlgqgemUoAWgmWehJ+0W/WeRQ0dhBgf1vnmu9KD1Yq04mACEAnUDsWm5sAMG94s3MHQG0O8X7GCzrKXB/A1g1ufByIEa/lSqdPretf8VQmFW12t8HU/mMGYYPJzBLYQ3EI5OMapXXBCVoXrk2tXVlcOwGz+XOqjpcMHSQBGEvkgh0blX3t+luPG2uCNVcL60NrcrrkZj8u1eFynUwguZyia8KtjtnNkRABNGDRGW7q+ul99VlntBmvjmbDRM2fZQzMwhRr7U0lAJgjyH4JgYrCe4UZCy1eJqx9ND+ZaRHCCLn1sua70jsfKteBgAhAB0gzFGkRAJh27YTqm+bDgrqUxCvYtTP7eCmP8xYRApgBosz5AeTDywc4Ez6GbPLRmx6/BTLhsVFkNlPq4vRIwpxMtuk/GQBrzmRZYp7SbiudKo6GfAgxCXjBjo4jZJYOuaaVOUgCQN9ftLnaF4/7lnAJDN79mHZQZ+NjgpMmNmCSA0Ek0Nq0HMyy5Di0SWa6j1V8VvgdkwG5EKL2hNwDqLKzlNS1a3W3WT+9nwByY5AjIwoajFOFP7IJk6sje0ez9qYSAOogwVJ2COA33k/wi6YakjzxTmTEgfwZEPOYm4P61npXeudC5ToQEAHoAGmGImulAi5dbSWPmfMDyIeXk2GMa/eQsXFwyxnJTohKQOVP/vCaRCexWG6b/rPOSe1bu2mN1MXZjXL4MtD3zIeAfvFhhwh8eNj4KI8dGJITBW0B9t7s43nQBABiyYkv8xmZYfl/twrMH6i7awlq0DIQvlkTMH754GxHfwlxRQuTCVoLNqpdrpPeZtwth8ZYH6fvLHSw1u42BACCDemsrfuycaPRYnNnfbYcPzGX1bKWrvWubDMveqaCgAjAOktjTQKA5zupgGuXx2yzgbZQ4qTLxyy7uGcqunjlk1q0FX62bf8hKdxKl615Ngw+YFm7qLOxce4inPYIHcyywFHvQRMA+sDmzAm/9yKnKXhAlLhkaux+BU7zZJbbRbD9o96uOcduu356+gQhJhqgJ9d+lha51cY2BID6eC9Z95hedhG0G/g5ZD4spd413pVdxqBnAwIiAOssiTUIABv+Q4bMZ62XdIkPIOpN1Ia7hMfhtYxfw5h3/S79x0mLj1gmtcyJlOUZwrgyVfPYCvr6kOmutvnvCwGgHzh3YeOFhM0laBZw/Bu7pZL2sDmTPIcb87YRzAiotaOPha9rl/XT0yc0WNz42BKIJhtyzVExe3ZbAkBd3CFCyu2W2bDVX3JfsLn33Ei59LvSMwcq04mACEAnUDsWW5IAoFrm5cZO2hN6t9QHELU3Nn98Aoh97hWyqGGvrcXkx3p26T+OgMS3R0ct2kBdTAw8jlOZoCHA5yHzjK6NlSgG7LBj87IPGgA/BlTTXN+Luab3oh//PASUUydZE2tX/bbWB9oCPOdR4/cI7wAbL+9AK2KAunZZPz19Ib/EG0cKcgEYRGWK7EIAaAcnRQg2dxf0aCh4higFkjb1vptlPEu+K1MwU9kRBEQA1lkicxAAbHRfGpzOOOmg4iS06GWJV3VrVEt/ANkwCD8kXTB2WpyJ0BCw6RJOxgcaey4bP+lP8fifIrv2n02CBDOZYGMe2+AhCTi78aGH6ODPgCMcTnGfGz6abH5oRMhB0CP7RgBKn/Hqxz8CWzvREucaxoqjX0k3i28Hnu5kdMS/AZ8PiE8ttr8HD8rwbWIdkWqW/0LewJpUurSJqp21Q659NtSab0Fsb9f1M9Z/tBhs1q1rk7dJcbwrASj9Pulw9wbvJ/H8aH14PyHwvJ+kCn7H4G/BO5pF4oxhUH5f4l3pbVvlOhAQAegASUWEgBAQAkJACBw2BEQADtuMajxCQAgIASEgBDoQEAHoAElFhIAQEAJCQAgcNgREAA7bjGo8QkAICAEhIAQ6EBAB6ABJRYSAEBACQkAIHDYERAAO24xqPEJACAgBISAEOhAQAegASUWEgBAQAkJACBw2BEQADtuMajxCQAgIASEgBDoQEAHoAElFhIAQEAJCQAgcNgREAA7bjGo8QkAICAEhIAQ6EBAB6ABJRYSAEBACQkAIHDYERAAO24xqPEJACAgBISAEOhAQAegASUWEgBAQAkJACBw2BEQADtuMajxCQAgIASEgBDoQEAHoAElFhIAQEAJCQAgcNgREAA7bjGo8QkAICAEhIAQ6EBAB6ABJRYSAEBACQkAIHDYERAAO24xqPEJACAgBISAEOhAQAegASUWEgBAQAkJACBw2BEQADtuMajxCQAgIASEgBDoQEAHoAElFhIAQEAJCQAgcNgREAA7bjGo8B43Az5rZ61wn/tPMTm5m/71Ax+5jZndx9b7czK6xQDtU+V4zu6Cr+xZm9viF2lK1QkAIrICACMAKIKuJI4XAnczs/m7EbzGzyyyEwKvN7Equ7ntu/vc9FmjrBGb2JTM7nqv7J8zsXQu0pSqFgBBYCQERgJWAVjNHBoHnmtkvuNE+xMxut9DoP21mp3V1X9PMXrZAWxczs7909X7LzE5iZt9YoC1VKQSEwEoIiACsBLSaOTIIfMjMzuVGe1Mze+YCoz+DmX0i1HtmM/v4Am3dckM0HuPqfY+Z/WijnbOa2S8Nv/+tmb10gT6pSiEgBHZEQARgRwD1uBBwCJx4c9rH5u/fq/NtNALvXwClq5rZK1y9/xa0AXM2iQmAf0XQAHyl0QBkAdKA3DmYRObsl+oSAkJgBwREAHYAT48KgYDAT5vZn7m/sUme1My+swBSf2Bm93L1vmajpr/yAu1MrfJUZvYxMzvh8CBOkW+YWonKCwEhsDwCIgDLY6wWjg4CtzWzh7nhvt3MLrnQ8F9sZtdydd/XzO66UFtTqo3E5JRm9vkpFaisEBAC6yAgArAOzmrlaCDwVDP7RTfUR5rZbRYa+j+b2Vlc3dfdhOm9aKG2eqs9vpn9izNFfNTMztH7sMoJASGwLgIiAOvirdYONwI4x13IDfGXzQxSMLecwsw+Fyo928bxDlJwkPKrZvZE14Hnh4iIg+yb2hYCQiAgIAKgJbHPCLA+saMXezK29B8cws+Oa2a/YWa/YmbnHZzUesLTzmNmV98k67mEmf3IcFrFeY9EPV8wM7z4/2Lw3H/fBHA4/RIr//3umQsPCXT404+b2U3MDD+Bs5sZbX558Nr/UzN7gis71uzlg10dFTuqduT7NvH5VzMzNALE6p9pwIYy/zgkKXrsBrvPjDUy/P6sDSY3cmWjViOaIsaqBXMwLhJzGdD3Vw4/ouG4lZn93KBJAGOIz7vN7NmbaAv69l+VBsm9wNrABEPEBGvnk2b252b2aDN751hHk9/x57ixmYH/Rczs1MPa/KKZfcDM8MNgHj22JEwC7yJvGp7fonk9IgTmRUAEYF48Vdu8CLAB+FMt/5uTLpsnWe9igh1CzvgwZwJJ+OOQOGest2xubEDE248JG7zfVL42OACebNgA2JBbAgFhY/ptM/v2SNnfNbMHuTI42eFsB+FA49AK0eOxr5rZrTcmhKeMDcrM/t7MiGQowin/ye7/R1NEq0oIEnj4rIgfDmaC85vZPwy4/5GZsenXBKJGNIT3MUA7Qv9+fmRsU3wmIJtg/vvD2mtVDan7zc2YnjEUeqGZXcc9gI/EH3bgriJCYHEERAAWh1gN7IDAFYdTVani9ZvTOX8j2Q0nxSicvn49+TubAadFtAdTBTv2pTvi62n3ca5yMgByAmVzhrT0CidbTpktocwNXQEyAEI+ULlPGSN9BrOaoHlh02YDLALBgmghaB0+2zuwIUICLIuwuaPhKfVzSj/RsNneu7PeN25O9VcYynIi54TtUxa3qulJZwyefzIQrM4ufbcY2h7WHBERaGGKoD2gjxIhcOAIiAAc+BSoAw0Ebr85cT3Y/c4J+e+GkzJ//o/hY8omxEeWLHxsjl4uvtEUoGKPJ0k2DtTPqKPZ5AhfQzXPpo2ZwAvPX3ZkpnzsO0VR+15lcxr94eE5TtIvGZzkiNmnPdL4Xi/kDaA4mztjqQl5BXwfSf/LnQA/MJyu2WAgHiQKIi8BmhSyE2L28PL1wXxS8x3IMgCiffnmUAmpgdl0kWub2aNc5TgDgr0XtCKoy4vgL4HfRBGeucNAZPgbJhjmE/U6qn42dsw+fkOlHKTwzcNauNSgQSH5EPP7qUETw/wxtz6dMZodkhbVMhpiTnnVUL8fx0eGexCI8mAuIQloX0h+VLRS4I65x48PgsO9EKw3iRA4cAREAA58CtSBBgJPM7Obud+JeyfUDlssJ8T7jaSj5WPPafUCrg7U32xWr620y0efEzXqXi+cXH2Mf3ycVLlsmEVoh42BTZiNoRYLjyaDE6Y/ZXPxDhtKJpyQ2VzoZ2yLDQm82KAy4Y4C7irw8vCNCv23KuWjVqOVAfABG9PCHV09kB1wbglZEp/uCrDRn25Qs//OQCjiJUo/NCRWKj4PPM6lRGCCmv6DG8Jwg8FPILZNhEZ0ymTDRluTye8NayziBTGtmWl8KOhfb0xVF3UPY9rAxCERAnuBgAjAXkyDOlFBgM3b27P5uONE1utdT5w8dnwv3smsBjybK6fsc7sCbJ5ktcuEzZtTXXFWLGU49XPy/PeRGWYDu3kow8mUE3EUTvFvS/6Ouhmi0fIfoJ9oULz2oPhVZF2MWg02T7DPhBsQ8UMocreBpLWGjk8GG70XTsn4S0AgagIRxJZehFM4mgicHH9mOJXXnoUcoekpwob9iKQwjoP4J/g5xa7vCWmtjYhbKdf7fAsz/SYEZkNABGA2KFXRzAhwesehKqrup1yug22Y63HZ8CAObHbeBt3qMvZ870/Qss2jYYgRA5xIcQxkUxoT1NZvDYUwDeBAFgXnvbhhQZQgBqj0xwTNRrSvc6rOSApOdl6Nj6YAjUEmbMKncT8QaeFTFWfPoLaPjpw4yPnNPXsOc0Y0kTB2NDBjkRs4j3r/kbuHjIqlPcwZOPMVwczEHQ89SY3OuDHaDQxqAAAOp0lEQVQ3/GvQ0lAPZOehYxOk34XAWgiIAKyFtNqZikC0D/M8Gzge6diSl5Z4Om0RgKjKpm+oo/Fi7xHU+pAdL0Qf4PMQ5UmDLdv/fcrVvPEOAeopnve+TrQgaDW8UyGn60hUeAabPM5uXvhbvKwojoWQPrz2i7BponUZu2UQ00JMeoSvCP4DYxLDFnnG+5nwPPOB7wA3HhapEYVae5hxojPimBlprO/6XQjMioAIwKxwqrIZEcjstT1e23N1ARW0DyXj1I26OBO0EoTvFeG0iONd68KcWA8+A17dnG1MPBPNIvgy4EzYK9Gxj+cyAoHWxF9ihC0eBzY0G1E47ftriHsuJsLE8U+hopo6PraHJsKfpMn/wKl7zNRCPdFXg3Xm/RAog5of/5MimCUgNJCCXsEJEe1TkRZ+vXWqnBCYFQERgFnhVGUzIsAH3junsfGctlPNPUc3Ynw6KX1JgpMJUQLetDDFTFHqw7PeJxFC1e+96imHlz+ncv5b5Jph8x0bO4lxSIbjBRMG/gpeiETwERXYzs9ZqTzm/+8hJdE/A98F7O49m3i0saPW95ttCwOiEHAiLYKZBmc9LzF2H58LzDRT5HmbfAbXdw+wnvw10VPqUlkhsAgCIgCLwKpKZ0Agbqqc0nye/SlNcLIm/hqPbE625KdHvUtIGypu74Ff6iVhjZfLDaFmsV3eIezCvnytbK3PPEsWQi849PlTKL8Rg+83K+zehBOiPegVCANRB14yh8Po1c+miF9CJlGt3nKYLM8TaYGjYJG/2oTt/WTnIKJvQkaWsqpiYilO9qwBb1JiLRBeirajyDbJe8hZUfITUM8LAiHoHKqKCYHlEBABWA5b1bwbAmyIflNFLVuyq/XWjOMfMfKcDqckyMnqr91qB5ngdFcETQWb8lg2P99GrIPfsmt0Y659YtSx6U+RWAeq6RO42P5SV/Tq56ZBsudlgiofElEEJz2SErUEkwGmgyKtcERfD74JYIydvohPTtRqM5IfTBw+yyHPEn5JqmEvpCJmQ58i0VRDngbCViVCYG8QEAHYm6lQRxwChGnFWHbUz7X49gw8Tpec3Hzil21BZoPzoWO+Hk7FfrPDsx0NwBRhs2fD9YIzXIwgiJ7pUx3TqP8+Q9Kg0hb58bGfRyGfPdEBRUhqRGKdKJyUo2d81vf4XMyQ10vwSOlMPH0RHAbR5uAHMCZR60DoJBn7vJAsCEfLIhAkCF2P9395BpKCU6f36bhyyGo51lf9LgQWR0AEYHGI1cAWCJA73YfA+ctueqrL4st5jnS5hI/hCMamTr2o0WOymWeGdLwt9TenYp8fAN+FGNs+1mdOh2zMRVBJs6nFi25I9PNTrhxOijibTZF4sudkywnXC4Tg4+Fv2OczJzjyHPjUtlm+/9g/NlTU7F7wmCdHwZiQJpn5KYJJBDt+j8QQwCxSI64dSJjPB9HTTnSg5Bn8V3COlAiBvUFABGBvpkIdcQgQp+4z8U25QQ27a1TXsnHhP9CrxiU9sHfYaqlvuQGOVLRFtolUiBEH7wgbPXVnqu94s17PIoqhd5m9PoYKog0gQ18mtwvhjoQJEi7YkjhHNcKT1UFoJW0W4frhmESp1jZhiRCZIllefsILfQbDjCCN4RwjWGpalrF69LsQWBQBEYBF4VXlWyJAAhlv2+ajz2mtR+IpmRM+zn9ebdyqh7h0wvj8u0GYXS11cFSVo72I2QfH+s1p26vhs/FG1Td1cpJmQ+8VSI2/ipfnsoQ92Pv9jXWQHFTYmeCX4dXoPbZ8Qhwf6CpDIxPvDaiNCTLo72UgWQ9RAWOCOSNegZz5dUQHw+eE65DH2uF3HP787Y9cb5xdXtVTl8oIgcUQEAFYDFpVvAMC8aSG2jde8pNVzyaKbdmv6ynkgTqj+YG/1TLlZaryqREAqL5JGuOFEzKXFXmJqm9+w2MdT/ZeIZTRZ/LDfg6JiPkKYhgczmtoQTJBbe/z2/ekaY63GXJxEpf89AhmG++hj0kEjcmYQOK8D0MtBXIcTyv/Q9YmIZqYN3wSoZ7shmP91+9CYHYERABmh1QV7ogA6WSjrRRPbZ+UptYEjmqctrwQv53lzq/VwYmPy2SKQCjKjX7xGU512JW9tLQFWZs4K+KcVoQNDnV7uXGv/J1sdVxC4wXv/bGseb58PD3XoghiDoSaVz/t4+zmwyi5u8HfgJeNGW0MGo0iY9cSl3LRORQfCWL6e8Igo59F7bKiOHZ8AiLutbXD338tuWJ5G61Qqw39JgRmQUAEYBYYVcmMCOCQ5tXtfNw5TfWcdDl9Pjn0hVM6Ntge4SRLCJiPHCBmnqQ1mcTNmzKcZDnR9ggb50cDwcDTn7j2KHHz5nc2UW7Q6xEc2Sjr3/nsvgE2VEIwfbmaVz8ZBInfL4InPuF5LY98wjEJ4/OkoTeVMWp11OtFptyuF7UatcuKogZgSv4JxsSFVYR1ejnbkMa6Z55URgishoAIwGpQq6FOBLiuFse0Ithk4z32tapInvOU8GMvASALH2p37nD30gq1i857PNciDLHfOAx6skA0AnHo2YU20XmPukg//LBOXKNmAzMLJ+qoaWD8/trjlld/dHaDYPiTfdY1bP3MaRHIAgSvR5MRQxizML4aHPEWwNqtkJFoMRfcS9Ej0XmVZyBT/r6DnnpURgisgoAIwCowq5EJCBCmh8q5SO1EnFUZQ9Iow+k9Zr6Lz/IeEFpG+ls2RH8DIafOePFMeR47MtnlvKCWxulwTA1O4px3DTb48nzN4SzLm88ztI8PQbxIKI4PRz/CBf37XotW8PfZUw9pgyMpKvVHDUgPWbtlcNoDJ3/lc2upYMP39x70XrhEQilMK378NWIYMyDSH0hZ9NOI/UTNj3YiflO3yQsx4XVRUSGwPQIiANtjpyeXQQAVqo+7JnNdVOvXWmbjJpe8d8AiThwNQjzpljq45AWtAY53eKZj//c2/5pNn/vnfd56TBX4LrBZo9YnNNBnCPR9Jk6cTHg+1JCTIhsNN+JFicmGOGkTAsj7y6ZIzvkaCSALIidlUt4Wwese34gsWyFYY0opwv0HOA9m8qAQnQEeEKLWbY3xmuWnhvZaq+rTQzx9KdPrcBmJYeuyIpwKiSTxQv4I1kd2ERLJfoiawMeA+WAd+KyTU30IlnmrVKsQSBAQAdCy2CcEsB/zkSXmvUhvmtdSHo9rPsheOIVxsi2JZvDU5gIcTAaosbF7kyCH0EOc/nzMO+QAJzU2S96XkjSIsDic6Ipw+sW7Ha9xhI2AGHU2aOrExIDKHdUzHv3+Qh/8G9A0YFLIJJ5K8cqHJHHqRFDnc3UwMfh4oLPZoxlAkxKT/GBKIHFOvImvtBtT2LYIWHSsow4cLrkIB5zI3gip8j4Y+Axg8y/SewMg8fvxeuFaeuaIYcxVMHZZ0VuSXAbkkmA+0QQwX2gQMA1AzkrKauaeNeSzRnJVtE9cVJli/VkIrI+ACMD6mKvFOgKc1L3HPqd2TvO103tWE57pbPhZXDknVDZyNni/9rH7kieeUzSbaLz5DTs4oXJssth5kaj+xhaPtzhEYkoqYPpD+tnWPQfRLo1Zg40UE8LpJywoxk/a4Zp5ApICBp6ctAgYl/e0QvAgAZC6ohHASQ4sfYrc3iiNGHFRC+PL4IiZHVthjTyPFgfNEQSjVx4/JK+KESw4lvbmoOhtS+WEwCwIiADMAqMqmQmBW4UrdzmNsgFNFU5keG+PXRGLAxp5AnD0KySDUzN+CJn4G/oINyTssMiNNmp5bPgQFtTaPptcrf9EHJDFjo28JmhDMA94s0ZJy4sWAP8EtBljQjnwjclw/HPY4sG8CPigTWgRsBjT7+uLIZRshj7dLydp5mrMh4E6I+Ei2VLRgIyNPYYdYjLx0QTZ85hp0Mjw35ZAaHBcJRlR1ApNyXA4Ngb9LgRmR0AEYHZIVeEOCKBiReVchEtZiKveVkj1ij37koPtmBMoKnByCrxhIAkx5z1tcSInnI/8A5yGcSDDN4G/sYHx3qBq9yfEeKUudmcuuMGmfOahHjZyNkVOzYSl+Rz6tTHG2+niyZeQRZwXMSH82DBOTt6Mkzz2OPGhXegJF4xRFD0OerR/x8GcAgZsepyCwQkTyRPcwMgY6DUdYDq2wZbHY8RF7xW9Wdghvhc1/ww/D4wNcw0aFxw78fuADGEOIKoAUsW/Lw4Pkb66aIj405QMh9uucT0nBLZGQARga+j0oBAQAkLg/yAQ7xGYkuFQUAqB1REQAVgdcjUoBITAIUUg5hrozXB4SOHQsPYdARGAfZ8h9U8ICIFjAYEsg2JvhsNjYXzq4yFEQATgEE6qhiQEhMDqCMQMikR34LjJbZQSIbCXCIgA7OW0qFNCQAgcYwjEmxanpBA+xoaq7h4WBEQADstMahxCQAgcJAJErBA9UmTKJUIH2W+1fYQREAE4wpOvoQsBITAbAiQO8jkrplzUNFsnVJEQmIKACMAUtFRWCAgBIfD/ESBfAMmM/CVSlw63Kgo3IbB3CIgA7N2UqENCQAgcYwhw74K/LZBETCevXB50jA1N3T3MCIgAHObZ1diEgBBYA4GY4ZB8AFyEJBECe42ACMBeT486JwSEgBAQAkJgGQREAJbBVbUKASEgBISAENhrBEQA9np61DkhIASEgBAQAssgIAKwDK6qVQgIASEgBITAXiMgArDX06POCQEhIASEgBBYBgERgGVwVa1CQAgIASEgBPYaARGAvZ4edU4ICAEhIASEwDIIiAAsg6tqFQJCQAgIASGw1wiIAOz19KhzQkAICAEhIASWQUAEYBlcVasQEAJCQAgIgb1GQARgr6dHnRMCQkAICAEhsAwCIgDL4KpahYAQEAJCQAjsNQIiAHs9PeqcEBACQkAICIFlEBABWAZX1SoEhIAQEAJCYK8REAHY6+lR54SAEBACQkAILIOACMAyuKpWISAEhIAQEAJ7jYAIwF5PjzonBISAEBACQmAZBEQAlsFVtQoBISAEhIAQ2GsE/gdUMuf5fafvyQAAAABJRU5ErkJggg=="/></switch></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-96"><g><rect x="240" y="353" width="130" height="40" rx="6" ry="6" fill="#e6e6e6" stroke="#000000" pointer-events="all" style="fill: rgb(230, 230, 230); stroke: rgb(0, 0, 0);"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 128px; height: 1px; padding-top: 373px; margin-left: 241px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "><b>Identity Service</b><div><i>openldap</i></div></div></div></div></foreignObject><image x="241" y="359" width="128" height="32" xlink:href="data:image/png;base64,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"/></switch></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-99"><g><path d="M 462.5 435 L 462.51 421 L 308 421 C 308 417.1 302 417.1 302 421 L 302 421 L 147.49 421 L 147.49 428.63" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: rgb(0, 0, 0);"/><path d="M 147.5 433.88 L 143.99 426.89 L 147.49 428.63 L 150.99 426.88 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-100"><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 421px; margin-left: 245px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; background-color: #ffffff; "><div style="display: inline-block; font-size: 11px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; ">HTTP</div></div></div></foreignObject><image x="230.5" y="415" width="29" height="15.75" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHQAAAA/CAYAAAAxBeyIAAAAAXNSR0IArs4c6QAAA/xJREFUeF7tm78vNEEYx78rEoUG0VGJHxGJSIiIQuFHkKAglCRErVKQUChIUPgDRChPUIqCwu9EQSHRiEgkNKIhUQg5mXvf2/f23tubW7Nr5jbf7dzMPM8z388882uXFY1Go+ATGgUsAg0Ny1hHCDRcPAk0ZDwJlEDDpkDI+sM1lEBDpkDIusMMDTPQ1dVVjI+P213s7OzE3t6eUpeLi4vx8vJi27i6ukJdXZ399/7+Pjo6OpR8yBqPjIxgfX0dv+krMabS0lI8Pj7KwnSU5+fno6CgAKJtY2MjWltb0dPTg9zc3LR2HBlKoJ40T1k5PnhUgaYyLuDOzs46ki65HoGqM3RYCBJo3FFfXx82NzeRl5f3X/TagT49PWF3dzcjWaenp/H8/GzXnZqaQllZmbRtZWUlWlpa8Ju+0mXo/Pw8KioqXOP++vrC6+sr7u/vcXZ2hqOjIyRfuQ8MDGBra8s8oFIaCRXKy8txd3dn/3J+fo6mpiYvJjKu66ev5DXUa9y3t7exafbw8NARfyQSwdDQkOM37RmascIA/BRZ5tdPX6pARawfHx9ob2/H8fGxHXp1dTVubm4IVAZTlJsGVMR0fX2N2tpaR/gie0Ws8YcZ6kLXRKAi1JqaGkdWbmxsYHh4mEBlWWoq0MHBQcdmaHFxEZOTkwSarUDHxsawtrZmhz8zM4O5uTkCzVag4riys7Njh7+ysoKJiQkCzVagyUvB9vY2+vv7CTQbgV5eXqK+vt4OPScnJ3bRUlRUlBlQcZuRuIOSiZCqfGFhAe/v73ZR8uW8F5t+blRkfv305dc5tK2tDScnJ3boqV6epD22yDr9k3ICBbzeFD08PGB0dBQHBwf/MtGycHFxgYaGhswvFn4CTNaGQIHl5WVUVVW5SiXubd/e3iBAnp6exl5hfn5+OuqLna3Y4SY/zFANFwuyQS8rF+dOcf5M9fCmKIuAiqxeWlpCb2+vK3MCNRSoeNdZWFiIkpISNDc3o6urC93d3bAsK20CE6gGoF43RbIpOLGcQAnUy3gBZB+JebHm59lQ5tdPX36cQ2XxxsuZoczQTMfKn3rMUMQ+xUz8jJNr6N8x5Oc0KBuWfvoi0F+YBglUpoBLOadcTrmuQ8fPaVA2Pv30xSmXU65svPHqz6tCzFCuoa5jRtuU63UUs755CvAffs1johQRgSrJZ15jAjWPiVJEBKokn3mNCdQ8JkoREaiSfOY1JlDzmChFRKBK8pnXmEDNY6IUEYEqyWdeYwI1j4lSROm/2lUyzcY6FCBQHaoH6JNAAxRXh2kC1aF6gD4JNEBxdZgmUB2qB+iTQAMUV4dpAtWheoA+CTRAcXWYJlAdqgfok0ADFFeH6W97Qt2suZ3FFgAAAABJRU5ErkJggg=="/></switch></g></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-101"><g><rect x="430" y="435" width="130" height="40" rx="6" ry="6" fill="#ffffff" stroke="#000000" pointer-events="all" style="fill: rgb(255, 255, 255); stroke: rgb(0, 0, 0);"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 128px; height: 1px; padding-top: 455px; margin-left: 431px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; font-weight: bold; white-space: normal; word-wrap: normal; ">Metadata Service</div></div></div></foreignObject><image x="431" y="448.5" width="128" height="17" xlink:href="data:image/png;base64,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"/></switch></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-102"><g><path d="M 376.37 465 L 423.63 465" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: rgb(0, 0, 0);"/><path d="M 371.12 465 L 378.12 461.5 L 376.37 465 L 378.12 468.5 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/><path d="M 428.88 465 L 421.88 468.5 L 423.63 465 L 421.88 461.5 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-103"><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 465px; margin-left: 400px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; background-color: #ffffff; "><div style="display: inline-block; font-size: 11px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; ">HTTP</div></div></div></foreignObject><image x="385.5" y="459" width="29" height="15.75" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHQAAAA/CAYAAAAxBeyIAAAAAXNSR0IArs4c6QAAA/xJREFUeF7tm78vNEEYx78rEoUG0VGJHxGJSIiIQuFHkKAglCRErVKQUChIUPgDRChPUIqCwu9EQSHRiEgkNKIhUQg5mXvf2/f23tubW7Nr5jbf7dzMPM8z388882uXFY1Go+ATGgUsAg0Ny1hHCDRcPAk0ZDwJlEDDpkDI+sM1lEBDpkDIusMMDTPQ1dVVjI+P213s7OzE3t6eUpeLi4vx8vJi27i6ukJdXZ399/7+Pjo6OpR8yBqPjIxgfX0dv+krMabS0lI8Pj7KwnSU5+fno6CgAKJtY2MjWltb0dPTg9zc3LR2HBlKoJ40T1k5PnhUgaYyLuDOzs46ki65HoGqM3RYCBJo3FFfXx82NzeRl5f3X/TagT49PWF3dzcjWaenp/H8/GzXnZqaQllZmbRtZWUlWlpa8Ju+0mXo/Pw8KioqXOP++vrC6+sr7u/vcXZ2hqOjIyRfuQ8MDGBra8s8oFIaCRXKy8txd3dn/3J+fo6mpiYvJjKu66ev5DXUa9y3t7exafbw8NARfyQSwdDQkOM37RmascIA/BRZ5tdPX6pARawfHx9ob2/H8fGxHXp1dTVubm4IVAZTlJsGVMR0fX2N2tpaR/gie0Ws8YcZ6kLXRKAi1JqaGkdWbmxsYHh4mEBlWWoq0MHBQcdmaHFxEZOTkwSarUDHxsawtrZmhz8zM4O5uTkCzVag4riys7Njh7+ysoKJiQkCzVagyUvB9vY2+vv7CTQbgV5eXqK+vt4OPScnJ3bRUlRUlBlQcZuRuIOSiZCqfGFhAe/v73ZR8uW8F5t+blRkfv305dc5tK2tDScnJ3boqV6epD22yDr9k3ICBbzeFD08PGB0dBQHBwf/MtGycHFxgYaGhswvFn4CTNaGQIHl5WVUVVW5SiXubd/e3iBAnp6exl5hfn5+OuqLna3Y4SY/zFANFwuyQS8rF+dOcf5M9fCmKIuAiqxeWlpCb2+vK3MCNRSoeNdZWFiIkpISNDc3o6urC93d3bAsK20CE6gGoF43RbIpOLGcQAnUy3gBZB+JebHm59lQ5tdPX36cQ2XxxsuZoczQTMfKn3rMUMQ+xUz8jJNr6N8x5Oc0KBuWfvoi0F+YBglUpoBLOadcTrmuQ8fPaVA2Pv30xSmXU65svPHqz6tCzFCuoa5jRtuU63UUs755CvAffs1johQRgSrJZ15jAjWPiVJEBKokn3mNCdQ8JkoREaiSfOY1JlDzmChFRKBK8pnXmEDNY6IUEYEqyWdeYwI1j4lSROm/2lUyzcY6FCBQHaoH6JNAAxRXh2kC1aF6gD4JNEBxdZgmUB2qB+iTQAMUV4dpAtWheoA+CTRAcXWYJlAdqgfok0ADFFeH6W97Qt2suZ3FFgAAAABJRU5ErkJggg=="/></switch></g></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-106"><g><path d="M 470 195.6 C 470 190.85 481.19 187 495 187 C 501.63 187 507.99 187.91 512.68 189.52 C 517.37 191.13 520 193.32 520 195.6 L 520 242.4 C 520 247.15 508.81 251 495 251 C 481.19 251 470 247.15 470 242.4 Z" fill="#e6e6e6" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(230, 230, 230); stroke: rgb(0, 0, 0);"/><path d="M 520 195.6 C 520 200.35 508.81 204.2 495 204.2 C 481.19 204.2 470 200.35 470 195.6" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="stroke: rgb(0, 0, 0);"/></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-107"><g><rect x="452.5" y="251.5" width="85" height="17" fill="none" stroke="none" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 89px; height: 1px; padding-top: 260px; margin-left: 451px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">search-db</div></div></div></foreignObject><image x="451" y="253.5" width="89" height="17" xlink:href="data:image/png;base64,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"/></switch></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-111"><g><path d="M 280 523.6 C 280 518.85 291.19 515 305 515 C 311.63 515 317.99 515.91 322.68 517.52 C 327.37 519.13 330 521.32 330 523.6 L 330 570.4 C 330 575.15 318.81 579 305 579 C 291.19 579 280 575.15 280 570.4 Z" fill="#e6e6e6" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(230, 230, 230); stroke: rgb(0, 0, 0);"/><path d="M 330 523.6 C 330 528.35 318.81 532.2 305 532.2 C 291.19 532.2 280 528.35 280 523.6" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="stroke: rgb(0, 0, 0);"/></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-112"><g><rect x="262.5" y="579" width="85" height="20" fill="none" stroke="none" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 89px; height: 1px; padding-top: 589px; margin-left: 261px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">auth-db</div></div></div></foreignObject><image x="261" y="582.5" width="89" height="17" xlink:href="data:image/png;base64,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"/></switch></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-115"><g><path d="M 376.37 117 L 423.63 117" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: rgb(0, 0, 0);"/><path d="M 371.12 117 L 378.12 113.5 L 376.37 117 L 378.12 120.5 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/><path d="M 428.88 117 L 421.88 120.5 L 423.63 117 L 421.88 113.5 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 117px; margin-left: 400px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; background-color: #ffffff; "><div style="display: inline-block; font-size: 11px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; ">HTTP</div></div></div></foreignObject><image x="385.5" y="111" width="29" height="15.75" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHQAAAA/CAYAAAAxBeyIAAAAAXNSR0IArs4c6QAAA/xJREFUeF7tm78vNEEYx78rEoUG0VGJHxGJSIiIQuFHkKAglCRErVKQUChIUPgDRChPUIqCwu9EQSHRiEgkNKIhUQg5mXvf2/f23tubW7Nr5jbf7dzMPM8z388882uXFY1Go+ATGgUsAg0Ny1hHCDRcPAk0ZDwJlEDDpkDI+sM1lEBDpkDIusMMDTPQ1dVVjI+P213s7OzE3t6eUpeLi4vx8vJi27i6ukJdXZ399/7+Pjo6OpR8yBqPjIxgfX0dv+krMabS0lI8Pj7KwnSU5+fno6CgAKJtY2MjWltb0dPTg9zc3LR2HBlKoJ40T1k5PnhUgaYyLuDOzs46ki65HoGqM3RYCBJo3FFfXx82NzeRl5f3X/TagT49PWF3dzcjWaenp/H8/GzXnZqaQllZmbRtZWUlWlpa8Ju+0mXo/Pw8KioqXOP++vrC6+sr7u/vcXZ2hqOjIyRfuQ8MDGBra8s8oFIaCRXKy8txd3dn/3J+fo6mpiYvJjKu66ev5DXUa9y3t7exafbw8NARfyQSwdDQkOM37RmascIA/BRZ5tdPX6pARawfHx9ob2/H8fGxHXp1dTVubm4IVAZTlJsGVMR0fX2N2tpaR/gie0Ws8YcZ6kLXRKAi1JqaGkdWbmxsYHh4mEBlWWoq0MHBQcdmaHFxEZOTkwSarUDHxsawtrZmhz8zM4O5uTkCzVag4riys7Njh7+ysoKJiQkCzVagyUvB9vY2+vv7CTQbgV5eXqK+vt4OPScnJ3bRUlRUlBlQcZuRuIOSiZCqfGFhAe/v73ZR8uW8F5t+blRkfv305dc5tK2tDScnJ3boqV6epD22yDr9k3ICBbzeFD08PGB0dBQHBwf/MtGycHFxgYaGhswvFn4CTNaGQIHl5WVUVVW5SiXubd/e3iBAnp6exl5hfn5+OuqLna3Y4SY/zFANFwuyQS8rF+dOcf5M9fCmKIuAiqxeWlpCb2+vK3MCNRSoeNdZWFiIkpISNDc3o6urC93d3bAsK20CE6gGoF43RbIpOLGcQAnUy3gBZB+JebHm59lQ5tdPX36cQ2XxxsuZoczQTMfKn3rMUMQ+xUz8jJNr6N8x5Oc0KBuWfvoi0F+YBglUpoBLOadcTrmuQ8fPaVA2Pv30xSmXU65svPHqz6tCzFCuoa5jRtuU63UUs755CvAffs1johQRgSrJZ15jAjWPiVJEBKokn3mNCdQ8JkoREaiSfOY1JlDzmChFRKBK8pnXmEDNY6IUEYEqyWdeYwI1j4lSROm/2lUyzcY6FCBQHaoH6JNAAxRXh2kC1aF6gD4JNEBxdZgmUB2qB+iTQAMUV4dpAtWheoA+CTRAcXWYJlAdqgfok0ADFFeH6W97Qt2suZ3FFgAAAABJRU5ErkJggg=="/></switch></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-117"><g><path d="M 233.63 127 L 200 127 L 200 291 L 186.37 291" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: rgb(0, 0, 0);"/><path d="M 238.88 127 L 231.88 130.5 L 233.63 127 L 231.88 123.5 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/><path d="M 181.12 291 L 188.12 287.5 L 186.37 291 L 188.12 294.5 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-118"><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 242px; margin-left: 190px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; background-color: #ffffff; "><div style="display: inline-block; font-size: 11px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; ">HTTP</div></div></div></foreignObject><image x="175.5" y="236" width="29" height="15.75" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHQAAAA/CAYAAAAxBeyIAAAAAXNSR0IArs4c6QAAA/xJREFUeF7tm78vNEEYx78rEoUG0VGJHxGJSIiIQuFHkKAglCRErVKQUChIUPgDRChPUIqCwu9EQSHRiEgkNKIhUQg5mXvf2/f23tubW7Nr5jbf7dzMPM8z388882uXFY1Go+ATGgUsAg0Ny1hHCDRcPAk0ZDwJlEDDpkDI+sM1lEBDpkDIusMMDTPQ1dVVjI+P213s7OzE3t6eUpeLi4vx8vJi27i6ukJdXZ399/7+Pjo6OpR8yBqPjIxgfX0dv+krMabS0lI8Pj7KwnSU5+fno6CgAKJtY2MjWltb0dPTg9zc3LR2HBlKoJ40T1k5PnhUgaYyLuDOzs46ki65HoGqM3RYCBJo3FFfXx82NzeRl5f3X/TagT49PWF3dzcjWaenp/H8/GzXnZqaQllZmbRtZWUlWlpa8Ju+0mXo/Pw8KioqXOP++vrC6+sr7u/vcXZ2hqOjIyRfuQ8MDGBra8s8oFIaCRXKy8txd3dn/3J+fo6mpiYvJjKu66ev5DXUa9y3t7exafbw8NARfyQSwdDQkOM37RmascIA/BRZ5tdPX6pARawfHx9ob2/H8fGxHXp1dTVubm4IVAZTlJsGVMR0fX2N2tpaR/gie0Ws8YcZ6kLXRKAi1JqaGkdWbmxsYHh4mEBlWWoq0MHBQcdmaHFxEZOTkwSarUDHxsawtrZmhz8zM4O5uTkCzVag4riys7Njh7+ysoKJiQkCzVagyUvB9vY2+vv7CTQbgV5eXqK+vt4OPScnJ3bRUlRUlBlQcZuRuIOSiZCqfGFhAe/v73ZR8uW8F5t+blRkfv305dc5tK2tDScnJ3boqV6epD22yDr9k3ICBbzeFD08PGB0dBQHBwf/MtGycHFxgYaGhswvFn4CTNaGQIHl5WVUVVW5SiXubd/e3iBAnp6exl5hfn5+OuqLna3Y4SY/zFANFwuyQS8rF+dOcf5M9fCmKIuAiqxeWlpCb2+vK3MCNRSoeNdZWFiIkpISNDc3o6urC93d3bAsK20CE6gGoF43RbIpOLGcQAnUy3gBZB+JebHm59lQ5tdPX36cQ2XxxsuZoczQTMfKn3rMUMQ+xUz8jJNr6N8x5Oc0KBuWfvoi0F+YBglUpoBLOadcTrmuQ8fPaVA2Pv30xSmXU65svPHqz6tCzFCuoa5jRtuU63UUs755CvAffs1johQRgSrJZ15jAjWPiVJEBKokn3mNCdQ8JkoREaiSfOY1JlDzmChFRKBK8pnXmEDNY6IUEYEqyWdeYwI1j4lSROm/2lUyzcY6FCBQHaoH6JNAAxRXh2kC1aF6gD4JNEBxdZgmUB2qB+iTQAMUV4dpAtWheoA+CTRAcXWYJlAdqgfok0ADFFeH6W97Qt2suZ3FFgAAAABJRU5ErkJggg=="/></switch></g></g></g></g><g data-cell-id="uDJ2bVtIrgoZBCZFZmDG-13"><g><path d="M 305 147 L 305 182.63" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: rgb(0, 0, 0);"/><path d="M 305 187.88 L 301.5 180.88 L 305 182.63 L 308.5 180.88 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-119"><g><rect x="240" y="107" width="130" height="40" rx="6" ry="6" fill="#e6e6e6" stroke="#000000" pointer-events="all" style="fill: rgb(230, 230, 230); stroke: rgb(0, 0, 0);"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 128px; height: 1px; padding-top: 127px; margin-left: 241px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "><b>Gateway Service</b><div><i>nginx</i></div></div></div></div></foreignObject><image x="241" y="113" width="128" height="32" xlink:href="data:image/png;base64,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"/></switch></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-121"><g><path d="M 115.01 264.63 L 115.03 250.03 L 114.66 235.37" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: rgb(0, 0, 0);"/><path d="M 115 269.88 L 111.51 262.88 L 115.01 264.63 L 118.51 262.89 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/><path d="M 114.53 230.12 L 118.2 237.03 L 114.66 235.37 L 111.21 237.2 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-122"><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 251px; margin-left: 115px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; background-color: #ffffff; "><div style="display: inline-block; font-size: 11px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; ">S3</div></div></div></foreignObject><image x="108.5" y="245" width="13" height="15.75" xlink:href="data:image/png;base64,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"/></switch></g></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-123"><g><rect x="50" y="271" width="130" height="40" rx="6" ry="6" fill="#ffffff" stroke="#000000" pointer-events="all" style="fill: rgb(255, 255, 255); stroke: rgb(0, 0, 0);"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 128px; height: 1px; padding-top: 291px; margin-left: 51px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; font-weight: bold; white-space: normal; word-wrap: normal; ">Analyse Service</div></div></div></foreignObject><image x="51" y="284.5" width="128" height="17" xlink:href="data:image/png;base64,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"/></switch></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-125"><g><path d="M 495 153.37 L 495 180.63" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: rgb(0, 0, 0);"/><path d="M 495 148.12 L 498.5 155.12 L 495 153.37 L 491.5 155.12 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/><path d="M 495 185.88 L 491.5 178.88 L 495 180.63 L 498.5 178.88 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-126"><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 167px; margin-left: 496px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; background-color: #ffffff; "><div style="display: inline-block; font-size: 11px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; ">HTTP</div></div></div></foreignObject><image x="481.5" y="161" width="29" height="15.75" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHQAAAA/CAYAAAAxBeyIAAAAAXNSR0IArs4c6QAAA/xJREFUeF7tm78vNEEYx78rEoUG0VGJHxGJSIiIQuFHkKAglCRErVKQUChIUPgDRChPUIqCwu9EQSHRiEgkNKIhUQg5mXvf2/f23tubW7Nr5jbf7dzMPM8z388882uXFY1Go+ATGgUsAg0Ny1hHCDRcPAk0ZDwJlEDDpkDI+sM1lEBDpkDIusMMDTPQ1dVVjI+P213s7OzE3t6eUpeLi4vx8vJi27i6ukJdXZ399/7+Pjo6OpR8yBqPjIxgfX0dv+krMabS0lI8Pj7KwnSU5+fno6CgAKJtY2MjWltb0dPTg9zc3LR2HBlKoJ40T1k5PnhUgaYyLuDOzs46ki65HoGqM3RYCBJo3FFfXx82NzeRl5f3X/TagT49PWF3dzcjWaenp/H8/GzXnZqaQllZmbRtZWUlWlpa8Ju+0mXo/Pw8KioqXOP++vrC6+sr7u/vcXZ2hqOjIyRfuQ8MDGBra8s8oFIaCRXKy8txd3dn/3J+fo6mpiYvJjKu66ev5DXUa9y3t7exafbw8NARfyQSwdDQkOM37RmascIA/BRZ5tdPX6pARawfHx9ob2/H8fGxHXp1dTVubm4IVAZTlJsGVMR0fX2N2tpaR/gie0Ws8YcZ6kLXRKAi1JqaGkdWbmxsYHh4mEBlWWoq0MHBQcdmaHFxEZOTkwSarUDHxsawtrZmhz8zM4O5uTkCzVag4riys7Njh7+ysoKJiQkCzVagyUvB9vY2+vv7CTQbgV5eXqK+vt4OPScnJ3bRUlRUlBlQcZuRuIOSiZCqfGFhAe/v73ZR8uW8F5t+blRkfv305dc5tK2tDScnJ3boqV6epD22yDr9k3ICBbzeFD08PGB0dBQHBwf/MtGycHFxgYaGhswvFn4CTNaGQIHl5WVUVVW5SiXubd/e3iBAnp6exl5hfn5+OuqLna3Y4SY/zFANFwuyQS8rF+dOcf5M9fCmKIuAiqxeWlpCb2+vK3MCNRSoeNdZWFiIkpISNDc3o6urC93d3bAsK20CE6gGoF43RbIpOLGcQAnUy3gBZB+JebHm59lQ5tdPX36cQ2XxxsuZoczQTMfKn3rMUMQ+xUz8jJNr6N8x5Oc0KBuWfvoi0F+YBglUpoBLOadcTrmuQ8fPaVA2Pv30xSmXU65svPHqz6tCzFCuoa5jRtuU63UUs755CvAffs1johQRgSrJZ15jAjWPiVJEBKokn3mNCdQ8JkoREaiSfOY1JlDzmChFRKBK8pnXmEDNY6IUEYEqyWdeYwI1j4lSROm/2lUyzcY6FCBQHaoH6JNAAxRXh2kC1aF6gD4JNEBxdZgmUB2qB+iTQAMUV4dpAtWheoA+CTRAcXWYJlAdqgfok0ADFFeH6W97Qt2suZ3FFgAAAABJRU5ErkJggg=="/></switch></g></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-127"><g><path d="M 276.37 41 L 305.03 41 L 305.03 100.63" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: rgb(0, 0, 0);"/><path d="M 271.12 41 L 278.12 37.5 L 276.37 41 L 278.12 44.5 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/><path d="M 305.03 105.88 L 301.53 98.88 L 305.03 100.63 L 308.53 98.88 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-128"><g><ellipse cx="255" cy="7.5" rx="7.5" ry="7.5" fill="#ffffff" stroke="#000000" pointer-events="all" style="fill: rgb(255, 255, 255); stroke: rgb(0, 0, 0);"/><path d="M 255 15 L 255 40 M 255 20 L 240 20 M 255 20 L 270 20 M 255 40 L 240 60 M 255 40 L 270 60" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="stroke: rgb(0, 0, 0);"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe flex-start; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 67px; margin-left: 255px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; white-space: nowrap; ">Researcher</div></div></div></foreignObject><image x="224" y="67.5" width="62" height="17" xlink:href="data:image/png;base64,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"/></switch></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-129"><g><ellipse cx="225" cy="524.5" rx="7.5" ry="7.5" fill="#ffffff" stroke="#000000" pointer-events="all" style="fill: rgb(255, 255, 255); stroke: rgb(0, 0, 0);"/><path d="M 225 532 L 225 557 M 225 537 L 210 537 M 225 537 L 240 537 M 225 557 L 210 577 M 225 557 L 240 577" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="stroke: rgb(0, 0, 0);"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe flex-start; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 584px; margin-left: 225px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; white-space: nowrap; ">Database<div>Engineer</div></div></div></div></foreignObject><image x="199.5" y="584.5" width="51" height="32" xlink:href="data:image/png;base64,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"/></switch></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-133"><g><path d="M 305 481.37 L 305 508.63" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: rgb(0, 0, 0);"/><path d="M 305 476.12 L 308.5 483.12 L 305 481.37 L 301.5 483.12 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/><path d="M 305 513.88 L 301.5 506.88 L 305 508.63 L 308.5 506.88 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 495px; margin-left: 305px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; background-color: #ffffff; "><div style="display: inline-block; font-size: 11px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; ">JDBC</div></div></div></foreignObject><image x="290.5" y="489" width="29" height="15.75" xlink:href="data:image/png;base64,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"/></switch></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-134"><g><ellipse cx="385" cy="524.5" rx="7.5" ry="7.5" fill="#ffffff" stroke="#000000" pointer-events="all" style="fill: rgb(255, 255, 255); stroke: rgb(0, 0, 0);"/><path d="M 385 532 L 385 557 M 385 537 L 370 537 M 385 537 L 400 537 M 385 557 L 370 577 M 385 557 L 400 577" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="stroke: rgb(0, 0, 0);"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe flex-start; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 584px; margin-left: 385px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; white-space: nowrap; ">System<div>Engineer</div></div></div></div></foreignObject><image x="361" y="584.5" width="48" height="32" xlink:href="data:image/png;base64,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"/></switch></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-135"><g><path d="M 59.5 523.6 C 59.5 518.85 70.69 515 84.5 515 C 91.13 515 97.49 515.91 102.18 517.52 C 106.87 519.13 109.5 521.32 109.5 523.6 L 109.5 570.4 C 109.5 575.15 98.31 579 84.5 579 C 70.69 579 59.5 575.15 59.5 570.4 Z" fill="#e6e6e6" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(230, 230, 230); stroke: rgb(0, 0, 0);"/><path d="M 109.5 523.6 C 109.5 528.35 98.31 532.2 84.5 532.2 C 70.69 532.2 59.5 528.35 59.5 523.6" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="stroke: rgb(0, 0, 0);"/></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-136"><g><path d="M 119.5 523.6 C 119.5 518.85 130.69 515 144.5 515 C 151.13 515 157.49 515.91 162.18 517.52 C 166.87 519.13 169.5 521.32 169.5 523.6 L 169.5 570.4 C 169.5 575.15 158.31 579 144.5 579 C 130.69 579 119.5 575.15 119.5 570.4 Z" fill="#e6e6e6" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(230, 230, 230); stroke: rgb(0, 0, 0);"/><path d="M 169.5 523.6 C 169.5 528.35 158.31 532.2 144.5 532.2 C 130.69 532.2 119.5 528.35 119.5 523.6" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="stroke: rgb(0, 0, 0);"/></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-137"><g><path d="M 89.5 533.6 C 89.5 528.85 100.69 525 114.5 525 C 121.13 525 127.49 525.91 132.18 527.52 C 136.87 529.13 139.5 531.32 139.5 533.6 L 139.5 580.4 C 139.5 585.15 128.31 589 114.5 589 C 100.69 589 89.5 585.15 89.5 580.4 Z" fill="#e6e6e6" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(230, 230, 230); stroke: rgb(0, 0, 0);"/><path d="M 139.5 533.6 C 139.5 538.35 128.31 542.2 114.5 542.2 C 100.69 542.2 89.5 538.35 89.5 533.6" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="stroke: rgb(0, 0, 0);"/></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-138"><g><rect x="40" y="506" width="150" height="105" rx="6.3" ry="6.3" fill="none" stroke="#000000" stroke-dasharray="3 3" pointer-events="all" style="stroke: rgb(0, 0, 0);"/></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-139"><g><path d="M 210 547 L 196.37 547" fill="none" stroke="#000000" stroke-miterlimit="10" stroke-dasharray="3 3" pointer-events="stroke" style="stroke: rgb(0, 0, 0);"/><path d="M 191.12 547 L 198.12 543.5 L 196.37 547 L 198.12 550.5 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-140"><g><rect x="430" y="271" width="130" height="40" rx="6" ry="6" fill="#ffffff" stroke="#000000" pointer-events="all" style="fill: rgb(255, 255, 255); stroke: rgb(0, 0, 0);"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 128px; height: 1px; padding-top: 291px; margin-left: 431px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; font-weight: bold; white-space: normal; word-wrap: normal; ">User Interface</div></div></div></foreignObject><image x="431" y="284.5" width="128" height="17" xlink:href="data:image/png;base64,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"/></switch></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-141"><g><path d="M 333.63 41 L 305.03 41 L 305 100.63" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: rgb(0, 0, 0);"/><path d="M 338.88 41 L 331.88 44.5 L 333.63 41 L 331.88 37.5 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/><path d="M 305 105.88 L 301.5 98.88 L 305 100.63 L 308.5 98.88 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-142"><g><ellipse cx="355" cy="7.5" rx="7.5" ry="7.5" fill="#ffffff" stroke="#000000" pointer-events="all" style="fill: rgb(255, 255, 255); stroke: rgb(0, 0, 0);"/><path d="M 355 15 L 355 40 M 355 20 L 340 20 M 355 20 L 370 20 M 355 40 L 340 60 M 355 40 L 370 60" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="stroke: rgb(0, 0, 0);"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe flex-start; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 67px; margin-left: 355px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; white-space: nowrap; ">Machine</div></div></div></foreignObject><image x="332.5" y="67.5" width="45" height="17" xlink:href="data:image/png;base64,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"/></switch></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-147"><g><path d="M 376.37 127 L 403.03 127 L 403.03 291 L 423.63 291" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: rgb(0, 0, 0);"/><path d="M 371.12 127 L 378.12 123.5 L 376.37 127 L 378.12 130.5 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/><path d="M 428.88 291 L 421.88 294.5 L 423.63 291 L 421.88 287.5 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-148"><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 217px; margin-left: 403px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; background-color: #ffffff; "><div style="display: inline-block; font-size: 11px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; ">HTTP</div></div></div></foreignObject><image x="388.5" y="211" width="29" height="15.75" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHQAAAA/CAYAAAAxBeyIAAAAAXNSR0IArs4c6QAAA/xJREFUeF7tm78vNEEYx78rEoUG0VGJHxGJSIiIQuFHkKAglCRErVKQUChIUPgDRChPUIqCwu9EQSHRiEgkNKIhUQg5mXvf2/f23tubW7Nr5jbf7dzMPM8z388882uXFY1Go+ATGgUsAg0Ny1hHCDRcPAk0ZDwJlEDDpkDI+sM1lEBDpkDIusMMDTPQ1dVVjI+P213s7OzE3t6eUpeLi4vx8vJi27i6ukJdXZ399/7+Pjo6OpR8yBqPjIxgfX0dv+krMabS0lI8Pj7KwnSU5+fno6CgAKJtY2MjWltb0dPTg9zc3LR2HBlKoJ40T1k5PnhUgaYyLuDOzs46ki65HoGqM3RYCBJo3FFfXx82NzeRl5f3X/TagT49PWF3dzcjWaenp/H8/GzXnZqaQllZmbRtZWUlWlpa8Ju+0mXo/Pw8KioqXOP++vrC6+sr7u/vcXZ2hqOjIyRfuQ8MDGBra8s8oFIaCRXKy8txd3dn/3J+fo6mpiYvJjKu66ev5DXUa9y3t7exafbw8NARfyQSwdDQkOM37RmascIA/BRZ5tdPX6pARawfHx9ob2/H8fGxHXp1dTVubm4IVAZTlJsGVMR0fX2N2tpaR/gie0Ws8YcZ6kLXRKAi1JqaGkdWbmxsYHh4mEBlWWoq0MHBQcdmaHFxEZOTkwSarUDHxsawtrZmhz8zM4O5uTkCzVag4riys7Njh7+ysoKJiQkCzVagyUvB9vY2+vv7CTQbgV5eXqK+vt4OPScnJ3bRUlRUlBlQcZuRuIOSiZCqfGFhAe/v73ZR8uW8F5t+blRkfv305dc5tK2tDScnJ3boqV6epD22yDr9k3ICBbzeFD08PGB0dBQHBwf/MtGycHFxgYaGhswvFn4CTNaGQIHl5WVUVVW5SiXubd/e3iBAnp6exl5hfn5+OuqLna3Y4SY/zFANFwuyQS8rF+dOcf5M9fCmKIuAiqxeWlpCb2+vK3MCNRSoeNdZWFiIkpISNDc3o6urC93d3bAsK20CE6gGoF43RbIpOLGcQAnUy3gBZB+JebHm59lQ5tdPX36cQ2XxxsuZoczQTMfKn3rMUMQ+xUz8jJNr6N8x5Oc0KBuWfvoi0F+YBglUpoBLOadcTrmuQ8fPaVA2Pv30xSmXU65svPHqz6tCzFCuoa5jRtuU63UUs755CvAffs1johQRgSrJZ15jAjWPiVJEBKokn3mNCdQ8JkoREaiSfOY1JlDzmChFRKBK8pnXmEDNY6IUEYEqyWdeYwI1j4lSROm/2lUyzcY6FCBQHaoH6JNAAxRXh2kC1aF6gD4JNEBxdZgmUB2qB+iTQAMUV4dpAtWheoA+CTRAcXWYJlAdqgfok0ADFFeH6W97Qt2suZ3FFgAAAABJRU5ErkJggg=="/></switch></g></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-149"><g><path d="M 423.63 137 L 417.03 137 L 417.03 288 C 420.93 288 420.93 294 417.03 294 L 417.03 294 L 417.03 328 C 420.93 328 420.93 334 417.03 334 L 417.03 334 L 417.03 408 C 420.93 408 420.93 414 417.03 414 L 417.03 414 L 417.03 418 C 420.93 418 420.93 424 417.03 424 L 417.03 424 L 417.03 445 L 430 445" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: rgb(0, 0, 0);"/><path d="M 428.88 137 L 421.88 140.5 L 423.63 137 L 421.88 133.5 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-150"><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 237px; margin-left: 420px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; background-color: #ffffff; "><div style="display: inline-block; font-size: 11px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; ">HTTP</div></div></div></foreignObject><image x="405.5" y="231" width="29" height="15.75" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHQAAAA/CAYAAAAxBeyIAAAAAXNSR0IArs4c6QAAA/xJREFUeF7tm78vNEEYx78rEoUG0VGJHxGJSIiIQuFHkKAglCRErVKQUChIUPgDRChPUIqCwu9EQSHRiEgkNKIhUQg5mXvf2/f23tubW7Nr5jbf7dzMPM8z388882uXFY1Go+ATGgUsAg0Ny1hHCDRcPAk0ZDwJlEDDpkDI+sM1lEBDpkDIusMMDTPQ1dVVjI+P213s7OzE3t6eUpeLi4vx8vJi27i6ukJdXZ399/7+Pjo6OpR8yBqPjIxgfX0dv+krMabS0lI8Pj7KwnSU5+fno6CgAKJtY2MjWltb0dPTg9zc3LR2HBlKoJ40T1k5PnhUgaYyLuDOzs46ki65HoGqM3RYCBJo3FFfXx82NzeRl5f3X/TagT49PWF3dzcjWaenp/H8/GzXnZqaQllZmbRtZWUlWlpa8Ju+0mXo/Pw8KioqXOP++vrC6+sr7u/vcXZ2hqOjIyRfuQ8MDGBra8s8oFIaCRXKy8txd3dn/3J+fo6mpiYvJjKu66ev5DXUa9y3t7exafbw8NARfyQSwdDQkOM37RmascIA/BRZ5tdPX6pARawfHx9ob2/H8fGxHXp1dTVubm4IVAZTlJsGVMR0fX2N2tpaR/gie0Ws8YcZ6kLXRKAi1JqaGkdWbmxsYHh4mEBlWWoq0MHBQcdmaHFxEZOTkwSarUDHxsawtrZmhz8zM4O5uTkCzVag4riys7Njh7+ysoKJiQkCzVagyUvB9vY2+vv7CTQbgV5eXqK+vt4OPScnJ3bRUlRUlBlQcZuRuIOSiZCqfGFhAe/v73ZR8uW8F5t+blRkfv305dc5tK2tDScnJ3boqV6epD22yDr9k3ICBbzeFD08PGB0dBQHBwf/MtGycHFxgYaGhswvFn4CTNaGQIHl5WVUVVW5SiXubd/e3iBAnp6exl5hfn5+OuqLna3Y4SY/zFANFwuyQS8rF+dOcf5M9fCmKIuAiqxeWlpCb2+vK3MCNRSoeNdZWFiIkpISNDc3o6urC93d3bAsK20CE6gGoF43RbIpOLGcQAnUy3gBZB+JebHm59lQ5tdPX36cQ2XxxsuZoczQTMfKn3rMUMQ+xUz8jJNr6N8x5Oc0KBuWfvoi0F+YBglUpoBLOadcTrmuQ8fPaVA2Pv30xSmXU65svPHqz6tCzFCuoa5jRtuU63UUs755CvAffs1johQRgSrJZ15jAjWPiVJEBKokn3mNCdQ8JkoREaiSfOY1JlDzmChFRKBK8pnXmEDNY6IUEYEqyWdeYwI1j4lSROm/2lUyzcY6FCBQHaoH6JNAAxRXh2kC1aF6gD4JNEBxdZgmUB2qB+iTQAMUV4dpAtWheoA+CTRAcXWYJlAdqgfok0ADFFeH6W97Qt2suZ3FFgAAAABJRU5ErkJggg=="/></switch></g></g></g></g><g data-cell-id="a_cl7nsyDpLQFaXOHeFD-3"><g><path d="M 279.5 257.6 C 279.5 252.85 290.69 249 304.5 249 C 311.13 249 317.49 249.91 322.18 251.52 C 326.87 253.13 329.5 255.32 329.5 257.6 L 329.5 304.4 C 329.5 309.15 318.31 313 304.5 313 C 290.69 313 279.5 309.15 279.5 304.4 Z" fill="#e6e6e6" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(230, 230, 230); stroke: rgb(0, 0, 0);"/><path d="M 329.5 257.6 C 329.5 262.35 318.31 266.2 304.5 266.2 C 290.69 266.2 279.5 262.35 279.5 257.6" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="stroke: rgb(0, 0, 0);"/></g></g><g data-cell-id="a_cl7nsyDpLQFaXOHeFD-4"><g><rect x="262" y="313" width="85" height="17" fill="none" stroke="none" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 89px; height: 1px; padding-top: 322px; margin-left: 260px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">metric-db</div></div></div></foreignObject><image x="260" y="315.5" width="89" height="17" xlink:href="data:image/png;base64,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"/></switch></g></g></g><g data-cell-id="uDJ2bVtIrgoZBCZFZmDG-6"><g><path d="M 570 127 L 550 127 L 580 127 L 564.87 127" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: rgb(0, 0, 0);"/><path d="M 561.12 127 L 566.12 124.5 L 564.87 127 L 566.12 129.5 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/></g></g><g data-cell-id="uDJ2bVtIrgoZBCZFZmDG-5"><g><rect x="570" y="120" width="40" height="14" rx="2.1" ry="2.1" fill="#ffffff" stroke="#000000" pointer-events="all" style="fill: rgb(255, 255, 255); stroke: rgb(0, 0, 0);"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 38px; height: 1px; padding-top: 127px; margin-left: 571px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; font-weight: bold; white-space: normal; word-wrap: normal; ">init</div></div></div></foreignObject><image x="571" y="120.5" width="38" height="17" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAJgAAABECAYAAAB9Pvx1AAAAAXNSR0IArs4c6QAABCZJREFUeF7tnFmoTVEYx3/3wRTiRaYi05Mk4kFE8UYKGZJIhkylDK8iPFJCIWMSUQpRSiHyJFEeCIlCkVmEhP1p37qd1h7O8J17jv3fdbt1z1rfXv3Wb39r7bXWuS3oEgFHAi2OsRVaBJBgksCVgARzxavgEkwOuBKQYK54FVyCyQFXAhLMFa+CSzA54Eqg2QQ7ASwIEPkE9HQlVX7wF0D/QLXzwIzywzVnDQnm128SDJpuoVUZzO+BcImsDOaC9V/QajJYF+AN0K1N82YC5/ya6xO52QTbDcxKmIMN90FUcdTbQN9A7cuRfMsyos4BzpSUkWAVd4UqlhI4G3iQJJg8qQmB7vHw2FkZrCY8FaSEwELgeICKMphUqQmBi8A0CVYTlmUHqWSZYiewPnCna8Dkkr+PAxYDE4ABQAfgLfAQsMn5IeBjzlbnfYtcCezLGbO02KCovc8qrFuXas32FlmJYJsjklsCNO8Bo+K/94jlmZ1B/X00P1oNnM7ROxKsIAutG6L1pB0BIZ4CQ+ItphvAiBzSWJE/wBLgWEZ5CVYQwdYAewMy2NDXC7gATM8pV2uxb8BI4ElKPQlWEMFWAPsDIvwAFuUc7kIeHQGW1kCw0cDUOE4/YFVCzJPAg5LP9gC20d+wVxHmYLZqfjChBywDDQW+AtuAU8DLSMg+wPx47tY1oa5lMcuA9jt05c1gbeuOid4gbQcgdGmZog6PUSWT/DTBrMlfgEnA3UD7pwBXUjL9ROCmBEvu+aJnMCOzPH6DTKIU2rZpLbsWsGFKGSwBQtEFex6tmg8Gfqdk37kp87TtwCYJpgyWNAezRdiNGUO7zdEeJ5Sx7GVZTBlMGSxIYF7gWExpwY6AvXGGrgOArcRLMAkWJGBbQrcyMph9/DPeNiotKsEy4BV9DmZbRbZllHV9BzoFCkkwCfbv9GjSHEyCZT1aVX6uDKYMVqVC6dUlmASTYG0I1HolX0Okq17F+F6k5mDOEqWF1xDZPEOkPSiH29GVim4twRpLMDu6cyehJ3dFR3PWVdTL7VhJgjWWYMOARwk+2LmvsSnbVu2oUfKtJVhjCWbfhfycsGtgvWjn1q5GhxJfAwOjn6PxGbaGlMsaJcEaSzDrk+vx+bQ80tjp19Bp3Tx161JGgjWeYHZ8+lLO3pdgOUHlLfa/r4O1crAzZltzQJFgOSCVU6QoghmT8YB9I8pOfPQGfgEfgHfA/fgUiP23xFflAKx32WYbIuvNR/erkoAEqxKgqqcTkGAyxJWABHPFq+ASTA64EpBgrngVXILJAVcCEswVr4JLMDngSkCCueJVcAkmB1wJSDBXvAouweSAKwEJ5opXwSWYHHAlIMFc8Sq4BJMDrgQkmCteBZdgcsCVgARzxavgEkwOuBKQYK54FVyCyQFXAhLMFa+C/wVRVztUleCmzgAAAABJRU5ErkJggg=="/></switch></g></g></g><g data-cell-id="uDJ2bVtIrgoZBCZFZmDG-9"><g><path d="M 570 373 L 550 373 L 580 373 L 564.87 373" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: rgb(0, 0, 0);"/><path d="M 561.12 373 L 566.12 370.5 L 564.87 373 L 566.12 375.5 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/></g></g><g data-cell-id="uDJ2bVtIrgoZBCZFZmDG-8"><g><rect x="570" y="366.5" width="40" height="13" rx="1.95" ry="1.95" fill="#ffffff" stroke="#000000" pointer-events="all" style="fill: rgb(255, 255, 255); stroke: rgb(0, 0, 0);"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 38px; height: 1px; padding-top: 373px; margin-left: 571px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; font-weight: bold; white-space: normal; word-wrap: normal; ">init</div></div></div></foreignObject><image x="571" y="366.5" width="38" height="17" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAJgAAABECAYAAAB9Pvx1AAAAAXNSR0IArs4c6QAABCZJREFUeF7tnFmoTVEYx3/3wRTiRaYi05Mk4kFE8UYKGZJIhkylDK8iPFJCIWMSUQpRSiHyJFEeCIlCkVmEhP1p37qd1h7O8J17jv3fdbt1z1rfXv3Wb39r7bXWuS3oEgFHAi2OsRVaBJBgksCVgARzxavgEkwOuBKQYK54FVyCyQFXAhLMFa+CSzA54Eqg2QQ7ASwIEPkE9HQlVX7wF0D/QLXzwIzywzVnDQnm128SDJpuoVUZzO+BcImsDOaC9V/QajJYF+AN0K1N82YC5/ya6xO52QTbDcxKmIMN90FUcdTbQN9A7cuRfMsyos4BzpSUkWAVd4UqlhI4G3iQJJg8qQmB7vHw2FkZrCY8FaSEwELgeICKMphUqQmBi8A0CVYTlmUHqWSZYiewPnCna8Dkkr+PAxYDE4ABQAfgLfAQsMn5IeBjzlbnfYtcCezLGbO02KCovc8qrFuXas32FlmJYJsjklsCNO8Bo+K/94jlmZ1B/X00P1oNnM7ROxKsIAutG6L1pB0BIZ4CQ+ItphvAiBzSWJE/wBLgWEZ5CVYQwdYAewMy2NDXC7gATM8pV2uxb8BI4ElKPQlWEMFWAPsDIvwAFuUc7kIeHQGW1kCw0cDUOE4/YFVCzJPAg5LP9gC20d+wVxHmYLZqfjChBywDDQW+AtuAU8DLSMg+wPx47tY1oa5lMcuA9jt05c1gbeuOid4gbQcgdGmZog6PUSWT/DTBrMlfgEnA3UD7pwBXUjL9ROCmBEvu+aJnMCOzPH6DTKIU2rZpLbsWsGFKGSwBQtEFex6tmg8Gfqdk37kp87TtwCYJpgyWNAezRdiNGUO7zdEeJ5Sx7GVZTBlMGSxIYF7gWExpwY6AvXGGrgOArcRLMAkWJGBbQrcyMph9/DPeNiotKsEy4BV9DmZbRbZllHV9BzoFCkkwCfbv9GjSHEyCZT1aVX6uDKYMVqVC6dUlmASTYG0I1HolX0Okq17F+F6k5mDOEqWF1xDZPEOkPSiH29GVim4twRpLMDu6cyehJ3dFR3PWVdTL7VhJgjWWYMOARwk+2LmvsSnbVu2oUfKtJVhjCWbfhfycsGtgvWjn1q5GhxJfAwOjn6PxGbaGlMsaJcEaSzDrk+vx+bQ80tjp19Bp3Tx161JGgjWeYHZ8+lLO3pdgOUHlLfa/r4O1crAzZltzQJFgOSCVU6QoghmT8YB9I8pOfPQGfgEfgHfA/fgUiP23xFflAKx32WYbIuvNR/erkoAEqxKgqqcTkGAyxJWABHPFq+ASTA64EpBgrngVXILJAVcCEswVr4JLMDngSkCCueJVcAkmB1wJSDBXvAouweSAKwEJ5opXwSWYHHAlIMFc8Sq4BJMDrgQkmCteBZdgcsCVgARzxavgEkwOuBKQYK54FVyCyQFXAhLMFa+C/wVRVztUleCmzgAAAABJRU5ErkJggg=="/></switch></g></g></g><g data-cell-id="uDJ2bVtIrgoZBCZFZmDG-11"><g><path d="M 40 209 L 60 209 L 29.49 209 L 44.63 209" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: rgb(0, 0, 0);"/><path d="M 48.38 209 L 43.38 211.5 L 44.63 209 L 43.38 206.5 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/></g></g><g data-cell-id="uDJ2bVtIrgoZBCZFZmDG-10"><g><rect x="0" y="203" width="40" height="12" rx="1.8" ry="1.8" fill="#ffffff" stroke="#000000" pointer-events="all" style="fill: rgb(255, 255, 255); stroke: rgb(0, 0, 0);"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 38px; height: 1px; padding-top: 209px; margin-left: 1px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; font-weight: bold; white-space: normal; word-wrap: normal; ">init</div></div></div></foreignObject><image x="1" y="202.5" width="38" height="17" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAJgAAABECAYAAAB9Pvx1AAAAAXNSR0IArs4c6QAABCZJREFUeF7tnFmoTVEYx3/3wRTiRaYi05Mk4kFE8UYKGZJIhkylDK8iPFJCIWMSUQpRSiHyJFEeCIlCkVmEhP1p37qd1h7O8J17jv3fdbt1z1rfXv3Wb39r7bXWuS3oEgFHAi2OsRVaBJBgksCVgARzxavgEkwOuBKQYK54FVyCyQFXAhLMFa+CSzA54Eqg2QQ7ASwIEPkE9HQlVX7wF0D/QLXzwIzywzVnDQnm128SDJpuoVUZzO+BcImsDOaC9V/QajJYF+AN0K1N82YC5/ya6xO52QTbDcxKmIMN90FUcdTbQN9A7cuRfMsyos4BzpSUkWAVd4UqlhI4G3iQJJg8qQmB7vHw2FkZrCY8FaSEwELgeICKMphUqQmBi8A0CVYTlmUHqWSZYiewPnCna8Dkkr+PAxYDE4ABQAfgLfAQsMn5IeBjzlbnfYtcCezLGbO02KCovc8qrFuXas32FlmJYJsjklsCNO8Bo+K/94jlmZ1B/X00P1oNnM7ROxKsIAutG6L1pB0BIZ4CQ+ItphvAiBzSWJE/wBLgWEZ5CVYQwdYAewMy2NDXC7gATM8pV2uxb8BI4ElKPQlWEMFWAPsDIvwAFuUc7kIeHQGW1kCw0cDUOE4/YFVCzJPAg5LP9gC20d+wVxHmYLZqfjChBywDDQW+AtuAU8DLSMg+wPx47tY1oa5lMcuA9jt05c1gbeuOid4gbQcgdGmZog6PUSWT/DTBrMlfgEnA3UD7pwBXUjL9ROCmBEvu+aJnMCOzPH6DTKIU2rZpLbsWsGFKGSwBQtEFex6tmg8Gfqdk37kp87TtwCYJpgyWNAezRdiNGUO7zdEeJ5Sx7GVZTBlMGSxIYF7gWExpwY6AvXGGrgOArcRLMAkWJGBbQrcyMph9/DPeNiotKsEy4BV9DmZbRbZllHV9BzoFCkkwCfbv9GjSHEyCZT1aVX6uDKYMVqVC6dUlmASTYG0I1HolX0Okq17F+F6k5mDOEqWF1xDZPEOkPSiH29GVim4twRpLMDu6cyehJ3dFR3PWVdTL7VhJgjWWYMOARwk+2LmvsSnbVu2oUfKtJVhjCWbfhfycsGtgvWjn1q5GhxJfAwOjn6PxGbaGlMsaJcEaSzDrk+vx+bQ80tjp19Bp3Tx161JGgjWeYHZ8+lLO3pdgOUHlLfa/r4O1crAzZltzQJFgOSCVU6QoghmT8YB9I8pOfPQGfgEfgHfA/fgUiP23xFflAKx32WYbIuvNR/erkoAEqxKgqqcTkGAyxJWABHPFq+ASTA64EpBgrngVXILJAVcCEswVr4JLMDngSkCCueJVcAkmB1wJSDBXvAouweSAKwEJ5opXwSWYHHAlIMFc8Sq4BJMDrgQkmCteBZdgcsCVgARzxavgEkwOuBKQYK54FVyCyQFXAhLMFa+C/wVRVztUleCmzgAAAABJRU5ErkJggg=="/></switch></g></g></g><g data-cell-id="uDJ2bVtIrgoZBCZFZmDG-12"><g><rect x="240" y="189" width="130" height="40" rx="6" ry="6" fill="#ffffff" stroke="#000000" pointer-events="all" style="fill: rgb(255, 255, 255); stroke: rgb(0, 0, 0);"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 128px; height: 1px; padding-top: 209px; margin-left: 241px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "><b>Dashboard UI</b><div><i>grafana</i></div></div></div></div></foreignObject><image x="241" y="195" width="128" height="32" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAgAAAACACAYAAAB9V9ELAAAAAXNSR0IArs4c6QAAIABJREFUeF7tnQW0PTt5xTfu7lLctbi1uLs7lOJeXNpiD3d3d4cWq6CFFnd3KLS4Syne+bESVkiTTObcM+fOPWd/a/3Xeu9OdGfOZOezHEoWI2AEjIARMAJGYOcQONTOzdgTNgJGwAgYASNgBGQC4JfACBgBI2AEjMAOImACsIOL7ikbASNgBIyAETAB8DtgBIyAETACRmAHETAB2MFF95SNgBEwAkbACJgA+B0wAkbACBgBI7CDCJgA7OCie8pGwAgYASNgBEwA/A4YASNgBIyAEdhBBEwAdnDRPeU/IvAiSTco4PFjScecCaebS3pmpe1zSProTP262c0gcENJL6x0dQFJ793MMNyLERhHwARgHCOX2F4ETAC2d233a2YmAPuFvPudjIAJwGTINlqB08L5JvT4O0m/kPQTSf8t6UuSPibp3yW9R9JvJrS1C0VNAHZhlTc7x00RgJNK+nplah+SdO4Vp30WSZ+o1H3r8C25ZOHZEcN3p1TtPyWdYsWxuNrMCJgAzAzwHpufSgBa3f1I0kslPUnSp/c4rm2pbgKwLSu5nHmYAPzpWpgALOfd/H8jMQFY8OIEe+EUDUDPbNASvETSXSV9p6fCFpcxAdjixd2nqZkAmADs06s3vVsTgOmYbbLGOjUA+bi/L+m6kt6yyQktrC8TgIUtyBYMxwTABODAvMYmAMteqjkJADP/raS/kvTiZcMw2+hMAGaDdmcbNgEwATgwL78JwLKXqkUA7iWJU3wqR5J0HEknknQhSWeSRm98hARcUdI/LxuKWUZnAjALrDvdqAmACcCB+QGYACx7qVoE4JSSvjoyfIjAnSXdRtJRG2UhEmeV9M1lw7H20ZkArB3SnW/QBMAE4MD8CEwAlr1UeyUAcXaE4fyDpLM3pstmeKMJcJxK0tVDmCKhQ8eTdLRgVvihpP8KToz/JOlfJP1+Qttp0cOG0KPLBpJyGklHD4TmlyHk8SuSPhm0GGgyCIXskRoBYPzHTho4dJjrdUJ41Qkl4UyJEyUhV/8YIix6wixbiYD+PIRt0vVhhqRAVx1Csq4h6VxD8qCTSAKLbw/Ji74g6TWSXibpBz0TrZRhXn8p6WKSLhz6OG5YR0JJIYaEkxJG+m/hX88ca0M6vKRLSbrcMP6zDQlzTh36QnP10zAXwlbfHcxS3+qcG+8DyZtKchFJ7wwP/mxYt/sO7V86aMkOJ+mNQQNW6wrizHvOPzRqkGrWgbUnaRPrQHTNr0IDJJbivSrJOhMBOQyw8+VwsToCJgDLfjvWRQCY5ZElvUvSOStTZoM+fdhcWqjwEXz4yEczr8+GdbvBLPHmCXDzkb11+GBDLnqFDfERkh6bfJRrdWsEAE3IiUMl5ssHng2rJZ8LTpVjmfxaBAAi9amwRoztjCN9fk/S7YdyL+8FJ5SDXFxf0t+FNe+tDtFi7Z8z1P11b6WwYd52IIf3GcJQIRg9QvvPDdEqPxupwHcMU1bpe3aVAc/XSQJbiMCxsrZaBADT2FMkQRxaQqjbTSS9Q9L1QpRNqbwJQM/Ku8zGEDAB2BjUK3W0TgLAANAEsEEdozKaxwWTQW2w15L0/GET4MQ2VSAYfyvpYR0VGR8ai4t2lK0Ved9wmr7aiFmjRgC+HE6nkKW3B41Dz1A4hXKa/kijcIsAnC4QjzcFwtbTJ2XYXJ/aWRgfkVcMm+HFO8uXinFCRzPRc0InpfKrBvJ5iRX7+2J4D9BEtOTnFcxQyb8yaIhOW2igRgBuMazFMyaMGcICJvw2aoTMBGACoC46PwImAPNjvJce1k0AGMuDwsmvNC4yi52sMmA2jH8Nqum9zAkzQ01FSru8k2gKVt0w0rF9OKi4/6cy4BoBwJyASpyMaKjepwgneFT2mCdK0iIA5x/qvj6YU6b0iTkC1frbRiqhNkaVj/lmr/KNwbTDhva1RkOYGHhn9rqWrAP5MFqmHcwVqdkmDgv/F6RGkEoEAHMTf2f8UwSzyf2C9qlUzwRgCpouOzsCJgCzQ7ynDuYgAKjT+XijYi8JNnZSCKdyhPC32maIjZhTFqc0/ACuMJy4rllpH9sptt+aWrflRMVmAznghM6JD5syhAWbLqfnkjwwmBFKz2oE4P1BU3LLFVeP0MoXVOq2CAD+EtjHEQgEmzVrxakdWza27ppAWvAhQBVeErBCBd5KLAUBZC0xLaAqxz/g5I0+wYky0f6dF8XsQ+bJkrBZPmuwrX88vAtnCCYfSEpJ7hlMO7XhYLbBNyOXewwk5aaDvwTtlyQnAKS1hcS1SBLmHsgWcwAf3nfeewQfjRNU+jIBaLxMfrR5BEwANo/5lB7nIAD0z4f7PJWBYMPEuSyV1qbFzWc3LrSFuv/BlT6w7T+98ozERKUTIxvJnSobHO8xGz027VwgGpCe/y08qxEAHBjZTCBJRFrQLs6FfPAhGncIm1VtLdlo2bBL0sIylkdlfqvMwQ/V8iODL0WtX5wUUe+X5CEDqbh35Rlpojkp5+tOcd4H1ipucHkT2PXRKuXC6RmfgZJGibUgVz0bbSrHl4TWpkQ0U7+M0jQgSjjo5QJhRDuCYIbiTgxIB4KfB/WiloC/sbZPqOAEuYLU5O8uJiv8InAUbIkJwAhAfrxZBEwANov31N7mIgCPadj62ezYLFJ5QzjllMaPo9pnCw84cWIjzp2uKPraxseSzajko4B6F+/8luR48cHHKfDKwbM8r1sjALEcp2pOuIwpl0OCU1tpPJze2TBLjnJjBICIicuHKINS22zw+GKUBL8J/B5yATsc1UqhoHj1Q1aw69cE8w/ErPS9+G44BefqeTb4D1QaxEZOFsqS3L1x0ieKJW7eeV1IW8tcw3O0UviGtKRFjmtkh/aIKEBjwyZfExOAEfD9eLMImABsFu+pvc1FADhJ4yVfEryeOeWkglq+tHlwIqrdbU997L/x9JW29/mK9zmkoWY7R9XasjfTPloNynGqi/9q6mnKtwgAGyOe/5+p4IRZhBNu6dRJldpm1SIA4AmhImqiJphPwK9knwY7nO5ybUdLG1Na71LfZIskcqAkfz04mD4ve4DKvebEySZcc5S84PDO/EelH/onIqMkLQIALhASCF1LcJJlTUuCWQRtRssPoTV22jQBGFkAP94sAiYAm8V7am9zEQBU9njzl4S/E9K0DqltsJzKsWvnwvvIx5rTVC5oIVBHj4WETRl3iwDUTBtp+2yeqfo4fca1qVyfmkuLAHDKLhGmvA020PNWJkrkQr65Ev75F5XykJza9a9pFcYFoStJD1a964IPSo0A3XF4b55YaahFAFDp/03HANCs1EwoEByIzphAzkrRBtQzARhDz883ioAJwEbhntzZXASg9aGbmhCoNSk+mjjE5cImj7NVSVAb1+4yhzi8Ojhggc1YJsQxwFsE4ErDOCAdLWlt5oSEkSQml1aduw2mg0ePDXrQxjwqxMeXiuYOiPgOYMJAu5ILTps1p7u8LPVxvCw5j7IOZKZch7RO4fgw1MJIWwSA94mETWPSipC5WbDzj7XRIoUmAGPo+flGETAB2CjckzubiwC0Ypyf1jjVMgESueBsxl0DqLlxsMNmX9pgahNuEYCWE1beHhEFnIaxvRKvT44DQuJ6pUUA8OQeuy75Mo07FErOlIyrRQCIAOi5kwEnylpY299nzpfnCI51JUw40TOHXsHXg2RRJYHQ1cw3fGfwpSApD+PhlM87g5/ElG/QKgQAjRHREz2ZKFtmjjSjYAsvEjPVtBQmAL1vmsttBIEpP76NDMid/AkCcxEAQqpqJykyvXHRUC58rPHqxzt9ymZfWtIWAaBtNqaaF33rFSEEi1M3ZowxZy/aqREAbPG1MMm0f0gQYXMlWYUAnFnSpzt+A2gXiBQoSb5+mCJqGRjxXOdk2ytEN7CRlwSP+tJdEjgQPrkRhtfbN+VWIQBEFZCXoUfIwUD2v5Lg00D435jgaEhIbElMAMbQ8/ONImACsFG4J3c2FwFonXTY4PMMaJyGOWXXTn9TJ9YiALTFiY2NfC8JZIip56Tcchzc62VAJO4hrKwkqxCAHkdH+iJRDfMrCZoBMgNGQVtTCu/jea9tPLZFzDwRCiWJaYzTZy1n06nvDOVXIQC9fhW0zztOAqiS4ABInoQxaa3NQSAA+IRwH0NJ8GmBUOaC9qfmHEn0CWYdywIRMAFY4KIkQ5qLAJBIp2az5QOI01gU3hE2uVYCGRyfcNxC3ZpeFsMHr5RQZYwAxL5xRiT0atXMdYSooeKueZwvjQCQcx5b9piwCbMZl4R8CZhRoly7kZp2KgGAdLDBlYQ7E9KIidYYqc+7gskGrQ3vQ1TRHyVcglTqYxUCwD0AmB56pKXh6F0bNAhoEkqyTgJAnora7Z1oKmqJj8Zw4PcPESoJl15xQVUuJgBjqC70uQnAQhcmDGsOAoA69IOVafMhxjsfZ68ohF6hMSgJmxUbTO0UvIoTYN4P7yiqdj6saASwIXOZTa/goEaGvNJtcUsjALWcCvlcW06c5HBIEyKt0wTQiiZIfSZYM8hATWMESSFDX+nUuG4nwNqmVXp/WhoO5gLRHRPyG9RCFddJAFohs6RF7r10KZ9Pa/xkbsR/yARg7C04IM9NAJa9UHMQgNqmDBIkoclPeK0kQNh3cb6rCYlpSqevXg1AqV18EdBGEPNPKBwf1Vrq1Vj/roNZgeRHuSyNAEBwxvL5MwdC2ri4qST4b+AHEAXyU9OATHUCJEa+pM7l9M6GFLU/rSRArSyJjLk13lU0AFMIABt3LUFRrhmrvfMt/5p1EgD6JzNlLUMj64T6faqgFUo1SGn9h4YLvUwApqK60PImAAtdmDCsdRMAbNY4rdVO0ORM5wrWVDg5l3LQ4yE/tvFiSyxdo7sXAlBaMTYcYsS5aKgk4FjK0LY0AtCKc0/nxQk6T9YUn+OERqhkFNSzhAGSuCgXkiX1XnZEIig2nNI3g5S++ABEuXOFcPF87OZCMhmWwiepOzcBwDGWDbwkvWGA5EQgcVZJ1k0AIHYQppL0vktpXUgcGrNacqv83UrfMfsAVBZiyX82AVjy6kjrJACo9lHV15KUYIvFCS0N5SKGvHaTHvZb1PE1wccAX4OSrJsAxD4IgeNOgFxISVz6qC2NAGA7Jm3xmJDRjoiBknBXQZ5Ip2XbPmtHhjz6aZkd8PIn/C0KGghU/CXBhsypvCZEcJTulqD83ATgBo2bKrncqZTTIp0H2Rl51wiNLcm6CQB3Q5A7oiT89iBlrcyFeT00ZeSYKAnaHcwKJVOafQAaL/SSH5kALHl11kcAOOWh7sVRqyZ4bD8+e0gef5LvlKR1dTDl2RRSb/S0DXLk10IJyQKI0x9EhX84hZUumymNiVC00r3xP61oMZZGAEhbTKrfliNgy0ubtWLzyXMhtNTSxKxzWhyT2iVN1MPhL41K4D2qtdk6SUNACYM8cmUwpXsqYtFaIqApJgAc52qpn7mHgkiAVibKFklinOsmAJiMWJea8H7jSFu7ITKth+kPh8lSFk7KEUrKrZslMQEY+/Us9LkJwEIXJgxrrxoATvCE9d2/csFOnD2qRGzq+YeCEw2bdSnvPJsMdsZSaBSe928auU8d22X6MeVdJAsgKs3cRFFKb1tauVrSGxLY4GCXy9IIAOMjFS2heyUBI3CteeJzSx2hj7lwPwDhkCV7MaSDHPatTHmt1NGkESYhVJpo537hnSvNoeVIhhMefiU1IUti7cS7DgJAvxCAmgc9RJSolJKQ2AgMIXA1WTcB4H0gz0HNDMA4CN3DJFNL9wzJB1NIYsu5tjV2E4DGoi/5kQnAklenrQHg1jQuKMmFEzO2eU6K5G+vnaZiPU42+AbUPJxb6mY+2GxWMWoAO/MtgxoxnvDZGErvWSlXPhcLkSkvFzZwsuS1Uv9y4x2241ICoVp2wyUSAOZOOlnUsemlPnxkOa2X8Il4ke+/dpFOK80t/hxs8jiBpsKGwEkelX7tZMipN09K1EqGgyqZtUxPrpgzWKN4X0HtncF/pZaIaF0E4L7D+/qAymcB0stmyjqkhIcQQW44bN0ESJPrJgC0ORZuSRnGij8OJkBMfawBvxeIGxE2tbTcEYbW7Y2UMQFY9j5SHZ0JwLIXrqUBWMfI2bgJr3tHo7GWnZFq2DzJusdHgJN6av9EbchHs5RuFg9lTlOordEicM0rpydUwCXzACdVNg18D+gzXhpEf9g66aN2YyHajZIn/H4QAAhSfp98hB9MUIMj4MKGzFwhdJz6+WjXZMx/AEyJ74bs1YQ14DpcNDP4TKBiboWT1U7z+Jtgiik5HsYNiXebTRtzD+9N/BaxWeE/wHtXEhIdEZmCNoONKcq6CADaki9WLquKfX0p/GbAiXcW1Xh8ZyHMqUNkOgfISy1z5F5+z0SE9Fx2tEofaDW41bFl+jABWAXZBdQxAVjAIjSGMCcB4CTA5l/LCRCHxekGp7Lax7w2fLQT5BwgbhjnvJZw4sJMgdyl80Kc3pVDHX1IpfB+EAC89/HiLwkOcqSRrZ22a3PGO59NlI2pJVz8g0PgOi7uIfyTk3wt/3/rUpzWGNn4eRcgQGPvXPr9WhcBYGwtktYaO0QWdXpKTNLyY2Gzve90Xg4THSGM5ORYp6A1gNyM3YlhArBO1DfYlgnABsFeoau5CACJfXD6K5kQSsNsXR5UKk/YGSdWNAPY3gkTa71rKQGgPTYAVLF7eT85SdJGy4FwPwhAK0QOOzIfcVIx984dL2+wZmPvEU7nqOw51a0qbO68P/iH1ITQUdZ/Ska61GmN9MU1X4jY51wEgPannqohYZi1uEPi3RVQcmfJVfEv1QOLaK4ZI05j/aK1I28GTpdo3sbEBGAMoYU+7/3ILHT4Wz+sdRIAPtZ4RGPPHTv1l4DFmxjP/jGfAj5+lE1D0Vrx1fSVEwD+drEQ0oeNcoqw8WMqIGRs7ArY/SAAtVBFHDA5+TN+YuExE9TCySIemEPwqscRbIpg28fmzwe+5bSWt4mpCG1KK/lTWuf44R4C1rIlmKIgfTj5Rds6Hve8py0M5iQAtA1Zg0DiTNsS1gE8cbQjcqXmTwO5q10UNGX9WmW5aRFzACGLtSRBtfqE/HI4wMeh5jRYqmsCsK7V23A7JgAbBnxid6sQAD6g/JCJ1yVzGz9kUrjiPc7JfC/Cxxj1KGpBTvbYSzkhoPpkrKghCTcsCR8k6hJ3DolgfOQsZ1PhVjrsriUhdJETLln/+LiixsbRkY8yTnKE+JETHdsrGwaOgD2XttDXfhCAmk8FNnPmFgV/BjC7UnDW4uTOuuITALFhI8EWnt69MHVtOa2S4Y6TK/Zpwijph/XBOZSUsqwLa4Q/x5RNIR0L/hnE2OMERw57NgzaRzPE9cesP/c25AIJwE+E9w2fBEgSODF/3mdyBkRZpwkgHQdjIMEU64B/Bj4RvHdEVRC1QtIl1iG9y6BmLy8l2pq6Zr3l2fwxOeDzwW+Hd4vfK1omxsq3gH/gid8HDoJokUpx/mN9mgCMIbTQ5yYAC10YD8sIGAEjYASMwJwImADMia7bNgJGwAgYASOwUARMABa6MB6WETACRsAIGIE5ETABmBNdt20EjIARMAJGYKEImAAsdGE8LCNgBIyAETACcyJgAjAnum7bCBgBI2AEjMBCETABWOjCeFhGwAgYASNgBOZEwARgTnTdthEwAkbACBiBhSJgArDQhfGwjIARMAJGwAjMiYAJwJzoum0jYASMgBEwAgtFwARgoQvjYRkBI2AEjIARmBMBE4A50XXbRsAIGAEjYAQWioAJwEIXxsMyAkbACBgBIzAnAiYAc6Lrto2AETACRsAILBQBE4CFLoyHZQSMgBEwAkZgTgRMAOZE120bASNgBIyAEVgoAiYAC10YD8sIGAEjYASMwJwImADMia7bNgJGwAgYASOwUARMABa6MB6WETACRsAIGIE5ETABmBNdt20EjIARMAJGYKEImAAsdGE8LCNgBIyAETACcyJgAjAnum7bCCwXgTNKuqmkS0o6iaRjSfqVpO9Iuouk1y536B6ZETAC60DABGAdKLoNI3CwELiXpEMkHa4y7ItLevvBmpJHawSMwFQETACmIubyRuBgI3BbSU8emcKxJf3wYE/TozcCRmAMAROAMYT83AhsDwLHlPR1SUdNpvRzSc+W9ElJv5B0jA6CsD2IeCZGYIcRMAHY4cX31HcOgVtLemoy619LOpekT+wcEp6wETACMgHwS2AEdgeBN0i6QjLdl0i6we5M3zM1AkYgRcAEwO+DEdgdBH4QvP3jjK8j6RW7M33P1AgYARMAvwNGYPcQOLWkL2bTJvzvG7sHhWdsBIwACFgD4PfACOwGAteW9PJkqv81OP/92W5M3bM0AkaghIAJgN+LbUYAr/frS7qspLMMDnAnkHR4SajC8XrHJv4cST9OQLidpCcl//9KSWyeuZxf0nuSP/6HpL8I/08YHbH2V5d0ckmHlfTOIbb+Ig2w+S1S//KSzinptJJo5yiSfhnGjLPev0l6gaRvjSzciVY43b9Q0o0r7a57fGk395T0sOQPj5J09+T/zzdoL24Y8DlliGL4qaT/DLg+bVijT6/4Ih9f0hWHdsh9cIbhfThZaJ8cCbwXRE18YHh/XiXpzZJ+v2I/rmYEFoeACcDilsQDWgMCh5F0D0l/FzbQVpPfGzbKWyaZ7/jQXyOpcKfBbv74QgN/Jel5yd/5778OmwgbxUmzOo8NGfZKY2EDYgM8c+fc8d5/REjmQ/a+Wpuv72wvFruzpMcV6swxvrSbZw0b7c2SP0DCnjL8Y3N+hqSrjMzjd2GtUxIxNnXI4UPDmh1hrHB4/vGQPfFDneVdzAgsGgETgEUvjwe3AgJHlvSa4XR+mQl1OdXdaDh1vzicmjk9R+Gk/75CW2wenPKjQDaeLunD4RSZV8HbHq/7XB4ynPDvPWGsadE3Bi1DiQTcdzDxPWBiuxeW9K6szlzjS7v59+F0faHkD5ceNBFfHk78bxlI1ikmzOEmkp7fUR7tCiQN7cxUIVfClSS9dWpFlzcCS0PABGBpK+Lx7AUB3mdOvWmoG+19NZwkUeVi+z7icOI/ezjNsekhPxs2v0tkmz0n7aMFFXw+LvrhZBwFM8E1E3PB5wbTw3tDfn02HLQMX8ga4cT9mOxv/xsIDCYDVNyo/08ctAO0cZysPJv8/QugHX3QEkCGENTaOYnBJPL9rN53Jf02+duc40u7zqMTIF0vHTZz1P3IO8K6Qgp+MxCp0w1rymZ/1mz8ODRCGFi3mnDnwUcKm/+nAu6YWcDlSKHMVSVdKmuM55gL0B5ZjMCBRcAE4MAunQdeQOBug8r/kdnfyXJ3m8amkG5yEITzJPVR9Z67gjSbMxtrlLsOZOHRkn4UNnt8B1rCRoXdmo0mCl76nH6/UqlIBr9XhzKxCJn8jhey+NX6YxNLL/fBfyDVcpTqbWp8OCJ+LRkABATfCvwhIEyYVfCvyAW/CkgCpCuVkhYjfU4iJBIipfL3g28Imo6afR9CCX7p3Qn3CyaYkWX2YyOwXARMAJa7Nh7ZNATY0NgwcJqLQow7se5jktugY3lU+vlmwTPS5bLRp8KJ/4SS2ICwFY8JfgV3TAr9ZPDS54a+sbA8NkzIR/rbxcnxXxodoiXAJBDlnweNwOVGBrip8V1Z0j8WxoLGAodItAM1wc8C8pBiAaZPrFTApwANULqR5w6Htb6eOdS9efIQ7c4FxhbZz43AkhEwAVjy6nhsUxBAlc5pPgrqWTbUHjUttmBO3fnvgc0fEpDLXwbv8/zvOKu9rnPQt5CEd/vpgzqZk2m6SbeagWygBo+CaYANqiZssGy0UXCWG/M72NT4OEnnJgw2aTQv3+7AknVL/QRaJ3Mw4wpk1PfgjuYE80zPxUfXy3w4IGrkUbAYgQOLgAnAgV06DzxBADU6am3s3lHuM4TfPWgCStiAz5SVZ4N+f6ENTpl5ZECvtmHCkKpFcTQ8xwQCkJsr5s4AOGV8qNYxUaRC+GRqsmhhhhkFoheF6I/cDLQOzHNNhQnAOlB1G/uKgAnAvsLvzteEwHWDPTg2R1gY9vn/ntA+J3e8u6Ngi8YBEK/vXJ4bnNDS/gjh++yE/vZSNHeaI2yRyIeSkEsgd/bj9Pv5vQxgpO6U8eGgmXrj44dx3gljYyNO/Rl6IwEmdPGHon+ThUjiLHi2qY24vBFYEgImAEtaDY9lVQReltn6V7HP4lAGkYiCRgBP+ZJ8NEQRxGf/OjHscNV5Ug+7N8lpUsEbnsRGJSHBTRqyRrQDPgyQpDlkyvjwyM9t/NjZcdzsETQ/zOfQSeGa1qanvVaZ3E8EZ8zcAXGvfbi+EdgoAiYAG4Xbnc2AAO8wdn5OulFqoXGt7nM7OTkByD6XC5kE2XRSRzLsymgFVhHs0OQsYBPnZM5pGEdGPP7Z4PLfKEmOeBaFsDjK1xICEZ2Ao1uUd2cx92NjnnN8FxucJt+WDAAvfLI1Eo7YI5hBMDdEoT5mINanJRAGQg3JPYA/AL4BMesiWKZrG9vh70QeRDlkiBrA38BiBA4sAiYAB3bpPPCAwGkK8fWE0pHoZYqwMaZe3YQUEtaXS77p8BxzQ34qH+ub2HKSB+FQmJ5gx+rlzz8m6c8blUjvmxIZMuyRaW9MNjG+u2QYt7QupfESIkgq5yhEgaTOkXkdNA4kbyKLI0RjL3K1Afd/2EsDrmsE9hsBE4D9XgH3v1cErlW40paP+3cmNvzNEMYXq5EUKD2dxr9z2k9V1FMv1eEk+aKC49vE4f6xOJoHxlQTbNWpKQPvftTZNdnk+HJyEtMp92LxhMG/4Q5JYS47Ss04aTskbSJLYKop6u2nVA5NTZq/YC9tua4R2BcETAD2BXZ3ukYEHjyov/82aQ/1MfHeU6R0cQ4Z90ox6MSY3z5pnFMgp8EeIef82wvx46jxic3H8522c9KpAAAJoklEQVQsdZAK8gKg1s+T0/AsDT9jLE+udE5/qMNT1TWJjj7YKL/J8eXkBEc7NvVeyVMIc7p/eKEyTpL4iaQ4UIzoCNIzc8ESTpG8O2RiZD1SwS8hDbPE5IRpxGIEDjQCJgAHevk8+HDFbXpbH7nsY3rfXoByLQInu1qeeNqPt/7RPrH7D+zsiLBE1P6pYHrAcz1PE1xqskRULpjdSpjWI5Yer/oobGxENrDJlWST4yMdMzf6pZsy5hA29R7BbMJtfak/RMn0Axn8THbyJ1UwJh6IU5r6uNYvFxKhOYmySafPHixcxgishIAJwEqwudKCEMDWf8lkPITDpbf59QyV63W5DCgKDoF5bDrP+L2w6bCJRiF0kGuFxwTnNMwS6c1zxLDjtT7mtBbbzlP6snnR7v9UOs9PrkQK5PnzY9VNjw9NRJpjAU0H0QmQgh7BYTIPu+RUnid+Kl1mNNVpM4/66Emk1DMHlzEC+4qACcC+wu/O14AA+frPmbSDU1h6texYF5wgiSVPN3Uy05Vu0iNrXB4/jzp+LH0vY7h+uG0wHU8veYh1cvPDmNMcJ9zbJh3ie5ASnXQsmx4f2QvTLIvgyqbeK3lmPpww07sZYju0y7pFad3vUOobDQL+IamjJhojro22GIEDjYAJwIFePg8+qHcJ5YqCrZbNpVdwIsvtzrWUvpgacDSLwom+15v8EZLuntTl1M6d9K2b69I5sAFhmkjt/zjR3bgxUS7RwUQQhZDA/PbB+GzT4yMagUuaorQc+EpTJNsfavwoJa0NYZS5doSLf/Ab6ZVbDc6hT8sKnzpcV9zbhssZgUUiYAKwyGXxoCYgwM1xxHRHwZGOVLI9wqmfG/hyp8FaWF+uTu65VCeOAw/0dLMeC1nLx1/aiO5USEkc6/HbxpEwtZHXIhuos+nx5et2z+H6YkhIr7wlXN8cy5e0NlwnzBXCqdwgy+nf6g8/Bcw08VpiynJvwLoiCXrn6nJGYBYETABmgdWNbhCBPAtgTRVcGlK+6VEGz38iAEryT5K4eS/KQ7MIhNa0CXEj/jzKFALAqZ94/3xcF6lcSkQfxMNzaVAqtcgGymxyfGgzsPUfORnc1NwNpDdON2Jy9b8+my+XBOVXK08hAKwvkQWpECVBdkWLETjwCJgAHPgl3PkJoEZGnZwKSWw4IbaEDzsf+FxIm5s6FabPuXAoVflPsQXnV/LiwEdbeZ7+fDxscu+UhNqZE2kqx23Uz80VrcgG2tzk+DDZ4JnfO5ccEyI0uEMgFa5JJkQyFfDCaZPsjVG4xAnNyZhEjQsREynuT8pyD4y14+dGYLEImAAsdmk8sE4E2ASJ505Pk6j1CSljw84FuzD2Y7LhcQplI0ovn6ndD18KwZtiC8YWj00+FZz6uFmwJtQhQuFUYdNh88k3uF9WKuenVy47wreh1demxtfrwFcbK3kX0suPWrkfCNmDEEbBLHL2AoGIz9nswY6cBJgpIBo4SEZxBEDnD9PFlo+ACcDy18gjHEcgTwZEDRz0HivpHeEUyGn7osFBMN4exymZk296nWxNRXy5gSi8KRkKJ0tSy+aJelqjzXMIUBZPffIIfDtUJBMf5IVIBjY6cv+Tcx4nuTzsLb04h99yOpbcXNGTu35T48sdDmthlzUswQtnviituHy0OXlaaAjjrQcHSepxKRImCbQKZBHEgRTTAdoEfEsghGl2wY+H9whfgBzz8TfVJYzAghAwAVjQYngoKyNAMhk+8mzwvYJHPN7dnAjZZKNwrS+OX7mQbTD1HodYcJnNFEFj8L6CLZ+Nm1BCtBO5gxnaCu64R42NR3s6VvqG6HB5DTkCMBVEyVMb9+Su39T48lN5Leyyhi15F66QPBw7lT8unOjz9tAAQeQgh+kFQJhLuKAJwpWTDdpA64LWAe0RvgsWI3AgETABOJDL5kEXEEB1S1x5KyyOany4Of2hQuaEh5o3yi9CPoBSdrhXZte/ol3gMpupcqYhGQ9Xyaahi6U28A1ADc2thFGeGsZeKs+plZMtwoaWmz/wZM/t5qV2NjE+SEuaSrfkwNfCFbIUtTiUu07hPoi0Pid8SAZZGMcuXkIbwfsR8QM3EiilJqbY9tS7C6a+Ky5vBGZFwARgVnjd+D4ggD0f9Tke8njPc7LDsx8vek6OfLR/HsZFHn3s8FFaaYTxK+CEHIWEOiTWWUUYEzf0cZ88SYzwzidNL5sOKuY3hlC1OM7YBxoCVN84H6KyRnMAoSGnPkmFInEhUgETQJQfBXNF71jnHN9JCzcnlhz4amMtkRsS/bA+Y0KiIRIj4cUPfmzqaICIyMD/AbJFoqBcSP0M7rxbZExEcwCZwpTx0rFO/dwILBUBE4ClrozHtQkEsKun9wig7iW3v8UIGAEjsPUImABs/RJ7ghUEsKljJ09t7pwMifO2GAEjYAS2HgETgK1fYk+wggDZArHFR8GuTAbAntvhDKoRMAJG4MAjYAJw4JdwZyfArXrEyRPmxT8ctXovAcIR7MMhHjwCiId/Glq2s8B64kbACOwGAiYAu7HO2zhLQvDelkyMEDmc9ErJf/L556FdOILhINZTdxux9JyMgBHYQQRMAHZw0bdkysT+E/Z24mQ+eMMTl13byPH6ftAQ+33nDIPWLXlbApenYQSMgBH4UwRMAPxGHGQEbjEQgGdkEyB3O+FcxPeTzY1QOULHLhA8/vMLdcgHQFgdGeEsRsAIGIGdQcAEYGeWemsn+mxJN11xdmz+5Hmv5dNfsVlXMwJGwAgsHwETgOWvkUc4jgAqffLlH2O86B9KkMSFOwBICmQxAkbACOwkAiYAO7nsWznpYw4Z8a4RfADOEnwDjirpV0NKXS5u+bqk94ZrgsmSZ5X/Vr4GnpQRMAK9CJgA9CLlckbACBgBI2AEtggBE4AtWkxPxQgYASNgBIxALwImAL1IuZwRMAJGwAgYgS1CwARgixbTUzECRsAIGAEj0IuACUAvUi5nBIyAETACRmCLEDAB2KLF9FSMgBEwAkbACPQiYALQi5TLGQEjYASMgBHYIgRMALZoMT0VI2AEjIARMAK9CJgA9CLlckbACBgBI2AEtggBE4AtWkxPxQgYASNgBIxALwImAL1IuZwRMAJGwAgYgS1CwARgixbTUzECRsAIGAEj0IuACUAvUi5nBIyAETACRmCLEDAB2KLF9FSMgBEwAkbACPQiYALQi5TLGQEjYASMgBHYIgRMALZoMT0VI2AEjIARMAK9CJgA9CLlckbACBgBI2AEtggBE4AtWkxPxQgYASNgBIxALwL/B/YTOPluIEEOAAAAAElFTkSuQmCC"/></switch></g></g></g><g data-cell-id="uDJ2bVtIrgoZBCZFZmDG-17"><g><path d="M 230 455 L 250 455 L 220 455 L 235.13 455" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: rgb(0, 0, 0);"/><path d="M 238.88 455 L 233.88 457.5 L 235.13 455 L 233.88 452.5 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/></g></g><g data-cell-id="uDJ2bVtIrgoZBCZFZmDG-18"><g><path d="M 230 455 L 250 455 L 220 455 L 238.13 455" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: rgb(0, 0, 0);"/><path d="M 238.88 455 L 237.88 455.5 L 238.13 455 L 237.88 454.5 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/></g></g><g data-cell-id="uDJ2bVtIrgoZBCZFZmDG-14"><g><rect x="190" y="448.5" width="40" height="13" rx="1.95" ry="1.95" fill="#ffffff" stroke="#000000" pointer-events="all" style="fill: rgb(255, 255, 255); stroke: rgb(0, 0, 0);"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 38px; height: 1px; padding-top: 455px; margin-left: 191px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; font-weight: bold; white-space: normal; word-wrap: normal; ">init</div></div></div></foreignObject><image x="191" y="448.5" width="38" height="17" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAJgAAABECAYAAAB9Pvx1AAAAAXNSR0IArs4c6QAABCZJREFUeF7tnFmoTVEYx3/3wRTiRaYi05Mk4kFE8UYKGZJIhkylDK8iPFJCIWMSUQpRSiHyJFEeCIlCkVmEhP1p37qd1h7O8J17jv3fdbt1z1rfXv3Wb39r7bXWuS3oEgFHAi2OsRVaBJBgksCVgARzxavgEkwOuBKQYK54FVyCyQFXAhLMFa+CSzA54Eqg2QQ7ASwIEPkE9HQlVX7wF0D/QLXzwIzywzVnDQnm128SDJpuoVUZzO+BcImsDOaC9V/QajJYF+AN0K1N82YC5/ya6xO52QTbDcxKmIMN90FUcdTbQN9A7cuRfMsyos4BzpSUkWAVd4UqlhI4G3iQJJg8qQmB7vHw2FkZrCY8FaSEwELgeICKMphUqQmBi8A0CVYTlmUHqWSZYiewPnCna8Dkkr+PAxYDE4ABQAfgLfAQsMn5IeBjzlbnfYtcCezLGbO02KCovc8qrFuXas32FlmJYJsjklsCNO8Bo+K/94jlmZ1B/X00P1oNnM7ROxKsIAutG6L1pB0BIZ4CQ+ItphvAiBzSWJE/wBLgWEZ5CVYQwdYAewMy2NDXC7gATM8pV2uxb8BI4ElKPQlWEMFWAPsDIvwAFuUc7kIeHQGW1kCw0cDUOE4/YFVCzJPAg5LP9gC20d+wVxHmYLZqfjChBywDDQW+AtuAU8DLSMg+wPx47tY1oa5lMcuA9jt05c1gbeuOid4gbQcgdGmZog6PUSWT/DTBrMlfgEnA3UD7pwBXUjL9ROCmBEvu+aJnMCOzPH6DTKIU2rZpLbsWsGFKGSwBQtEFex6tmg8Gfqdk37kp87TtwCYJpgyWNAezRdiNGUO7zdEeJ5Sx7GVZTBlMGSxIYF7gWExpwY6AvXGGrgOArcRLMAkWJGBbQrcyMph9/DPeNiotKsEy4BV9DmZbRbZllHV9BzoFCkkwCfbv9GjSHEyCZT1aVX6uDKYMVqVC6dUlmASTYG0I1HolX0Okq17F+F6k5mDOEqWF1xDZPEOkPSiH29GVim4twRpLMDu6cyehJ3dFR3PWVdTL7VhJgjWWYMOARwk+2LmvsSnbVu2oUfKtJVhjCWbfhfycsGtgvWjn1q5GhxJfAwOjn6PxGbaGlMsaJcEaSzDrk+vx+bQ80tjp19Bp3Tx161JGgjWeYHZ8+lLO3pdgOUHlLfa/r4O1crAzZltzQJFgOSCVU6QoghmT8YB9I8pOfPQGfgEfgHfA/fgUiP23xFflAKx32WYbIuvNR/erkoAEqxKgqqcTkGAyxJWABHPFq+ASTA64EpBgrngVXILJAVcCEswVr4JLMDngSkCCueJVcAkmB1wJSDBXvAouweSAKwEJ5opXwSWYHHAlIMFc8Sq4BJMDrgQkmCteBZdgcsCVgARzxavgEkwOuBKQYK54FVyCyQFXAhLMFa+C/wVRVztUleCmzgAAAABJRU5ErkJggg=="/></switch></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-104"><g><rect x="240" y="435" width="130" height="40" rx="6" ry="6" fill="#e6e6e6" stroke="#000000" pointer-events="all" style="fill: rgb(230, 230, 230); stroke: rgb(0, 0, 0);"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 128px; height: 1px; padding-top: 455px; margin-left: 241px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "><b>Auth Service</b><br /><i>keycloak</i></div></div></div></foreignObject><image x="241" y="441" width="128" height="32" xlink:href="data:image/png;base64,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"/></switch></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-120"><g><rect x="49.5" y="189" width="130" height="40" rx="6" ry="6" fill="#e6e6e6" stroke="#000000" pointer-events="all" style="fill: rgb(230, 230, 230); stroke: rgb(0, 0, 0);"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 128px; height: 1px; padding-top: 209px; margin-left: 51px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "><b>Storage Service</b><div><i>seaweedfs</i></div></div></div></div></foreignObject><image x="51" y="195" width="128" height="32" xlink:href="data:image/png;base64,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"/></switch></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-105"><g><rect x="430" y="107" width="130" height="40" rx="6" ry="6" fill="#ffffff" stroke="#000000" pointer-events="all" style="fill: rgb(255, 255, 255); stroke: rgb(0, 0, 0);"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 128px; height: 1px; padding-top: 127px; margin-left: 431px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; font-weight: bold; white-space: normal; word-wrap: normal; ">Search Service</div></div></div></foreignObject><image x="431" y="120.5" width="128" height="17" xlink:href="data:image/png;base64,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"/></switch></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-108"><g><rect x="430" y="353" width="130" height="40" rx="6" ry="6" fill="#ffffff" stroke="#000000" pointer-events="all" style="fill: rgb(255, 255, 255); stroke: rgb(0, 0, 0);"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 128px; height: 1px; padding-top: 373px; margin-left: 431px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "><b>Dashboard Service</b></div></div></div></foreignObject><image x="431" y="366.5" width="128" height="17" xlink:href="data:image/png;base64,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"/></switch></g></g></g><g data-cell-id="uDJ2bVtIrgoZBCZFZmDG-21"><g><rect x="452.5" y="588.61" width="85" height="20" fill="none" stroke="none" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 89px; height: 1px; padding-top: 599px; margin-left: 451px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">data-db</div></div></div></foreignObject><image x="451" y="592.5" width="89" height="17" xlink:href="data:image/png;base64,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"/></switch></g></g></g><g data-cell-id="uDJ2bVtIrgoZBCZFZmDG-23"><g><path d="M 439.5 523.21 C 439.5 518.46 450.69 514.61 464.5 514.61 C 471.13 514.61 477.49 515.52 482.18 517.13 C 486.87 518.74 489.5 520.93 489.5 523.21 L 489.5 570.01 C 489.5 574.76 478.31 578.61 464.5 578.61 C 450.69 578.61 439.5 574.76 439.5 570.01 Z" fill="#e6e6e6" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(230, 230, 230); stroke: rgb(0, 0, 0);"/><path d="M 489.5 523.21 C 489.5 527.96 478.31 531.81 464.5 531.81 C 450.69 531.81 439.5 527.96 439.5 523.21" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="stroke: rgb(0, 0, 0);"/></g></g><g data-cell-id="uDJ2bVtIrgoZBCZFZmDG-24"><g><path d="M 499.5 523.21 C 499.5 518.46 510.69 514.61 524.5 514.61 C 531.13 514.61 537.49 515.52 542.18 517.13 C 546.87 518.74 549.5 520.93 549.5 523.21 L 549.5 570.01 C 549.5 574.76 538.31 578.61 524.5 578.61 C 510.69 578.61 499.5 574.76 499.5 570.01 Z" fill="#e6e6e6" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(230, 230, 230); stroke: rgb(0, 0, 0);"/><path d="M 549.5 523.21 C 549.5 527.96 538.31 531.81 524.5 531.81 C 510.69 531.81 499.5 527.96 499.5 523.21" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="stroke: rgb(0, 0, 0);"/></g></g><g data-cell-id="uDJ2bVtIrgoZBCZFZmDG-25"><g><path d="M 470.5 533.21 C 470.5 528.46 481.69 524.61 495.5 524.61 C 502.13 524.61 508.49 525.52 513.18 527.13 C 517.87 528.74 520.5 530.93 520.5 533.21 L 520.5 580.01 C 520.5 584.76 509.31 588.61 495.5 588.61 C 481.69 588.61 470.5 584.76 470.5 580.01 Z" fill="#e6e6e6" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(230, 230, 230); stroke: rgb(0, 0, 0);"/><path d="M 520.5 533.21 C 520.5 537.96 509.31 541.81 495.5 541.81 C 481.69 541.81 470.5 537.96 470.5 533.21" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="stroke: rgb(0, 0, 0);"/></g></g><g data-cell-id="uDJ2bVtIrgoZBCZFZmDG-29"><g><path d="M 494.86 481.37 L 494.86 518.63" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: rgb(0, 0, 0);"/><path d="M 494.86 476.12 L 498.36 483.12 L 494.86 481.37 L 491.36 483.12 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/><path d="M 494.86 523.88 L 491.36 516.88 L 494.86 518.63 L 498.36 516.88 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/></g><g data-cell-id="uDJ2bVtIrgoZBCZFZmDG-30"><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 497px; margin-left: 496px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; background-color: #ffffff; "><div style="display: inline-block; font-size: 11px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; ">JDBC</div></div></div></foreignObject><image x="481.5" y="491" width="29" height="15.75" xlink:href="data:image/png;base64,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"/></switch></g></g></g></g></g></g></g></svg> \ No newline at end of file +<svg xmlns="http://www.w3.org/2000/svg" style="background: #ffffff; background-color: #ffffff; color-scheme: light;" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="611px" height="614px" viewBox="-0.5 -0.5 611 614"><defs/><rect fill="#ffffff" width="100%" height="100%" x="0" y="0" style="fill: rgb(255, 255, 255);"/><g><g data-cell-id="0"><g data-cell-id="1"><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-97"><g><path d="M 495 428.63 L 495 411 L 380.03 411 L 380.03 171 L 337.51 171 L 337.5 153.37" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: rgb(0, 0, 0);"/><path d="M 495 433.88 L 491.5 426.88 L 495 428.63 L 498.5 426.88 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/><path d="M 337.5 148.12 L 341 155.12 L 337.5 153.37 L 334 155.12 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-98"><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 172px; margin-left: 361px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; background-color: #ffffff; "><div style="display: inline-block; font-size: 11px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; ">HTTP</div></div></div></foreignObject><image x="346.5" y="166" width="29" height="15.75" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHQAAAA/CAYAAAAxBeyIAAAAAXNSR0IArs4c6QAAA/xJREFUeF7tm78vNEEYx78rEoUG0VGJHxGJSIiIQuFHkKAglCRErVKQUChIUPgDRChPUIqCwu9EQSHRiEgkNKIhUQg5mXvf2/f23tubW7Nr5jbf7dzMPM8z388882uXFY1Go+ATGgUsAg0Ny1hHCDRcPAk0ZDwJlEDDpkDI+sM1lEBDpkDIusMMDTPQ1dVVjI+P213s7OzE3t6eUpeLi4vx8vJi27i6ukJdXZ399/7+Pjo6OpR8yBqPjIxgfX0dv+krMabS0lI8Pj7KwnSU5+fno6CgAKJtY2MjWltb0dPTg9zc3LR2HBlKoJ40T1k5PnhUgaYyLuDOzs46ki65HoGqM3RYCBJo3FFfXx82NzeRl5f3X/TagT49PWF3dzcjWaenp/H8/GzXnZqaQllZmbRtZWUlWlpa8Ju+0mXo/Pw8KioqXOP++vrC6+sr7u/vcXZ2hqOjIyRfuQ8MDGBra8s8oFIaCRXKy8txd3dn/3J+fo6mpiYvJjKu66ev5DXUa9y3t7exafbw8NARfyQSwdDQkOM37RmascIA/BRZ5tdPX6pARawfHx9ob2/H8fGxHXp1dTVubm4IVAZTlJsGVMR0fX2N2tpaR/gie0Ws8YcZ6kLXRKAi1JqaGkdWbmxsYHh4mEBlWWoq0MHBQcdmaHFxEZOTkwSarUDHxsawtrZmhz8zM4O5uTkCzVag4riys7Njh7+ysoKJiQkCzVagyUvB9vY2+vv7CTQbgV5eXqK+vt4OPScnJ3bRUlRUlBlQcZuRuIOSiZCqfGFhAe/v73ZR8uW8F5t+blRkfv305dc5tK2tDScnJ3boqV6epD22yDr9k3ICBbzeFD08PGB0dBQHBwf/MtGycHFxgYaGhswvFn4CTNaGQIHl5WVUVVW5SiXubd/e3iBAnp6exl5hfn5+OuqLna3Y4SY/zFANFwuyQS8rF+dOcf5M9fCmKIuAiqxeWlpCb2+vK3MCNRSoeNdZWFiIkpISNDc3o6urC93d3bAsK20CE6gGoF43RbIpOLGcQAnUy3gBZB+JebHm59lQ5tdPX36cQ2XxxsuZoczQTMfKn3rMUMQ+xUz8jJNr6N8x5Oc0KBuWfvoi0F+YBglUpoBLOadcTrmuQ8fPaVA2Pv30xSmXU65svPHqz6tCzFCuoa5jRtuU63UUs755CvAffs1johQRgSrJZ15jAjWPiVJEBKokn3mNCdQ8JkoREaiSfOY1JlDzmChFRKBK8pnXmEDNY6IUEYEqyWdeYwI1j4lSROm/2lUyzcY6FCBQHaoH6JNAAxRXh2kC1aF6gD4JNEBxdZgmUB2qB+iTQAMUV4dpAtWheoA+CTRAcXWYJlAdqgfok0ADFFeH6W97Qt2suZ3FFgAAAABJRU5ErkJggg=="/></switch></g></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-143"><g><path d="M 115 428.63 L 115 411 L 220.03 411 L 220.03 171 L 272.49 171 L 272.5 153.37" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: rgb(0, 0, 0);"/><path d="M 115 433.88 L 111.5 426.88 L 115 428.63 L 118.5 426.88 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/><path d="M 272.5 148.12 L 276 155.12 L 272.5 153.37 L 269 155.12 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-144"><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 171px; margin-left: 240px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; background-color: #ffffff; "><div style="display: inline-block; font-size: 11px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; ">HTTP</div></div></div></foreignObject><image x="225.5" y="165" width="29" height="15.75" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHQAAAA/CAYAAAAxBeyIAAAAAXNSR0IArs4c6QAAA/xJREFUeF7tm78vNEEYx78rEoUG0VGJHxGJSIiIQuFHkKAglCRErVKQUChIUPgDRChPUIqCwu9EQSHRiEgkNKIhUQg5mXvf2/f23tubW7Nr5jbf7dzMPM8z388882uXFY1Go+ATGgUsAg0Ny1hHCDRcPAk0ZDwJlEDDpkDI+sM1lEBDpkDIusMMDTPQ1dVVjI+P213s7OzE3t6eUpeLi4vx8vJi27i6ukJdXZ399/7+Pjo6OpR8yBqPjIxgfX0dv+krMabS0lI8Pj7KwnSU5+fno6CgAKJtY2MjWltb0dPTg9zc3LR2HBlKoJ40T1k5PnhUgaYyLuDOzs46ki65HoGqM3RYCBJo3FFfXx82NzeRl5f3X/TagT49PWF3dzcjWaenp/H8/GzXnZqaQllZmbRtZWUlWlpa8Ju+0mXo/Pw8KioqXOP++vrC6+sr7u/vcXZ2hqOjIyRfuQ8MDGBra8s8oFIaCRXKy8txd3dn/3J+fo6mpiYvJjKu66ev5DXUa9y3t7exafbw8NARfyQSwdDQkOM37RmascIA/BRZ5tdPX6pARawfHx9ob2/H8fGxHXp1dTVubm4IVAZTlJsGVMR0fX2N2tpaR/gie0Ws8YcZ6kLXRKAi1JqaGkdWbmxsYHh4mEBlWWoq0MHBQcdmaHFxEZOTkwSarUDHxsawtrZmhz8zM4O5uTkCzVag4riys7Njh7+ysoKJiQkCzVagyUvB9vY2+vv7CTQbgV5eXqK+vt4OPScnJ3bRUlRUlBlQcZuRuIOSiZCqfGFhAe/v73ZR8uW8F5t+blRkfv305dc5tK2tDScnJ3boqV6epD22yDr9k3ICBbzeFD08PGB0dBQHBwf/MtGycHFxgYaGhswvFn4CTNaGQIHl5WVUVVW5SiXubd/e3iBAnp6exl5hfn5+OuqLna3Y4SY/zFANFwuyQS8rF+dOcf5M9fCmKIuAiqxeWlpCb2+vK3MCNRSoeNdZWFiIkpISNDc3o6urC93d3bAsK20CE6gGoF43RbIpOLGcQAnUy3gBZB+JebHm59lQ5tdPX36cQ2XxxsuZoczQTMfKn3rMUMQ+xUz8jJNr6N8x5Oc0KBuWfvoi0F+YBglUpoBLOadcTrmuQ8fPaVA2Pv30xSmXU65svPHqz6tCzFCuoa5jRtuU63UUs755CvAffs1johQRgSrJZ15jAjWPiVJEBKokn3mNCdQ8JkoREaiSfOY1JlDzmChFRKBK8pnXmEDNY6IUEYEqyWdeYwI1j4lSROm/2lUyzcY6FCBQHaoH6JNAAxRXh2kC1aF6gD4JNEBxdZgmUB2qB+iTQAMUV4dpAtWheoA+CTRAcXWYJlAdqgfok0ADFFeH6W97Qt2suZ3FFgAAAABJRU5ErkJggg=="/></switch></g></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-77"><g><path d="M 376.37 137 L 388.03 137 L 388.03 331 L 495 331 L 495 346.63" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: rgb(0, 0, 0);"/><path d="M 371.12 137 L 378.12 133.5 L 376.37 137 L 378.12 140.5 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/><path d="M 495 351.88 L 491.5 344.88 L 495 346.63 L 498.5 344.88 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-78"><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 295px; margin-left: 450px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; background-color: #ffffff; "><div style="display: inline-block; font-size: 11px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; ">HTTP</div></div></div></foreignObject><image x="435.5" y="289" width="29" height="15.75" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHQAAAA/CAYAAAAxBeyIAAAAAXNSR0IArs4c6QAAA/xJREFUeF7tm78vNEEYx78rEoUG0VGJHxGJSIiIQuFHkKAglCRErVKQUChIUPgDRChPUIqCwu9EQSHRiEgkNKIhUQg5mXvf2/f23tubW7Nr5jbf7dzMPM8z388882uXFY1Go+ATGgUsAg0Ny1hHCDRcPAk0ZDwJlEDDpkDI+sM1lEBDpkDIusMMDTPQ1dVVjI+P213s7OzE3t6eUpeLi4vx8vJi27i6ukJdXZ399/7+Pjo6OpR8yBqPjIxgfX0dv+krMabS0lI8Pj7KwnSU5+fno6CgAKJtY2MjWltb0dPTg9zc3LR2HBlKoJ40T1k5PnhUgaYyLuDOzs46ki65HoGqM3RYCBJo3FFfXx82NzeRl5f3X/TagT49PWF3dzcjWaenp/H8/GzXnZqaQllZmbRtZWUlWlpa8Ju+0mXo/Pw8KioqXOP++vrC6+sr7u/vcXZ2hqOjIyRfuQ8MDGBra8s8oFIaCRXKy8txd3dn/3J+fo6mpiYvJjKu66ev5DXUa9y3t7exafbw8NARfyQSwdDQkOM37RmascIA/BRZ5tdPX6pARawfHx9ob2/H8fGxHXp1dTVubm4IVAZTlJsGVMR0fX2N2tpaR/gie0Ws8YcZ6kLXRKAi1JqaGkdWbmxsYHh4mEBlWWoq0MHBQcdmaHFxEZOTkwSarUDHxsawtrZmhz8zM4O5uTkCzVag4riys7Njh7+ysoKJiQkCzVagyUvB9vY2+vv7CTQbgV5eXqK+vt4OPScnJ3bRUlRUlBlQcZuRuIOSiZCqfGFhAe/v73ZR8uW8F5t+blRkfv305dc5tK2tDScnJ3boqV6epD22yDr9k3ICBbzeFD08PGB0dBQHBwf/MtGycHFxgYaGhswvFn4CTNaGQIHl5WVUVVW5SiXubd/e3iBAnp6exl5hfn5+OuqLna3Y4SY/zFANFwuyQS8rF+dOcf5M9fCmKIuAiqxeWlpCb2+vK3MCNRSoeNdZWFiIkpISNDc3o6urC93d3bAsK20CE6gGoF43RbIpOLGcQAnUy3gBZB+JebHm59lQ5tdPX36cQ2XxxsuZoczQTMfKn3rMUMQ+xUz8jJNr6N8x5Oc0KBuWfvoi0F+YBglUpoBLOadcTrmuQ8fPaVA2Pv30xSmXU65svPHqz6tCzFCuoa5jRtuU63UUs755CvAffs1johQRgSrJZ15jAjWPiVJEBKokn3mNCdQ8JkoREaiSfOY1JlDzmChFRKBK8pnXmEDNY6IUEYEqyWdeYwI1j4lSROm/2lUyzcY6FCBQHaoH6JNAAxRXh2kC1aF6gD4JNEBxdZgmUB2qB+iTQAMUV4dpAtWheoA+CTRAcXWYJlAdqgfok0ADFFeH6W97Qt2suZ3FFgAAAABJRU5ErkJggg=="/></switch></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-79"><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 331px; margin-left: 450px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; background-color: #ffffff; "><div style="display: inline-block; font-size: 11px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; ">HTTP</div></div></div></foreignObject><image x="435.5" y="325" width="29" height="15.75" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHQAAAA/CAYAAAAxBeyIAAAAAXNSR0IArs4c6QAAA/xJREFUeF7tm78vNEEYx78rEoUG0VGJHxGJSIiIQuFHkKAglCRErVKQUChIUPgDRChPUIqCwu9EQSHRiEgkNKIhUQg5mXvf2/f23tubW7Nr5jbf7dzMPM8z388882uXFY1Go+ATGgUsAg0Ny1hHCDRcPAk0ZDwJlEDDpkDI+sM1lEBDpkDIusMMDTPQ1dVVjI+P213s7OzE3t6eUpeLi4vx8vJi27i6ukJdXZ399/7+Pjo6OpR8yBqPjIxgfX0dv+krMabS0lI8Pj7KwnSU5+fno6CgAKJtY2MjWltb0dPTg9zc3LR2HBlKoJ40T1k5PnhUgaYyLuDOzs46ki65HoGqM3RYCBJo3FFfXx82NzeRl5f3X/TagT49PWF3dzcjWaenp/H8/GzXnZqaQllZmbRtZWUlWlpa8Ju+0mXo/Pw8KioqXOP++vrC6+sr7u/vcXZ2hqOjIyRfuQ8MDGBra8s8oFIaCRXKy8txd3dn/3J+fo6mpiYvJjKu66ev5DXUa9y3t7exafbw8NARfyQSwdDQkOM37RmascIA/BRZ5tdPX6pARawfHx9ob2/H8fGxHXp1dTVubm4IVAZTlJsGVMR0fX2N2tpaR/gie0Ws8YcZ6kLXRKAi1JqaGkdWbmxsYHh4mEBlWWoq0MHBQcdmaHFxEZOTkwSarUDHxsawtrZmhz8zM4O5uTkCzVag4riys7Njh7+ysoKJiQkCzVagyUvB9vY2+vv7CTQbgV5eXqK+vt4OPScnJ3bRUlRUlBlQcZuRuIOSiZCqfGFhAe/v73ZR8uW8F5t+blRkfv305dc5tK2tDScnJ3boqV6epD22yDr9k3ICBbzeFD08PGB0dBQHBwf/MtGycHFxgYaGhswvFn4CTNaGQIHl5WVUVVW5SiXubd/e3iBAnp6exl5hfn5+OuqLna3Y4SY/zFANFwuyQS8rF+dOcf5M9fCmKIuAiqxeWlpCb2+vK3MCNRSoeNdZWFiIkpISNDc3o6urC93d3bAsK20CE6gGoF43RbIpOLGcQAnUy3gBZB+JebHm59lQ5tdPX36cQ2XxxsuZoczQTMfKn3rMUMQ+xUz8jJNr6N8x5Oc0KBuWfvoi0F+YBglUpoBLOadcTrmuQ8fPaVA2Pv30xSmXU65svPHqz6tCzFCuoa5jRtuU63UUs755CvAffs1johQRgSrJZ15jAjWPiVJEBKokn3mNCdQ8JkoREaiSfOY1JlDzmChFRKBK8pnXmEDNY6IUEYEqyWdeYwI1j4lSROm/2lUyzcY6FCBQHaoH6JNAAxRXh2kC1aF6gD4JNEBxdZgmUB2qB+iTQAMUV4dpAtWheoA+CTRAcXWYJlAdqgfok0ADFFeH6W97Qt2suZ3FFgAAAABJRU5ErkJggg=="/></switch></g></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-81"><g><path d="M 305 399.37 L 305 428.63" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: rgb(0, 0, 0);"/><path d="M 305 394.12 L 308.5 401.12 L 305 399.37 L 301.5 401.12 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/><path d="M 305 433.88 L 301.5 426.88 L 305 428.63 L 308.5 426.88 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 409px; margin-left: 305px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; background-color: #ffffff; "><div style="display: inline-block; font-size: 11px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; ">LDAP</div></div></div></foreignObject><image x="290.5" y="403" width="29" height="15.75" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHQAAAA/CAYAAAAxBeyIAAAAAXNSR0IArs4c6QAACKVJREFUeF7tXGeI1kwQnteOInbFrqjYe8GCig0VexesqAceKIrYe8eK7Y/YK/ZeEBv2hvUETxR7x4K968mzfLskubxvkr39SC7sgD8u2Z3dmSczOzM7r5GkpKQk0hQaDUQ0oKHBkgmiAQ0XnhrQkOGpAdWAhk0DIZNHn6Ea0JBpIGTiaAsNM6ArVqyguLg4IWLz5s3p0KFDSkUuVKgQPXv2zJFnxowZKUeOHJQzZ07KlSsXValSherVq8f+gcf/RRMmTKDp06eb2A8bNozmz58vvaRbmY0LZMmShbJnz85krVWrFjVu3Jhat25N6dKli7kPk4UGCdBYu27QoAENHz6cCRiJRKQVbZ34588fKlq0aLIPLnfu3OxZhgwZpNaSAdRuIfCZOHGiyeis41IloFyI8uXL08aNG6ly5cpSirZO2rNnD7Vv396W15YtW6hr165S66gClC/etm1b2rp1K8GLBQ7QmTNnUqlSpZJt7Pv37/T27Vt69+4dXb9+nc6dO0dv3rxJNi5Tpky0YMECGjhwoJSyjZNatWpFBw8eZI/g7rGHb9++sb+bNm1KR44ckVrDCmg0mTlzeIqPHz/SgwcPmNynTp0ia8m9U6dOtH379uABev78eapdu7ajoiDQ2bNnac6cObR///5kAk6ePJkmTZrkyCfagCdPnlCxYsXo79+/bEivXr2YUmG1ILj2+/fvszFeyQqoW5n5Onfv3mVu9uTJk6al7byG7y7Xq3CQ6MSJE9S9e3d69eqVScDNmzdTt27dvOqbjcfHMHXqVDEXQH769Il69uwpno0fP56mTZvmmX9KAcWCP3/+ZF7i9OnTYv2yZcvSrVu3TPtJlYBCgufPn1P9+vWZ1XDKli0b3blzh/LmzetJ6XBxsLynT5+yeYguX758yZSYJ08e+vHjB3tesGBBevToEaVNm9YTfxWAYsGbN29SpUqVTGvDekuWLCmepVpAIUFCQgLVqVOHvn79KgQaNGgQLVmyxJPC9+3bRwg0OA0YMICWL1/O/uzSpYvprMJYRNdeSBWgWBOBoNEq165dS7179w4HoJBixowZBFfICfkbLA1W5pbatGnDzmVOOKuQGoHwHO85AXh+rrrlrxJQ6weGmGLEiBHhAfT9+/csd0QAw2ndunUsqHFDAB/uFm4XBPcFt83zWzwvXLgwvXjxgr1HYv/48WPKnz+/G/ZsjEpA+/fvT6tWrRJroxBiPPtTtcvlUvXt25fgejj16NGDNmzY4ErhU6ZMIUTInGDxY8eONc0dPXo0zZ49WzxD2jFmzBhX/FUDinRl586dYu2FCxfSkCFDwmOhkARfLL5cTshrYWVOhBSlePHizOJACHYQ9CD4MRJ4lS5dWjwqUaIEIRhxW6VSaaHwIPfu3RN72bFjB3Xs2DFcgCJIQLDACW4RRQGnaPTAgQOmAKdly5aisGD9GBBRnzlzRjw+duwYq6+6IVWAXr16lapXry6WTJMmDb1+/ZrVuzmFwuWiooR6q5GQ1jidc+3ataO9e/eKaai8wKXZ0erVq6lfv37iFfLgTZs2ucFTyRmKFKpJkyamj8ru8iQUgMJ1wiqN5TG4SbuSIkcAgBcpUkQEQ04F+C9fvrAPBMUGEOqo4GG0jmjoptRCcSTgY4JXEJYYidClS5eoRo0apmVDASgkQk2XFwDw9+3bt03nnlXZuCJDhMhp6NChrCYci5Cfrly5UgyxBiRuAZ03b17MveHDxIcDIFHuxBXm79+/TewR2Rr3HyqXC2HTp09vEhjXXQUKFLDVMSwagc3Dhw/FexQpKlasGBNQFMpxH8upQoUKrHrjRKpvW5B3Iv+0o1BYKMCzXnp//vyZUGSwI3zxCIA41axZk7kvN1SuXDlKTEwUQ93UolUBikh77ty5pkKHdc+hAPT48eMsYOCEsw7nWzRCmL9r1y7xGldvbov6a9asMeW8SJfQGBCLZADlHRtIoerWrUstWrRgH6FTqhQKQHEDgpt8TgD36NGjtjpG0R2VH+uZ5MY67cbAC6CKlDVr1qgsUhoUedlbKADFferFixeF3Ah4xo0bZ6sHVHmivfOiOOPYZcuWxWwL0YB60KzdlRIS8KpVqybjgugRlRbjlZuHpaIOdTqDNaAetGw9D6tVq0ZXrlyx5XD48GFCMs4JRX20eTidS1ZmSPIRQaOgwenGjRvJ7ir5Ow2oS0B3795NHTp0MI1ev369qcvA+LJz586E2icnFOaNZ6/LZdkw5K2LFi0SUwYPHkyLFy+2ZaEBdaFZuFXUUj98+CBGo3/1woULthaHdhUEQ79+/WLjUQeFdaJaJENWV4+mMkTWKHBYSQPqoGFcMPfp08cEZubMmQk5obVFg7OaNWuW6cpLRRM5zs7Lly+L3eLKDld3GlAXXX9Q0rVr11iHgtFtcmtDoTxa3yyCIdR1jddO6GvF7X9KaOnSpRQfHy9YNGzYkDWwBRZQXEnhrJAlJN3WgMNLjypqs+jLxfUYFIX6rJXQzY4OhViFAeSkzZo1E1Px0wq4R9lOeM4I7h5FDN67i+d2lwKBcbmyQPJ5OK+sv8WQqZpE2wfKcOhUsN44WMfDcrdt2yYeuynEu5UdrS7G7ohRo0YR3LuRNKAO2kSXAQrU8ABOVoYLYCgUqQYnBDQorKsgeI5GjRoJVvny5WNNasYPWQP6n3rgrlFSw51jmTJlCDkmWihRGXKbO6KYPXLkSKFwRMLGqlJKQbU7n9HzY0ynfAM0pcLp+f5rQP/g138MlO5AA6pUnf4z04D6j4HSHWhAlarTf2YaUP8xULoDDahSdfrPTAPqPwZKd6ABVapO/5lpQP3HQOkONKBK1ek/Mw2o/xgo3YG6/4ZL6bY0M1kNaEBlNRfQeRrQgAIjuy0NqKzmAjpPAxpQYGS3pQGV1VxA52lAAwqM7LY0oLKaC+g8DWhAgZHdlgZUVnMBnacBDSgwstv6B7Iqwbui8BEvAAAAAElFTkSuQmCC"/></switch></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-82"><g><rect x="72.5" y="589" width="85" height="20" fill="none" stroke="none" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 89px; height: 1px; padding-top: 599px; margin-left: 71px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">data-db</div></div></div></foreignObject><image x="71" y="592.5" width="89" height="17" xlink:href="data:image/png;base64,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"/></switch></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-83"><g><path d="M 82.5 428.63 L 82.5 393" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: rgb(0, 0, 0);"/><path d="M 82.5 433.88 L 79 426.88 L 82.5 428.63 L 86 426.88 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-84"><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 411px; margin-left: 83px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; background-color: #ffffff; "><div style="display: inline-block; font-size: 11px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; ">AMQP</div></div></div></foreignObject><image x="67" y="405" width="32" height="15.75" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIAAAAA/CAYAAAAoosBrAAAAAXNSR0IArs4c6QAADUhJREFUeF7tnHeQFEUUxh+ISDKAKEEBQTIUKskIAorIkXMSYwkKJhRFECQYMICgIjkntQo9wJKoYI6FoIgKCIogJgwlBlDgrF9X9VRvb5ievbkT7ub9dbfb3dP9+usXvtezBbKysrIkknyrgQIRAPLt3quFRwDI3/sfASCf738EgAgAURCYrzEQxQD5evujIDCfb38EgAgAQXmAJk2ayFtvvRWjuOXLl0u7du3SUuaXX34p1apVi+s7ceJEuf3229Ma0+y0detWqVmzZtw4L730krRt2zat8T/++GNZuXKlfPDBB7J9+3b59ttv5c8//xTCqRNPPFFKly6tnnnuuedK69atpXHjxlKwYMHAz0qmm1QDFShQQE466SQpWbKkVK1aVc4//3y1zgsuuCBht0AxwOeffy61a9eOG4jNBwTpSLJForyNGzemM2RMn2HDhsnYsWOzDYDDhw/LvHnz5IknnpAtW7YEmlfFihUVmPv37y/Fixd37psOAJINXr9+fXnyySflkksuiWkSCACDBg0STqYtxx13nHzzzTdSvnx558XphqkWuWnTJjnnnHMCj6k7cCLPOussNTdbgliAzZs3y1VXXSWffPJJ2nOhY6VKlWTatGnSqlUrp3HCBAAPxAqNGTNG7rvvPu/5zgA4ePCgnHHGGfLzzz+rzmz23r17vYEefPDBmIGdVigi9iKZ5JEjR1T3O+64QyZMmOA6VFy7devWyWWXXaY+N8flf1cALFu2THr16iV///133PiY+ubNmyuQnXbaaXL88cfLjz/+qPTy+uuvy9dffx3XBxP92GOPyeDBg33XZeuG8RcvXpyy3z///CO//fabYK1Z/2effRbX/qmnnpJbb71Vfe4MgEWLFqlToGX69OmCed23b5/6qEqVKmozWWAQsRfZqFEj+fDDD9UQKBX/ysLTkWuvvVaZbaRevXoxJ9gFAOvXr5eWLVsK5t8UNn306NFy8cUXp/TtKJ+D8dxzz6n4wBRAcPfdd6dclq2bE044QQ4cOBBIFWvXrpUbb7xRdu3a5fUrUqSIEBvhmpwBcOmll8obb7yhBilUqJB8//33cu+998rMmTO9gV955RXvxLnO0l4koHr44Ye97kuXLpUOHTq4Due1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"/></switch></g></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-85"><g><rect x="50" y="435" width="130" height="40" rx="6" ry="6" fill="#ffffff" stroke="#000000" pointer-events="all" style="fill: rgb(255, 255, 255); stroke: rgb(0, 0, 0);"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 128px; height: 1px; padding-top: 455px; margin-left: 51px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; font-weight: bold; white-space: normal; word-wrap: normal; ">Data Service</div></div></div></foreignObject><image x="51" y="448.5" width="128" height="17" xlink:href="data:image/png;base64,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"/></switch></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-86"><g><path d="M 115 481.37 L 115 500.03 L 114.63 518.63" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: rgb(0, 0, 0);"/><path d="M 115 476.12 L 118.5 483.12 L 115 481.37 L 111.5 483.12 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/><path d="M 114.52 523.88 L 111.16 516.81 L 114.63 518.63 L 118.16 516.95 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-87"><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 498px; margin-left: 115px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; background-color: #ffffff; "><div style="display: inline-block; font-size: 11px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; ">JDBC</div></div></div></foreignObject><image x="100.5" y="492" width="29" height="15.75" xlink:href="data:image/png;base64,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"/></switch></g></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-88"><g><path d="M 186.37 373 L 233.63 373" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: rgb(0, 0, 0);"/><path d="M 181.12 373 L 188.12 369.5 L 186.37 373 L 188.12 376.5 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/><path d="M 238.88 373 L 231.88 376.5 L 233.63 373 L 231.88 369.5 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-89"><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 373px; margin-left: 210px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; background-color: #ffffff; "><div style="display: inline-block; font-size: 11px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; ">LDAP</div></div></div></foreignObject><image x="195.5" y="367" width="29" height="15.75" xlink:href="data:image/png;base64,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"/></switch></g></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-90"><g><path d="M 115 346.63 L 115 331 L 210.03 331 L 210.03 137 L 233.63 137" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: rgb(0, 0, 0);"/><path d="M 115 351.88 L 111.5 344.88 L 115 346.63 L 118.5 344.88 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/><path d="M 238.88 137 L 231.88 140.5 L 233.63 137 L 231.88 133.5 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-91"><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 331px; margin-left: 190px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; background-color: #ffffff; "><div style="display: inline-block; font-size: 11px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; "><div>AMQP,<br />MQTT</div></div></div></div></foreignObject><image x="173" y="318.5" width="34" height="28.75" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIgAAABzCAYAAABD70qIAAAAAXNSR0IArs4c6QAAFVpJREFUeF7tnQW0XTXThnNxp7gVd3cv7sXdXYsXd3coUqC4Fddixd0pXgoUdy9eoEDhfv+Tv3PWnNwtyd776sms9a2P3rMje/LuZPLOZNLU3NzcbKJEDaRooCkCJGIjSwMRIBEfmRqIAIkAiQCJGCiugTiDFNddQ5SMAGmIYS7+khEgxXXXECUjQBpimIu/ZDBAlltuOfPMM8/UtXj33Xebddddt1AvPvjgAzP77LO3KHvuueea/fbbr1CdutC7775r5pprrhb13HPPPWadddYpVP8bb7xh7r//fjNo0CDz/vvvmy+//NL8/vvvBs5xwgknNJNPPrltc6GFFjJrrbWWWWKJJcxoo40W3FaabjJ5i6YmM9FEE5lJJpnEzDbbbGbJJZe077nUUksFt0+BIIC88847Zp555mnREOAAJEUkTQko97XXXitSZV2ZI444wpx66qmlAfLvv/+aa665xpx99tnmrbfeCurXDDPMYMG+++67m/HHH9+7bBGApFW+yCKLmPPOO8/06NHDu/1ggPTu3dvwZbsy+uijm88++8xMO+20QY3zcJYSXn/9dbPgggsG1ykF+KJnmmkm2zdXQmaQN99802yzzTZm8ODBhftCwRlnnNFccsklZo011vCqp0qA0CCz2AknnGCOPPJIr/aDAPLXX3+Z6aabzvzwww+2csDw1Vdf1Ro66aSTghqWgq4SeIn//vvP/rz//vubc845x/tl3Acfe+wxs8oqq9g/63r5ty9A7rrrLrPllluaP//8s0U/WEpWWmklC8IpppjCjDnmmOa7776zennyySfNJ5980qJMU1OTOeOMM8xBBx2U+16ubqj/hhtuyCz3999/m59//tkw2/P+b7/9dovn+/bta/bZZ5/c9oMAcv3119uvSOTSSy81TN/Dhg2zf5plllnsbIACQsRVwuKLL25eeuklWwVKZ31HMUVkhx12sMsCssACC9TNAD4Aefzxx81qq61mWF60AIrjjz/eLLvsspm2BYPDh3PTTTdZ+0QLIDn44IMzX8vVzdhjj21GjBgRpIqHH37Y7LrrrubTTz+tlRtnnHEMthlLX5542yArrLCCeeqpp2x9Y4wxhvnmm2/MYYcdZi6//PJaG4888kjti81rWH53lQDoTjnllFrxO++806y//vq+1dWe++OPP8xUU01lhg8fbv/Wq1cvc9FFF9V+zwMIswDr9rffflsrwwBdddVVdkYJEYz6DTbYoDb7UpYZ7b777stcbqoACG0BDgxlZjcR9NGvX7/c1/ACiLsTwDLn5R566KG6F9x8883t1xIirhKY/q688kqD/YGg2AEDBoRUaZ+97rrrzLbbbmv/my8GcOy4447eAFl99dUNX58I4HjwwQcNH0oRQYcrrrii/bBEWJqYZcYdd9zEKqsCCJWff/75Zt9996210717d/P555/nvooXQA488EBrvYug/K233tpOvTQkL40SWRImm2yy3IblAVcJZ511luHrP+aYY+wjLC98zaz3IaIHeO211zabbbaZ2X777b0A8uKLL7bYFlax7X7ggQdMz54965abrKWmSoAwE04zzTR1bTOz5C0zuQDB6ME4FVtjggkmsNPueOONZ5WNsdWnT5+a4gESux1fcZXA8rLeeuuZ+eabr1ZF6OAAUl5cjN0rrrjC2kY77bSTF0A23HBDw9ImApfw/PPPB9tXSTrQdhG/s7P58MMPDTtBV6oECHVj08k48m94HGy+LMkFyI033mi22mqrWh0777xznd3BFDnvvPPWfocnCeEJXCUcd9xx5thjj7VEE9MyEsqJnH766dY+QsYaayw7w912221mt912ywXIr7/+aiaddNI6w5Rlk+WzCmHLjMGs5YknnkhcuqoGyKyzzmo++uijWtOPPvqoWXnllcsBBIudFxB59tlnzTLLLFNXKSwd07LIc889Z5ZeemkvfbpKOOqoo8yJJ55o9+sARSSEE2H2EZButNFG5vbbb7f8wx577JELEGwrliQRGElmzKI7qSQloJsXXnih9tOhhx5qTjvttFafQVj6f/zxxyCdZs4g0Mhzzjlnbd3iv4cOHdriRdjywhKKYAxiaPqICxBIHLaGrI8zzzxzrW1fTuSVV14xiy22WK1peAyWrIsvvtjuZETSdjEMFnaBCDbDwIEDfV7F+xm3DQxf/RFKRVXOICy72IsiLLnff/99rr2YCRD26RiNIkzdhxxySAtFMC1jAGFcItDJX3/9tfVL5EkaQCjH9AcXgfhyIlDa7ITcMr4AwW+hAcFMdvTRR+e9RtDv2DfYOSJsx/XupjUAAuF4wAEH1Nr0XbZTAYJxCuJAGQL3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"/></switch></g></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-92"><g><rect x="50" y="353" width="130" height="40" rx="6" ry="6" fill="#e6e6e6" stroke="#000000" pointer-events="all" style="fill: rgb(230, 230, 230); stroke: rgb(0, 0, 0);"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 128px; height: 1px; padding-top: 373px; margin-left: 51px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "><b>Broker Service</b><div><i>rabbitmq</i></div></div></div></div></foreignObject><image x="51" y="359" width="128" height="32" xlink:href="data:image/png;base64,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"/></switch></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-96"><g><rect x="240" y="353" width="130" height="40" rx="6" ry="6" fill="#e6e6e6" stroke="#000000" pointer-events="all" style="fill: rgb(230, 230, 230); stroke: rgb(0, 0, 0);"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 128px; height: 1px; padding-top: 373px; margin-left: 241px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "><b>Identity Service</b><div><i>openldap</i></div></div></div></div></foreignObject><image x="241" y="359" width="128" height="32" xlink:href="data:image/png;base64,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"/></switch></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-99"><g><path d="M 462.5 435 L 462.49 421 L 308 421 C 308 417.1 302 417.1 302 421 L 302 421 L 147.51 421 L 147.51 428.63" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: rgb(0, 0, 0);"/><path d="M 147.5 433.88 L 144.01 426.88 L 147.51 428.63 L 151.01 426.89 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-100"><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 421px; margin-left: 245px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; background-color: #ffffff; "><div style="display: inline-block; font-size: 11px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; ">HTTP</div></div></div></foreignObject><image x="230.5" y="415" width="29" height="15.75" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHQAAAA/CAYAAAAxBeyIAAAAAXNSR0IArs4c6QAAA/xJREFUeF7tm78vNEEYx78rEoUG0VGJHxGJSIiIQuFHkKAglCRErVKQUChIUPgDRChPUIqCwu9EQSHRiEgkNKIhUQg5mXvf2/f23tubW7Nr5jbf7dzMPM8z388882uXFY1Go+ATGgUsAg0Ny1hHCDRcPAk0ZDwJlEDDpkDI+sM1lEBDpkDIusMMDTPQ1dVVjI+P213s7OzE3t6eUpeLi4vx8vJi27i6ukJdXZ399/7+Pjo6OpR8yBqPjIxgfX0dv+krMabS0lI8Pj7KwnSU5+fno6CgAKJtY2MjWltb0dPTg9zc3LR2HBlKoJ40T1k5PnhUgaYyLuDOzs46ki65HoGqM3RYCBJo3FFfXx82NzeRl5f3X/TagT49PWF3dzcjWaenp/H8/GzXnZqaQllZmbRtZWUlWlpa8Ju+0mXo/Pw8KioqXOP++vrC6+sr7u/vcXZ2hqOjIyRfuQ8MDGBra8s8oFIaCRXKy8txd3dn/3J+fo6mpiYvJjKu66ev5DXUa9y3t7exafbw8NARfyQSwdDQkOM37RmascIA/BRZ5tdPX6pARawfHx9ob2/H8fGxHXp1dTVubm4IVAZTlJsGVMR0fX2N2tpaR/gie0Ws8YcZ6kLXRKAi1JqaGkdWbmxsYHh4mEBlWWoq0MHBQcdmaHFxEZOTkwSarUDHxsawtrZmhz8zM4O5uTkCzVag4riys7Njh7+ysoKJiQkCzVagyUvB9vY2+vv7CTQbgV5eXqK+vt4OPScnJ3bRUlRUlBlQcZuRuIOSiZCqfGFhAe/v73ZR8uW8F5t+blRkfv305dc5tK2tDScnJ3boqV6epD22yDr9k3ICBbzeFD08PGB0dBQHBwf/MtGycHFxgYaGhswvFn4CTNaGQIHl5WVUVVW5SiXubd/e3iBAnp6exl5hfn5+OuqLna3Y4SY/zFANFwuyQS8rF+dOcf5M9fCmKIuAiqxeWlpCb2+vK3MCNRSoeNdZWFiIkpISNDc3o6urC93d3bAsK20CE6gGoF43RbIpOLGcQAnUy3gBZB+JebHm59lQ5tdPX36cQ2XxxsuZoczQTMfKn3rMUMQ+xUz8jJNr6N8x5Oc0KBuWfvoi0F+YBglUpoBLOadcTrmuQ8fPaVA2Pv30xSmXU65svPHqz6tCzFCuoa5jRtuU63UUs755CvAffs1johQRgSrJZ15jAjWPiVJEBKokn3mNCdQ8JkoREaiSfOY1JlDzmChFRKBK8pnXmEDNY6IUEYEqyWdeYwI1j4lSROm/2lUyzcY6FCBQHaoH6JNAAxRXh2kC1aF6gD4JNEBxdZgmUB2qB+iTQAMUV4dpAtWheoA+CTRAcXWYJlAdqgfok0ADFFeH6W97Qt2suZ3FFgAAAABJRU5ErkJggg=="/></switch></g></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-101"><g><rect x="430" y="435" width="130" height="40" rx="6" ry="6" fill="#ffffff" stroke="#000000" pointer-events="all" style="fill: rgb(255, 255, 255); stroke: rgb(0, 0, 0);"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 128px; height: 1px; padding-top: 455px; margin-left: 431px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; font-weight: bold; white-space: normal; word-wrap: normal; ">Metadata Service</div></div></div></foreignObject><image x="431" y="448.5" width="128" height="17" xlink:href="data:image/png;base64,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"/></switch></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-102"><g><path d="M 376.37 465 L 423.63 465" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: rgb(0, 0, 0);"/><path d="M 371.12 465 L 378.12 461.5 L 376.37 465 L 378.12 468.5 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/><path d="M 428.88 465 L 421.88 468.5 L 423.63 465 L 421.88 461.5 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-103"><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 465px; margin-left: 400px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; background-color: #ffffff; "><div style="display: inline-block; font-size: 11px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; ">HTTP</div></div></div></foreignObject><image x="385.5" y="459" width="29" height="15.75" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHQAAAA/CAYAAAAxBeyIAAAAAXNSR0IArs4c6QAAA/xJREFUeF7tm78vNEEYx78rEoUG0VGJHxGJSIiIQuFHkKAglCRErVKQUChIUPgDRChPUIqCwu9EQSHRiEgkNKIhUQg5mXvf2/f23tubW7Nr5jbf7dzMPM8z388882uXFY1Go+ATGgUsAg0Ny1hHCDRcPAk0ZDwJlEDDpkDI+sM1lEBDpkDIusMMDTPQ1dVVjI+P213s7OzE3t6eUpeLi4vx8vJi27i6ukJdXZ399/7+Pjo6OpR8yBqPjIxgfX0dv+krMabS0lI8Pj7KwnSU5+fno6CgAKJtY2MjWltb0dPTg9zc3LR2HBlKoJ40T1k5PnhUgaYyLuDOzs46ki65HoGqM3RYCBJo3FFfXx82NzeRl5f3X/TagT49PWF3dzcjWaenp/H8/GzXnZqaQllZmbRtZWUlWlpa8Ju+0mXo/Pw8KioqXOP++vrC6+sr7u/vcXZ2hqOjIyRfuQ8MDGBra8s8oFIaCRXKy8txd3dn/3J+fo6mpiYvJjKu66ev5DXUa9y3t7exafbw8NARfyQSwdDQkOM37RmascIA/BRZ5tdPX6pARawfHx9ob2/H8fGxHXp1dTVubm4IVAZTlJsGVMR0fX2N2tpaR/gie0Ws8YcZ6kLXRKAi1JqaGkdWbmxsYHh4mEBlWWoq0MHBQcdmaHFxEZOTkwSarUDHxsawtrZmhz8zM4O5uTkCzVag4riys7Njh7+ysoKJiQkCzVagyUvB9vY2+vv7CTQbgV5eXqK+vt4OPScnJ3bRUlRUlBlQcZuRuIOSiZCqfGFhAe/v73ZR8uW8F5t+blRkfv305dc5tK2tDScnJ3boqV6epD22yDr9k3ICBbzeFD08PGB0dBQHBwf/MtGycHFxgYaGhswvFn4CTNaGQIHl5WVUVVW5SiXubd/e3iBAnp6exl5hfn5+OuqLna3Y4SY/zFANFwuyQS8rF+dOcf5M9fCmKIuAiqxeWlpCb2+vK3MCNRSoeNdZWFiIkpISNDc3o6urC93d3bAsK20CE6gGoF43RbIpOLGcQAnUy3gBZB+JebHm59lQ5tdPX36cQ2XxxsuZoczQTMfKn3rMUMQ+xUz8jJNr6N8x5Oc0KBuWfvoi0F+YBglUpoBLOadcTrmuQ8fPaVA2Pv30xSmXU65svPHqz6tCzFCuoa5jRtuU63UUs755CvAffs1johQRgSrJZ15jAjWPiVJEBKokn3mNCdQ8JkoREaiSfOY1JlDzmChFRKBK8pnXmEDNY6IUEYEqyWdeYwI1j4lSROm/2lUyzcY6FCBQHaoH6JNAAxRXh2kC1aF6gD4JNEBxdZgmUB2qB+iTQAMUV4dpAtWheoA+CTRAcXWYJlAdqgfok0ADFFeH6W97Qt2suZ3FFgAAAABJRU5ErkJggg=="/></switch></g></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-106"><g><path d="M 470 195.6 C 470 190.85 481.19 187 495 187 C 501.63 187 507.99 187.91 512.68 189.52 C 517.37 191.13 520 193.32 520 195.6 L 520 242.4 C 520 247.15 508.81 251 495 251 C 481.19 251 470 247.15 470 242.4 Z" fill="#e6e6e6" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(230, 230, 230); stroke: rgb(0, 0, 0);"/><path d="M 520 195.6 C 520 200.35 508.81 204.2 495 204.2 C 481.19 204.2 470 200.35 470 195.6" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="stroke: rgb(0, 0, 0);"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 48px; height: 1px; padding-top: 226px; margin-left: 471px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "><i>mariadb</i></div></div></div></foreignObject><image x="471" y="219.5" width="48" height="17" xlink:href="data:image/png;base64,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"/></switch></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-107"><g><rect x="452.5" y="251.5" width="85" height="17" fill="none" stroke="none" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 89px; height: 1px; padding-top: 260px; margin-left: 451px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">search-db</div></div></div></foreignObject><image x="451" y="253.5" width="89" height="17" xlink:href="data:image/png;base64,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"/></switch></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-111"><g><path d="M 280 523.6 C 280 518.85 291.19 515 305 515 C 311.63 515 317.99 515.91 322.68 517.52 C 327.37 519.13 330 521.32 330 523.6 L 330 570.4 C 330 575.15 318.81 579 305 579 C 291.19 579 280 575.15 280 570.4 Z" fill="#e6e6e6" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(230, 230, 230); stroke: rgb(0, 0, 0);"/><path d="M 330 523.6 C 330 528.35 318.81 532.2 305 532.2 C 291.19 532.2 280 528.35 280 523.6" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="stroke: rgb(0, 0, 0);"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 48px; height: 1px; padding-top: 554px; margin-left: 281px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; font-style: italic; white-space: normal; word-wrap: normal; ">psql</div></div></div></foreignObject><image x="281" y="547.5" width="48" height="17" xlink:href="data:image/png;base64,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"/></switch></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-112"><g><rect x="262.5" y="579" width="85" height="20" fill="none" stroke="none" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 89px; height: 1px; padding-top: 589px; margin-left: 261px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">auth-db</div></div></div></foreignObject><image x="261" y="582.5" width="89" height="17" xlink:href="data:image/png;base64,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"/></switch></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-115"><g><path d="M 376.37 117 L 423.63 117" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: rgb(0, 0, 0);"/><path d="M 371.12 117 L 378.12 113.5 L 376.37 117 L 378.12 120.5 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/><path d="M 428.88 117 L 421.88 120.5 L 423.63 117 L 421.88 113.5 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 117px; margin-left: 400px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; background-color: #ffffff; "><div style="display: inline-block; font-size: 11px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; ">HTTP</div></div></div></foreignObject><image x="385.5" y="111" width="29" height="15.75" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHQAAAA/CAYAAAAxBeyIAAAAAXNSR0IArs4c6QAAA/xJREFUeF7tm78vNEEYx78rEoUG0VGJHxGJSIiIQuFHkKAglCRErVKQUChIUPgDRChPUIqCwu9EQSHRiEgkNKIhUQg5mXvf2/f23tubW7Nr5jbf7dzMPM8z388882uXFY1Go+ATGgUsAg0Ny1hHCDRcPAk0ZDwJlEDDpkDI+sM1lEBDpkDIusMMDTPQ1dVVjI+P213s7OzE3t6eUpeLi4vx8vJi27i6ukJdXZ399/7+Pjo6OpR8yBqPjIxgfX0dv+krMabS0lI8Pj7KwnSU5+fno6CgAKJtY2MjWltb0dPTg9zc3LR2HBlKoJ40T1k5PnhUgaYyLuDOzs46ki65HoGqM3RYCBJo3FFfXx82NzeRl5f3X/TagT49PWF3dzcjWaenp/H8/GzXnZqaQllZmbRtZWUlWlpa8Ju+0mXo/Pw8KioqXOP++vrC6+sr7u/vcXZ2hqOjIyRfuQ8MDGBra8s8oFIaCRXKy8txd3dn/3J+fo6mpiYvJjKu66ev5DXUa9y3t7exafbw8NARfyQSwdDQkOM37RmascIA/BRZ5tdPX6pARawfHx9ob2/H8fGxHXp1dTVubm4IVAZTlJsGVMR0fX2N2tpaR/gie0Ws8YcZ6kLXRKAi1JqaGkdWbmxsYHh4mEBlWWoq0MHBQcdmaHFxEZOTkwSarUDHxsawtrZmhz8zM4O5uTkCzVag4riys7Njh7+ysoKJiQkCzVagyUvB9vY2+vv7CTQbgV5eXqK+vt4OPScnJ3bRUlRUlBlQcZuRuIOSiZCqfGFhAe/v73ZR8uW8F5t+blRkfv305dc5tK2tDScnJ3boqV6epD22yDr9k3ICBbzeFD08PGB0dBQHBwf/MtGycHFxgYaGhswvFn4CTNaGQIHl5WVUVVW5SiXubd/e3iBAnp6exl5hfn5+OuqLna3Y4SY/zFANFwuyQS8rF+dOcf5M9fCmKIuAiqxeWlpCb2+vK3MCNRSoeNdZWFiIkpISNDc3o6urC93d3bAsK20CE6gGoF43RbIpOLGcQAnUy3gBZB+JebHm59lQ5tdPX36cQ2XxxsuZoczQTMfKn3rMUMQ+xUz8jJNr6N8x5Oc0KBuWfvoi0F+YBglUpoBLOadcTrmuQ8fPaVA2Pv30xSmXU65svPHqz6tCzFCuoa5jRtuU63UUs755CvAffs1johQRgSrJZ15jAjWPiVJEBKokn3mNCdQ8JkoREaiSfOY1JlDzmChFRKBK8pnXmEDNY6IUEYEqyWdeYwI1j4lSROm/2lUyzcY6FCBQHaoH6JNAAxRXh2kC1aF6gD4JNEBxdZgmUB2qB+iTQAMUV4dpAtWheoA+CTRAcXWYJlAdqgfok0ADFFeH6W97Qt2suZ3FFgAAAABJRU5ErkJggg=="/></switch></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-117"><g><path d="M 233.63 127 L 200.03 127 L 200.03 291 L 186.37 291" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: rgb(0, 0, 0);"/><path d="M 238.88 127 L 231.88 130.5 L 233.63 127 L 231.88 123.5 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/><path d="M 181.12 291 L 188.12 287.5 L 186.37 291 L 188.12 294.5 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-118"><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 242px; margin-left: 190px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; background-color: #ffffff; "><div style="display: inline-block; font-size: 11px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; ">HTTP</div></div></div></foreignObject><image x="175.5" y="236" width="29" height="15.75" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHQAAAA/CAYAAAAxBeyIAAAAAXNSR0IArs4c6QAAA/xJREFUeF7tm78vNEEYx78rEoUG0VGJHxGJSIiIQuFHkKAglCRErVKQUChIUPgDRChPUIqCwu9EQSHRiEgkNKIhUQg5mXvf2/f23tubW7Nr5jbf7dzMPM8z388882uXFY1Go+ATGgUsAg0Ny1hHCDRcPAk0ZDwJlEDDpkDI+sM1lEBDpkDIusMMDTPQ1dVVjI+P213s7OzE3t6eUpeLi4vx8vJi27i6ukJdXZ399/7+Pjo6OpR8yBqPjIxgfX0dv+krMabS0lI8Pj7KwnSU5+fno6CgAKJtY2MjWltb0dPTg9zc3LR2HBlKoJ40T1k5PnhUgaYyLuDOzs46ki65HoGqM3RYCBJo3FFfXx82NzeRl5f3X/TagT49PWF3dzcjWaenp/H8/GzXnZqaQllZmbRtZWUlWlpa8Ju+0mXo/Pw8KioqXOP++vrC6+sr7u/vcXZ2hqOjIyRfuQ8MDGBra8s8oFIaCRXKy8txd3dn/3J+fo6mpiYvJjKu66ev5DXUa9y3t7exafbw8NARfyQSwdDQkOM37RmascIA/BRZ5tdPX6pARawfHx9ob2/H8fGxHXp1dTVubm4IVAZTlJsGVMR0fX2N2tpaR/gie0Ws8YcZ6kLXRKAi1JqaGkdWbmxsYHh4mEBlWWoq0MHBQcdmaHFxEZOTkwSarUDHxsawtrZmhz8zM4O5uTkCzVag4riys7Njh7+ysoKJiQkCzVagyUvB9vY2+vv7CTQbgV5eXqK+vt4OPScnJ3bRUlRUlBlQcZuRuIOSiZCqfGFhAe/v73ZR8uW8F5t+blRkfv305dc5tK2tDScnJ3boqV6epD22yDr9k3ICBbzeFD08PGB0dBQHBwf/MtGycHFxgYaGhswvFn4CTNaGQIHl5WVUVVW5SiXubd/e3iBAnp6exl5hfn5+OuqLna3Y4SY/zFANFwuyQS8rF+dOcf5M9fCmKIuAiqxeWlpCb2+vK3MCNRSoeNdZWFiIkpISNDc3o6urC93d3bAsK20CE6gGoF43RbIpOLGcQAnUy3gBZB+JebHm59lQ5tdPX36cQ2XxxsuZoczQTMfKn3rMUMQ+xUz8jJNr6N8x5Oc0KBuWfvoi0F+YBglUpoBLOadcTrmuQ8fPaVA2Pv30xSmXU65svPHqz6tCzFCuoa5jRtuU63UUs755CvAffs1johQRgSrJZ15jAjWPiVJEBKokn3mNCdQ8JkoREaiSfOY1JlDzmChFRKBK8pnXmEDNY6IUEYEqyWdeYwI1j4lSROm/2lUyzcY6FCBQHaoH6JNAAxRXh2kC1aF6gD4JNEBxdZgmUB2qB+iTQAMUV4dpAtWheoA+CTRAcXWYJlAdqgfok0ADFFeH6W97Qt2suZ3FFgAAAABJRU5ErkJggg=="/></switch></g></g></g></g><g data-cell-id="uDJ2bVtIrgoZBCZFZmDG-13"><g><path d="M 305 147 L 305 182.63" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: rgb(0, 0, 0);"/><path d="M 305 187.88 L 301.5 180.88 L 305 182.63 L 308.5 180.88 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-119"><g><rect x="240" y="107" width="130" height="40" rx="6" ry="6" fill="#e6e6e6" stroke="#000000" pointer-events="all" style="fill: rgb(230, 230, 230); stroke: rgb(0, 0, 0);"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 128px; height: 1px; padding-top: 127px; margin-left: 241px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "><b>Gateway Service</b><div><i>nginx</i></div></div></div></div></foreignObject><image x="241" y="113" width="128" height="32" xlink:href="data:image/png;base64,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"/></switch></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-121"><g><path d="M 115 264.63 L 115 250.03 L 114.65 235.37" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: rgb(0, 0, 0);"/><path d="M 115 269.88 L 111.5 262.88 L 115 264.63 L 118.5 262.88 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/><path d="M 114.53 230.12 L 118.19 237.03 L 114.65 235.37 L 111.19 237.2 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-122"><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 251px; margin-left: 115px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; background-color: #ffffff; "><div style="display: inline-block; font-size: 11px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; ">S3</div></div></div></foreignObject><image x="108.5" y="245" width="13" height="15.75" xlink:href="data:image/png;base64,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"/></switch></g></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-123"><g><rect x="50" y="271" width="130" height="40" rx="6" ry="6" fill="#ffffff" stroke="#000000" pointer-events="all" style="fill: rgb(255, 255, 255); stroke: rgb(0, 0, 0);"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 128px; height: 1px; padding-top: 291px; margin-left: 51px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; font-weight: bold; white-space: normal; word-wrap: normal; ">Analyse Service</div></div></div></foreignObject><image x="51" y="284.5" width="128" height="17" xlink:href="data:image/png;base64,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"/></switch></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-125"><g><path d="M 495 153.37 L 495 180.63" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: rgb(0, 0, 0);"/><path d="M 495 148.12 L 498.5 155.12 L 495 153.37 L 491.5 155.12 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/><path d="M 495 185.88 L 491.5 178.88 L 495 180.63 L 498.5 178.88 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-126"><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 167px; margin-left: 496px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; background-color: #ffffff; "><div style="display: inline-block; font-size: 11px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; ">HTTP</div></div></div></foreignObject><image x="481.5" y="161" width="29" height="15.75" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHQAAAA/CAYAAAAxBeyIAAAAAXNSR0IArs4c6QAAA/xJREFUeF7tm78vNEEYx78rEoUG0VGJHxGJSIiIQuFHkKAglCRErVKQUChIUPgDRChPUIqCwu9EQSHRiEgkNKIhUQg5mXvf2/f23tubW7Nr5jbf7dzMPM8z388882uXFY1Go+ATGgUsAg0Ny1hHCDRcPAk0ZDwJlEDDpkDI+sM1lEBDpkDIusMMDTPQ1dVVjI+P213s7OzE3t6eUpeLi4vx8vJi27i6ukJdXZ399/7+Pjo6OpR8yBqPjIxgfX0dv+krMabS0lI8Pj7KwnSU5+fno6CgAKJtY2MjWltb0dPTg9zc3LR2HBlKoJ40T1k5PnhUgaYyLuDOzs46ki65HoGqM3RYCBJo3FFfXx82NzeRl5f3X/TagT49PWF3dzcjWaenp/H8/GzXnZqaQllZmbRtZWUlWlpa8Ju+0mXo/Pw8KioqXOP++vrC6+sr7u/vcXZ2hqOjIyRfuQ8MDGBra8s8oFIaCRXKy8txd3dn/3J+fo6mpiYvJjKu66ev5DXUa9y3t7exafbw8NARfyQSwdDQkOM37RmascIA/BRZ5tdPX6pARawfHx9ob2/H8fGxHXp1dTVubm4IVAZTlJsGVMR0fX2N2tpaR/gie0Ws8YcZ6kLXRKAi1JqaGkdWbmxsYHh4mEBlWWoq0MHBQcdmaHFxEZOTkwSarUDHxsawtrZmhz8zM4O5uTkCzVag4riys7Njh7+ysoKJiQkCzVagyUvB9vY2+vv7CTQbgV5eXqK+vt4OPScnJ3bRUlRUlBlQcZuRuIOSiZCqfGFhAe/v73ZR8uW8F5t+blRkfv305dc5tK2tDScnJ3boqV6epD22yDr9k3ICBbzeFD08PGB0dBQHBwf/MtGycHFxgYaGhswvFn4CTNaGQIHl5WVUVVW5SiXubd/e3iBAnp6exl5hfn5+OuqLna3Y4SY/zFANFwuyQS8rF+dOcf5M9fCmKIuAiqxeWlpCb2+vK3MCNRSoeNdZWFiIkpISNDc3o6urC93d3bAsK20CE6gGoF43RbIpOLGcQAnUy3gBZB+JebHm59lQ5tdPX36cQ2XxxsuZoczQTMfKn3rMUMQ+xUz8jJNr6N8x5Oc0KBuWfvoi0F+YBglUpoBLOadcTrmuQ8fPaVA2Pv30xSmXU65svPHqz6tCzFCuoa5jRtuU63UUs755CvAffs1johQRgSrJZ15jAjWPiVJEBKokn3mNCdQ8JkoREaiSfOY1JlDzmChFRKBK8pnXmEDNY6IUEYEqyWdeYwI1j4lSROm/2lUyzcY6FCBQHaoH6JNAAxRXh2kC1aF6gD4JNEBxdZgmUB2qB+iTQAMUV4dpAtWheoA+CTRAcXWYJlAdqgfok0ADFFeH6W97Qt2suZ3FFgAAAABJRU5ErkJggg=="/></switch></g></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-127"><g><path d="M 276.37 41 L 305 41 L 305 100.63" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: rgb(0, 0, 0);"/><path d="M 271.12 41 L 278.12 37.5 L 276.37 41 L 278.12 44.5 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/><path d="M 305 105.88 L 301.5 98.88 L 305 100.63 L 308.5 98.88 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-128"><g><ellipse cx="255" cy="7.5" rx="7.5" ry="7.5" fill="#ffffff" stroke="#000000" pointer-events="all" style="fill: rgb(255, 255, 255); stroke: rgb(0, 0, 0);"/><path d="M 255 15 L 255 40 M 255 20 L 240 20 M 255 20 L 270 20 M 255 40 L 240 60 M 255 40 L 270 60" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="stroke: rgb(0, 0, 0);"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe flex-start; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 67px; margin-left: 255px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; white-space: nowrap; ">Researcher</div></div></div></foreignObject><image x="224" y="67.5" width="62" height="17" xlink:href="data:image/png;base64,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"/></switch></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-129"><g><ellipse cx="225" cy="524.5" rx="7.5" ry="7.5" fill="#ffffff" stroke="#000000" pointer-events="all" style="fill: rgb(255, 255, 255); stroke: rgb(0, 0, 0);"/><path d="M 225 532 L 225 557 M 225 537 L 210 537 M 225 537 L 240 537 M 225 557 L 210 577 M 225 557 L 240 577" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="stroke: rgb(0, 0, 0);"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe flex-start; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 584px; margin-left: 225px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; white-space: nowrap; ">Database<div>Engineer</div></div></div></div></foreignObject><image x="199.5" y="584.5" width="51" height="32" xlink:href="data:image/png;base64,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"/></switch></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-133"><g><path d="M 305 481.37 L 305 508.63" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: rgb(0, 0, 0);"/><path d="M 305 476.12 L 308.5 483.12 L 305 481.37 L 301.5 483.12 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/><path d="M 305 513.88 L 301.5 506.88 L 305 508.63 L 308.5 506.88 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 495px; margin-left: 305px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; background-color: #ffffff; "><div style="display: inline-block; font-size: 11px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; ">JDBC</div></div></div></foreignObject><image x="290.5" y="489" width="29" height="15.75" xlink:href="data:image/png;base64,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"/></switch></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-134"><g><ellipse cx="385" cy="524.5" rx="7.5" ry="7.5" fill="#ffffff" stroke="#000000" pointer-events="all" style="fill: rgb(255, 255, 255); stroke: rgb(0, 0, 0);"/><path d="M 385 532 L 385 557 M 385 537 L 370 537 M 385 537 L 400 537 M 385 557 L 370 577 M 385 557 L 400 577" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="stroke: rgb(0, 0, 0);"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe flex-start; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 584px; margin-left: 385px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; white-space: nowrap; ">System<div>Engineer</div></div></div></div></foreignObject><image x="361" y="584.5" width="48" height="32" xlink:href="data:image/png;base64,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"/></switch></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-135"><g><path d="M 59.5 523.6 C 59.5 518.85 70.69 515 84.5 515 C 91.13 515 97.49 515.91 102.18 517.52 C 106.87 519.13 109.5 521.32 109.5 523.6 L 109.5 570.4 C 109.5 575.15 98.31 579 84.5 579 C 70.69 579 59.5 575.15 59.5 570.4 Z" fill="#e6e6e6" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(230, 230, 230); stroke: rgb(0, 0, 0);"/><path d="M 109.5 523.6 C 109.5 528.35 98.31 532.2 84.5 532.2 C 70.69 532.2 59.5 528.35 59.5 523.6" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="stroke: rgb(0, 0, 0);"/></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-136"><g><path d="M 119.5 523.6 C 119.5 518.85 130.69 515 144.5 515 C 151.13 515 157.49 515.91 162.18 517.52 C 166.87 519.13 169.5 521.32 169.5 523.6 L 169.5 570.4 C 169.5 575.15 158.31 579 144.5 579 C 130.69 579 119.5 575.15 119.5 570.4 Z" fill="#e6e6e6" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(230, 230, 230); stroke: rgb(0, 0, 0);"/><path d="M 169.5 523.6 C 169.5 528.35 158.31 532.2 144.5 532.2 C 130.69 532.2 119.5 528.35 119.5 523.6" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="stroke: rgb(0, 0, 0);"/></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-137"><g><path d="M 89.5 533.6 C 89.5 528.85 100.69 525 114.5 525 C 121.13 525 127.49 525.91 132.18 527.52 C 136.87 529.13 139.5 531.32 139.5 533.6 L 139.5 580.4 C 139.5 585.15 128.31 589 114.5 589 C 100.69 589 89.5 585.15 89.5 580.4 Z" fill="#e6e6e6" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(230, 230, 230); stroke: rgb(0, 0, 0);"/><path d="M 139.5 533.6 C 139.5 538.35 128.31 542.2 114.5 542.2 C 100.69 542.2 89.5 538.35 89.5 533.6" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="stroke: rgb(0, 0, 0);"/></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-138"><g><rect x="40" y="506" width="150" height="105" rx="6.3" ry="6.3" fill="none" stroke="#000000" stroke-dasharray="3 3" pointer-events="all" style="stroke: rgb(0, 0, 0);"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 148px; height: 1px; padding-top: 559px; margin-left: 41px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; font-style: italic; white-space: normal; word-wrap: normal; ">mariadb-galera</div></div></div></foreignObject><image x="41" y="552.5" width="148" height="17" xlink:href="data:image/png;base64,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"/></switch></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-139"><g><path d="M 210 547 L 196.4 547" fill="none" stroke="#000000" stroke-miterlimit="10" stroke-dasharray="3 3" pointer-events="stroke" style="stroke: rgb(0, 0, 0);"/><path d="M 191.15 547 L 198.15 543.5 L 196.4 547 L 198.15 550.5 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-140"><g><rect x="430" y="271" width="130" height="40" rx="6" ry="6" fill="#ffffff" stroke="#000000" pointer-events="all" style="fill: rgb(255, 255, 255); stroke: rgb(0, 0, 0);"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 128px; height: 1px; padding-top: 291px; margin-left: 431px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; font-weight: bold; white-space: normal; word-wrap: normal; ">User Interface</div></div></div></foreignObject><image x="431" y="284.5" width="128" height="17" xlink:href="data:image/png;base64,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"/></switch></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-141"><g><path d="M 333.63 41 L 305 41 L 305 100.63" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: rgb(0, 0, 0);"/><path d="M 338.88 41 L 331.88 44.5 L 333.63 41 L 331.88 37.5 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/><path d="M 305 105.88 L 301.5 98.88 L 305 100.63 L 308.5 98.88 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-142"><g><ellipse cx="355" cy="7.5" rx="7.5" ry="7.5" fill="#ffffff" stroke="#000000" pointer-events="all" style="fill: rgb(255, 255, 255); stroke: rgb(0, 0, 0);"/><path d="M 355 15 L 355 40 M 355 20 L 340 20 M 355 20 L 370 20 M 355 40 L 340 60 M 355 40 L 370 60" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="stroke: rgb(0, 0, 0);"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe flex-start; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 67px; margin-left: 355px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; white-space: nowrap; ">Machine</div></div></div></foreignObject><image x="332.5" y="67.5" width="45" height="17" xlink:href="data:image/png;base64,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"/></switch></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-147"><g><path d="M 376.37 127 L 403 127 L 403 291 L 423.63 291" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: rgb(0, 0, 0);"/><path d="M 371.12 127 L 378.12 123.5 L 376.37 127 L 378.12 130.5 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/><path d="M 428.88 291 L 421.88 294.5 L 423.63 291 L 421.88 287.5 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-148"><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 217px; margin-left: 403px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; background-color: #ffffff; "><div style="display: inline-block; font-size: 11px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; ">HTTP</div></div></div></foreignObject><image x="388.5" y="211" width="29" height="15.75" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHQAAAA/CAYAAAAxBeyIAAAAAXNSR0IArs4c6QAAA/xJREFUeF7tm78vNEEYx78rEoUG0VGJHxGJSIiIQuFHkKAglCRErVKQUChIUPgDRChPUIqCwu9EQSHRiEgkNKIhUQg5mXvf2/f23tubW7Nr5jbf7dzMPM8z388882uXFY1Go+ATGgUsAg0Ny1hHCDRcPAk0ZDwJlEDDpkDI+sM1lEBDpkDIusMMDTPQ1dVVjI+P213s7OzE3t6eUpeLi4vx8vJi27i6ukJdXZ399/7+Pjo6OpR8yBqPjIxgfX0dv+krMabS0lI8Pj7KwnSU5+fno6CgAKJtY2MjWltb0dPTg9zc3LR2HBlKoJ40T1k5PnhUgaYyLuDOzs46ki65HoGqM3RYCBJo3FFfXx82NzeRl5f3X/TagT49PWF3dzcjWaenp/H8/GzXnZqaQllZmbRtZWUlWlpa8Ju+0mXo/Pw8KioqXOP++vrC6+sr7u/vcXZ2hqOjIyRfuQ8MDGBra8s8oFIaCRXKy8txd3dn/3J+fo6mpiYvJjKu66ev5DXUa9y3t7exafbw8NARfyQSwdDQkOM37RmascIA/BRZ5tdPX6pARawfHx9ob2/H8fGxHXp1dTVubm4IVAZTlJsGVMR0fX2N2tpaR/gie0Ws8YcZ6kLXRKAi1JqaGkdWbmxsYHh4mEBlWWoq0MHBQcdmaHFxEZOTkwSarUDHxsawtrZmhz8zM4O5uTkCzVag4riys7Njh7+ysoKJiQkCzVagyUvB9vY2+vv7CTQbgV5eXqK+vt4OPScnJ3bRUlRUlBlQcZuRuIOSiZCqfGFhAe/v73ZR8uW8F5t+blRkfv305dc5tK2tDScnJ3boqV6epD22yDr9k3ICBbzeFD08PGB0dBQHBwf/MtGycHFxgYaGhswvFn4CTNaGQIHl5WVUVVW5SiXubd/e3iBAnp6exl5hfn5+OuqLna3Y4SY/zFANFwuyQS8rF+dOcf5M9fCmKIuAiqxeWlpCb2+vK3MCNRSoeNdZWFiIkpISNDc3o6urC93d3bAsK20CE6gGoF43RbIpOLGcQAnUy3gBZB+JebHm59lQ5tdPX36cQ2XxxsuZoczQTMfKn3rMUMQ+xUz8jJNr6N8x5Oc0KBuWfvoi0F+YBglUpoBLOadcTrmuQ8fPaVA2Pv30xSmXU65svPHqz6tCzFCuoa5jRtuU63UUs755CvAffs1johQRgSrJZ15jAjWPiVJEBKokn3mNCdQ8JkoREaiSfOY1JlDzmChFRKBK8pnXmEDNY6IUEYEqyWdeYwI1j4lSROm/2lUyzcY6FCBQHaoH6JNAAxRXh2kC1aF6gD4JNEBxdZgmUB2qB+iTQAMUV4dpAtWheoA+CTRAcXWYJlAdqgfok0ADFFeH6W97Qt2suZ3FFgAAAABJRU5ErkJggg=="/></switch></g></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-149"><g><path d="M 423.63 137 L 417 137 L 417 288 C 420.9 288 420.9 294 417 294 L 417 294 L 417 328 C 420.9 328 420.9 334 417 334 L 417 334 L 417 408 C 420.9 408 420.9 414 417 414 L 417 414 L 417 418 C 420.9 418 420.9 424 417 424 L 417 424 L 417 445 L 430 445" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: rgb(0, 0, 0);"/><path d="M 428.88 137 L 421.88 140.5 L 423.63 137 L 421.88 133.5 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-150"><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 237px; margin-left: 420px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; background-color: #ffffff; "><div style="display: inline-block; font-size: 11px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; ">HTTP</div></div></div></foreignObject><image x="405.5" y="231" width="29" height="15.75" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHQAAAA/CAYAAAAxBeyIAAAAAXNSR0IArs4c6QAAA/xJREFUeF7tm78vNEEYx78rEoUG0VGJHxGJSIiIQuFHkKAglCRErVKQUChIUPgDRChPUIqCwu9EQSHRiEgkNKIhUQg5mXvf2/f23tubW7Nr5jbf7dzMPM8z388882uXFY1Go+ATGgUsAg0Ny1hHCDRcPAk0ZDwJlEDDpkDI+sM1lEBDpkDIusMMDTPQ1dVVjI+P213s7OzE3t6eUpeLi4vx8vJi27i6ukJdXZ399/7+Pjo6OpR8yBqPjIxgfX0dv+krMabS0lI8Pj7KwnSU5+fno6CgAKJtY2MjWltb0dPTg9zc3LR2HBlKoJ40T1k5PnhUgaYyLuDOzs46ki65HoGqM3RYCBJo3FFfXx82NzeRl5f3X/TagT49PWF3dzcjWaenp/H8/GzXnZqaQllZmbRtZWUlWlpa8Ju+0mXo/Pw8KioqXOP++vrC6+sr7u/vcXZ2hqOjIyRfuQ8MDGBra8s8oFIaCRXKy8txd3dn/3J+fo6mpiYvJjKu66ev5DXUa9y3t7exafbw8NARfyQSwdDQkOM37RmascIA/BRZ5tdPX6pARawfHx9ob2/H8fGxHXp1dTVubm4IVAZTlJsGVMR0fX2N2tpaR/gie0Ws8YcZ6kLXRKAi1JqaGkdWbmxsYHh4mEBlWWoq0MHBQcdmaHFxEZOTkwSarUDHxsawtrZmhz8zM4O5uTkCzVag4riys7Njh7+ysoKJiQkCzVagyUvB9vY2+vv7CTQbgV5eXqK+vt4OPScnJ3bRUlRUlBlQcZuRuIOSiZCqfGFhAe/v73ZR8uW8F5t+blRkfv305dc5tK2tDScnJ3boqV6epD22yDr9k3ICBbzeFD08PGB0dBQHBwf/MtGycHFxgYaGhswvFn4CTNaGQIHl5WVUVVW5SiXubd/e3iBAnp6exl5hfn5+OuqLna3Y4SY/zFANFwuyQS8rF+dOcf5M9fCmKIuAiqxeWlpCb2+vK3MCNRSoeNdZWFiIkpISNDc3o6urC93d3bAsK20CE6gGoF43RbIpOLGcQAnUy3gBZB+JebHm59lQ5tdPX36cQ2XxxsuZoczQTMfKn3rMUMQ+xUz8jJNr6N8x5Oc0KBuWfvoi0F+YBglUpoBLOadcTrmuQ8fPaVA2Pv30xSmXU65svPHqz6tCzFCuoa5jRtuU63UUs755CvAffs1johQRgSrJZ15jAjWPiVJEBKokn3mNCdQ8JkoREaiSfOY1JlDzmChFRKBK8pnXmEDNY6IUEYEqyWdeYwI1j4lSROm/2lUyzcY6FCBQHaoH6JNAAxRXh2kC1aF6gD4JNEBxdZgmUB2qB+iTQAMUV4dpAtWheoA+CTRAcXWYJlAdqgfok0ADFFeH6W97Qt2suZ3FFgAAAABJRU5ErkJggg=="/></switch></g></g></g></g><g data-cell-id="a_cl7nsyDpLQFaXOHeFD-3"><g><path d="M 90 103.6 C 90 98.85 101.19 95 115 95 C 121.63 95 127.99 95.91 132.68 97.52 C 137.37 99.13 140 101.32 140 103.6 L 140 150.4 C 140 155.15 128.81 159 115 159 C 101.19 159 90 155.15 90 150.4 Z" fill="#e6e6e6" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(230, 230, 230); stroke: rgb(0, 0, 0);"/><path d="M 140 103.6 C 140 108.35 128.81 112.2 115 112.2 C 101.19 112.2 90 108.35 90 103.6" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="stroke: rgb(0, 0, 0);"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 48px; height: 1px; padding-top: 134px; margin-left: 91px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; font-style: italic; white-space: normal; word-wrap: normal; ">prom</div></div></div></foreignObject><image x="91" y="127.5" width="48" height="17" xlink:href="data:image/png;base64,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"/></switch></g></g></g><g data-cell-id="a_cl7nsyDpLQFaXOHeFD-4"><g><rect x="72" y="159" width="85" height="17" fill="none" stroke="none" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 89px; height: 1px; padding-top: 168px; margin-left: 70px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">metric-db</div></div></div></foreignObject><image x="70" y="161.5" width="89" height="17" xlink:href="data:image/png;base64,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"/></switch></g></g></g><g data-cell-id="uDJ2bVtIrgoZBCZFZmDG-6"><g><path d="M 570 127 L 550.03 127 L 580.03 127 L 564.87 127" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: rgb(0, 0, 0);"/><path d="M 561.12 127 L 566.12 124.5 L 564.87 127 L 566.12 129.5 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/></g></g><g data-cell-id="uDJ2bVtIrgoZBCZFZmDG-5"><g><rect x="570" y="120" width="40" height="14" rx="2.1" ry="2.1" fill="#ffffff" stroke="#000000" pointer-events="all" style="fill: rgb(255, 255, 255); stroke: rgb(0, 0, 0);"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 38px; height: 1px; padding-top: 127px; margin-left: 571px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; font-weight: bold; white-space: normal; word-wrap: normal; ">init</div></div></div></foreignObject><image x="571" y="120.5" width="38" height="17" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAJgAAABECAYAAAB9Pvx1AAAAAXNSR0IArs4c6QAABCZJREFUeF7tnFmoTVEYx3/3wRTiRaYi05Mk4kFE8UYKGZJIhkylDK8iPFJCIWMSUQpRSiHyJFEeCIlCkVmEhP1p37qd1h7O8J17jv3fdbt1z1rfXv3Wb39r7bXWuS3oEgFHAi2OsRVaBJBgksCVgARzxavgEkwOuBKQYK54FVyCyQFXAhLMFa+CSzA54Eqg2QQ7ASwIEPkE9HQlVX7wF0D/QLXzwIzywzVnDQnm128SDJpuoVUZzO+BcImsDOaC9V/QajJYF+AN0K1N82YC5/ya6xO52QTbDcxKmIMN90FUcdTbQN9A7cuRfMsyos4BzpSUkWAVd4UqlhI4G3iQJJg8qQmB7vHw2FkZrCY8FaSEwELgeICKMphUqQmBi8A0CVYTlmUHqWSZYiewPnCna8Dkkr+PAxYDE4ABQAfgLfAQsMn5IeBjzlbnfYtcCezLGbO02KCovc8qrFuXas32FlmJYJsjklsCNO8Bo+K/94jlmZ1B/X00P1oNnM7ROxKsIAutG6L1pB0BIZ4CQ+ItphvAiBzSWJE/wBLgWEZ5CVYQwdYAewMy2NDXC7gATM8pV2uxb8BI4ElKPQlWEMFWAPsDIvwAFuUc7kIeHQGW1kCw0cDUOE4/YFVCzJPAg5LP9gC20d+wVxHmYLZqfjChBywDDQW+AtuAU8DLSMg+wPx47tY1oa5lMcuA9jt05c1gbeuOid4gbQcgdGmZog6PUSWT/DTBrMlfgEnA3UD7pwBXUjL9ROCmBEvu+aJnMCOzPH6DTKIU2rZpLbsWsGFKGSwBQtEFex6tmg8Gfqdk37kp87TtwCYJpgyWNAezRdiNGUO7zdEeJ5Sx7GVZTBlMGSxIYF7gWExpwY6AvXGGrgOArcRLMAkWJGBbQrcyMph9/DPeNiotKsEy4BV9DmZbRbZllHV9BzoFCkkwCfbv9GjSHEyCZT1aVX6uDKYMVqVC6dUlmASTYG0I1HolX0Okq17F+F6k5mDOEqWF1xDZPEOkPSiH29GVim4twRpLMDu6cyehJ3dFR3PWVdTL7VhJgjWWYMOARwk+2LmvsSnbVu2oUfKtJVhjCWbfhfycsGtgvWjn1q5GhxJfAwOjn6PxGbaGlMsaJcEaSzDrk+vx+bQ80tjp19Bp3Tx161JGgjWeYHZ8+lLO3pdgOUHlLfa/r4O1crAzZltzQJFgOSCVU6QoghmT8YB9I8pOfPQGfgEfgHfA/fgUiP23xFflAKx32WYbIuvNR/erkoAEqxKgqqcTkGAyxJWABHPFq+ASTA64EpBgrngVXILJAVcCEswVr4JLMDngSkCCueJVcAkmB1wJSDBXvAouweSAKwEJ5opXwSWYHHAlIMFc8Sq4BJMDrgQkmCteBZdgcsCVgARzxavgEkwOuBKQYK54FVyCyQFXAhLMFa+C/wVRVztUleCmzgAAAABJRU5ErkJggg=="/></switch></g></g></g><g data-cell-id="uDJ2bVtIrgoZBCZFZmDG-9"><g><path d="M 570 373 L 550.03 373 L 580.03 373 L 564.87 373" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: rgb(0, 0, 0);"/><path d="M 561.12 373 L 566.12 370.5 L 564.87 373 L 566.12 375.5 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/></g></g><g data-cell-id="uDJ2bVtIrgoZBCZFZmDG-8"><g><rect x="570" y="366.5" width="40" height="13" rx="1.95" ry="1.95" fill="#ffffff" stroke="#000000" pointer-events="all" style="fill: rgb(255, 255, 255); stroke: rgb(0, 0, 0);"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 38px; height: 1px; padding-top: 373px; margin-left: 571px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; font-weight: bold; white-space: normal; word-wrap: normal; ">init</div></div></div></foreignObject><image x="571" y="366.5" width="38" height="17" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAJgAAABECAYAAAB9Pvx1AAAAAXNSR0IArs4c6QAABCZJREFUeF7tnFmoTVEYx3/3wRTiRaYi05Mk4kFE8UYKGZJIhkylDK8iPFJCIWMSUQpRSiHyJFEeCIlCkVmEhP1p37qd1h7O8J17jv3fdbt1z1rfXv3Wb39r7bXWuS3oEgFHAi2OsRVaBJBgksCVgARzxavgEkwOuBKQYK54FVyCyQFXAhLMFa+CSzA54Eqg2QQ7ASwIEPkE9HQlVX7wF0D/QLXzwIzywzVnDQnm128SDJpuoVUZzO+BcImsDOaC9V/QajJYF+AN0K1N82YC5/ya6xO52QTbDcxKmIMN90FUcdTbQN9A7cuRfMsyos4BzpSUkWAVd4UqlhI4G3iQJJg8qQmB7vHw2FkZrCY8FaSEwELgeICKMphUqQmBi8A0CVYTlmUHqWSZYiewPnCna8Dkkr+PAxYDE4ABQAfgLfAQsMn5IeBjzlbnfYtcCezLGbO02KCovc8qrFuXas32FlmJYJsjklsCNO8Bo+K/94jlmZ1B/X00P1oNnM7ROxKsIAutG6L1pB0BIZ4CQ+ItphvAiBzSWJE/wBLgWEZ5CVYQwdYAewMy2NDXC7gATM8pV2uxb8BI4ElKPQlWEMFWAPsDIvwAFuUc7kIeHQGW1kCw0cDUOE4/YFVCzJPAg5LP9gC20d+wVxHmYLZqfjChBywDDQW+AtuAU8DLSMg+wPx47tY1oa5lMcuA9jt05c1gbeuOid4gbQcgdGmZog6PUSWT/DTBrMlfgEnA3UD7pwBXUjL9ROCmBEvu+aJnMCOzPH6DTKIU2rZpLbsWsGFKGSwBQtEFex6tmg8Gfqdk37kp87TtwCYJpgyWNAezRdiNGUO7zdEeJ5Sx7GVZTBlMGSxIYF7gWExpwY6AvXGGrgOArcRLMAkWJGBbQrcyMph9/DPeNiotKsEy4BV9DmZbRbZllHV9BzoFCkkwCfbv9GjSHEyCZT1aVX6uDKYMVqVC6dUlmASTYG0I1HolX0Okq17F+F6k5mDOEqWF1xDZPEOkPSiH29GVim4twRpLMDu6cyehJ3dFR3PWVdTL7VhJgjWWYMOARwk+2LmvsSnbVu2oUfKtJVhjCWbfhfycsGtgvWjn1q5GhxJfAwOjn6PxGbaGlMsaJcEaSzDrk+vx+bQ80tjp19Bp3Tx161JGgjWeYHZ8+lLO3pdgOUHlLfa/r4O1crAzZltzQJFgOSCVU6QoghmT8YB9I8pOfPQGfgEfgHfA/fgUiP23xFflAKx32WYbIuvNR/erkoAEqxKgqqcTkGAyxJWABHPFq+ASTA64EpBgrngVXILJAVcCEswVr4JLMDngSkCCueJVcAkmB1wJSDBXvAouweSAKwEJ5opXwSWYHHAlIMFc8Sq4BJMDrgQkmCteBZdgcsCVgARzxavgEkwOuBKQYK54FVyCyQFXAhLMFa+C/wVRVztUleCmzgAAAABJRU5ErkJggg=="/></switch></g></g></g><g data-cell-id="uDJ2bVtIrgoZBCZFZmDG-11"><g><path d="M 40 209 L 60.03 209 L 29.51 209 L 44.63 209" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: rgb(0, 0, 0);"/><path d="M 48.38 209 L 43.38 211.5 L 44.63 209 L 43.38 206.5 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/></g></g><g data-cell-id="uDJ2bVtIrgoZBCZFZmDG-10"><g><rect x="0" y="203" width="40" height="12" rx="1.8" ry="1.8" fill="#ffffff" stroke="#000000" pointer-events="all" style="fill: rgb(255, 255, 255); stroke: rgb(0, 0, 0);"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 38px; height: 1px; padding-top: 209px; margin-left: 1px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; font-weight: bold; white-space: normal; word-wrap: normal; ">init</div></div></div></foreignObject><image x="1" y="202.5" width="38" height="17" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAJgAAABECAYAAAB9Pvx1AAAAAXNSR0IArs4c6QAABCZJREFUeF7tnFmoTVEYx3/3wRTiRaYi05Mk4kFE8UYKGZJIhkylDK8iPFJCIWMSUQpRSiHyJFEeCIlCkVmEhP1p37qd1h7O8J17jv3fdbt1z1rfXv3Wb39r7bXWuS3oEgFHAi2OsRVaBJBgksCVgARzxavgEkwOuBKQYK54FVyCyQFXAhLMFa+CSzA54Eqg2QQ7ASwIEPkE9HQlVX7wF0D/QLXzwIzywzVnDQnm128SDJpuoVUZzO+BcImsDOaC9V/QajJYF+AN0K1N82YC5/ya6xO52QTbDcxKmIMN90FUcdTbQN9A7cuRfMsyos4BzpSUkWAVd4UqlhI4G3iQJJg8qQmB7vHw2FkZrCY8FaSEwELgeICKMphUqQmBi8A0CVYTlmUHqWSZYiewPnCna8Dkkr+PAxYDE4ABQAfgLfAQsMn5IeBjzlbnfYtcCezLGbO02KCovc8qrFuXas32FlmJYJsjklsCNO8Bo+K/94jlmZ1B/X00P1oNnM7ROxKsIAutG6L1pB0BIZ4CQ+ItphvAiBzSWJE/wBLgWEZ5CVYQwdYAewMy2NDXC7gATM8pV2uxb8BI4ElKPQlWEMFWAPsDIvwAFuUc7kIeHQGW1kCw0cDUOE4/YFVCzJPAg5LP9gC20d+wVxHmYLZqfjChBywDDQW+AtuAU8DLSMg+wPx47tY1oa5lMcuA9jt05c1gbeuOid4gbQcgdGmZog6PUSWT/DTBrMlfgEnA3UD7pwBXUjL9ROCmBEvu+aJnMCOzPH6DTKIU2rZpLbsWsGFKGSwBQtEFex6tmg8Gfqdk37kp87TtwCYJpgyWNAezRdiNGUO7zdEeJ5Sx7GVZTBlMGSxIYF7gWExpwY6AvXGGrgOArcRLMAkWJGBbQrcyMph9/DPeNiotKsEy4BV9DmZbRbZllHV9BzoFCkkwCfbv9GjSHEyCZT1aVX6uDKYMVqVC6dUlmASTYG0I1HolX0Okq17F+F6k5mDOEqWF1xDZPEOkPSiH29GVim4twRpLMDu6cyehJ3dFR3PWVdTL7VhJgjWWYMOARwk+2LmvsSnbVu2oUfKtJVhjCWbfhfycsGtgvWjn1q5GhxJfAwOjn6PxGbaGlMsaJcEaSzDrk+vx+bQ80tjp19Bp3Tx161JGgjWeYHZ8+lLO3pdgOUHlLfa/r4O1crAzZltzQJFgOSCVU6QoghmT8YB9I8pOfPQGfgEfgHfA/fgUiP23xFflAKx32WYbIuvNR/erkoAEqxKgqqcTkGAyxJWABHPFq+ASTA64EpBgrngVXILJAVcCEswVr4JLMDngSkCCueJVcAkmB1wJSDBXvAouweSAKwEJ5opXwSWYHHAlIMFc8Sq4BJMDrgQkmCteBZdgcsCVgARzxavgEkwOuBKQYK54FVyCyQFXAhLMFa+C/wVRVztUleCmzgAAAABJRU5ErkJggg=="/></switch></g></g></g><g data-cell-id="uDJ2bVtIrgoZBCZFZmDG-12"><g><rect x="240" y="189" width="130" height="40" rx="6" ry="6" fill="#e6e6e6" stroke="#000000" pointer-events="all" style="fill: rgb(230, 230, 230); stroke: rgb(0, 0, 0);"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 128px; height: 1px; padding-top: 209px; margin-left: 241px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "><b>Dashboard UI</b><div><i>grafana</i></div></div></div></div></foreignObject><image x="241" y="195" width="128" height="32" xlink:href="data:image/png;base64,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"/></switch></g></g></g><g data-cell-id="uDJ2bVtIrgoZBCZFZmDG-17"><g><path d="M 230 455 L 250.03 455 L 220.03 455 L 235.13 455" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: rgb(0, 0, 0);"/><path d="M 238.88 455 L 233.88 457.5 L 235.13 455 L 233.88 452.5 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/></g></g><g data-cell-id="uDJ2bVtIrgoZBCZFZmDG-18"><g><path d="M 230 455 L 250.03 455 L 220.03 455 L 238.13 455" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: rgb(0, 0, 0);"/><path d="M 238.88 455 L 237.88 455.5 L 238.13 455 L 237.88 454.5 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/></g></g><g data-cell-id="uDJ2bVtIrgoZBCZFZmDG-14"><g><rect x="190" y="448.5" width="40" height="13" rx="1.95" ry="1.95" fill="#ffffff" stroke="#000000" pointer-events="all" style="fill: rgb(255, 255, 255); stroke: rgb(0, 0, 0);"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 38px; height: 1px; padding-top: 455px; margin-left: 191px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; font-weight: bold; white-space: normal; word-wrap: normal; ">init</div></div></div></foreignObject><image x="191" y="448.5" width="38" height="17" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAJgAAABECAYAAAB9Pvx1AAAAAXNSR0IArs4c6QAABCZJREFUeF7tnFmoTVEYx3/3wRTiRaYi05Mk4kFE8UYKGZJIhkylDK8iPFJCIWMSUQpRSiHyJFEeCIlCkVmEhP1p37qd1h7O8J17jv3fdbt1z1rfXv3Wb39r7bXWuS3oEgFHAi2OsRVaBJBgksCVgARzxavgEkwOuBKQYK54FVyCyQFXAhLMFa+CSzA54Eqg2QQ7ASwIEPkE9HQlVX7wF0D/QLXzwIzywzVnDQnm128SDJpuoVUZzO+BcImsDOaC9V/QajJYF+AN0K1N82YC5/ya6xO52QTbDcxKmIMN90FUcdTbQN9A7cuRfMsyos4BzpSUkWAVd4UqlhI4G3iQJJg8qQmB7vHw2FkZrCY8FaSEwELgeICKMphUqQmBi8A0CVYTlmUHqWSZYiewPnCna8Dkkr+PAxYDE4ABQAfgLfAQsMn5IeBjzlbnfYtcCezLGbO02KCovc8qrFuXas32FlmJYJsjklsCNO8Bo+K/94jlmZ1B/X00P1oNnM7ROxKsIAutG6L1pB0BIZ4CQ+ItphvAiBzSWJE/wBLgWEZ5CVYQwdYAewMy2NDXC7gATM8pV2uxb8BI4ElKPQlWEMFWAPsDIvwAFuUc7kIeHQGW1kCw0cDUOE4/YFVCzJPAg5LP9gC20d+wVxHmYLZqfjChBywDDQW+AtuAU8DLSMg+wPx47tY1oa5lMcuA9jt05c1gbeuOid4gbQcgdGmZog6PUSWT/DTBrMlfgEnA3UD7pwBXUjL9ROCmBEvu+aJnMCOzPH6DTKIU2rZpLbsWsGFKGSwBQtEFex6tmg8Gfqdk37kp87TtwCYJpgyWNAezRdiNGUO7zdEeJ5Sx7GVZTBlMGSxIYF7gWExpwY6AvXGGrgOArcRLMAkWJGBbQrcyMph9/DPeNiotKsEy4BV9DmZbRbZllHV9BzoFCkkwCfbv9GjSHEyCZT1aVX6uDKYMVqVC6dUlmASTYG0I1HolX0Okq17F+F6k5mDOEqWF1xDZPEOkPSiH29GVim4twRpLMDu6cyehJ3dFR3PWVdTL7VhJgjWWYMOARwk+2LmvsSnbVu2oUfKtJVhjCWbfhfycsGtgvWjn1q5GhxJfAwOjn6PxGbaGlMsaJcEaSzDrk+vx+bQ80tjp19Bp3Tx161JGgjWeYHZ8+lLO3pdgOUHlLfa/r4O1crAzZltzQJFgOSCVU6QoghmT8YB9I8pOfPQGfgEfgHfA/fgUiP23xFflAKx32WYbIuvNR/erkoAEqxKgqqcTkGAyxJWABHPFq+ASTA64EpBgrngVXILJAVcCEswVr4JLMDngSkCCueJVcAkmB1wJSDBXvAouweSAKwEJ5opXwSWYHHAlIMFc8Sq4BJMDrgQkmCteBZdgcsCVgARzxavgEkwOuBKQYK54FVyCyQFXAhLMFa+C/wVRVztUleCmzgAAAABJRU5ErkJggg=="/></switch></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-104"><g><rect x="240" y="435" width="130" height="40" rx="6" ry="6" fill="#e6e6e6" stroke="#000000" pointer-events="all" style="fill: rgb(230, 230, 230); stroke: rgb(0, 0, 0);"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 128px; height: 1px; padding-top: 455px; margin-left: 241px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "><b>Auth Service</b><br /><i>keycloak</i></div></div></div></foreignObject><image x="241" y="441" width="128" height="32" xlink:href="data:image/png;base64,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"/></switch></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-120"><g><rect x="49.5" y="189" width="130" height="40" rx="6" ry="6" fill="#e6e6e6" stroke="#000000" pointer-events="all" style="fill: rgb(230, 230, 230); stroke: rgb(0, 0, 0);"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 128px; height: 1px; padding-top: 209px; margin-left: 51px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "><b>Storage Service</b><div><i>seaweedfs</i></div></div></div></div></foreignObject><image x="51" y="195" width="128" height="32" xlink:href="data:image/png;base64,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"/></switch></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-105"><g><rect x="430" y="107" width="130" height="40" rx="6" ry="6" fill="#ffffff" stroke="#000000" pointer-events="all" style="fill: rgb(255, 255, 255); stroke: rgb(0, 0, 0);"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 128px; height: 1px; padding-top: 127px; margin-left: 431px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; font-weight: bold; white-space: normal; word-wrap: normal; ">Search Service</div></div></div></foreignObject><image x="431" y="120.5" width="128" height="17" xlink:href="data:image/png;base64,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"/></switch></g></g></g><g data-cell-id="FWEJ_FGA9GBXbfwohBE8-108"><g><rect x="430" y="353" width="130" height="40" rx="6" ry="6" fill="#ffffff" stroke="#000000" pointer-events="all" style="fill: rgb(255, 255, 255); stroke: rgb(0, 0, 0);"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 128px; height: 1px; padding-top: 373px; margin-left: 431px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "><b>Dashboard Service</b></div></div></div></foreignObject><image x="431" y="366.5" width="128" height="17" xlink:href="data:image/png;base64,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"/></switch></g></g></g><g data-cell-id="uDJ2bVtIrgoZBCZFZmDG-21"><g><rect x="452.5" y="588.61" width="85" height="20" fill="none" stroke="none" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 89px; height: 1px; padding-top: 599px; margin-left: 451px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">data-db</div></div></div></foreignObject><image x="451" y="592.5" width="89" height="17" xlink:href="data:image/png;base64,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"/></switch></g></g></g><g data-cell-id="uDJ2bVtIrgoZBCZFZmDG-23"><g><path d="M 439.5 523.21 C 439.5 518.46 450.69 514.61 464.5 514.61 C 471.13 514.61 477.49 515.52 482.18 517.13 C 486.87 518.74 489.5 520.93 489.5 523.21 L 489.5 570.01 C 489.5 574.76 478.31 578.61 464.5 578.61 C 450.69 578.61 439.5 574.76 439.5 570.01 Z" fill="#e6e6e6" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(230, 230, 230); stroke: rgb(0, 0, 0);"/><path d="M 489.5 523.21 C 489.5 527.96 478.31 531.81 464.5 531.81 C 450.69 531.81 439.5 527.96 439.5 523.21" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="stroke: rgb(0, 0, 0);"/></g></g><g data-cell-id="uDJ2bVtIrgoZBCZFZmDG-24"><g><path d="M 499.5 523.21 C 499.5 518.46 510.69 514.61 524.5 514.61 C 531.13 514.61 537.49 515.52 542.18 517.13 C 546.87 518.74 549.5 520.93 549.5 523.21 L 549.5 570.01 C 549.5 574.76 538.31 578.61 524.5 578.61 C 510.69 578.61 499.5 574.76 499.5 570.01 Z" fill="#e6e6e6" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(230, 230, 230); stroke: rgb(0, 0, 0);"/><path d="M 549.5 523.21 C 549.5 527.96 538.31 531.81 524.5 531.81 C 510.69 531.81 499.5 527.96 499.5 523.21" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="stroke: rgb(0, 0, 0);"/></g></g><g data-cell-id="uDJ2bVtIrgoZBCZFZmDG-25"><g><path d="M 470.5 533.21 C 470.5 528.46 481.69 524.61 495.5 524.61 C 502.13 524.61 508.49 525.52 513.18 527.13 C 517.87 528.74 520.5 530.93 520.5 533.21 L 520.5 580.01 C 520.5 584.76 509.31 588.61 495.5 588.61 C 481.69 588.61 470.5 584.76 470.5 580.01 Z" fill="#e6e6e6" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(230, 230, 230); stroke: rgb(0, 0, 0);"/><path d="M 520.5 533.21 C 520.5 537.96 509.31 541.81 495.5 541.81 C 481.69 541.81 470.5 537.96 470.5 533.21" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="stroke: rgb(0, 0, 0);"/></g></g><g data-cell-id="uDJ2bVtIrgoZBCZFZmDG-29"><g><path d="M 494.86 481.37 L 494.86 518.63" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: rgb(0, 0, 0);"/><path d="M 494.86 476.12 L 498.36 483.12 L 494.86 481.37 L 491.36 483.12 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/><path d="M 494.86 523.88 L 491.36 516.88 L 494.86 518.63 L 498.36 516.88 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/></g><g data-cell-id="uDJ2bVtIrgoZBCZFZmDG-30"><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 497px; margin-left: 496px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; background-color: #ffffff; "><div style="display: inline-block; font-size: 11px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; ">JDBC</div></div></div></foreignObject><image x="481.5" y="491" width="29" height="15.75" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHQAAAA/CAYAAAAxBeyIAAAAAXNSR0IArs4c6QAACm1JREFUeF7tnAWoFG0Xx881Xrsbu7sTuwsVxU5QTLDF7m4xMRC7CyxssTsudjcGJrZer/fjN3yz3+zszM7uvbvDu/ebAyLuPvOcec7/OX3WsKioqChxKNZIIMwBNNZgqRzEATR24ekAGsvwdAB1AI1tEohl53F8qANoLJNALDuOo6H/b4DeuHFDihYtannsWrVqyeHDhw3XLV++XLp162a5R1hYmCRPnlxSp04tqVKlkmzZsknFihWlUqVKUqZMGfnnn38s9zBa0KFDB1m/fr1Pz8aJE0eSJEkiyZIlU/gXKlRIKleuLI0bN5a0adP6tIcvi65cuSL79u2TCxcuyP379+Xly5fy7ds3iRs3rsI7Xbp0Cu+SJUsqvIsVK+bLttZRrp2AentjAO7Ro4f07dtXMmXK5NPh1EX+AGq2cbx48aRLly4yYcIEyZAhg1/81cV///6V1atXy6xZs+TWrVt+7VG4cGEZPny4tG3bVrh0ZmRpcv8tgKoHQEsHDRqkCBYh+0KBAFTlkyVLFtm/f78gYH/ozp070r59e0EzY0JYi7Vr10qOHDkMt7EE9OPHj7J9+3aPhy9evCjLli1zfe6PyS1RooSMHDnSY09u8KdPn+TDhw/y4sULOX36tFy/fl0iIyM91nKwjRs3CgK2Ij2gCLZp06aGj/EOmL7nz5/LpUuXFDfy48cPt7W5c+eWa9euSeLEia1YK9+zR7NmzeTr168e69OkSSPILnv27JI+fXqJHz++IHM0+OTJk/L69WuPZzD9R44cMTTDloCavfGmTZsU9VfJH0Dr1aun3HJfiMNxcebNmyevXr1yewQfx6H52xvpAZ06daoMGzbMF/by7t07GTBggKxbt85t/ezZs2XgwIGWe1y+fFmJAX79+uW2tkKFCjJ58mSpXr26qQnlcnEZxo8fL2fOnHF7HlCvXr3qcaH/9YCqp0BLevXqpfggLaHt586dkwQJEpgKNyaAqpvWqVPHLegjWMOCeCOsTalSpeTx48euZfi/uXPnSp8+fSwvg7qAhhiXUG/VuAxHjx4VgkmVQgZQ9YWnT5/uoV0EC1OmTAkqoDt37nQz05hKtNcbderUSfF3LmGHhSluonXr1j6DqV1IMDV48GC3Z3fs2KGY85AFlBfv2LGjmwlEOx8+fCiZM2c2FFQgNPTevXuSP39+N00z8u3qArQyb968bv6fCB3XEROqW7euHDp0SNmC9A6Ate4j5DSUg3z58kUJIvCvKmGOJk2aFDRAb9++reSFKpFGEbyZUe/evWXRokWur7lsDx48kIQJE8YET8EnE1M0b95catas6RHphySgSGTMmDEyceJEl3By5cqlaKkRBUJDMW0IUaUaNWoo/suI8HlErFqTzGUziuxjhK7BwyEL6JMnTyRnzpxuR6LikidPHo9jBgLQhg0bKpUdldASs+rXzZs3pUiRIm7vQSXI34JIdMAOWUA5LOkK+aJKlPfatWsXUEDRNooY48aNc+0LWJg+s1LkkiVLlIhcJXwpPtgOCmlAW7VqJVu3bnXJCaGPHTs2RoCS+1EAwAKQllCH1lZ3smbNKseOHRNMvBn179/fLfghiFuzZo0deFrXcs3ewq7CgjcpkMstXLjQtaR79+6ydOlSS0CjI1nKjFSYKCiQsngjfbpilVZF533MnglpDUUbMYcqYW6NuioxreWijYDSpk0bSZo0qaX8GzVqJHv37nWtI3ceMmSI5XOBWBDSgE6bNk0RtEoInMRdTzEFVN0vUaJE0rJlSyW69lZupIJz/Phx12ssWLBASGPsoJAGdNSoUUo9VCWiTm3DQP1cDyjrjIIndX1ERISS61IcIPjZs2eP8m+V6Jdu2LBBmjRpYohRgwYN3GrVdqUsvExIAwowBC0qUTWZMWOGpYb6U5xnM7ovlBZ5Tv2hAT6VjkfVqlU9+FHa27Jli+tzivj4XjsopAFFmHRbVCIgIjCyMrn+AqruR1GdzotK5MGkI/q+7NChQ90uFj519+7dduAZuhpKO4pa5vfv312CAlz6pMECFO0kB9VOG6CJ+FUtrVy5UpluUIn3pGqk7YoEC92Q1VD6qfgqrV97//69YRstEJUilQ9BGMGYSkap0t27d6VAgQJumDE7VLZs2WDh6No32oASTWoDC29Na/2QmD8NbjMJUFelvqoSAQotLiMKJKD6KhDdjwMHDniwZUTk6dOnrs8DWVw4ePCgUACpX7++B9+wiIiIKPwA9Uf+YFbokFsR/qpnz56uZQQCFBuMKNCAhoeHS+nSpZVDqbRr1y5lOi7YgM6fP1/69evnYmNWpNdH4JQJMdWMr8SEcDFoPyXPcuXKKZUx6swqhYWHh0fR9VeJxBnTZTUySaI8c+ZM13Peen2BBPT3799SpUoVZfxRJWqlDGGZTcMFUkMBE1BVMst9ETjgkQKpxNjJqVOnlFHN6FLnzp1l1apVrscZ8yS1Uv1zWGRkZBTzKdre4ubNm4U6qTdCQ7Q1TrPCOHsEClA0kmBDP4ZCVUZ7S/XvHShA//z5I/ny5XMbKSEPHjFihKGomE6cM2eO23f43MWLF3sdxTSTu9G0Bi08rIRLQ/nBL/Ou2oSczjxgmU21MbjEjI1KhO3Pnj0zbQ8FAlAuXNeuXd38JvwBSzvmEUyTSy6q72niprSNby3/z58/KzNF+j4t7gmZ+FJGZD8uElMJ+lzWyCoqQRGjkphdrU8icEFTU6RI4SYj/BfO+M2bN67PrYQaE0BJ6jExaIJ+6o9p+hMnTgglOW8UUw3lHSj3UbTQ/g8GBGbbtm3zyhvAGSgDXC1lzJhRiVWYnGRS3ogAkirV6NGjhfloLVWrVk0IjvSu0RXl6jsXPIwpJpLlBpL3MUrIjC6MVGIUg3FCRkLMSA+o2Vwuz3OpKLPhg7ASVGO0uabKg6ICgZD+wvmiod7mcnke0GihcYE4GymSfqaWNtrZs2dN55i074GPI8V6+/atx+sBCOAULFhQmXLAKjItyEXgsho9U7t2bSWiN7KgLkABDD9kNlZhJCg0g9TBKHzWrvf1ty1er/p/vySgoMTH7bYK3NT9AlWcV/cjCANkbz1R/Vm4oLgMtCq6xNmJntFYs8DKLQ/9+fOnULaix6g1v0YvQOhMcELobEWBAJQDEKjhw/z9GUKgAE2ZMqXSNeEdojvshWZRejx//ryV2FzfE6NQjSJF0U4eGm1gWFh49OiRrFixQmkBkaMSkHAATEL58uWVLkOLFi18Dr/9BZSxTH6Fhlnjl2+YJHhaNZbNJBQdQAlYMOe8A6kBJp6fT0QXSP27IVfqu6RfmFd+8qB2dODLlGDx4sWVFA2+vp492pUin6+Xs9BWCTiA2iru4DNzAA2+jG3l4ABqq7iDz8wBNPgytpWDA6it4g4+MwfQ4MvYVg4OoLaKO/jMHECDL2NbOTiA2iru4DNzAA2+jG3l4ABqq7iDz+x//31G8Hk5HGyQgAOoDUK2k4UDqJ3StoGXA6gNQraThQOondK2gZcDqA1CtpOFA6id0raBlwOoDUK2k4UDqJ3StoGXA6gNQraThQOondK2gdd/AGTpUcp01/CWAAAAAElFTkSuQmCC"/></switch></g></g></g></g><g data-cell-id="CEhTLEpK94wtDmjaM6P2-1"><g><path d="M 280 267.6 C 280 262.85 291.19 259 305 259 C 311.63 259 317.99 259.91 322.68 261.52 C 327.37 263.13 330 265.32 330 267.6 L 330 314.4 C 330 319.15 318.81 323 305 323 C 291.19 323 280 319.15 280 314.4 Z" fill="#e6e6e6" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(230, 230, 230); stroke: rgb(0, 0, 0);"/><path d="M 330 267.6 C 330 272.35 318.81 276.2 305 276.2 C 291.19 276.2 280 272.35 280 267.6" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="stroke: rgb(0, 0, 0);"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 48px; height: 1px; padding-top: 298px; margin-left: 281px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; "><i>psql</i></div></div></div></foreignObject><image x="281" y="291.5" width="48" height="17" xlink:href="data:image/png;base64,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"/></switch></g></g></g><g data-cell-id="CEhTLEpK94wtDmjaM6P2-2"><g><rect x="262.5" y="323" width="85" height="17" fill="none" stroke="none" pointer-events="all"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 89px; height: 1px; padding-top: 332px; margin-left: 261px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; white-space: normal; word-wrap: normal; ">dashboard-db</div></div></div></foreignObject><image x="261" y="325.5" width="89" height="17" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAWQAAABECAYAAAC2wE+iAAAAAXNSR0IArs4c6QAAF2BJREFUeF7t3QWQNL1xBuB2mMFhJtthZubEcRxmZmbmOMzoMDMzMzMzMzMzZx/XKKXqaHc0d7d7c67uKtf/+VYzkl5Jr5qkuUeUFAKFQCFQCOwCgXvsohXViEKgECgECoEoQq5JUAgUAoXAThAoQt7JQFQzCoFCoBAoQq45UAgUAoXAThAoQt7JQFQzCoFCoBAoQq45UAgUAoXAThAoQt7JQFQzCoFCoBAoQq45UAgUAoXAThB4cCHk742IF+wwfY+I+LCdYHyuZrx1RHxC9/KfiohnO1NlPxgRz9u9+10i4qPOVFe99uYRuEvr439S9587In50AMmLHebkd3R//6fDnHykm4fusm8sQr4s3jdZWxHyTaL54P2uIuQ7Mr5FyHdkoAbNLEK+u2N36ZYXIV8a8SvWV4R8ReB28FgR8g4G4Y40oQj5jgxUEfIdGajSkO/uQO2g5UXIOxiEmSYUIc+gtM8ypSHvc1z22Koi5D2OyqBNRch3ZKBKQ767A7WDlhch72AQZppQhDyD0j7LlIa8z3HZY6uKkPc4KqUh35FRmWtmEfIcTlUqogj5jsyCvWrILxARrxoR/vt4EfFoESHx+3ci4ocj4osj4oc6jK8z4Z42Il4+Ip4zIp76cNjiMSLikSPi3yPibyPi9yLiJyLiGyLiuyIiJ67PDPUjRsT9D21/iYh4+oh44qWOh1369ZcR8esR8SMR8XUR8XMTL82E/GMR8Vzdc08aEW8YES96wOs+C4b/GhF/dejvzx7KfmtEfH5E/PNEXflgyDsf2v/Ry3MPHRGvdGjzKxza/swR8QQR4W9/ERF/uCTvf9mhzC9M1DMq8hBLH178gP/zR8TjRsRjLnX89dKfnzkcDPqew8GYb1zqvUpVD7m8/2Ui4pki4t4R8agRYezMPXPhVyPixyPiSw7z85c3VPKTh/nzrF15OBkDct+IeNuIePaIuGdE6G//+6iaS66PDd38f0XNA/PiFZc+GbuHX7A03787Ij43In67e/KqB0P+cVlT7VXG7/Uj4oW6+W8c/+zQnp9f1tlXRcS/XKeDN/3s3ggZ+X5qRLzsREe/+UCWbxARf74sRsA3mTmp9zSHBfexC0lOVPegIr8SEW+0EOfMMxbXO0TE+yyLe+YZZUzUt4yIXzvxQCbkH1g2MHW+72FDec+FtE7VCbtXX/A7VS4T8jsu2NnEvmAhr1PP//dhY/20A/m/a0RYOLNio/zgiDBWM2LBfWJEfEhE/P3MA0sZm+VHRsRTbXjG/HvTiPijiWcyfk49Uize7ciJ0mOEfMn1MdGtk0We46B4fHZEUHhOyX9FxMdEhDXr31clZONtA32oZSxtctbCKbERGEOK1i5kT4T8WIvWa2ebFbvs8xw0WxoYTbDJGiHTSr7iikctTZrXPJDEl6800sT40kV7nO1PXw5x3e/QL0Q7kkzI33nAjxZJ43i9DRX+R0Q4nuro9THJhGKyK+/o6iNsqMtGo0//tvKMefnhB83UEe2rCG38pSbJ8r0j4gOvUklEsGyeb2Xj9Go4OerbxL8RiCPBI9IYEfIl18cV4fi/x6xJ85E2PCtfuVjF5iNrpcns0WnWEsvJe2jks6I+G78N9tZlT4T8fYuG14PyG4tmxRwH+KMfAH+6g6b6ahHxwktBZirT6CW7B08R8r0WMnmUrrxd+duW//3mosWZTE+yLGwaVL9wEAoT9JdOjOC7R8SHpt9pvDYPLgnaqclgV+dSQCA2ir4e7oWnXMzyXFUm5K8/LHrE+RFLQe4CmwbT+O8WV8wzLNjRtHph8j/Lib5kQn6nA6HQkrknCJNc/TQOG8njL5sD89/G1AsN9m1WZj53iPf38g8HTfyLDhvwtx+slD9YTM3HXlxNr7XMi768cXzGFZcMt5jx6IUJCzd9Vg83j7nCnaV873rw3G8tWuCpTcYcfemuErgYv37OImhuMu457ovm0miPXWp9rAzN6s9I0TznfumFW/HzFlcPS8bYIe7XWea4slxhLCKuvCazhPzHy/0qtG1iznP/cW1aaxQHltZrHFx1T57axm3HOjLetyp7IeRXXjTWHgwLhUvimI8HKfOBPkxE/M1C1u35U4TM/2xQmlhIFkh/UUkeFORvUfXa4Ncu/rHRANogTAKLq8kDF/cF8/2YWOxfExFP1BVwSZL+ZMmEzP9Ms3q4ZWJykyCTLDYAdbQNrf3OxOQrH0kmZL78J4sIJMlPTSsZCWLhe3+c7sf/XAiMdTMSrieadD831c+1csw9QKPS3wekF54if2Nkw7fpNrGhsLR+98QYcbvQ3nt5+8P8+/gTzyCG3g1nPNtm/UnLeLU6zWcKgs26ySXXx4luTP0E87dKJZuLa/QC48DFhIxt5uZvv4nPEjIOoMyY3/B+kyPxBGTPVfkWqTG4ZItlOQXG1kJ7IWRE0N9UJniCXEaE0veRP/czB50+RsiCdTTtfsAtDP7WNWE+N+1TWcRCC0BKWQRdaDRN/vTQzidcfGRr9SBleLSxsVCRX5ZMyO13GgYz/JQIKiLEXhOh0Weiae/IhOzvSIOGd2ojU45Jn90uNqe3O9LAn17Gvv2MNBE7jWdN+Kn5BJtwLyHcEZGzSLKZqj808DX5psX10srlgGp+/qvT5g17VhFLo2l0p+q81PpY6/fa7xQQigiSbcKFRrFaE7GI1x4UmiXk9qjgrnHsN7T8WmtLUFuQvZ8rgo7cULcmeyBkCyZrJLSuz5lARfstYFHxXo4RMpPl4xZzicnEvLLYZ7IalBeh7YWLgasji4llgjVp/t2JLj2oyAcsBeEiy8Mky5r1iJBFj7keENGafMviImnl+Lt7y6F/fkTIp8rnuhEfAmzCNLQpZLEpZy39VU5o4Pl5YwSz3nf5XosGlsuysGhJnuGfNZf8dyaLJrs64M2tcSxjhQUhE6UXprTNak0uuT7W2rL2++subolWDpZiQtw6a8LNpRwNuZcthGyNyGKayYBhEdpIe3njg3X6WWsNPefveyBki+KTu04CFVEyQWaEucgE6WUtqNfK6v/MAmzl+al6/+uxjYN5LTWqCY2IL/gmZUTINBEayYzQ9vugGdJ/kSMPjghZCpq/z4j0o7zB8smyhHqhLcpKacKaQZgzG0x7hivp5bp32LCz33fU5i1zgXabM2D4JblyRjIiZIEnrqM1uc31sda2/Ds3o82qCT84S3dW8th5bgshy5bog6dr9dq8e5eV9lu7tyZ7IGRk3PtzaHmCMbOC6PLCniXk2TpauV9MaTzHTE5at3zVXpjSn7G1whPlR4TMV8tknBFt7y+ZP0VcmZBtlrTJWaKUE53JisbIlO+F1ijQ08SmJqNli0gX5JdtIlDW8sq3vOdUWQqDPOtekD4MR5IJWdxCvrvg1prcpfVBM7XRNjnlmhr1+82WtNf+ty2EfMpXPaovZyTJzhH4vjXZAyHnQx2StQUxZkVAh6koGNLkXIRsx+83i2NfzoCrydnntdLEBQ5kEFz1kESPSSZk2nvLepjBLhOXjBEZLCPJhMw/3ud9r9Un2CI4248RPzd/dxPjKNOgD5xeZRwFKwUFe1k7aLHW/vw7X2m24GzCsk1Gkgl5Laulf8ddWR/8xjaY3n8sm0aQb1ZYXd+fCm8hZGMPr1nhzvqgrrCN0kGgWUVjtp7pcnsgZOlJT9G1mNlKe9siAj/S2ZrMLmQRWRkW/K7IiIZJm/IpmFF+qIXY50ie+pQR81/goJ+grX2i+Xy4fMvIbdY902OSCZn2zn82K29+6O+ndIW3ELJAqij2Fsnj7PNT8pmbwF7ws5ct/uP2HN80v3svxliWzClhukpvpCGJNUixNBdsEHmd+P85rWsLIcuB7037U+26zfWxZXwFrXPamMwSWTazQqGQrtnLFkLWhpmDOu39Odbj7ywXrrJbkT0QskAZP2GT9z/84/02opEj82uErD7pZIJYOYiwpeq1b8uZkHIv+/S3/H4+cxqT4KB0nezqONae695lcR1Cns1M6duuj33wlU+ZD77JyC/LH7j1FNVIe5WnLN1xJNpECaDxX2c9bCFk2SDwn5FLrQ8uqBmfdmszou2zcrgqcjBtq8YqMJqzabYQsqwhLqpZEWvgt+7Fxvz7sy+46XLXmYA31RZmTm+mnkq/OlantKo+Yn2KkPn6pDZlDecq/VkjZO+kscmaQP69yX6sPpFmOa2OkJ9K3blNQpbz25t6M9hl/3DWEkd+92OL8VR9LJK8KLlnemugPU/L56PNh1dm+pPLbCFkQeh88OVYnZdaHyMN9xQOshFkJTQZjZ+7VXImw6l3sj6lk/YyS8jcDFvH0cnWnOboqPdMlsZV5sjqM3sgZL7FXktd025HnTLo0liaHHsHk0jQMJMxlwcCdLhC5JULgT8pZ2DM+pBHbWQK8Y07pukL2WvHSkXxReKPTY7bJGR3MPQ52asTbcnI6L9cnSPao5Q3AT5jskVsevnUHG2UVtqLI9y0vOya4n/+wiVAx3yWZ54J/ro+ZHEEByFm5FLr47qE7F6T/HXorRuqNZFTB2cJGU5bjvHDPn+52t9G2T8z43QjZfZAyBKxkVUT2mQ+cbXW2Zz9cIyQR/c8OCWkvrwzj+q8DiH377MBIScTwskwWvvIZ21jMNFtGFluk5Bvwq2U/dDyVfPpPRoMP/sW4fvNPkDWibzpJjQpF0X1cQckrtyM2X5JQr7U+rguIYvB5GC1OIp0ylkZZa/MErI6rKEtaaxcityEvWz1Q8/2barcHgg55wJuMedaJ7OfbUTIdk8LtT+dtjWtyiLuMydmXBYzA2EiSgNjxvKl9iLqTKPeEyFfZYxy4NUBnT7neHTwxuGNtUucMi5ONfbXOfqdNiyI2sQmmIleytWnzwzWEvzNAcgtLostGvKl1sdk148WG6U28tG642RWRn7oLYQsSL/llj+xBdZQLzbbmVOhs33aVG4PhJzdDXJT86mmU50yCO6q7WVEyI5J5lN1sisEm2bE7muwpcU0uSlCbu/j/+TT7H1zfhP5z9rHbWrItAqul1kxz5iU/WbY36nsPcoYx/7Sp6v4qkfjLGvCZtqEVdTfDyKnmGY0GxAamefnIuRLrY/ZsTxWjsLjLoqeU2TRyKaZFXMqWyhbCHlreqMrE/rUS+6pfv7NtvvGyu2BkLMbYWv6FrMoR+JHhCyi3x+LFDDjOjh12U8P9OhOhpsmZPUxp/mP+xupRkGp2yRkqVhbrkkdpaJlrVXfmbd9fvPWnHTvyAdeLDJaTz/O8sHdMtaE37i/vnVtgY2u7DwXIV9qfaz1eeb3rM3P3OzXv5e70ibcyxZClsbmRsBZcV9zf8+GDCeb7a3JHgg5X9rDByQFx9WTMzK6qnFEyC6zYSY32XqQgnsjH6tcI2RatSDT2iVJuZ95orhwPt/Ze5uErL1yx7Nr4Nh4IT8k2Isb7XLOadZcWSTcOaeyTXKdNuf+CPjoOC0trNfwpcQxX2eEFWNDyndxnIuQL7U+Zvq+ViZfurT15Js7tvM1sFsI2f0x7tOYFRlNveKTM0dm33Nj5fZAyPJAs9tgFBUfdVriviO5fVBQuREh5/sUpBMxT2Y0ZHfZishnvEYX1zjK7YSSieVUHxfE1ovW8xWhoxNPt03INggbxYzkOwqOHY8f+RBdiZjJ/FidNgnH6Pv0p9F9I1nr5F+msc9IvgOkPdO+AjJ6Rz6pt8WHfKn1MdP3tTL5XhnKFXdRvtpg9B4ZNf1n2VqZLYTM9yuGMHPQaoTr7P0iazhc+fc9ELLG07T6KyaRLDIbXW3Zd3Z09+oxQpYTmVOoTi2iVo8gnqPDSF8gxxV9TUbBrWyeI359mbnxynv5qOHRH5YZRatvm5CNjZOB+VRcnoz8ejSffq7Jamk32uXygpiO0Dbxfpvb2ukp76f59hcL8Um7RSzfqZ0/HmAhK7f2fUGn62RrKM/d1adrngpgXYeQL7U+rkwi3YOjm+n03YnLUyLdzbj3V/BehZA9k0+AHqs3W0nGnjV2q9/Y2wshZ3cCEN2zKw1p5LoQHOKMb0esEVhveow05NGl8Qga2R1zKViA0rNo4lwWFmJ/wspVkX3+cxv8fLUl3xqT2HfUTokAJbPLUd8mf7JcWJ/P11+SkLWbptKkfRCAr1vq0LHL5o2JbIZ+s0Xk0s2OXYKEfAWyei1X/RY1N9NIBJS4o/Jx7mOZE6Oc51OZI+aO06PmlTXjvTJE+owb3+Rzef1IrkvIl1gfN0HI3pGJzt9YFazJUWqpjZDFIsVRcNUmZ72tEXIO3iJSLkLcwMfvNOnI+jV+LLt8GtipQxv1rcpeCNmEd5dCDhTJwaSRID4kQEtlasjCEBUnnPhMo/5y62N34GYfpeeZzyYMhz5ibp8F8r5GQgjVIrZB5KixgUeiCEQ5hMNM0+acqI5YnAwS8bfR8I3SiGnViJ3JlI9ZH0v9uiQh27j6L1o7GMINQ6OQv2sM3HlMm7UwHMBxVzSCdC9ILzOHSkZBM9quY+gyZdxXYO6yVqQEGqv+KyvqO/VFF7/nTcbfZI840cfE9n7j4v3cHtK6iDQu/mcnDftsIP12ayFrysba3/x2XUK+1Pq4CTKStsl3nE+l2rwpNf5rnbm7hCXEsmhzxHxhPbW1rT3HrFiX0Lsrpol7NPiAG9Fa19aldYjo1cGiM5b9jYKeZ/naXG8t3a11Yi+ErD18ryazRT4rTrEBl3bSa0fHTGIEaYBmv2KsHTRUEXgkSuMT0DmGWx/YoeU6jbZ2Iu9YX20yyEvfRnJJQs5frLAx0XCRcJ/KtjZucj4FXWaS92kxDqBcRWwQFt6pNDZzwCbcpzGu1eWIvniCTXd0x3N7npuq34iuS8iXWh9r/Z/9nTVDkVr76nP/PmNmY2Vt9YqZDTHfAOc549BfGIXoHXsW6+k/hrDWZmMps+fY1alrz9/o73siZB0T1OEiyDvYqNPIQMCHFp0zLWjCtOSR0KqkU83UQZv1mag+G4AGdeximBxpd3qJKbzl0mxtdiLQIZFTp5wuSci0jf4mObeiiajTcGgh/SXfI8wRI5OQ33jmRGR7h4Xludlb7Fgo6pj52ow6aP3mArP5lGiz4CyTtvkYaYA2qtH9uecg5Eutj5siGHMEZtlyye/nVrB+uYO45XKmBdfE6DNhrElj18TVp9YfBcFdMO4fX+M368zGPXsW4aawOfqetQafvQGDCrRJxBvgXAZMGyagSS7Yx3yWhdB/py0neK859tXB98kdIO9QHQbSbkkDZs7a4fPZfM11AQrfNU2PL5TbAWG7h5VWly8u9wxtzARFACwBmwLNjJtDMr2AFTPZLs3UPnavbg/XJQk5B117MxJu0gHhyZ3kiyr6BQe3Ztk4jddsUDNPCVoWPz8XiA3A+5sVxe3jlKbxsmiZsFtS5NTFgpGLanwEX91zos42JnKUbTqjD59yodHi9d2Ymj+wsln1Psqb0JAbLpdYHze17lkJtGVuiXa9LR8x9xNNmMJh8+znBiWIP7nJ6EMGfsufizL+/TfyaMsUNt+3pHG3T2xxTyB9ZM5FtUVBuClc7hQhn73TVUEhUAgUAntEYI8a8h5xqjYVAoVAIXB2BIqQzw5xVVAIFAKFwBwCRchzOFWpQqAQKATOjkAR8tkhrgoKgUKgEJhDoAh5DqcqVQgUAoXA2REoQj47xFVBIVAIFAJzCBQhz+FUpQqBQqAQODsCRchnh7gqKAQKgUJgDoEi5DmcqlQhUAgUAmdHoAj57BBXBYVAIVAIzCFQhDyHU5UqBAqBQuDsCBQhnx3iqqAQKAQKgTkEipDncKpShUAhUAicHYEi5LNDXBUUAoVAITCHQBHyHE5VqhAoBAqBsyNQhHx2iKuCQqAQKATmEChCnsOpShUChUAhcHYEipDPDnFVUAgUAoXAHAJFyHM4ValCoBAoBM6OQBHy2SGuCgqBQqAQmEOgCHkOpypVCBQChcDZEShCPjvEVUEhUAgUAnMIFCHP4VSlCoFCoBA4OwL/C/PYjpCTnjTTAAAAAElFTkSuQmCC"/></switch></g></g></g><g data-cell-id="CEhTLEpK94wtDmjaM6P2-3"><g><path d="M 305 229 L 305 252.63" fill="none" stroke="#000000" stroke-miterlimit="10" pointer-events="stroke" style="stroke: rgb(0, 0, 0);"/><path d="M 305 257.88 L 301.5 250.88 L 305 252.63 L 308.5 250.88 Z" fill="#000000" stroke="#000000" stroke-miterlimit="10" pointer-events="all" style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0);"/></g><g data-cell-id="CEhTLEpK94wtDmjaM6P2-4"><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 241px; margin-left: 305px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; background-color: #ffffff; "><div style="display: inline-block; font-size: 11px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; background-color: #ffffff; white-space: nowrap; ">JDBC</div></div></div></foreignObject><image x="290.5" y="235" width="29" height="15.75" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHQAAAA/CAYAAAAxBeyIAAAAAXNSR0IArs4c6QAACm1JREFUeF7tnAWoFG0Xx881Xrsbu7sTuwsVxU5QTLDF7m4xMRC7CyxssTsudjcGJrZer/fjN3yz3+zszM7uvbvDu/ebAyLuPvOcec7/OX3WsKioqChxKNZIIMwBNNZgqRzEATR24ekAGsvwdAB1AI1tEohl53F8qANoLJNALDuOo6H/b4DeuHFDihYtannsWrVqyeHDhw3XLV++XLp162a5R1hYmCRPnlxSp04tqVKlkmzZsknFihWlUqVKUqZMGfnnn38s9zBa0KFDB1m/fr1Pz8aJE0eSJEkiyZIlU/gXKlRIKleuLI0bN5a0adP6tIcvi65cuSL79u2TCxcuyP379+Xly5fy7ds3iRs3rsI7Xbp0Cu+SJUsqvIsVK+bLttZRrp2AentjAO7Ro4f07dtXMmXK5NPh1EX+AGq2cbx48aRLly4yYcIEyZAhg1/81cV///6V1atXy6xZs+TWrVt+7VG4cGEZPny4tG3bVrh0ZmRpcv8tgKoHQEsHDRqkCBYh+0KBAFTlkyVLFtm/f78gYH/ozp070r59e0EzY0JYi7Vr10qOHDkMt7EE9OPHj7J9+3aPhy9evCjLli1zfe6PyS1RooSMHDnSY09u8KdPn+TDhw/y4sULOX36tFy/fl0iIyM91nKwjRs3CgK2Ij2gCLZp06aGj/EOmL7nz5/LpUuXFDfy48cPt7W5c+eWa9euSeLEia1YK9+zR7NmzeTr168e69OkSSPILnv27JI+fXqJHz++IHM0+OTJk/L69WuPZzD9R44cMTTDloCavfGmTZsU9VfJH0Dr1aun3HJfiMNxcebNmyevXr1yewQfx6H52xvpAZ06daoMGzbMF/by7t07GTBggKxbt85t/ezZs2XgwIGWe1y+fFmJAX79+uW2tkKFCjJ58mSpXr26qQnlcnEZxo8fL2fOnHF7HlCvXr3qcaH/9YCqp0BLevXqpfggLaHt586dkwQJEpgKNyaAqpvWqVPHLegjWMOCeCOsTalSpeTx48euZfi/uXPnSp8+fSwvg7qAhhiXUG/VuAxHjx4VgkmVQgZQ9YWnT5/uoV0EC1OmTAkqoDt37nQz05hKtNcbderUSfF3LmGHhSluonXr1j6DqV1IMDV48GC3Z3fs2KGY85AFlBfv2LGjmwlEOx8+fCiZM2c2FFQgNPTevXuSP39+N00z8u3qArQyb968bv6fCB3XEROqW7euHDp0SNmC9A6Ate4j5DSUg3z58kUJIvCvKmGOJk2aFDRAb9++reSFKpFGEbyZUe/evWXRokWur7lsDx48kIQJE8YET8EnE1M0b95catas6RHphySgSGTMmDEyceJEl3By5cqlaKkRBUJDMW0IUaUaNWoo/suI8HlErFqTzGUziuxjhK7BwyEL6JMnTyRnzpxuR6LikidPHo9jBgLQhg0bKpUdldASs+rXzZs3pUiRIm7vQSXI34JIdMAOWUA5LOkK+aJKlPfatWsXUEDRNooY48aNc+0LWJg+s1LkkiVLlIhcJXwpPtgOCmlAW7VqJVu3bnXJCaGPHTs2RoCS+1EAwAKQllCH1lZ3smbNKseOHRNMvBn179/fLfghiFuzZo0deFrXcs3ewq7CgjcpkMstXLjQtaR79+6ydOlSS0CjI1nKjFSYKCiQsngjfbpilVZF533MnglpDUUbMYcqYW6NuioxreWijYDSpk0bSZo0qaX8GzVqJHv37nWtI3ceMmSI5XOBWBDSgE6bNk0RtEoInMRdTzEFVN0vUaJE0rJlSyW69lZupIJz/Phx12ssWLBASGPsoJAGdNSoUUo9VCWiTm3DQP1cDyjrjIIndX1ERISS61IcIPjZs2eP8m+V6Jdu2LBBmjRpYohRgwYN3GrVdqUsvExIAwowBC0qUTWZMWOGpYb6U5xnM7ovlBZ5Tv2hAT6VjkfVqlU9+FHa27Jli+tzivj4XjsopAFFmHRbVCIgIjCyMrn+AqruR1GdzotK5MGkI/q+7NChQ90uFj519+7dduAZuhpKO4pa5vfv312CAlz6pMECFO0kB9VOG6CJ+FUtrVy5UpluUIn3pGqk7YoEC92Q1VD6qfgqrV97//69YRstEJUilQ9BGMGYSkap0t27d6VAgQJumDE7VLZs2WDh6No32oASTWoDC29Na/2QmD8NbjMJUFelvqoSAQotLiMKJKD6KhDdjwMHDniwZUTk6dOnrs8DWVw4ePCgUACpX7++B9+wiIiIKPwA9Uf+YFbokFsR/qpnz56uZQQCFBuMKNCAhoeHS+nSpZVDqbRr1y5lOi7YgM6fP1/69evnYmNWpNdH4JQJMdWMr8SEcDFoPyXPcuXKKZUx6swqhYWHh0fR9VeJxBnTZTUySaI8c+ZM13Peen2BBPT3799SpUoVZfxRJWqlDGGZTcMFUkMBE1BVMst9ETjgkQKpxNjJqVOnlFHN6FLnzp1l1apVrscZ8yS1Uv1zWGRkZBTzKdre4ubNm4U6qTdCQ7Q1TrPCOHsEClA0kmBDP4ZCVUZ7S/XvHShA//z5I/ny5XMbKSEPHjFihKGomE6cM2eO23f43MWLF3sdxTSTu9G0Bi08rIRLQ/nBL/Ou2oSczjxgmU21MbjEjI1KhO3Pnj0zbQ8FAlAuXNeuXd38JvwBSzvmEUyTSy6q72niprSNby3/z58/KzNF+j4t7gmZ+FJGZD8uElMJ+lzWyCoqQRGjkphdrU8icEFTU6RI4SYj/BfO+M2bN67PrYQaE0BJ6jExaIJ+6o9p+hMnTgglOW8UUw3lHSj3UbTQ/g8GBGbbtm3zyhvAGSgDXC1lzJhRiVWYnGRS3ogAkirV6NGjhfloLVWrVk0IjvSu0RXl6jsXPIwpJpLlBpL3MUrIjC6MVGIUg3FCRkLMSA+o2Vwuz3OpKLPhg7ASVGO0uabKg6ICgZD+wvmiod7mcnke0GihcYE4GymSfqaWNtrZs2dN55i074GPI8V6+/atx+sBCOAULFhQmXLAKjItyEXgsho9U7t2bSWiN7KgLkABDD9kNlZhJCg0g9TBKHzWrvf1ty1er/p/vySgoMTH7bYK3NT9AlWcV/cjCANkbz1R/Vm4oLgMtCq6xNmJntFYs8DKLQ/9+fOnULaix6g1v0YvQOhMcELobEWBAJQDEKjhw/z9GUKgAE2ZMqXSNeEdojvshWZRejx//ryV2FzfE6NQjSJF0U4eGm1gWFh49OiRrFixQmkBkaMSkHAATEL58uWVLkOLFi18Dr/9BZSxTH6Fhlnjl2+YJHhaNZbNJBQdQAlYMOe8A6kBJp6fT0QXSP27IVfqu6RfmFd+8qB2dODLlGDx4sWVFA2+vp492pUin6+Xs9BWCTiA2iru4DNzAA2+jG3l4ABqq7iDz8wBNPgytpWDA6it4g4+MwfQ4MvYVg4OoLaKO/jMHECDL2NbOTiA2iru4DNzAA2+jG3l4ABqq7iDz+x//31G8Hk5HGyQgAOoDUK2k4UDqJ3StoGXA6gNQraThQOondK2gZcDqA1CtpOFA6id0raBlwOoDUK2k4UDqJ3StoGXA6gNQraThQOondK2gdd/AGTpUcp01/CWAAAAAElFTkSuQmCC"/></switch></g></g></g></g><g data-cell-id="uDJ2bVtIrgoZBCZFZmDG-26"><g><rect x="420" y="505.61" width="150" height="105" rx="6.3" ry="6.3" fill="none" stroke="#000000" stroke-dasharray="3 3" pointer-events="all" style="stroke: rgb(0, 0, 0);"/></g><g><g transform="translate(-0.5 -0.5)"><switch><foreignObject style="overflow: visible; text-align: left;" pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 148px; height: 1px; padding-top: 558px; margin-left: 421px;"><div style="box-sizing: border-box; font-size: 0; text-align: center; color: #000000; "><div style="display: inline-block; font-size: 12px; font-family: "Helvetica"; color: #000000; line-height: 1.2; pointer-events: all; font-style: italic; white-space: normal; word-wrap: normal; ">mariadb-galera</div></div></div></foreignObject><image x="421" y="551.5" width="148" height="17" xlink:href="data:image/png;base64,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"/></switch></g></g></g></g></g></g></svg> \ No newline at end of file diff --git a/.docs/images/screenshots/dashboard_ops-logs.png b/.docs/images/screenshots/dashboard_ops-logs.png new file mode 100644 index 0000000000000000000000000000000000000000..806aba0b56db410f1691b69039f4328b155868c7 Binary files /dev/null and b/.docs/images/screenshots/dashboard_ops-logs.png differ diff --git a/.docs/index.md b/.docs/index.md index 00cd33f013139033364eea2e87ae4f6b07084893..90f0651bfe969ab84ce9a1ee09e8edd5f8b7ad0b 100644 --- a/.docs/index.md +++ b/.docs/index.md @@ -14,7 +14,7 @@ author: Martin Weise   -Documentation for version: [v1.8.1](https://gitlab.phaidra.org/fair-data-austria-db-repository/fda-services/-/releases). +Documentation for version: [v1.9.0](https://gitlab.phaidra.org/fair-data-austria-db-repository/fda-services/-/releases). DBRepo is a repository for data in databases that cover the entire data life cycle supporting data evolution, -citation and -versioning. It implements the query store of the [RDA WGDC](https://doi.org/10.1162/99608f92.be565013) on precisely diff --git a/.docs/kubernetes.md b/.docs/kubernetes.md index c1ded5fc53756dafa2e61d5d725ed08b93d56d4c..0712b72ec8a45fa4b44a369c39753bda2bc00b3b 100644 --- a/.docs/kubernetes.md +++ b/.docs/kubernetes.md @@ -6,7 +6,7 @@ author: Martin Weise To install DBRepo in your existing cluster, download the sample [ -`values.yaml`](https://gitlab.phaidra.org/fair-data-austria-db-repository/fda-services/-/blob/release-1.8/helm/dbrepo/values.yaml) +`values.yaml`](https://gitlab.phaidra.org/fair-data-austria-db-repository/fda-services/-/blob/release-1.9/helm/dbrepo/values.yaml) for your deployment and update the variables, especially `hostname`. ```shell @@ -14,7 +14,7 @@ helm upgrade --install dbrepo \ -n dbrepo \ "oci://registry.datalab.tuwien.ac.at/dbrepo/helm/dbrepo" \ --values ./values.yaml \ - --version "1.8.1" \ + --version "1.9.0" \ --create-namespace \ --cleanup-on-fail ``` diff --git a/.env b/.env index e50d4f6b5b1c15372029abec7a4fb924a70781ad..f72626ab5ef38013f5672b522006ea410925ead0 100644 --- a/.env +++ b/.env @@ -1,9 +1,13 @@ +APP_VERSION=1.9 +FLUENTBIT_VERSION=4.0.0 +GRAFANA_VERSION=11.4.0 MARIADB_VERSION=11.3.2 -POSTGRES_VERSION=17.0.0 -KEYCLOAK_VERSION=26.0.4 -RABBITMQ_VERSION=3.13.7 -OPENSEARCH_VERSION=2.10.0 -NGINX_VERSION=1.27.3-alpine3.20-slim +KEYCLOAK_VERSION=26.2.4 +MYSQLD_EXPORTER_VERSION=0.15.1 +NGINX_VERSION=1.28.0 OPENLDAP_VERSION=2.6.8 -SEAWEEDFS_VERSION=3.71.0 -PROMETHEUS_VERSION=2.54.1 \ No newline at end of file +OPENSEARCH_VERSION=2.18.0 +POSTGRES_VERSION=17.0.0 +PROMETHEUS_VERSION=2.54.1 +RABBITMQ_VERSION=3.13.1 +SEAWEEDFS_VERSION=3.87.0 diff --git a/.gitignore b/.gitignore index 1d310a889367bcad02106b1465d5b52deecd0cbb..e3181c1faa7031474b35ea0580e15852ce977c24 100644 --- a/.gitignore +++ b/.gitignore @@ -56,6 +56,9 @@ fda-ui/ root.crt intermediate.crt +# secret +.s3cfg + # scanning .trivy/trivy-*.json diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 628e6e1843ea9a30f52b0ac8e5cca305078f0eb1..da7a22ae1ef77aab6291387834de4852c6f6a3a6 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -11,12 +11,12 @@ variables: SONARQUBE_VERSION: "10.0" REGCLIENT_VERSION: "0.8.2" BUN_VERSION: "1.1.40" - DOC_VERSION: "1.8" - APP_VERSION: "1.8.1" - CHART_VERSION: "1.8.1" - SUPPORTED_VERSIONS: "1.7.3, 1.8.0, 1.8.1" + DOC_VERSION: "1.9" + APP_VERSION: "1.9.0" + CHART_VERSION: "1.9.0" + SUPPORTED_VERSIONS: "1.8.0, 1.8.1, 1.8.2, 1.9.0" SUPPORTED_ARCH: "linux/amd64" - MAINTAINED_SERVICES: "analyse-service, auth-service-init, dashboard-service, dashboard-service-init, data-service, metadata-service, search-db, search-service, search-service-init, storage-service-init, ui" + MAINTAINED_SERVICES: "analyse-service, auth-service-init, dashboard-service, dashboard-service-init, data-service, metadata-service, search-service, search-service-init, storage-service-init, ui" CACHE_FALLBACK_KEY: "${CI_DEFAULT_BRANCH}" # This will supress any download for dependencies and plugins or upload messages which would clutter the console log. # `showDateTime` will show the passed time in milliseconds. You need to specify `--batch-mode` to make this work. @@ -62,7 +62,6 @@ lint-docker-compose: - 'apk add --no-cache bash wget' - 'wget https://github.com/mikefarah/yq/releases/download/v${VERSION}/${BINARY} -O /usr/bin/yq && chmod +x /usr/bin/yq' script: - - "bash .scripts/check-compose.sh" - "diff <(yq '.volumes' docker-compose.yml) <(yq '.volumes' .docker/docker-compose.yml)" - "IGNORE_IMAGE=1 IGNORE_PORTS=1 bash .scripts/check-service.sh 'dbrepo-analyse-service'" - "IGNORE_PORTS=1 bash .scripts/check-service.sh 'dbrepo-auth-db'" @@ -71,10 +70,12 @@ lint-docker-compose: - "IGNORE_IMAGE=1 IGNORE_PORTS=1 bash .scripts/check-service.sh 'dbrepo-broker-service'" - "IGNORE_PORTS=1 bash .scripts/check-service.sh 'dbrepo-dashboard-service'" - "bash .scripts/check-service.sh 'dbrepo-data-db'" + - "IGNORE_VOLUMES=1 bash .scripts/check-service.sh 'dbrepo-data-db-metrics'" - "IGNORE_IMAGE=1 IGNORE_PORTS=1 bash .scripts/check-service.sh 'dbrepo-data-service'" - "IGNORE_VOLUMES=1 bash .scripts/check-service.sh 'dbrepo-gateway-service'" - "IGNORE_VOLUMES=1 IGNORE_PORTS=1 bash .scripts/check-service.sh 'dbrepo-identity-service'" - "IGNORE_VOLUMES=1 bash .scripts/check-service.sh 'dbrepo-metadata-db'" + - "IGNORE_VOLUMES=1 bash .scripts/check-service.sh 'dbrepo-metadata-db-metrics'" - "IGNORE_IMAGE=1 IGNORE_PORTS=1 bash .scripts/check-service.sh 'dbrepo-metadata-service'" - "IGNORE_VOLUMES=1 IGNORE_PORTS=1 bash .scripts/check-service.sh 'dbrepo-metric-db'" - "bash .scripts/check-service.sh 'dbrepo-search-db'" @@ -179,7 +180,7 @@ build-analyse-service: PIPENV_PIPFILE: "./dbrepo-analyse-service/Pipfile" script: - "pip install pipenv" - - "pipenv install gunicorn && pipenv install --dev --system --deploy" + - "pipenv install --dev --system --deploy" build-python-lib: image: docker.io/python:${PYTHON_VERSION}-alpine${ALPINE_VERSION} @@ -191,7 +192,7 @@ build-python-lib: PIPENV_PIPFILE: "./lib/python/Pipfile" script: - "pip install pipenv" - - "pipenv install gunicorn && pipenv install --dev --system --deploy" + - "pipenv install --dev --system --deploy" build-java-lib: image: maven:3-openjdk-${JAVA_VERSION} @@ -352,14 +353,17 @@ test-analyse-service: - build-analyse-service dependencies: - build-analyse-service - script: + before_script: - "pip install pipenv" - - "pipenv install gunicorn && pipenv install --dev --system --deploy" + - "pipenv install --dev --system --deploy" + - "mkdir -p /var/log/app/service/analyse" + script: - cd ./dbrepo-analyse-service/ && coverage run --rcfile=.coveragerc -m pytest tests/test_determine_dt.py tests/test_determine_pk.py && coverage html && coverage xml && coverage report > ./coverage.txt - "cat ./coverage.txt | grep -o 'TOTAL[^%]*%'" artifacts: when: always paths: + - /var/log/app/service/analyse/app.log - ./dbrepo-analyse-service/coverage.xml - ./dbrepo-analyse-service/coverage.txt expire_in: 1 days @@ -378,7 +382,7 @@ test-auth-service-init: before_script: - "apk add --no-cache alpine-sdk gcc python3-dev mariadb-connector-c-dev" - "pip install pipenv" - - "pipenv install gunicorn && pipenv install --dev --system --deploy" + - "pipenv install --dev --system --deploy" script: - cd ./dbrepo-auth-service/init/ && coverage run --rcfile=.coveragerc -m pytest tests/test_unit_app.py && coverage html && coverage xml && coverage report > ./coverage.txt - "cat ./coverage.txt | grep -o 'TOTAL[^%]*%'" @@ -404,14 +408,17 @@ test-search-service: - build-search-service dependencies: - build-search-service - script: + before_script: - "pip install pipenv" - - "pipenv install gunicorn && pipenv install --dev --system --deploy" + - "pipenv install --dev --system --deploy" + - "mkdir -p /var/log/app/service/search" + script: - cd ./dbrepo-search-service/ && coverage run --rcfile=.coveragerc -m pytest tests/test_app.py && coverage html && coverage xml && coverage report > ./coverage.txt - "cat ./coverage.txt | grep -o 'TOTAL[^%]*%'" artifacts: when: always paths: + - /var/log/app/service/search/app.log - ./dbrepo-search-service/coverage.xml - ./dbrepo-search-service/coverage.txt expire_in: 1 days @@ -431,14 +438,17 @@ test-dashboard-service: - build-dashboard-service dependencies: - build-dashboard-service - script: + before_script: - "pip install pipenv" - - "pipenv install gunicorn && pipenv install --dev --system --deploy" + - "pipenv install --dev --system --deploy" + - "mkdir -p /var/log/app/service/dashboard" + script: - cd ./dbrepo-dashboard-service/ && coverage run --rcfile=.coveragerc -m pytest tests/test_integration_app.py && coverage html && coverage xml && coverage report > ./coverage.txt - "cat ./coverage.txt | grep -o 'TOTAL[^%]*%'" artifacts: when: always paths: + - /var/log/app/service/dashboard/app.log - ./dbrepo-dashboard-service/coverage.xml - ./dbrepo-dashboard-service/coverage.txt expire_in: 1 days @@ -460,8 +470,8 @@ test-python-lib: - build-python-lib script: - "pip install pipenv" - - "pipenv install gunicorn && pipenv install --dev --system --deploy" - - cd ./lib/python/ && coverage run --rcfile=.coveragerc -m pytest tests/test_unit_container.py tests/test_unit_messages.py tests/test_unit_image.py tests/test_unit_concept.py tests/test_unit_database.py tests/test_unit_identifier.py tests/test_unit_license.py tests/test_unit_query.py tests/test_unit_rest_client.py tests/test_unit_table.py tests/test_unit_user.py tests/test_unit_view.py tests/test_unit_unit.py && coverage html && coverage xml && coverage report > ./coverage.txt + - "pipenv install --dev --system --deploy" + - cd ./lib/python/ && coverage run --rcfile=.coveragerc -m pytest tests/test_unit_container.py tests/test_unit_messages.py tests/test_unit_image.py tests/test_unit_concept.py tests/test_unit_database.py tests/test_unit_identifier.py tests/test_unit_license.py tests/test_unit_query.py tests/test_unit_rest_client.py tests/test_unit_table.py tests/test_unit_user.py tests/test_unit_view.py tests/test_unit_unit.py tests/test_unit_dashboard.py && coverage html && coverage xml && coverage report > ./coverage.txt - "cat ./coverage.txt | grep -o 'TOTAL[^%]*%'" artifacts: when: always @@ -550,6 +560,7 @@ release-images: - "echo ${CI_REGISTRY2_PASSWORD} | docker login --username ${CI_REGISTRY2_USER} --password-stdin ${CI_REGISTRY2_URL}" script: - "make release-images" + - "APP_VERSION=$DOC_VERSION make release-images" release-helm: stage: release @@ -566,24 +577,22 @@ release-helm: - "echo ${CI_REGISTRY_PASSWORD} | docker login --username ${CI_REGISTRY_USER} --password-stdin ${CI_REGISTRY_URL}" - "docker logout ${CI_REGISTRY2_URL}" - "echo ${CI_REGISTRY2_PASSWORD} | docker login --username ${CI_REGISTRY2_USER} --password-stdin ${CI_REGISTRY2_URL}" - - "mkdir -p ~/.gnupg" - - echo "$CI_GPG_KEYRING" | base64 -d > ./secring.gpg - - echo "$CI_GPG_KEYRING2" | base64 -d > ./pubring.gpg + - echo "$CI_GPG_KEYRING" | base64 -d > ~/secring.gpg + - echo "$CI_GPG_KEYRING2" | base64 -d > ~/pubring.gpg - helm registry login --username "${CI_REGISTRY_USER}" --password "${CI_REGISTRY_PASSWORD}" "${CI_REGISTRY_URL}" - helm registry login --username "${CI_REGISTRY2_USER}" --password "${CI_REGISTRY2_PASSWORD}" "${CI_REGISTRY2_URL}" - make build-helm - - "helm package ./helm/dbrepo --sign --key 'Martin Weise' --keyring ./secring.gpg --destination ./build" + - "helm package ./helm/dbrepo --sign --key 'Martin Weise' --keyring ~/secring.gpg --destination ./build" - "helm plugin install https://github.com/sigstore/helm-sigstore" script: - "helm push ./build/dbrepo-${CHART_VERSION}.tgz oci://${CI_REGISTRY2_URL}/helm" - - "helm sigstore upload --keyring ./pubring.gpg ./build/dbrepo-${CHART_VERSION}.tgz" + - "helm sigstore upload --keyring ~/secring.gpg ./build/dbrepo-${CHART_VERSION}.tgz" release-docs: stage: release image: docker.io/python:${PYTHON_VERSION}-alpine${ALPINE_VERSION} only: - refs: - - /^release-.*/ + - tags before_script: - "apk add --no-cache alpine-sdk bash sed wget openssh jq curl" - "pip install pipenv" @@ -618,14 +627,14 @@ release-libs: only: - tags variables: - PIPENV_PIPFILE: "./dbrepo-analyse-service/Pipfile" + PIPENV_PIPFILE: "./lib/python/Pipfile" before_script: - "pip install pipenv twine build" - - "pipenv install gunicorn && pipenv install --dev --system --deploy" - - "echo ${CI_PIPYRC} | base64 -d > /app/.pypirc" + - "pipenv install --dev --system --deploy" + - "echo ${CI_PIPYRC} | base64 -d > ./.pypirc" script: - - "python -m build" - - "python -m twine upload --config-file /app/.pypirc --verbose --repository pypi ./lib/python/dist/dbrepo-*" + - "python -m build ./lib/python" + - "python -m twine upload --config-file ./.pypirc --verbose --repository pypi ./lib/python/dist/dbrepo-*" verify-install-script: image: docker.io/docker:${DOCKER_VERSION}-dind @@ -668,14 +677,25 @@ scan-sonarqube: only: - master needs: - - build-data-service - build-java-lib - dependencies: + - test-analyse-service + - test-dashboard-service - build-data-service + - test-data-service + - build-metadata-service + - test-metadata-service + - test-search-service + dependencies: - build-java-lib + - test-analyse-service + - test-dashboard-service + - build-data-service + - test-data-service + - build-metadata-service + - test-metadata-service + - test-search-service script: - 'sonar-scanner -Dsonar.token="${CI_SONAR_TOKEN}"' - allow_failure: true cache: policy: pull key: "${CI_COMMIT_SHORT_SHA}" diff --git a/.gitlab/check-supported-images.sh b/.gitlab/check-supported-images.sh index 2f1f804e5dd5edc0d0b252ed6d1ecfed33863e69..4c00c7d40bcd134716a0964747708304b2042e13 100755 --- a/.gitlab/check-supported-images.sh +++ b/.gitlab/check-supported-images.sh @@ -1,13 +1,13 @@ #!/bin/bash echo "Starting registry check ..." -if [ -z $SUPPORTED_VERSIONS ]; then +if [[ -z $SUPPORTED_VERSIONS ]]; then echo "[ERROR] Missing environment variable SUPPORTED_VERSIONS" > /dev/stderr exit 1 -elif [ -z $MAINTAINED_SERVICES ]; then +elif [[ -z $MAINTAINED_SERVICES ]]; then echo "[ERROR] Missing environment variable MAINTAINED_SERVICES" > /dev/stderr exit 1 -elif [ -z $CI_REGISTRY2_URL ]; then +elif [[ -z $CI_REGISTRY2_URL ]]; then echo "[ERROR] Missing environment variable CI_REGISTRY2_URL" > /dev/stderr exit 1 fi diff --git a/.jupyter/Pipfile.lock b/.jupyter/Pipfile.lock index 79ba2b095adfd78ee2de1ff28da4e9ea2ed8e3b7..ccef0d6cb2da3a33509c99d1d066fb0e1152242d 100644 --- a/.jupyter/Pipfile.lock +++ b/.jupyter/Pipfile.lock @@ -1789,7 +1789,7 @@ "sha256:b18e7a3966d99871aefeb00cfbcfdced55ce4871194810fc71f4aa484b953abf" ], "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5'", - "version": "==1.8.3" + "version": "==1.9.0" }, "setuptools": { "hashes": [ diff --git a/.s3cfg b/.s3cfg new file mode 100644 index 0000000000000000000000000000000000000000..5d33284185529b63eca11f14dad396e3b3485cfb --- /dev/null +++ b/.s3cfg @@ -0,0 +1,8 @@ +access_key = seaweedfsadmin +secret_key = seaweedfsadmin +# Setup endpoint +host_base = http://localhost:9000 +host_bucket = dbrepo +use_https = False +# Enable S3 v4 signature APIs +signature_v2 = False \ No newline at end of file diff --git a/.scripts/check-compose.sh b/.scripts/check-compose.sh deleted file mode 100644 index 82f1a5170701886910ca6a36453aeab1ce1be625..0000000000000000000000000000000000000000 --- a/.scripts/check-compose.sh +++ /dev/null @@ -1,6 +0,0 @@ -#!/bin/bash -OUTPUT=$(cat .docker/docker-compose.yml | grep "registry.datalab.tuwien.ac.at/.*" | grep -v "$APP_VERSION") -if [ $? -ne 1 ]; then - echo "[ERROR] Some image version(s) differ from APP_VERSION=${APP_VERSION}: ${OUTPUT}" - exit 1 -fi \ No newline at end of file diff --git a/Makefile b/Makefile index 9cea35dc63e1886e3e7e43aa01c1208485434333..738831a4cfb224d2b584d2e82d646579129698ad 100644 --- a/Makefile +++ b/Makefile @@ -1,7 +1,7 @@ .PHONY: all -APP_VERSION ?= 1.8.1 -CHART_VERSION ?= 1.8.1 +APP_VERSION ?= 1.9.0 +CHART_VERSION ?= 1.9.0 REPOSITORY_URL ?= registry.datalab.tuwien.ac.at/dbrepo .PHONY: all diff --git a/dbrepo-analyse-service/Dockerfile b/dbrepo-analyse-service/Dockerfile index df313ec934c825ab20b71da9a29f6e3f272a3462..7799c7ddb68ea17a5d2cae3d5237c54941937cd5 100644 --- a/dbrepo-analyse-service/Dockerfile +++ b/dbrepo-analyse-service/Dockerfile @@ -18,6 +18,9 @@ RUN adduser -D dbrepo --uid 1001 WORKDIR /app +RUN mkdir -p /var/log/app/service/analyse && \ + chown -R 1001:1001 /var/log/app + USER 1001 COPY --chown=1001 ./api ./api diff --git a/dbrepo-analyse-service/Pipfile b/dbrepo-analyse-service/Pipfile index 8cb9789d513dfc24b559e8990bff52f43e290c35..43e053c6bd4a2eca2c6f398aa2e86acf3285dc6b 100644 --- a/dbrepo-analyse-service/Pipfile +++ b/dbrepo-analyse-service/Pipfile @@ -21,7 +21,7 @@ numpy = "*" pandas = "*" minio = "*" pydantic = "*" -dbrepo = {path = "./lib/dbrepo-1.8.1.tar.gz"} +dbrepo = {path = "./lib/dbrepo-1.9.0.tar.gz"} opensearch-py = "*" [dev-packages] diff --git a/dbrepo-analyse-service/Pipfile.lock b/dbrepo-analyse-service/Pipfile.lock index 4963f0350992bc1b8618597e18bba7bd55c49b17..870fc98f95e53c9b3836438f248a155d9e76ac29 100644 --- a/dbrepo-analyse-service/Pipfile.lock +++ b/dbrepo-analyse-service/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "e18008deb4793bde6240af86bc1327468c915b17034ddc88114495249b3b2fce" + "sha256": "c030ceb850cff7827f79ed1dfba622c39597c78fec39d4acddc80d57efa1da49" }, "pipfile-spec": 6, "requires": { @@ -16,109 +16,6 @@ ] }, "default": { - "aiohappyeyeballs": { - "hashes": [ - "sha256:c3f9d0113123803ccadfdf3f0faa505bc78e6a72d1cc4806cbd719826e943558", - "sha256:f349ba8f4b75cb25c99c5c2d84e997e485204d2902a9597802b0371f09331fb8" - ], - "markers": "python_version >= '3.9'", - "version": "==2.6.1" - }, - "aiohttp": { - "hashes": [ - "sha256:004511d3413737700835e949433536a2fe95a7d0297edd911a1e9705c5b5ea43", - "sha256:0902e887b0e1d50424112f200eb9ae3dfed6c0d0a19fc60f633ae5a57c809656", - "sha256:09b00dd520d88eac9d1768439a59ab3d145065c91a8fab97f900d1b5f802895e", - "sha256:0a2f451849e6b39e5c226803dcacfa9c7133e9825dcefd2f4e837a2ec5a3bb98", - "sha256:0a950c2eb8ff17361abd8c85987fd6076d9f47d040ebffce67dce4993285e973", - "sha256:0ad1fb47da60ae1ddfb316f0ff16d1f3b8e844d1a1e154641928ea0583d486ed", - "sha256:13ceac2c5cdcc3f64b9015710221ddf81c900c5febc505dbd8f810e770011540", - "sha256:14461157d8426bcb40bd94deb0450a6fa16f05129f7da546090cebf8f3123b0f", - "sha256:16f8a2c9538c14a557b4d309ed4d0a7c60f0253e8ed7b6c9a2859a7582f8b1b8", - "sha256:17ae4664031aadfbcb34fd40ffd90976671fa0c0286e6c4113989f78bebab37a", - "sha256:1ce63ae04719513dd2651202352a2beb9f67f55cb8490c40f056cea3c5c355ce", - "sha256:23a15727fbfccab973343b6d1b7181bfb0b4aa7ae280f36fd2f90f5476805682", - "sha256:2540ddc83cc724b13d1838026f6a5ad178510953302a49e6d647f6e1de82bc34", - "sha256:37dcee4906454ae377be5937ab2a66a9a88377b11dd7c072df7a7c142b63c37c", - "sha256:38bea84ee4fe24ebcc8edeb7b54bf20f06fd53ce4d2cc8b74344c5b9620597fd", - "sha256:3ab3367bb7f61ad18793fea2ef71f2d181c528c87948638366bf1de26e239183", - "sha256:3ad1d59fd7114e6a08c4814983bb498f391c699f3c78712770077518cae63ff7", - "sha256:3b4e6db8dc4879015b9955778cfb9881897339c8fab7b3676f8433f849425913", - "sha256:3e061b09f6fa42997cf627307f220315e313ece74907d35776ec4373ed718b86", - "sha256:42864e70a248f5f6a49fdaf417d9bc62d6e4d8ee9695b24c5916cb4bb666c802", - "sha256:493910ceb2764f792db4dc6e8e4b375dae1b08f72e18e8f10f18b34ca17d0979", - "sha256:4d0c970c0d602b1017e2067ff3b7dac41c98fef4f7472ec2ea26fd8a4e8c2149", - "sha256:54eb3aead72a5c19fad07219acd882c1643a1027fbcdefac9b502c267242f955", - "sha256:56a3443aca82abda0e07be2e1ecb76a050714faf2be84256dae291182ba59049", - "sha256:576f5ca28d1b3276026f7df3ec841ae460e0fc3aac2a47cbf72eabcfc0f102e1", - "sha256:58ede86453a6cf2d6ce40ef0ca15481677a66950e73b0a788917916f7e35a0bb", - "sha256:61c721764e41af907c9d16b6daa05a458f066015abd35923051be8705108ed17", - "sha256:634d96869be6c4dc232fc503e03e40c42d32cfaa51712aee181e922e61d74814", - "sha256:696ef00e8a1f0cec5e30640e64eca75d8e777933d1438f4facc9c0cdf288a810", - "sha256:69a2cbd61788d26f8f1e626e188044834f37f6ae3f937bd9f08b65fc9d7e514e", - "sha256:6a792ce34b999fbe04a7a71a90c74f10c57ae4c51f65461a411faa70e154154e", - "sha256:6ac13b71761e49d5f9e4d05d33683bbafef753e876e8e5a7ef26e937dd766713", - "sha256:6fdec0213244c39973674ca2a7f5435bf74369e7d4e104d6c7473c81c9bcc8c4", - "sha256:72b1b03fb4655c1960403c131740755ec19c5898c82abd3961c364c2afd59fe7", - "sha256:745f1ed5e2c687baefc3c5e7b4304e91bf3e2f32834d07baaee243e349624b24", - "sha256:776c8e959a01e5e8321f1dec77964cb6101020a69d5a94cd3d34db6d555e01f7", - "sha256:780df0d837276276226a1ff803f8d0fa5f8996c479aeef52eb040179f3156cbd", - "sha256:78e6e23b954644737e385befa0deb20233e2dfddf95dd11e9db752bdd2a294d3", - "sha256:7951decace76a9271a1ef181b04aa77d3cc309a02a51d73826039003210bdc86", - "sha256:7ba92a2d9ace559a0a14b03d87f47e021e4fa7681dc6970ebbc7b447c7d4b7cd", - "sha256:7f6428fee52d2bcf96a8aa7b62095b190ee341ab0e6b1bcf50c615d7966fd45b", - "sha256:87944bd16b7fe6160607f6a17808abd25f17f61ae1e26c47a491b970fb66d8cb", - "sha256:87a6e922b2b2401e0b0cf6b976b97f11ec7f136bfed445e16384fbf6fd5e8602", - "sha256:8cb0688a8d81c63d716e867d59a9ccc389e97ac7037ebef904c2b89334407180", - "sha256:8df6612df74409080575dca38a5237282865408016e65636a76a2eb9348c2567", - "sha256:911a6e91d08bb2c72938bc17f0a2d97864c531536b7832abee6429d5296e5b27", - "sha256:92b7ee222e2b903e0a4b329a9943d432b3767f2d5029dbe4ca59fb75223bbe2e", - "sha256:938f756c2b9374bbcc262a37eea521d8a0e6458162f2a9c26329cc87fdf06534", - "sha256:9756d9b9d4547e091f99d554fbba0d2a920aab98caa82a8fb3d3d9bee3c9ae85", - "sha256:98b88a2bf26965f2015a771381624dd4b0839034b70d406dc74fd8be4cc053e3", - "sha256:9b751a6306f330801665ae69270a8a3993654a85569b3469662efaad6cf5cc50", - "sha256:a2a450bcce4931b295fc0848f384834c3f9b00edfc2150baafb4488c27953de6", - "sha256:a3814760a1a700f3cfd2f977249f1032301d0a12c92aba74605cfa6ce9f78489", - "sha256:a5abcbba9f4b463a45c8ca8b7720891200658f6f46894f79517e6cd11f3405ca", - "sha256:a6db7458ab89c7d80bc1f4e930cc9df6edee2200127cfa6f6e080cf619eddfbd", - "sha256:ad497f38a0d6c329cb621774788583ee12321863cd4bd9feee1effd60f2ad133", - "sha256:ad9509ffb2396483ceacb1eee9134724443ee45b92141105a4645857244aecc8", - "sha256:bbcba75fe879ad6fd2e0d6a8d937f34a571f116a0e4db37df8079e738ea95c71", - "sha256:c10d85e81d0b9ef87970ecbdbfaeec14a361a7fa947118817fcea8e45335fa46", - "sha256:c15b2271c44da77ee9d822552201180779e5e942f3a71fb74e026bf6172ff287", - "sha256:ca37057625693d097543bd88076ceebeb248291df9d6ca8481349efc0b05dcd0", - "sha256:cc3a145479a76ad0ed646434d09216d33d08eef0d8c9a11f5ae5cdc37caa3540", - "sha256:ccf10f16ab498d20e28bc2b5c1306e9c1512f2840f7b6a67000a517a4b37d5ee", - "sha256:cd464ba806e27ee24a91362ba3621bfc39dbbb8b79f2e1340201615197370f7c", - "sha256:d007aa39a52d62373bd23428ba4a2546eed0e7643d7bf2e41ddcefd54519842c", - "sha256:d0666afbe984f6933fe72cd1f1c3560d8c55880a0bdd728ad774006eb4241ecd", - "sha256:d07502cc14ecd64f52b2a74ebbc106893d9a9717120057ea9ea1fd6568a747e7", - "sha256:d489d9778522fbd0f8d6a5c6e48e3514f11be81cb0a5954bdda06f7e1594b321", - "sha256:df7db76400bf46ec6a0a73192b14c8295bdb9812053f4fe53f4e789f3ea66bbb", - "sha256:e3538bc9fe1b902bef51372462e3d7c96fce2b566642512138a480b7adc9d508", - "sha256:e87fd812899aa78252866ae03a048e77bd11b80fb4878ce27c23cade239b42b2", - "sha256:ecdb8173e6c7aa09eee342ac62e193e6904923bd232e76b4157ac0bfa670609f", - "sha256:f244b8e541f414664889e2c87cac11a07b918cb4b540c36f7ada7bfa76571ea2", - "sha256:f4065145bf69de124accdd17ea5f4dc770da0a6a6e440c53f6e0a8c27b3e635c", - "sha256:f420bfe862fb357a6d76f2065447ef6f484bc489292ac91e29bc65d2d7a2c84d", - "sha256:f6ddd90d9fb4b501c97a4458f1c1720e42432c26cb76d28177c5b5ad4e332601", - "sha256:fa73e8c2656a3653ae6c307b3f4e878a21f87859a9afab228280ddccd7369d71", - "sha256:fadbb8f1d4140825069db3fedbbb843290fd5f5bc0a5dbd7eaf81d91bf1b003b", - "sha256:fb3d0cc5cdb926090748ea60172fa8a213cec728bd6c54eae18b96040fcd6227", - "sha256:fb46bb0f24813e6cede6cc07b1961d4b04f331f7112a23b5e21f567da4ee50aa", - "sha256:fd36c119c5d6551bce374fcb5c19269638f8d09862445f85a5a48596fd59f4bb" - ], - "markers": "python_version >= '3.9'", - "version": "==3.11.16" - }, - "aiosignal": { - "hashes": [ - "sha256:45cde58e409a301715980c2b01d0c28bdde3770d8290b5eb2173759d9acb31a5", - "sha256:a8c255c66fafb1e499c9351d0bf32ff2d8a0321595ebac3b93713656d2436f54" - ], - "markers": "python_version >= '3.9'", - "version": "==1.3.2" - }, "annotated-types": { "hashes": [ "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53", @@ -180,27 +77,27 @@ }, "boto3": { "hashes": [ - "sha256:4390317a1578af73f1514651bd180ba25802dcbe0a23deafa13851d54d3c3203", - "sha256:7b1b1bc69762975824e5a5d570880abebf634f7594f88b3dc175e8800f35be1a" + "sha256:d57d8040d04b8fefb7439062529653701cc90d5b2734cc4f1144fedb75ba94a7", + "sha256:fdd69f23e6216a508bbc1fbda9486791c161f3ecd5933ac7090d7290f6f2d0f5" ], "index": "pypi", - "version": "==1.37.33" + "version": "==1.38.19" }, "botocore": { "hashes": [ - "sha256:09b213b0d0500040f85c7daee912ea767c724e43ed61909e624c803ff6925222", - "sha256:4a167dfecae51e9140de24067de1c339acde5ade3dad524a4600ac2c72055e23" + "sha256:796b948c05017eb33385b798990cd91ed4af0e881eb9eb1ee6e17666be02abc9", + "sha256:f937a20e75889215a99280ea0fdd4e1716ffede23e4f9af7bc9c64af9bc63e61" ], - "markers": "python_version >= '3.8'", - "version": "==1.37.33" + "markers": "python_version >= '3.9'", + "version": "==1.38.19" }, "certifi": { "hashes": [ - "sha256:3d5da6925056f6f18f119200434a4780a94263f10d1c21d032a6f6b2baa20651", - "sha256:ca78db4565a652026a4db2bcdf68f2fb589ea80d0be70e03929ed730746b84fe" + "sha256:0a816057ea3cdefcef70270d2c515e4506bbc954f417fa5ade2021213bb8f0c6", + "sha256:30350364dfe371162649852c63336a15c70c6510c2ad5015b21c2345311805f3" ], "markers": "python_version >= '3.6'", - "version": "==2025.1.31" + "version": "==2025.4.26" }, "cffi": { "hashes": [ @@ -277,157 +174,160 @@ }, "charset-normalizer": { "hashes": [ - "sha256:0167ddc8ab6508fe81860a57dd472b2ef4060e8d378f0cc555707126830f2537", - "sha256:01732659ba9b5b873fc117534143e4feefecf3b2078b0a6a2e925271bb6f4cfa", - "sha256:01ad647cdd609225c5350561d084b42ddf732f4eeefe6e678765636791e78b9a", - "sha256:04432ad9479fa40ec0f387795ddad4437a2b50417c69fa275e212933519ff294", - "sha256:0907f11d019260cdc3f94fbdb23ff9125f6b5d1039b76003b5b0ac9d6a6c9d5b", - "sha256:0924e81d3d5e70f8126529951dac65c1010cdf117bb75eb02dd12339b57749dd", - "sha256:09b26ae6b1abf0d27570633b2b078a2a20419c99d66fb2823173d73f188ce601", - "sha256:09b5e6733cbd160dcc09589227187e242a30a49ca5cefa5a7edd3f9d19ed53fd", - "sha256:0af291f4fe114be0280cdd29d533696a77b5b49cfde5467176ecab32353395c4", - "sha256:0f55e69f030f7163dffe9fd0752b32f070566451afe180f99dbeeb81f511ad8d", - "sha256:1a2bc9f351a75ef49d664206d51f8e5ede9da246602dc2d2726837620ea034b2", - "sha256:22e14b5d70560b8dd51ec22863f370d1e595ac3d024cb8ad7d308b4cd95f8313", - "sha256:234ac59ea147c59ee4da87a0c0f098e9c8d169f4dc2a159ef720f1a61bbe27cd", - "sha256:2369eea1ee4a7610a860d88f268eb39b95cb588acd7235e02fd5a5601773d4fa", - "sha256:237bdbe6159cff53b4f24f397d43c6336c6b0b42affbe857970cefbb620911c8", - "sha256:28bf57629c75e810b6ae989f03c0828d64d6b26a5e205535585f96093e405ed1", - "sha256:2967f74ad52c3b98de4c3b32e1a44e32975e008a9cd2a8cc8966d6a5218c5cb2", - "sha256:2a75d49014d118e4198bcee5ee0a6f25856b29b12dbf7cd012791f8a6cc5c496", - "sha256:2bdfe3ac2e1bbe5b59a1a63721eb3b95fc9b6817ae4a46debbb4e11f6232428d", - "sha256:2d074908e1aecee37a7635990b2c6d504cd4766c7bc9fc86d63f9c09af3fa11b", - "sha256:2fb9bd477fdea8684f78791a6de97a953c51831ee2981f8e4f583ff3b9d9687e", - "sha256:311f30128d7d333eebd7896965bfcfbd0065f1716ec92bd5638d7748eb6f936a", - "sha256:329ce159e82018d646c7ac45b01a430369d526569ec08516081727a20e9e4af4", - "sha256:345b0426edd4e18138d6528aed636de7a9ed169b4aaf9d61a8c19e39d26838ca", - "sha256:363e2f92b0f0174b2f8238240a1a30142e3db7b957a5dd5689b0e75fb717cc78", - "sha256:3a3bd0dcd373514dcec91c411ddb9632c0d7d92aed7093b8c3bbb6d69ca74408", - "sha256:3bed14e9c89dcb10e8f3a29f9ccac4955aebe93c71ae803af79265c9ca5644c5", - "sha256:44251f18cd68a75b56585dd00dae26183e102cd5e0f9f1466e6df5da2ed64ea3", - "sha256:44ecbf16649486d4aebafeaa7ec4c9fed8b88101f4dd612dcaf65d5e815f837f", - "sha256:4532bff1b8421fd0a320463030c7520f56a79c9024a4e88f01c537316019005a", - "sha256:49402233c892a461407c512a19435d1ce275543138294f7ef013f0b63d5d3765", - "sha256:4c0907b1928a36d5a998d72d64d8eaa7244989f7aaaf947500d3a800c83a3fd6", - "sha256:4d86f7aff21ee58f26dcf5ae81a9addbd914115cdebcbb2217e4f0ed8982e146", - "sha256:5777ee0881f9499ed0f71cc82cf873d9a0ca8af166dfa0af8ec4e675b7df48e6", - "sha256:5df196eb874dae23dcfb968c83d4f8fdccb333330fe1fc278ac5ceeb101003a9", - "sha256:619a609aa74ae43d90ed2e89bdd784765de0a25ca761b93e196d938b8fd1dbbd", - "sha256:6e27f48bcd0957c6d4cb9d6fa6b61d192d0b13d5ef563e5f2ae35feafc0d179c", - "sha256:6ff8a4a60c227ad87030d76e99cd1698345d4491638dfa6673027c48b3cd395f", - "sha256:73d94b58ec7fecbc7366247d3b0b10a21681004153238750bb67bd9012414545", - "sha256:7461baadb4dc00fd9e0acbe254e3d7d2112e7f92ced2adc96e54ef6501c5f176", - "sha256:75832c08354f595c760a804588b9357d34ec00ba1c940c15e31e96d902093770", - "sha256:7709f51f5f7c853f0fb938bcd3bc59cdfdc5203635ffd18bf354f6967ea0f824", - "sha256:78baa6d91634dfb69ec52a463534bc0df05dbd546209b79a3880a34487f4b84f", - "sha256:7974a0b5ecd505609e3b19742b60cee7aa2aa2fb3151bc917e6e2646d7667dcf", - "sha256:7a4f97a081603d2050bfaffdefa5b02a9ec823f8348a572e39032caa8404a487", - "sha256:7b1bef6280950ee6c177b326508f86cad7ad4dff12454483b51d8b7d673a2c5d", - "sha256:7d053096f67cd1241601111b698f5cad775f97ab25d81567d3f59219b5f1adbd", - "sha256:804a4d582ba6e5b747c625bf1255e6b1507465494a40a2130978bda7b932c90b", - "sha256:807f52c1f798eef6cf26beb819eeb8819b1622ddfeef9d0977a8502d4db6d534", - "sha256:80ed5e856eb7f30115aaf94e4a08114ccc8813e6ed1b5efa74f9f82e8509858f", - "sha256:8417cb1f36cc0bc7eaba8ccb0e04d55f0ee52df06df3ad55259b9a323555fc8b", - "sha256:8436c508b408b82d87dc5f62496973a1805cd46727c34440b0d29d8a2f50a6c9", - "sha256:89149166622f4db9b4b6a449256291dc87a99ee53151c74cbd82a53c8c2f6ccd", - "sha256:8bfa33f4f2672964266e940dd22a195989ba31669bd84629f05fab3ef4e2d125", - "sha256:8c60ca7339acd497a55b0ea5d506b2a2612afb2826560416f6894e8b5770d4a9", - "sha256:91b36a978b5ae0ee86c394f5a54d6ef44db1de0815eb43de826d41d21e4af3de", - "sha256:955f8851919303c92343d2f66165294848d57e9bba6cf6e3625485a70a038d11", - "sha256:97f68b8d6831127e4787ad15e6757232e14e12060bec17091b85eb1486b91d8d", - "sha256:9b23ca7ef998bc739bf6ffc077c2116917eabcc901f88da1b9856b210ef63f35", - "sha256:9f0b8b1c6d84c8034a44893aba5e767bf9c7a211e313a9605d9c617d7083829f", - "sha256:aabfa34badd18f1da5ec1bc2715cadc8dca465868a4e73a0173466b688f29dda", - "sha256:ab36c8eb7e454e34e60eb55ca5d241a5d18b2c6244f6827a30e451c42410b5f7", - "sha256:b010a7a4fd316c3c484d482922d13044979e78d1861f0e0650423144c616a46a", - "sha256:b1ac5992a838106edb89654e0aebfc24f5848ae2547d22c2c3f66454daa11971", - "sha256:b7b2d86dd06bfc2ade3312a83a5c364c7ec2e3498f8734282c6c3d4b07b346b8", - "sha256:b97e690a2118911e39b4042088092771b4ae3fc3aa86518f84b8cf6888dbdb41", - "sha256:bc2722592d8998c870fa4e290c2eec2c1569b87fe58618e67d38b4665dfa680d", - "sha256:c0429126cf75e16c4f0ad00ee0eae4242dc652290f940152ca8c75c3a4b6ee8f", - "sha256:c30197aa96e8eed02200a83fba2657b4c3acd0f0aa4bdc9f6c1af8e8962e0757", - "sha256:c4c3e6da02df6fa1410a7680bd3f63d4f710232d3139089536310d027950696a", - "sha256:c75cb2a3e389853835e84a2d8fb2b81a10645b503eca9bcb98df6b5a43eb8886", - "sha256:c96836c97b1238e9c9e3fe90844c947d5afbf4f4c92762679acfe19927d81d77", - "sha256:d7f50a1f8c450f3925cb367d011448c39239bb3eb4117c36a6d354794de4ce76", - "sha256:d973f03c0cb71c5ed99037b870f2be986c3c05e63622c017ea9816881d2dd247", - "sha256:d98b1668f06378c6dbefec3b92299716b931cd4e6061f3c875a71ced1780ab85", - "sha256:d9c3cdf5390dcd29aa8056d13e8e99526cda0305acc038b96b30352aff5ff2bb", - "sha256:dad3e487649f498dd991eeb901125411559b22e8d7ab25d3aeb1af367df5efd7", - "sha256:dccbe65bd2f7f7ec22c4ff99ed56faa1e9f785482b9bbd7c717e26fd723a1d1e", - "sha256:dd78cfcda14a1ef52584dbb008f7ac81c1328c0f58184bf9a84c49c605002da6", - "sha256:e218488cd232553829be0664c2292d3af2eeeb94b32bea483cf79ac6a694e037", - "sha256:e358e64305fe12299a08e08978f51fc21fac060dcfcddd95453eabe5b93ed0e1", - "sha256:ea0d8d539afa5eb2728aa1932a988a9a7af94f18582ffae4bc10b3fbdad0626e", - "sha256:eab677309cdb30d047996b36d34caeda1dc91149e4fdca0b1a039b3f79d9a807", - "sha256:eb8178fe3dba6450a3e024e95ac49ed3400e506fd4e9e5c32d30adda88cbd407", - "sha256:ecddf25bee22fe4fe3737a399d0d177d72bc22be6913acfab364b40bce1ba83c", - "sha256:eea6ee1db730b3483adf394ea72f808b6e18cf3cb6454b4d86e04fa8c4327a12", - "sha256:f08ff5e948271dc7e18a35641d2f11a4cd8dfd5634f55228b691e62b37125eb3", - "sha256:f30bf9fd9be89ecb2360c7d94a711f00c09b976258846efe40db3d05828e8089", - "sha256:fa88b843d6e211393a37219e6a1c1df99d35e8fd90446f1118f4216e307e48cd", - "sha256:fc54db6c8593ef7d4b2a331b58653356cf04f67c960f584edb7c3d8c97e8f39e", - "sha256:fd4ec41f914fa74ad1b8304bbc634b3de73d2a0889bd32076342a573e0779e00", - "sha256:ffc9202a29ab3920fa812879e95a9e78b2465fd10be7fcbd042899695d75e616" + "sha256:005fa3432484527f9732ebd315da8da8001593e2cf46a3d817669f062c3d9ed4", + "sha256:046595208aae0120559a67693ecc65dd75d46f7bf687f159127046628178dc45", + "sha256:0c29de6a1a95f24b9a1aa7aefd27d2487263f00dfd55a77719b530788f75cff7", + "sha256:0c8c57f84ccfc871a48a47321cfa49ae1df56cd1d965a09abe84066f6853b9c0", + "sha256:0f5d9ed7f254402c9e7d35d2f5972c9bbea9040e99cd2861bd77dc68263277c7", + "sha256:18dd2e350387c87dabe711b86f83c9c78af772c748904d372ade190b5c7c9d4d", + "sha256:1b1bde144d98e446b056ef98e59c256e9294f6b74d7af6846bf5ffdafd687a7d", + "sha256:1c95a1e2902a8b722868587c0e1184ad5c55631de5afc0eb96bc4b0d738092c0", + "sha256:1cad5f45b3146325bb38d6855642f6fd609c3f7cad4dbaf75549bf3b904d3184", + "sha256:21b2899062867b0e1fde9b724f8aecb1af14f2778d69aacd1a5a1853a597a5db", + "sha256:24498ba8ed6c2e0b56d4acbf83f2d989720a93b41d712ebd4f4979660db4417b", + "sha256:25a23ea5c7edc53e0f29bae2c44fcb5a1aa10591aae107f2a2b2583a9c5cbc64", + "sha256:289200a18fa698949d2b39c671c2cc7a24d44096784e76614899a7ccf2574b7b", + "sha256:28a1005facc94196e1fb3e82a3d442a9d9110b8434fc1ded7a24a2983c9888d8", + "sha256:32fc0341d72e0f73f80acb0a2c94216bd704f4f0bce10aedea38f30502b271ff", + "sha256:36b31da18b8890a76ec181c3cf44326bf2c48e36d393ca1b72b3f484113ea344", + "sha256:3c21d4fca343c805a52c0c78edc01e3477f6dd1ad7c47653241cf2a206d4fc58", + "sha256:3fddb7e2c84ac87ac3a947cb4e66d143ca5863ef48e4a5ecb83bd48619e4634e", + "sha256:43e0933a0eff183ee85833f341ec567c0980dae57c464d8a508e1b2ceb336471", + "sha256:4a476b06fbcf359ad25d34a057b7219281286ae2477cc5ff5e3f70a246971148", + "sha256:4e594135de17ab3866138f496755f302b72157d115086d100c3f19370839dd3a", + "sha256:50bf98d5e563b83cc29471fa114366e6806bc06bc7a25fd59641e41445327836", + "sha256:5a9979887252a82fefd3d3ed2a8e3b937a7a809f65dcb1e068b090e165bbe99e", + "sha256:5baececa9ecba31eff645232d59845c07aa030f0c81ee70184a90d35099a0e63", + "sha256:5bf4545e3b962767e5c06fe1738f951f77d27967cb2caa64c28be7c4563e162c", + "sha256:6333b3aa5a12c26b2a4d4e7335a28f1475e0e5e17d69d55141ee3cab736f66d1", + "sha256:65c981bdbd3f57670af8b59777cbfae75364b483fa8a9f420f08094531d54a01", + "sha256:68a328e5f55ec37c57f19ebb1fdc56a248db2e3e9ad769919a58672958e8f366", + "sha256:6a0289e4589e8bdfef02a80478f1dfcb14f0ab696b5a00e1f4b8a14a307a3c58", + "sha256:6b66f92b17849b85cad91259efc341dce9c1af48e2173bf38a85c6329f1033e5", + "sha256:6c9379d65defcab82d07b2a9dfbfc2e95bc8fe0ebb1b176a3190230a3ef0e07c", + "sha256:6fc1f5b51fa4cecaa18f2bd7a003f3dd039dd615cd69a2afd6d3b19aed6775f2", + "sha256:70f7172939fdf8790425ba31915bfbe8335030f05b9913d7ae00a87d4395620a", + "sha256:721c76e84fe669be19c5791da68232ca2e05ba5185575086e384352e2c309597", + "sha256:7222ffd5e4de8e57e03ce2cef95a4c43c98fcb72ad86909abdfc2c17d227fc1b", + "sha256:75d10d37a47afee94919c4fab4c22b9bc2a8bf7d4f46f87363bcf0573f3ff4f5", + "sha256:76af085e67e56c8816c3ccf256ebd136def2ed9654525348cfa744b6802b69eb", + "sha256:770cab594ecf99ae64c236bc9ee3439c3f46be49796e265ce0cc8bc17b10294f", + "sha256:7a6ab32f7210554a96cd9e33abe3ddd86732beeafc7a28e9955cdf22ffadbab0", + "sha256:7c48ed483eb946e6c04ccbe02c6b4d1d48e51944b6db70f697e089c193404941", + "sha256:7f56930ab0abd1c45cd15be65cc741c28b1c9a34876ce8c17a2fa107810c0af0", + "sha256:8075c35cd58273fee266c58c0c9b670947c19df5fb98e7b66710e04ad4e9ff86", + "sha256:8272b73e1c5603666618805fe821edba66892e2870058c94c53147602eab29c7", + "sha256:82d8fd25b7f4675d0c47cf95b594d4e7b158aca33b76aa63d07186e13c0e0ab7", + "sha256:844da2b5728b5ce0e32d863af26f32b5ce61bc4273a9c720a9f3aa9df73b1455", + "sha256:8755483f3c00d6c9a77f490c17e6ab0c8729e39e6390328e42521ef175380ae6", + "sha256:915f3849a011c1f593ab99092f3cecfcb4d65d8feb4a64cf1bf2d22074dc0ec4", + "sha256:926ca93accd5d36ccdabd803392ddc3e03e6d4cd1cf17deff3b989ab8e9dbcf0", + "sha256:982bb1e8b4ffda883b3d0a521e23abcd6fd17418f6d2c4118d257a10199c0ce3", + "sha256:98f862da73774290f251b9df8d11161b6cf25b599a66baf087c1ffe340e9bfd1", + "sha256:9cbfacf36cb0ec2897ce0ebc5d08ca44213af24265bd56eca54bee7923c48fd6", + "sha256:a370b3e078e418187da8c3674eddb9d983ec09445c99a3a263c2011993522981", + "sha256:a955b438e62efdf7e0b7b52a64dc5c3396e2634baa62471768a64bc2adb73d5c", + "sha256:aa6af9e7d59f9c12b33ae4e9450619cf2488e2bbe9b44030905877f0b2324980", + "sha256:aa88ca0b1932e93f2d961bf3addbb2db902198dca337d88c89e1559e066e7645", + "sha256:aaeeb6a479c7667fbe1099af9617c83aaca22182d6cf8c53966491a0f1b7ffb7", + "sha256:aaf27faa992bfee0264dc1f03f4c75e9fcdda66a519db6b957a3f826e285cf12", + "sha256:b2680962a4848b3c4f155dc2ee64505a9c57186d0d56b43123b17ca3de18f0fa", + "sha256:b2d318c11350e10662026ad0eb71bb51c7812fc8590825304ae0bdd4ac283acd", + "sha256:b33de11b92e9f75a2b545d6e9b6f37e398d86c3e9e9653c4864eb7e89c5773ef", + "sha256:b3daeac64d5b371dea99714f08ffc2c208522ec6b06fbc7866a450dd446f5c0f", + "sha256:be1e352acbe3c78727a16a455126d9ff83ea2dfdcbc83148d2982305a04714c2", + "sha256:bee093bf902e1d8fc0ac143c88902c3dfc8941f7ea1d6a8dd2bcb786d33db03d", + "sha256:c72fbbe68c6f32f251bdc08b8611c7b3060612236e960ef848e0a517ddbe76c5", + "sha256:c9e36a97bee9b86ef9a1cf7bb96747eb7a15c2f22bdb5b516434b00f2a599f02", + "sha256:cddf7bd982eaa998934a91f69d182aec997c6c468898efe6679af88283b498d3", + "sha256:cf713fe9a71ef6fd5adf7a79670135081cd4431c2943864757f0fa3a65b1fafd", + "sha256:d11b54acf878eef558599658b0ffca78138c8c3655cf4f3a4a673c437e67732e", + "sha256:d41c4d287cfc69060fa91cae9683eacffad989f1a10811995fa309df656ec214", + "sha256:d524ba3f1581b35c03cb42beebab4a13e6cdad7b36246bd22541fa585a56cccd", + "sha256:daac4765328a919a805fa5e2720f3e94767abd632ae410a9062dff5412bae65a", + "sha256:db4c7bf0e07fc3b7d89ac2a5880a6a8062056801b83ff56d8464b70f65482b6c", + "sha256:dc7039885fa1baf9be153a0626e337aa7ec8bf96b0128605fb0d77788ddc1681", + "sha256:dccab8d5fa1ef9bfba0590ecf4d46df048d18ffe3eec01eeb73a42e0d9e7a8ba", + "sha256:dedb8adb91d11846ee08bec4c8236c8549ac721c245678282dcb06b221aab59f", + "sha256:e45ba65510e2647721e35323d6ef54c7974959f6081b58d4ef5d87c60c84919a", + "sha256:e53efc7c7cee4c1e70661e2e112ca46a575f90ed9ae3fef200f2a25e954f4b28", + "sha256:e635b87f01ebc977342e2697d05b56632f5f879a4f15955dfe8cef2448b51691", + "sha256:e70e990b2137b29dc5564715de1e12701815dacc1d056308e2b17e9095372a82", + "sha256:e8082b26888e2f8b36a042a58307d5b917ef2b1cacab921ad3323ef91901c71a", + "sha256:e8323a9b031aa0393768b87f04b4164a40037fb2a3c11ac06a03ffecd3618027", + "sha256:e92fca20c46e9f5e1bb485887d074918b13543b1c2a1185e69bb8d17ab6236a7", + "sha256:eb30abc20df9ab0814b5a2524f23d75dcf83cde762c161917a2b4b7b55b1e518", + "sha256:eba9904b0f38a143592d9fc0e19e2df0fa2e41c3c3745554761c5f6447eedabf", + "sha256:ef8de666d6179b009dce7bcb2ad4c4a779f113f12caf8dc77f0162c29d20490b", + "sha256:efd387a49825780ff861998cd959767800d54f8308936b21025326de4b5a42b9", + "sha256:f0aa37f3c979cf2546b73e8222bbfa3dc07a641585340179d768068e3455e544", + "sha256:f4074c5a429281bf056ddd4c5d3b740ebca4d43ffffe2ef4bf4d2d05114299da", + "sha256:f69a27e45c43520f5487f27627059b64aaf160415589230992cec34c5e18a509", + "sha256:fb707f3e15060adf5b7ada797624a6c6e0138e2a26baa089df64c68ee98e040f", + "sha256:fcbe676a55d7445b22c10967bceaaf0ee69407fbe0ece4d032b6eb8d4565982a", + "sha256:fdb20a30fe1175ecabed17cbf7812f7b804b8a315a25f24678bcdf120a90077f" ], "markers": "python_version >= '3.7'", - "version": "==3.4.1" + "version": "==3.4.2" }, "click": { "hashes": [ - "sha256:63c132bbbed01578a06712a2d1f497bb62d9c1c0d329b7903a866228027263b2", - "sha256:ed53c9d8990d83c2a27deae68e4ee337473f6330c040a31d4225c9574d16096a" + "sha256:6b303f0b2aa85f1cb4e5303078fadcbcd4e476f114fab9b5007005711839325c", + "sha256:f5452aeddd9988eefa20f90f05ab66f17fce1ee2a36907fd30b05bbb5953814d" ], - "markers": "python_version >= '3.7'", - "version": "==8.1.8" + "markers": "python_version >= '3.10'", + "version": "==8.2.0" }, "cryptography": { "hashes": [ - "sha256:04abd71114848aa25edb28e225ab5f268096f44cf0127f3d36975bdf1bdf3390", - "sha256:0529b1d5a0105dd3731fa65680b45ce49da4d8115ea76e9da77a875396727b41", - "sha256:1bc312dfb7a6e5d66082c87c34c8a62176e684b6fe3d90fcfe1568de675e6688", - "sha256:268e4e9b177c76d569e8a145a6939eca9a5fec658c932348598818acf31ae9a5", - "sha256:29ecec49f3ba3f3849362854b7253a9f59799e3763b0c9d0826259a88efa02f1", - "sha256:2bf7bf75f7df9715f810d1b038870309342bff3069c5bd8c6b96128cb158668d", - "sha256:3b721b8b4d948b218c88cb8c45a01793483821e709afe5f622861fc6182b20a7", - "sha256:3c00b6b757b32ce0f62c574b78b939afab9eecaf597c4d624caca4f9e71e7843", - "sha256:3dc62975e31617badc19a906481deacdeb80b4bb454394b4098e3f2525a488c5", - "sha256:4973da6ca3db4405c54cd0b26d328be54c7747e89e284fcff166132eb7bccc9c", - "sha256:4e389622b6927d8133f314949a9812972711a111d577a5d1f4bee5e58736b80a", - "sha256:51e4de3af4ec3899d6d178a8c005226491c27c4ba84101bfb59c901e10ca9f79", - "sha256:5f6f90b72d8ccadb9c6e311c775c8305381db88374c65fa1a68250aa8a9cb3a6", - "sha256:6210c05941994290f3f7f175a4a57dbbb2afd9273657614c506d5976db061181", - "sha256:6f101b1f780f7fc613d040ca4bdf835c6ef3b00e9bd7125a4255ec574c7916e4", - "sha256:7bdcd82189759aba3816d1f729ce42ffded1ac304c151d0a8e89b9996ab863d5", - "sha256:7ca25849404be2f8e4b3c59483d9d3c51298a22c1c61a0e84415104dacaf5562", - "sha256:81276f0ea79a208d961c433a947029e1a15948966658cf6710bbabb60fcc2639", - "sha256:8cadc6e3b5a1f144a039ea08a0bdb03a2a92e19c46be3285123d32029f40a922", - "sha256:8e0ddd63e6bf1161800592c71ac794d3fb8001f2caebe0966e77c5234fa9efc3", - "sha256:909c97ab43a9c0c0b0ada7a1281430e4e5ec0458e6d9244c0e821bbf152f061d", - "sha256:96e7a5e9d6e71f9f4fca8eebfd603f8e86c5225bb18eb621b2c1e50b290a9471", - "sha256:9a1e657c0f4ea2a23304ee3f964db058c9e9e635cc7019c4aa21c330755ef6fd", - "sha256:9eb9d22b0a5d8fd9925a7764a054dca914000607dff201a24c791ff5c799e1fa", - "sha256:af4ff3e388f2fa7bff9f7f2b31b87d5651c45731d3e8cfa0944be43dff5cfbdb", - "sha256:b042d2a275c8cee83a4b7ae30c45a15e6a4baa65a179a0ec2d78ebb90e4f6699", - "sha256:bc821e161ae88bfe8088d11bb39caf2916562e0a2dc7b6d56714a48b784ef0bb", - "sha256:c505d61b6176aaf982c5717ce04e87da5abc9a36a5b39ac03905c4aafe8de7aa", - "sha256:c63454aa261a0cf0c5b4718349629793e9e634993538db841165b3df74f37ec0", - "sha256:c7362add18b416b69d58c910caa217f980c5ef39b23a38a0880dfd87bdf8cd23", - "sha256:d03806036b4f89e3b13b6218fefea8d5312e450935b1a2d55f0524e2ed7c59d9", - "sha256:d1b3031093a366ac767b3feb8bcddb596671b3aaff82d4050f984da0c248b615", - "sha256:d1c3572526997b36f245a96a2b1713bf79ce99b271bbcf084beb6b9b075f29ea", - "sha256:efcfe97d1b3c79e486554efddeb8f6f53a4cdd4cf6086642784fa31fc384e1d7", - "sha256:f514ef4cd14bb6fb484b4a60203e912cfcb64f2ab139e88c2274511514bf7308" + "sha256:057723b79752a142efbc609e90b0dff27b0361ccbee3bd48312d70f5cdf53b78", + "sha256:05c2385b1f5c89a17df19900cfb1345115a77168f5ed44bdf6fd3de1ce5cc65b", + "sha256:08281de408e7eb71ba3cd5098709a356bfdf65eebd7ee7633c3610f0aa80d79b", + "sha256:10d68763892a7b19c22508ab57799c4423c7c8cd61d7eee4c5a6a55a46511949", + "sha256:1655d3a76e3dedb683c982a6c3a2cbfae2d08f47a48ec5a3d58db52b3d29ea6f", + "sha256:18f8084b7ca3ce1b8d38bdfe33c48116edf9a08b4d056ef4a96dceaa36d8d965", + "sha256:2cb03a944a1a412724d15a7c051d50e63a868031f26b6a312f2016965b661942", + "sha256:4142e20c29224cec63e9e32eb1e6014fb285fe39b7be66b3564ca978a3a8afe9", + "sha256:463096533acd5097f8751115bc600b0b64620c4aafcac10c6d0041e6e68f88fe", + "sha256:48caa55c528617fa6db1a9c3bf2e37ccb31b73e098ac2b71408d1f2db551dde4", + "sha256:49af56491473231159c98c2c26f1a8f3799a60e5cf0e872d00745b858ddac9d2", + "sha256:4cc31c66411e14dd70e2f384a9204a859dc25b05e1f303df0f5326691061b839", + "sha256:501de1296b2041dccf2115e3c7d4947430585601b251b140970ce255c5cfb985", + "sha256:59c0c8f043dd376bbd9d4f636223836aed50431af4c5a467ed9bf61520294627", + "sha256:614bca7c6ed0d8ad1dce683a6289afae1f880675b4090878a0136c3da16bc693", + "sha256:61a8b1bbddd9332917485b2453d1de49f142e6334ce1d97b7916d5a85d179c84", + "sha256:7429936146063bd1b2cfc54f0e04016b90ee9b1c908a7bed0800049cbace70eb", + "sha256:7c73968fbb7698a4c5d6160859db560d3aac160edde89c751edd5a8bc6560c88", + "sha256:80303ee6a02ef38c4253160446cbeb5c400c07e01d4ddbd4ff722a89b736d95a", + "sha256:965611880c3fa8e504b7458484c0697e00ae6e937279cd6734fdaa2bc954dc49", + "sha256:9a900036b42f7324df7c7ad9569eb92ba0b613cf699160dd9c2154b24fd02f8e", + "sha256:9cfd1399064b13043082c660ddd97a0358e41c8b0dc7b77c1243e013d305c344", + "sha256:a8ec324711596fbf21837d3a5db543937dd84597d364769b46e0102250023f77", + "sha256:a9727a21957d3327cf6b7eb5ffc9e4b663909a25fea158e3fcbc49d4cdd7881b", + "sha256:b19f4b28dd2ef2e6d600307fee656c00825a2980c4356a7080bd758d633c3a6f", + "sha256:b2de529027579e43b6dc1f805f467b102fb7d13c1e54c334f1403ee2b37d0059", + "sha256:c0c000c1a09f069632d8a9eb3b610ac029fcc682f1d69b758e625d6ee713f4ed", + "sha256:cdafb86eb673c3211accffbffdb3cdffa3aaafacd14819e0898d23696d18e4d3", + "sha256:d2a90ce2f0f5b695e4785ac07c19a58244092f3c85d57db6d8eb1a2b26d2aad6", + "sha256:d784d57b958ffd07e9e226d17272f9af0c41572557604ca7554214def32c26bf", + "sha256:d891942592789fa0ab71b502550bbadb12f540d7413d7d7c4cef4b02af0f5bc6", + "sha256:dc7693573f16535428183de8fd27f0ca1ca37a51baa0b41dc5ed7b3d68fe80e2", + "sha256:ddb8d01aa900b741d6b7cc585a97aff787175f160ab975e21f880e89d810781a", + "sha256:e328357b6bbf79928363dbf13f4635b7aac0306afb7e5ad24d21d0c5761c3253", + "sha256:e86c8d54cd19a13e9081898b3c24351683fd39d726ecf8e774aaa9d8d96f5f3a", + "sha256:e9e4bdcd70216b08801e267c0b563316b787f957a46e215249921f99288456f9", + "sha256:f169469d04a23282de9d0be349499cb6683b6ff1b68901210faacac9b0c24b7d" ], "markers": "python_version >= '3.7' and python_full_version not in '3.9.0, 3.9.1'", - "version": "==44.0.2" + "version": "==45.0.2" }, "dbrepo": { "hashes": [ - "sha256:4dc7da6e48b618d44e82f3ad392c4d1ef7917a0cd46bb13af78a73f3062d7319" + "sha256:76f0ab97d1e914a779aa51b5e5a17591b2f1c88f15dc9df27273deb4dc7ed125", + "sha256:f01ee3102dc405c00b5e61cd1d62a46f9644ca33d131912cc25130a5ec304378" ], - "path": "./lib/dbrepo-1.8.1.tar.gz", - "version": "==1.8.1" + "path": "./lib/dbrepo-1.9.0.tar.gz", + "version": "==1.9.0" }, "events": { "hashes": [ @@ -437,11 +337,11 @@ }, "exceptiongroup": { "hashes": [ - "sha256:3111b9d131c238bec2f8f516e123e14ba243563fb135d3fe885990585aa7795b", - "sha256:47c2edf7c6738fafb49fd34290706d1a1a2f4d1c6df275526b62cbb4aa5393cc" + "sha256:4d111e6e0c13d0644cad6ddaa7ed0261a0b36971f6d23e7ec9b4b9097da78a10", + "sha256:b241f5885f560bc56a59ee63ca4c6a8bfa46ae4ad651af316d4e81817bb9fd88" ], "index": "pypi", - "version": "==1.2.2" + "version": "==1.3.0" }, "flasgger": { "hashes": [ @@ -452,19 +352,19 @@ }, "flask": { "hashes": [ - "sha256:5f873c5184c897c8d9d1b05df1e3d01b14910ce69607a117bd3277098a5836ac", - "sha256:d667207822eb83f1c4b50949b1623c8fc8d51f2341d65f72e1a1815397551136" + "sha256:07aae2bb5eaf77993ef57e357491839f5fd9f4dc281593a81a9e4d79a24f295c", + "sha256:284c7b8f2f58cb737f0cf1c30fd7eaf0ccfcde196099d24ecede3fc2005aa59e" ], "index": "pypi", - "version": "==3.1.0" + "version": "==3.1.1" }, "flask-cors": { "hashes": [ - "sha256:6ccb38d16d6b72bbc156c1c3f192bc435bfcc3c2bc864b2df1eb9b2d97b2403c", - "sha256:fa5cb364ead54bbf401a26dbf03030c6b18fb2fcaf70408096a572b409586b0c" + "sha256:4592c1570246bf7beee96b74bc0adbbfcb1b0318f6ba05c412e8909eceec3393", + "sha256:6332073356452343a8ccddbfec7befdc3fdd040141fe776ec9b94c262f058657" ], "index": "pypi", - "version": "==5.0.1" + "version": "==6.0.0" }, "flask-httpauth": { "hashes": [ @@ -482,226 +382,111 @@ "index": "pypi", "version": "==4.7.1" }, - "frozenlist": { - "hashes": [ - "sha256:000a77d6034fbad9b6bb880f7ec073027908f1b40254b5d6f26210d2dab1240e", - "sha256:03d33c2ddbc1816237a67f66336616416e2bbb6beb306e5f890f2eb22b959cdf", - "sha256:04a5c6babd5e8fb7d3c871dc8b321166b80e41b637c31a995ed844a6139942b6", - "sha256:0996c66760924da6e88922756d99b47512a71cfd45215f3570bf1e0b694c206a", - "sha256:0cc974cc93d32c42e7b0f6cf242a6bd941c57c61b618e78b6c0a96cb72788c1d", - "sha256:0f253985bb515ecd89629db13cb58d702035ecd8cfbca7d7a7e29a0e6d39af5f", - "sha256:11aabdd62b8b9c4b84081a3c246506d1cddd2dd93ff0ad53ede5defec7886b28", - "sha256:12f78f98c2f1c2429d42e6a485f433722b0061d5c0b0139efa64f396efb5886b", - "sha256:140228863501b44b809fb39ec56b5d4071f4d0aa6d216c19cbb08b8c5a7eadb9", - "sha256:1431d60b36d15cda188ea222033eec8e0eab488f39a272461f2e6d9e1a8e63c2", - "sha256:15538c0cbf0e4fa11d1e3a71f823524b0c46299aed6e10ebb4c2089abd8c3bec", - "sha256:15b731db116ab3aedec558573c1a5eec78822b32292fe4f2f0345b7f697745c2", - "sha256:17dcc32fc7bda7ce5875435003220a457bcfa34ab7924a49a1c19f55b6ee185c", - "sha256:1893f948bf6681733aaccf36c5232c231e3b5166d607c5fa77773611df6dc336", - "sha256:189f03b53e64144f90990d29a27ec4f7997d91ed3d01b51fa39d2dbe77540fd4", - "sha256:1a8ea951bbb6cacd492e3948b8da8c502a3f814f5d20935aae74b5df2b19cf3d", - "sha256:1b96af8c582b94d381a1c1f51ffaedeb77c821c690ea5f01da3d70a487dd0a9b", - "sha256:1e76bfbc72353269c44e0bc2cfe171900fbf7f722ad74c9a7b638052afe6a00c", - "sha256:2150cc6305a2c2ab33299453e2968611dacb970d2283a14955923062c8d00b10", - "sha256:226d72559fa19babe2ccd920273e767c96a49b9d3d38badd7c91a0fdeda8ea08", - "sha256:237f6b23ee0f44066219dae14c70ae38a63f0440ce6750f868ee08775073f942", - "sha256:29d94c256679247b33a3dc96cce0f93cbc69c23bf75ff715919332fdbb6a32b8", - "sha256:2b5e23253bb709ef57a8e95e6ae48daa9ac5f265637529e4ce6b003a37b2621f", - "sha256:2d0da8bbec082bf6bf18345b180958775363588678f64998c2b7609e34719b10", - "sha256:2f3f7a0fbc219fb4455264cae4d9f01ad41ae6ee8524500f381de64ffaa077d5", - "sha256:30c72000fbcc35b129cb09956836c7d7abf78ab5416595e4857d1cae8d6251a6", - "sha256:31115ba75889723431aa9a4e77d5f398f5cf976eea3bdf61749731f62d4a4a21", - "sha256:31a9ac2b38ab9b5a8933b693db4939764ad3f299fcaa931a3e605bc3460e693c", - "sha256:366d8f93e3edfe5a918c874702f78faac300209a4d5bf38352b2c1bdc07a766d", - "sha256:374ca2dabdccad8e2a76d40b1d037f5bd16824933bf7bcea3e59c891fd4a0923", - "sha256:44c49271a937625619e862baacbd037a7ef86dd1ee215afc298a417ff3270608", - "sha256:45e0896250900b5aa25180f9aec243e84e92ac84bd4a74d9ad4138ef3f5c97de", - "sha256:498524025a5b8ba81695761d78c8dd7382ac0b052f34e66939c42df860b8ff17", - "sha256:50cf5e7ee9b98f22bdecbabf3800ae78ddcc26e4a435515fc72d97903e8488e0", - "sha256:52ef692a4bc60a6dd57f507429636c2af8b6046db8b31b18dac02cbc8f507f7f", - "sha256:561eb1c9579d495fddb6da8959fd2a1fca2c6d060d4113f5844b433fc02f2641", - "sha256:5a3ba5f9a0dfed20337d3e966dc359784c9f96503674c2faf015f7fe8e96798c", - "sha256:5b6a66c18b5b9dd261ca98dffcb826a525334b2f29e7caa54e182255c5f6a65a", - "sha256:5c28f4b5dbef8a0d8aad0d4de24d1e9e981728628afaf4ea0792f5d0939372f0", - "sha256:5d7f5a50342475962eb18b740f3beecc685a15b52c91f7d975257e13e029eca9", - "sha256:6321899477db90bdeb9299ac3627a6a53c7399c8cd58d25da094007402b039ab", - "sha256:6482a5851f5d72767fbd0e507e80737f9c8646ae7fd303def99bfe813f76cf7f", - "sha256:666534d15ba8f0fda3f53969117383d5dc021266b3c1a42c9ec4855e4b58b9d3", - "sha256:683173d371daad49cffb8309779e886e59c2f369430ad28fe715f66d08d4ab1a", - "sha256:6e9080bb2fb195a046e5177f10d9d82b8a204c0736a97a153c2466127de87784", - "sha256:73f2e31ea8dd7df61a359b731716018c2be196e5bb3b74ddba107f694fbd7604", - "sha256:7437601c4d89d070eac8323f121fcf25f88674627505334654fd027b091db09d", - "sha256:76e4753701248476e6286f2ef492af900ea67d9706a0155335a40ea21bf3b2f5", - "sha256:7707a25d6a77f5d27ea7dc7d1fc608aa0a478193823f88511ef5e6b8a48f9d03", - "sha256:7948140d9f8ece1745be806f2bfdf390127cf1a763b925c4a805c603df5e697e", - "sha256:7a1a048f9215c90973402e26c01d1cff8a209e1f1b53f72b95c13db61b00f953", - "sha256:7d57d8f702221405a9d9b40f9da8ac2e4a1a8b5285aac6100f3393675f0a85ee", - "sha256:7f3c8c1dacd037df16e85227bac13cca58c30da836c6f936ba1df0c05d046d8d", - "sha256:81d5af29e61b9c8348e876d442253723928dce6433e0e76cd925cd83f1b4b817", - "sha256:828afae9f17e6de596825cf4228ff28fbdf6065974e5ac1410cecc22f699d2b3", - "sha256:87f724d055eb4785d9be84e9ebf0f24e392ddfad00b3fe036e43f489fafc9039", - "sha256:8969190d709e7c48ea386db202d708eb94bdb29207a1f269bab1196ce0dcca1f", - "sha256:90646abbc7a5d5c7c19461d2e3eeb76eb0b204919e6ece342feb6032c9325ae9", - "sha256:91d6c171862df0a6c61479d9724f22efb6109111017c87567cfeb7b5d1449fdf", - "sha256:9272fa73ca71266702c4c3e2d4a28553ea03418e591e377a03b8e3659d94fa76", - "sha256:92b5278ed9d50fe610185ecd23c55d8b307d75ca18e94c0e7de328089ac5dcba", - "sha256:97160e245ea33d8609cd2b8fd997c850b56db147a304a262abc2b3be021a9171", - "sha256:977701c081c0241d0955c9586ffdd9ce44f7a7795df39b9151cd9a6fd0ce4cfb", - "sha256:9b7dc0c4338e6b8b091e8faf0db3168a37101943e687f373dce00959583f7439", - "sha256:9b93d7aaa36c966fa42efcaf716e6b3900438632a626fb09c049f6a2f09fc631", - "sha256:9bbcdfaf4af7ce002694a4e10a0159d5a8d20056a12b05b45cea944a4953f972", - "sha256:9c2623347b933fcb9095841f1cc5d4ff0b278addd743e0e966cb3d460278840d", - "sha256:a2fe128eb4edeabe11896cb6af88fca5346059f6c8d807e3b910069f39157869", - "sha256:a72b7a6e3cd2725eff67cd64c8f13335ee18fc3c7befc05aed043d24c7b9ccb9", - "sha256:a9fe0f1c29ba24ba6ff6abf688cb0b7cf1efab6b6aa6adc55441773c252f7411", - "sha256:b97f7b575ab4a8af9b7bc1d2ef7f29d3afee2226bd03ca3875c16451ad5a7723", - "sha256:bdac3c7d9b705d253b2ce370fde941836a5f8b3c5c2b8fd70940a3ea3af7f4f2", - "sha256:c03eff4a41bd4e38415cbed054bbaff4a075b093e2394b6915dca34a40d1e38b", - "sha256:c16d2fa63e0800723139137d667e1056bee1a1cf7965153d2d104b62855e9b99", - "sha256:c1fac3e2ace2eb1052e9f7c7db480818371134410e1f5c55d65e8f3ac6d1407e", - "sha256:ce3aa154c452d2467487765e3adc730a8c153af77ad84096bc19ce19a2400840", - "sha256:cee6798eaf8b1416ef6909b06f7dc04b60755206bddc599f52232606e18179d3", - "sha256:d1b3eb7b05ea246510b43a7e53ed1653e55c2121019a97e60cad7efb881a97bb", - "sha256:d994863bba198a4a518b467bb971c56e1db3f180a25c6cf7bb1949c267f748c3", - "sha256:dd47a5181ce5fcb463b5d9e17ecfdb02b678cca31280639255ce9d0e5aa67af0", - "sha256:dd94994fc91a6177bfaafd7d9fd951bc8689b0a98168aa26b5f543868548d3ca", - "sha256:de537c11e4aa01d37db0d403b57bd6f0546e71a82347a97c6a9f0dcc532b3a45", - "sha256:df6e2f325bfee1f49f81aaac97d2aa757c7646534a06f8f577ce184afe2f0a9e", - "sha256:e66cc454f97053b79c2ab09c17fbe3c825ea6b4de20baf1be28919460dd7877f", - "sha256:e79225373c317ff1e35f210dd5f1344ff31066ba8067c307ab60254cd3a78ad5", - "sha256:f1577515d35ed5649d52ab4319db757bb881ce3b2b796d7283e6634d99ace307", - "sha256:f1e6540b7fa044eee0bb5111ada694cf3dc15f2b0347ca125ee9ca984d5e9e6e", - "sha256:f2ac49a9bedb996086057b75bf93538240538c6d9b38e57c82d51f75a73409d2", - "sha256:f47c9c9028f55a04ac254346e92977bf0f166c483c74b4232bee19a6697e4778", - "sha256:f5f9da7f5dbc00a604fe74aa02ae7c98bcede8a3b8b9666f9f86fc13993bc71a", - "sha256:fd74520371c3c4175142d02a976aee0b4cb4a7cc912a60586ffd8d5929979b30", - "sha256:feeb64bc9bcc6b45c6311c9e9b99406660a9c05ca8a5b30d14a78555088b0b3a" - ], - "markers": "python_version >= '3.8'", - "version": "==1.5.0" - }, "gevent": { "hashes": [ - "sha256:1c3443b0ed23dcb7c36a748d42587168672953d368f2956b17fad36d43b58836", - "sha256:1d4fadc319b13ef0a3c44d2792f7918cf1bca27cacd4d41431c22e6b46668026", - "sha256:1ea50009ecb7f1327347c37e9eb6561bdbc7de290769ee1404107b9a9cba7cf1", - "sha256:2142704c2adce9cd92f6600f371afb2860a446bfd0be5bd86cca5b3e12130766", - "sha256:351d1c0e4ef2b618ace74c91b9b28b3eaa0dd45141878a964e03c7873af09f62", - "sha256:356b73d52a227d3313f8f828025b665deada57a43d02b1cf54e5d39028dbcf8d", - "sha256:3d882faa24f347f761f934786dde6c73aa6c9187ee710189f12dcc3a63ed4a50", - "sha256:58851f23c4bdb70390f10fc020c973ffcf409eb1664086792c8b1e20f25eef43", - "sha256:68bee86b6e1c041a187347ef84cf03a792f0b6c7238378bf6ba4118af11feaae", - "sha256:7398c629d43b1b6fd785db8ebd46c0a353880a6fab03d1cf9b6788e7240ee32e", - "sha256:816b3883fa6842c1cf9d2786722014a0fd31b6312cca1f749890b9803000bad6", - "sha256:81d918e952954675f93fb39001da02113ec4d5f4921bf5a0cc29719af6824e5d", - "sha256:85329d556aaedced90a993226d7d1186a539c843100d393f2349b28c55131c85", - "sha256:8619d5c888cb7aebf9aec6703e410620ef5ad48cdc2d813dd606f8aa7ace675f", - "sha256:8bd1419114e9e4a3ed33a5bad766afff9a3cf765cb440a582a1b3a9bc80c1aca", - "sha256:92e0d7759de2450a501effd99374256b26359e801b2d8bf3eedd3751973e87f5", - "sha256:92fe5dfee4e671c74ffaa431fd7ffd0ebb4b339363d24d0d944de532409b935e", - "sha256:97e2f3999a5c0656f42065d02939d64fffaf55861f7d62b0107a08f52c984897", - "sha256:9d3b249e4e1f40c598ab8393fc01ae6a3b4d51fc1adae56d9ba5b315f6b2d758", - "sha256:a3d75fa387b69c751a3d7c5c3ce7092a171555126e136c1d21ecd8b50c7a6e46", - "sha256:a5f1701ce0f7832f333dd2faf624484cbac99e60656bfbb72504decd42970f0f", - "sha256:b24d800328c39456534e3bc3e1684a28747729082684634789c2f5a8febe7671", - "sha256:b5efe72e99b7243e222ba0c2c2ce9618d7d36644c166d63373af239da1036bab", - "sha256:b7bfcfe08d038e1fa6de458891bca65c1ada6d145474274285822896a858c870", - "sha256:beede1d1cff0c6fafae3ab58a0c470d7526196ef4cd6cc18e7769f207f2ea4eb", - "sha256:c6b775381f805ff5faf250e3a07c0819529571d19bb2a9d474bee8c3f90d66af", - "sha256:c9c935b83d40c748b6421625465b7308d87c7b3717275acd587eef2bd1c39546", - "sha256:ca845138965c8c56d1550499d6b923eb1a2331acfa9e13b817ad8305dde83d11", - "sha256:d618e118fdb7af1d6c1a96597a5cd6ac84a9f3732b5be8515c6a66e098d498b6", - "sha256:d6c0a065e31ef04658f799215dddae8752d636de2bed61365c358f9c91e7af61", - "sha256:d740206e69dfdfdcd34510c20adcb9777ce2cc18973b3441ab9767cd8948ca8a", - "sha256:d7886b63ebfb865178ab28784accd32f287d5349b3ed71094c86e4d3ca738af5", - "sha256:d9347690f4e53de2c4af74e62d6fabc940b6d4a6cad555b5a379f61e7d3f2a8e", - "sha256:d9ca80711e6553880974898d99357fb649e062f9058418a92120ca06c18c3c59", - "sha256:e24181d172f50097ac8fc272c8c5b030149b630df02d1c639ee9f878a470ba2b", - "sha256:ec68e270543ecd532c4c1d70fca020f90aa5486ad49c4f3b8b2e64a66f5c9274", - "sha256:f43f47e702d0c8e1b8b997c00f1601486f9f976f84ab704f8f11536e3fa144c9", - "sha256:ff96c5739834c9a594db0e12bf59cb3fa0e5102fc7b893972118a3166733d61c" + "sha256:017a7384c0cd1a5907751c991535a0699596e89725468a7fc39228312e10efa1", + "sha256:0bacf89a65489d26c7087669af89938d5bfd9f7afb12a07b57855b9fad6ccbd0", + "sha256:12380aba5c316e9ff53cc21d8ab80f4a91c0df3ada58f65d4f5eb2cf693db00e", + "sha256:1a93062609e8fa67ec97cd5fb9206886774b2a09b24887f40148c9c37e6fb71c", + "sha256:24484f80f14befb8822bf29554cfb3a26a26cb69cd1e5a8be9e23b4bd7a96e25", + "sha256:2534c23dc32bed62b659ed4fd9e198906179e68b26c9276a897e04163bdde806", + "sha256:2797885e9aeffdc98e1846723e5aa212e7ce53007dbef40d6fd2add264235c41", + "sha256:29ab729d50ae85077a68e0385f129f5b01052d01a0ae6d7fdc1824f5337905e4", + "sha256:2d316529b70d325b183b2f3f5cde958911ff7be12eb2b532b5c301f915dbbf1e", + "sha256:37ee34b77c7553777c0b8379915f75934c3f9c8cd32f7cd098ea43c9323c2276", + "sha256:3fae8533f9d0ef3348a1f503edcfb531ef7a0236b57da1e24339aceb0ce52922", + "sha256:469c86d02fccad7e2a3d82fe22237e47ecb376fbf4710bc18747b49c50716817", + "sha256:582c948fa9a23188b890d0bc130734a506d039a2e5ad87dae276a456cc683e61", + "sha256:5b6106e2414b1797133786258fa1962a5e836480e4d5e861577f9fc63b673a5a", + "sha256:60ad4ca9ca2c4cc8201b607c229cd17af749831e371d006d8a91303bb5568eb1", + "sha256:7b95815fe44f318ebbfd733b6428b4cb18cc5e68f1c40e8501dd69cc1f42a83d", + "sha256:7f0694daab1a041b69a53f53c2141c12994892b2503870515cabe6a5dbd2a928", + "sha256:80d20592aeabcc4e294fd441fd43d45cb537437fd642c374ea9d964622fad229", + "sha256:8e5a0fab5e245b15ec1005b3666b0a2e867c26f411c8fe66ae1afe07174a30e9", + "sha256:8fdc7446895fa184890d8ca5ea61e502691114f9db55c9b76adc33f3086c4368", + "sha256:9fa6aa0da224ed807d3b76cdb4ee8b54d4d4d5e018aed2478098e685baae7896", + "sha256:a022a9de9275ce0b390b7315595454258c525dc8287a03f1a6cacc5878ab7cbc", + "sha256:a8ba0257542ccbb72a8229dc34d00844ccdfba110417e4b7b34599548d0e20e9", + "sha256:b83aff2441c7d4ee93e519989713b7c2607d4510abe990cd1d04f641bc6c03af", + "sha256:b87a4b66edb3808d4d07bbdb0deed5a710cf3d3c531e082759afd283758bb649", + "sha256:bb673eb291c19370f69295f7a881a536451408481e2e3deec3f41dedb7c281ec", + "sha256:bc899212d90f311784c58938a9c09c59802fb6dc287a35fabdc36d180f57f575", + "sha256:c1325ed44225c8309c0dd188bdbbbee79e1df8c11ceccac226b861c7d52e4837", + "sha256:c7b32d9c3b5294b39ea9060e20c582e49e1ec81edbfeae6cf05f8ad0829cb13d", + "sha256:c7b80a37f2fb45ee4a8f7e64b77dd8a842d364384046e394227b974a4e9c9a52", + "sha256:cad0821dff998c7c60dd238f92cd61380342c47fb9e92e1a8705d9b5ac7c16e8", + "sha256:cde6aaac36b54332e10ea2a5bc0de6a8aba6c205c92603fe4396e3777c88e05d", + "sha256:d87c0a1bd809d8f70f96b9b229779ec6647339830b8888a192beed33ac8d129f", + "sha256:e30169ef9cc0a57930bfd8fe14d86bc9d39fb96d278e3891e85cbe7b46058a97", + "sha256:e5f358e81e27b1a7f2fb2f5219794e13ab5f59ce05571aa3877cfac63adb97db", + "sha256:e72ad5f8d9c92df017fb91a1f6a438cfb63b0eff4b40904ff81b40cb8150078c", + "sha256:f076779050029a82feb0cb1462021d3404d22f80fa76a181b1a7889cd4d6b519", + "sha256:f6ba33c13db91ffdbb489a4f3d177a261ea1843923e1d68a5636c53fe98fa5ce", + "sha256:fcd5bcad3102bde686d0adcc341fade6245186050ce14386d547ccab4bd54310" ], "index": "pypi", - "version": "==24.11.1" + "version": "==25.5.1" }, "greenlet": { "hashes": [ - "sha256:0153404a4bb921f0ff1abeb5ce8a5131da56b953eda6e14b88dc6bbc04d2049e", - "sha256:03a088b9de532cbfe2ba2034b2b85e82df37874681e8c470d6fb2f8c04d7e4b7", - "sha256:04b013dc07c96f83134b1e99888e7a79979f1a247e2a9f59697fa14b5862ed01", - "sha256:05175c27cb459dcfc05d026c4232f9de8913ed006d42713cb8a5137bd49375f1", - "sha256:09fc016b73c94e98e29af67ab7b9a879c307c6731a2c9da0db5a7d9b7edd1159", - "sha256:0bbae94a29c9e5c7e4a2b7f0aae5c17e8e90acbfd3bf6270eeba60c39fce3563", - "sha256:0fde093fb93f35ca72a556cf72c92ea3ebfda3d79fc35bb19fbe685853869a83", - "sha256:1443279c19fca463fc33e65ef2a935a5b09bb90f978beab37729e1c3c6c25fe9", - "sha256:1776fd7f989fc6b8d8c8cb8da1f6b82c5814957264d1f6cf818d475ec2bf6395", - "sha256:1d3755bcb2e02de341c55b4fca7a745a24a9e7212ac953f6b3a48d117d7257aa", - "sha256:23f20bb60ae298d7d8656c6ec6db134bca379ecefadb0b19ce6f19d1f232a942", - "sha256:275f72decf9932639c1c6dd1013a1bc266438eb32710016a1c742df5da6e60a1", - "sha256:2846930c65b47d70b9d178e89c7e1a69c95c1f68ea5aa0a58646b7a96df12441", - "sha256:3319aa75e0e0639bc15ff54ca327e8dc7a6fe404003496e3c6925cd3142e0e22", - "sha256:346bed03fe47414091be4ad44786d1bd8bef0c3fcad6ed3dee074a032ab408a9", - "sha256:36b89d13c49216cadb828db8dfa6ce86bbbc476a82d3a6c397f0efae0525bdd0", - "sha256:37b9de5a96111fc15418819ab4c4432e4f3c2ede61e660b1e33971eba26ef9ba", - "sha256:396979749bd95f018296af156201d6211240e7a23090f50a8d5d18c370084dc3", - "sha256:3b2813dc3de8c1ee3f924e4d4227999285fd335d1bcc0d2be6dc3f1f6a318ec1", - "sha256:411f015496fec93c1c8cd4e5238da364e1da7a124bcb293f085bf2860c32c6f6", - "sha256:47da355d8687fd65240c364c90a31569a133b7b60de111c255ef5b606f2ae291", - "sha256:48ca08c771c268a768087b408658e216133aecd835c0ded47ce955381105ba39", - "sha256:4afe7ea89de619adc868e087b4d2359282058479d7cfb94970adf4b55284574d", - "sha256:4ce3ac6cdb6adf7946475d7ef31777c26d94bccc377e070a7986bd2d5c515467", - "sha256:4ead44c85f8ab905852d3de8d86f6f8baf77109f9da589cb4fa142bd3b57b475", - "sha256:54558ea205654b50c438029505def3834e80f0869a70fb15b871c29b4575ddef", - "sha256:5e06afd14cbaf9e00899fae69b24a32f2196c19de08fcb9f4779dd4f004e5e7c", - "sha256:62ee94988d6b4722ce0028644418d93a52429e977d742ca2ccbe1c4f4a792511", - "sha256:63e4844797b975b9af3a3fb8f7866ff08775f5426925e1e0bbcfe7932059a12c", - "sha256:6510bf84a6b643dabba74d3049ead221257603a253d0a9873f55f6a59a65f822", - "sha256:667a9706c970cb552ede35aee17339a18e8f2a87a51fba2ed39ceeeb1004798a", - "sha256:6ef9ea3f137e5711f0dbe5f9263e8c009b7069d8a1acea822bd5e9dae0ae49c8", - "sha256:7017b2be767b9d43cc31416aba48aab0d2309ee31b4dbf10a1d38fb7972bdf9d", - "sha256:7124e16b4c55d417577c2077be379514321916d5790fa287c9ed6f23bd2ffd01", - "sha256:73aaad12ac0ff500f62cebed98d8789198ea0e6f233421059fa68a5aa7220145", - "sha256:77c386de38a60d1dfb8e55b8c1101d68c79dfdd25c7095d51fec2dd800892b80", - "sha256:7876452af029456b3f3549b696bb36a06db7c90747740c5302f74a9e9fa14b13", - "sha256:7939aa3ca7d2a1593596e7ac6d59391ff30281ef280d8632fa03d81f7c5f955e", - "sha256:8320f64b777d00dd7ccdade271eaf0cad6636343293a25074cc5566160e4de7b", - "sha256:85f3ff71e2e60bd4b4932a043fbbe0f499e263c628390b285cb599154a3b03b1", - "sha256:8b8b36671f10ba80e159378df9c4f15c14098c4fd73a36b9ad715f057272fbef", - "sha256:93147c513fac16385d1036b7e5b102c7fbbdb163d556b791f0f11eada7ba65dc", - "sha256:935e943ec47c4afab8965954bf49bfa639c05d4ccf9ef6e924188f762145c0ff", - "sha256:94b6150a85e1b33b40b1464a3f9988dcc5251d6ed06842abff82e42632fac120", - "sha256:94ebba31df2aa506d7b14866fed00ac141a867e63143fe5bca82a8e503b36437", - "sha256:95ffcf719966dd7c453f908e208e14cde192e09fde6c7186c8f1896ef778d8cd", - "sha256:98884ecf2ffb7d7fe6bd517e8eb99d31ff7855a840fa6d0d63cd07c037f6a981", - "sha256:99cfaa2110534e2cf3ba31a7abcac9d328d1d9f1b95beede58294a60348fba36", - "sha256:9e8f8c9cb53cdac7ba9793c276acd90168f416b9ce36799b9b885790f8ad6c0a", - "sha256:a0dfc6c143b519113354e780a50381508139b07d2177cb6ad6a08278ec655798", - "sha256:b2795058c23988728eec1f36a4e5e4ebad22f8320c85f3587b539b9ac84128d7", - "sha256:b42703b1cf69f2aa1df7d1030b9d77d3e584a70755674d60e710f0af570f3761", - "sha256:b7cede291382a78f7bb5f04a529cb18e068dd29e0fb27376074b6d0317bf4dd0", - "sha256:b8a678974d1f3aa55f6cc34dc480169d58f2e6d8958895d68845fa4ab566509e", - "sha256:b8da394b34370874b4572676f36acabac172602abf054cbc4ac910219f3340af", - "sha256:c3a701fe5a9695b238503ce5bbe8218e03c3bcccf7e204e455e7462d770268aa", - "sha256:c4aab7f6381f38a4b42f269057aee279ab0fc7bf2e929e3d4abfae97b682a12c", - "sha256:ca9d0ff5ad43e785350894d97e13633a66e2b50000e8a183a50a88d834752d42", - "sha256:d0028e725ee18175c6e422797c407874da24381ce0690d6b9396c204c7f7276e", - "sha256:d21e10da6ec19b457b82636209cbe2331ff4306b54d06fa04b7c138ba18c8a81", - "sha256:d5e975ca70269d66d17dd995dafc06f1b06e8cb1ec1e9ed54c1d1e4a7c4cf26e", - "sha256:da7a9bff22ce038e19bf62c4dd1ec8391062878710ded0a845bcf47cc0200617", - "sha256:db32b5348615a04b82240cc67983cb315309e88d444a288934ee6ceaebcad6cc", - "sha256:dcc62f31eae24de7f8dce72134c8651c58000d3b1868e01392baea7c32c247de", - "sha256:dfc59d69fc48664bc693842bd57acfdd490acafda1ab52c7836e3fc75c90a111", - "sha256:e347b3bfcf985a05e8c0b7d462ba6f15b1ee1c909e2dcad795e49e91b152c383", - "sha256:e4d333e558953648ca09d64f13e6d8f0523fa705f51cae3f03b5983489958c70", - "sha256:ed10eac5830befbdd0c32f83e8aa6288361597550ba669b04c48f0f9a2c843c6", - "sha256:efc0f674aa41b92da8c49e0346318c6075d734994c3c4e4430b1c3f853e498e4", - "sha256:f1695e76146579f8c06c1509c7ce4dfe0706f49c6831a817ac04eebb2fd02011", - "sha256:f1d4aeb8891338e60d1ab6127af1fe45def5259def8094b9c7e34690c8858803", - "sha256:f406b22b7c9a9b4f8aa9d2ab13d6ae0ac3e85c9a809bd590ad53fed2bf70dc79", - "sha256:f6ff3b14f2df4c41660a7dec01045a045653998784bf8cfcb5a525bdffffbc8f" + "sha256:00cd814b8959b95a546e47e8d589610534cfb71f19802ea8a2ad99d95d702057", + "sha256:02a98600899ca1ca5d3a2590974c9e3ec259503b2d6ba6527605fcd74e08e207", + "sha256:02f5972ff02c9cf615357c17ab713737cccfd0eaf69b951084a9fd43f39833d3", + "sha256:055916fafad3e3388d27dd68517478933a97edc2fc54ae79d3bec827de2c64c4", + "sha256:0a16fb934fcabfdfacf21d79e6fed81809d8cd97bc1be9d9c89f0e4567143d7b", + "sha256:1592a615b598643dbfd566bac8467f06c8c8ab6e56f069e573832ed1d5d528cc", + "sha256:1919cbdc1c53ef739c94cf2985056bcc0838c1f217b57647cbf4578576c63825", + "sha256:1e4747712c4365ef6765708f948acc9c10350719ca0545e362c24ab973017370", + "sha256:1e76106b6fc55fa3d6fe1c527f95ee65e324a13b62e243f77b48317346559708", + "sha256:1f72667cc341c95184f1c68f957cb2d4fc31eef81646e8e59358a10ce6689457", + "sha256:2593283bf81ca37d27d110956b79e8723f9aa50c4bcdc29d3c0543d4743d2763", + "sha256:2dc5c43bb65ec3669452af0ab10729e8fdc17f87a1f2ad7ec65d4aaaefabf6bf", + "sha256:3091bc45e6b0c73f225374fefa1536cd91b1e987377b12ef5b19129b07d93ebe", + "sha256:354f67445f5bed6604e493a06a9a49ad65675d3d03477d38a4db4a427e9aad0e", + "sha256:3885f85b61798f4192d544aac7b25a04ece5fe2704670b4ab73c2d2c14ab740d", + "sha256:3ab7194ee290302ca15449f601036007873028712e92ca15fc76597a0aeb4c59", + "sha256:3aeca9848d08ce5eb653cf16e15bb25beeab36e53eb71cc32569f5f3afb2a3aa", + "sha256:44671c29da26539a5f142257eaba5110f71887c24d40df3ac87f1117df589e0e", + "sha256:45f9f4853fb4cc46783085261c9ec4706628f3b57de3e68bae03e8f8b3c0de51", + "sha256:4bd139e4943547ce3a56ef4b8b1b9479f9e40bb47e72cc906f0f66b9d0d5cab3", + "sha256:4fefc7aa68b34b9224490dfda2e70ccf2131368493add64b4ef2d372955c207e", + "sha256:6629311595e3fe7304039c67f00d145cd1d38cf723bb5b99cc987b23c1433d61", + "sha256:6fadd183186db360b61cb34e81117a096bff91c072929cd1b529eb20dd46e6c5", + "sha256:71566302219b17ca354eb274dfd29b8da3c268e41b646f330e324e3967546a74", + "sha256:7409796591d879425997a518138889d8d17e63ada7c99edc0d7a1c22007d4907", + "sha256:752f0e79785e11180ebd2e726c8a88109ded3e2301d40abced2543aa5d164275", + "sha256:7791dcb496ec53d60c7f1c78eaa156c21f402dda38542a00afc3e20cae0f480f", + "sha256:782743700ab75716650b5238a4759f840bb2dcf7bff56917e9ffdf9f1f23ec59", + "sha256:7c9896249fbef2c615853b890ee854f22c671560226c9221cfd27c995db97e5c", + "sha256:85f3e248507125bf4af607a26fd6cb8578776197bd4b66e35229cdf5acf1dfbf", + "sha256:89c69e9a10670eb7a66b8cef6354c24671ba241f46152dd3eed447f79c29fb5b", + "sha256:8cb8553ee954536500d88a1a2f58fcb867e45125e600e80f586ade399b3f8819", + "sha256:9ae572c996ae4b5e122331e12bbb971ea49c08cc7c232d1bd43150800a2d6c65", + "sha256:9c7b15fb9b88d9ee07e076f5a683027bc3befd5bb5d25954bb633c385d8b737e", + "sha256:9ea5231428af34226c05f927e16fc7f6fa5e39e3ad3cd24ffa48ba53a47f4240", + "sha256:a31ead8411a027c2c4759113cf2bd473690517494f3d6e4bf67064589afcd3c5", + "sha256:a8fa80665b1a29faf76800173ff5325095f3e66a78e62999929809907aca5659", + "sha256:ad053d34421a2debba45aa3cc39acf454acbcd025b3fc1a9f8a0dee237abd485", + "sha256:b24c7844c0a0afc3ccbeb0b807adeefb7eff2b5599229ecedddcfeb0ef333bec", + "sha256:b50a8c5c162469c3209e5ec92ee4f95c8231b11db6a04db09bbe338176723bb8", + "sha256:ba30e88607fb6990544d84caf3c706c4b48f629e18853fc6a646f82db9629418", + "sha256:bf3fc9145141250907730886b031681dfcc0de1c158f3cc51c092223c0f381ce", + "sha256:c23ea227847c9dbe0b3910f5c0dd95658b607137614eb821e6cbaecd60d81cc6", + "sha256:c3cc1a3ed00ecfea8932477f729a9f616ad7347a5e55d50929efa50a86cb7be7", + "sha256:c49e9f7c6f625507ed83a7485366b46cbe325717c60837f7244fc99ba16ba9d6", + "sha256:d0cb7d47199001de7658c213419358aa8937df767936506db0db7ce1a71f4a2f", + "sha256:d8009ae46259e31bc73dc183e402f548e980c96f33a6ef58cc2e7865db012e13", + "sha256:da956d534a6d1b9841f95ad0f18ace637668f680b1339ca4dcfb2c1837880a0b", + "sha256:dcb9cebbf3f62cb1e5afacae90761ccce0effb3adaa32339a0670fe7805d8068", + "sha256:decb0658ec19e5c1f519faa9a160c0fc85a41a7e6654b3ce1b44b939f8bf1325", + "sha256:df4d1509efd4977e6a844ac96d8be0b9e5aa5d5c77aa27ca9f4d3f92d3fcf330", + "sha256:eeb27bece45c0c2a5842ac4c5a1b5c2ceaefe5711078eed4e8043159fa05c834", + "sha256:efcdfb9df109e8a3b475c016f60438fcd4be68cd13a365d42b35914cdab4bb2b", + "sha256:fd9fb7c941280e2c837b603850efc93c999ae58aae2b40765ed682a6907ebbc5", + "sha256:fe46d4f8e94e637634d54477b0cfabcf93c53f29eedcbdeecaf2af32029b4421" ], "index": "pypi", - "version": "==3.1.1" + "version": "==3.2.2" }, "gunicorn": { "hashes": [ @@ -753,11 +538,11 @@ }, "jsonschema-specifications": { "hashes": [ - "sha256:0f38b83639958ce1152d02a7f062902c41c8fd20d558b0c34344292d417ae272", - "sha256:a09a0680616357d9a0ecf05c12ad234479f549239d0f5b55f3deea67475da9bf" + "sha256:4653bffbd6584f7de83a67e0d620ef16900b390ddc7939d56684d6c81e33f1af", + "sha256:630159c9f4dbea161a6a2205c3011cc4f18ff381b189fff48bb39b9bf26ae608" ], "markers": "python_version >= '3.9'", - "version": "==2024.10.1" + "version": "==2025.4.1" }, "jwt": { "hashes": [ @@ -849,176 +634,66 @@ "markers": "python_version >= '3.8'", "version": "==3.1.3" }, - "multidict": { - "hashes": [ - "sha256:032efeab3049e37eef2ff91271884303becc9e54d740b492a93b7e7266e23756", - "sha256:062428944a8dc69df9fdc5d5fc6279421e5f9c75a9ee3f586f274ba7b05ab3c8", - "sha256:0bb8f8302fbc7122033df959e25777b0b7659b1fd6bcb9cb6bed76b5de67afef", - "sha256:0d4b31f8a68dccbcd2c0ea04f0e014f1defc6b78f0eb8b35f2265e8716a6df0c", - "sha256:0ecdc12ea44bab2807d6b4a7e5eef25109ab1c82a8240d86d3c1fc9f3b72efd5", - "sha256:0ee1bf613c448997f73fc4efb4ecebebb1c02268028dd4f11f011f02300cf1e8", - "sha256:11990b5c757d956cd1db7cb140be50a63216af32cd6506329c2c59d732d802db", - "sha256:1535cec6443bfd80d028052e9d17ba6ff8a5a3534c51d285ba56c18af97e9713", - "sha256:1748cb2743bedc339d63eb1bca314061568793acd603a6e37b09a326334c9f44", - "sha256:1b2019317726f41e81154df636a897de1bfe9228c3724a433894e44cd2512378", - "sha256:1c152c49e42277bc9a2f7b78bd5fa10b13e88d1b0328221e7aef89d5c60a99a5", - "sha256:1f1c2f58f08b36f8475f3ec6f5aeb95270921d418bf18f90dffd6be5c7b0e676", - "sha256:1f4e0334d7a555c63f5c8952c57ab6f1c7b4f8c7f3442df689fc9f03df315c08", - "sha256:1f6f90700881438953eae443a9c6f8a509808bc3b185246992c4233ccee37fea", - "sha256:224b79471b4f21169ea25ebc37ed6f058040c578e50ade532e2066562597b8a9", - "sha256:236966ca6c472ea4e2d3f02f6673ebfd36ba3f23159c323f5a496869bc8e47c9", - "sha256:2427370f4a255262928cd14533a70d9738dfacadb7563bc3b7f704cc2360fc4e", - "sha256:24a8caa26521b9ad09732972927d7b45b66453e6ebd91a3c6a46d811eeb7349b", - "sha256:255dac25134d2b141c944b59a0d2f7211ca12a6d4779f7586a98b4b03ea80508", - "sha256:26ae9ad364fc61b936fb7bf4c9d8bd53f3a5b4417142cd0be5c509d6f767e2f1", - "sha256:2e329114f82ad4b9dd291bef614ea8971ec119ecd0f54795109976de75c9a852", - "sha256:3002a856367c0b41cad6784f5b8d3ab008eda194ed7864aaa58f65312e2abcac", - "sha256:30a3ebdc068c27e9d6081fca0e2c33fdf132ecea703a72ea216b81a66860adde", - "sha256:30c433a33be000dd968f5750722eaa0991037be0be4a9d453eba121774985bc8", - "sha256:31469d5832b5885adeb70982e531ce86f8c992334edd2f2254a10fa3182ac504", - "sha256:32a998bd8a64ca48616eac5a8c1cc4fa38fb244a3facf2eeb14abe186e0f6cc5", - "sha256:3307b48cd156153b117c0ea54890a3bdbf858a5b296ddd40dc3852e5f16e9b02", - "sha256:389cfefb599edf3fcfd5f64c0410da686f90f5f5e2c4d84e14f6797a5a337af4", - "sha256:3ada0b058c9f213c5f95ba301f922d402ac234f1111a7d8fd70f1b99f3c281ec", - "sha256:3b73e7227681f85d19dec46e5b881827cd354aabe46049e1a61d2f9aaa4e285a", - "sha256:3ccdde001578347e877ca4f629450973c510e88e8865d5aefbcb89b852ccc666", - "sha256:3cd06d88cb7398252284ee75c8db8e680aa0d321451132d0dba12bc995f0adcc", - "sha256:3cf62f8e447ea2c1395afa289b332e49e13d07435369b6f4e41f887db65b40bf", - "sha256:3d75e621e7d887d539d6e1d789f0c64271c250276c333480a9e1de089611f790", - "sha256:422a5ec315018e606473ba1f5431e064cf8b2a7468019233dcf8082fabad64c8", - "sha256:43173924fa93c7486402217fab99b60baf78d33806af299c56133a3755f69589", - "sha256:43fe10524fb0a0514be3954be53258e61d87341008ce4914f8e8b92bee6f875d", - "sha256:4543d8dc6470a82fde92b035a92529317191ce993533c3c0c68f56811164ed07", - "sha256:4eb33b0bdc50acd538f45041f5f19945a1f32b909b76d7b117c0c25d8063df56", - "sha256:5427a2679e95a642b7f8b0f761e660c845c8e6fe3141cddd6b62005bd133fc21", - "sha256:578568c4ba5f2b8abd956baf8b23790dbfdc953e87d5b110bce343b4a54fc9e7", - "sha256:59fe01ee8e2a1e8ceb3f6dbb216b09c8d9f4ef1c22c4fc825d045a147fa2ebc9", - "sha256:5e3929269e9d7eff905d6971d8b8c85e7dbc72c18fb99c8eae6fe0a152f2e343", - "sha256:61ed4d82f8a1e67eb9eb04f8587970d78fe7cddb4e4d6230b77eda23d27938f9", - "sha256:64bc2bbc5fba7b9db5c2c8d750824f41c6994e3882e6d73c903c2afa78d091e4", - "sha256:659318c6c8a85f6ecfc06b4e57529e5a78dfdd697260cc81f683492ad7e9435a", - "sha256:66eb80dd0ab36dbd559635e62fba3083a48a252633164857a1d1684f14326427", - "sha256:6b5a272bc7c36a2cd1b56ddc6bff02e9ce499f9f14ee4a45c45434ef083f2459", - "sha256:6d79cf5c0c6284e90f72123f4a3e4add52d6c6ebb4a9054e88df15b8d08444c6", - "sha256:7146a8742ea71b5d7d955bffcef58a9e6e04efba704b52a460134fefd10a8208", - "sha256:740915eb776617b57142ce0bb13b7596933496e2f798d3d15a20614adf30d229", - "sha256:75482f43465edefd8a5d72724887ccdcd0c83778ded8f0cb1e0594bf71736cc0", - "sha256:7a76534263d03ae0cfa721fea40fd2b5b9d17a6f85e98025931d41dc49504474", - "sha256:7d50d4abf6729921e9613d98344b74241572b751c6b37feed75fb0c37bd5a817", - "sha256:805031c2f599eee62ac579843555ed1ce389ae00c7e9f74c2a1b45e0564a88dd", - "sha256:8aac2eeff69b71f229a405c0a4b61b54bade8e10163bc7b44fcd257949620618", - "sha256:8b6fcf6054fc4114a27aa865f8840ef3d675f9316e81868e0ad5866184a6cba5", - "sha256:8bd2b875f4ca2bb527fe23e318ddd509b7df163407b0fb717df229041c6df5d3", - "sha256:8eac0c49df91b88bf91f818e0a24c1c46f3622978e2c27035bfdca98e0e18124", - "sha256:909f7d43ff8f13d1adccb6a397094adc369d4da794407f8dd592c51cf0eae4b1", - "sha256:995015cf4a3c0d72cbf453b10a999b92c5629eaf3a0c3e1efb4b5c1f602253bb", - "sha256:99592bd3162e9c664671fd14e578a33bfdba487ea64bcb41d281286d3c870ad7", - "sha256:9c64f4ddb3886dd8ab71b68a7431ad4aa01a8fa5be5b11543b29674f29ca0ba3", - "sha256:9e78006af1a7c8a8007e4f56629d7252668344442f66982368ac06522445e375", - "sha256:9f35de41aec4b323c71f54b0ca461ebf694fb48bec62f65221f52e0017955b39", - "sha256:a059ad6b80de5b84b9fa02a39400319e62edd39d210b4e4f8c4f1243bdac4752", - "sha256:a2b0fabae7939d09d7d16a711468c385272fa1b9b7fb0d37e51143585d8e72e0", - "sha256:a54ec568f1fc7f3c313c2f3b16e5db346bf3660e1309746e7fccbbfded856188", - "sha256:a62d78a1c9072949018cdb05d3c533924ef8ac9bcb06cbf96f6d14772c5cd451", - "sha256:a7bd27f7ab3204f16967a6f899b3e8e9eb3362c0ab91f2ee659e0345445e0078", - "sha256:a7be07e5df178430621c716a63151165684d3e9958f2bbfcb644246162007ab7", - "sha256:ab583ac203af1d09034be41458feeab7863c0635c650a16f15771e1386abf2d7", - "sha256:abcfed2c4c139f25c2355e180bcc077a7cae91eefbb8b3927bb3f836c9586f1f", - "sha256:acc9fa606f76fc111b4569348cc23a771cb52c61516dcc6bcef46d612edb483b", - "sha256:ae93e0ff43b6f6892999af64097b18561691ffd835e21a8348a441e256592e1f", - "sha256:b038f10e23f277153f86f95c777ba1958bcd5993194fda26a1d06fae98b2f00c", - "sha256:b128dbf1c939674a50dd0b28f12c244d90e5015e751a4f339a96c54f7275e291", - "sha256:b1b389ae17296dd739015d5ddb222ee99fd66adeae910de21ac950e00979d897", - "sha256:b57e28dbc031d13916b946719f213c494a517b442d7b48b29443e79610acd887", - "sha256:b90e27b4674e6c405ad6c64e515a505c6d113b832df52fdacb6b1ffd1fa9a1d1", - "sha256:b9cb19dfd83d35b6ff24a4022376ea6e45a2beba8ef3f0836b8a4b288b6ad685", - "sha256:ba46b51b6e51b4ef7bfb84b82f5db0dc5e300fb222a8a13b8cd4111898a869cf", - "sha256:be8751869e28b9c0d368d94f5afcb4234db66fe8496144547b4b6d6a0645cfc6", - "sha256:c23831bdee0a2a3cf21be057b5e5326292f60472fb6c6f86392bbf0de70ba731", - "sha256:c2e98c840c9c8e65c0e04b40c6c5066c8632678cd50c8721fdbcd2e09f21a507", - "sha256:c56c179839d5dcf51d565132185409d1d5dd8e614ba501eb79023a6cab25576b", - "sha256:c605a2b2dc14282b580454b9b5d14ebe0668381a3a26d0ac39daa0ca115eb2ae", - "sha256:ce5b3082e86aee80b3925ab4928198450d8e5b6466e11501fe03ad2191c6d777", - "sha256:d4e8535bd4d741039b5aad4285ecd9b902ef9e224711f0b6afda6e38d7ac02c7", - "sha256:daeac9dd30cda8703c417e4fddccd7c4dc0c73421a0b54a7da2713be125846be", - "sha256:dd53893675b729a965088aaadd6a1f326a72b83742b056c1065bdd2e2a42b4df", - "sha256:e1eb72c741fd24d5a28242ce72bb61bc91f8451877131fa3fe930edb195f7054", - "sha256:e413152e3212c4d39f82cf83c6f91be44bec9ddea950ce17af87fbf4e32ca6b2", - "sha256:ead46b0fa1dcf5af503a46e9f1c2e80b5d95c6011526352fa5f42ea201526124", - "sha256:eccb67b0e78aa2e38a04c5ecc13bab325a43e5159a181a9d1a6723db913cbb3c", - "sha256:edf74dc5e212b8c75165b435c43eb0d5e81b6b300a938a4eb82827119115e840", - "sha256:f2882bf27037eb687e49591690e5d491e677272964f9ec7bc2abbe09108bdfb8", - "sha256:f6f19170197cc29baccd33ccc5b5d6a331058796485857cf34f7635aa25fb0cd", - "sha256:f84627997008390dd15762128dcf73c3365f4ec0106739cde6c20a07ed198ec8", - "sha256:f901a5aace8e8c25d78960dcc24c870c8d356660d3b49b93a78bf38eb682aac3", - "sha256:f92c7f62d59373cd93bc9969d2da9b4b21f78283b1379ba012f7ee8127b3152e", - "sha256:fb6214fe1750adc2a1b801a199d64b5a67671bf76ebf24c730b157846d0e90d2", - "sha256:fbd8d737867912b6c5f99f56782b8cb81f978a97b4437a1c476de90a3e41c9a1", - "sha256:fbf226ac85f7d6b6b9ba77db4ec0704fde88463dc17717aec78ec3c8546c70ad" - ], - "markers": "python_version >= '3.9'", - "version": "==6.4.3" - }, "numpy": { "hashes": [ - "sha256:05c076d531e9998e7e694c36e8b349969c56eadd2cdcd07242958489d79a7286", - "sha256:0d54974f9cf14acf49c60f0f7f4084b6579d24d439453d5fc5805d46a165b542", - "sha256:11c43995255eb4127115956495f43e9343736edb7fcdb0d973defd9de14cd84f", - "sha256:188dcbca89834cc2e14eb2f106c96d6d46f200fe0200310fc29089657379c58d", - "sha256:1974afec0b479e50438fc3648974268f972e2d908ddb6d7fb634598cdb8260a0", - "sha256:1cf4e5c6a278d620dee9ddeb487dc6a860f9b199eadeecc567f777daace1e9e7", - "sha256:207a2b8441cc8b6a2a78c9ddc64d00d20c303d79fba08c577752f080c4007ee3", - "sha256:218f061d2faa73621fa23d6359442b0fc658d5b9a70801373625d958259eaca3", - "sha256:2aad3c17ed2ff455b8eaafe06bcdae0062a1db77cb99f4b9cbb5f4ecb13c5146", - "sha256:2fa8fa7697ad1646b5c93de1719965844e004fcad23c91228aca1cf0800044a1", - "sha256:31504f970f563d99f71a3512d0c01a645b692b12a63630d6aafa0939e52361e6", - "sha256:3387dd7232804b341165cedcb90694565a6015433ee076c6754775e85d86f1fc", - "sha256:4ba5054787e89c59c593a4169830ab362ac2bee8a969249dc56e5d7d20ff8df9", - "sha256:4f92084defa704deadd4e0a5ab1dc52d8ac9e8a8ef617f3fbb853e79b0ea3592", - "sha256:65ef3468b53269eb5fdb3a5c09508c032b793da03251d5f8722b1194f1790c00", - "sha256:6f527d8fdb0286fd2fd97a2a96c6be17ba4232da346931d967a0630050dfd298", - "sha256:7051ee569db5fbac144335e0f3b9c2337e0c8d5c9fee015f259a5bd70772b7e8", - "sha256:7716e4a9b7af82c06a2543c53ca476fa0b57e4d760481273e09da04b74ee6ee2", - "sha256:79bd5f0a02aa16808fcbc79a9a376a147cc1045f7dfe44c6e7d53fa8b8a79392", - "sha256:7a4e84a6283b36632e2a5b56e121961f6542ab886bc9e12f8f9818b3c266bfbb", - "sha256:8120575cb4882318c791f839a4fd66161a6fa46f3f0a5e613071aae35b5dd8f8", - "sha256:81413336ef121a6ba746892fad881a83351ee3e1e4011f52e97fba79233611fd", - "sha256:8146f3550d627252269ac42ae660281d673eb6f8b32f113538e0cc2a9aed42b9", - "sha256:879cf3a9a2b53a4672a168c21375166171bc3932b7e21f622201811c43cdd3b0", - "sha256:892c10d6a73e0f14935c31229e03325a7b3093fafd6ce0af704be7f894d95687", - "sha256:92bda934a791c01d6d9d8e038363c50918ef7c40601552a58ac84c9613a665bc", - "sha256:9ba03692a45d3eef66559efe1d1096c4b9b75c0986b5dff5530c378fb8331d4f", - "sha256:9eeea959168ea555e556b8188da5fa7831e21d91ce031e95ce23747b7609f8a4", - "sha256:a0258ad1f44f138b791327961caedffbf9612bfa504ab9597157806faa95194a", - "sha256:a761ba0fa886a7bb33c6c8f6f20213735cb19642c580a931c625ee377ee8bd39", - "sha256:a7b9084668aa0f64e64bd00d27ba5146ef1c3a8835f3bd912e7a9e01326804c4", - "sha256:a84eda42bd12edc36eb5b53bbcc9b406820d3353f1994b6cfe453a33ff101775", - "sha256:ab2939cd5bec30a7430cbdb2287b63151b77cf9624de0532d629c9a1c59b1d5c", - "sha256:ac0280f1ba4a4bfff363a99a6aceed4f8e123f8a9b234c89140f5e894e452ecd", - "sha256:adf8c1d66f432ce577d0197dceaac2ac00c0759f573f28516246351c58a85020", - "sha256:b4adfbbc64014976d2f91084915ca4e626fbf2057fb81af209c1a6d776d23e3d", - "sha256:bb649f8b207ab07caebba230d851b579a3c8711a851d29efe15008e31bb4de24", - "sha256:bce43e386c16898b91e162e5baaad90c4b06f9dcbe36282490032cec98dc8ae7", - "sha256:bd3ad3b0a40e713fc68f99ecfd07124195333f1e689387c180813f0e94309d6f", - "sha256:c3f7ac96b16955634e223b579a3e5798df59007ca43e8d451a0e6a50f6bfdfba", - "sha256:cf28633d64294969c019c6df4ff37f5698e8326db68cc2b66576a51fad634880", - "sha256:d0f35b19894a9e08639fd60a1ec1978cb7f5f7f1eace62f38dd36be8aecdef4d", - "sha256:db1f1c22173ac1c58db249ae48aa7ead29f534b9a948bc56828337aa84a32ed6", - "sha256:dbe512c511956b893d2dacd007d955a3f03d555ae05cfa3ff1c1ff6df8851854", - "sha256:df2f57871a96bbc1b69733cd4c51dc33bea66146b8c63cacbfed73eec0883017", - "sha256:e2f085ce2e813a50dfd0e01fbfc0c12bbe5d2063d99f8b29da30e544fb6483b8", - "sha256:e642d86b8f956098b564a45e6f6ce68a22c2c97a04f5acd3f221f57b8cb850ae", - "sha256:e9e0a277bb2eb5d8a7407e14688b85fd8ad628ee4e0c7930415687b6564207a4", - "sha256:ea2bb7e2ae9e37d96835b3576a4fa4b3a97592fbea8ef7c3587078b0068b8f09", - "sha256:ee4d528022f4c5ff67332469e10efe06a267e32f4067dc76bb7e2cddf3cd25ff", - "sha256:f05d4198c1bacc9124018109c5fba2f3201dbe7ab6e92ff100494f236209c960", - "sha256:f34dc300df798742b3d06515aa2a0aee20941c13579d7a2f2e10af01ae4901ee", - "sha256:f4162988a360a29af158aeb4a2f4f09ffed6a969c9776f8f3bdee9b06a8ab7e5", - "sha256:f486038e44caa08dbd97275a9a35a283a8f1d2f0ee60ac260a1790e76660833c", - "sha256:f7de08cbe5551911886d1ab60de58448c6df0f67d9feb7d1fb21e9875ef95e91" + "sha256:038613e9fb8c72b0a41f025a7e4c3f0b7a1b5d768ece4796b674c8f3fe13efff", + "sha256:0678000bb9ac1475cd454c6b8c799206af8107e310843532b04d49649c717a47", + "sha256:0811bb762109d9708cca4d0b13c4f67146e3c3b7cf8d34018c722adb2d957c84", + "sha256:0b605b275d7bd0c640cad4e5d30fa701a8d59302e127e5f79138ad62762c3e3d", + "sha256:0bca768cd85ae743b2affdc762d617eddf3bcf8724435498a1e80132d04879e6", + "sha256:1bc23a79bfabc5d056d106f9befb8d50c31ced2fbc70eedb8155aec74a45798f", + "sha256:287cc3162b6f01463ccd86be154f284d0893d2b3ed7292439ea97eafa8170e0b", + "sha256:37c0ca431f82cd5fa716eca9506aefcabc247fb27ba69c5062a6d3ade8cf8f49", + "sha256:37e990a01ae6ec7fe7fa1c26c55ecb672dd98b19c3d0e1d1f326fa13cb38d163", + "sha256:389d771b1623ec92636b0786bc4ae56abafad4a4c513d36a55dce14bd9ce8571", + "sha256:3d70692235e759f260c3d837193090014aebdf026dfd167834bcba43e30c2a42", + "sha256:41c5a21f4a04fa86436124d388f6ed60a9343a6f767fced1a8a71c3fbca038ff", + "sha256:481b49095335f8eed42e39e8041327c05b0f6f4780488f61286ed3c01368d491", + "sha256:4eeaae00d789f66c7a25ac5f34b71a7035bb474e679f410e5e1a94deb24cf2d4", + "sha256:55a4d33fa519660d69614a9fad433be87e5252f4b03850642f88993f7b2ca566", + "sha256:5a6429d4be8ca66d889b7cf70f536a397dc45ba6faeb5f8c5427935d9592e9cf", + "sha256:5bd4fc3ac8926b3819797a7c0e2631eb889b4118a9898c84f585a54d475b7e40", + "sha256:5beb72339d9d4fa36522fc63802f469b13cdbe4fdab4a288f0c441b74272ebfd", + "sha256:6031dd6dfecc0cf9f668681a37648373bddd6421fff6c66ec1624eed0180ee06", + "sha256:71594f7c51a18e728451bb50cc60a3ce4e6538822731b2933209a1f3614e9282", + "sha256:74d4531beb257d2c3f4b261bfb0fc09e0f9ebb8842d82a7b4209415896adc680", + "sha256:7befc596a7dc9da8a337f79802ee8adb30a552a94f792b9c9d18c840055907db", + "sha256:894b3a42502226a1cac872f840030665f33326fc3dac8e57c607905773cdcde3", + "sha256:8e41fd67c52b86603a91c1a505ebaef50b3314de0213461c7a6e99c9a3beff90", + "sha256:8e9ace4a37db23421249ed236fdcdd457d671e25146786dfc96835cd951aa7c1", + "sha256:8fc377d995680230e83241d8a96def29f204b5782f371c532579b4f20607a289", + "sha256:9551a499bf125c1d4f9e250377c1ee2eddd02e01eac6644c080162c0c51778ab", + "sha256:b0544343a702fa80c95ad5d3d608ea3599dd54d4632df855e4c8d24eb6ecfa1c", + "sha256:b093dd74e50a8cba3e873868d9e93a85b78e0daf2e98c6797566ad8044e8363d", + "sha256:b412caa66f72040e6d268491a59f2c43bf03eb6c96dd8f0307829feb7fa2b6fb", + "sha256:b4f13750ce79751586ae2eb824ba7e1e8dba64784086c98cdbbcc6a42112ce0d", + "sha256:b64d8d4d17135e00c8e346e0a738deb17e754230d7e0810ac5012750bbd85a5a", + "sha256:ba10f8411898fc418a521833e014a77d3ca01c15b0c6cdcce6a0d2897e6dbbdf", + "sha256:bd48227a919f1bafbdda0583705e547892342c26fb127219d60a5c36882609d1", + "sha256:c1f9540be57940698ed329904db803cf7a402f3fc200bfe599334c9bd84a40b2", + "sha256:c820a93b0255bc360f53eca31a0e676fd1101f673dda8da93454a12e23fc5f7a", + "sha256:ce47521a4754c8f4593837384bd3424880629f718d87c5d44f8ed763edd63543", + "sha256:d042d24c90c41b54fd506da306759e06e568864df8ec17ccc17e9e884634fd00", + "sha256:de749064336d37e340f640b05f24e9e3dd678c57318c7289d222a8a2f543e90c", + "sha256:e1dda9c7e08dc141e0247a5b8f49cf05984955246a327d4c48bda16821947b2f", + "sha256:e29554e2bef54a90aa5cc07da6ce955accb83f21ab5de01a62c8478897b264fd", + "sha256:e3143e4451880bed956e706a3220b4e5cf6172ef05fcc397f6f36a550b1dd868", + "sha256:e8213002e427c69c45a52bbd94163084025f533a55a59d6f9c5b820774ef3303", + "sha256:efd28d4e9cd7d7a8d39074a4d44c63eda73401580c5c76acda2ce969e0a38e83", + "sha256:f0fd6321b839904e15c46e0d257fdd101dd7f530fe03fd6359c1ea63738703f3", + "sha256:f1372f041402e37e5e633e586f62aa53de2eac8d98cbfb822806ce4bbefcb74d", + "sha256:f2618db89be1b4e05f7a1a847a9c1c0abd63e63a1607d892dd54668dd92faf87", + "sha256:f447e6acb680fd307f40d3da4852208af94afdfab89cf850986c3ca00562f4fa", + "sha256:f92729c95468a2f4f15e9bb94c432a9229d0d50de67304399627a943201baa2f", + "sha256:f9f1adb22318e121c5c69a09142811a201ef17ab257a1e66ca3025065b7f53ae", + "sha256:fc0c5673685c508a142ca65209b4e79ed6740a4ed6b2267dbba90f34b0b3cfda", + "sha256:fc7b73d02efb0e18c000e9ad8b83480dfcd5dfd11065997ed4c6747470ae8915", + "sha256:fd83c01228a688733f1ded5201c678f0c53ecc1006ffbc404db9f7a899ac6249", + "sha256:fe27749d33bb772c80dcd84ae7e8df2adc920ae8297400dabec45f0dedb3f6de", + "sha256:fee4236c876c4e8369388054d02d0e9bb84821feb1a64dd59e137e6511a551f8" ], "index": "pypi", - "version": "==2.2.4" + "version": "==2.2.6" }, "opensearch-py": { "hashes": [ @@ -1030,11 +705,11 @@ }, "packaging": { "hashes": [ - "sha256:09abb1bccd265c01f4a3aa3f7a7db064b36514d2cba19a2f694fe6150451a759", - "sha256:c228a6dc5e932d346bc5739379109d49e8853dd8223571c7c5b55260edc0b97f" + "sha256:29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484", + "sha256:d443872c98d677bf60f6a1f2f8c1cb748e8fe762d2bf9d3148b5599295b0fc4f" ], "markers": "python_version >= '3.8'", - "version": "==24.2" + "version": "==25.0" }, "pandas": { "hashes": [ @@ -1094,11 +769,11 @@ }, "prometheus-client": { "hashes": [ - "sha256:252505a722ac04b0456be05c05f75f45d760c2911ffc45f2a06bcaed9f3ae3fb", - "sha256:594b45c410d6f4f8888940fe80b5cc2521b305a1fafe1c58609ef715a001f301" + "sha256:18da1d2241ac2d10c8d2110f13eedcd5c7c0c8af18c926e8731f04fc10cd575c", + "sha256:c8951bbe64e62b96cd8e8f5d917279d1b9b91ab766793f33d4dce6c228558713" ], - "markers": "python_version >= '3.8'", - "version": "==0.21.1" + "markers": "python_version >= '3.9'", + "version": "==0.22.0" }, "prometheus-flask-exporter": { "hashes": [ @@ -1108,110 +783,6 @@ "index": "pypi", "version": "==0.23.2" }, - "propcache": { - "hashes": [ - "sha256:050b571b2e96ec942898f8eb46ea4bfbb19bd5502424747e83badc2d4a99a44e", - "sha256:05543250deac8e61084234d5fc54f8ebd254e8f2b39a16b1dce48904f45b744b", - "sha256:069e7212890b0bcf9b2be0a03afb0c2d5161d91e1bf51569a64f629acc7defbf", - "sha256:09400e98545c998d57d10035ff623266927cb784d13dd2b31fd33b8a5316b85b", - "sha256:0c3c3a203c375b08fd06a20da3cf7aac293b834b6f4f4db71190e8422750cca5", - "sha256:0c86e7ceea56376216eba345aa1fc6a8a6b27ac236181f840d1d7e6a1ea9ba5c", - "sha256:0fbe94666e62ebe36cd652f5fc012abfbc2342de99b523f8267a678e4dfdee3c", - "sha256:17d1c688a443355234f3c031349da69444be052613483f3e4158eef751abcd8a", - "sha256:19a06db789a4bd896ee91ebc50d059e23b3639c25d58eb35be3ca1cbe967c3bf", - "sha256:1c5c7ab7f2bb3f573d1cb921993006ba2d39e8621019dffb1c5bc94cdbae81e8", - "sha256:1eb34d90aac9bfbced9a58b266f8946cb5935869ff01b164573a7634d39fbcb5", - "sha256:1f6cc0ad7b4560e5637eb2c994e97b4fa41ba8226069c9277eb5ea7101845b42", - "sha256:27c6ac6aa9fc7bc662f594ef380707494cb42c22786a558d95fcdedb9aa5d035", - "sha256:2d219b0dbabe75e15e581fc1ae796109b07c8ba7d25b9ae8d650da582bed01b0", - "sha256:2fce1df66915909ff6c824bbb5eb403d2d15f98f1518e583074671a30fe0c21e", - "sha256:319fa8765bfd6a265e5fa661547556da381e53274bc05094fc9ea50da51bfd46", - "sha256:359e81a949a7619802eb601d66d37072b79b79c2505e6d3fd8b945538411400d", - "sha256:3a02a28095b5e63128bcae98eb59025924f121f048a62393db682f049bf4ac24", - "sha256:3e19ea4ea0bf46179f8a3652ac1426e6dcbaf577ce4b4f65be581e237340420d", - "sha256:3e584b6d388aeb0001d6d5c2bd86b26304adde6d9bb9bfa9c4889805021b96de", - "sha256:40d980c33765359098837527e18eddefc9a24cea5b45e078a7f3bb5b032c6ecf", - "sha256:4114c4ada8f3181af20808bedb250da6bae56660e4b8dfd9cd95d4549c0962f7", - "sha256:43593c6772aa12abc3af7784bff4a41ffa921608dd38b77cf1dfd7f5c4e71371", - "sha256:47ef24aa6511e388e9894ec16f0fbf3313a53ee68402bc428744a367ec55b833", - "sha256:4cf9e93a81979f1424f1a3d155213dc928f1069d697e4353edb8a5eba67c6259", - "sha256:4d0dfdd9a2ebc77b869a0b04423591ea8823f791293b527dc1bb896c1d6f1136", - "sha256:563f9d8c03ad645597b8d010ef4e9eab359faeb11a0a2ac9f7b4bc8c28ebef25", - "sha256:58aa11f4ca8b60113d4b8e32d37e7e78bd8af4d1a5b5cb4979ed856a45e62005", - "sha256:5a0a9898fdb99bf11786265468571e628ba60af80dc3f6eb89a3545540c6b0ef", - "sha256:5aed8d8308215089c0734a2af4f2e95eeb360660184ad3912686c181e500b2e7", - "sha256:5b9145c35cc87313b5fd480144f8078716007656093d23059e8993d3a8fa730f", - "sha256:5cb5918253912e088edbf023788de539219718d3b10aef334476b62d2b53de53", - "sha256:5cdb0f3e1eb6dfc9965d19734d8f9c481b294b5274337a8cb5cb01b462dcb7e0", - "sha256:5ced33d827625d0a589e831126ccb4f5c29dfdf6766cac441d23995a65825dcb", - "sha256:603f1fe4144420374f1a69b907494c3acbc867a581c2d49d4175b0de7cc64566", - "sha256:61014615c1274df8da5991a1e5da85a3ccb00c2d4701ac6f3383afd3ca47ab0a", - "sha256:64a956dff37080b352c1c40b2966b09defb014347043e740d420ca1eb7c9b908", - "sha256:668ddddc9f3075af019f784456267eb504cb77c2c4bd46cc8402d723b4d200bf", - "sha256:6d8e309ff9a0503ef70dc9a0ebd3e69cf7b3894c9ae2ae81fc10943c37762458", - "sha256:6f173bbfe976105aaa890b712d1759de339d8a7cef2fc0a1714cc1a1e1c47f64", - "sha256:71ebe3fe42656a2328ab08933d420df5f3ab121772eef78f2dc63624157f0ed9", - "sha256:730178f476ef03d3d4d255f0c9fa186cb1d13fd33ffe89d39f2cda4da90ceb71", - "sha256:7d2d5a0028d920738372630870e7d9644ce437142197f8c827194fca404bf03b", - "sha256:7f30241577d2fef2602113b70ef7231bf4c69a97e04693bde08ddab913ba0ce5", - "sha256:813fbb8b6aea2fc9659815e585e548fe706d6f663fa73dff59a1677d4595a037", - "sha256:82de5da8c8893056603ac2d6a89eb8b4df49abf1a7c19d536984c8dd63f481d5", - "sha256:83be47aa4e35b87c106fc0c84c0fc069d3f9b9b06d3c494cd404ec6747544894", - "sha256:8638f99dca15b9dff328fb6273e09f03d1c50d9b6512f3b65a4154588a7595fe", - "sha256:87380fb1f3089d2a0b8b00f006ed12bd41bd858fabfa7330c954c70f50ed8757", - "sha256:88c423efef9d7a59dae0614eaed718449c09a5ac79a5f224a8b9664d603f04a3", - "sha256:89498dd49c2f9a026ee057965cdf8192e5ae070ce7d7a7bd4b66a8e257d0c976", - "sha256:8a17583515a04358b034e241f952f1715243482fc2c2945fd99a1b03a0bd77d6", - "sha256:916cd229b0150129d645ec51614d38129ee74c03293a9f3f17537be0029a9641", - "sha256:9532ea0b26a401264b1365146c440a6d78269ed41f83f23818d4b79497aeabe7", - "sha256:967a8eec513dbe08330f10137eacb427b2ca52118769e82ebcfcab0fba92a649", - "sha256:975af16f406ce48f1333ec5e912fe11064605d5c5b3f6746969077cc3adeb120", - "sha256:9979643ffc69b799d50d3a7b72b5164a2e97e117009d7af6dfdd2ab906cb72cd", - "sha256:9a8ecf38de50a7f518c21568c80f985e776397b902f1ce0b01f799aba1608b40", - "sha256:9cec3239c85ed15bfaded997773fdad9fb5662b0a7cbc854a43f291eb183179e", - "sha256:9e64e948ab41411958670f1093c0a57acfdc3bee5cf5b935671bbd5313bcf229", - "sha256:9f64d91b751df77931336b5ff7bafbe8845c5770b06630e27acd5dbb71e1931c", - "sha256:a0ab8cf8cdd2194f8ff979a43ab43049b1df0b37aa64ab7eca04ac14429baeb7", - "sha256:a110205022d077da24e60b3df8bcee73971be9575dec5573dd17ae5d81751111", - "sha256:a34aa3a1abc50740be6ac0ab9d594e274f59960d3ad253cd318af76b996dd654", - "sha256:a444192f20f5ce8a5e52761a031b90f5ea6288b1eef42ad4c7e64fef33540b8f", - "sha256:a461959ead5b38e2581998700b26346b78cd98540b5524796c175722f18b0294", - "sha256:a75801768bbe65499495660b777e018cbe90c7980f07f8aa57d6be79ea6f71da", - "sha256:aa8efd8c5adc5a2c9d3b952815ff8f7710cefdcaf5f2c36d26aff51aeca2f12f", - "sha256:aca63103895c7d960a5b9b044a83f544b233c95e0dcff114389d64d762017af7", - "sha256:b0313e8b923b3814d1c4a524c93dfecea5f39fa95601f6a9b1ac96cd66f89ea0", - "sha256:b23c11c2c9e6d4e7300c92e022046ad09b91fd00e36e83c44483df4afa990073", - "sha256:b303b194c2e6f171cfddf8b8ba30baefccf03d36a4d9cab7fd0bb68ba476a3d7", - "sha256:b655032b202028a582d27aeedc2e813299f82cb232f969f87a4fde491a233f11", - "sha256:bd39c92e4c8f6cbf5f08257d6360123af72af9f4da75a690bef50da77362d25f", - "sha256:bef100c88d8692864651b5f98e871fb090bd65c8a41a1cb0ff2322db39c96c27", - "sha256:c2fe5c910f6007e716a06d269608d307b4f36e7babee5f36533722660e8c4a70", - "sha256:c66d8ccbc902ad548312b96ed8d5d266d0d2c6d006fd0f66323e9d8f2dd49be7", - "sha256:cd6a55f65241c551eb53f8cf4d2f4af33512c39da5d9777694e9d9c60872f519", - "sha256:d249609e547c04d190e820d0d4c8ca03ed4582bcf8e4e160a6969ddfb57b62e5", - "sha256:d4e89cde74154c7b5957f87a355bb9c8ec929c167b59c83d90654ea36aeb6180", - "sha256:dc1915ec523b3b494933b5424980831b636fe483d7d543f7afb7b3bf00f0c10f", - "sha256:e1c4d24b804b3a87e9350f79e2371a705a188d292fd310e663483af6ee6718ee", - "sha256:e474fc718e73ba5ec5180358aa07f6aded0ff5f2abe700e3115c37d75c947e18", - "sha256:e4fe2a6d5ce975c117a6bb1e8ccda772d1e7029c1cca1acd209f91d30fa72815", - "sha256:e7fb9a84c9abbf2b2683fa3e7b0d7da4d8ecf139a1c635732a8bda29c5214b0e", - "sha256:e861ad82892408487be144906a368ddbe2dc6297074ade2d892341b35c59844a", - "sha256:ec314cde7314d2dd0510c6787326bbffcbdc317ecee6b7401ce218b3099075a7", - "sha256:ed5f6d2edbf349bd8d630e81f474d33d6ae5d07760c44d33cd808e2f5c8f4ae6", - "sha256:ef2e4e91fb3945769e14ce82ed53007195e616a63aa43b40fb7ebaaf907c8d4c", - "sha256:f011f104db880f4e2166bcdcf7f58250f7a465bc6b068dc84c824a3d4a5c94dc", - "sha256:f1528ec4374617a7a753f90f20e2f551121bb558fcb35926f99e3c42367164b8", - "sha256:f27785888d2fdd918bc36de8b8739f2d6c791399552333721b58193f68ea3e98", - "sha256:f35c7070eeec2cdaac6fd3fe245226ed2a6292d3ee8c938e5bb645b434c5f256", - "sha256:f3bbecd2f34d0e6d3c543fdb3b15d6b60dd69970c2b4c822379e5ec8f6f621d5", - "sha256:f6f1324db48f001c2ca26a25fa25af60711e09b9aaf4b28488602776f4f9a744", - "sha256:f78eb8422acc93d7b69964012ad7048764bb45a54ba7a39bb9e146c72ea29723", - "sha256:fb6e0faf8cb6b4beea5d6ed7b5a578254c6d7df54c36ccd3d8b3eb00d6770277", - "sha256:feccd282de1f6322f56f6845bf1207a537227812f0a9bf5571df52bb418d79d5" - ], - "markers": "python_version >= '3.9'", - "version": "==0.3.1" - }, "pycparser": { "hashes": [ "sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6", @@ -1222,151 +793,163 @@ }, "pycryptodome": { "hashes": [ - "sha256:009e1c80eea42401a5bd5983c4bab8d516aef22e014a4705622e24e6d9d703c6", - "sha256:18d5b0ddc7cf69231736d778bd3ae2b3efb681ae33b64b0c92fb4626bb48bb89", - "sha256:2988ffcd5137dc2d27eb51cd18c0f0f68e5b009d5fec56fbccb638f90934f333", - "sha256:37ddcd18284e6b36b0a71ea495a4c4dca35bb09ccc9bfd5b91bfaf2321f131c1", - "sha256:3b76fa80daeff9519d7e9f6d9e40708f2fce36b9295a847f00624a08293f4f00", - "sha256:56c6f9342fcb6c74e205fbd2fee568ec4cdbdaa6165c8fde55dbc4ba5f584464", - "sha256:87a88dc543b62b5c669895caf6c5a958ac7abc8863919e94b7a6cafd2f64064f", - "sha256:8f4f6f47a7f411f2c157e77bbbda289e0c9f9e1e9944caa73c1c2e33f3f92d6e", - "sha256:96e73527c9185a3d9b4c6d1cfb4494f6ced418573150be170f6580cb975a7f5a", - "sha256:98fd9da809d5675f3a65dcd9ed384b9dc67edab6a4cda150c5870a8122ec961d", - "sha256:9dbb749cef71c28271484cbef684f9b5b19962153487735411e1020ca3f59cb1", - "sha256:9e1bb165ea1dc83a11e5dbbe00ef2c378d148f3a2d3834fb5ba4e0f6fd0afe4b", - "sha256:a0092fd476701eeeb04df5cc509d8b739fa381583cda6a46ff0a60639b7cd70d", - "sha256:a26bcfee1293b7257c83b0bd13235a4ee58165352be4f8c45db851ba46996dc6", - "sha256:a31fa5914b255ab62aac9265654292ce0404f6b66540a065f538466474baedbc", - "sha256:a6cf9553b29624961cab0785a3177a333e09e37ba62ad22314ebdbb01ca79840", - "sha256:aec7b40a7ea5af7c40f8837adf20a137d5e11a6eb202cde7e588a48fb2d871a8", - "sha256:b4bdce34af16c1dcc7f8c66185684be15f5818afd2a82b75a4ce6b55f9783e13", - "sha256:d086aed307e96d40c23c42418cbbca22ecc0ab4a8a0e24f87932eeab26c08627", - "sha256:d21c1eda2f42211f18a25db4eaf8056c94a8563cd39da3683f89fe0d881fb772", - "sha256:d4d1174677855c266eed5c4b4e25daa4225ad0c9ffe7584bb1816767892545d0", - "sha256:e653519dedcd1532788547f00eeb6108cc7ce9efdf5cc9996abce0d53f95d5a9", - "sha256:e7514a1aebee8e85802d154fdb261381f1cb9b7c5a54594545145b8ec3056ae6", - "sha256:f02baa9f5e35934c6e8dcec91fcde96612bdefef6e442813b8ea34e82c84bbfb", - "sha256:f1ae7beb64d4fc4903a6a6cca80f1f448e7a8a95b77d106f8a29f2eb44d17547", - "sha256:f5810bc7494e4ac12a4afef5a32218129e7d3890ce3f2b5ec520cc69eb1102ad", - "sha256:f6cf6aa36fcf463e622d2165a5ad9963b2762bebae2f632d719dfb8544903cf5", - "sha256:f7a683bc9fa585c0dfec7fa4801c96a48d30b30b096e3297f9374f40c2fedafc", - "sha256:fd7ab568b3ad7b77c908d7c3f7e167ec5a8f035c64ff74f10d47a4edd043d723" + "sha256:0011f7f00cdb74879142011f95133274741778abba114ceca229adbf8e62c3e4", + "sha256:11eeeb6917903876f134b56ba11abe95c0b0fd5e3330def218083c7d98bbcb3c", + "sha256:14e15c081e912c4b0d75632acd8382dfce45b258667aa3c67caf7a4d4c13f630", + "sha256:156df9667ad9f2ad26255926524e1c136d6664b741547deb0a86a9acf5ea631f", + "sha256:187058ab80b3281b1de11c2e6842a357a1f71b42cb1e15bce373f3d238135c27", + "sha256:257bb3572c63ad8ba40b89f6fc9d63a2a628e9f9708d31ee26560925ebe0210a", + "sha256:350ebc1eba1da729b35ab7627a833a1a355ee4e852d8ba0447fafe7b14504d56", + "sha256:447700a657182d60338bab09fdb27518f8856aecd80ae4c6bdddb67ff5da44ef", + "sha256:45c69ad715ca1a94f778215a11e66b7ff989d792a4d63b68dc586a1da1392ff5", + "sha256:4764e64b269fc83b00f682c47443c2e6e85b18273712b98aa43bcb77f8570477", + "sha256:507dbead45474b62b2bbe318eb1c4c8ee641077532067fec9c1aa82c31f84886", + "sha256:53ecbafc2b55353edcebd64bf5da94a2a2cdf5090a6915bcca6eca6cc452585a", + "sha256:573a0b3017e06f2cffd27d92ef22e46aa3be87a2d317a5abf7cc0e84e321bd75", + "sha256:63dad881b99ca653302b2c7191998dd677226222a3f2ea79999aa51ce695f720", + "sha256:64093fc334c1eccfd3933c134c4457c34eaca235eeae49d69449dc4728079339", + "sha256:6501790c5b62a29fcb227bd6b62012181d886a767ce9ed03b303d1f22eb5c625", + "sha256:67bd81fcbe34f43ad9422ee8fd4843c8e7198dd88dd3d40e6de42ee65fbe1490", + "sha256:6fe8258e2039eceb74dfec66b3672552b6b7d2c235b2dfecc05d16b8921649a8", + "sha256:763d1d74f56f031788e5d307029caef067febf890cd1f8bf61183ae142f1a77b", + "sha256:7ac1080a8da569bde76c0a104589c4f414b8ba296c0b3738cf39a466a9fb1818", + "sha256:865d83c906b0fc6a59b510deceee656b6bc1c4fa0d82176e2b77e97a420a996a", + "sha256:89d4d56153efc4d81defe8b65fd0821ef8b2d5ddf8ed19df31ba2f00872b8002", + "sha256:90460fc9e088ce095f9ee8356722d4f10f86e5be06e2354230a9880b9c549aae", + "sha256:93837e379a3e5fd2bb00302a47aee9fdf7940d83595be3915752c74033d17ca7", + "sha256:954af0e2bd7cea83ce72243b14e4fb518b18f0c1649b576d114973e2073b273d", + "sha256:9a53a4fe5cb075075d515797d6ce2f56772ea7e6a1e5e4b96cf78a14bac3d265", + "sha256:9a77627a330ab23ca43b48b130e202582e91cc69619947840ea4d2d1be21eb39", + "sha256:a176b79c49af27d7f6c12e4b178b0824626f40a7b9fed08f712291b6d54bf566", + "sha256:a7fc76bf273353dc7e5207d172b83f569540fc9a28d63171061c42e361d22353", + "sha256:aa0698f65e5b570426fc31b8162ed4603b0c2841cbb9088e2b01641e3065915b", + "sha256:b34e8e11d97889df57166eda1e1ddd7676da5fcd4d71a0062a760e75060514b4", + "sha256:c75b52aacc6c0c260f204cbdd834f76edc9fb0d8e0da9fbf8352ef58202564e2", + "sha256:c8987bd3307a39bc03df5c8e0e3d8be0c4c3518b7f044b0f4c15d1aa78f52575", + "sha256:ce64e84a962b63a47a592690bdc16a7eaf709d2c2697ababf24a0def566899a6", + "sha256:cfb5cd445280c5b0a4e6187a7ce8de5a07b5f3f897f235caa11f1f435f182843", + "sha256:d8e95564beb8782abfd9e431c974e14563a794a4944c29d6d3b7b5ea042110b4", + "sha256:d97618c9c6684a97ef7637ba43bdf6663a2e2e77efe0f863cce97a76af396446", + "sha256:ddb95b49df036ddd264a0ad246d1be5b672000f12d6961ea2c267083a5e19379", + "sha256:dea827b4d55ee390dc89b2afe5927d4308a8b538ae91d9c6f7a5090f397af1aa", + "sha256:e3f2d0aaf8080bda0587d58fc9fe4766e012441e2eed4269a77de6aea981c8be", + "sha256:eb8f24adb74984aa0e5d07a2368ad95276cf38051fe2dc6605cbcf482e04f2a7" ], "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5, 3.6'", - "version": "==3.22.0" + "version": "==3.23.0" }, "pydantic": { "hashes": [ - "sha256:7471657138c16adad9322fe3070c0116dd6c3ad8d649300e3cbdfe91f4db4ec3", - "sha256:a082753436a07f9ba1289c6ffa01cd93db3548776088aa917cc43b63f68fa60f" + "sha256:32738d19d63a226a52eed76645a98ee07c1f410ee41d93b4afbfa85ed8111c2d", + "sha256:d9615eaa9ac5a063471da949c8fc16376a84afb5024688b3ff885693506764eb" ], "index": "pypi", - "version": "==2.11.3" + "version": "==2.11.4" }, "pydantic-core": { "hashes": [ - "sha256:0483847fa9ad5e3412265c1bd72aad35235512d9ce9d27d81a56d935ef489672", - "sha256:048831bd363490be79acdd3232f74a0e9951b11b2b4cc058aeb72b22fdc3abe1", - "sha256:048c01eee07d37cbd066fc512b9d8b5ea88ceeb4e629ab94b3e56965ad655add", - "sha256:049e0de24cf23766f12cc5cc71d8abc07d4a9deb9061b334b62093dedc7cb068", - "sha256:08530b8ac922003033f399128505f513e30ca770527cc8bbacf75a84fcc2c74b", - "sha256:0fb935c5591573ae3201640579f30128ccc10739b45663f93c06796854405505", - "sha256:1293d7febb995e9d3ec3ea09caf1a26214eec45b0f29f6074abb004723fc1de8", - "sha256:177d50460bc976a0369920b6c744d927b0ecb8606fb56858ff542560251b19e5", - "sha256:1a28239037b3d6f16916a4c831a5a0eadf856bdd6d2e92c10a0da3a59eadcf3e", - "sha256:1b30d92c9412beb5ac6b10a3eb7ef92ccb14e3f2a8d7732e2d739f58b3aa7544", - "sha256:1c607801d85e2e123357b3893f82c97a42856192997b95b4d8325deb1cd0c5f4", - "sha256:1d20eb4861329bb2484c021b9d9a977566ab16d84000a57e28061151c62b349a", - "sha256:1dfae24cf9921875ca0ca6a8ecb4bb2f13c855794ed0d468d6abbec6e6dcd44a", - "sha256:25626fb37b3c543818c14821afe0fd3830bc327a43953bc88db924b68c5723f1", - "sha256:282b3fe1bbbe5ae35224a0dbd05aed9ccabccd241e8e6b60370484234b456266", - "sha256:2ea62419ba8c397e7da28a9170a16219d310d2cf4970dbc65c32faf20d828c83", - "sha256:2f593494876eae852dc98c43c6f260f45abdbfeec9e4324e31a481d948214764", - "sha256:2f9284e11c751b003fd4215ad92d325d92c9cb19ee6729ebd87e3250072cdcde", - "sha256:3077cfdb6125cc8dab61b155fdd714663e401f0e6883f9632118ec12cf42df26", - "sha256:32cd11c5914d1179df70406427097c7dcde19fddf1418c787540f4b730289896", - "sha256:338ea9b73e6e109f15ab439e62cb3b78aa752c7fd9536794112e14bee02c8d18", - "sha256:35a5ec3fa8c2fe6c53e1b2ccc2454398f95d5393ab398478f53e1afbbeb4d939", - "sha256:398a38d323f37714023be1e0285765f0a27243a8b1506b7b7de87b647b517e48", - "sha256:3a371dc00282c4b84246509a5ddc808e61b9864aa1eae9ecc92bb1268b82db4a", - "sha256:3a64e81e8cba118e108d7126362ea30e021291b7805d47e4896e52c791be2761", - "sha256:3ab2d36e20fbfcce8f02d73c33a8a7362980cff717926bbae030b93ae46b56c7", - "sha256:3f1fdb790440a34f6ecf7679e1863b825cb5ffde858a9197f851168ed08371e5", - "sha256:3f2648b9262607a7fb41d782cc263b48032ff7a03a835581abbf7a3bec62bcf5", - "sha256:401d7b76e1000d0dd5538e6381d28febdcacb097c8d340dde7d7fc6e13e9f95d", - "sha256:495bc156026efafd9ef2d82372bd38afce78ddd82bf28ef5276c469e57c0c83e", - "sha256:4b315e596282bbb5822d0c7ee9d255595bd7506d1cb20c2911a4da0b970187d3", - "sha256:5183e4f6a2d468787243ebcd70cf4098c247e60d73fb7d68d5bc1e1beaa0c4db", - "sha256:5277aec8d879f8d05168fdd17ae811dd313b8ff894aeeaf7cd34ad28b4d77e33", - "sha256:52928d8c1b6bda03cc6d811e8923dffc87a2d3c8b3bfd2ce16471c7147a24850", - "sha256:549150be302428b56fdad0c23c2741dcdb5572413776826c965619a25d9c6bde", - "sha256:5773da0ee2d17136b1f1c6fbde543398d452a6ad2a7b54ea1033e2daa739b8d2", - "sha256:5ab77f45d33d264de66e1884fca158bc920cb5e27fd0764a72f72f5756ae8bdb", - "sha256:5c834f54f8f4640fd7e4b193f80eb25a0602bba9e19b3cd2fc7ffe8199f5ae02", - "sha256:5ccd429694cf26af7997595d627dd2637e7932214486f55b8a357edaac9dae8c", - "sha256:681d65e9011f7392db5aa002b7423cc442d6a673c635668c227c6c8d0e5a4f77", - "sha256:694ad99a7f6718c1a498dc170ca430687a39894a60327f548e02a9c7ee4b6504", - "sha256:6dd8ecfde08d8bfadaea669e83c63939af76f4cf5538a72597016edfa3fad516", - "sha256:6e966fc3caaf9f1d96b349b0341c70c8d6573bf1bac7261f7b0ba88f96c56c24", - "sha256:70af6a21237b53d1fe7b9325b20e65cbf2f0a848cf77bed492b029139701e66a", - "sha256:723c5630c4259400818b4ad096735a829074601805d07f8cafc366d95786d331", - "sha256:7965c13b3967909a09ecc91f21d09cfc4576bf78140b988904e94f130f188396", - "sha256:7aeb055a42d734c0255c9e489ac67e75397d59c6fbe60d155851e9782f276a9c", - "sha256:7edbc454a29fc6aeae1e1eecba4f07b63b8d76e76a748532233c4c167b4cb9ea", - "sha256:7fb66263e9ba8fea2aa85e1e5578980d127fb37d7f2e292773e7bc3a38fb0c7b", - "sha256:87d3776f0001b43acebfa86f8c64019c043b55cc5a6a2e313d728b5c95b46969", - "sha256:8ab581d3530611897d863d1a649fb0644b860286b4718db919bfd51ece41f10b", - "sha256:8d13f0276806ee722e70a1c93da19748594f19ac4299c7e41237fc791d1861ea", - "sha256:8ffab8b2908d152e74862d276cf5017c81a2f3719f14e8e3e8d6b83fda863927", - "sha256:902dbc832141aa0ec374f4310f1e4e7febeebc3256f00dc359a9ac3f264a45dc", - "sha256:9097b9f17f91eea659b9ec58148c0747ec354a42f7389b9d50701610d86f812e", - "sha256:91815221101ad3c6b507804178a7bb5cb7b2ead9ecd600041669c8d805ebd595", - "sha256:948b73114f47fd7016088e5186d13faf5e1b2fe83f5e320e371f035557fd264d", - "sha256:99b56acd433386c8f20be5c4000786d1e7ca0523c8eefc995d14d79c7a081498", - "sha256:9d3da303ab5f378a268fa7d45f37d7d85c3ec19769f28d2cc0c61826a8de21fe", - "sha256:9f466e8bf0a62dc43e068c12166281c2eca72121dd2adc1040f3aa1e21ef8599", - "sha256:9fea9c1869bb4742d174a57b4700c6dadea951df8b06de40c2fedb4f02931c2e", - "sha256:a0d5f3acc81452c56895e90643a625302bd6be351e7010664151cc55b7b97f89", - "sha256:a3edde68d1a1f9af1273b2fe798997b33f90308fb6d44d8550c89fc6a3647cf6", - "sha256:a62c3c3ef6a7e2c45f7853b10b5bc4ddefd6ee3cd31024754a1a5842da7d598d", - "sha256:aa687a23d4b7871a00e03ca96a09cad0f28f443690d300500603bd0adba4b523", - "sha256:ab0277cedb698749caada82e5d099dc9fed3f906a30d4c382d1a21725777a1e5", - "sha256:ad05b683963f69a1d5d2c2bdab1274a31221ca737dbbceaa32bcb67359453cdd", - "sha256:b172f7b9d2f3abc0efd12e3386f7e48b576ef309544ac3a63e5e9cdd2e24585d", - "sha256:b1caa0bc2741b043db7823843e1bde8aaa58a55a58fda06083b0569f8b45693a", - "sha256:bae370459da6a5466978c0eacf90690cb57ec9d533f8e63e564ef3822bfa04fe", - "sha256:bcc9c6fdb0ced789245b02b7d6603e17d1563064ddcfc36f046b61c0c05dd9df", - "sha256:bdc84017d28459c00db6f918a7272a5190bec3090058334e43a76afb279eac7c", - "sha256:bfd0adeee563d59c598ceabddf2c92eec77abcb3f4a391b19aa7366170bd9e30", - "sha256:c566dd9c5f63d22226409553531f89de0cac55397f2ab8d97d6f06cfce6d947e", - "sha256:c91dbb0ab683fa0cd64a6e81907c8ff41d6497c346890e26b23de7ee55353f96", - "sha256:c964fd24e6166420d18fb53996d8c9fd6eac9bf5ae3ec3d03015be4414ce497f", - "sha256:cc77ec5b7e2118b152b0d886c7514a4653bcb58c6b1d760134a9fab915f777b3", - "sha256:d100e3ae783d2167782391e0c1c7a20a31f55f8015f3293647544df3f9c67824", - "sha256:d3a07fadec2a13274a8d861d3d37c61e97a816beae717efccaa4b36dfcaadcde", - "sha256:d5e3d15245b08fa4a84cefc6c9222e6f37c98111c8679fbd94aa145f9a0ae23d", - "sha256:de9e06abe3cc5ec6a2d5f75bc99b0bdca4f5c719a5b34026f8c57efbdecd2ee3", - "sha256:df6a94bf9452c6da9b5d76ed229a5683d0306ccb91cca8e1eea883189780d568", - "sha256:e100c52f7355a48413e2999bfb4e139d2977a904495441b374f3d4fb4a170961", - "sha256:e11f3864eb516af21b01e25fac915a82e9ddad3bb0fb9e95a246067398b435a4", - "sha256:e14f369c98a7c15772b9da98987f58e2b509a93235582838bd0d1d8c08b68fda", - "sha256:e3de2777e3b9f4d603112f78006f4ae0acb936e95f06da6cb1a45fbad6bdb4b5", - "sha256:e7aaba1b4b03aaea7bb59e1b5856d734be011d3e6d98f5bcaa98cb30f375f2ad", - "sha256:ec259f62538e8bf364903a7d0d0239447059f9434b284f5536e8402b7dd198db", - "sha256:ec79de2a8680b1a67a07490bddf9636d5c2fab609ba8c57597e855fa5fa4dacd", - "sha256:ed3eb16d51257c763539bde21e011092f127a2202692afaeaccb50db55a31383", - "sha256:ede9b407e39949d2afc46385ce6bd6e11588660c26f80576c11c958e6647bc40", - "sha256:ee12a7be1742f81b8a65b36c6921022301d466b82d80315d215c4c691724986f", - "sha256:ef99779001d7ac2e2461d8ab55d3373fe7315caefdbecd8ced75304ae5a6fc6b", - "sha256:f59295ecc75a1788af8ba92f2e8c6eeaa5a94c22fc4d151e8d9638814f85c8fc", - "sha256:f995719707e0e29f0f41a8aa3bcea6e761a36c9136104d3189eafb83f5cec5e5", - "sha256:f99aeda58dce827f76963ee87a0ebe75e648c72ff9ba1174a253f6744f518f65", - "sha256:fc6bf8869e193855e8d91d91f6bf59699a5cdfaa47a404e278e776dd7f168b39", - "sha256:fc903512177361e868bc1f5b80ac8c8a6e05fcdd574a5fb5ffeac5a9982b9e89", - "sha256:fe44d56aa0b00d66640aa84a3cbe80b7a3ccdc6f0b1ca71090696a6d4777c091" + "sha256:0069c9acc3f3981b9ff4cdfaf088e98d83440a4c7ea1bc07460af3d4dc22e72d", + "sha256:031c57d67ca86902726e0fae2214ce6770bbe2f710dc33063187a68744a5ecac", + "sha256:0405262705a123b7ce9f0b92f123334d67b70fd1f20a9372b907ce1080c7ba02", + "sha256:04a1a413977ab517154eebb2d326da71638271477d6ad87a769102f7c2488c56", + "sha256:09fb9dd6571aacd023fe6aaca316bd01cf60ab27240d7eb39ebd66a3a15293b4", + "sha256:0a39979dcbb70998b0e505fb1556a1d550a0781463ce84ebf915ba293ccb7e22", + "sha256:0a9f2c9dd19656823cb8250b0724ee9c60a82f3cdf68a080979d13092a3b0fef", + "sha256:0e03262ab796d986f978f79c943fc5f620381be7287148b8010b4097f79a39ec", + "sha256:0e5b2671f05ba48b94cb90ce55d8bdcaaedb8ba00cc5359f6810fc918713983d", + "sha256:0e6116757f7959a712db11f3e9c0a99ade00a5bbedae83cb801985aa154f071b", + "sha256:0fb2d542b4d66f9470e8065c5469ec676978d625a8b7a363f07d9a501a9cb36a", + "sha256:1082dd3e2d7109ad8b7da48e1d4710c8d06c253cbc4a27c1cff4fbcaa97a9e3f", + "sha256:1a8695a8d00c73e50bff9dfda4d540b7dee29ff9b8053e38380426a85ef10052", + "sha256:1e063337ef9e9820c77acc768546325ebe04ee38b08703244c1309cccc4f1bab", + "sha256:1ea40a64d23faa25e62a70ad163571c0b342b8bf66d5fa612ac0dec4f069d916", + "sha256:2058a32994f1fde4ca0480ab9d1e75a0e8c87c22b53a3ae66554f9af78f2fe8c", + "sha256:235f45e5dbcccf6bd99f9f472858849f73d11120d76ea8707115415f8e5ebebf", + "sha256:2807668ba86cb38c6817ad9bc66215ab8584d1d304030ce4f0887336f28a5e27", + "sha256:2b0a451c263b01acebe51895bfb0e1cc842a5c666efe06cdf13846c7418caa9a", + "sha256:2b3d326aaef0c0399d9afffeb6367d5e26ddc24d351dbc9c636840ac355dc5d8", + "sha256:2bfb5112df54209d820d7bf9317c7a6c9025ea52e49f46b6a2060104bba37de7", + "sha256:2f82865531efd18d6e07a04a17331af02cb7a651583c418df8266f17a63c6612", + "sha256:329467cecfb529c925cf2bbd4d60d2c509bc2fb52a20c1045bf09bb70971a9c1", + "sha256:3a1c81334778f9e3af2f8aeb7a960736e5cab1dfebfb26aabca09afd2906c039", + "sha256:3abcd9392a36025e3bd55f9bd38d908bd17962cc49bc6da8e7e96285336e2bca", + "sha256:3c6db6e52c6d70aa0d00d45cdb9b40f0433b96380071ea80b09277dba021ddf7", + "sha256:3dc625f4aa79713512d1976fe9f0bc99f706a9dee21dfd1810b4bbbf228d0e8a", + "sha256:3eb3fe62804e8f859c49ed20a8451342de53ed764150cb14ca71357c765dc2a6", + "sha256:44857c3227d3fb5e753d5fe4a3420d6376fa594b07b621e220cd93703fe21782", + "sha256:4b25d91e288e2c4e0662b8038a28c6a07eaac3e196cfc4ff69de4ea3db992a1b", + "sha256:4c5b0a576fb381edd6d27f0a85915c6daf2f8138dc5c267a57c08a62900758c7", + "sha256:4e61206137cbc65e6d5256e1166f88331d3b6238e082d9f74613b9b765fb9025", + "sha256:52fb90784e0a242bb96ec53f42196a17278855b0f31ac7c3cc6f5c1ec4811849", + "sha256:53a57d2ed685940a504248187d5685e49eb5eef0f696853647bf37c418c538f7", + "sha256:572c7e6c8bb4774d2ac88929e3d1f12bc45714ae5ee6d9a788a9fb35e60bb04b", + "sha256:5c4aa4e82353f65e548c476b37e64189783aa5384903bfea4f41580f255fddfa", + "sha256:5c92edd15cd58b3c2d34873597a1e20f13094f59cf88068adb18947df5455b4e", + "sha256:5f483cfb75ff703095c59e365360cb73e00185e01aaea067cd19acffd2ab20ea", + "sha256:61c18fba8e5e9db3ab908620af374db0ac1baa69f0f32df4f61ae23f15e586ac", + "sha256:6368900c2d3ef09b69cb0b913f9f8263b03786e5b2a387706c5afb66800efd51", + "sha256:64632ff9d614e5eecfb495796ad51b0ed98c453e447a76bcbeeb69615079fc7e", + "sha256:65132b7b4a1c0beded5e057324b7e16e10910c106d43675d9bd87d4f38dde162", + "sha256:6b99022f1d19bc32a4c2a0d544fc9a76e3be90f0b3f4af413f87d38749300e65", + "sha256:6bdfe4b3789761f3bcb4b1ddf33355a71079858958e3a552f16d5af19768fef2", + "sha256:6fa6dfc3e4d1f734a34710f391ae822e0a8eb8559a85c6979e14e65ee6ba2954", + "sha256:73662edf539e72a9440129f231ed3757faab89630d291b784ca99237fb94db2b", + "sha256:73cf6373c21bc80b2e0dc88444f41ae60b2f070ed02095754eb5a01df12256de", + "sha256:7cb8bc3605c29176e1b105350d2e6474142d7c1bd1d9327c4a9bdb46bf827acc", + "sha256:7f92c15cd1e97d4b12acd1cc9004fa092578acfa57b67ad5e43a197175d01a64", + "sha256:82f68293f055f51b51ea42fafc74b6aad03e70e191799430b90c13d643059ebb", + "sha256:83aa99b1285bc8f038941ddf598501a86f1536789740991d7d8756e34f1e74d9", + "sha256:87acbfcf8e90ca885206e98359d7dca4bcbb35abdc0ff66672a293e1d7a19101", + "sha256:87b31b6846e361ef83fedb187bb5b4372d0da3f7e28d85415efa92d6125d6e6d", + "sha256:881b21b5549499972441da4758d662aeea93f1923f953e9cbaff14b8b9565aef", + "sha256:8d55ab81c57b8ff8548c3e4947f119551253f4e3787a7bbc0b6b3ca47498a9d3", + "sha256:8f57a69461af2a5fa6e6bbd7a5f60d3b7e6cebb687f55106933188e79ad155c1", + "sha256:95237e53bb015f67b63c91af7518a62a8660376a6a0db19b89acc77a4d6199f5", + "sha256:96081f1605125ba0855dfda83f6f3df5ec90c61195421ba72223de35ccfb2f88", + "sha256:970919794d126ba8645f3837ab6046fb4e72bbc057b3709144066204c19a455d", + "sha256:9cb1da0f5a471435a7bc7e439b8a728e8b61e59784b2af70d7c169f8dd8ae290", + "sha256:9fcd347d2cc5c23b06de6d3b7b8275be558a0c90549495c699e379a80bf8379e", + "sha256:9fdac5d6ffa1b5a83bca06ffe7583f5576555e6c8b3a91fbd25ea7780f825f7d", + "sha256:a11c8d26a50bfab49002947d3d237abe4d9e4b5bdc8846a63537b6488e197808", + "sha256:a144d4f717285c6d9234a66778059f33a89096dfb9b39117663fd8413d582dcc", + "sha256:a2b911a5b90e0374d03813674bf0a5fbbb7741570dcd4b4e85a2e48d17def29d", + "sha256:a7ec89dc587667f22b6a0b6579c249fca9026ce7c333fc142ba42411fa243cdc", + "sha256:aa9d91b338f2df0508606f7009fde642391425189bba6d8c653afd80fd6bb64e", + "sha256:b0379a2b24882fef529ec3b4987cb5d003b9cda32256024e6fe1586ac45fc640", + "sha256:bc7aee6f634a6f4a95676fcb5d6559a2c2a390330098dba5e5a5f28a2e4ada30", + "sha256:bdc25f3681f7b78572699569514036afe3c243bc3059d3942624e936ec93450e", + "sha256:c083a3bdd5a93dfe480f1125926afcdbf2917ae714bdb80b36d34318b2bec5d9", + "sha256:c20c462aa4434b33a2661701b861604913f912254e441ab8d78d30485736115a", + "sha256:c2fc0a768ef76c15ab9238afa6da7f69895bb5d1ee83aeea2e3509af4472d0b9", + "sha256:c52b02ad8b4e2cf14ca7b3d918f3eb0ee91e63b3167c32591e57c4317e134f8f", + "sha256:c54c939ee22dc8e2d545da79fc5381f1c020d6d3141d3bd747eab59164dc89fb", + "sha256:c8e7af2f4e0194c22b5b37205bfb293d166a7344a5b0d0eaccebc376546d77d5", + "sha256:cca3868ddfaccfbc4bfb1d608e2ccaaebe0ae628e1416aeb9c4d88c001bb45ab", + "sha256:d3f26877a748dc4251cfcfda9dfb5f13fcb034f5308388066bcfe9031b63ae7d", + "sha256:d53b22f2032c42eaaf025f7c40c2e3b94568ae077a606f006d206a463bc69572", + "sha256:d87c561733f66531dced0da6e864f44ebf89a8fba55f31407b00c2f7f9449593", + "sha256:d946c8bf0d5c24bf4fe333af284c59a19358aa3ec18cb3dc4370080da1e8ad29", + "sha256:dac89aea9af8cd672fa7b510e7b8c33b0bba9a43186680550ccf23020f32d535", + "sha256:db4b41f9bd95fbe5acd76d89920336ba96f03e149097365afe1cb092fceb89a1", + "sha256:dc46a01bf8d62f227d5ecee74178ffc448ff4e5197c756331f71efcc66dc980f", + "sha256:dd14041875d09cc0f9308e37a6f8b65f5585cf2598a53aa0123df8b129d481f8", + "sha256:de4b83bb311557e439b9e186f733f6c645b9417c84e2eb8203f3f820a4b988bf", + "sha256:e799c050df38a639db758c617ec771fd8fb7a5f8eaaa4b27b101f266b216a246", + "sha256:e80b087132752f6b3d714f041ccf74403799d3b23a72722ea2e6ba2e892555b9", + "sha256:eb8c529b2819c37140eb51b914153063d27ed88e3bdc31b71198a198e921e011", + "sha256:eb9b459ca4df0e5c87deb59d37377461a538852765293f9e6ee834f0435a93b9", + "sha256:efec8db3266b76ef9607c2c4c419bdb06bf335ae433b80816089ea7585816f6a", + "sha256:f481959862f57f29601ccced557cc2e817bce7533ab8e01a797a48b49c9692b3", + "sha256:f517ca031dfc037a9c07e748cefd8d96235088b83b4f4ba8939105d20fa1dcd6", + "sha256:f889f7a40498cc077332c7ab6b4608d296d852182211787d4f3ee377aaae66e8", + "sha256:f8de619080e944347f5f20de29a975c2d815d9ddd8be9b9b7268e2e3ef68605a", + "sha256:f941635f2a3d96b2973e867144fde513665c87f13fe0e193c158ac51bfaaa7b2", + "sha256:fa754d1850735a0b0e03bcffd9d4b4343eb417e47196e4485d9cca326073a42c", + "sha256:fa854f5cf7e33842a892e5c73f45327760bc7bc516339fda888c75ae60edaeb6", + "sha256:fe5b32187cbc0c862ee201ad66c30cf218e5ed468ec8dc1cf49dec66e160cc4d" ], "markers": "python_version >= '3.9'", - "version": "==2.33.1" + "version": "==2.33.2" }, "pyjwt": { "hashes": [ @@ -1381,7 +964,7 @@ "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3", "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427" ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2'", + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", "version": "==2.9.0.post0" }, "pytz": { @@ -1468,170 +1051,154 @@ }, "rpds-py": { "hashes": [ - "sha256:0047638c3aa0dbcd0ab99ed1e549bbf0e142c9ecc173b6492868432d8989a046", - "sha256:006f4342fe729a368c6df36578d7a348c7c716be1da0a1a0f86e3021f8e98724", - "sha256:041f00419e1da7a03c46042453598479f45be3d787eb837af382bfc169c0db33", - "sha256:04ecf5c1ff4d589987b4d9882872f80ba13da7d42427234fce8f22efb43133bc", - "sha256:04f2b712a2206e13800a8136b07aaedc23af3facab84918e7aa89e4be0260032", - "sha256:0aeb3329c1721c43c58cae274d7d2ca85c1690d89485d9c63a006cb79a85771a", - "sha256:0e374c0ce0ca82e5b67cd61fb964077d40ec177dd2c4eda67dba130de09085c7", - "sha256:0f00c16e089282ad68a3820fd0c831c35d3194b7cdc31d6e469511d9bffc535c", - "sha256:174e46569968ddbbeb8a806d9922f17cd2b524aa753b468f35b97ff9c19cb718", - "sha256:1b221c2457d92a1fb3c97bee9095c874144d196f47c038462ae6e4a14436f7bc", - "sha256:208b3a70a98cf3710e97cabdc308a51cd4f28aa6e7bb11de3d56cd8b74bab98d", - "sha256:20f2712bd1cc26a3cc16c5a1bfee9ed1abc33d4cdf1aabd297fe0eb724df4272", - "sha256:24795c099453e3721fda5d8ddd45f5dfcc8e5a547ce7b8e9da06fecc3832e26f", - "sha256:2a0f156e9509cee987283abd2296ec816225145a13ed0391df8f71bf1d789e2d", - "sha256:2b2356688e5d958c4d5cb964af865bea84db29971d3e563fb78e46e20fe1848b", - "sha256:2c13777ecdbbba2077670285dd1fe50828c8742f6a4119dbef6f83ea13ad10fb", - "sha256:2d3ee4615df36ab8eb16c2507b11e764dcc11fd350bbf4da16d09cda11fcedef", - "sha256:2d53747da70a4e4b17f559569d5f9506420966083a31c5fbd84e764461c4444b", - "sha256:32bab0a56eac685828e00cc2f5d1200c548f8bc11f2e44abf311d6b548ce2e45", - "sha256:34d90ad8c045df9a4259c47d2e16a3f21fdb396665c94520dbfe8766e62187a4", - "sha256:369d9c6d4c714e36d4a03957b4783217a3ccd1e222cdd67d464a3a479fc17796", - "sha256:3a55fc10fdcbf1a4bd3c018eea422c52cf08700cf99c28b5cb10fe97ab77a0d3", - "sha256:3d2d8e4508e15fc05b31285c4b00ddf2e0eb94259c2dc896771966a163122a0c", - "sha256:3fab5f4a2c64a8fb64fc13b3d139848817a64d467dd6ed60dcdd6b479e7febc9", - "sha256:43dba99f00f1d37b2a0265a259592d05fcc8e7c19d140fe51c6e6f16faabeb1f", - "sha256:44d51febb7a114293ffd56c6cf4736cb31cd68c0fddd6aa303ed09ea5a48e029", - "sha256:493fe54318bed7d124ce272fc36adbf59d46729659b2c792e87c3b95649cdee9", - "sha256:4b28e5122829181de1898c2c97f81c0b3246d49f585f22743a1246420bb8d399", - "sha256:4cd031e63bc5f05bdcda120646a0d32f6d729486d0067f09d79c8db5368f4586", - "sha256:528927e63a70b4d5f3f5ccc1fa988a35456eb5d15f804d276709c33fc2f19bda", - "sha256:564c96b6076a98215af52f55efa90d8419cc2ef45d99e314fddefe816bc24f91", - "sha256:5db385bacd0c43f24be92b60c857cf760b7f10d8234f4bd4be67b5b20a7c0b6b", - "sha256:5ef877fa3bbfb40b388a5ae1cb00636a624690dcb9a29a65267054c9ea86d88a", - "sha256:5f6e3cec44ba05ee5cbdebe92d052f69b63ae792e7d05f1020ac5e964394080c", - "sha256:5fc13b44de6419d1e7a7e592a4885b323fbc2f46e1f22151e3a8ed3b8b920405", - "sha256:60748789e028d2a46fc1c70750454f83c6bdd0d05db50f5ae83e2db500b34da5", - "sha256:60d9b630c8025b9458a9d114e3af579a2c54bd32df601c4581bd054e85258143", - "sha256:619ca56a5468f933d940e1bf431c6f4e13bef8e688698b067ae68eb4f9b30e3a", - "sha256:630d3d8ea77eabd6cbcd2ea712e1c5cecb5b558d39547ac988351195db433f6c", - "sha256:63981feca3f110ed132fd217bf7768ee8ed738a55549883628ee3da75bb9cb78", - "sha256:66420986c9afff67ef0c5d1e4cdc2d0e5262f53ad11e4f90e5e22448df485bf0", - "sha256:675269d407a257b8c00a6b58205b72eec8231656506c56fd429d924ca00bb350", - "sha256:6a4a535013aeeef13c5532f802708cecae8d66c282babb5cd916379b72110cf7", - "sha256:6a727fd083009bc83eb83d6950f0c32b3c94c8b80a9b667c87f4bd1274ca30ba", - "sha256:6e1daf5bf6c2be39654beae83ee6b9a12347cb5aced9a29eecf12a2d25fff664", - "sha256:6eea559077d29486c68218178ea946263b87f1c41ae7f996b1f30a983c476a5a", - "sha256:75a810b7664c17f24bf2ffd7f92416c00ec84b49bb68e6a0d93e542406336b56", - "sha256:772cc1b2cd963e7e17e6cc55fe0371fb9c704d63e44cacec7b9b7f523b78919e", - "sha256:78884d155fd15d9f64f5d6124b486f3d3f7fd7cd71a78e9670a0f6f6ca06fb2d", - "sha256:79e8d804c2ccd618417e96720ad5cd076a86fa3f8cb310ea386a3e6229bae7d1", - "sha256:7e80d375134ddb04231a53800503752093dbb65dad8dabacce2c84cccc78e964", - "sha256:8097b3422d020ff1c44effc40ae58e67d93e60d540a65649d2cdaf9466030791", - "sha256:8205ee14463248d3349131bb8099efe15cd3ce83b8ef3ace63c7e976998e7124", - "sha256:8212ff58ac6dfde49946bea57474a386cca3f7706fc72c25b772b9ca4af6b79e", - "sha256:823e74ab6fbaa028ec89615ff6acb409e90ff45580c45920d4dfdddb069f2120", - "sha256:84e0566f15cf4d769dade9b366b7b87c959be472c92dffb70462dd0844d7cbad", - "sha256:896c41007931217a343eff197c34513c154267636c8056fb409eafd494c3dcdc", - "sha256:8aa362811ccdc1f8dadcc916c6d47e554169ab79559319ae9fae7d7752d0d60c", - "sha256:8b3b397eefecec8e8e39fa65c630ef70a24b09141a6f9fc17b3c3a50bed6b50e", - "sha256:8ebc7e65ca4b111d928b669713865f021b7773350eeac4a31d3e70144297baba", - "sha256:9168764133fd919f8dcca2ead66de0105f4ef5659cbb4fa044f7014bed9a1797", - "sha256:921ae54f9ecba3b6325df425cf72c074cd469dea843fb5743a26ca7fb2ccb149", - "sha256:92558d37d872e808944c3c96d0423b8604879a3d1c86fdad508d7ed91ea547d5", - "sha256:951cc481c0c395c4a08639a469d53b7d4afa252529a085418b82a6b43c45c240", - "sha256:998c01b8e71cf051c28f5d6f1187abbdf5cf45fc0efce5da6c06447cba997034", - "sha256:9abc80fe8c1f87218db116016de575a7998ab1629078c90840e8d11ab423ee25", - "sha256:9be4f99bee42ac107870c61dfdb294d912bf81c3c6d45538aad7aecab468b6b7", - "sha256:9c39438c55983d48f4bb3487734d040e22dad200dab22c41e331cee145e7a50d", - "sha256:9d7e8ce990ae17dda686f7e82fd41a055c668e13ddcf058e7fb5e9da20b57793", - "sha256:9ea7f4174d2e4194289cb0c4e172d83e79a6404297ff95f2875cf9ac9bced8ba", - "sha256:a18fc371e900a21d7392517c6f60fe859e802547309e94313cd8181ad9db004d", - "sha256:a36b452abbf29f68527cf52e181fced56685731c86b52e852053e38d8b60bc8d", - "sha256:a5b66d1b201cc71bc3081bc2f1fc36b0c1f268b773e03bbc39066651b9e18391", - "sha256:a824d2c7a703ba6daaca848f9c3d5cb93af0505be505de70e7e66829affd676e", - "sha256:a88c0d17d039333a41d9bf4616bd062f0bd7aa0edeb6cafe00a2fc2a804e944f", - "sha256:aa6800adc8204ce898c8a424303969b7aa6a5e4ad2789c13f8648739830323b7", - "sha256:aad911555286884be1e427ef0dc0ba3929e6821cbeca2194b13dc415a462c7fd", - "sha256:afc6e35f344490faa8276b5f2f7cbf71f88bc2cda4328e00553bd451728c571f", - "sha256:b9a4df06c35465ef4d81799999bba810c68d29972bf1c31db61bfdb81dd9d5bb", - "sha256:bb2954155bb8f63bb19d56d80e5e5320b61d71084617ed89efedb861a684baea", - "sha256:bbc4362e06f950c62cad3d4abf1191021b2ffaf0b31ac230fbf0526453eee75e", - "sha256:c0145295ca415668420ad142ee42189f78d27af806fcf1f32a18e51d47dd2052", - "sha256:c30ff468163a48535ee7e9bf21bd14c7a81147c0e58a36c1078289a8ca7af0bd", - "sha256:c347a20d79cedc0a7bd51c4d4b7dbc613ca4e65a756b5c3e57ec84bd43505b47", - "sha256:c43583ea8517ed2e780a345dd9960896afc1327e8cf3ac8239c167530397440d", - "sha256:c61a2cb0085c8783906b2f8b1f16a7e65777823c7f4d0a6aaffe26dc0d358dd9", - "sha256:c9ca89938dff18828a328af41ffdf3902405a19f4131c88e22e776a8e228c5a8", - "sha256:cc31e13ce212e14a539d430428cd365e74f8b2d534f8bc22dd4c9c55b277b875", - "sha256:cdabcd3beb2a6dca7027007473d8ef1c3b053347c76f685f5f060a00327b8b65", - "sha256:cf86f72d705fc2ef776bb7dd9e5fbba79d7e1f3e258bf9377f8204ad0fc1c51e", - "sha256:d09dc82af2d3c17e7dd17120b202a79b578d79f2b5424bda209d9966efeed114", - "sha256:d3aa13bdf38630da298f2e0d77aca967b200b8cc1473ea05248f6c5e9c9bdb44", - "sha256:d69d003296df4840bd445a5d15fa5b6ff6ac40496f956a221c4d1f6f7b4bc4d9", - "sha256:d6e109a454412ab82979c5b1b3aee0604eca4bbf9a02693bb9df027af2bfa91a", - "sha256:d8551e733626afec514b5d15befabea0dd70a343a9f23322860c4f16a9430205", - "sha256:d8754d872a5dfc3c5bf9c0e059e8107451364a30d9fd50f1f1a85c4fb9481164", - "sha256:d8f9a6e7fd5434817526815f09ea27f2746c4a51ee11bb3439065f5fc754db58", - "sha256:dbcbb6db5582ea33ce46a5d20a5793134b5365110d84df4e30b9d37c6fd40ad3", - "sha256:e0f3ef95795efcd3b2ec3fe0a5bcfb5dadf5e3996ea2117427e524d4fbf309c6", - "sha256:e13ae74a8a3a0c2f22f450f773e35f893484fcfacb00bb4344a7e0f4f48e1f97", - "sha256:e274f62cbd274359eff63e5c7e7274c913e8e09620f6a57aae66744b3df046d6", - "sha256:e838bf2bb0b91ee67bf2b889a1a841e5ecac06dd7a2b1ef4e6151e2ce155c7ae", - "sha256:e8acd55bd5b071156bae57b555f5d33697998752673b9de554dd82f5b5352727", - "sha256:e8e5ab32cf9eb3647450bc74eb201b27c185d3857276162c101c0f8c6374e098", - "sha256:ebcb786b9ff30b994d5969213a8430cbb984cdd7ea9fd6df06663194bd3c450c", - "sha256:ebea2821cdb5f9fef44933617be76185b80150632736f3d76e54829ab4a3b4d1", - "sha256:ed0ef550042a8dbcd657dfb284a8ee00f0ba269d3f2286b0493b15a5694f9fe8", - "sha256:eda5c1e2a715a4cbbca2d6d304988460942551e4e5e3b7457b50943cd741626d", - "sha256:f5c0ed12926dec1dfe7d645333ea59cf93f4d07750986a586f511c0bc61fe103", - "sha256:f6016bd950be4dcd047b7475fdf55fb1e1f59fc7403f387be0e8123e4a576d30", - "sha256:f9e0057a509e096e47c87f753136c9b10d7a91842d8042c2ee6866899a717c0d", - "sha256:fc1c892b1ec1f8cbd5da8de287577b455e388d9c328ad592eabbdcb6fc93bee5", - "sha256:fc2c1e1b00f88317d9de6b2c2b39b012ebbfe35fe5e7bef980fd2a91f6100a07", - "sha256:fd822f019ccccd75c832deb7aa040bb02d70a92eb15a2f16c7987b7ad4ee8d83" + "sha256:098d446d76d26e394b440d73921b49c1c90274d46ccbaadf346b1b78f9fdd4b1", + "sha256:0d63a86b457069d669c423f093db4900aa102f0e5a626973eff4db8355c0fd96", + "sha256:0dcdee07ebf76223092666c72a9552db276fbe46b98830ecd1bb836cc98adc81", + "sha256:0ee0cc81f875e853ccdf3badb44b67f771fb9149baa9e752777ccdcaf052ad26", + "sha256:113d134dc5a8d2503630ca2707b58a1bf5b1b3c69b35c7dab8690ee650c111b8", + "sha256:12a84c3851f9e68633d883c01347db3cb87e6160120a489f9c47162cd276b0a5", + "sha256:12b42790c91e0041a98f0ec04244fb334696938793e785a5d4c7e56ca534d7da", + "sha256:16fb28d3a653f67c871a47c5ca0be17bce9fab8adb8bcf7bd09f3771b8c4d860", + "sha256:1e11065b759c38c4945f8c9765ed2910e31fa5b2f7733401eb7d966f468367a2", + "sha256:20af08b0b2d5b196a2bcb70becf0b97ec5af579cee0ae6750b08a2eea3b6c77d", + "sha256:240251fd95b057c26f8538d0e673bf983eba4f38da95fbaf502bfc1a768b3984", + "sha256:2649ff19291928243f90c86e4dc9cd86c8c4c6a73c3693ba2e23bc2fbcd8338c", + "sha256:28bd2969445acc2d6801a22f97a43134ae3cb18e7495d668bfaa8d82b8526cdc", + "sha256:2bd08c82336412a39a598e5baccab2ee2d7bd54e9115c8b64f2febb45da5c368", + "sha256:2f91902fc0c95dd1fa6b30ebd2af83ace91e592f7fd6340a375588a9d4b9341b", + "sha256:35c8cb5dcf7d36d3adf2ae0730b60fb550a8feb6e432bee7ef84162a0d15714b", + "sha256:36a7564deaac3f372e8b8b701eb982ea3113516e8e08cd87e3dc6ccf29bad14b", + "sha256:3752a015db89ea3e9c04d5e185549be4aa29c1882150e094c614c0de8e788feb", + "sha256:383cf0d4288baf5a16812ed70d54ecb7f2064e255eb7fe42c38e926adeae4534", + "sha256:3a21f4584f69547ae03aaa21be98753e85599f3437b84039da5dc20b53abe987", + "sha256:3d7d65aa934899849628137ab391562cdb487c6ffb9b9781319a64a9c66afbce", + "sha256:469054e6b2f8e41f1fe62b95f617082019d343eddeec3219ff3909067e672fb9", + "sha256:4acbe2349a3baac9cc212005b6cb4bbb7e5b34538886cde4f55dfc29173da1d6", + "sha256:4ad37c29adc435e6d8b24be86b03596183ee8d4bb8580cc4c676879b0b896a99", + "sha256:4d97661bf5848dd9e5eb7ded480deccf9d32ce2cd500b88a26acbf7bd2864985", + "sha256:4e5fe366fa53bd6777cf5440245366705338587b2cf8d61348ddaad744eb591a", + "sha256:4fbec54cc42fa90ca69158d75f125febc4116b2d934e71c78f97de1388a8feb2", + "sha256:540cd89d256119845b7f8f56c4bb80cad280cab92d9ca473be49ea13e678fd44", + "sha256:542a6f1d0f400b9ce1facb3e30dd3dc84e4affc60353509b00a7bdcd064be91e", + "sha256:54f925ff8d4443b7cae23a5215954abbf4736a3404188bde53c4d744ac001d89", + "sha256:551897221bbc9de17bce4574810347db8ec1ba4ec2f50f35421790d34bdb6ef9", + "sha256:57e9616a2a9da08fe0994e37a0c6f578fbaf6d35911bcba31e99660542d60c45", + "sha256:587cad3959d3d85127cf5df1624cdce569bb3796372e00420baad46af7c56b9b", + "sha256:58cfaa54752d6d2b4f10e87571688dbb7792327a69eca5417373d77d42787058", + "sha256:5afbff2822016db3c696cb0c1432e6b1f0e34aa9280bc5184dc216812a24e70d", + "sha256:5b049dd0792d51f07193cd934acec89abe84d2607109e6ca223b2f0ff24f0c7d", + "sha256:5bbfbd9c74c4dd74815bd532bf29bedea6d27d38f35ef46f9754172a14e4c655", + "sha256:5e849315963eb08c26167d0f2c0f9319c9bd379daea75092b3c595d70be6209d", + "sha256:6065a489b7b284efb29d57adffae2b9b5e9403d3c8d95cfa04e04e024e6b4e77", + "sha256:637ec39f97e342a3f76af739eda96800549d92f3aa27a2170b6dcbdffd49f480", + "sha256:653a066d2a4a332d4f8a11813e8124b643fa7b835b78468087a9898140469eee", + "sha256:6587ece9f205097c62d0e3d3cb7c06991eb0083ab6a9cf48951ec49c2ab7183c", + "sha256:66087711faf29cb3ac8ab05341939aec29968626aff8ef18e483e229055dd9a7", + "sha256:66568caacf18542f0cf213db7adf3de2da6ad58c7bf2c4fafec0d81ae557443b", + "sha256:673ba018df5ae5e7b6c9a021d51ffe39c0ae1daa0041611ed27a0bca634b2d2e", + "sha256:6a1eda14db1ac7a2ab4536dfe69e4d37fdd765e8e784ae4451e61582ebb76012", + "sha256:6b0c0f671a53c129ea48f9481e95532579cc489ab5a0ffe750c9020787181c48", + "sha256:6b5f457afffb45d3804728a54083e31fbaf460e902e3f7d063e56d0d0814301e", + "sha256:6bcca4d0d24d8c37bfe0cafdaaf4346b6c516db21ccaad5c7fba0a0df818dfc9", + "sha256:6c27156c8d836e7ff760767e93245b286ae028bfd81d305db676662d1f642637", + "sha256:6c72a4a8fab10bc96720ad40941bb471e3b1150fb8d62dab205d495511206cf1", + "sha256:6d95521901896a90a858993bfa3ec0f9160d3d97e8c8fefc279b3306cdadfee0", + "sha256:7715597186a7277be12729c896019226321bad1f047da381ab707b177aa5017c", + "sha256:77814c7a4e1dc43fba73aeb4c1ef0fe37d901f3aa869a4823de5ea843a283fd0", + "sha256:77910d6bec321c9fccfe9cf5e407fed9d2c48a5e510473b4f070d5cf2413c003", + "sha256:7c18cb2f6805861dcdf11fb0b3c111a0335f6475411687db2f6636f32bed66b0", + "sha256:7d34547810bfd61acf8a441e8a3651e7a919e8e8aed29850be14a1b05cfc6f41", + "sha256:8029c19c8a32ef3093c417dd16a5f806e7f529fcceea7c627b2635e9da5104da", + "sha256:805a0dff0674baa3f360c21dcbc622ae544f2bb4753d87a4a56a1881252a477e", + "sha256:80b37b37525492250adc7cbca20ae7084f86eb3eb62414b624d2a400370853b1", + "sha256:8155e21203161e5c78791fc049b99f0bbbf14d1d1839c8c93c8344957f9e8e1e", + "sha256:837fd066f974e5b98c69ac83ec594b79a2724a39a92a157b8651615e5032e530", + "sha256:83e103b48e63fd2b8a8e2b21ab5b5299a7146045626c2ed4011511ea8122d217", + "sha256:85587479f210350e9d9d25e505f422dd636e561658382ee8947357a4bac491ad", + "sha256:864573b6440b770db5a8693547a8728d7fd32580d4903010a8eee0bb5b03b130", + "sha256:87c6ff87b38f46d712418d78b34db1198408a3d9a42eddc640644aea561216b1", + "sha256:89260601d497fa5957c3e46f10b16cfa2a4808ad4dd46cddc0b997461923a7d9", + "sha256:89bb2b20829270aca28b1e5481be8ee24cb9aa86e6c0c81cb4ada2112c9588c5", + "sha256:8abc1a3e29b599bf8bb5ad455256a757e8b0ed5621e7e48abe8209932dc6d11e", + "sha256:8c2ad59c4342a176cb3e0d5753e1c911eabc95c210fc6d0e913c32bf560bf012", + "sha256:8f3a57f08c558d0983a708bfe6d1265f47b5debff9b366b2f2091690fada055c", + "sha256:90dbd2c42cb6463c07020695800ae8f347e7dbeff09da2975a988e467b624539", + "sha256:91a51499be506022b9f09facfc42f0c3a1c45969c0fc8f0bbebc8ff23ab9e531", + "sha256:9442cbff21122e9a529b942811007d65eabe4182e7342d102caf119b229322c6", + "sha256:94f89161a3e358db33310a8a064852a6eb119ed1aa1a3dba927b4e5140e65d00", + "sha256:96742796f499ac23b59856db734e65b286d1214a0d9b57bcd7bece92d9201fa4", + "sha256:98c729193e7abe498565266933c125780fb646e977e94289cadbb36e4eeeb370", + "sha256:9b75b5d3416b00d064a5e6f4814fdfb18a964a7cf38dc00b5c2c02fa30a7dd0b", + "sha256:9cad834f1a8f51eb037c3c4dc72c884c9e1e0644d900e2d45aa76450e4aa6282", + "sha256:9d0041bd9e2d2ef803b32d84a0c8115d178132da5691346465953a2a966ba8ca", + "sha256:9f9a1b15b875160186177f659cde2b0f899182b0aca49457d6396afc4bbda7b9", + "sha256:a05b199c11d2f39c72de8c30668734b5d20974ad44b65324ea3e647a211f135d", + "sha256:a413674eb2bd2ecb2b93fcc928871b19f7220ee04bca4af3375c50a2b32b5a50", + "sha256:a54b94b0e4de95aa92618906fb631779d9fde29b4bf659f482c354a3a79fd025", + "sha256:a60ba9d104f4e8496107b1cb86e45a68a16d13511dc3986e0780e9f85c2136f9", + "sha256:ad4a896896346adab86d52b31163c39d49e4e94c829494b96cc064bff82c5851", + "sha256:af1c2241919304cc2f90e7dcb3eb1c1df6fb4172dd338e629dd6410e48b3d1a0", + "sha256:b0a5651e350997cebcdc23016dca26c4d1993d29015a535284da3159796e30b6", + "sha256:b7d60d42f1b9571341ad2322e748f7a60f9847546cd801a3a0eb72a1b54c6519", + "sha256:bb979162323f3534dce84b59f86e689a0761a2a300e0212bfaedfa80d4eb8100", + "sha256:bc907ea12216cfc5560148fc42459d86740fc739981c6feb94230dab09362679", + "sha256:c146a24a8f0dc4a7846fb4640b88b3a68986585b8ce8397af15e66b7c5817439", + "sha256:c46bd76986e05689376d28fdc2b97d899576ce3e3aaa5a5f80f67a8300b26eb3", + "sha256:c624c82e645f6b5465d08cdc802fb0cd53aa1478782fb2992b9e09f2c9426865", + "sha256:cd36b71f9f3bf195b2dd9be5eafbfc9409e6c8007aebc38a4dc051f522008033", + "sha256:ce0518667855a1598d9b1f4fcf0fed1182c67c5ba4fe6a2c6bce93440a65cead", + "sha256:d21408eaa157063f56e58ca50da27cad67c4395a85fb44cc7a31253ea4e58918", + "sha256:d33aef3914a5b49db12ed3f24d214ffa50caefc8f4b0c7c7b9485bd4b231a898", + "sha256:d3dc8d6ce8f001c80919bdb49d8b0b815185933a0b8e9cdeaea42b0b6f27eeb0", + "sha256:d58258a66255b2500ddaa4f33191ada5ec983a429c09eb151daf81efbb9aa115", + "sha256:d8b41195a6b03280ab00749a438fbce761e7acfd5381051a570239d752376f27", + "sha256:ddf9426b740a7047b2b0dddcba775211542e8053ce1e509a1759b665fe573508", + "sha256:de34a7d1893be76cb015929690dce3bde29f4de08143da2e9ad1cedb11dbf80e", + "sha256:e3d50ac3b772c10e0b918a5ce2e871138896bfb5f35050ff1ff87ddca45961fc", + "sha256:e49e4c3e899c32884d7828c91d6c3aff08d2f18857f50f86cc91187c31a4ca58", + "sha256:eb91471640390a82744b164f8a0be4d7c89d173b1170713f9639c6bad61e9e64", + "sha256:f2e69415e4e33cdeee50ebc2c4d8fcbef12c3181d9274e512ccd2a905a76aad1", + "sha256:f3353a2d7eb7d5e0af8a7ca9fc85a34ba12619119bcdee6b8a28a6373cda65ce", + "sha256:f933b35fa563f047896a70b69414dfb3952831817e4c4b3a6faa96737627f363", + "sha256:fccd24c080850715c58a80200d367bc62b4bff6c9fb84e9564da1ebcafea6418", + "sha256:fd9167e9604cb5a218a2e847aa8cdc5f98b379a673371978ee7b0c11b4d2e140", + "sha256:fdc648d4e81eef5ac4bb35d731562dffc28358948410f3274d123320e125d613", + "sha256:fe7439d9c5b402af2c9911c7facda1808d0c8dbfa9cf085e6aeac511a23f7d87", + "sha256:ffae52cd76837a5c16409359d236b1fced79e42e0792e8adf375095a5e855368" ], "markers": "python_version >= '3.9'", - "version": "==0.24.0" + "version": "==0.25.0" }, "s3transfer": { "hashes": [ - "sha256:559f161658e1cf0a911f45940552c696735f5c74e64362e515f333ebed87d679", - "sha256:ac265fa68318763a03bf2dc4f39d5cbd6a9e178d81cc9483ad27da33637e320d" + "sha256:35b314d7d82865756edab59f7baebc6b477189e6ab4c53050e28c1de4d9cce18", + "sha256:8ac58bc1989a3fdb7c7f3ee0918a66b160d038a147c7b5db1500930a607e9a1c" ], - "markers": "python_version >= '3.8'", - "version": "==0.11.4" + "markers": "python_version >= '3.9'", + "version": "==0.12.0" }, "setuptools": { "hashes": [ - "sha256:18fd474d4a82a5f83dac888df697af65afa82dec7323d09c3e37d1f14288da54", - "sha256:3e386e96793c8702ae83d17b853fb93d3e09ef82ec62722e61da5cd22376dcd8" + "sha256:ca5cc1069b85dc23070a6628e6bcecb3292acac802399c7f8edc0100619f9009", + "sha256:f6ffc5f0142b1bd8d0ca94ee91b30c0ca862ffd50826da1ea85258a06fd94552" ], "markers": "python_version >= '3.9'", - "version": "==78.1.0" + "version": "==80.7.1" }, "six": { "hashes": [ "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274", "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81" ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2'", + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", "version": "==1.17.0" }, - "tinydb": { - "hashes": [ - "sha256:f7dfc39b8d7fda7a1ca62a8dbb449ffd340a117c1206b68c50b1a481fb95181d", - "sha256:f97030ee5cbc91eeadd1d7af07ab0e48ceb04aa63d4a983adbaca4cba16e86c3" - ], - "markers": "python_version >= '3.8' and python_version < '4.0'", - "version": "==4.8.2" - }, - "tuspy": { - "hashes": [ - "sha256:156734eac5c61a046cfecd70f14119f05be92cce198eb5a1a99a664482bedb89", - "sha256:7fc5ac8fb25de37c96c90213f83a1ffdede7f48a471cb5a15a2f57846828a79a" - ], - "markers": "python_full_version >= '3.5.3'", - "version": "==1.1.0" - }, "typing-extensions": { "hashes": [ "sha256:a439e7c04b49fec3e5d3e2beaa21755cadbbdc391694e28ccdd36ca4a1408f8c", "sha256:e6c81219bd689f51865d9e372991c540bda33a0379d5573cddb9a3a23f7caaef" ], - "markers": "python_version >= '3.8'", + "markers": "python_version < '3.13'", "version": "==4.13.2" }, "typing-inspection": { @@ -1666,99 +1233,6 @@ "markers": "python_version >= '3.9'", "version": "==3.1.3" }, - "yarl": { - "hashes": [ - "sha256:0110f91c57ab43d1538dfa92d61c45e33b84df9257bd08fcfcda90cce931cbc9", - "sha256:01e02bb80ae0dbed44273c304095295106e1d9470460e773268a27d11e594892", - "sha256:0626ee31edb23ac36bdffe607231de2cca055ad3a5e2dc5da587ef8bc6a321bc", - "sha256:087ae8f8319848c18e0d114d0f56131a9c017f29200ab1413b0137ad7c83e2ae", - "sha256:0bae32f8ebd35c04d6528cedb4a26b8bf25339d3616b04613b97347f919b76d3", - "sha256:0df9f0221a78d858793f40cbea3915c29f969c11366646a92ca47e080a14f881", - "sha256:0e617d45d03c8dec0dfce6f51f3e1b8a31aa81aaf4a4d1442fdb232bcf0c6d8c", - "sha256:163ff326680de5f6d4966954cf9e3fe1bf980f5fee2255e46e89b8cf0f3418b5", - "sha256:1efbf4d03e6eddf5da27752e0b67a8e70599053436e9344d0969532baa99df53", - "sha256:217f69e60a14da4eed454a030ea8283f8fbd01a7d6d81e57efb865856822489b", - "sha256:24e4c367ad69988a2283dd45ea88172561ca24b2326b9781e164eb46eea68345", - "sha256:262087a8a0d73e1d169d45c2baf968126f93c97cf403e1af23a7d5455d52721f", - "sha256:2af682a1e97437382ee0791eacbf540318bd487a942e068e7e0a6c571fadbbd3", - "sha256:30eaf4459df6e91f21b2999d1ee18f891bcd51e3cbe1de301b4858c84385895b", - "sha256:32ba32d0fa23893fd8ea8d05bdb05de6eb19d7f2106787024fd969f4ba5466cb", - "sha256:3560dcba3c71ae7382975dc1e912ee76e50b4cd7c34b454ed620d55464f11876", - "sha256:362f5480ba527b6c26ff58cff1f229afe8b7fdd54ee5ffac2ab827c1a75fc71c", - "sha256:3b77173663e075d9e5a57e09d711e9da2f3266be729ecca0b8ae78190990d260", - "sha256:46ade37911b7c99ce28a959147cb28bffbd14cea9e7dd91021e06a8d2359a5aa", - "sha256:4815ec6d3d68a96557fa71bd36661b45ac773fb50e5cfa31a7e843edb098f060", - "sha256:528e86f5b1de0ad8dd758ddef4e0ed24f5d946d4a1cef80ffb2d4fca4e10f122", - "sha256:545575ecfcd465891b51546c2bcafdde0acd2c62c2097d8d71902050b20e4922", - "sha256:5507c1f7dd3d41251b67eecba331c8b2157cfd324849879bebf74676ce76aff7", - "sha256:5684e7ff93ea74e47542232bd132f608df4d449f8968fde6b05aaf9e08a140f9", - "sha256:57711f1465c06fee8825b95c0b83e82991e6d9425f9a042c3c19070a70ac92bf", - "sha256:57abd66ca913f2cfbb51eb3dbbbac3648f1f6983f614a4446e0802e241441d2a", - "sha256:57f3fed859af367b9ca316ecc05ce79ce327d6466342734305aa5cc380e4d8be", - "sha256:5864f539ce86b935053bfa18205fa08ce38e9a40ea4d51b19ce923345f0ed5db", - "sha256:59281b9ed27bc410e0793833bcbe7fc149739d56ffa071d1e0fe70536a4f7b61", - "sha256:5a70201dd1e0a4304849b6445a9891d7210604c27e67da59091d5412bc19e51c", - "sha256:5bc503e1c1fee1b86bcb58db67c032957a52cae39fe8ddd95441f414ffbab83e", - "sha256:63702f1a098d0eaaea755e9c9d63172be1acb9e2d4aeb28b187092bcc9ca2d17", - "sha256:66fc1c2926a73a2fb46e4b92e3a6c03904d9bc3a0b65e01cb7d2b84146a8bd3b", - "sha256:67a56b1acc7093451ea2de0687aa3bd4e58d6b4ef6cbeeaad137b45203deaade", - "sha256:68972df6a0cc47c8abaf77525a76ee5c5f6ea9bbdb79b9565b3234ded3c5e675", - "sha256:6ba0931b559f1345df48a78521c31cfe356585670e8be22af84a33a39f7b9221", - "sha256:70f384921c24e703d249a6ccdabeb57dd6312b568b504c69e428a8dd3e8e68ca", - "sha256:742ceffd3c7beeb2b20d47cdb92c513eef83c9ef88c46829f88d5b06be6734ee", - "sha256:75460740005de5a912b19f657848aef419387426a40f581b1dc9fac0eb9addb5", - "sha256:756b9ea5292a2c180d1fe782a377bc4159b3cfefaca7e41b5b0a00328ef62fa9", - "sha256:7908a25d33f94852b479910f9cae6cdb9e2a509894e8d5f416c8342c0253c397", - "sha256:7a8e19fd5a6fdf19a91f2409665c7a089ffe7b9b5394ab33c0eec04cbecdd01f", - "sha256:7b687c334da3ff8eab848c9620c47a253d005e78335e9ce0d6868ed7e8fd170b", - "sha256:7e4cb14a6ee5b6649ccf1c6d648b4da9220e8277d4d4380593c03cc08d8fe937", - "sha256:8015a076daf77823e7ebdcba474156587391dab4e70c732822960368c01251e6", - "sha256:8182ad422bfacdebd4759ce3adc6055c0c79d4740aea1104e05652a81cd868c6", - "sha256:8346ec72ada749a6b5d82bff7be72578eab056ad7ec38c04f668a685abde6af0", - "sha256:85ac908cd5a97bbd3048cca9f1bf37b932ea26c3885099444f34b0bf5d5e9fa6", - "sha256:8b3ade62678ee2c7c10dcd6be19045135e9badad53108f7d2ed14896ee396045", - "sha256:8c0b2371858d5a814b08542d5d548adb03ff2d7ab32f23160e54e92250961a72", - "sha256:961c3e401ea7f13d02b8bb7cb0c709152a632a6e14cdc8119e9c6ee5596cd45d", - "sha256:9931343d1c1f4e77421687b6b94bbebd8a15a64ab8279adf6fbb047eff47e536", - "sha256:9973ac95327f5d699eb620286c39365990b240031672b5c436a4cd00539596c5", - "sha256:9ba536b17ecf3c74a94239ec1137a3ad3caea8c0e4deb8c8d2ffe847d870a8c5", - "sha256:9fac2dd1c5ecb921359d9546bc23a6dcc18c6acd50c6d96f118188d68010f497", - "sha256:a251e00e445d2e9df7b827c9843c0b87f58a3254aaa3f162fb610747491fe00f", - "sha256:a39d7b807ab58e633ed760f80195cbd145b58ba265436af35f9080f1810dfe64", - "sha256:a5288adb7c59d0f54e4ad58d86fb06d4b26e08a59ed06d00a1aac978c0e32884", - "sha256:a626c4d9cca298d1be8625cff4b17004a9066330ac82d132bbda64a4c17c18d3", - "sha256:a727101eb27f66727576630d02985d8a065d09cd0b5fcbe38a5793f71b2a97ef", - "sha256:a93208282c0ccdf73065fd76c6c129bd428dba5ff65d338ae7d2ab27169861a0", - "sha256:aad67c8f13a4b79990082f72ef09c078a77de2b39899aabf3960a48069704973", - "sha256:acf9b92c4245ac8b59bc7ec66a38d3dcb8d1f97fac934672529562bb824ecadb", - "sha256:ada882e26b16ee651ab6544ce956f2f4beaed38261238f67c2a96db748e17741", - "sha256:ae584afe81a1de4c1bb06672481050f0d001cad13163e3c019477409f638f9b7", - "sha256:aee5b90a5a9b71ac57400a7bdd0feaa27c51e8f961decc8d412e720a004a1791", - "sha256:b0fe766febcf523a2930b819c87bb92407ae1368662c1bc267234e79b20ff894", - "sha256:b8179280cdeb4c36eb18d6534a328f9d40da60d2b96ac4a295c5f93e2799e9d9", - "sha256:c03607bf932aa4cfae371e2dc9ca8b76faf031f106dac6a6ff1458418140c165", - "sha256:c4228978fb59c6b10f60124ba8e311c26151e176df364e996f3f8ff8b93971b5", - "sha256:c515f7dd60ca724e4c62b34aeaa603188964abed2eb66bb8e220f7f104d5a187", - "sha256:cbeb9c145d534c240a63b6ecc8a8dd451faeb67b3dc61d729ec197bb93e29497", - "sha256:cd430c2b7df4ae92498da09e9b12cad5bdbb140d22d138f9e507de1aa3edfea3", - "sha256:cda34ab19099c3a1685ad48fe45172536610c312b993310b5f1ca3eb83453b36", - "sha256:d27a6482ad5e05e8bafd47bf42866f8a1c0c3345abcb48d4511b3c29ecc197dc", - "sha256:d8717924cf0a825b62b1a96fc7d28aab7f55a81bf5338b8ef41d7a76ab9223e9", - "sha256:d995122dcaf180fd4830a9aa425abddab7c0246107c21ecca2fa085611fa7ce9", - "sha256:dff065a1a8ed051d7e641369ba1ad030d5a707afac54cf4ede7069b959898835", - "sha256:e4807aab1bdeab6ae6f296be46337a260ae4b1f3a8c2fcd373e236b4b2b46efd", - "sha256:e66c14d162bac94973e767b24de5d7e6c5153f7305a64ff4fcba701210bcd638", - "sha256:e97d2f0a06b39e231e59ebab0e6eec45c7683b339e8262299ac952707bdf7688", - "sha256:ec2f56edaf476f70b5831bbd59700b53d9dd011b1f77cd4846b5ab5c5eafdb3f", - "sha256:eda3c2b42dc0c389b7cfda2c4df81c12eeb552019e0de28bde8f913fc3d1fcf3", - "sha256:f228f42f29cc87db67020f7d71624102b2c837686e55317b16e1d3ef2747a993", - "sha256:f408d4b4315e814e5c3668094e33d885f13c7809cbe831cbdc5b1bb8c7a448f4", - "sha256:f9b92431d8b4d4ca5ccbfdbac95b05a3a6cd70cd73aa62f32f9627acfde7549c", - "sha256:fd4b5fbd7b9dde785cfeb486b8cca211a0b138d4f3a7da27db89a25b3c482e5c" - ], - "markers": "python_version >= '3.9'", - "version": "==1.19.0" - }, "zope.event": { "hashes": [ "sha256:2832e95014f4db26c47a13fdaef84cef2f4df37e66b59d8f1f4a8f319a632c26", @@ -1849,11 +1323,11 @@ }, "certifi": { "hashes": [ - "sha256:3d5da6925056f6f18f119200434a4780a94263f10d1c21d032a6f6b2baa20651", - "sha256:ca78db4565a652026a4db2bcdf68f2fb589ea80d0be70e03929ed730746b84fe" + "sha256:0a816057ea3cdefcef70270d2c515e4506bbc954f417fa5ade2021213bb8f0c6", + "sha256:30350364dfe371162649852c63336a15c70c6510c2ad5015b21c2345311805f3" ], "markers": "python_version >= '3.6'", - "version": "==2025.1.31" + "version": "==2025.4.26" }, "cffi": { "hashes": [ @@ -1930,101 +1404,101 @@ }, "charset-normalizer": { "hashes": [ - "sha256:0167ddc8ab6508fe81860a57dd472b2ef4060e8d378f0cc555707126830f2537", - "sha256:01732659ba9b5b873fc117534143e4feefecf3b2078b0a6a2e925271bb6f4cfa", - "sha256:01ad647cdd609225c5350561d084b42ddf732f4eeefe6e678765636791e78b9a", - "sha256:04432ad9479fa40ec0f387795ddad4437a2b50417c69fa275e212933519ff294", - "sha256:0907f11d019260cdc3f94fbdb23ff9125f6b5d1039b76003b5b0ac9d6a6c9d5b", - "sha256:0924e81d3d5e70f8126529951dac65c1010cdf117bb75eb02dd12339b57749dd", - "sha256:09b26ae6b1abf0d27570633b2b078a2a20419c99d66fb2823173d73f188ce601", - "sha256:09b5e6733cbd160dcc09589227187e242a30a49ca5cefa5a7edd3f9d19ed53fd", - "sha256:0af291f4fe114be0280cdd29d533696a77b5b49cfde5467176ecab32353395c4", - "sha256:0f55e69f030f7163dffe9fd0752b32f070566451afe180f99dbeeb81f511ad8d", - "sha256:1a2bc9f351a75ef49d664206d51f8e5ede9da246602dc2d2726837620ea034b2", - "sha256:22e14b5d70560b8dd51ec22863f370d1e595ac3d024cb8ad7d308b4cd95f8313", - "sha256:234ac59ea147c59ee4da87a0c0f098e9c8d169f4dc2a159ef720f1a61bbe27cd", - "sha256:2369eea1ee4a7610a860d88f268eb39b95cb588acd7235e02fd5a5601773d4fa", - "sha256:237bdbe6159cff53b4f24f397d43c6336c6b0b42affbe857970cefbb620911c8", - "sha256:28bf57629c75e810b6ae989f03c0828d64d6b26a5e205535585f96093e405ed1", - "sha256:2967f74ad52c3b98de4c3b32e1a44e32975e008a9cd2a8cc8966d6a5218c5cb2", - "sha256:2a75d49014d118e4198bcee5ee0a6f25856b29b12dbf7cd012791f8a6cc5c496", - "sha256:2bdfe3ac2e1bbe5b59a1a63721eb3b95fc9b6817ae4a46debbb4e11f6232428d", - "sha256:2d074908e1aecee37a7635990b2c6d504cd4766c7bc9fc86d63f9c09af3fa11b", - "sha256:2fb9bd477fdea8684f78791a6de97a953c51831ee2981f8e4f583ff3b9d9687e", - "sha256:311f30128d7d333eebd7896965bfcfbd0065f1716ec92bd5638d7748eb6f936a", - "sha256:329ce159e82018d646c7ac45b01a430369d526569ec08516081727a20e9e4af4", - "sha256:345b0426edd4e18138d6528aed636de7a9ed169b4aaf9d61a8c19e39d26838ca", - "sha256:363e2f92b0f0174b2f8238240a1a30142e3db7b957a5dd5689b0e75fb717cc78", - "sha256:3a3bd0dcd373514dcec91c411ddb9632c0d7d92aed7093b8c3bbb6d69ca74408", - "sha256:3bed14e9c89dcb10e8f3a29f9ccac4955aebe93c71ae803af79265c9ca5644c5", - "sha256:44251f18cd68a75b56585dd00dae26183e102cd5e0f9f1466e6df5da2ed64ea3", - "sha256:44ecbf16649486d4aebafeaa7ec4c9fed8b88101f4dd612dcaf65d5e815f837f", - "sha256:4532bff1b8421fd0a320463030c7520f56a79c9024a4e88f01c537316019005a", - "sha256:49402233c892a461407c512a19435d1ce275543138294f7ef013f0b63d5d3765", - "sha256:4c0907b1928a36d5a998d72d64d8eaa7244989f7aaaf947500d3a800c83a3fd6", - "sha256:4d86f7aff21ee58f26dcf5ae81a9addbd914115cdebcbb2217e4f0ed8982e146", - "sha256:5777ee0881f9499ed0f71cc82cf873d9a0ca8af166dfa0af8ec4e675b7df48e6", - "sha256:5df196eb874dae23dcfb968c83d4f8fdccb333330fe1fc278ac5ceeb101003a9", - "sha256:619a609aa74ae43d90ed2e89bdd784765de0a25ca761b93e196d938b8fd1dbbd", - "sha256:6e27f48bcd0957c6d4cb9d6fa6b61d192d0b13d5ef563e5f2ae35feafc0d179c", - "sha256:6ff8a4a60c227ad87030d76e99cd1698345d4491638dfa6673027c48b3cd395f", - "sha256:73d94b58ec7fecbc7366247d3b0b10a21681004153238750bb67bd9012414545", - "sha256:7461baadb4dc00fd9e0acbe254e3d7d2112e7f92ced2adc96e54ef6501c5f176", - "sha256:75832c08354f595c760a804588b9357d34ec00ba1c940c15e31e96d902093770", - "sha256:7709f51f5f7c853f0fb938bcd3bc59cdfdc5203635ffd18bf354f6967ea0f824", - "sha256:78baa6d91634dfb69ec52a463534bc0df05dbd546209b79a3880a34487f4b84f", - "sha256:7974a0b5ecd505609e3b19742b60cee7aa2aa2fb3151bc917e6e2646d7667dcf", - "sha256:7a4f97a081603d2050bfaffdefa5b02a9ec823f8348a572e39032caa8404a487", - "sha256:7b1bef6280950ee6c177b326508f86cad7ad4dff12454483b51d8b7d673a2c5d", - "sha256:7d053096f67cd1241601111b698f5cad775f97ab25d81567d3f59219b5f1adbd", - "sha256:804a4d582ba6e5b747c625bf1255e6b1507465494a40a2130978bda7b932c90b", - "sha256:807f52c1f798eef6cf26beb819eeb8819b1622ddfeef9d0977a8502d4db6d534", - "sha256:80ed5e856eb7f30115aaf94e4a08114ccc8813e6ed1b5efa74f9f82e8509858f", - "sha256:8417cb1f36cc0bc7eaba8ccb0e04d55f0ee52df06df3ad55259b9a323555fc8b", - "sha256:8436c508b408b82d87dc5f62496973a1805cd46727c34440b0d29d8a2f50a6c9", - "sha256:89149166622f4db9b4b6a449256291dc87a99ee53151c74cbd82a53c8c2f6ccd", - "sha256:8bfa33f4f2672964266e940dd22a195989ba31669bd84629f05fab3ef4e2d125", - "sha256:8c60ca7339acd497a55b0ea5d506b2a2612afb2826560416f6894e8b5770d4a9", - "sha256:91b36a978b5ae0ee86c394f5a54d6ef44db1de0815eb43de826d41d21e4af3de", - "sha256:955f8851919303c92343d2f66165294848d57e9bba6cf6e3625485a70a038d11", - "sha256:97f68b8d6831127e4787ad15e6757232e14e12060bec17091b85eb1486b91d8d", - "sha256:9b23ca7ef998bc739bf6ffc077c2116917eabcc901f88da1b9856b210ef63f35", - "sha256:9f0b8b1c6d84c8034a44893aba5e767bf9c7a211e313a9605d9c617d7083829f", - "sha256:aabfa34badd18f1da5ec1bc2715cadc8dca465868a4e73a0173466b688f29dda", - "sha256:ab36c8eb7e454e34e60eb55ca5d241a5d18b2c6244f6827a30e451c42410b5f7", - "sha256:b010a7a4fd316c3c484d482922d13044979e78d1861f0e0650423144c616a46a", - "sha256:b1ac5992a838106edb89654e0aebfc24f5848ae2547d22c2c3f66454daa11971", - "sha256:b7b2d86dd06bfc2ade3312a83a5c364c7ec2e3498f8734282c6c3d4b07b346b8", - "sha256:b97e690a2118911e39b4042088092771b4ae3fc3aa86518f84b8cf6888dbdb41", - "sha256:bc2722592d8998c870fa4e290c2eec2c1569b87fe58618e67d38b4665dfa680d", - "sha256:c0429126cf75e16c4f0ad00ee0eae4242dc652290f940152ca8c75c3a4b6ee8f", - "sha256:c30197aa96e8eed02200a83fba2657b4c3acd0f0aa4bdc9f6c1af8e8962e0757", - "sha256:c4c3e6da02df6fa1410a7680bd3f63d4f710232d3139089536310d027950696a", - "sha256:c75cb2a3e389853835e84a2d8fb2b81a10645b503eca9bcb98df6b5a43eb8886", - "sha256:c96836c97b1238e9c9e3fe90844c947d5afbf4f4c92762679acfe19927d81d77", - "sha256:d7f50a1f8c450f3925cb367d011448c39239bb3eb4117c36a6d354794de4ce76", - "sha256:d973f03c0cb71c5ed99037b870f2be986c3c05e63622c017ea9816881d2dd247", - "sha256:d98b1668f06378c6dbefec3b92299716b931cd4e6061f3c875a71ced1780ab85", - "sha256:d9c3cdf5390dcd29aa8056d13e8e99526cda0305acc038b96b30352aff5ff2bb", - "sha256:dad3e487649f498dd991eeb901125411559b22e8d7ab25d3aeb1af367df5efd7", - "sha256:dccbe65bd2f7f7ec22c4ff99ed56faa1e9f785482b9bbd7c717e26fd723a1d1e", - "sha256:dd78cfcda14a1ef52584dbb008f7ac81c1328c0f58184bf9a84c49c605002da6", - "sha256:e218488cd232553829be0664c2292d3af2eeeb94b32bea483cf79ac6a694e037", - "sha256:e358e64305fe12299a08e08978f51fc21fac060dcfcddd95453eabe5b93ed0e1", - "sha256:ea0d8d539afa5eb2728aa1932a988a9a7af94f18582ffae4bc10b3fbdad0626e", - "sha256:eab677309cdb30d047996b36d34caeda1dc91149e4fdca0b1a039b3f79d9a807", - "sha256:eb8178fe3dba6450a3e024e95ac49ed3400e506fd4e9e5c32d30adda88cbd407", - "sha256:ecddf25bee22fe4fe3737a399d0d177d72bc22be6913acfab364b40bce1ba83c", - "sha256:eea6ee1db730b3483adf394ea72f808b6e18cf3cb6454b4d86e04fa8c4327a12", - "sha256:f08ff5e948271dc7e18a35641d2f11a4cd8dfd5634f55228b691e62b37125eb3", - "sha256:f30bf9fd9be89ecb2360c7d94a711f00c09b976258846efe40db3d05828e8089", - "sha256:fa88b843d6e211393a37219e6a1c1df99d35e8fd90446f1118f4216e307e48cd", - "sha256:fc54db6c8593ef7d4b2a331b58653356cf04f67c960f584edb7c3d8c97e8f39e", - "sha256:fd4ec41f914fa74ad1b8304bbc634b3de73d2a0889bd32076342a573e0779e00", - "sha256:ffc9202a29ab3920fa812879e95a9e78b2465fd10be7fcbd042899695d75e616" + "sha256:005fa3432484527f9732ebd315da8da8001593e2cf46a3d817669f062c3d9ed4", + "sha256:046595208aae0120559a67693ecc65dd75d46f7bf687f159127046628178dc45", + "sha256:0c29de6a1a95f24b9a1aa7aefd27d2487263f00dfd55a77719b530788f75cff7", + "sha256:0c8c57f84ccfc871a48a47321cfa49ae1df56cd1d965a09abe84066f6853b9c0", + "sha256:0f5d9ed7f254402c9e7d35d2f5972c9bbea9040e99cd2861bd77dc68263277c7", + "sha256:18dd2e350387c87dabe711b86f83c9c78af772c748904d372ade190b5c7c9d4d", + "sha256:1b1bde144d98e446b056ef98e59c256e9294f6b74d7af6846bf5ffdafd687a7d", + "sha256:1c95a1e2902a8b722868587c0e1184ad5c55631de5afc0eb96bc4b0d738092c0", + "sha256:1cad5f45b3146325bb38d6855642f6fd609c3f7cad4dbaf75549bf3b904d3184", + "sha256:21b2899062867b0e1fde9b724f8aecb1af14f2778d69aacd1a5a1853a597a5db", + "sha256:24498ba8ed6c2e0b56d4acbf83f2d989720a93b41d712ebd4f4979660db4417b", + "sha256:25a23ea5c7edc53e0f29bae2c44fcb5a1aa10591aae107f2a2b2583a9c5cbc64", + "sha256:289200a18fa698949d2b39c671c2cc7a24d44096784e76614899a7ccf2574b7b", + "sha256:28a1005facc94196e1fb3e82a3d442a9d9110b8434fc1ded7a24a2983c9888d8", + "sha256:32fc0341d72e0f73f80acb0a2c94216bd704f4f0bce10aedea38f30502b271ff", + "sha256:36b31da18b8890a76ec181c3cf44326bf2c48e36d393ca1b72b3f484113ea344", + "sha256:3c21d4fca343c805a52c0c78edc01e3477f6dd1ad7c47653241cf2a206d4fc58", + "sha256:3fddb7e2c84ac87ac3a947cb4e66d143ca5863ef48e4a5ecb83bd48619e4634e", + "sha256:43e0933a0eff183ee85833f341ec567c0980dae57c464d8a508e1b2ceb336471", + "sha256:4a476b06fbcf359ad25d34a057b7219281286ae2477cc5ff5e3f70a246971148", + "sha256:4e594135de17ab3866138f496755f302b72157d115086d100c3f19370839dd3a", + "sha256:50bf98d5e563b83cc29471fa114366e6806bc06bc7a25fd59641e41445327836", + "sha256:5a9979887252a82fefd3d3ed2a8e3b937a7a809f65dcb1e068b090e165bbe99e", + "sha256:5baececa9ecba31eff645232d59845c07aa030f0c81ee70184a90d35099a0e63", + "sha256:5bf4545e3b962767e5c06fe1738f951f77d27967cb2caa64c28be7c4563e162c", + "sha256:6333b3aa5a12c26b2a4d4e7335a28f1475e0e5e17d69d55141ee3cab736f66d1", + "sha256:65c981bdbd3f57670af8b59777cbfae75364b483fa8a9f420f08094531d54a01", + "sha256:68a328e5f55ec37c57f19ebb1fdc56a248db2e3e9ad769919a58672958e8f366", + "sha256:6a0289e4589e8bdfef02a80478f1dfcb14f0ab696b5a00e1f4b8a14a307a3c58", + "sha256:6b66f92b17849b85cad91259efc341dce9c1af48e2173bf38a85c6329f1033e5", + "sha256:6c9379d65defcab82d07b2a9dfbfc2e95bc8fe0ebb1b176a3190230a3ef0e07c", + "sha256:6fc1f5b51fa4cecaa18f2bd7a003f3dd039dd615cd69a2afd6d3b19aed6775f2", + "sha256:70f7172939fdf8790425ba31915bfbe8335030f05b9913d7ae00a87d4395620a", + "sha256:721c76e84fe669be19c5791da68232ca2e05ba5185575086e384352e2c309597", + "sha256:7222ffd5e4de8e57e03ce2cef95a4c43c98fcb72ad86909abdfc2c17d227fc1b", + "sha256:75d10d37a47afee94919c4fab4c22b9bc2a8bf7d4f46f87363bcf0573f3ff4f5", + "sha256:76af085e67e56c8816c3ccf256ebd136def2ed9654525348cfa744b6802b69eb", + "sha256:770cab594ecf99ae64c236bc9ee3439c3f46be49796e265ce0cc8bc17b10294f", + "sha256:7a6ab32f7210554a96cd9e33abe3ddd86732beeafc7a28e9955cdf22ffadbab0", + "sha256:7c48ed483eb946e6c04ccbe02c6b4d1d48e51944b6db70f697e089c193404941", + "sha256:7f56930ab0abd1c45cd15be65cc741c28b1c9a34876ce8c17a2fa107810c0af0", + "sha256:8075c35cd58273fee266c58c0c9b670947c19df5fb98e7b66710e04ad4e9ff86", + "sha256:8272b73e1c5603666618805fe821edba66892e2870058c94c53147602eab29c7", + "sha256:82d8fd25b7f4675d0c47cf95b594d4e7b158aca33b76aa63d07186e13c0e0ab7", + "sha256:844da2b5728b5ce0e32d863af26f32b5ce61bc4273a9c720a9f3aa9df73b1455", + "sha256:8755483f3c00d6c9a77f490c17e6ab0c8729e39e6390328e42521ef175380ae6", + "sha256:915f3849a011c1f593ab99092f3cecfcb4d65d8feb4a64cf1bf2d22074dc0ec4", + "sha256:926ca93accd5d36ccdabd803392ddc3e03e6d4cd1cf17deff3b989ab8e9dbcf0", + "sha256:982bb1e8b4ffda883b3d0a521e23abcd6fd17418f6d2c4118d257a10199c0ce3", + "sha256:98f862da73774290f251b9df8d11161b6cf25b599a66baf087c1ffe340e9bfd1", + "sha256:9cbfacf36cb0ec2897ce0ebc5d08ca44213af24265bd56eca54bee7923c48fd6", + "sha256:a370b3e078e418187da8c3674eddb9d983ec09445c99a3a263c2011993522981", + "sha256:a955b438e62efdf7e0b7b52a64dc5c3396e2634baa62471768a64bc2adb73d5c", + "sha256:aa6af9e7d59f9c12b33ae4e9450619cf2488e2bbe9b44030905877f0b2324980", + "sha256:aa88ca0b1932e93f2d961bf3addbb2db902198dca337d88c89e1559e066e7645", + "sha256:aaeeb6a479c7667fbe1099af9617c83aaca22182d6cf8c53966491a0f1b7ffb7", + "sha256:aaf27faa992bfee0264dc1f03f4c75e9fcdda66a519db6b957a3f826e285cf12", + "sha256:b2680962a4848b3c4f155dc2ee64505a9c57186d0d56b43123b17ca3de18f0fa", + "sha256:b2d318c11350e10662026ad0eb71bb51c7812fc8590825304ae0bdd4ac283acd", + "sha256:b33de11b92e9f75a2b545d6e9b6f37e398d86c3e9e9653c4864eb7e89c5773ef", + "sha256:b3daeac64d5b371dea99714f08ffc2c208522ec6b06fbc7866a450dd446f5c0f", + "sha256:be1e352acbe3c78727a16a455126d9ff83ea2dfdcbc83148d2982305a04714c2", + "sha256:bee093bf902e1d8fc0ac143c88902c3dfc8941f7ea1d6a8dd2bcb786d33db03d", + "sha256:c72fbbe68c6f32f251bdc08b8611c7b3060612236e960ef848e0a517ddbe76c5", + "sha256:c9e36a97bee9b86ef9a1cf7bb96747eb7a15c2f22bdb5b516434b00f2a599f02", + "sha256:cddf7bd982eaa998934a91f69d182aec997c6c468898efe6679af88283b498d3", + "sha256:cf713fe9a71ef6fd5adf7a79670135081cd4431c2943864757f0fa3a65b1fafd", + "sha256:d11b54acf878eef558599658b0ffca78138c8c3655cf4f3a4a673c437e67732e", + "sha256:d41c4d287cfc69060fa91cae9683eacffad989f1a10811995fa309df656ec214", + "sha256:d524ba3f1581b35c03cb42beebab4a13e6cdad7b36246bd22541fa585a56cccd", + "sha256:daac4765328a919a805fa5e2720f3e94767abd632ae410a9062dff5412bae65a", + "sha256:db4c7bf0e07fc3b7d89ac2a5880a6a8062056801b83ff56d8464b70f65482b6c", + "sha256:dc7039885fa1baf9be153a0626e337aa7ec8bf96b0128605fb0d77788ddc1681", + "sha256:dccab8d5fa1ef9bfba0590ecf4d46df048d18ffe3eec01eeb73a42e0d9e7a8ba", + "sha256:dedb8adb91d11846ee08bec4c8236c8549ac721c245678282dcb06b221aab59f", + "sha256:e45ba65510e2647721e35323d6ef54c7974959f6081b58d4ef5d87c60c84919a", + "sha256:e53efc7c7cee4c1e70661e2e112ca46a575f90ed9ae3fef200f2a25e954f4b28", + "sha256:e635b87f01ebc977342e2697d05b56632f5f879a4f15955dfe8cef2448b51691", + "sha256:e70e990b2137b29dc5564715de1e12701815dacc1d056308e2b17e9095372a82", + "sha256:e8082b26888e2f8b36a042a58307d5b917ef2b1cacab921ad3323ef91901c71a", + "sha256:e8323a9b031aa0393768b87f04b4164a40037fb2a3c11ac06a03ffecd3618027", + "sha256:e92fca20c46e9f5e1bb485887d074918b13543b1c2a1185e69bb8d17ab6236a7", + "sha256:eb30abc20df9ab0814b5a2524f23d75dcf83cde762c161917a2b4b7b55b1e518", + "sha256:eba9904b0f38a143592d9fc0e19e2df0fa2e41c3c3745554761c5f6447eedabf", + "sha256:ef8de666d6179b009dce7bcb2ad4c4a779f113f12caf8dc77f0162c29d20490b", + "sha256:efd387a49825780ff861998cd959767800d54f8308936b21025326de4b5a42b9", + "sha256:f0aa37f3c979cf2546b73e8222bbfa3dc07a641585340179d768068e3455e544", + "sha256:f4074c5a429281bf056ddd4c5d3b740ebca4d43ffffe2ef4bf4d2d05114299da", + "sha256:f69a27e45c43520f5487f27627059b64aaf160415589230992cec34c5e18a509", + "sha256:fb707f3e15060adf5b7ada797624a6c6e0138e2a26baa089df64c68ee98e040f", + "sha256:fcbe676a55d7445b22c10967bceaaf0ee69407fbe0ece4d032b6eb8d4565982a", + "sha256:fdb20a30fe1175ecabed17cbf7812f7b804b8a315a25f24678bcdf120a90077f" ], "markers": "python_version >= '3.7'", - "version": "==3.4.1" + "version": "==3.4.2" }, "coverage": { "hashes": [ @@ -2143,19 +1617,19 @@ }, "packaging": { "hashes": [ - "sha256:09abb1bccd265c01f4a3aa3f7a7db064b36514d2cba19a2f694fe6150451a759", - "sha256:c228a6dc5e932d346bc5739379109d49e8853dd8223571c7c5b55260edc0b97f" + "sha256:29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484", + "sha256:d443872c98d677bf60f6a1f2f8c1cb748e8fe762d2bf9d3148b5599295b0fc4f" ], "markers": "python_version >= '3.8'", - "version": "==24.2" + "version": "==25.0" }, "pluggy": { "hashes": [ - "sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1", - "sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669" + "sha256:7dcc130b76258d33b90f61b658791dede3486c3e6bfb003ee5c9bfb396dd22f3", + "sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746" ], - "markers": "python_version >= '3.8'", - "version": "==1.5.0" + "markers": "python_version >= '3.9'", + "version": "==1.6.0" }, "pycparser": { "hashes": [ @@ -2167,38 +1641,50 @@ }, "pycryptodome": { "hashes": [ - "sha256:009e1c80eea42401a5bd5983c4bab8d516aef22e014a4705622e24e6d9d703c6", - "sha256:18d5b0ddc7cf69231736d778bd3ae2b3efb681ae33b64b0c92fb4626bb48bb89", - "sha256:2988ffcd5137dc2d27eb51cd18c0f0f68e5b009d5fec56fbccb638f90934f333", - "sha256:37ddcd18284e6b36b0a71ea495a4c4dca35bb09ccc9bfd5b91bfaf2321f131c1", - "sha256:3b76fa80daeff9519d7e9f6d9e40708f2fce36b9295a847f00624a08293f4f00", - "sha256:56c6f9342fcb6c74e205fbd2fee568ec4cdbdaa6165c8fde55dbc4ba5f584464", - "sha256:87a88dc543b62b5c669895caf6c5a958ac7abc8863919e94b7a6cafd2f64064f", - "sha256:8f4f6f47a7f411f2c157e77bbbda289e0c9f9e1e9944caa73c1c2e33f3f92d6e", - "sha256:96e73527c9185a3d9b4c6d1cfb4494f6ced418573150be170f6580cb975a7f5a", - "sha256:98fd9da809d5675f3a65dcd9ed384b9dc67edab6a4cda150c5870a8122ec961d", - "sha256:9dbb749cef71c28271484cbef684f9b5b19962153487735411e1020ca3f59cb1", - "sha256:9e1bb165ea1dc83a11e5dbbe00ef2c378d148f3a2d3834fb5ba4e0f6fd0afe4b", - "sha256:a0092fd476701eeeb04df5cc509d8b739fa381583cda6a46ff0a60639b7cd70d", - "sha256:a26bcfee1293b7257c83b0bd13235a4ee58165352be4f8c45db851ba46996dc6", - "sha256:a31fa5914b255ab62aac9265654292ce0404f6b66540a065f538466474baedbc", - "sha256:a6cf9553b29624961cab0785a3177a333e09e37ba62ad22314ebdbb01ca79840", - "sha256:aec7b40a7ea5af7c40f8837adf20a137d5e11a6eb202cde7e588a48fb2d871a8", - "sha256:b4bdce34af16c1dcc7f8c66185684be15f5818afd2a82b75a4ce6b55f9783e13", - "sha256:d086aed307e96d40c23c42418cbbca22ecc0ab4a8a0e24f87932eeab26c08627", - "sha256:d21c1eda2f42211f18a25db4eaf8056c94a8563cd39da3683f89fe0d881fb772", - "sha256:d4d1174677855c266eed5c4b4e25daa4225ad0c9ffe7584bb1816767892545d0", - "sha256:e653519dedcd1532788547f00eeb6108cc7ce9efdf5cc9996abce0d53f95d5a9", - "sha256:e7514a1aebee8e85802d154fdb261381f1cb9b7c5a54594545145b8ec3056ae6", - "sha256:f02baa9f5e35934c6e8dcec91fcde96612bdefef6e442813b8ea34e82c84bbfb", - "sha256:f1ae7beb64d4fc4903a6a6cca80f1f448e7a8a95b77d106f8a29f2eb44d17547", - "sha256:f5810bc7494e4ac12a4afef5a32218129e7d3890ce3f2b5ec520cc69eb1102ad", - "sha256:f6cf6aa36fcf463e622d2165a5ad9963b2762bebae2f632d719dfb8544903cf5", - "sha256:f7a683bc9fa585c0dfec7fa4801c96a48d30b30b096e3297f9374f40c2fedafc", - "sha256:fd7ab568b3ad7b77c908d7c3f7e167ec5a8f035c64ff74f10d47a4edd043d723" + "sha256:0011f7f00cdb74879142011f95133274741778abba114ceca229adbf8e62c3e4", + "sha256:11eeeb6917903876f134b56ba11abe95c0b0fd5e3330def218083c7d98bbcb3c", + "sha256:14e15c081e912c4b0d75632acd8382dfce45b258667aa3c67caf7a4d4c13f630", + "sha256:156df9667ad9f2ad26255926524e1c136d6664b741547deb0a86a9acf5ea631f", + "sha256:187058ab80b3281b1de11c2e6842a357a1f71b42cb1e15bce373f3d238135c27", + "sha256:257bb3572c63ad8ba40b89f6fc9d63a2a628e9f9708d31ee26560925ebe0210a", + "sha256:350ebc1eba1da729b35ab7627a833a1a355ee4e852d8ba0447fafe7b14504d56", + "sha256:447700a657182d60338bab09fdb27518f8856aecd80ae4c6bdddb67ff5da44ef", + "sha256:45c69ad715ca1a94f778215a11e66b7ff989d792a4d63b68dc586a1da1392ff5", + "sha256:4764e64b269fc83b00f682c47443c2e6e85b18273712b98aa43bcb77f8570477", + "sha256:507dbead45474b62b2bbe318eb1c4c8ee641077532067fec9c1aa82c31f84886", + "sha256:53ecbafc2b55353edcebd64bf5da94a2a2cdf5090a6915bcca6eca6cc452585a", + "sha256:573a0b3017e06f2cffd27d92ef22e46aa3be87a2d317a5abf7cc0e84e321bd75", + "sha256:63dad881b99ca653302b2c7191998dd677226222a3f2ea79999aa51ce695f720", + "sha256:64093fc334c1eccfd3933c134c4457c34eaca235eeae49d69449dc4728079339", + "sha256:6501790c5b62a29fcb227bd6b62012181d886a767ce9ed03b303d1f22eb5c625", + "sha256:67bd81fcbe34f43ad9422ee8fd4843c8e7198dd88dd3d40e6de42ee65fbe1490", + "sha256:6fe8258e2039eceb74dfec66b3672552b6b7d2c235b2dfecc05d16b8921649a8", + "sha256:763d1d74f56f031788e5d307029caef067febf890cd1f8bf61183ae142f1a77b", + "sha256:7ac1080a8da569bde76c0a104589c4f414b8ba296c0b3738cf39a466a9fb1818", + "sha256:865d83c906b0fc6a59b510deceee656b6bc1c4fa0d82176e2b77e97a420a996a", + "sha256:89d4d56153efc4d81defe8b65fd0821ef8b2d5ddf8ed19df31ba2f00872b8002", + "sha256:90460fc9e088ce095f9ee8356722d4f10f86e5be06e2354230a9880b9c549aae", + "sha256:93837e379a3e5fd2bb00302a47aee9fdf7940d83595be3915752c74033d17ca7", + "sha256:954af0e2bd7cea83ce72243b14e4fb518b18f0c1649b576d114973e2073b273d", + "sha256:9a53a4fe5cb075075d515797d6ce2f56772ea7e6a1e5e4b96cf78a14bac3d265", + "sha256:9a77627a330ab23ca43b48b130e202582e91cc69619947840ea4d2d1be21eb39", + "sha256:a176b79c49af27d7f6c12e4b178b0824626f40a7b9fed08f712291b6d54bf566", + "sha256:a7fc76bf273353dc7e5207d172b83f569540fc9a28d63171061c42e361d22353", + "sha256:aa0698f65e5b570426fc31b8162ed4603b0c2841cbb9088e2b01641e3065915b", + "sha256:b34e8e11d97889df57166eda1e1ddd7676da5fcd4d71a0062a760e75060514b4", + "sha256:c75b52aacc6c0c260f204cbdd834f76edc9fb0d8e0da9fbf8352ef58202564e2", + "sha256:c8987bd3307a39bc03df5c8e0e3d8be0c4c3518b7f044b0f4c15d1aa78f52575", + "sha256:ce64e84a962b63a47a592690bdc16a7eaf709d2c2697ababf24a0def566899a6", + "sha256:cfb5cd445280c5b0a4e6187a7ce8de5a07b5f3f897f235caa11f1f435f182843", + "sha256:d8e95564beb8782abfd9e431c974e14563a794a4944c29d6d3b7b5ea042110b4", + "sha256:d97618c9c6684a97ef7637ba43bdf6663a2e2e77efe0f863cce97a76af396446", + "sha256:ddb95b49df036ddd264a0ad246d1be5b672000f12d6961ea2c267083a5e19379", + "sha256:dea827b4d55ee390dc89b2afe5927d4308a8b538ae91d9c6f7a5090f397af1aa", + "sha256:e3f2d0aaf8080bda0587d58fc9fe4766e012441e2eed4269a77de6aea981c8be", + "sha256:eb8f24adb74984aa0e5d07a2368ad95276cf38051fe2dc6605cbcf482e04f2a7" ], "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5, 3.6'", - "version": "==3.22.0" + "version": "==3.23.0" }, "pytest": { "hashes": [ @@ -2213,7 +1699,7 @@ "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3", "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427" ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2'", + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", "version": "==2.9.0.post0" }, "requests": { @@ -2237,7 +1723,7 @@ "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274", "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81" ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2'", + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", "version": "==1.17.0" }, "testcontainers-core": { @@ -2266,7 +1752,7 @@ "sha256:a439e7c04b49fec3e5d3e2beaa21755cadbbdc391694e28ccdd36ca4a1408f8c", "sha256:e6c81219bd689f51865d9e372991c540bda33a0379d5573cddb9a3a23f7caaef" ], - "markers": "python_version >= '3.8'", + "markers": "python_version < '3.13'", "version": "==4.13.2" }, "urllib3": { diff --git a/dbrepo-analyse-service/app.py b/dbrepo-analyse-service/app.py index 41e4c128d9fb39fa6fa619745540996ca3037881..8cedd64ec8d5109ec58c92e75f9b7f077a84f54e 100644 --- a/dbrepo-analyse-service/app.py +++ b/dbrepo-analyse-service/app.py @@ -28,17 +28,32 @@ dictConfig({ 'format': '[%(asctime)s] %(levelname)s in %(module)s: %(message)s', }, 'simple': { - 'format': '[%(asctime)s] %(levelname)s: %(message)s', + 'format': '[%(asctime)s] [%(levelname)s] %(message)s', + }, + 'ecs': { + 'format': '{"@timestamp": "%(asctime)s", "log.level": "%(levelname)s", "log.logger": "%(module)s", "message": "%(message)s", "service_name": "analyse-service", "service_version": "1.9.0"}', + 'datefmt': '%Y-%m-%dT%H:%M:%S' + }, + }, + 'handlers': { + 'wsgi': { + 'class': 'logging.StreamHandler', + 'stream': 'ext://flask.logging.wsgi_errors_stream', + 'formatter': 'simple' + }, + 'file': { + 'class': 'logging.handlers.TimedRotatingFileHandler', + 'formatter': 'ecs', + 'filename': '/var/log/app/service/analyse/app.log', + 'when': 'm', + 'interval': 1, + 'backupCount': 5, + 'encoding': 'utf8' }, }, - 'handlers': {'wsgi': { - 'class': 'logging.StreamHandler', - 'stream': 'ext://flask.logging.wsgi_errors_stream', - 'formatter': 'simple' # default - }}, 'root': { 'level': 'DEBUG', - 'handlers': ['wsgi'] + 'handlers': ['wsgi', 'file'] } }) @@ -59,8 +74,8 @@ swagger_config = { "headers": [], "specs": [ { - "endpoint": "api-analyse", - "route": "/api-analyse.json", + "endpoint": "api-docs", + "route": "/api-docs.json", "rule_filter": lambda rule: rule.endpoint.startswith('actuator') or rule.endpoint.startswith('analyse'), "model_filter": lambda tag: True, # all in } @@ -185,7 +200,7 @@ template = { "info": { "title": "Database Repository Analyse Service API", "description": "Service that analyses data structures", - "version": "1.8.1", + "version": "1.9.0", "contact": { "name": "Prof. Andreas Rauber", "email": "andreas.rauber@tuwien.ac.at" @@ -197,7 +212,7 @@ template = { }, "externalDocs": { "description": "Sourcecode Documentation", - "url": "https://www.ifs.tuwien.ac.at/infrastructures/dbrepo/1.8/" + "url": "https://www.ifs.tuwien.ac.at/infrastructures/dbrepo/1.9/" }, "servers": [ { @@ -263,7 +278,7 @@ def get_health(): @app.route("/api/analyse/datatypes", methods=["GET"], endpoint="analyse_analyse_datatypes") @metrics.gauge(name='dbrepo_analyse_datatypes', description='Time needed to analyse datatypes of dataset') -@swag_from("as-yml/analyse_datatypes.yml") +@swag_from("/app/as-yml/analyse_datatypes.yml") def analyse_datatypes(): filename: str = request.args.get('filename') separator: str = request.args.get('separator') @@ -280,17 +295,17 @@ def analyse_datatypes(): logging.debug("determine datatype resulted in datatypes %s", res) return Response(res.model_dump_json(), mimetype="application/json"), 202 except OSError as e: - logging.error(f"Failed to determine data types: {e}") + logging.error(f"Failed to determine data types: {str(e).strip()}") return ApiError(status='BAD_REQUEST', message=str(e), code='error.analyse.invalid').model_dump_json(), 400 except ClientError as e: - logging.error(f"Failed to determine separator: {e}") + logging.error(f"Failed to determine separator: {str(e).strip()}") return ApiError(status='NOT_FOUND', message='Failed to find csv', code='error.analyse.missing').model_dump_json(), 404 @app.route("/api/analyse/keys", methods=["GET"], endpoint="analyse_analyse_keys") @metrics.gauge(name='dbrepo_analyse_keys', description='Time needed to analyse keys of dataset') -@swag_from("as-yml/analyse_keys.yml") +@swag_from("/app/as-yml/analyse_keys.yml") def analyse_keys(): filename: str = request.args.get("filename") separator: str = request.args.get('separator') @@ -305,5 +320,5 @@ def analyse_keys(): logging.info(f"Determined list of primary keys: {res}") return Response(dumps(res), mimetype="application/json"), 202 except OSError as e: - logging.error(f"Failed to determine primary key: {e}") + logging.error(f"Failed to determine primary key: {str(e).strip()}") return ApiError(status='BAD_REQUEST', message=str(e), code='analyse.database.invalid').model_dump_json(), 400 diff --git a/dbrepo-analyse-service/lib/dbrepo-1.8.1.tar.gz b/dbrepo-analyse-service/lib/dbrepo-1.8.1.tar.gz deleted file mode 100644 index d13869fc6f53ed38c9580789746781d52a6d0b69..0000000000000000000000000000000000000000 Binary files a/dbrepo-analyse-service/lib/dbrepo-1.8.1.tar.gz and /dev/null differ diff --git a/dbrepo-analyse-service/lib/dbrepo-1.8.1-py3-none-any.whl b/dbrepo-analyse-service/lib/dbrepo-1.9.0-py3-none-any.whl similarity index 83% rename from dbrepo-analyse-service/lib/dbrepo-1.8.1-py3-none-any.whl rename to dbrepo-analyse-service/lib/dbrepo-1.9.0-py3-none-any.whl index 289f081b95f69e34e6d8a947642d7966b55a3b68..c0a8976b56d2534aac0a687119d64d800edc6a57 100644 Binary files a/dbrepo-analyse-service/lib/dbrepo-1.8.1-py3-none-any.whl and b/dbrepo-analyse-service/lib/dbrepo-1.9.0-py3-none-any.whl differ diff --git a/dbrepo-analyse-service/lib/dbrepo-1.9.0.tar.gz b/dbrepo-analyse-service/lib/dbrepo-1.9.0.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..a3f637e0f89cf40643cc39b4778760128a9b717f Binary files /dev/null and b/dbrepo-analyse-service/lib/dbrepo-1.9.0.tar.gz differ diff --git a/dbrepo-auth-service/listeners/create-event-listener.jar b/dbrepo-auth-service/listeners/create-event-listener.jar new file mode 100644 index 0000000000000000000000000000000000000000..58ae18d12de1331078787969009290c78ef64c3b Binary files /dev/null and b/dbrepo-auth-service/listeners/create-event-listener.jar differ diff --git a/dbrepo-auth-service/listeners/src/main/java/at/tuwien/Client.java b/dbrepo-auth-service/listeners/src/main/java/at/ac/tuwien/ifs/dbrepo/Client.java similarity index 81% rename from dbrepo-auth-service/listeners/src/main/java/at/tuwien/Client.java rename to dbrepo-auth-service/listeners/src/main/java/at/ac/tuwien/ifs/dbrepo/Client.java index c63e88618b792f4d85e52b4aee55c80e1a2f1db8..061c4d78fbb7bbaf2745207f93ad7a1b996c714f 100644 --- a/dbrepo-auth-service/listeners/src/main/java/at/tuwien/Client.java +++ b/dbrepo-auth-service/listeners/src/main/java/at/ac/tuwien/ifs/dbrepo/Client.java @@ -1,6 +1,7 @@ -package at.tuwien; +package at.ac.tuwien.ifs.dbrepo; -import org.jboss.logging.Logger; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import java.io.BufferedReader; import java.io.IOException; @@ -13,12 +14,13 @@ import java.nio.charset.Charset; import java.util.Base64; public class Client { - private static final Logger log = Logger.getLogger(Client.class); + + private static final Logger log = LoggerFactory.getLogger(Client.class); public static void postService(String data) throws IOException { try { final String urlString = System.getenv("METADATA_SERVICE_ENDPOINT"); - log.debugf("METADATA_SERVICE_ENDPOINT: %s", urlString); + log.debug("env.METADATA_SERVICE_ENDPOINT: {}", urlString); if (urlString == null || urlString.isEmpty()) { throw new IllegalArgumentException("Environment variable METADATA_SERVICE_ENDPOINT is not set or is empty."); } @@ -26,35 +28,31 @@ public class Client { if (systemUsername == null || systemUsername.isEmpty()) { throw new IllegalArgumentException("Environment variable SYSTEM_USERNAME is not set or is empty."); } - log.debugf("SYSTEM_USERNAME: %s", systemUsername); + log.debug("env.SYSTEM_USERNAME: {}", systemUsername); final String systemPassword = System.getenv("SYSTEM_PASSWORD"); if (systemPassword == null || systemPassword.isEmpty()) { throw new IllegalArgumentException("Environment variable SYSTEM_PASSWORD is not set or is empty."); } final URL url = URI.create(urlString + "/api/user").toURL(); - HttpURLConnection conn = (HttpURLConnection) url.openConnection(); + log.debug("url: {}", url); + final HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setDoOutput(true); conn.setRequestMethod("POST"); final String token = systemUsername + ":" + systemPassword; conn.setRequestProperty("Authorization", "Basic " + Base64.getEncoder().encodeToString(token.getBytes( Charset.defaultCharset()))); conn.setRequestProperty("Content-Type", "application/json; utf-8"); - - OutputStream os = conn.getOutputStream(); + final OutputStream os = conn.getOutputStream(); os.write(data.getBytes()); os.flush(); - final int responseCode = conn.getResponseCode(); if (responseCode != HttpURLConnection.HTTP_CREATED && responseCode != HttpURLConnection.HTTP_OK) { throw new RuntimeException("Failed : HTTP error code : " + responseCode); } - final BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream())); String output; - log.debugf("Output from Server .... \n"); while ((output = br.readLine()) != null) { - System.out.println(output); - log.debugf("Input from Server: %s", output); + log.debug("input from server: {}", output); } conn.disconnect(); } catch (IOException e) { diff --git a/dbrepo-auth-service/listeners/src/main/java/at/ac/tuwien/ifs/dbrepo/CreateEventListenerProvider.java b/dbrepo-auth-service/listeners/src/main/java/at/ac/tuwien/ifs/dbrepo/CreateEventListenerProvider.java new file mode 100644 index 0000000000000000000000000000000000000000..7b47c0919cf9ac200ecdb203700f807e05a04901 --- /dev/null +++ b/dbrepo-auth-service/listeners/src/main/java/at/ac/tuwien/ifs/dbrepo/CreateEventListenerProvider.java @@ -0,0 +1,91 @@ +package at.ac.tuwien.ifs.dbrepo; + +import org.keycloak.events.Event; +import org.keycloak.events.EventListenerProvider; +import org.keycloak.events.EventType; +import org.keycloak.events.admin.AdminEvent; +import org.keycloak.events.admin.OperationType; +import org.keycloak.events.admin.ResourceType; +import org.keycloak.models.KeycloakSession; +import org.keycloak.models.RealmModel; +import org.keycloak.models.RealmProvider; +import org.keycloak.models.UserModel; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class CreateEventListenerProvider implements EventListenerProvider { + + private static final Logger log = LoggerFactory.getLogger(CreateEventListenerProvider.class); + + private final KeycloakSession session; + private final RealmProvider model; + + public CreateEventListenerProvider(KeycloakSession session) { + this.session = session; + this.model = session.realms(); + } + + @Override + public void onEvent(Event event) { + log.atDebug() + .setMessage("received " + event.getType().toString() + " event") + .addKeyValue("event.type", event.getType()) + .addKeyValue("event.realm_id", event.getRealmId()) + .addKeyValue("event.user_id", event.getUserId()) + .log(); + if (EventType.REGISTER.equals(event.getType()) || EventType.IDENTITY_PROVIDER_FIRST_LOGIN.equals(event.getType())) { + final RealmModel realm = this.model.getRealm(event.getRealmId()); + sendUserData(this.session.users().getUserById(realm, event.getUserId())); + } + } + + @Override + public void onEvent(AdminEvent adminEvent, boolean b) { + log.atDebug() + .setMessage("received admin event") + .addKeyValue("event.realm_id", adminEvent.getRealmId()) + .addKeyValue("event.operation_type", adminEvent.getOperationType()) + .addKeyValue("event.resource_type", adminEvent.getResourceType()) + .addKeyValue("event.resource_path", adminEvent.getResourcePath()) + .log(); + if (ResourceType.USER.equals(adminEvent.getResourceType()) + && OperationType.CREATE.equals(adminEvent.getOperationType())) { + final RealmModel realm = this.model.getRealm(adminEvent.getRealmId()); + sendUserData(this.session.users().getUserById(realm, adminEvent.getResourcePath().substring(6))); + } + } + + private void sendUserData(UserModel user) { + final String userData = "{" + + quoteAttr("id", user.getId()) + ", " + + quoteAttr("username", user.getUsername()) + ", " + + quoteAttr("ldap_id", user.getFirstAttribute("LDAP_ID")) + ", " + + quoteAttr("given_name", user.getFirstName()) + ", " + + quoteAttr("family_name", user.getLastName()) + + "}"; + try { + Client.postService(userData); + log.atInfo() + .addKeyValue("id", user.getId()) + .addKeyValue("username", user.getUsername()) + .addKeyValue("ldap_id", user.getFirstAttribute("LDAP_ID")) + .addKeyValue("given_name", user.getFirstName()) + .addKeyValue("family_name", user.getLastName()) + .setMessage("Created new user in metadata service: " + user.getId()) + .log(); + } catch (Exception e) { + log.error("Failed to call metadata service: {}", e.getMessage()); + } + } + + private static String quoteAttr(String key, String value) { + if (value == null || value.isBlank() || value.isEmpty() || value.contentEquals(" ")) { + return "\"" + key + "\": null"; + } + return "\"" + key + "\": \"" + value + "\""; + } + + @Override + public void close() { + } +} diff --git a/dbrepo-auth-service/listeners/src/main/java/at/tuwien/CreateEventListenerProviderFactory.java b/dbrepo-auth-service/listeners/src/main/java/at/ac/tuwien/ifs/dbrepo/CreateEventListenerProviderFactory.java similarity index 95% rename from dbrepo-auth-service/listeners/src/main/java/at/tuwien/CreateEventListenerProviderFactory.java rename to dbrepo-auth-service/listeners/src/main/java/at/ac/tuwien/ifs/dbrepo/CreateEventListenerProviderFactory.java index 61477ffa33169504a3368d11d0750c9c1404e160..5410647bba19c2b1f1ef1f1a62100f9c9ed2b77c 100644 --- a/dbrepo-auth-service/listeners/src/main/java/at/tuwien/CreateEventListenerProviderFactory.java +++ b/dbrepo-auth-service/listeners/src/main/java/at/ac/tuwien/ifs/dbrepo/CreateEventListenerProviderFactory.java @@ -1,4 +1,4 @@ -package at.tuwien; +package at.ac.tuwien.ifs.dbrepo; import org.keycloak.Config; import org.keycloak.events.EventListenerProvider; diff --git a/dbrepo-auth-service/listeners/src/main/java/at/tuwien/CreateEventListenerProvider.java b/dbrepo-auth-service/listeners/src/main/java/at/tuwien/CreateEventListenerProvider.java deleted file mode 100644 index ea4aa7794b6f26167da704e4c12057cf9d8c5c42..0000000000000000000000000000000000000000 --- a/dbrepo-auth-service/listeners/src/main/java/at/tuwien/CreateEventListenerProvider.java +++ /dev/null @@ -1,132 +0,0 @@ -package at.tuwien; - -import org.jboss.logging.Logger; -import org.keycloak.events.Event; -import org.keycloak.events.EventListenerProvider; -import org.keycloak.events.EventType; -import org.keycloak.events.admin.AdminEvent; -import org.keycloak.events.admin.OperationType; -import org.keycloak.events.admin.ResourceType; -import org.keycloak.models.KeycloakSession; -import org.keycloak.models.RealmModel; -import org.keycloak.models.RealmProvider; -import org.keycloak.models.UserModel; - -import java.util.StringJoiner; - -public class CreateEventListenerProvider implements EventListenerProvider { - - private static final Logger log = Logger.getLogger(CreateEventListenerProvider.class); - - private final KeycloakSession session; - private final RealmProvider model; - - public CreateEventListenerProvider(KeycloakSession session) { - this.session = session; - this.model = session.realms(); - } - - @Override - public void onEvent(Event event) { - if (EventType.REGISTER.equals(event.getType()) || EventType.IDENTITY_PROVIDER_FIRST_LOGIN.equals(event.getType())) { - event.getDetails().forEach((key, value) -> log.debugf("%s : %s", key, value)); - RealmModel realm = this.model.getRealm(event.getRealmId()); - UserModel user = this.session.users().getUserById(realm, event.getUserId()); - sendUserData(user); - } - - } - - @Override - public void onEvent(AdminEvent adminEvent, boolean b) { - log.debug("onEvent(AdminEvent)"); - log.debugf("Resource path: %s", adminEvent.getResourcePath()); - log.debugf("Resource type: %s", adminEvent.getResourceType()); - log.debugf("Operation type: %s", adminEvent.getOperationType()); - log.debugf("AdminEvent.toString(): %s", toString(adminEvent)); - if (ResourceType.USER.equals(adminEvent.getResourceType()) - && OperationType.CREATE.equals(adminEvent.getOperationType())) { - RealmModel realm = this.model.getRealm(adminEvent.getRealmId()); - UserModel user = this.session.users().getUserById(realm, adminEvent.getResourcePath().substring(6)); - - sendUserData(user); - } - } - - private void sendUserData(UserModel user) { - final String userData = "{" + - quoteAttr("id", user.getId()) + ", " + - quoteAttr("username", user.getUsername()) + ", " + - quoteAttr("ldap_id", user.getFirstAttribute("LDAP_ID")) + ", " + - quoteAttr("given_name", user.getFirstName()) + ", " + - quoteAttr("family_name", user.getLastName()) + - "}"; - try { - log.debugf("create new user in API: %s", userData); - Client.postService(userData); - } catch (Exception e) { - log.errorf("Failed to call API: %s", e); - } - } - - private static String quoteAttr(String key, String value) { - if (value == null || value.isBlank() || value.isEmpty() || value.contentEquals(" ")) { - return "\"" + key + "\": null"; - } - return "\"" + key + "\": \"" + value + "\""; - } - - @Override - public void close() { - } - - private String toString(Event event) { - final StringJoiner joiner = new StringJoiner(", "); - joiner.add("type=" + event.getType()) - .add("realmId=" + event.getRealmId()) - .add("clientId=" + event.getClientId()) - .add("userId=" + event.getUserId()) - .add("ipAddress=" + event.getIpAddress()); - if (event.getError() != null) { - joiner.add("error=" + event.getError()); - } - if (event.getDetails() != null) { - event.getDetails().forEach((key, value) -> { - if (value == null || !value.contains(" ")) { - joiner.add(key + "=" + value); - } else { - joiner.add(key + "='" + value + "'"); - } - }); - } - return joiner.toString(); - } - - private String toString(AdminEvent event) { - RealmModel realm = this.model.getRealm(event.getRealmId()); - UserModel newRegisteredUser = this.session.users().getUserById(realm, event.getAuthDetails().getUserId()); - - StringJoiner joiner = new StringJoiner(", "); - - joiner.add("operationType=" + event.getOperationType()) - .add("realmId=" + event.getAuthDetails().getRealmId()) - .add("clientId=" + event.getAuthDetails().getClientId()) - .add("userId=" + event.getAuthDetails().getUserId()); - - if (newRegisteredUser != null) { - joiner.add("email=" + newRegisteredUser.getEmail()) - .add("username=" + newRegisteredUser.getUsername()) - .add("firstName=" + newRegisteredUser.getFirstName()) - .add("lastName=" + newRegisteredUser.getLastName()); - } - - joiner.add("ipAddress=" + event.getAuthDetails().getIpAddress()) - .add("resourcePath=" + event.getResourcePath()); - - if (event.getError() != null) { - joiner.add("error=" + event.getError()); - } - - return joiner.toString(); - } -} diff --git a/dbrepo-auth-service/listeners/src/main/resources/META-INF/services/org.keycloak.events.EventListenerProviderFactory b/dbrepo-auth-service/listeners/src/main/resources/META-INF/services/org.keycloak.events.EventListenerProviderFactory index df3c5521f0958fed5fadb4f006d8ee6eb50f97c2..da90b255da8add6f57dc05f662b8448353416ffd 100644 --- a/dbrepo-auth-service/listeners/src/main/resources/META-INF/services/org.keycloak.events.EventListenerProviderFactory +++ b/dbrepo-auth-service/listeners/src/main/resources/META-INF/services/org.keycloak.events.EventListenerProviderFactory @@ -1 +1 @@ -at.tuwien.CreateEventListenerProviderFactory \ No newline at end of file +at.ac.tuwien.ifs.dbrepo.CreateEventListenerProviderFactory \ No newline at end of file diff --git a/dbrepo-auth-service/listeners/src/test/java/at/tuwien/EventListenerIntegrationTest.java b/dbrepo-auth-service/listeners/src/test/java/at/ac/tuwien/ifs/dbrepo/EventListenerIntegrationTest.java similarity index 95% rename from dbrepo-auth-service/listeners/src/test/java/at/tuwien/EventListenerIntegrationTest.java rename to dbrepo-auth-service/listeners/src/test/java/at/ac/tuwien/ifs/dbrepo/EventListenerIntegrationTest.java index c3d6ee94ccd764d16d589b33b51d501e2a2a3d82..5374411b132942f277f7f9b4a738404f916c1f36 100644 --- a/dbrepo-auth-service/listeners/src/test/java/at/tuwien/EventListenerIntegrationTest.java +++ b/dbrepo-auth-service/listeners/src/test/java/at/ac/tuwien/ifs/dbrepo/EventListenerIntegrationTest.java @@ -1,4 +1,4 @@ -package at.tuwien; +package at.ac.tuwien.ifs.dbrepo; import dasniko.testcontainers.keycloak.KeycloakContainer; import org.testcontainers.images.PullPolicy; diff --git a/dbrepo-dashboard-service/Dockerfile b/dbrepo-dashboard-service/Dockerfile index 62caad802ff5e7a852e9d47bbd8d41c79bb2e261..62589ba867cf6f48a3d62df3c0759c7611f55738 100644 --- a/dbrepo-dashboard-service/Dockerfile +++ b/dbrepo-dashboard-service/Dockerfile @@ -18,6 +18,9 @@ RUN adduser -D dbrepo --uid 1001 WORKDIR /app +RUN mkdir -p /var/log/app/service/dashboard && \ + chown -R 1001:1001 /var/log/app + USER 1001 COPY --chown=1001 ./app.py ./app.py diff --git a/dbrepo-dashboard-service/Pipfile b/dbrepo-dashboard-service/Pipfile index 0d2ee8e849a7a12e9c76b6f6806d39e10d1133c5..86b90f9c5bbae8e349f1233537dff2627bb36377 100644 --- a/dbrepo-dashboard-service/Pipfile +++ b/dbrepo-dashboard-service/Pipfile @@ -12,7 +12,7 @@ prometheus-flask-exporter = "*" python-dotenv = "~=1.0" jwt = "~=1.3" pytest = "*" -dbrepo = {path = "./lib/dbrepo-1.8.1.tar.gz"} +dbrepo = {path = "./lib/dbrepo-1.9.0.tar.gz"} gunicorn = "*" pydantic = "*" flask_httpauth = "*" diff --git a/dbrepo-dashboard-service/Pipfile.lock b/dbrepo-dashboard-service/Pipfile.lock index 3daecb8b6ae4e4364ae8c17d13dbfc09eec4f178..689c44ed9672b26761d9c63ca691042f0c7b9c41 100644 --- a/dbrepo-dashboard-service/Pipfile.lock +++ b/dbrepo-dashboard-service/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "54007a87aa48b93e0343dc44fcf250d69f76e5ba03f283df6daa1db89bd1d03c" + "sha256": "0e291266f11c024d2367e2ba20e2afd15a7225424e04ef2bc4e9f9f5d36f18b6" }, "pipfile-spec": 6, "requires": { @@ -16,109 +16,6 @@ ] }, "default": { - "aiohappyeyeballs": { - "hashes": [ - "sha256:c3f9d0113123803ccadfdf3f0faa505bc78e6a72d1cc4806cbd719826e943558", - "sha256:f349ba8f4b75cb25c99c5c2d84e997e485204d2902a9597802b0371f09331fb8" - ], - "markers": "python_version >= '3.9'", - "version": "==2.6.1" - }, - "aiohttp": { - "hashes": [ - "sha256:004511d3413737700835e949433536a2fe95a7d0297edd911a1e9705c5b5ea43", - "sha256:0902e887b0e1d50424112f200eb9ae3dfed6c0d0a19fc60f633ae5a57c809656", - "sha256:09b00dd520d88eac9d1768439a59ab3d145065c91a8fab97f900d1b5f802895e", - "sha256:0a2f451849e6b39e5c226803dcacfa9c7133e9825dcefd2f4e837a2ec5a3bb98", - "sha256:0a950c2eb8ff17361abd8c85987fd6076d9f47d040ebffce67dce4993285e973", - "sha256:0ad1fb47da60ae1ddfb316f0ff16d1f3b8e844d1a1e154641928ea0583d486ed", - "sha256:13ceac2c5cdcc3f64b9015710221ddf81c900c5febc505dbd8f810e770011540", - "sha256:14461157d8426bcb40bd94deb0450a6fa16f05129f7da546090cebf8f3123b0f", - "sha256:16f8a2c9538c14a557b4d309ed4d0a7c60f0253e8ed7b6c9a2859a7582f8b1b8", - "sha256:17ae4664031aadfbcb34fd40ffd90976671fa0c0286e6c4113989f78bebab37a", - "sha256:1ce63ae04719513dd2651202352a2beb9f67f55cb8490c40f056cea3c5c355ce", - "sha256:23a15727fbfccab973343b6d1b7181bfb0b4aa7ae280f36fd2f90f5476805682", - "sha256:2540ddc83cc724b13d1838026f6a5ad178510953302a49e6d647f6e1de82bc34", - "sha256:37dcee4906454ae377be5937ab2a66a9a88377b11dd7c072df7a7c142b63c37c", - "sha256:38bea84ee4fe24ebcc8edeb7b54bf20f06fd53ce4d2cc8b74344c5b9620597fd", - "sha256:3ab3367bb7f61ad18793fea2ef71f2d181c528c87948638366bf1de26e239183", - "sha256:3ad1d59fd7114e6a08c4814983bb498f391c699f3c78712770077518cae63ff7", - "sha256:3b4e6db8dc4879015b9955778cfb9881897339c8fab7b3676f8433f849425913", - "sha256:3e061b09f6fa42997cf627307f220315e313ece74907d35776ec4373ed718b86", - "sha256:42864e70a248f5f6a49fdaf417d9bc62d6e4d8ee9695b24c5916cb4bb666c802", - "sha256:493910ceb2764f792db4dc6e8e4b375dae1b08f72e18e8f10f18b34ca17d0979", - "sha256:4d0c970c0d602b1017e2067ff3b7dac41c98fef4f7472ec2ea26fd8a4e8c2149", - "sha256:54eb3aead72a5c19fad07219acd882c1643a1027fbcdefac9b502c267242f955", - "sha256:56a3443aca82abda0e07be2e1ecb76a050714faf2be84256dae291182ba59049", - "sha256:576f5ca28d1b3276026f7df3ec841ae460e0fc3aac2a47cbf72eabcfc0f102e1", - "sha256:58ede86453a6cf2d6ce40ef0ca15481677a66950e73b0a788917916f7e35a0bb", - "sha256:61c721764e41af907c9d16b6daa05a458f066015abd35923051be8705108ed17", - "sha256:634d96869be6c4dc232fc503e03e40c42d32cfaa51712aee181e922e61d74814", - "sha256:696ef00e8a1f0cec5e30640e64eca75d8e777933d1438f4facc9c0cdf288a810", - "sha256:69a2cbd61788d26f8f1e626e188044834f37f6ae3f937bd9f08b65fc9d7e514e", - "sha256:6a792ce34b999fbe04a7a71a90c74f10c57ae4c51f65461a411faa70e154154e", - "sha256:6ac13b71761e49d5f9e4d05d33683bbafef753e876e8e5a7ef26e937dd766713", - "sha256:6fdec0213244c39973674ca2a7f5435bf74369e7d4e104d6c7473c81c9bcc8c4", - "sha256:72b1b03fb4655c1960403c131740755ec19c5898c82abd3961c364c2afd59fe7", - "sha256:745f1ed5e2c687baefc3c5e7b4304e91bf3e2f32834d07baaee243e349624b24", - "sha256:776c8e959a01e5e8321f1dec77964cb6101020a69d5a94cd3d34db6d555e01f7", - "sha256:780df0d837276276226a1ff803f8d0fa5f8996c479aeef52eb040179f3156cbd", - "sha256:78e6e23b954644737e385befa0deb20233e2dfddf95dd11e9db752bdd2a294d3", - "sha256:7951decace76a9271a1ef181b04aa77d3cc309a02a51d73826039003210bdc86", - "sha256:7ba92a2d9ace559a0a14b03d87f47e021e4fa7681dc6970ebbc7b447c7d4b7cd", - "sha256:7f6428fee52d2bcf96a8aa7b62095b190ee341ab0e6b1bcf50c615d7966fd45b", - "sha256:87944bd16b7fe6160607f6a17808abd25f17f61ae1e26c47a491b970fb66d8cb", - "sha256:87a6e922b2b2401e0b0cf6b976b97f11ec7f136bfed445e16384fbf6fd5e8602", - "sha256:8cb0688a8d81c63d716e867d59a9ccc389e97ac7037ebef904c2b89334407180", - "sha256:8df6612df74409080575dca38a5237282865408016e65636a76a2eb9348c2567", - "sha256:911a6e91d08bb2c72938bc17f0a2d97864c531536b7832abee6429d5296e5b27", - "sha256:92b7ee222e2b903e0a4b329a9943d432b3767f2d5029dbe4ca59fb75223bbe2e", - "sha256:938f756c2b9374bbcc262a37eea521d8a0e6458162f2a9c26329cc87fdf06534", - "sha256:9756d9b9d4547e091f99d554fbba0d2a920aab98caa82a8fb3d3d9bee3c9ae85", - "sha256:98b88a2bf26965f2015a771381624dd4b0839034b70d406dc74fd8be4cc053e3", - "sha256:9b751a6306f330801665ae69270a8a3993654a85569b3469662efaad6cf5cc50", - "sha256:a2a450bcce4931b295fc0848f384834c3f9b00edfc2150baafb4488c27953de6", - "sha256:a3814760a1a700f3cfd2f977249f1032301d0a12c92aba74605cfa6ce9f78489", - "sha256:a5abcbba9f4b463a45c8ca8b7720891200658f6f46894f79517e6cd11f3405ca", - "sha256:a6db7458ab89c7d80bc1f4e930cc9df6edee2200127cfa6f6e080cf619eddfbd", - "sha256:ad497f38a0d6c329cb621774788583ee12321863cd4bd9feee1effd60f2ad133", - "sha256:ad9509ffb2396483ceacb1eee9134724443ee45b92141105a4645857244aecc8", - "sha256:bbcba75fe879ad6fd2e0d6a8d937f34a571f116a0e4db37df8079e738ea95c71", - "sha256:c10d85e81d0b9ef87970ecbdbfaeec14a361a7fa947118817fcea8e45335fa46", - "sha256:c15b2271c44da77ee9d822552201180779e5e942f3a71fb74e026bf6172ff287", - "sha256:ca37057625693d097543bd88076ceebeb248291df9d6ca8481349efc0b05dcd0", - "sha256:cc3a145479a76ad0ed646434d09216d33d08eef0d8c9a11f5ae5cdc37caa3540", - "sha256:ccf10f16ab498d20e28bc2b5c1306e9c1512f2840f7b6a67000a517a4b37d5ee", - "sha256:cd464ba806e27ee24a91362ba3621bfc39dbbb8b79f2e1340201615197370f7c", - "sha256:d007aa39a52d62373bd23428ba4a2546eed0e7643d7bf2e41ddcefd54519842c", - "sha256:d0666afbe984f6933fe72cd1f1c3560d8c55880a0bdd728ad774006eb4241ecd", - "sha256:d07502cc14ecd64f52b2a74ebbc106893d9a9717120057ea9ea1fd6568a747e7", - "sha256:d489d9778522fbd0f8d6a5c6e48e3514f11be81cb0a5954bdda06f7e1594b321", - "sha256:df7db76400bf46ec6a0a73192b14c8295bdb9812053f4fe53f4e789f3ea66bbb", - "sha256:e3538bc9fe1b902bef51372462e3d7c96fce2b566642512138a480b7adc9d508", - "sha256:e87fd812899aa78252866ae03a048e77bd11b80fb4878ce27c23cade239b42b2", - "sha256:ecdb8173e6c7aa09eee342ac62e193e6904923bd232e76b4157ac0bfa670609f", - "sha256:f244b8e541f414664889e2c87cac11a07b918cb4b540c36f7ada7bfa76571ea2", - "sha256:f4065145bf69de124accdd17ea5f4dc770da0a6a6e440c53f6e0a8c27b3e635c", - "sha256:f420bfe862fb357a6d76f2065447ef6f484bc489292ac91e29bc65d2d7a2c84d", - "sha256:f6ddd90d9fb4b501c97a4458f1c1720e42432c26cb76d28177c5b5ad4e332601", - "sha256:fa73e8c2656a3653ae6c307b3f4e878a21f87859a9afab228280ddccd7369d71", - "sha256:fadbb8f1d4140825069db3fedbbb843290fd5f5bc0a5dbd7eaf81d91bf1b003b", - "sha256:fb3d0cc5cdb926090748ea60172fa8a213cec728bd6c54eae18b96040fcd6227", - "sha256:fb46bb0f24813e6cede6cc07b1961d4b04f331f7112a23b5e21f567da4ee50aa", - "sha256:fd36c119c5d6551bce374fcb5c19269638f8d09862445f85a5a48596fd59f4bb" - ], - "markers": "python_version >= '3.9'", - "version": "==3.11.16" - }, - "aiosignal": { - "hashes": [ - "sha256:45cde58e409a301715980c2b01d0c28bdde3770d8290b5eb2173759d9acb31a5", - "sha256:a8c255c66fafb1e499c9351d0bf32ff2d8a0321595ebac3b93713656d2436f54" - ], - "markers": "python_version >= '3.9'", - "version": "==1.3.2" - }, "annotated-types": { "hashes": [ "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53", @@ -145,11 +42,11 @@ }, "certifi": { "hashes": [ - "sha256:3d5da6925056f6f18f119200434a4780a94263f10d1c21d032a6f6b2baa20651", - "sha256:ca78db4565a652026a4db2bcdf68f2fb589ea80d0be70e03929ed730746b84fe" + "sha256:0a816057ea3cdefcef70270d2c515e4506bbc954f417fa5ade2021213bb8f0c6", + "sha256:30350364dfe371162649852c63336a15c70c6510c2ad5015b21c2345311805f3" ], "markers": "python_version >= '3.6'", - "version": "==2025.1.31" + "version": "==2025.4.26" }, "cffi": { "hashes": [ @@ -226,157 +123,160 @@ }, "charset-normalizer": { "hashes": [ - "sha256:0167ddc8ab6508fe81860a57dd472b2ef4060e8d378f0cc555707126830f2537", - "sha256:01732659ba9b5b873fc117534143e4feefecf3b2078b0a6a2e925271bb6f4cfa", - "sha256:01ad647cdd609225c5350561d084b42ddf732f4eeefe6e678765636791e78b9a", - "sha256:04432ad9479fa40ec0f387795ddad4437a2b50417c69fa275e212933519ff294", - "sha256:0907f11d019260cdc3f94fbdb23ff9125f6b5d1039b76003b5b0ac9d6a6c9d5b", - "sha256:0924e81d3d5e70f8126529951dac65c1010cdf117bb75eb02dd12339b57749dd", - "sha256:09b26ae6b1abf0d27570633b2b078a2a20419c99d66fb2823173d73f188ce601", - "sha256:09b5e6733cbd160dcc09589227187e242a30a49ca5cefa5a7edd3f9d19ed53fd", - "sha256:0af291f4fe114be0280cdd29d533696a77b5b49cfde5467176ecab32353395c4", - "sha256:0f55e69f030f7163dffe9fd0752b32f070566451afe180f99dbeeb81f511ad8d", - "sha256:1a2bc9f351a75ef49d664206d51f8e5ede9da246602dc2d2726837620ea034b2", - "sha256:22e14b5d70560b8dd51ec22863f370d1e595ac3d024cb8ad7d308b4cd95f8313", - "sha256:234ac59ea147c59ee4da87a0c0f098e9c8d169f4dc2a159ef720f1a61bbe27cd", - "sha256:2369eea1ee4a7610a860d88f268eb39b95cb588acd7235e02fd5a5601773d4fa", - "sha256:237bdbe6159cff53b4f24f397d43c6336c6b0b42affbe857970cefbb620911c8", - "sha256:28bf57629c75e810b6ae989f03c0828d64d6b26a5e205535585f96093e405ed1", - "sha256:2967f74ad52c3b98de4c3b32e1a44e32975e008a9cd2a8cc8966d6a5218c5cb2", - "sha256:2a75d49014d118e4198bcee5ee0a6f25856b29b12dbf7cd012791f8a6cc5c496", - "sha256:2bdfe3ac2e1bbe5b59a1a63721eb3b95fc9b6817ae4a46debbb4e11f6232428d", - "sha256:2d074908e1aecee37a7635990b2c6d504cd4766c7bc9fc86d63f9c09af3fa11b", - "sha256:2fb9bd477fdea8684f78791a6de97a953c51831ee2981f8e4f583ff3b9d9687e", - "sha256:311f30128d7d333eebd7896965bfcfbd0065f1716ec92bd5638d7748eb6f936a", - "sha256:329ce159e82018d646c7ac45b01a430369d526569ec08516081727a20e9e4af4", - "sha256:345b0426edd4e18138d6528aed636de7a9ed169b4aaf9d61a8c19e39d26838ca", - "sha256:363e2f92b0f0174b2f8238240a1a30142e3db7b957a5dd5689b0e75fb717cc78", - "sha256:3a3bd0dcd373514dcec91c411ddb9632c0d7d92aed7093b8c3bbb6d69ca74408", - "sha256:3bed14e9c89dcb10e8f3a29f9ccac4955aebe93c71ae803af79265c9ca5644c5", - "sha256:44251f18cd68a75b56585dd00dae26183e102cd5e0f9f1466e6df5da2ed64ea3", - "sha256:44ecbf16649486d4aebafeaa7ec4c9fed8b88101f4dd612dcaf65d5e815f837f", - "sha256:4532bff1b8421fd0a320463030c7520f56a79c9024a4e88f01c537316019005a", - "sha256:49402233c892a461407c512a19435d1ce275543138294f7ef013f0b63d5d3765", - "sha256:4c0907b1928a36d5a998d72d64d8eaa7244989f7aaaf947500d3a800c83a3fd6", - "sha256:4d86f7aff21ee58f26dcf5ae81a9addbd914115cdebcbb2217e4f0ed8982e146", - "sha256:5777ee0881f9499ed0f71cc82cf873d9a0ca8af166dfa0af8ec4e675b7df48e6", - "sha256:5df196eb874dae23dcfb968c83d4f8fdccb333330fe1fc278ac5ceeb101003a9", - "sha256:619a609aa74ae43d90ed2e89bdd784765de0a25ca761b93e196d938b8fd1dbbd", - "sha256:6e27f48bcd0957c6d4cb9d6fa6b61d192d0b13d5ef563e5f2ae35feafc0d179c", - "sha256:6ff8a4a60c227ad87030d76e99cd1698345d4491638dfa6673027c48b3cd395f", - "sha256:73d94b58ec7fecbc7366247d3b0b10a21681004153238750bb67bd9012414545", - "sha256:7461baadb4dc00fd9e0acbe254e3d7d2112e7f92ced2adc96e54ef6501c5f176", - "sha256:75832c08354f595c760a804588b9357d34ec00ba1c940c15e31e96d902093770", - "sha256:7709f51f5f7c853f0fb938bcd3bc59cdfdc5203635ffd18bf354f6967ea0f824", - "sha256:78baa6d91634dfb69ec52a463534bc0df05dbd546209b79a3880a34487f4b84f", - "sha256:7974a0b5ecd505609e3b19742b60cee7aa2aa2fb3151bc917e6e2646d7667dcf", - "sha256:7a4f97a081603d2050bfaffdefa5b02a9ec823f8348a572e39032caa8404a487", - "sha256:7b1bef6280950ee6c177b326508f86cad7ad4dff12454483b51d8b7d673a2c5d", - "sha256:7d053096f67cd1241601111b698f5cad775f97ab25d81567d3f59219b5f1adbd", - "sha256:804a4d582ba6e5b747c625bf1255e6b1507465494a40a2130978bda7b932c90b", - "sha256:807f52c1f798eef6cf26beb819eeb8819b1622ddfeef9d0977a8502d4db6d534", - "sha256:80ed5e856eb7f30115aaf94e4a08114ccc8813e6ed1b5efa74f9f82e8509858f", - "sha256:8417cb1f36cc0bc7eaba8ccb0e04d55f0ee52df06df3ad55259b9a323555fc8b", - "sha256:8436c508b408b82d87dc5f62496973a1805cd46727c34440b0d29d8a2f50a6c9", - "sha256:89149166622f4db9b4b6a449256291dc87a99ee53151c74cbd82a53c8c2f6ccd", - "sha256:8bfa33f4f2672964266e940dd22a195989ba31669bd84629f05fab3ef4e2d125", - "sha256:8c60ca7339acd497a55b0ea5d506b2a2612afb2826560416f6894e8b5770d4a9", - "sha256:91b36a978b5ae0ee86c394f5a54d6ef44db1de0815eb43de826d41d21e4af3de", - "sha256:955f8851919303c92343d2f66165294848d57e9bba6cf6e3625485a70a038d11", - "sha256:97f68b8d6831127e4787ad15e6757232e14e12060bec17091b85eb1486b91d8d", - "sha256:9b23ca7ef998bc739bf6ffc077c2116917eabcc901f88da1b9856b210ef63f35", - "sha256:9f0b8b1c6d84c8034a44893aba5e767bf9c7a211e313a9605d9c617d7083829f", - "sha256:aabfa34badd18f1da5ec1bc2715cadc8dca465868a4e73a0173466b688f29dda", - "sha256:ab36c8eb7e454e34e60eb55ca5d241a5d18b2c6244f6827a30e451c42410b5f7", - "sha256:b010a7a4fd316c3c484d482922d13044979e78d1861f0e0650423144c616a46a", - "sha256:b1ac5992a838106edb89654e0aebfc24f5848ae2547d22c2c3f66454daa11971", - "sha256:b7b2d86dd06bfc2ade3312a83a5c364c7ec2e3498f8734282c6c3d4b07b346b8", - "sha256:b97e690a2118911e39b4042088092771b4ae3fc3aa86518f84b8cf6888dbdb41", - "sha256:bc2722592d8998c870fa4e290c2eec2c1569b87fe58618e67d38b4665dfa680d", - "sha256:c0429126cf75e16c4f0ad00ee0eae4242dc652290f940152ca8c75c3a4b6ee8f", - "sha256:c30197aa96e8eed02200a83fba2657b4c3acd0f0aa4bdc9f6c1af8e8962e0757", - "sha256:c4c3e6da02df6fa1410a7680bd3f63d4f710232d3139089536310d027950696a", - "sha256:c75cb2a3e389853835e84a2d8fb2b81a10645b503eca9bcb98df6b5a43eb8886", - "sha256:c96836c97b1238e9c9e3fe90844c947d5afbf4f4c92762679acfe19927d81d77", - "sha256:d7f50a1f8c450f3925cb367d011448c39239bb3eb4117c36a6d354794de4ce76", - "sha256:d973f03c0cb71c5ed99037b870f2be986c3c05e63622c017ea9816881d2dd247", - "sha256:d98b1668f06378c6dbefec3b92299716b931cd4e6061f3c875a71ced1780ab85", - "sha256:d9c3cdf5390dcd29aa8056d13e8e99526cda0305acc038b96b30352aff5ff2bb", - "sha256:dad3e487649f498dd991eeb901125411559b22e8d7ab25d3aeb1af367df5efd7", - "sha256:dccbe65bd2f7f7ec22c4ff99ed56faa1e9f785482b9bbd7c717e26fd723a1d1e", - "sha256:dd78cfcda14a1ef52584dbb008f7ac81c1328c0f58184bf9a84c49c605002da6", - "sha256:e218488cd232553829be0664c2292d3af2eeeb94b32bea483cf79ac6a694e037", - "sha256:e358e64305fe12299a08e08978f51fc21fac060dcfcddd95453eabe5b93ed0e1", - "sha256:ea0d8d539afa5eb2728aa1932a988a9a7af94f18582ffae4bc10b3fbdad0626e", - "sha256:eab677309cdb30d047996b36d34caeda1dc91149e4fdca0b1a039b3f79d9a807", - "sha256:eb8178fe3dba6450a3e024e95ac49ed3400e506fd4e9e5c32d30adda88cbd407", - "sha256:ecddf25bee22fe4fe3737a399d0d177d72bc22be6913acfab364b40bce1ba83c", - "sha256:eea6ee1db730b3483adf394ea72f808b6e18cf3cb6454b4d86e04fa8c4327a12", - "sha256:f08ff5e948271dc7e18a35641d2f11a4cd8dfd5634f55228b691e62b37125eb3", - "sha256:f30bf9fd9be89ecb2360c7d94a711f00c09b976258846efe40db3d05828e8089", - "sha256:fa88b843d6e211393a37219e6a1c1df99d35e8fd90446f1118f4216e307e48cd", - "sha256:fc54db6c8593ef7d4b2a331b58653356cf04f67c960f584edb7c3d8c97e8f39e", - "sha256:fd4ec41f914fa74ad1b8304bbc634b3de73d2a0889bd32076342a573e0779e00", - "sha256:ffc9202a29ab3920fa812879e95a9e78b2465fd10be7fcbd042899695d75e616" + "sha256:005fa3432484527f9732ebd315da8da8001593e2cf46a3d817669f062c3d9ed4", + "sha256:046595208aae0120559a67693ecc65dd75d46f7bf687f159127046628178dc45", + "sha256:0c29de6a1a95f24b9a1aa7aefd27d2487263f00dfd55a77719b530788f75cff7", + "sha256:0c8c57f84ccfc871a48a47321cfa49ae1df56cd1d965a09abe84066f6853b9c0", + "sha256:0f5d9ed7f254402c9e7d35d2f5972c9bbea9040e99cd2861bd77dc68263277c7", + "sha256:18dd2e350387c87dabe711b86f83c9c78af772c748904d372ade190b5c7c9d4d", + "sha256:1b1bde144d98e446b056ef98e59c256e9294f6b74d7af6846bf5ffdafd687a7d", + "sha256:1c95a1e2902a8b722868587c0e1184ad5c55631de5afc0eb96bc4b0d738092c0", + "sha256:1cad5f45b3146325bb38d6855642f6fd609c3f7cad4dbaf75549bf3b904d3184", + "sha256:21b2899062867b0e1fde9b724f8aecb1af14f2778d69aacd1a5a1853a597a5db", + "sha256:24498ba8ed6c2e0b56d4acbf83f2d989720a93b41d712ebd4f4979660db4417b", + "sha256:25a23ea5c7edc53e0f29bae2c44fcb5a1aa10591aae107f2a2b2583a9c5cbc64", + "sha256:289200a18fa698949d2b39c671c2cc7a24d44096784e76614899a7ccf2574b7b", + "sha256:28a1005facc94196e1fb3e82a3d442a9d9110b8434fc1ded7a24a2983c9888d8", + "sha256:32fc0341d72e0f73f80acb0a2c94216bd704f4f0bce10aedea38f30502b271ff", + "sha256:36b31da18b8890a76ec181c3cf44326bf2c48e36d393ca1b72b3f484113ea344", + "sha256:3c21d4fca343c805a52c0c78edc01e3477f6dd1ad7c47653241cf2a206d4fc58", + "sha256:3fddb7e2c84ac87ac3a947cb4e66d143ca5863ef48e4a5ecb83bd48619e4634e", + "sha256:43e0933a0eff183ee85833f341ec567c0980dae57c464d8a508e1b2ceb336471", + "sha256:4a476b06fbcf359ad25d34a057b7219281286ae2477cc5ff5e3f70a246971148", + "sha256:4e594135de17ab3866138f496755f302b72157d115086d100c3f19370839dd3a", + "sha256:50bf98d5e563b83cc29471fa114366e6806bc06bc7a25fd59641e41445327836", + "sha256:5a9979887252a82fefd3d3ed2a8e3b937a7a809f65dcb1e068b090e165bbe99e", + "sha256:5baececa9ecba31eff645232d59845c07aa030f0c81ee70184a90d35099a0e63", + "sha256:5bf4545e3b962767e5c06fe1738f951f77d27967cb2caa64c28be7c4563e162c", + "sha256:6333b3aa5a12c26b2a4d4e7335a28f1475e0e5e17d69d55141ee3cab736f66d1", + "sha256:65c981bdbd3f57670af8b59777cbfae75364b483fa8a9f420f08094531d54a01", + "sha256:68a328e5f55ec37c57f19ebb1fdc56a248db2e3e9ad769919a58672958e8f366", + "sha256:6a0289e4589e8bdfef02a80478f1dfcb14f0ab696b5a00e1f4b8a14a307a3c58", + "sha256:6b66f92b17849b85cad91259efc341dce9c1af48e2173bf38a85c6329f1033e5", + "sha256:6c9379d65defcab82d07b2a9dfbfc2e95bc8fe0ebb1b176a3190230a3ef0e07c", + "sha256:6fc1f5b51fa4cecaa18f2bd7a003f3dd039dd615cd69a2afd6d3b19aed6775f2", + "sha256:70f7172939fdf8790425ba31915bfbe8335030f05b9913d7ae00a87d4395620a", + "sha256:721c76e84fe669be19c5791da68232ca2e05ba5185575086e384352e2c309597", + "sha256:7222ffd5e4de8e57e03ce2cef95a4c43c98fcb72ad86909abdfc2c17d227fc1b", + "sha256:75d10d37a47afee94919c4fab4c22b9bc2a8bf7d4f46f87363bcf0573f3ff4f5", + "sha256:76af085e67e56c8816c3ccf256ebd136def2ed9654525348cfa744b6802b69eb", + "sha256:770cab594ecf99ae64c236bc9ee3439c3f46be49796e265ce0cc8bc17b10294f", + "sha256:7a6ab32f7210554a96cd9e33abe3ddd86732beeafc7a28e9955cdf22ffadbab0", + "sha256:7c48ed483eb946e6c04ccbe02c6b4d1d48e51944b6db70f697e089c193404941", + "sha256:7f56930ab0abd1c45cd15be65cc741c28b1c9a34876ce8c17a2fa107810c0af0", + "sha256:8075c35cd58273fee266c58c0c9b670947c19df5fb98e7b66710e04ad4e9ff86", + "sha256:8272b73e1c5603666618805fe821edba66892e2870058c94c53147602eab29c7", + "sha256:82d8fd25b7f4675d0c47cf95b594d4e7b158aca33b76aa63d07186e13c0e0ab7", + "sha256:844da2b5728b5ce0e32d863af26f32b5ce61bc4273a9c720a9f3aa9df73b1455", + "sha256:8755483f3c00d6c9a77f490c17e6ab0c8729e39e6390328e42521ef175380ae6", + "sha256:915f3849a011c1f593ab99092f3cecfcb4d65d8feb4a64cf1bf2d22074dc0ec4", + "sha256:926ca93accd5d36ccdabd803392ddc3e03e6d4cd1cf17deff3b989ab8e9dbcf0", + "sha256:982bb1e8b4ffda883b3d0a521e23abcd6fd17418f6d2c4118d257a10199c0ce3", + "sha256:98f862da73774290f251b9df8d11161b6cf25b599a66baf087c1ffe340e9bfd1", + "sha256:9cbfacf36cb0ec2897ce0ebc5d08ca44213af24265bd56eca54bee7923c48fd6", + "sha256:a370b3e078e418187da8c3674eddb9d983ec09445c99a3a263c2011993522981", + "sha256:a955b438e62efdf7e0b7b52a64dc5c3396e2634baa62471768a64bc2adb73d5c", + "sha256:aa6af9e7d59f9c12b33ae4e9450619cf2488e2bbe9b44030905877f0b2324980", + "sha256:aa88ca0b1932e93f2d961bf3addbb2db902198dca337d88c89e1559e066e7645", + "sha256:aaeeb6a479c7667fbe1099af9617c83aaca22182d6cf8c53966491a0f1b7ffb7", + "sha256:aaf27faa992bfee0264dc1f03f4c75e9fcdda66a519db6b957a3f826e285cf12", + "sha256:b2680962a4848b3c4f155dc2ee64505a9c57186d0d56b43123b17ca3de18f0fa", + "sha256:b2d318c11350e10662026ad0eb71bb51c7812fc8590825304ae0bdd4ac283acd", + "sha256:b33de11b92e9f75a2b545d6e9b6f37e398d86c3e9e9653c4864eb7e89c5773ef", + "sha256:b3daeac64d5b371dea99714f08ffc2c208522ec6b06fbc7866a450dd446f5c0f", + "sha256:be1e352acbe3c78727a16a455126d9ff83ea2dfdcbc83148d2982305a04714c2", + "sha256:bee093bf902e1d8fc0ac143c88902c3dfc8941f7ea1d6a8dd2bcb786d33db03d", + "sha256:c72fbbe68c6f32f251bdc08b8611c7b3060612236e960ef848e0a517ddbe76c5", + "sha256:c9e36a97bee9b86ef9a1cf7bb96747eb7a15c2f22bdb5b516434b00f2a599f02", + "sha256:cddf7bd982eaa998934a91f69d182aec997c6c468898efe6679af88283b498d3", + "sha256:cf713fe9a71ef6fd5adf7a79670135081cd4431c2943864757f0fa3a65b1fafd", + "sha256:d11b54acf878eef558599658b0ffca78138c8c3655cf4f3a4a673c437e67732e", + "sha256:d41c4d287cfc69060fa91cae9683eacffad989f1a10811995fa309df656ec214", + "sha256:d524ba3f1581b35c03cb42beebab4a13e6cdad7b36246bd22541fa585a56cccd", + "sha256:daac4765328a919a805fa5e2720f3e94767abd632ae410a9062dff5412bae65a", + "sha256:db4c7bf0e07fc3b7d89ac2a5880a6a8062056801b83ff56d8464b70f65482b6c", + "sha256:dc7039885fa1baf9be153a0626e337aa7ec8bf96b0128605fb0d77788ddc1681", + "sha256:dccab8d5fa1ef9bfba0590ecf4d46df048d18ffe3eec01eeb73a42e0d9e7a8ba", + "sha256:dedb8adb91d11846ee08bec4c8236c8549ac721c245678282dcb06b221aab59f", + "sha256:e45ba65510e2647721e35323d6ef54c7974959f6081b58d4ef5d87c60c84919a", + "sha256:e53efc7c7cee4c1e70661e2e112ca46a575f90ed9ae3fef200f2a25e954f4b28", + "sha256:e635b87f01ebc977342e2697d05b56632f5f879a4f15955dfe8cef2448b51691", + "sha256:e70e990b2137b29dc5564715de1e12701815dacc1d056308e2b17e9095372a82", + "sha256:e8082b26888e2f8b36a042a58307d5b917ef2b1cacab921ad3323ef91901c71a", + "sha256:e8323a9b031aa0393768b87f04b4164a40037fb2a3c11ac06a03ffecd3618027", + "sha256:e92fca20c46e9f5e1bb485887d074918b13543b1c2a1185e69bb8d17ab6236a7", + "sha256:eb30abc20df9ab0814b5a2524f23d75dcf83cde762c161917a2b4b7b55b1e518", + "sha256:eba9904b0f38a143592d9fc0e19e2df0fa2e41c3c3745554761c5f6447eedabf", + "sha256:ef8de666d6179b009dce7bcb2ad4c4a779f113f12caf8dc77f0162c29d20490b", + "sha256:efd387a49825780ff861998cd959767800d54f8308936b21025326de4b5a42b9", + "sha256:f0aa37f3c979cf2546b73e8222bbfa3dc07a641585340179d768068e3455e544", + "sha256:f4074c5a429281bf056ddd4c5d3b740ebca4d43ffffe2ef4bf4d2d05114299da", + "sha256:f69a27e45c43520f5487f27627059b64aaf160415589230992cec34c5e18a509", + "sha256:fb707f3e15060adf5b7ada797624a6c6e0138e2a26baa089df64c68ee98e040f", + "sha256:fcbe676a55d7445b22c10967bceaaf0ee69407fbe0ece4d032b6eb8d4565982a", + "sha256:fdb20a30fe1175ecabed17cbf7812f7b804b8a315a25f24678bcdf120a90077f" ], "markers": "python_version >= '3.7'", - "version": "==3.4.1" + "version": "==3.4.2" }, "click": { "hashes": [ - "sha256:63c132bbbed01578a06712a2d1f497bb62d9c1c0d329b7903a866228027263b2", - "sha256:ed53c9d8990d83c2a27deae68e4ee337473f6330c040a31d4225c9574d16096a" + "sha256:6b303f0b2aa85f1cb4e5303078fadcbcd4e476f114fab9b5007005711839325c", + "sha256:f5452aeddd9988eefa20f90f05ab66f17fce1ee2a36907fd30b05bbb5953814d" ], - "markers": "python_version >= '3.7'", - "version": "==8.1.8" + "markers": "python_version >= '3.10'", + "version": "==8.2.0" }, "cryptography": { "hashes": [ - "sha256:04abd71114848aa25edb28e225ab5f268096f44cf0127f3d36975bdf1bdf3390", - "sha256:0529b1d5a0105dd3731fa65680b45ce49da4d8115ea76e9da77a875396727b41", - "sha256:1bc312dfb7a6e5d66082c87c34c8a62176e684b6fe3d90fcfe1568de675e6688", - "sha256:268e4e9b177c76d569e8a145a6939eca9a5fec658c932348598818acf31ae9a5", - "sha256:29ecec49f3ba3f3849362854b7253a9f59799e3763b0c9d0826259a88efa02f1", - "sha256:2bf7bf75f7df9715f810d1b038870309342bff3069c5bd8c6b96128cb158668d", - "sha256:3b721b8b4d948b218c88cb8c45a01793483821e709afe5f622861fc6182b20a7", - "sha256:3c00b6b757b32ce0f62c574b78b939afab9eecaf597c4d624caca4f9e71e7843", - "sha256:3dc62975e31617badc19a906481deacdeb80b4bb454394b4098e3f2525a488c5", - "sha256:4973da6ca3db4405c54cd0b26d328be54c7747e89e284fcff166132eb7bccc9c", - "sha256:4e389622b6927d8133f314949a9812972711a111d577a5d1f4bee5e58736b80a", - "sha256:51e4de3af4ec3899d6d178a8c005226491c27c4ba84101bfb59c901e10ca9f79", - "sha256:5f6f90b72d8ccadb9c6e311c775c8305381db88374c65fa1a68250aa8a9cb3a6", - "sha256:6210c05941994290f3f7f175a4a57dbbb2afd9273657614c506d5976db061181", - "sha256:6f101b1f780f7fc613d040ca4bdf835c6ef3b00e9bd7125a4255ec574c7916e4", - "sha256:7bdcd82189759aba3816d1f729ce42ffded1ac304c151d0a8e89b9996ab863d5", - "sha256:7ca25849404be2f8e4b3c59483d9d3c51298a22c1c61a0e84415104dacaf5562", - "sha256:81276f0ea79a208d961c433a947029e1a15948966658cf6710bbabb60fcc2639", - "sha256:8cadc6e3b5a1f144a039ea08a0bdb03a2a92e19c46be3285123d32029f40a922", - "sha256:8e0ddd63e6bf1161800592c71ac794d3fb8001f2caebe0966e77c5234fa9efc3", - "sha256:909c97ab43a9c0c0b0ada7a1281430e4e5ec0458e6d9244c0e821bbf152f061d", - "sha256:96e7a5e9d6e71f9f4fca8eebfd603f8e86c5225bb18eb621b2c1e50b290a9471", - "sha256:9a1e657c0f4ea2a23304ee3f964db058c9e9e635cc7019c4aa21c330755ef6fd", - "sha256:9eb9d22b0a5d8fd9925a7764a054dca914000607dff201a24c791ff5c799e1fa", - "sha256:af4ff3e388f2fa7bff9f7f2b31b87d5651c45731d3e8cfa0944be43dff5cfbdb", - "sha256:b042d2a275c8cee83a4b7ae30c45a15e6a4baa65a179a0ec2d78ebb90e4f6699", - "sha256:bc821e161ae88bfe8088d11bb39caf2916562e0a2dc7b6d56714a48b784ef0bb", - "sha256:c505d61b6176aaf982c5717ce04e87da5abc9a36a5b39ac03905c4aafe8de7aa", - "sha256:c63454aa261a0cf0c5b4718349629793e9e634993538db841165b3df74f37ec0", - "sha256:c7362add18b416b69d58c910caa217f980c5ef39b23a38a0880dfd87bdf8cd23", - "sha256:d03806036b4f89e3b13b6218fefea8d5312e450935b1a2d55f0524e2ed7c59d9", - "sha256:d1b3031093a366ac767b3feb8bcddb596671b3aaff82d4050f984da0c248b615", - "sha256:d1c3572526997b36f245a96a2b1713bf79ce99b271bbcf084beb6b9b075f29ea", - "sha256:efcfe97d1b3c79e486554efddeb8f6f53a4cdd4cf6086642784fa31fc384e1d7", - "sha256:f514ef4cd14bb6fb484b4a60203e912cfcb64f2ab139e88c2274511514bf7308" + "sha256:057723b79752a142efbc609e90b0dff27b0361ccbee3bd48312d70f5cdf53b78", + "sha256:05c2385b1f5c89a17df19900cfb1345115a77168f5ed44bdf6fd3de1ce5cc65b", + "sha256:08281de408e7eb71ba3cd5098709a356bfdf65eebd7ee7633c3610f0aa80d79b", + "sha256:10d68763892a7b19c22508ab57799c4423c7c8cd61d7eee4c5a6a55a46511949", + "sha256:1655d3a76e3dedb683c982a6c3a2cbfae2d08f47a48ec5a3d58db52b3d29ea6f", + "sha256:18f8084b7ca3ce1b8d38bdfe33c48116edf9a08b4d056ef4a96dceaa36d8d965", + "sha256:2cb03a944a1a412724d15a7c051d50e63a868031f26b6a312f2016965b661942", + "sha256:4142e20c29224cec63e9e32eb1e6014fb285fe39b7be66b3564ca978a3a8afe9", + "sha256:463096533acd5097f8751115bc600b0b64620c4aafcac10c6d0041e6e68f88fe", + "sha256:48caa55c528617fa6db1a9c3bf2e37ccb31b73e098ac2b71408d1f2db551dde4", + "sha256:49af56491473231159c98c2c26f1a8f3799a60e5cf0e872d00745b858ddac9d2", + "sha256:4cc31c66411e14dd70e2f384a9204a859dc25b05e1f303df0f5326691061b839", + "sha256:501de1296b2041dccf2115e3c7d4947430585601b251b140970ce255c5cfb985", + "sha256:59c0c8f043dd376bbd9d4f636223836aed50431af4c5a467ed9bf61520294627", + "sha256:614bca7c6ed0d8ad1dce683a6289afae1f880675b4090878a0136c3da16bc693", + "sha256:61a8b1bbddd9332917485b2453d1de49f142e6334ce1d97b7916d5a85d179c84", + "sha256:7429936146063bd1b2cfc54f0e04016b90ee9b1c908a7bed0800049cbace70eb", + "sha256:7c73968fbb7698a4c5d6160859db560d3aac160edde89c751edd5a8bc6560c88", + "sha256:80303ee6a02ef38c4253160446cbeb5c400c07e01d4ddbd4ff722a89b736d95a", + "sha256:965611880c3fa8e504b7458484c0697e00ae6e937279cd6734fdaa2bc954dc49", + "sha256:9a900036b42f7324df7c7ad9569eb92ba0b613cf699160dd9c2154b24fd02f8e", + "sha256:9cfd1399064b13043082c660ddd97a0358e41c8b0dc7b77c1243e013d305c344", + "sha256:a8ec324711596fbf21837d3a5db543937dd84597d364769b46e0102250023f77", + "sha256:a9727a21957d3327cf6b7eb5ffc9e4b663909a25fea158e3fcbc49d4cdd7881b", + "sha256:b19f4b28dd2ef2e6d600307fee656c00825a2980c4356a7080bd758d633c3a6f", + "sha256:b2de529027579e43b6dc1f805f467b102fb7d13c1e54c334f1403ee2b37d0059", + "sha256:c0c000c1a09f069632d8a9eb3b610ac029fcc682f1d69b758e625d6ee713f4ed", + "sha256:cdafb86eb673c3211accffbffdb3cdffa3aaafacd14819e0898d23696d18e4d3", + "sha256:d2a90ce2f0f5b695e4785ac07c19a58244092f3c85d57db6d8eb1a2b26d2aad6", + "sha256:d784d57b958ffd07e9e226d17272f9af0c41572557604ca7554214def32c26bf", + "sha256:d891942592789fa0ab71b502550bbadb12f540d7413d7d7c4cef4b02af0f5bc6", + "sha256:dc7693573f16535428183de8fd27f0ca1ca37a51baa0b41dc5ed7b3d68fe80e2", + "sha256:ddb8d01aa900b741d6b7cc585a97aff787175f160ab975e21f880e89d810781a", + "sha256:e328357b6bbf79928363dbf13f4635b7aac0306afb7e5ad24d21d0c5761c3253", + "sha256:e86c8d54cd19a13e9081898b3c24351683fd39d726ecf8e774aaa9d8d96f5f3a", + "sha256:e9e4bdcd70216b08801e267c0b563316b787f957a46e215249921f99288456f9", + "sha256:f169469d04a23282de9d0be349499cb6683b6ff1b68901210faacac9b0c24b7d" ], "markers": "python_version >= '3.7' and python_full_version not in '3.9.0, 3.9.1'", - "version": "==44.0.2" + "version": "==45.0.2" }, "dbrepo": { "hashes": [ - "sha256:4dc7da6e48b618d44e82f3ad392c4d1ef7917a0cd46bb13af78a73f3062d7319" + "sha256:76f0ab97d1e914a779aa51b5e5a17591b2f1c88f15dc9df27273deb4dc7ed125", + "sha256:f01ee3102dc405c00b5e61cd1d62a46f9644ca33d131912cc25130a5ec304378" ], - "path": "./lib/dbrepo-1.8.1.tar.gz", - "version": "==1.8.1" + "path": "./lib/dbrepo-1.9.0.tar.gz", + "version": "==1.9.0" }, "flasgger": { "hashes": [ @@ -417,104 +317,6 @@ "index": "pypi", "version": "==4.7.1" }, - "frozenlist": { - "hashes": [ - "sha256:000a77d6034fbad9b6bb880f7ec073027908f1b40254b5d6f26210d2dab1240e", - "sha256:03d33c2ddbc1816237a67f66336616416e2bbb6beb306e5f890f2eb22b959cdf", - "sha256:04a5c6babd5e8fb7d3c871dc8b321166b80e41b637c31a995ed844a6139942b6", - "sha256:0996c66760924da6e88922756d99b47512a71cfd45215f3570bf1e0b694c206a", - "sha256:0cc974cc93d32c42e7b0f6cf242a6bd941c57c61b618e78b6c0a96cb72788c1d", - "sha256:0f253985bb515ecd89629db13cb58d702035ecd8cfbca7d7a7e29a0e6d39af5f", - "sha256:11aabdd62b8b9c4b84081a3c246506d1cddd2dd93ff0ad53ede5defec7886b28", - "sha256:12f78f98c2f1c2429d42e6a485f433722b0061d5c0b0139efa64f396efb5886b", - "sha256:140228863501b44b809fb39ec56b5d4071f4d0aa6d216c19cbb08b8c5a7eadb9", - "sha256:1431d60b36d15cda188ea222033eec8e0eab488f39a272461f2e6d9e1a8e63c2", - "sha256:15538c0cbf0e4fa11d1e3a71f823524b0c46299aed6e10ebb4c2089abd8c3bec", - "sha256:15b731db116ab3aedec558573c1a5eec78822b32292fe4f2f0345b7f697745c2", - "sha256:17dcc32fc7bda7ce5875435003220a457bcfa34ab7924a49a1c19f55b6ee185c", - "sha256:1893f948bf6681733aaccf36c5232c231e3b5166d607c5fa77773611df6dc336", - "sha256:189f03b53e64144f90990d29a27ec4f7997d91ed3d01b51fa39d2dbe77540fd4", - "sha256:1a8ea951bbb6cacd492e3948b8da8c502a3f814f5d20935aae74b5df2b19cf3d", - "sha256:1b96af8c582b94d381a1c1f51ffaedeb77c821c690ea5f01da3d70a487dd0a9b", - "sha256:1e76bfbc72353269c44e0bc2cfe171900fbf7f722ad74c9a7b638052afe6a00c", - "sha256:2150cc6305a2c2ab33299453e2968611dacb970d2283a14955923062c8d00b10", - "sha256:226d72559fa19babe2ccd920273e767c96a49b9d3d38badd7c91a0fdeda8ea08", - "sha256:237f6b23ee0f44066219dae14c70ae38a63f0440ce6750f868ee08775073f942", - "sha256:29d94c256679247b33a3dc96cce0f93cbc69c23bf75ff715919332fdbb6a32b8", - "sha256:2b5e23253bb709ef57a8e95e6ae48daa9ac5f265637529e4ce6b003a37b2621f", - "sha256:2d0da8bbec082bf6bf18345b180958775363588678f64998c2b7609e34719b10", - "sha256:2f3f7a0fbc219fb4455264cae4d9f01ad41ae6ee8524500f381de64ffaa077d5", - "sha256:30c72000fbcc35b129cb09956836c7d7abf78ab5416595e4857d1cae8d6251a6", - "sha256:31115ba75889723431aa9a4e77d5f398f5cf976eea3bdf61749731f62d4a4a21", - "sha256:31a9ac2b38ab9b5a8933b693db4939764ad3f299fcaa931a3e605bc3460e693c", - "sha256:366d8f93e3edfe5a918c874702f78faac300209a4d5bf38352b2c1bdc07a766d", - "sha256:374ca2dabdccad8e2a76d40b1d037f5bd16824933bf7bcea3e59c891fd4a0923", - "sha256:44c49271a937625619e862baacbd037a7ef86dd1ee215afc298a417ff3270608", - "sha256:45e0896250900b5aa25180f9aec243e84e92ac84bd4a74d9ad4138ef3f5c97de", - "sha256:498524025a5b8ba81695761d78c8dd7382ac0b052f34e66939c42df860b8ff17", - "sha256:50cf5e7ee9b98f22bdecbabf3800ae78ddcc26e4a435515fc72d97903e8488e0", - "sha256:52ef692a4bc60a6dd57f507429636c2af8b6046db8b31b18dac02cbc8f507f7f", - "sha256:561eb1c9579d495fddb6da8959fd2a1fca2c6d060d4113f5844b433fc02f2641", - "sha256:5a3ba5f9a0dfed20337d3e966dc359784c9f96503674c2faf015f7fe8e96798c", - "sha256:5b6a66c18b5b9dd261ca98dffcb826a525334b2f29e7caa54e182255c5f6a65a", - "sha256:5c28f4b5dbef8a0d8aad0d4de24d1e9e981728628afaf4ea0792f5d0939372f0", - "sha256:5d7f5a50342475962eb18b740f3beecc685a15b52c91f7d975257e13e029eca9", - "sha256:6321899477db90bdeb9299ac3627a6a53c7399c8cd58d25da094007402b039ab", - "sha256:6482a5851f5d72767fbd0e507e80737f9c8646ae7fd303def99bfe813f76cf7f", - "sha256:666534d15ba8f0fda3f53969117383d5dc021266b3c1a42c9ec4855e4b58b9d3", - "sha256:683173d371daad49cffb8309779e886e59c2f369430ad28fe715f66d08d4ab1a", - "sha256:6e9080bb2fb195a046e5177f10d9d82b8a204c0736a97a153c2466127de87784", - "sha256:73f2e31ea8dd7df61a359b731716018c2be196e5bb3b74ddba107f694fbd7604", - "sha256:7437601c4d89d070eac8323f121fcf25f88674627505334654fd027b091db09d", - "sha256:76e4753701248476e6286f2ef492af900ea67d9706a0155335a40ea21bf3b2f5", - "sha256:7707a25d6a77f5d27ea7dc7d1fc608aa0a478193823f88511ef5e6b8a48f9d03", - "sha256:7948140d9f8ece1745be806f2bfdf390127cf1a763b925c4a805c603df5e697e", - "sha256:7a1a048f9215c90973402e26c01d1cff8a209e1f1b53f72b95c13db61b00f953", - "sha256:7d57d8f702221405a9d9b40f9da8ac2e4a1a8b5285aac6100f3393675f0a85ee", - "sha256:7f3c8c1dacd037df16e85227bac13cca58c30da836c6f936ba1df0c05d046d8d", - "sha256:81d5af29e61b9c8348e876d442253723928dce6433e0e76cd925cd83f1b4b817", - "sha256:828afae9f17e6de596825cf4228ff28fbdf6065974e5ac1410cecc22f699d2b3", - "sha256:87f724d055eb4785d9be84e9ebf0f24e392ddfad00b3fe036e43f489fafc9039", - "sha256:8969190d709e7c48ea386db202d708eb94bdb29207a1f269bab1196ce0dcca1f", - "sha256:90646abbc7a5d5c7c19461d2e3eeb76eb0b204919e6ece342feb6032c9325ae9", - "sha256:91d6c171862df0a6c61479d9724f22efb6109111017c87567cfeb7b5d1449fdf", - "sha256:9272fa73ca71266702c4c3e2d4a28553ea03418e591e377a03b8e3659d94fa76", - "sha256:92b5278ed9d50fe610185ecd23c55d8b307d75ca18e94c0e7de328089ac5dcba", - "sha256:97160e245ea33d8609cd2b8fd997c850b56db147a304a262abc2b3be021a9171", - "sha256:977701c081c0241d0955c9586ffdd9ce44f7a7795df39b9151cd9a6fd0ce4cfb", - "sha256:9b7dc0c4338e6b8b091e8faf0db3168a37101943e687f373dce00959583f7439", - "sha256:9b93d7aaa36c966fa42efcaf716e6b3900438632a626fb09c049f6a2f09fc631", - "sha256:9bbcdfaf4af7ce002694a4e10a0159d5a8d20056a12b05b45cea944a4953f972", - "sha256:9c2623347b933fcb9095841f1cc5d4ff0b278addd743e0e966cb3d460278840d", - "sha256:a2fe128eb4edeabe11896cb6af88fca5346059f6c8d807e3b910069f39157869", - "sha256:a72b7a6e3cd2725eff67cd64c8f13335ee18fc3c7befc05aed043d24c7b9ccb9", - "sha256:a9fe0f1c29ba24ba6ff6abf688cb0b7cf1efab6b6aa6adc55441773c252f7411", - "sha256:b97f7b575ab4a8af9b7bc1d2ef7f29d3afee2226bd03ca3875c16451ad5a7723", - "sha256:bdac3c7d9b705d253b2ce370fde941836a5f8b3c5c2b8fd70940a3ea3af7f4f2", - "sha256:c03eff4a41bd4e38415cbed054bbaff4a075b093e2394b6915dca34a40d1e38b", - "sha256:c16d2fa63e0800723139137d667e1056bee1a1cf7965153d2d104b62855e9b99", - "sha256:c1fac3e2ace2eb1052e9f7c7db480818371134410e1f5c55d65e8f3ac6d1407e", - "sha256:ce3aa154c452d2467487765e3adc730a8c153af77ad84096bc19ce19a2400840", - "sha256:cee6798eaf8b1416ef6909b06f7dc04b60755206bddc599f52232606e18179d3", - "sha256:d1b3eb7b05ea246510b43a7e53ed1653e55c2121019a97e60cad7efb881a97bb", - "sha256:d994863bba198a4a518b467bb971c56e1db3f180a25c6cf7bb1949c267f748c3", - "sha256:dd47a5181ce5fcb463b5d9e17ecfdb02b678cca31280639255ce9d0e5aa67af0", - "sha256:dd94994fc91a6177bfaafd7d9fd951bc8689b0a98168aa26b5f543868548d3ca", - "sha256:de537c11e4aa01d37db0d403b57bd6f0546e71a82347a97c6a9f0dcc532b3a45", - "sha256:df6e2f325bfee1f49f81aaac97d2aa757c7646534a06f8f577ce184afe2f0a9e", - "sha256:e66cc454f97053b79c2ab09c17fbe3c825ea6b4de20baf1be28919460dd7877f", - "sha256:e79225373c317ff1e35f210dd5f1344ff31066ba8067c307ab60254cd3a78ad5", - "sha256:f1577515d35ed5649d52ab4319db757bb881ce3b2b796d7283e6634d99ace307", - "sha256:f1e6540b7fa044eee0bb5111ada694cf3dc15f2b0347ca125ee9ca984d5e9e6e", - "sha256:f2ac49a9bedb996086057b75bf93538240538c6d9b38e57c82d51f75a73409d2", - "sha256:f47c9c9028f55a04ac254346e92977bf0f166c483c74b4232bee19a6697e4778", - "sha256:f5f9da7f5dbc00a604fe74aa02ae7c98bcede8a3b8b9666f9f86fc13993bc71a", - "sha256:fd74520371c3c4175142d02a976aee0b4cb4a7cc912a60586ffd8d5929979b30", - "sha256:feeb64bc9bcc6b45c6311c9e9b99406660a9c05ca8a5b30d14a78555088b0b3a" - ], - "markers": "python_version >= '3.8'", - "version": "==1.5.0" - }, "grafana-client": { "hashes": [ "sha256:2477a47b923fd0637947e620b0b777c641af18a3025464fa4505783dbf05dfcc", @@ -533,11 +335,11 @@ }, "h11": { "hashes": [ - "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d", - "sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761" + "sha256:4e35b956cf45792e4caa5885e69fba00bdbc6ffafbfa020300e549b208ee5ff1", + "sha256:63cf8bbe7522de3bf65932fda1d9c2772064ffb3dae62d55932da54b31cb6c86" ], - "markers": "python_version >= '3.7'", - "version": "==0.14.0" + "markers": "python_version >= '3.8'", + "version": "==0.16.0" }, "idna": { "hashes": [ @@ -565,105 +367,106 @@ }, "jh2": { "hashes": [ - "sha256:038091480cd1544e9389b0adbb1b1645a797689dcb68ceae7e45eec96ed24497", - "sha256:0c8e336df8ed1687590695f4469f480eeb4159bf13bb6193791c6530fe114b49", - "sha256:0c9bf2d5e4ef45c1686c6f76935e7ca263f5eae4de92bf5d1873a0e737e4eb7d", - "sha256:0faf6e96f74d27b8ca816b40217904891f91b664ed1c0388737949ceb50ac15d", - "sha256:10ea7f497e6226372e1d4fdbf42c8381f4887819a643ab930bff4072ad298d84", - "sha256:11650f7ed77ee1df30f25d6b3b74b2fa1c94124e074fd455abafea3cbc913d53", - "sha256:12ead3ee3e9c7caa00356b528a5cc7fe210fbe2060628af6e19ed76b8416572e", - "sha256:136b3c5b08883681fcb58f12393a5bbfa422d6e2d5ba887e263e776874276bc6", - "sha256:17d6e1691154ea9f726e43dcb717df48e56c66b5a01c90ad675c6494c36e5be1", - "sha256:19cb987915cc0d321746a12f2a693d087ffb721c37ac9a153cc088c57d4d90eb", - "sha256:1cdf15de698c4026e64fd914fead3180e52bf2a7bcbe44a3392404582dbf2d22", - "sha256:1e81e1c64e33506b8508ba5e3c7c139b2577e78b079c2c16a8e7a02a161f1080", - "sha256:2226c76e4ff2149c5d9f94bed22bf9c4f3411d38cc53d4a7ddfbe0899c8b558c", - "sha256:2837412fb7b684c6ce7392c8bc57440c6dbadaf1bde7a53144381f7df7083c1c", - "sha256:293f0f3da3c391e997e0d55fdb85540e98a8b0406622bb4ba57fb7617697f31e", - "sha256:2b9cc6c0239215a349d28c192fa4c4e7a7348eee7980531525c01bffe39eea80", - "sha256:2f3ad679f84ff236a0d7b71ddc4b3c09fe467abee2f1a86671f0cd417be5352b", - "sha256:358cad2f328c52c15756cf32b0ad17afb0d617e7cdfe93d59aa2616966d825b7", - "sha256:3663712305b509f79c002c8c0ca9994f716cadba576f5a59632dda1aec1ca8c6", - "sha256:41794820ccca039ca2ead6245f30b34601dd1456eee5b5dde620672bb989e79d", - "sha256:44b7e64aff542471c474c24f771eae5efd9152da02a12556f7cb7607020e1420", - "sha256:45770eb0990166026538d3c2fd7d92f17cfde13ca6567570c4baec3ce9162936", - "sha256:498060078a4d1b458e9381fefb027d85329397b50d65287712b3d48233e20836", - "sha256:4c2f18f337c2393f84e45e5011c8b02697b81638b1cec49da60a01b9ed067695", - "sha256:5162d6e475d2762035fb8ea25982bcbec6c58715e33bd0951499f743cd90b110", - "sha256:51e8c890bb59008c95b3a552cefd8bd9ce50a7466a6c920a78cf586e885d7449", - "sha256:56ad3839ac6ac5fd3d023cf59d4b04264b74bb4cb44c0780faf51d6b5ff38fbc", - "sha256:5821638ef0d7c973071810a6786f59b305172197f7e7e469a2ce169e7f4978e3", - "sha256:5ac1b2d379f4d40c13dcce537e69704452943cddbe991fd54a84fdb2da9026d5", - "sha256:5b465d4311b0429fe6fa85df8e2cfcb038c9fface95396dd14e838ecabaaadf2", - "sha256:5d8656b98057329bd03d968aac8d5198389cf51517511295cfc4cb827a507e39", - "sha256:5dcfb3e823ef4b91b70b92848570d1d8cfd584304bd2bd54272dc100c9494def", - "sha256:5e40d23ea43f683f3a7c032dde391104f609b05c21b6d284101120b51dbd50c1", - "sha256:63a01522bde161c713f7fa5ee5d850fee6386fc386073490ebcd438f14579cf2", - "sha256:6b2a3d7756035dde13571f4ad232629b78b7f35c2cd5fda7b464079fc697db3a", - "sha256:6b3be1a6bf6c965aea3b4e3a40df9d2c134c516d89c76cf2b6c81f67e6c5c6ed", - "sha256:6c7bea3357f2dc653756e6da55f66cd21c73d3875c8f3dc4e8d196a876252de0", - "sha256:6e6c8e229507cf29333a2f491cbaa7dff5b8a4a3e613af8090ccce9ce3e4f7a0", - "sha256:6fad27f2a63884ee45d491aebec4b1f38752cd6aaccc625038c21e7f43c02c49", - "sha256:71bfef52547c2b8b145897fa8d1b5142bc52313cfa38c0742e0ef755f0d09c60", - "sha256:72370d312323282b1bf74426e53fae861a310d7ae519b419da46673c38e7d147", - "sha256:76c7d36043a9c478b0c846fcec7da5cb095983722473e503e0122ccd170182b5", - "sha256:78d8a81ef51edb9a2f278a6fb278789b49e304b12bb21bccf2fe7e344f71a9fb", - "sha256:798a6b159ce32181a5e7ab7611c17d1080e74a5541fec47f961b728dab25a76f", - "sha256:7e370567f66a57e2c0e3ae2afcc6f126e1d6babd36831cfd0caad279b05c1c88", - "sha256:8004b845f606b95a8b17efa112aa10b327e46e95dcda604a257b4633d4ed45c8", - "sha256:80b20bf9ea4e709b3b9ae364ac298dfa872b084c186e5c1d60b0b79c79a7ee7e", - "sha256:87303f4bb1b493997f911a4f126123ccd2827d3a2e7dd2390cc6143fbc75805b", - "sha256:8d423f4631395b92dceda39f481a463498131ac02a58581124a44495491f715b", - "sha256:94ee262192db50fb9c069a0be7bb1a426fb1b43af26ce12bf4c6c30e13f46b56", - "sha256:960e4be2e7de340300ab4bcc2b45bed46be1d62330575b8265e6602dbcb9a14c", - "sha256:99397d5e1da6b345cec3e6125e2902b0e6864eb8eaa4be43a2013f059c502c93", - "sha256:9abbb8c1bad08817bad62ae1ea76c01bdbd0ee8c827d05f3ba038c9f6d6f14bb", - "sha256:9c0b8fadf80bc70d341032f92702bda1b0ed78c01e9c495f0df701938c99bcf5", - "sha256:9f977da9abae170eebdcf02bda33727c342fad5dcdbc08498bfdfb6cc6c65489", - "sha256:a6be712ca39d5e9c89b705bc9800be36739436fefb8d0b52b2d332f7d6d22a01", - "sha256:aa434418d6ee44b0ba3a5a407bc9e1543cf496328f43f149e9b58f74a63d5c21", - "sha256:ac4f778e32f7de0ba63346893a4af87c2280ffc1783f594a117be51d908a10da", - "sha256:ac85d65ee369c09b2904b55078ad589961e2e2e03c810963d35a26e6a3931425", - "sha256:ad5d78c664d39960435d4162db31117c8945ba74fb0c414e79ba85a8bdeafdec", - "sha256:ad91f57c3485d87a8edee558dafab0f08c716857d748731c0998dcefe9d3fd5f", - "sha256:afd255d42b340036883ca95bded553b29065b064e2fe5db64ad5988517db9694", - "sha256:b1c2c74f100a0c2110a8e30445554ae331860d32f145c60a2a1e1c27702022a2", - "sha256:b49a8c71378d40d43c6a56eaa536d7823baa43c27c93e082aeb60a9717be0c10", - "sha256:b5f52611323e8e35705e6750a760f32165b41c052d22da154ae343871e7cd50d", - "sha256:b6bf99ae529ac359263269710356d3ddb173c15d8f8dc8849ae794ab811e5cd0", - "sha256:ba361bf87c4701f11241be92c99ef5cf916865dd225955cccb2376bf76717b3c", - "sha256:bc351aa2158575e68943d8e1d5531719ad86bf6607776627ed5a1a60657664af", - "sha256:bd6eb7b1e12e4dd0b75cab1b023272f1333494add5ad61deedac738af1ffeede", - "sha256:bf8852595f5e2d2b072e24c29394b5aca7fba96ecc8656d56660535f9e9872c9", - "sha256:c1dd66541569a2bdbe92589cc96a89f470b20d168f2238fd463e1b59ee3e2d49", - "sha256:c36a7a004cba4e370d0675826eeefe4e42a256638b6b1432263ddb4af317bc02", - "sha256:c886cda61da4d39010be84802bed11bc75f03e8a6094cc18016957a2c80254d4", - "sha256:cc7aa83946f80c66a5d2dea7e165f15aa3eb21e7b74b24d8f850afc0d44bb00e", - "sha256:cea9c4bef70d1358bafec6019164abce362f4de15d79d1ecd64ae31c1749d77a", - "sha256:cfe1951e80869695857986be104a40a1e7fa8ec7de05f86bcbd7bd20854be764", - "sha256:d36cf6f139da3279644794fcfda18af425c8bb122ef9c2e7c762a937bbf7b0f4", - "sha256:d81308faaa9393b7e6ed20718d465c4c2b73c24d5e4826024961acf4b87b1524", - "sha256:db51ea1f9c5ac790848bc271fcdf4108ad1b77a77c6949a96320477962cf7ba5", - "sha256:dd05c18c920a15e00d7a52df37bffd3930fe2c004c690f9422b20e12077e6dbd", - "sha256:df05918a11e1db0198d00486e36673b4b4a89390e4458ff9479b4908dde357ac", - "sha256:e4c31dccf6be131709e545d0258eb5b75c5fac304857ad3976331c6740e8b9d6", - "sha256:e60954d673040430802b29fe5bba698e262182b5ba5f302ff4458e39f8101881", - "sha256:e60e2d2c88a0552e61c37172fe377f6a8abf479130a445314886de4a360ba940", - "sha256:e786f773ddc153846b2ebdb854011cfd1f7c874b8ee79cced3706801341c9f5d", - "sha256:e7cd91548fb95b69edd376f5204e27115ac7d093ec7d80066123a5bdb31c71d9", - "sha256:eaef2ea4f5602aefaaf3d6e8235f3b9ffde35aff15aac1c16cc802f6bbf0a3b5", - "sha256:ec8c5ea93a03775fbadd08462200cf34ce617ec75a032abfa44fd6d3a00e5424", - "sha256:eddeb8574bc9d9abb8491d4a46b60e553c2cea235b80373756acb06568101175", - "sha256:eeb300b0e4b428aab2f70d785cad4306529262af6de8c8c5fe6a4b41a674a434", - "sha256:f39d71ece8e97cf069e4154868eaac1256b133fe23e0459829432e4bb6406472", - "sha256:f4840ddad2b9d53710e92361391944da89e3576641a290066a1719520059247c", - "sha256:f70723a00bcbce0f9a216853139955be45da35741335eb3afead304e77662560", - "sha256:f829cf2ba5b553e6529d6238928c07096f1feb47f4ad536b7f06bca6cc77173f", - "sha256:f96386910467725895f7972939a6faabd6e96b1de0cc2c092e4bd2c40e956e25", - "sha256:fe259a9d6f555bc79aed9bb4b9a7fff73db443b4c483e4a81a428c8a2860428b" + "sha256:02015fd68d73cfbe623c7ee93130dd8be53f9eed5cd644fce12d298929c6a15d", + "sha256:0fc980bc55ec4de7b696aab45b1e8d89465608f48f1ba06db1184c2cb8e4ff82", + "sha256:1005f57c2866305432588fb001e6ac9f99258cf2620ff1f93f6eae2c164db403", + "sha256:11909c2a63d342bf84211673ced4ea1a7c701362a375e1e2308e613535ba9865", + "sha256:12c9a67a94c7b0b1bc15f90e57647f5b73e3d8e67a117f649c67b7aa71664ee8", + "sha256:162396cc26bdab52818b9c2926fe75533b0dc6dfc0db90779807159eff896c22", + "sha256:1643f6ba8f9fbb03b933cca8dd84bec19f3f33acab513e57e083ebe9462a4ef3", + "sha256:16cbfcb2f9934e7693eef985f1e4bf64ff1d533dbc9cca4554a7e24804170e4d", + "sha256:1a52ef916d076842ba1252fc9d0fe78ec0ea93d4b2985ae46b3b0f05e6b3348f", + "sha256:1e9ff345926c4ac650acea101463b4f8468f5069dda136366585ff7ce4aac38c", + "sha256:1ed0cf5558d4d8cbb2b8a407295ba101a79686ff452fb2ab5fac1c6b9ef40d79", + "sha256:20b3d8eb3469c2c368cced0da918b4e8ff8e91f2a48810b8242dd8a8ff0de0da", + "sha256:2138ad06e011cb0ebc00f7485377888f0c6f076b1aa21f167d7cd5adf8f85ca5", + "sha256:23df2b4433ebf275e096c66fd4fe2a27d8d802fcab8ac49ec856a168808b7ad4", + "sha256:28b5a1c3aa84f09ab2b004cb9e16bc13a798933607806bb5ec5a38e1406d7e19", + "sha256:2a76f29548199744b210308aac184d897bfda4ec7300ce1d4b9a498874aeceab", + "sha256:2b2768b896e0351328a7f6377d77d21deadef5a50afd84bc66995a8323faf921", + "sha256:2f2f8fba36fd9c9463cc55a27957735f46e9b4d3551d4bb7fd9539749d141647", + "sha256:33bf11c9f6b6308823147e8d8da0828b5e7f330399a5b12c08c586e798119195", + "sha256:3451a18af56eb324b438721107922bead16a6427935a7f33cdf66423f7579b39", + "sha256:34f88cff35a18b7b74579ab08272fdf0a4ef92fcd119fedda010d0e234339bcc", + "sha256:36e26dbfcee621001a6abeabc9e24a38c347f63c630d20557d98de427305ac0b", + "sha256:37cb6b97e577fb4079a3b37ae6037ceb16ea6f267b0d94a1aaddb15e07217390", + "sha256:39da0fb5f29bae4158052c4515d38d0c1636dac484d2fd1a621ff76d206d217d", + "sha256:3b51280e4721f761d753da5b8c1c66db60b52f1ac239f808049bdc3676bb49a1", + "sha256:40276a7aec8f1c3e8f9363d58ce8e6272e8c8bb6253cb9a602aa8023e359c977", + "sha256:423a64f75d4a9dd619054eb0574b94feb93a5fc9dc3173e97e3d469a12e979a2", + "sha256:4bed27b58c97ceb8dcdba6506ba266f39d67736ee5ab33ad19573d983b4969d3", + "sha256:514bbd814696a39579cfda789ac830b7e1ab6e3409dcc06aab7a161ca0a81000", + "sha256:557c23250afa4a1432fecd14818d3ee1e46d9b229c292b6214083789bdfb135e", + "sha256:5756c58005a2773cd692beaa9ad31a2f15781a1ffd1cd6346bbce7072bd1b280", + "sha256:579985e10c39df85246d8386484abf3315cb3802a0e1fde09923ac1f8810f5bc", + "sha256:5fb48c8cb7b24a1f4122de052a482bec46e58626cf3f1fd0ca0accbd9fd97d3c", + "sha256:5feec0be4b56987c4c68be7d39f696177d714a70a35c93a68776a1dd6116d314", + "sha256:601f8a1ac81e2a4d830acd6d1d248b32e9e34a6d3dc0987f7b0af60c1427dc4b", + "sha256:6056d8c64a3863327859b5999eb8e83b7ef591db276148c0724da33e83659c18", + "sha256:607f5fbb92132e61959904c25a88f381be4559b566e03243ce5f71332f40e14b", + "sha256:65a7a4efc2a937af2b00f8d47812b4b665ce7a1e5bf91c9741166c5804f6ff2b", + "sha256:6639f549083a17a902fa51116882962708f2e44180cebd0d311548383fbfa616", + "sha256:66ca52ffdfd19e16f2a05b3761a013337b2d937385be52ebbeec6906dc68b316", + "sha256:6d1d55d29fdb8721b6d590cd5167c2d78d94ee0020e3bd2887cefeae90b4f3b5", + "sha256:6e61235c0f24cb2c4ee8d9d57efea80c412e9f12627704c2924e8f8097ddc2f5", + "sha256:7066220730be2da6b5e85a5a12b60728fab3eee79265de7f65effbdcc3af17a3", + "sha256:71fe5094f89c1b9147eae3662e6b92dae845a583e06e603bc4d79f9cc3f20693", + "sha256:747d0e9e3200cb883f2f8c2a8a7b7ec150e5f84e966c921d50e5194b8db81594", + "sha256:7b72ed5aaa1f4160d9ebed48013194b92baf3a14dfa22b2fd113b17c976c34d5", + "sha256:7bb2e761ce3692e54a2c61b8e57f0abdd970a653114ca5c3a12acae4f167199d", + "sha256:7c74fc0fab0d903f4736972f64e0f277f632e9766d4558911fd46abfe955e231", + "sha256:7d9d4d83fbf75362d0986ee4305ec85eb06ed124e299d38af5ed4eb20ed0cc74", + "sha256:7f87be4eff3f1e6821ce0ae085126aba46b77895d6aaa3a5bf2c6157fd121923", + "sha256:88aba8ef44162c96083690952e6ddde1b044957125ac67e3b92a87fd72407eff", + "sha256:88d2bbcbdb149101f0f211aa870ce18dfb563f62f10eecf834101c8b9cbcd145", + "sha256:88db9078be359ccdea973c99ab88a0312012d40fe2878ff106dfe3fe918bf5b2", + "sha256:8aa82f946aebf69b38f0537fb51577284d0caa351ce096a0401ed27129ae9b3c", + "sha256:9794c6b1ff04d8d6d1764e7490b34fc5a3435583672ca5466f39fa3640dafe54", + "sha256:98c4613061269dd0c201441e31d83bbf36493fe1482648f31fd62628346af1e7", + "sha256:9c6cc4f3d4d237184030ffd3721a8f59fde97f5f1cdab1547d2bb0b093250427", + "sha256:9dd0faae92a299f0b960d46aef675df2c118e26299ae9ebac4ec7051fa227c35", + "sha256:9f5d30e46bd8a01b646825a2157a4cb1d98c8eb01ffe80ac379ed791ca639687", + "sha256:a35be731dc0889c2689c66c05023390e026bdbbfdb47da214d99bd1e1c25f8bb", + "sha256:a54d437f3bd120f0d2971ea990e665d3487e252f2453618fd98196404a04f90b", + "sha256:a86b2ddd8e1671f24111fbcfb1db7fd2b6bf4cf6ad7966c370e3bc5342a51977", + "sha256:aaa3ddabe69cd09c7d2cc5b06ff428125ecb47a04d3ac1941ff86017b87f4063", + "sha256:ad37a22911f1e87b53b236efd02dcf17c23dd7de87b0f079e971a14d33c0866c", + "sha256:af00e2a680e89ceb8cf41d221a4d639be4c4212a2c7ab933155b727fd3dacbac", + "sha256:b02dfe24a1c4b2169e182d12a0b52516809fb608252dc384d437b99ef4b84de0", + "sha256:b6c7a988fe6b4310d045147966c5f82bb1493f3a2c8b1d9580e7c872ed80faaf", + "sha256:b75fbdb62ddeb6aecaebb9bc601ff75b36d2b69cc8e5841d75c375b96f02ea7a", + "sha256:b7fcc7a55a11ce4f2d588cb0b9746b8f3b753d080326e7b8395b3398ae0c0188", + "sha256:ba2de41d4946fb2ddde7af9b55b31fba0f8c6a26f15d7e281e59221337d6b37d", + "sha256:bc8c07c8ceea477e7a10d899eacb2c0cf4c59d595c9316a6b5c2063378d34f20", + "sha256:bec06ebc7d37beba62503c955d90580cfa1e5fff2b44f05cebecf2378b7f54b1", + "sha256:c3f3e88960a265116b8a972fc7ceb5b534b5a1730d581cd5fbedea90212f79de", + "sha256:c595c46f2fe39f235a463796c2ff80889a5d61c99db94235c8d2d7f654f04fa3", + "sha256:c725e40e881b8e35381a4d2667f4c3ad978929fb890c1822f8524e3d6846ad49", + "sha256:c90c141a4edd6ac99780b77abe7132d48d5e0fee7741ba2e217a53a503833441", + "sha256:ca2381a51ea8c1261c70ca33181c6557aacd8a06bea73d27dbef053243fe8ca7", + "sha256:cb063308aeb5f103f1c82526b02fbdb464a0b42f00ebf927dc9dd8b76b37bfda", + "sha256:cb843586cac2e0663804777ca5efa5d7b565bcd824da9b2ee1e98cfbd7d8382a", + "sha256:ce5707b2876e421080fdfb9d89752a1d111f57d8f3cddba57c24d93f17aa2074", + "sha256:d6802287d937f2cdb7ff8ca47c7994d4f8c06b7f0b67f138b8a3152de3c624cf", + "sha256:daa2010e0c1c1de21c0e6128571f609e690fcfcb174f75090b8863c16b3aa12c", + "sha256:db35002d92896783277c88d3aac6b9d33cdd65f2323dc786100a661723cf442f", + "sha256:e1adb17a5614d372d2b42b876542ba7a790e77cbbd674620aa920eaa27483165", + "sha256:e2ec53d084a147a6092ad748406310b3789ea252b3a007c8653c71cad9656d8d", + "sha256:e2fea0793376ab9aeb3258d1c192e0ceebd9b51a2f699379224d4f2ca473645d", + "sha256:e409f64962ab74da170fb9085ba17668c9e8da3efa6b4dc5e6084dca702954a1", + "sha256:e7bb595e9d9eeeef45d630766fd3d8c926a25b907631fc0f36411f5f576bb960", + "sha256:e852f812ea8323e269722653ba1bef6a9e5b9e496d5c8e52178b83d3ae435791", + "sha256:f1137d66f4f0670a21d8f146f7cce7282ca20dac8705b11c0bf0d9ac450ad206", + "sha256:f2f5e0cbbac4d158b68e2706a18c5494c0c72908f5d572f934ae6b440cf917cc", + "sha256:f3d028980542939c54e604488530c592fb172c6f48bc5262ba9ac205e8f5b5a7", + "sha256:fa57efb9974a3a36d3396212a43d7a8c68a4de616587cdb36ea2e1ff4164fe07", + "sha256:fb910f4d0791417dc983649145b6d18fd61fd7e7ca019635b79e30acf4daa1cd", + "sha256:fb91f22b639642dd2bac71ac40a7e8082470c9647db7003fdbe63e7ee9db851e", + "sha256:fdddba0689058f3faa5e7ffaaf039aac62dc528ec3e5f031a1e5a81392737237", + "sha256:fec6c5019a22848d092fcfc63cccee76b64ec7b1c7d5495b0b524c17327917ff" ], "markers": "python_version >= '3.7'", - "version": "==5.0.8" + "version": "==5.0.9" }, "jinja2": { "hashes": [ @@ -683,11 +486,11 @@ }, "jsonschema-specifications": { "hashes": [ - "sha256:0f38b83639958ce1152d02a7f062902c41c8fd20d558b0c34344292d417ae272", - "sha256:a09a0680616357d9a0ecf05c12ad234479f549239d0f5b55f3deea67475da9bf" + "sha256:4653bffbd6584f7de83a67e0d620ef16900b390ddc7939d56684d6c81e33f1af", + "sha256:630159c9f4dbea161a6a2205c3011cc4f18ff381b189fff48bb39b9bf26ae608" ], "markers": "python_version >= '3.9'", - "version": "==2024.10.1" + "version": "==2025.4.1" }, "jwt": { "hashes": [ @@ -771,192 +574,82 @@ "markers": "python_version >= '3.8'", "version": "==3.1.3" }, - "multidict": { - "hashes": [ - "sha256:032efeab3049e37eef2ff91271884303becc9e54d740b492a93b7e7266e23756", - "sha256:062428944a8dc69df9fdc5d5fc6279421e5f9c75a9ee3f586f274ba7b05ab3c8", - "sha256:0bb8f8302fbc7122033df959e25777b0b7659b1fd6bcb9cb6bed76b5de67afef", - "sha256:0d4b31f8a68dccbcd2c0ea04f0e014f1defc6b78f0eb8b35f2265e8716a6df0c", - "sha256:0ecdc12ea44bab2807d6b4a7e5eef25109ab1c82a8240d86d3c1fc9f3b72efd5", - "sha256:0ee1bf613c448997f73fc4efb4ecebebb1c02268028dd4f11f011f02300cf1e8", - "sha256:11990b5c757d956cd1db7cb140be50a63216af32cd6506329c2c59d732d802db", - "sha256:1535cec6443bfd80d028052e9d17ba6ff8a5a3534c51d285ba56c18af97e9713", - "sha256:1748cb2743bedc339d63eb1bca314061568793acd603a6e37b09a326334c9f44", - "sha256:1b2019317726f41e81154df636a897de1bfe9228c3724a433894e44cd2512378", - "sha256:1c152c49e42277bc9a2f7b78bd5fa10b13e88d1b0328221e7aef89d5c60a99a5", - "sha256:1f1c2f58f08b36f8475f3ec6f5aeb95270921d418bf18f90dffd6be5c7b0e676", - "sha256:1f4e0334d7a555c63f5c8952c57ab6f1c7b4f8c7f3442df689fc9f03df315c08", - "sha256:1f6f90700881438953eae443a9c6f8a509808bc3b185246992c4233ccee37fea", - "sha256:224b79471b4f21169ea25ebc37ed6f058040c578e50ade532e2066562597b8a9", - "sha256:236966ca6c472ea4e2d3f02f6673ebfd36ba3f23159c323f5a496869bc8e47c9", - "sha256:2427370f4a255262928cd14533a70d9738dfacadb7563bc3b7f704cc2360fc4e", - "sha256:24a8caa26521b9ad09732972927d7b45b66453e6ebd91a3c6a46d811eeb7349b", - "sha256:255dac25134d2b141c944b59a0d2f7211ca12a6d4779f7586a98b4b03ea80508", - "sha256:26ae9ad364fc61b936fb7bf4c9d8bd53f3a5b4417142cd0be5c509d6f767e2f1", - "sha256:2e329114f82ad4b9dd291bef614ea8971ec119ecd0f54795109976de75c9a852", - "sha256:3002a856367c0b41cad6784f5b8d3ab008eda194ed7864aaa58f65312e2abcac", - "sha256:30a3ebdc068c27e9d6081fca0e2c33fdf132ecea703a72ea216b81a66860adde", - "sha256:30c433a33be000dd968f5750722eaa0991037be0be4a9d453eba121774985bc8", - "sha256:31469d5832b5885adeb70982e531ce86f8c992334edd2f2254a10fa3182ac504", - "sha256:32a998bd8a64ca48616eac5a8c1cc4fa38fb244a3facf2eeb14abe186e0f6cc5", - "sha256:3307b48cd156153b117c0ea54890a3bdbf858a5b296ddd40dc3852e5f16e9b02", - "sha256:389cfefb599edf3fcfd5f64c0410da686f90f5f5e2c4d84e14f6797a5a337af4", - "sha256:3ada0b058c9f213c5f95ba301f922d402ac234f1111a7d8fd70f1b99f3c281ec", - "sha256:3b73e7227681f85d19dec46e5b881827cd354aabe46049e1a61d2f9aaa4e285a", - "sha256:3ccdde001578347e877ca4f629450973c510e88e8865d5aefbcb89b852ccc666", - "sha256:3cd06d88cb7398252284ee75c8db8e680aa0d321451132d0dba12bc995f0adcc", - "sha256:3cf62f8e447ea2c1395afa289b332e49e13d07435369b6f4e41f887db65b40bf", - "sha256:3d75e621e7d887d539d6e1d789f0c64271c250276c333480a9e1de089611f790", - "sha256:422a5ec315018e606473ba1f5431e064cf8b2a7468019233dcf8082fabad64c8", - "sha256:43173924fa93c7486402217fab99b60baf78d33806af299c56133a3755f69589", - "sha256:43fe10524fb0a0514be3954be53258e61d87341008ce4914f8e8b92bee6f875d", - "sha256:4543d8dc6470a82fde92b035a92529317191ce993533c3c0c68f56811164ed07", - "sha256:4eb33b0bdc50acd538f45041f5f19945a1f32b909b76d7b117c0c25d8063df56", - "sha256:5427a2679e95a642b7f8b0f761e660c845c8e6fe3141cddd6b62005bd133fc21", - "sha256:578568c4ba5f2b8abd956baf8b23790dbfdc953e87d5b110bce343b4a54fc9e7", - "sha256:59fe01ee8e2a1e8ceb3f6dbb216b09c8d9f4ef1c22c4fc825d045a147fa2ebc9", - "sha256:5e3929269e9d7eff905d6971d8b8c85e7dbc72c18fb99c8eae6fe0a152f2e343", - "sha256:61ed4d82f8a1e67eb9eb04f8587970d78fe7cddb4e4d6230b77eda23d27938f9", - "sha256:64bc2bbc5fba7b9db5c2c8d750824f41c6994e3882e6d73c903c2afa78d091e4", - "sha256:659318c6c8a85f6ecfc06b4e57529e5a78dfdd697260cc81f683492ad7e9435a", - "sha256:66eb80dd0ab36dbd559635e62fba3083a48a252633164857a1d1684f14326427", - "sha256:6b5a272bc7c36a2cd1b56ddc6bff02e9ce499f9f14ee4a45c45434ef083f2459", - "sha256:6d79cf5c0c6284e90f72123f4a3e4add52d6c6ebb4a9054e88df15b8d08444c6", - "sha256:7146a8742ea71b5d7d955bffcef58a9e6e04efba704b52a460134fefd10a8208", - "sha256:740915eb776617b57142ce0bb13b7596933496e2f798d3d15a20614adf30d229", - "sha256:75482f43465edefd8a5d72724887ccdcd0c83778ded8f0cb1e0594bf71736cc0", - "sha256:7a76534263d03ae0cfa721fea40fd2b5b9d17a6f85e98025931d41dc49504474", - "sha256:7d50d4abf6729921e9613d98344b74241572b751c6b37feed75fb0c37bd5a817", - "sha256:805031c2f599eee62ac579843555ed1ce389ae00c7e9f74c2a1b45e0564a88dd", - "sha256:8aac2eeff69b71f229a405c0a4b61b54bade8e10163bc7b44fcd257949620618", - "sha256:8b6fcf6054fc4114a27aa865f8840ef3d675f9316e81868e0ad5866184a6cba5", - "sha256:8bd2b875f4ca2bb527fe23e318ddd509b7df163407b0fb717df229041c6df5d3", - "sha256:8eac0c49df91b88bf91f818e0a24c1c46f3622978e2c27035bfdca98e0e18124", - "sha256:909f7d43ff8f13d1adccb6a397094adc369d4da794407f8dd592c51cf0eae4b1", - "sha256:995015cf4a3c0d72cbf453b10a999b92c5629eaf3a0c3e1efb4b5c1f602253bb", - "sha256:99592bd3162e9c664671fd14e578a33bfdba487ea64bcb41d281286d3c870ad7", - "sha256:9c64f4ddb3886dd8ab71b68a7431ad4aa01a8fa5be5b11543b29674f29ca0ba3", - "sha256:9e78006af1a7c8a8007e4f56629d7252668344442f66982368ac06522445e375", - "sha256:9f35de41aec4b323c71f54b0ca461ebf694fb48bec62f65221f52e0017955b39", - "sha256:a059ad6b80de5b84b9fa02a39400319e62edd39d210b4e4f8c4f1243bdac4752", - "sha256:a2b0fabae7939d09d7d16a711468c385272fa1b9b7fb0d37e51143585d8e72e0", - "sha256:a54ec568f1fc7f3c313c2f3b16e5db346bf3660e1309746e7fccbbfded856188", - "sha256:a62d78a1c9072949018cdb05d3c533924ef8ac9bcb06cbf96f6d14772c5cd451", - "sha256:a7bd27f7ab3204f16967a6f899b3e8e9eb3362c0ab91f2ee659e0345445e0078", - "sha256:a7be07e5df178430621c716a63151165684d3e9958f2bbfcb644246162007ab7", - "sha256:ab583ac203af1d09034be41458feeab7863c0635c650a16f15771e1386abf2d7", - "sha256:abcfed2c4c139f25c2355e180bcc077a7cae91eefbb8b3927bb3f836c9586f1f", - "sha256:acc9fa606f76fc111b4569348cc23a771cb52c61516dcc6bcef46d612edb483b", - "sha256:ae93e0ff43b6f6892999af64097b18561691ffd835e21a8348a441e256592e1f", - "sha256:b038f10e23f277153f86f95c777ba1958bcd5993194fda26a1d06fae98b2f00c", - "sha256:b128dbf1c939674a50dd0b28f12c244d90e5015e751a4f339a96c54f7275e291", - "sha256:b1b389ae17296dd739015d5ddb222ee99fd66adeae910de21ac950e00979d897", - "sha256:b57e28dbc031d13916b946719f213c494a517b442d7b48b29443e79610acd887", - "sha256:b90e27b4674e6c405ad6c64e515a505c6d113b832df52fdacb6b1ffd1fa9a1d1", - "sha256:b9cb19dfd83d35b6ff24a4022376ea6e45a2beba8ef3f0836b8a4b288b6ad685", - "sha256:ba46b51b6e51b4ef7bfb84b82f5db0dc5e300fb222a8a13b8cd4111898a869cf", - "sha256:be8751869e28b9c0d368d94f5afcb4234db66fe8496144547b4b6d6a0645cfc6", - "sha256:c23831bdee0a2a3cf21be057b5e5326292f60472fb6c6f86392bbf0de70ba731", - "sha256:c2e98c840c9c8e65c0e04b40c6c5066c8632678cd50c8721fdbcd2e09f21a507", - "sha256:c56c179839d5dcf51d565132185409d1d5dd8e614ba501eb79023a6cab25576b", - "sha256:c605a2b2dc14282b580454b9b5d14ebe0668381a3a26d0ac39daa0ca115eb2ae", - "sha256:ce5b3082e86aee80b3925ab4928198450d8e5b6466e11501fe03ad2191c6d777", - "sha256:d4e8535bd4d741039b5aad4285ecd9b902ef9e224711f0b6afda6e38d7ac02c7", - "sha256:daeac9dd30cda8703c417e4fddccd7c4dc0c73421a0b54a7da2713be125846be", - "sha256:dd53893675b729a965088aaadd6a1f326a72b83742b056c1065bdd2e2a42b4df", - "sha256:e1eb72c741fd24d5a28242ce72bb61bc91f8451877131fa3fe930edb195f7054", - "sha256:e413152e3212c4d39f82cf83c6f91be44bec9ddea950ce17af87fbf4e32ca6b2", - "sha256:ead46b0fa1dcf5af503a46e9f1c2e80b5d95c6011526352fa5f42ea201526124", - "sha256:eccb67b0e78aa2e38a04c5ecc13bab325a43e5159a181a9d1a6723db913cbb3c", - "sha256:edf74dc5e212b8c75165b435c43eb0d5e81b6b300a938a4eb82827119115e840", - "sha256:f2882bf27037eb687e49591690e5d491e677272964f9ec7bc2abbe09108bdfb8", - "sha256:f6f19170197cc29baccd33ccc5b5d6a331058796485857cf34f7635aa25fb0cd", - "sha256:f84627997008390dd15762128dcf73c3365f4ec0106739cde6c20a07ed198ec8", - "sha256:f901a5aace8e8c25d78960dcc24c870c8d356660d3b49b93a78bf38eb682aac3", - "sha256:f92c7f62d59373cd93bc9969d2da9b4b21f78283b1379ba012f7ee8127b3152e", - "sha256:fb6214fe1750adc2a1b801a199d64b5a67671bf76ebf24c730b157846d0e90d2", - "sha256:fbd8d737867912b6c5f99f56782b8cb81f978a97b4437a1c476de90a3e41c9a1", - "sha256:fbf226ac85f7d6b6b9ba77db4ec0704fde88463dc17717aec78ec3c8546c70ad" - ], - "markers": "python_version >= '3.9'", - "version": "==6.4.3" - }, "niquests": { "hashes": [ - "sha256:68e0a7e9f338466b3606945fffd11f75e3c90af7498aa9336ef03812323b7e36", - "sha256:86e484c2c60444aa96069c15f6295af6e25a8bad50781e1326df1b5c7ab48339" + "sha256:c5cdc126862090b09030addc23b6bbf06dbd433a4c7c70ddf6657638153bc367", + "sha256:f1dbf2c028223e97839f5b467f875376a014abf51e8f9b284be799fc9a10791c" ], "markers": "python_version >= '3.7'", - "version": "==3.14.0" + "version": "==3.14.1" }, "numpy": { "hashes": [ - "sha256:05c076d531e9998e7e694c36e8b349969c56eadd2cdcd07242958489d79a7286", - "sha256:0d54974f9cf14acf49c60f0f7f4084b6579d24d439453d5fc5805d46a165b542", - "sha256:11c43995255eb4127115956495f43e9343736edb7fcdb0d973defd9de14cd84f", - "sha256:188dcbca89834cc2e14eb2f106c96d6d46f200fe0200310fc29089657379c58d", - "sha256:1974afec0b479e50438fc3648974268f972e2d908ddb6d7fb634598cdb8260a0", - "sha256:1cf4e5c6a278d620dee9ddeb487dc6a860f9b199eadeecc567f777daace1e9e7", - "sha256:207a2b8441cc8b6a2a78c9ddc64d00d20c303d79fba08c577752f080c4007ee3", - "sha256:218f061d2faa73621fa23d6359442b0fc658d5b9a70801373625d958259eaca3", - "sha256:2aad3c17ed2ff455b8eaafe06bcdae0062a1db77cb99f4b9cbb5f4ecb13c5146", - "sha256:2fa8fa7697ad1646b5c93de1719965844e004fcad23c91228aca1cf0800044a1", - "sha256:31504f970f563d99f71a3512d0c01a645b692b12a63630d6aafa0939e52361e6", - "sha256:3387dd7232804b341165cedcb90694565a6015433ee076c6754775e85d86f1fc", - "sha256:4ba5054787e89c59c593a4169830ab362ac2bee8a969249dc56e5d7d20ff8df9", - "sha256:4f92084defa704deadd4e0a5ab1dc52d8ac9e8a8ef617f3fbb853e79b0ea3592", - "sha256:65ef3468b53269eb5fdb3a5c09508c032b793da03251d5f8722b1194f1790c00", - "sha256:6f527d8fdb0286fd2fd97a2a96c6be17ba4232da346931d967a0630050dfd298", - "sha256:7051ee569db5fbac144335e0f3b9c2337e0c8d5c9fee015f259a5bd70772b7e8", - "sha256:7716e4a9b7af82c06a2543c53ca476fa0b57e4d760481273e09da04b74ee6ee2", - "sha256:79bd5f0a02aa16808fcbc79a9a376a147cc1045f7dfe44c6e7d53fa8b8a79392", - "sha256:7a4e84a6283b36632e2a5b56e121961f6542ab886bc9e12f8f9818b3c266bfbb", - "sha256:8120575cb4882318c791f839a4fd66161a6fa46f3f0a5e613071aae35b5dd8f8", - "sha256:81413336ef121a6ba746892fad881a83351ee3e1e4011f52e97fba79233611fd", - "sha256:8146f3550d627252269ac42ae660281d673eb6f8b32f113538e0cc2a9aed42b9", - "sha256:879cf3a9a2b53a4672a168c21375166171bc3932b7e21f622201811c43cdd3b0", - "sha256:892c10d6a73e0f14935c31229e03325a7b3093fafd6ce0af704be7f894d95687", - "sha256:92bda934a791c01d6d9d8e038363c50918ef7c40601552a58ac84c9613a665bc", - "sha256:9ba03692a45d3eef66559efe1d1096c4b9b75c0986b5dff5530c378fb8331d4f", - "sha256:9eeea959168ea555e556b8188da5fa7831e21d91ce031e95ce23747b7609f8a4", - "sha256:a0258ad1f44f138b791327961caedffbf9612bfa504ab9597157806faa95194a", - "sha256:a761ba0fa886a7bb33c6c8f6f20213735cb19642c580a931c625ee377ee8bd39", - "sha256:a7b9084668aa0f64e64bd00d27ba5146ef1c3a8835f3bd912e7a9e01326804c4", - "sha256:a84eda42bd12edc36eb5b53bbcc9b406820d3353f1994b6cfe453a33ff101775", - "sha256:ab2939cd5bec30a7430cbdb2287b63151b77cf9624de0532d629c9a1c59b1d5c", - "sha256:ac0280f1ba4a4bfff363a99a6aceed4f8e123f8a9b234c89140f5e894e452ecd", - "sha256:adf8c1d66f432ce577d0197dceaac2ac00c0759f573f28516246351c58a85020", - "sha256:b4adfbbc64014976d2f91084915ca4e626fbf2057fb81af209c1a6d776d23e3d", - "sha256:bb649f8b207ab07caebba230d851b579a3c8711a851d29efe15008e31bb4de24", - "sha256:bce43e386c16898b91e162e5baaad90c4b06f9dcbe36282490032cec98dc8ae7", - "sha256:bd3ad3b0a40e713fc68f99ecfd07124195333f1e689387c180813f0e94309d6f", - "sha256:c3f7ac96b16955634e223b579a3e5798df59007ca43e8d451a0e6a50f6bfdfba", - "sha256:cf28633d64294969c019c6df4ff37f5698e8326db68cc2b66576a51fad634880", - "sha256:d0f35b19894a9e08639fd60a1ec1978cb7f5f7f1eace62f38dd36be8aecdef4d", - "sha256:db1f1c22173ac1c58db249ae48aa7ead29f534b9a948bc56828337aa84a32ed6", - "sha256:dbe512c511956b893d2dacd007d955a3f03d555ae05cfa3ff1c1ff6df8851854", - "sha256:df2f57871a96bbc1b69733cd4c51dc33bea66146b8c63cacbfed73eec0883017", - "sha256:e2f085ce2e813a50dfd0e01fbfc0c12bbe5d2063d99f8b29da30e544fb6483b8", - "sha256:e642d86b8f956098b564a45e6f6ce68a22c2c97a04f5acd3f221f57b8cb850ae", - "sha256:e9e0a277bb2eb5d8a7407e14688b85fd8ad628ee4e0c7930415687b6564207a4", - "sha256:ea2bb7e2ae9e37d96835b3576a4fa4b3a97592fbea8ef7c3587078b0068b8f09", - "sha256:ee4d528022f4c5ff67332469e10efe06a267e32f4067dc76bb7e2cddf3cd25ff", - "sha256:f05d4198c1bacc9124018109c5fba2f3201dbe7ab6e92ff100494f236209c960", - "sha256:f34dc300df798742b3d06515aa2a0aee20941c13579d7a2f2e10af01ae4901ee", - "sha256:f4162988a360a29af158aeb4a2f4f09ffed6a969c9776f8f3bdee9b06a8ab7e5", - "sha256:f486038e44caa08dbd97275a9a35a283a8f1d2f0ee60ac260a1790e76660833c", - "sha256:f7de08cbe5551911886d1ab60de58448c6df0f67d9feb7d1fb21e9875ef95e91" + "sha256:038613e9fb8c72b0a41f025a7e4c3f0b7a1b5d768ece4796b674c8f3fe13efff", + "sha256:0678000bb9ac1475cd454c6b8c799206af8107e310843532b04d49649c717a47", + "sha256:0811bb762109d9708cca4d0b13c4f67146e3c3b7cf8d34018c722adb2d957c84", + "sha256:0b605b275d7bd0c640cad4e5d30fa701a8d59302e127e5f79138ad62762c3e3d", + "sha256:0bca768cd85ae743b2affdc762d617eddf3bcf8724435498a1e80132d04879e6", + "sha256:1bc23a79bfabc5d056d106f9befb8d50c31ced2fbc70eedb8155aec74a45798f", + "sha256:287cc3162b6f01463ccd86be154f284d0893d2b3ed7292439ea97eafa8170e0b", + "sha256:37c0ca431f82cd5fa716eca9506aefcabc247fb27ba69c5062a6d3ade8cf8f49", + "sha256:37e990a01ae6ec7fe7fa1c26c55ecb672dd98b19c3d0e1d1f326fa13cb38d163", + "sha256:389d771b1623ec92636b0786bc4ae56abafad4a4c513d36a55dce14bd9ce8571", + "sha256:3d70692235e759f260c3d837193090014aebdf026dfd167834bcba43e30c2a42", + "sha256:41c5a21f4a04fa86436124d388f6ed60a9343a6f767fced1a8a71c3fbca038ff", + "sha256:481b49095335f8eed42e39e8041327c05b0f6f4780488f61286ed3c01368d491", + "sha256:4eeaae00d789f66c7a25ac5f34b71a7035bb474e679f410e5e1a94deb24cf2d4", + "sha256:55a4d33fa519660d69614a9fad433be87e5252f4b03850642f88993f7b2ca566", + "sha256:5a6429d4be8ca66d889b7cf70f536a397dc45ba6faeb5f8c5427935d9592e9cf", + "sha256:5bd4fc3ac8926b3819797a7c0e2631eb889b4118a9898c84f585a54d475b7e40", + "sha256:5beb72339d9d4fa36522fc63802f469b13cdbe4fdab4a288f0c441b74272ebfd", + "sha256:6031dd6dfecc0cf9f668681a37648373bddd6421fff6c66ec1624eed0180ee06", + "sha256:71594f7c51a18e728451bb50cc60a3ce4e6538822731b2933209a1f3614e9282", + "sha256:74d4531beb257d2c3f4b261bfb0fc09e0f9ebb8842d82a7b4209415896adc680", + "sha256:7befc596a7dc9da8a337f79802ee8adb30a552a94f792b9c9d18c840055907db", + "sha256:894b3a42502226a1cac872f840030665f33326fc3dac8e57c607905773cdcde3", + "sha256:8e41fd67c52b86603a91c1a505ebaef50b3314de0213461c7a6e99c9a3beff90", + "sha256:8e9ace4a37db23421249ed236fdcdd457d671e25146786dfc96835cd951aa7c1", + "sha256:8fc377d995680230e83241d8a96def29f204b5782f371c532579b4f20607a289", + "sha256:9551a499bf125c1d4f9e250377c1ee2eddd02e01eac6644c080162c0c51778ab", + "sha256:b0544343a702fa80c95ad5d3d608ea3599dd54d4632df855e4c8d24eb6ecfa1c", + "sha256:b093dd74e50a8cba3e873868d9e93a85b78e0daf2e98c6797566ad8044e8363d", + "sha256:b412caa66f72040e6d268491a59f2c43bf03eb6c96dd8f0307829feb7fa2b6fb", + "sha256:b4f13750ce79751586ae2eb824ba7e1e8dba64784086c98cdbbcc6a42112ce0d", + "sha256:b64d8d4d17135e00c8e346e0a738deb17e754230d7e0810ac5012750bbd85a5a", + "sha256:ba10f8411898fc418a521833e014a77d3ca01c15b0c6cdcce6a0d2897e6dbbdf", + "sha256:bd48227a919f1bafbdda0583705e547892342c26fb127219d60a5c36882609d1", + "sha256:c1f9540be57940698ed329904db803cf7a402f3fc200bfe599334c9bd84a40b2", + "sha256:c820a93b0255bc360f53eca31a0e676fd1101f673dda8da93454a12e23fc5f7a", + "sha256:ce47521a4754c8f4593837384bd3424880629f718d87c5d44f8ed763edd63543", + "sha256:d042d24c90c41b54fd506da306759e06e568864df8ec17ccc17e9e884634fd00", + "sha256:de749064336d37e340f640b05f24e9e3dd678c57318c7289d222a8a2f543e90c", + "sha256:e1dda9c7e08dc141e0247a5b8f49cf05984955246a327d4c48bda16821947b2f", + "sha256:e29554e2bef54a90aa5cc07da6ce955accb83f21ab5de01a62c8478897b264fd", + "sha256:e3143e4451880bed956e706a3220b4e5cf6172ef05fcc397f6f36a550b1dd868", + "sha256:e8213002e427c69c45a52bbd94163084025f533a55a59d6f9c5b820774ef3303", + "sha256:efd28d4e9cd7d7a8d39074a4d44c63eda73401580c5c76acda2ce969e0a38e83", + "sha256:f0fd6321b839904e15c46e0d257fdd101dd7f530fe03fd6359c1ea63738703f3", + "sha256:f1372f041402e37e5e633e586f62aa53de2eac8d98cbfb822806ce4bbefcb74d", + "sha256:f2618db89be1b4e05f7a1a847a9c1c0abd63e63a1607d892dd54668dd92faf87", + "sha256:f447e6acb680fd307f40d3da4852208af94afdfab89cf850986c3ca00562f4fa", + "sha256:f92729c95468a2f4f15e9bb94c432a9229d0d50de67304399627a943201baa2f", + "sha256:f9f1adb22318e121c5c69a09142811a201ef17ab257a1e66ca3025065b7f53ae", + "sha256:fc0c5673685c508a142ca65209b4e79ed6740a4ed6b2267dbba90f34b0b3cfda", + "sha256:fc7b73d02efb0e18c000e9ad8b83480dfcd5dfd11065997ed4c6747470ae8915", + "sha256:fd83c01228a688733f1ded5201c678f0c53ecc1006ffbc404db9f7a899ac6249", + "sha256:fe27749d33bb772c80dcd84ae7e8df2adc920ae8297400dabec45f0dedb3f6de", + "sha256:fee4236c876c4e8369388054d02d0e9bb84821feb1a64dd59e137e6511a551f8" ], "markers": "python_version == '3.11'", - "version": "==2.2.4" + "version": "==2.2.6" }, "packaging": { "hashes": [ - "sha256:09abb1bccd265c01f4a3aa3f7a7db064b36514d2cba19a2f694fe6150451a759", - "sha256:c228a6dc5e932d346bc5739379109d49e8853dd8223571c7c5b55260edc0b97f" + "sha256:29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484", + "sha256:d443872c98d677bf60f6a1f2f8c1cb748e8fe762d2bf9d3148b5599295b0fc4f" ], "markers": "python_version >= '3.8'", - "version": "==24.2" + "version": "==25.0" }, "pandas": { "hashes": [ @@ -1016,19 +709,19 @@ }, "pluggy": { "hashes": [ - "sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1", - "sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669" + "sha256:7dcc130b76258d33b90f61b658791dede3486c3e6bfb003ee5c9bfb396dd22f3", + "sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746" ], - "markers": "python_version >= '3.8'", - "version": "==1.5.0" + "markers": "python_version >= '3.9'", + "version": "==1.6.0" }, "prometheus-client": { "hashes": [ - "sha256:252505a722ac04b0456be05c05f75f45d760c2911ffc45f2a06bcaed9f3ae3fb", - "sha256:594b45c410d6f4f8888940fe80b5cc2521b305a1fafe1c58609ef715a001f301" + "sha256:18da1d2241ac2d10c8d2110f13eedcd5c7c0c8af18c926e8731f04fc10cd575c", + "sha256:c8951bbe64e62b96cd8e8f5d917279d1b9b91ab766793f33d4dce6c228558713" ], - "markers": "python_version >= '3.8'", - "version": "==0.21.1" + "markers": "python_version >= '3.9'", + "version": "==0.22.0" }, "prometheus-flask-exporter": { "hashes": [ @@ -1038,110 +731,6 @@ "index": "pypi", "version": "==0.23.2" }, - "propcache": { - "hashes": [ - "sha256:050b571b2e96ec942898f8eb46ea4bfbb19bd5502424747e83badc2d4a99a44e", - "sha256:05543250deac8e61084234d5fc54f8ebd254e8f2b39a16b1dce48904f45b744b", - "sha256:069e7212890b0bcf9b2be0a03afb0c2d5161d91e1bf51569a64f629acc7defbf", - "sha256:09400e98545c998d57d10035ff623266927cb784d13dd2b31fd33b8a5316b85b", - "sha256:0c3c3a203c375b08fd06a20da3cf7aac293b834b6f4f4db71190e8422750cca5", - "sha256:0c86e7ceea56376216eba345aa1fc6a8a6b27ac236181f840d1d7e6a1ea9ba5c", - "sha256:0fbe94666e62ebe36cd652f5fc012abfbc2342de99b523f8267a678e4dfdee3c", - "sha256:17d1c688a443355234f3c031349da69444be052613483f3e4158eef751abcd8a", - "sha256:19a06db789a4bd896ee91ebc50d059e23b3639c25d58eb35be3ca1cbe967c3bf", - "sha256:1c5c7ab7f2bb3f573d1cb921993006ba2d39e8621019dffb1c5bc94cdbae81e8", - "sha256:1eb34d90aac9bfbced9a58b266f8946cb5935869ff01b164573a7634d39fbcb5", - "sha256:1f6cc0ad7b4560e5637eb2c994e97b4fa41ba8226069c9277eb5ea7101845b42", - "sha256:27c6ac6aa9fc7bc662f594ef380707494cb42c22786a558d95fcdedb9aa5d035", - "sha256:2d219b0dbabe75e15e581fc1ae796109b07c8ba7d25b9ae8d650da582bed01b0", - "sha256:2fce1df66915909ff6c824bbb5eb403d2d15f98f1518e583074671a30fe0c21e", - "sha256:319fa8765bfd6a265e5fa661547556da381e53274bc05094fc9ea50da51bfd46", - "sha256:359e81a949a7619802eb601d66d37072b79b79c2505e6d3fd8b945538411400d", - "sha256:3a02a28095b5e63128bcae98eb59025924f121f048a62393db682f049bf4ac24", - "sha256:3e19ea4ea0bf46179f8a3652ac1426e6dcbaf577ce4b4f65be581e237340420d", - "sha256:3e584b6d388aeb0001d6d5c2bd86b26304adde6d9bb9bfa9c4889805021b96de", - "sha256:40d980c33765359098837527e18eddefc9a24cea5b45e078a7f3bb5b032c6ecf", - "sha256:4114c4ada8f3181af20808bedb250da6bae56660e4b8dfd9cd95d4549c0962f7", - "sha256:43593c6772aa12abc3af7784bff4a41ffa921608dd38b77cf1dfd7f5c4e71371", - "sha256:47ef24aa6511e388e9894ec16f0fbf3313a53ee68402bc428744a367ec55b833", - "sha256:4cf9e93a81979f1424f1a3d155213dc928f1069d697e4353edb8a5eba67c6259", - "sha256:4d0dfdd9a2ebc77b869a0b04423591ea8823f791293b527dc1bb896c1d6f1136", - "sha256:563f9d8c03ad645597b8d010ef4e9eab359faeb11a0a2ac9f7b4bc8c28ebef25", - "sha256:58aa11f4ca8b60113d4b8e32d37e7e78bd8af4d1a5b5cb4979ed856a45e62005", - "sha256:5a0a9898fdb99bf11786265468571e628ba60af80dc3f6eb89a3545540c6b0ef", - "sha256:5aed8d8308215089c0734a2af4f2e95eeb360660184ad3912686c181e500b2e7", - "sha256:5b9145c35cc87313b5fd480144f8078716007656093d23059e8993d3a8fa730f", - "sha256:5cb5918253912e088edbf023788de539219718d3b10aef334476b62d2b53de53", - "sha256:5cdb0f3e1eb6dfc9965d19734d8f9c481b294b5274337a8cb5cb01b462dcb7e0", - "sha256:5ced33d827625d0a589e831126ccb4f5c29dfdf6766cac441d23995a65825dcb", - "sha256:603f1fe4144420374f1a69b907494c3acbc867a581c2d49d4175b0de7cc64566", - "sha256:61014615c1274df8da5991a1e5da85a3ccb00c2d4701ac6f3383afd3ca47ab0a", - "sha256:64a956dff37080b352c1c40b2966b09defb014347043e740d420ca1eb7c9b908", - "sha256:668ddddc9f3075af019f784456267eb504cb77c2c4bd46cc8402d723b4d200bf", - "sha256:6d8e309ff9a0503ef70dc9a0ebd3e69cf7b3894c9ae2ae81fc10943c37762458", - "sha256:6f173bbfe976105aaa890b712d1759de339d8a7cef2fc0a1714cc1a1e1c47f64", - "sha256:71ebe3fe42656a2328ab08933d420df5f3ab121772eef78f2dc63624157f0ed9", - "sha256:730178f476ef03d3d4d255f0c9fa186cb1d13fd33ffe89d39f2cda4da90ceb71", - "sha256:7d2d5a0028d920738372630870e7d9644ce437142197f8c827194fca404bf03b", - "sha256:7f30241577d2fef2602113b70ef7231bf4c69a97e04693bde08ddab913ba0ce5", - "sha256:813fbb8b6aea2fc9659815e585e548fe706d6f663fa73dff59a1677d4595a037", - "sha256:82de5da8c8893056603ac2d6a89eb8b4df49abf1a7c19d536984c8dd63f481d5", - "sha256:83be47aa4e35b87c106fc0c84c0fc069d3f9b9b06d3c494cd404ec6747544894", - "sha256:8638f99dca15b9dff328fb6273e09f03d1c50d9b6512f3b65a4154588a7595fe", - "sha256:87380fb1f3089d2a0b8b00f006ed12bd41bd858fabfa7330c954c70f50ed8757", - "sha256:88c423efef9d7a59dae0614eaed718449c09a5ac79a5f224a8b9664d603f04a3", - "sha256:89498dd49c2f9a026ee057965cdf8192e5ae070ce7d7a7bd4b66a8e257d0c976", - "sha256:8a17583515a04358b034e241f952f1715243482fc2c2945fd99a1b03a0bd77d6", - "sha256:916cd229b0150129d645ec51614d38129ee74c03293a9f3f17537be0029a9641", - "sha256:9532ea0b26a401264b1365146c440a6d78269ed41f83f23818d4b79497aeabe7", - "sha256:967a8eec513dbe08330f10137eacb427b2ca52118769e82ebcfcab0fba92a649", - "sha256:975af16f406ce48f1333ec5e912fe11064605d5c5b3f6746969077cc3adeb120", - "sha256:9979643ffc69b799d50d3a7b72b5164a2e97e117009d7af6dfdd2ab906cb72cd", - "sha256:9a8ecf38de50a7f518c21568c80f985e776397b902f1ce0b01f799aba1608b40", - "sha256:9cec3239c85ed15bfaded997773fdad9fb5662b0a7cbc854a43f291eb183179e", - "sha256:9e64e948ab41411958670f1093c0a57acfdc3bee5cf5b935671bbd5313bcf229", - "sha256:9f64d91b751df77931336b5ff7bafbe8845c5770b06630e27acd5dbb71e1931c", - "sha256:a0ab8cf8cdd2194f8ff979a43ab43049b1df0b37aa64ab7eca04ac14429baeb7", - "sha256:a110205022d077da24e60b3df8bcee73971be9575dec5573dd17ae5d81751111", - "sha256:a34aa3a1abc50740be6ac0ab9d594e274f59960d3ad253cd318af76b996dd654", - "sha256:a444192f20f5ce8a5e52761a031b90f5ea6288b1eef42ad4c7e64fef33540b8f", - "sha256:a461959ead5b38e2581998700b26346b78cd98540b5524796c175722f18b0294", - "sha256:a75801768bbe65499495660b777e018cbe90c7980f07f8aa57d6be79ea6f71da", - "sha256:aa8efd8c5adc5a2c9d3b952815ff8f7710cefdcaf5f2c36d26aff51aeca2f12f", - "sha256:aca63103895c7d960a5b9b044a83f544b233c95e0dcff114389d64d762017af7", - "sha256:b0313e8b923b3814d1c4a524c93dfecea5f39fa95601f6a9b1ac96cd66f89ea0", - "sha256:b23c11c2c9e6d4e7300c92e022046ad09b91fd00e36e83c44483df4afa990073", - "sha256:b303b194c2e6f171cfddf8b8ba30baefccf03d36a4d9cab7fd0bb68ba476a3d7", - "sha256:b655032b202028a582d27aeedc2e813299f82cb232f969f87a4fde491a233f11", - "sha256:bd39c92e4c8f6cbf5f08257d6360123af72af9f4da75a690bef50da77362d25f", - "sha256:bef100c88d8692864651b5f98e871fb090bd65c8a41a1cb0ff2322db39c96c27", - "sha256:c2fe5c910f6007e716a06d269608d307b4f36e7babee5f36533722660e8c4a70", - "sha256:c66d8ccbc902ad548312b96ed8d5d266d0d2c6d006fd0f66323e9d8f2dd49be7", - "sha256:cd6a55f65241c551eb53f8cf4d2f4af33512c39da5d9777694e9d9c60872f519", - "sha256:d249609e547c04d190e820d0d4c8ca03ed4582bcf8e4e160a6969ddfb57b62e5", - "sha256:d4e89cde74154c7b5957f87a355bb9c8ec929c167b59c83d90654ea36aeb6180", - "sha256:dc1915ec523b3b494933b5424980831b636fe483d7d543f7afb7b3bf00f0c10f", - "sha256:e1c4d24b804b3a87e9350f79e2371a705a188d292fd310e663483af6ee6718ee", - "sha256:e474fc718e73ba5ec5180358aa07f6aded0ff5f2abe700e3115c37d75c947e18", - "sha256:e4fe2a6d5ce975c117a6bb1e8ccda772d1e7029c1cca1acd209f91d30fa72815", - "sha256:e7fb9a84c9abbf2b2683fa3e7b0d7da4d8ecf139a1c635732a8bda29c5214b0e", - "sha256:e861ad82892408487be144906a368ddbe2dc6297074ade2d892341b35c59844a", - "sha256:ec314cde7314d2dd0510c6787326bbffcbdc317ecee6b7401ce218b3099075a7", - "sha256:ed5f6d2edbf349bd8d630e81f474d33d6ae5d07760c44d33cd808e2f5c8f4ae6", - "sha256:ef2e4e91fb3945769e14ce82ed53007195e616a63aa43b40fb7ebaaf907c8d4c", - "sha256:f011f104db880f4e2166bcdcf7f58250f7a465bc6b068dc84c824a3d4a5c94dc", - "sha256:f1528ec4374617a7a753f90f20e2f551121bb558fcb35926f99e3c42367164b8", - "sha256:f27785888d2fdd918bc36de8b8739f2d6c791399552333721b58193f68ea3e98", - "sha256:f35c7070eeec2cdaac6fd3fe245226ed2a6292d3ee8c938e5bb645b434c5f256", - "sha256:f3bbecd2f34d0e6d3c543fdb3b15d6b60dd69970c2b4c822379e5ec8f6f621d5", - "sha256:f6f1324db48f001c2ca26a25fa25af60711e09b9aaf4b28488602776f4f9a744", - "sha256:f78eb8422acc93d7b69964012ad7048764bb45a54ba7a39bb9e146c72ea29723", - "sha256:fb6e0faf8cb6b4beea5d6ed7b5a578254c6d7df54c36ccd3d8b3eb00d6770277", - "sha256:feccd282de1f6322f56f6845bf1207a537227812f0a9bf5571df52bb418d79d5" - ], - "markers": "python_version >= '3.9'", - "version": "==0.3.1" - }, "pycparser": { "hashes": [ "sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6", @@ -1152,116 +741,116 @@ }, "pydantic": { "hashes": [ - "sha256:7471657138c16adad9322fe3070c0116dd6c3ad8d649300e3cbdfe91f4db4ec3", - "sha256:a082753436a07f9ba1289c6ffa01cd93db3548776088aa917cc43b63f68fa60f" + "sha256:32738d19d63a226a52eed76645a98ee07c1f410ee41d93b4afbfa85ed8111c2d", + "sha256:d9615eaa9ac5a063471da949c8fc16376a84afb5024688b3ff885693506764eb" ], "index": "pypi", - "version": "==2.11.3" + "version": "==2.11.4" }, "pydantic-core": { "hashes": [ - "sha256:0483847fa9ad5e3412265c1bd72aad35235512d9ce9d27d81a56d935ef489672", - "sha256:048831bd363490be79acdd3232f74a0e9951b11b2b4cc058aeb72b22fdc3abe1", - "sha256:048c01eee07d37cbd066fc512b9d8b5ea88ceeb4e629ab94b3e56965ad655add", - "sha256:049e0de24cf23766f12cc5cc71d8abc07d4a9deb9061b334b62093dedc7cb068", - "sha256:08530b8ac922003033f399128505f513e30ca770527cc8bbacf75a84fcc2c74b", - "sha256:0fb935c5591573ae3201640579f30128ccc10739b45663f93c06796854405505", - "sha256:1293d7febb995e9d3ec3ea09caf1a26214eec45b0f29f6074abb004723fc1de8", - "sha256:177d50460bc976a0369920b6c744d927b0ecb8606fb56858ff542560251b19e5", - "sha256:1a28239037b3d6f16916a4c831a5a0eadf856bdd6d2e92c10a0da3a59eadcf3e", - "sha256:1b30d92c9412beb5ac6b10a3eb7ef92ccb14e3f2a8d7732e2d739f58b3aa7544", - "sha256:1c607801d85e2e123357b3893f82c97a42856192997b95b4d8325deb1cd0c5f4", - "sha256:1d20eb4861329bb2484c021b9d9a977566ab16d84000a57e28061151c62b349a", - "sha256:1dfae24cf9921875ca0ca6a8ecb4bb2f13c855794ed0d468d6abbec6e6dcd44a", - "sha256:25626fb37b3c543818c14821afe0fd3830bc327a43953bc88db924b68c5723f1", - "sha256:282b3fe1bbbe5ae35224a0dbd05aed9ccabccd241e8e6b60370484234b456266", - "sha256:2ea62419ba8c397e7da28a9170a16219d310d2cf4970dbc65c32faf20d828c83", - "sha256:2f593494876eae852dc98c43c6f260f45abdbfeec9e4324e31a481d948214764", - "sha256:2f9284e11c751b003fd4215ad92d325d92c9cb19ee6729ebd87e3250072cdcde", - "sha256:3077cfdb6125cc8dab61b155fdd714663e401f0e6883f9632118ec12cf42df26", - "sha256:32cd11c5914d1179df70406427097c7dcde19fddf1418c787540f4b730289896", - "sha256:338ea9b73e6e109f15ab439e62cb3b78aa752c7fd9536794112e14bee02c8d18", - "sha256:35a5ec3fa8c2fe6c53e1b2ccc2454398f95d5393ab398478f53e1afbbeb4d939", - "sha256:398a38d323f37714023be1e0285765f0a27243a8b1506b7b7de87b647b517e48", - "sha256:3a371dc00282c4b84246509a5ddc808e61b9864aa1eae9ecc92bb1268b82db4a", - "sha256:3a64e81e8cba118e108d7126362ea30e021291b7805d47e4896e52c791be2761", - "sha256:3ab2d36e20fbfcce8f02d73c33a8a7362980cff717926bbae030b93ae46b56c7", - "sha256:3f1fdb790440a34f6ecf7679e1863b825cb5ffde858a9197f851168ed08371e5", - "sha256:3f2648b9262607a7fb41d782cc263b48032ff7a03a835581abbf7a3bec62bcf5", - "sha256:401d7b76e1000d0dd5538e6381d28febdcacb097c8d340dde7d7fc6e13e9f95d", - "sha256:495bc156026efafd9ef2d82372bd38afce78ddd82bf28ef5276c469e57c0c83e", - "sha256:4b315e596282bbb5822d0c7ee9d255595bd7506d1cb20c2911a4da0b970187d3", - "sha256:5183e4f6a2d468787243ebcd70cf4098c247e60d73fb7d68d5bc1e1beaa0c4db", - "sha256:5277aec8d879f8d05168fdd17ae811dd313b8ff894aeeaf7cd34ad28b4d77e33", - "sha256:52928d8c1b6bda03cc6d811e8923dffc87a2d3c8b3bfd2ce16471c7147a24850", - "sha256:549150be302428b56fdad0c23c2741dcdb5572413776826c965619a25d9c6bde", - "sha256:5773da0ee2d17136b1f1c6fbde543398d452a6ad2a7b54ea1033e2daa739b8d2", - "sha256:5ab77f45d33d264de66e1884fca158bc920cb5e27fd0764a72f72f5756ae8bdb", - "sha256:5c834f54f8f4640fd7e4b193f80eb25a0602bba9e19b3cd2fc7ffe8199f5ae02", - "sha256:5ccd429694cf26af7997595d627dd2637e7932214486f55b8a357edaac9dae8c", - "sha256:681d65e9011f7392db5aa002b7423cc442d6a673c635668c227c6c8d0e5a4f77", - "sha256:694ad99a7f6718c1a498dc170ca430687a39894a60327f548e02a9c7ee4b6504", - "sha256:6dd8ecfde08d8bfadaea669e83c63939af76f4cf5538a72597016edfa3fad516", - "sha256:6e966fc3caaf9f1d96b349b0341c70c8d6573bf1bac7261f7b0ba88f96c56c24", - "sha256:70af6a21237b53d1fe7b9325b20e65cbf2f0a848cf77bed492b029139701e66a", - "sha256:723c5630c4259400818b4ad096735a829074601805d07f8cafc366d95786d331", - "sha256:7965c13b3967909a09ecc91f21d09cfc4576bf78140b988904e94f130f188396", - "sha256:7aeb055a42d734c0255c9e489ac67e75397d59c6fbe60d155851e9782f276a9c", - "sha256:7edbc454a29fc6aeae1e1eecba4f07b63b8d76e76a748532233c4c167b4cb9ea", - "sha256:7fb66263e9ba8fea2aa85e1e5578980d127fb37d7f2e292773e7bc3a38fb0c7b", - "sha256:87d3776f0001b43acebfa86f8c64019c043b55cc5a6a2e313d728b5c95b46969", - "sha256:8ab581d3530611897d863d1a649fb0644b860286b4718db919bfd51ece41f10b", - "sha256:8d13f0276806ee722e70a1c93da19748594f19ac4299c7e41237fc791d1861ea", - "sha256:8ffab8b2908d152e74862d276cf5017c81a2f3719f14e8e3e8d6b83fda863927", - "sha256:902dbc832141aa0ec374f4310f1e4e7febeebc3256f00dc359a9ac3f264a45dc", - "sha256:9097b9f17f91eea659b9ec58148c0747ec354a42f7389b9d50701610d86f812e", - "sha256:91815221101ad3c6b507804178a7bb5cb7b2ead9ecd600041669c8d805ebd595", - "sha256:948b73114f47fd7016088e5186d13faf5e1b2fe83f5e320e371f035557fd264d", - "sha256:99b56acd433386c8f20be5c4000786d1e7ca0523c8eefc995d14d79c7a081498", - "sha256:9d3da303ab5f378a268fa7d45f37d7d85c3ec19769f28d2cc0c61826a8de21fe", - "sha256:9f466e8bf0a62dc43e068c12166281c2eca72121dd2adc1040f3aa1e21ef8599", - "sha256:9fea9c1869bb4742d174a57b4700c6dadea951df8b06de40c2fedb4f02931c2e", - "sha256:a0d5f3acc81452c56895e90643a625302bd6be351e7010664151cc55b7b97f89", - "sha256:a3edde68d1a1f9af1273b2fe798997b33f90308fb6d44d8550c89fc6a3647cf6", - "sha256:a62c3c3ef6a7e2c45f7853b10b5bc4ddefd6ee3cd31024754a1a5842da7d598d", - "sha256:aa687a23d4b7871a00e03ca96a09cad0f28f443690d300500603bd0adba4b523", - "sha256:ab0277cedb698749caada82e5d099dc9fed3f906a30d4c382d1a21725777a1e5", - "sha256:ad05b683963f69a1d5d2c2bdab1274a31221ca737dbbceaa32bcb67359453cdd", - "sha256:b172f7b9d2f3abc0efd12e3386f7e48b576ef309544ac3a63e5e9cdd2e24585d", - "sha256:b1caa0bc2741b043db7823843e1bde8aaa58a55a58fda06083b0569f8b45693a", - "sha256:bae370459da6a5466978c0eacf90690cb57ec9d533f8e63e564ef3822bfa04fe", - "sha256:bcc9c6fdb0ced789245b02b7d6603e17d1563064ddcfc36f046b61c0c05dd9df", - "sha256:bdc84017d28459c00db6f918a7272a5190bec3090058334e43a76afb279eac7c", - "sha256:bfd0adeee563d59c598ceabddf2c92eec77abcb3f4a391b19aa7366170bd9e30", - "sha256:c566dd9c5f63d22226409553531f89de0cac55397f2ab8d97d6f06cfce6d947e", - "sha256:c91dbb0ab683fa0cd64a6e81907c8ff41d6497c346890e26b23de7ee55353f96", - "sha256:c964fd24e6166420d18fb53996d8c9fd6eac9bf5ae3ec3d03015be4414ce497f", - "sha256:cc77ec5b7e2118b152b0d886c7514a4653bcb58c6b1d760134a9fab915f777b3", - "sha256:d100e3ae783d2167782391e0c1c7a20a31f55f8015f3293647544df3f9c67824", - "sha256:d3a07fadec2a13274a8d861d3d37c61e97a816beae717efccaa4b36dfcaadcde", - "sha256:d5e3d15245b08fa4a84cefc6c9222e6f37c98111c8679fbd94aa145f9a0ae23d", - "sha256:de9e06abe3cc5ec6a2d5f75bc99b0bdca4f5c719a5b34026f8c57efbdecd2ee3", - "sha256:df6a94bf9452c6da9b5d76ed229a5683d0306ccb91cca8e1eea883189780d568", - "sha256:e100c52f7355a48413e2999bfb4e139d2977a904495441b374f3d4fb4a170961", - "sha256:e11f3864eb516af21b01e25fac915a82e9ddad3bb0fb9e95a246067398b435a4", - "sha256:e14f369c98a7c15772b9da98987f58e2b509a93235582838bd0d1d8c08b68fda", - "sha256:e3de2777e3b9f4d603112f78006f4ae0acb936e95f06da6cb1a45fbad6bdb4b5", - "sha256:e7aaba1b4b03aaea7bb59e1b5856d734be011d3e6d98f5bcaa98cb30f375f2ad", - "sha256:ec259f62538e8bf364903a7d0d0239447059f9434b284f5536e8402b7dd198db", - "sha256:ec79de2a8680b1a67a07490bddf9636d5c2fab609ba8c57597e855fa5fa4dacd", - "sha256:ed3eb16d51257c763539bde21e011092f127a2202692afaeaccb50db55a31383", - "sha256:ede9b407e39949d2afc46385ce6bd6e11588660c26f80576c11c958e6647bc40", - "sha256:ee12a7be1742f81b8a65b36c6921022301d466b82d80315d215c4c691724986f", - "sha256:ef99779001d7ac2e2461d8ab55d3373fe7315caefdbecd8ced75304ae5a6fc6b", - "sha256:f59295ecc75a1788af8ba92f2e8c6eeaa5a94c22fc4d151e8d9638814f85c8fc", - "sha256:f995719707e0e29f0f41a8aa3bcea6e761a36c9136104d3189eafb83f5cec5e5", - "sha256:f99aeda58dce827f76963ee87a0ebe75e648c72ff9ba1174a253f6744f518f65", - "sha256:fc6bf8869e193855e8d91d91f6bf59699a5cdfaa47a404e278e776dd7f168b39", - "sha256:fc903512177361e868bc1f5b80ac8c8a6e05fcdd574a5fb5ffeac5a9982b9e89", - "sha256:fe44d56aa0b00d66640aa84a3cbe80b7a3ccdc6f0b1ca71090696a6d4777c091" + "sha256:0069c9acc3f3981b9ff4cdfaf088e98d83440a4c7ea1bc07460af3d4dc22e72d", + "sha256:031c57d67ca86902726e0fae2214ce6770bbe2f710dc33063187a68744a5ecac", + "sha256:0405262705a123b7ce9f0b92f123334d67b70fd1f20a9372b907ce1080c7ba02", + "sha256:04a1a413977ab517154eebb2d326da71638271477d6ad87a769102f7c2488c56", + "sha256:09fb9dd6571aacd023fe6aaca316bd01cf60ab27240d7eb39ebd66a3a15293b4", + "sha256:0a39979dcbb70998b0e505fb1556a1d550a0781463ce84ebf915ba293ccb7e22", + "sha256:0a9f2c9dd19656823cb8250b0724ee9c60a82f3cdf68a080979d13092a3b0fef", + "sha256:0e03262ab796d986f978f79c943fc5f620381be7287148b8010b4097f79a39ec", + "sha256:0e5b2671f05ba48b94cb90ce55d8bdcaaedb8ba00cc5359f6810fc918713983d", + "sha256:0e6116757f7959a712db11f3e9c0a99ade00a5bbedae83cb801985aa154f071b", + "sha256:0fb2d542b4d66f9470e8065c5469ec676978d625a8b7a363f07d9a501a9cb36a", + "sha256:1082dd3e2d7109ad8b7da48e1d4710c8d06c253cbc4a27c1cff4fbcaa97a9e3f", + "sha256:1a8695a8d00c73e50bff9dfda4d540b7dee29ff9b8053e38380426a85ef10052", + "sha256:1e063337ef9e9820c77acc768546325ebe04ee38b08703244c1309cccc4f1bab", + "sha256:1ea40a64d23faa25e62a70ad163571c0b342b8bf66d5fa612ac0dec4f069d916", + "sha256:2058a32994f1fde4ca0480ab9d1e75a0e8c87c22b53a3ae66554f9af78f2fe8c", + "sha256:235f45e5dbcccf6bd99f9f472858849f73d11120d76ea8707115415f8e5ebebf", + "sha256:2807668ba86cb38c6817ad9bc66215ab8584d1d304030ce4f0887336f28a5e27", + "sha256:2b0a451c263b01acebe51895bfb0e1cc842a5c666efe06cdf13846c7418caa9a", + "sha256:2b3d326aaef0c0399d9afffeb6367d5e26ddc24d351dbc9c636840ac355dc5d8", + "sha256:2bfb5112df54209d820d7bf9317c7a6c9025ea52e49f46b6a2060104bba37de7", + "sha256:2f82865531efd18d6e07a04a17331af02cb7a651583c418df8266f17a63c6612", + "sha256:329467cecfb529c925cf2bbd4d60d2c509bc2fb52a20c1045bf09bb70971a9c1", + "sha256:3a1c81334778f9e3af2f8aeb7a960736e5cab1dfebfb26aabca09afd2906c039", + "sha256:3abcd9392a36025e3bd55f9bd38d908bd17962cc49bc6da8e7e96285336e2bca", + "sha256:3c6db6e52c6d70aa0d00d45cdb9b40f0433b96380071ea80b09277dba021ddf7", + "sha256:3dc625f4aa79713512d1976fe9f0bc99f706a9dee21dfd1810b4bbbf228d0e8a", + "sha256:3eb3fe62804e8f859c49ed20a8451342de53ed764150cb14ca71357c765dc2a6", + "sha256:44857c3227d3fb5e753d5fe4a3420d6376fa594b07b621e220cd93703fe21782", + "sha256:4b25d91e288e2c4e0662b8038a28c6a07eaac3e196cfc4ff69de4ea3db992a1b", + "sha256:4c5b0a576fb381edd6d27f0a85915c6daf2f8138dc5c267a57c08a62900758c7", + "sha256:4e61206137cbc65e6d5256e1166f88331d3b6238e082d9f74613b9b765fb9025", + "sha256:52fb90784e0a242bb96ec53f42196a17278855b0f31ac7c3cc6f5c1ec4811849", + "sha256:53a57d2ed685940a504248187d5685e49eb5eef0f696853647bf37c418c538f7", + "sha256:572c7e6c8bb4774d2ac88929e3d1f12bc45714ae5ee6d9a788a9fb35e60bb04b", + "sha256:5c4aa4e82353f65e548c476b37e64189783aa5384903bfea4f41580f255fddfa", + "sha256:5c92edd15cd58b3c2d34873597a1e20f13094f59cf88068adb18947df5455b4e", + "sha256:5f483cfb75ff703095c59e365360cb73e00185e01aaea067cd19acffd2ab20ea", + "sha256:61c18fba8e5e9db3ab908620af374db0ac1baa69f0f32df4f61ae23f15e586ac", + "sha256:6368900c2d3ef09b69cb0b913f9f8263b03786e5b2a387706c5afb66800efd51", + "sha256:64632ff9d614e5eecfb495796ad51b0ed98c453e447a76bcbeeb69615079fc7e", + "sha256:65132b7b4a1c0beded5e057324b7e16e10910c106d43675d9bd87d4f38dde162", + "sha256:6b99022f1d19bc32a4c2a0d544fc9a76e3be90f0b3f4af413f87d38749300e65", + "sha256:6bdfe4b3789761f3bcb4b1ddf33355a71079858958e3a552f16d5af19768fef2", + "sha256:6fa6dfc3e4d1f734a34710f391ae822e0a8eb8559a85c6979e14e65ee6ba2954", + "sha256:73662edf539e72a9440129f231ed3757faab89630d291b784ca99237fb94db2b", + "sha256:73cf6373c21bc80b2e0dc88444f41ae60b2f070ed02095754eb5a01df12256de", + "sha256:7cb8bc3605c29176e1b105350d2e6474142d7c1bd1d9327c4a9bdb46bf827acc", + "sha256:7f92c15cd1e97d4b12acd1cc9004fa092578acfa57b67ad5e43a197175d01a64", + "sha256:82f68293f055f51b51ea42fafc74b6aad03e70e191799430b90c13d643059ebb", + "sha256:83aa99b1285bc8f038941ddf598501a86f1536789740991d7d8756e34f1e74d9", + "sha256:87acbfcf8e90ca885206e98359d7dca4bcbb35abdc0ff66672a293e1d7a19101", + "sha256:87b31b6846e361ef83fedb187bb5b4372d0da3f7e28d85415efa92d6125d6e6d", + "sha256:881b21b5549499972441da4758d662aeea93f1923f953e9cbaff14b8b9565aef", + "sha256:8d55ab81c57b8ff8548c3e4947f119551253f4e3787a7bbc0b6b3ca47498a9d3", + "sha256:8f57a69461af2a5fa6e6bbd7a5f60d3b7e6cebb687f55106933188e79ad155c1", + "sha256:95237e53bb015f67b63c91af7518a62a8660376a6a0db19b89acc77a4d6199f5", + "sha256:96081f1605125ba0855dfda83f6f3df5ec90c61195421ba72223de35ccfb2f88", + "sha256:970919794d126ba8645f3837ab6046fb4e72bbc057b3709144066204c19a455d", + "sha256:9cb1da0f5a471435a7bc7e439b8a728e8b61e59784b2af70d7c169f8dd8ae290", + "sha256:9fcd347d2cc5c23b06de6d3b7b8275be558a0c90549495c699e379a80bf8379e", + "sha256:9fdac5d6ffa1b5a83bca06ffe7583f5576555e6c8b3a91fbd25ea7780f825f7d", + "sha256:a11c8d26a50bfab49002947d3d237abe4d9e4b5bdc8846a63537b6488e197808", + "sha256:a144d4f717285c6d9234a66778059f33a89096dfb9b39117663fd8413d582dcc", + "sha256:a2b911a5b90e0374d03813674bf0a5fbbb7741570dcd4b4e85a2e48d17def29d", + "sha256:a7ec89dc587667f22b6a0b6579c249fca9026ce7c333fc142ba42411fa243cdc", + "sha256:aa9d91b338f2df0508606f7009fde642391425189bba6d8c653afd80fd6bb64e", + "sha256:b0379a2b24882fef529ec3b4987cb5d003b9cda32256024e6fe1586ac45fc640", + "sha256:bc7aee6f634a6f4a95676fcb5d6559a2c2a390330098dba5e5a5f28a2e4ada30", + "sha256:bdc25f3681f7b78572699569514036afe3c243bc3059d3942624e936ec93450e", + "sha256:c083a3bdd5a93dfe480f1125926afcdbf2917ae714bdb80b36d34318b2bec5d9", + "sha256:c20c462aa4434b33a2661701b861604913f912254e441ab8d78d30485736115a", + "sha256:c2fc0a768ef76c15ab9238afa6da7f69895bb5d1ee83aeea2e3509af4472d0b9", + "sha256:c52b02ad8b4e2cf14ca7b3d918f3eb0ee91e63b3167c32591e57c4317e134f8f", + "sha256:c54c939ee22dc8e2d545da79fc5381f1c020d6d3141d3bd747eab59164dc89fb", + "sha256:c8e7af2f4e0194c22b5b37205bfb293d166a7344a5b0d0eaccebc376546d77d5", + "sha256:cca3868ddfaccfbc4bfb1d608e2ccaaebe0ae628e1416aeb9c4d88c001bb45ab", + "sha256:d3f26877a748dc4251cfcfda9dfb5f13fcb034f5308388066bcfe9031b63ae7d", + "sha256:d53b22f2032c42eaaf025f7c40c2e3b94568ae077a606f006d206a463bc69572", + "sha256:d87c561733f66531dced0da6e864f44ebf89a8fba55f31407b00c2f7f9449593", + "sha256:d946c8bf0d5c24bf4fe333af284c59a19358aa3ec18cb3dc4370080da1e8ad29", + "sha256:dac89aea9af8cd672fa7b510e7b8c33b0bba9a43186680550ccf23020f32d535", + "sha256:db4b41f9bd95fbe5acd76d89920336ba96f03e149097365afe1cb092fceb89a1", + "sha256:dc46a01bf8d62f227d5ecee74178ffc448ff4e5197c756331f71efcc66dc980f", + "sha256:dd14041875d09cc0f9308e37a6f8b65f5585cf2598a53aa0123df8b129d481f8", + "sha256:de4b83bb311557e439b9e186f733f6c645b9417c84e2eb8203f3f820a4b988bf", + "sha256:e799c050df38a639db758c617ec771fd8fb7a5f8eaaa4b27b101f266b216a246", + "sha256:e80b087132752f6b3d714f041ccf74403799d3b23a72722ea2e6ba2e892555b9", + "sha256:eb8c529b2819c37140eb51b914153063d27ed88e3bdc31b71198a198e921e011", + "sha256:eb9b459ca4df0e5c87deb59d37377461a538852765293f9e6ee834f0435a93b9", + "sha256:efec8db3266b76ef9607c2c4c419bdb06bf335ae433b80816089ea7585816f6a", + "sha256:f481959862f57f29601ccced557cc2e817bce7533ab8e01a797a48b49c9692b3", + "sha256:f517ca031dfc037a9c07e748cefd8d96235088b83b4f4ba8939105d20fa1dcd6", + "sha256:f889f7a40498cc077332c7ab6b4608d296d852182211787d4f3ee377aaae66e8", + "sha256:f8de619080e944347f5f20de29a975c2d815d9ddd8be9b9b7268e2e3ef68605a", + "sha256:f941635f2a3d96b2973e867144fde513665c87f13fe0e193c158ac51bfaaa7b2", + "sha256:fa754d1850735a0b0e03bcffd9d4b4343eb417e47196e4485d9cca326073a42c", + "sha256:fa854f5cf7e33842a892e5c73f45327760bc7bc516339fda888c75ae60edaeb6", + "sha256:fe5b32187cbc0c862ee201ad66c30cf218e5ed468ec8dc1cf49dec66e160cc4d" ], "markers": "python_version >= '3.9'", - "version": "==2.33.1" + "version": "==2.33.2" }, "pyjwt": { "hashes": [ @@ -1284,7 +873,7 @@ "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3", "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427" ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2'", + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", "version": "==2.9.0.post0" }, "python-dotenv": { @@ -1363,104 +952,104 @@ }, "qh3": { "hashes": [ - "sha256:0125a69720b3a436fbf3ce1f5e4c7a8b48858360e037bfab19cd16465d9fe325", - "sha256:0561f53b5d3727d2306762ee9d03381763febf34bab2ced8490ad57c6facb025", - "sha256:0af6d7b5a02da5e53f2534c051e05f7a895c4842735d2d83e546962534fbfe7a", - "sha256:0b9d66f05d396b7ab49aabbd7ecfa8248e2be6afac49dda80cd5ddcc509a5183", - "sha256:121ddb3d5b98a4a91636b1609d5de5e3026dbe45b8c2036bce38be5827be2e49", - "sha256:1ec470854283a88364549019aa59eb0a97f3d394cee4df90a7279fd9ec11b8ff", - "sha256:1fac05a823b7d244a44b5f1e14c8afa45488e8b9bfc7bf4f3e7f7bbe82b3f7be", - "sha256:20b6f7423ce21649aefb0cc5085620c2a9fedcce5ae8c3d85fb65b0e8814706a", - "sha256:236e9fda8ebab9f8295a9161a02c387d21a9f08d87da1880ff26c983c84db073", - "sha256:23dd497adb4278680c25bcdaebadbe04e6b2a8922e6e9d61e2697452a1a762ac", - "sha256:266a000569966f44005a43002ac6bbadd82e48f9edab2c024a41210dc2f3e7c1", - "sha256:2759963b4c6882d935bdf0acbaeed7d3ad60ccdcf9445481ca9681f534d30907", - "sha256:2bae7c280599ee9c97406d165ede9a1f7a54a59d4770d0d4d951e85132adc192", - "sha256:30778f9028ed4dbff9d395e14b0665358446dd1c0797f8053eb71b6bdb7f7ed5", - "sha256:334955044a5d9458521f054748d8fa6830d3cea4c5af8803846d1211536375f1", - "sha256:390ee1a67c377cdb3b97e4d12da1898fd2d0355fa56296df980e8a559a943182", - "sha256:393a3a63c6b6ea92663ed6009d9fd317d03dd5054e68f43428eb4f683ef1bd64", - "sha256:3cb8ea722dc62e953437163a2d28251b9588210e96e629847e66b845bc28ca9d", - "sha256:3cc67e18046d274b38a77331b776d07087e1f96ee31525a977798fa975a653ed", - "sha256:3d2ebe0176e82104aa19bf25b4cdb9630bb5e3d7cb7771d18a474d34927f39e9", - "sha256:40bb818fbaa01cdfcbe9db4bc1deb43ecd5461d2a124af2ceeb2adf4ddfff605", - "sha256:446a4f6adfb41aa769083417e9eaed89f5af5b60051a4ffab4aa78aecd966f3a", - "sha256:446d288ce2c29c542f86ce13912c15a862571455c0bbb067ec2e7966ea90d55a", - "sha256:48e2cabaa621ae34cd98caaf1b114fb6ce893ef5d222189eff1edea285073519", - "sha256:4d9911d8684a5f45e4f18a744577386e60287cf18a0196dff88ffe9152410ba4", - "sha256:4e5bdb8ac8a6770fa6c4940bee92db6c1eebce51ef856a65038207dfb84013d9", - "sha256:50f8dd5b7423eb3c8cc74d0fd9b5df1214afe3bc9b86f9043d9721d5e722ea78", - "sha256:51a55d1a1b21c54ed67c65bf6f9a4e8aabb616579518062f4d7c0ea883fdfa34", - "sha256:537386ab886915d9a7abb5c7754aeef8e07ac04a23c5a3cc6a0a9a9f2c0fc6ec", - "sha256:55b9cdffa46ef9ad2478e5cd38bfc2d582da07a40a75dc4d02a44499409a983b", - "sha256:56a444ddc7b8ca670c81b333639a8a059b0eef34801ee528a4598b1e130b99c9", - "sha256:5d6eb5574be188181f8af56e2593daeca26c81d805752a5589039d7e1abb7e04", - "sha256:5dd7b2cc5169ac63e2e3b2ce913e5a8ff88da1f3658bbfdf1d0defef4e8f071e", - "sha256:5efca680dcce979355cd4f11b1270383869a21ac57b7b54a7074b2d0ad732acd", - "sha256:5f26bf8f7d3af25baae0e54523304d205f187643b60f1cb002356dbf81a6a6e8", - "sha256:62c1c38258ddb949f068cd1b5b19a6f33d3020d1864b5aafef7e5ddad04ed3ce", - "sha256:6d82486d855b03423b7ccb1c176b511a490568de3565b5632d139f092f7d6852", - "sha256:70c26db8495acd44adab970df902a5446566eb5e10265b6bceb417cae051a1d8", - "sha256:7172f94689f75f5bdf71656707af138b6429496ce6943839e2b275dadd270e7e", - "sha256:72d883bf3048375aaa6283a8c7dfa98764ec014466589408b66a7b520b5bd08b", - "sha256:7417e76526930a81db7dffe9b7178ca8d62f470aabe98264d131222404a77b11", - "sha256:799c20c623802eb9d74d0de7b698bc9822b8949d724728cfad3d787b3f076973", - "sha256:79ca66272b93ad9605e1f510a2f98660a2e5afce395d27ec877e41e6db718562", - "sha256:7af0facc1843e390752dbffa34975ed6ebfa0d614e87f2b21730b81e324524b6", - "sha256:7c7509a10cfb8d0b7f611c598c9a22154505b4cf653fab5900378807958db611", - "sha256:802ca75ed7c79c7e2bf7ce92c038006b8c458dccbd4922fac05044ae7e6db9fb", - "sha256:8688dfc27bfff0e0caaece83e9b1b29605a41fb582df924a9b5486cf19d667fb", - "sha256:8b70f085cbfd5685e4d923d451302934897a0c9e8707e1dd9c4955aaea254f87", - "sha256:8dd09a4559fc689a52b9712e4887fcf5f930633d14a463de05380bd01da27529", - "sha256:8e84916b4b1a7f397de0ff9870baff5a5b5b59841a55d3e3ae5759d3b490f653", - "sha256:91d6a93b5c370d014f87b50a28e6cda6b2391eb8e4c6129f431e0797b721d396", - "sha256:9c4d198f84d77931f2a20339f746d8e9f3d9f202b85c680797945efda2cdb122", - "sha256:a0ad122255a9600918af163d55c62d2df5364967faa29f1256bf46e6b565cd5b", - "sha256:a3cd011751106526fe7fd7dfebc6381ce360fc82a67a030eaa88f374d589570d", - "sha256:a4143112727ebfa554c6b484bc4b84344c68137af77159fca28360f52ee65880", - "sha256:a527160ccbb9dedb233aa477a59c33b15fd59516c5774657e2d5686296f18528", - "sha256:ab29da155e5d858b4f5d1f52726bbf183b737bf96b5dc35e45ce5bd7e8fcef41", - "sha256:acf34cd529a0499abc5eef651baf25f6eed42c35d878872bbfd07fbf7e9a85f6", - "sha256:b22c709f5774d9fe6b25c4369fe1e6e5c80c47fa97e5a782a0a82c781c45b580", - "sha256:b26c3de5a2cb48480e62ded0c46f58143791b57a2031b954e116a21f6a810a14", - "sha256:b46946d5f60bbc43ae31f267cf607443de63c33d8b3b516bc2c0ee34dbeadde9", - "sha256:b5104913760767bab5369f7fc283cdb8a6cdf3da38ef645af14411e4096456f3", - "sha256:b72d0b5b3e9d2aa3cf8cf689b2dce7eed401d8bd7e1adabd224d5ae41bb1c873", - "sha256:b811e388e48e386f7f35005c6f3cfa099ddf1eb35f0592dc6266dfb7e53e1760", - "sha256:cf1fef4feaba719974aa4421acbf373f83669b2c4c51747415076f40ff380de3", - "sha256:d1a21656bb7ff6150e8a6dd4eb6327221521b9942239e7ea7d62660185b1114a", - "sha256:d28a94ce57860103b2e2a1aae071fdd47c2c6b84ac88f18ef1eb4e47fb59f9cd", - "sha256:d482c8d92e137f7227aebe4f49c9add93cdb0ae032bf0a8a00bdda5157239483", - "sha256:d637c80cf19b2738413f2b694d3b3a69f0a2d68eb00489bb51b9dd8b78e8e8ee", - "sha256:d74018ef46ea1ec16b8561d1a3f7dd4c8628b6e3f63b80d364e8bbea0bae1de3", - "sha256:d7ac6781c945b05f06cb237ef99ef63b21f578e973dcda72b363931d5c4bf453", - "sha256:d7b35a5d79eb78ca2bb8490f4a3c6948dd5c6e9c8884241edb8597c0c4135fc4", - "sha256:d7e71a3e2d0116408d1f7a86b415014677fa4d6c3a873cf7344123abaf97792e", - "sha256:da5b5bdbfc2bfc2ed8af4dbd03a7dd1612acf64ca62ca1b4fca1292807bbedcd", - "sha256:dc0eee7abd896f0e8d483d7d129b1ff201bc6a358b2a6b6e41f95af41c62956d", - "sha256:df1866347cab2b97e427d61540342b58461797ca30a573a4ee19dd9ddd932fd8", - "sha256:e29c30106bccef52764ca5003be91001a28c132ff47a03caadc9ed33e66d5156", - "sha256:e44345527484f7cf0674788c78d44820bd499d04c42bff7984fd1f9bbf962964", - "sha256:e462cb1a4ba08cc17da3e7f6431d666518ef38b256322812a47272f8c4157e88", - "sha256:e4b607940929d9151c3d3bcce4d02cbebdc246a17afd16dfa32d2ae1ab1fdc01", - "sha256:e7f9ee153dd48804d0c3070c7c52f8863cf7e903ddecc5646a1e1798b2e41389", - "sha256:e948de73b71a35910aee9e62acbabf56c7ecba29da83e99f740bd37d36672d41", - "sha256:ea099fba44dc4ee54254fc9c9d9a51beea62f5d25266dc2b0eb3e1762505704e", - "sha256:ea238a5e3e140104917781c4cabaad42e26a2ddc973899f2d3af295c4cc9e061", - "sha256:ed5c9c36dc3a6ebf0981bd1e03cecebb4d51c58bce95485172666e3dcbc0973c", - "sha256:f2f119969e68bb7dc599c19768424894d65700ed2f35966fb5199a453a1086bb", - "sha256:f3082c67d6a7e3333e2232054831dbf64f2b18ae2df05fdcd76e483d306e7f01", - "sha256:f455446bd7425b17f3f6a6d915c784e83cf058259f58573db5413b7507acf586", - "sha256:f45d81e4e16cfce039788c0e44f8a5ad57fd6d303799a98866a3ad28bf9eeccf", - "sha256:f46929f9a4eae5f95fc8a2be1ed123c5e2f48621128ebdd296a77936328e59e7", - "sha256:f52d237553488dcf07f0a6297a5f3497ea3a616e996176840c4cb2c47765b9fd", - "sha256:f6e4d1f11e119673a0ae79ee749a93907d8e932cd3172d9885c4663511e6cdac", - "sha256:fc7d0b3ec1130eade130abf8434a319f86fe4a3d85861ab4b6fe08fc09b6497a", - "sha256:ff0a911de71092966df1abfa6a35180f703fe81e01dc317729132f89e22d6c46", - "sha256:ff222c695872ada25369a3ee4e3e3a0fb4ecfe4396aef3900789a0f128a24f16" - ], - "markers": "(platform_python_implementation != 'CPython' or python_full_version > '3.7.10') and (platform_system == 'Darwin' or platform_system == 'Windows' or platform_system == 'Linux') and (platform_machine == 'x86_64' or platform_machine == 's390x' or platform_machine == 'armv7l' or platform_machine == 'ppc64le' or platform_machine == 'ppc64' or platform_machine == 'AMD64' or platform_machine == 'aarch64' or platform_machine == 'arm64' or platform_machine == 'ARM64' or platform_machine == 'x86' or platform_machine == 'i686') and (platform_python_implementation == 'CPython' or (platform_python_implementation == 'PyPy' and python_version < '3.12'))", - "version": "==1.4.4" + "sha256:02130af8f4d5f58ae858bd0b90358bf4607b4a6be16d254c4a81527a48306111", + "sha256:032221480f04cce330988c4acdc5527ccf31515b02c7a15257530b00a1b16a46", + "sha256:04b1682d4b4199b7ddbc7367dad4e52c23e5e33def9bf47b30ba2a5a75d77337", + "sha256:074f9c6765f6753cf69f786325f7bbe7c943ae23e23af43db59c240376c21c41", + "sha256:08c96471e452bace59e4daedb6d51db047dac3737f359293e276ab466ea98fe2", + "sha256:0af350c466eac335d5984d6ea8f40bc186ec6ae34f11c2b2109bf63863b88846", + "sha256:0d175c13eb8b255b0bcb0044546bbc2cab8bd8af354ed222a9d4d38a60c3815d", + "sha256:0e0a1a1890d3e74a8b48b735ac3c52c26653e27edaa1fda1b9f533c9b0c57cff", + "sha256:0e448cbeb887e7ccd30551812ee9a32e2bf6d9e13fb97976426dd15d2c6fa9bf", + "sha256:0eee72469ea4befd0e87dab58c359417f42e80a1d1ca7c2ac4a27b89158c5075", + "sha256:118e6a141001a204536044e07ac3908bc4c8f3fe42caefae64281ff2de0860ac", + "sha256:1537270b7affb352d9c6ae5f303aaa513ac22df1b7795b317cfcec1cbc31c84e", + "sha256:156219090c0dff9e7256b069bb83a8ebebea32d5478a92ee9b9de40e22ee22d6", + "sha256:1d7c6ec44dd0a0f44c3beb128401af9233f155a45995d278e79722d561cd73a4", + "sha256:1eed1e1873427bd56f130320f8827ceb0f70600321fffe429e544ea9249ee865", + "sha256:2263d18b75d4320f5626490b9ea9181944b552f9e2e3a40bd4dbfe3705c700ff", + "sha256:2713476b262346ed8d9cb0afb6c1c2475417cdfc18c607e28d834da63731d072", + "sha256:27892c4d79629c8a1e9a989f9a9a22b8141b515fe2b120f55b1731933ff24e52", + "sha256:279b5961b094c6fb13548612298019297156cd718e999e666bf947fb47933435", + "sha256:29980aefd4778aa21d5a45a34cc4b9ca7f1635160f6938de2927c4a69d1aa735", + "sha256:29e4d422cd858a4e284336eeda167ddc3c669eea61a772efe4341b800478f89f", + "sha256:35c7b38458520301298b0cc6d979907bc59b71ba4a87fc5e487536ea65a2d517", + "sha256:3682dc975e6d42a77186f568f39f69ff6319e9d9117b03d2af116742c8289a57", + "sha256:37003232c34f0777e8c009a75a6a44bc9edf14065298d290acc75561cc8a7244", + "sha256:3cf1720799a5546462ff33bd81e25d88e1f4b220aa9935613b7460ab0c614d74", + "sha256:3de0c67c3de5ce9c35ac507f31bdde7e081a128ef13665a6534af065bdd40976", + "sha256:4017f07629338c9a86de6b6d8e5fa34b62ee8ea6efec77a283f3166c0db532e3", + "sha256:45ee055192d5e81751be864774f66a4113ff96e3b8565242ae957f734ffb2f36", + "sha256:4bb12cacf16952fa4b19618386fe132c9d8984dfa38e73a3a57043cf773b7663", + "sha256:4c055867471392fafe314ed2296fc009552c85af1405feba3381148cbcc38956", + "sha256:5001f0460f222bd32b08cc03d6692cae7e7b9669678fcd5b7f555a768c3360f6", + "sha256:52ad639c3e04e31be880ed0808616f15c1a14bd65e3ba812373207d287fe01ca", + "sha256:556b305f8d9bce5da8c99563521415b9e6e43d3bc4781a7f2da2a43e8735a30d", + "sha256:565cfe50e199689d3d34670b85e57394e33f399d1ab3167deb26d4f888d1865b", + "sha256:56f83ecde8656052669ccb32897fa15fbeb5427d6d550b5df1fd56b0a7e51908", + "sha256:576dc2cd85336735b9e33a9a226977b347c37fb92445d13a2c95790186eda147", + "sha256:586510eb7e6fc1c0d8cb0234fed2c0e4d19c873d39c6bca0f6c8899cc1355e6d", + "sha256:5c81df3b745e6a8ef758f027823525e880dfbe10e6e1d417146df447f29b8590", + "sha256:5c82b561c82f8883672d2f5eee55311759bdeef2143378d9e90b36558492c652", + "sha256:6104cf7ca8c6351546d28600a497bf1a205b833295af47d23aa32afad422d84c", + "sha256:618ec54a581fbf1580f3611c828ff01e16b57eadf69dc67f71494b2c36624568", + "sha256:63c0e51b6d24aa9a86a8258966a00554a7876b4c0f634fb60fbf28cccfee72a2", + "sha256:64c0b076acae5cd2cbffd38f4aa612c71e4a5fe9d828f4c740a1d6bf872a765f", + "sha256:67c30e47c489ca9102fa64f6fe0d6eb388b57ec68059a7fa8baaa06c5bb47e1b", + "sha256:68e45279615c561fe90dbffd7cc3406137b0a1dced328469f340e9a8fa9be522", + "sha256:6cf1fb74c6811ba940b284cab987fed61aeb13bdbe7e3700b0316795409fcb70", + "sha256:6ebfddd19dd046ee9f0e886120d8840177af24571f6c439747689759c0c51339", + "sha256:744664c6e23ee8643a309ff9f8c390a9a367c476380c82852bf05b1bf718f163", + "sha256:75d879d67457c079012f096dcbaa8d040ec43aa97210d6096bc3ff6be8eb1099", + "sha256:7656090018fb5629c504373b80116e30e54dc1be88df88f2a736a18370dd7a20", + "sha256:80157816dbbf89f372e9b971f0168a886b4520686b92a973f67051064663a4be", + "sha256:83334c95f7f5f1c39b5d4053f953500f85bcddeaa3ff85904079773d5504ca6a", + "sha256:8429531a674fc81843272b23e8b918651ca4082e54073266a19e7ac2a77fe203", + "sha256:848d71c5f6750513401a28e64ed1094706f83157f2203342f9355f00ffef5b85", + "sha256:857ded39921b556ec13d318d62aa0734c1ffbc415d5595366327fdb73b020404", + "sha256:8bdf93cff9d7283b809320f1ceff9f1bc9df2a8e912f6ba511614f648da91ede", + "sha256:8dbc83e5d1be9596c48446daa5f6039a3b7df13a3943f4519d6423bf3ccfedbf", + "sha256:8ec3c943a37d57ec836b23b0c2f28a389ecc7a2e690aaeda5b44debd04762972", + "sha256:91072f72f302ae307ee62b32ce1903cd9b5298e3e4ed08701be5714eaa1051c6", + "sha256:9888d7ce62ce2bbc252a88adf482a2ab561aada3ac50654f2ab730da60d4ef6d", + "sha256:988e53cbed460577ea2f692a30bbbb9d5963bd0e8bd26f7d20ea83b170320e65", + "sha256:9a1a175a0b8732c3e60dcb5595c3f6da66da8c70abb22bbaa67dbca82e91e435", + "sha256:9db78edb44d4ef978329df38f417dee8a20dd65ef67800b9013f81e21f9396cb", + "sha256:9e164eb332547143efdf6c0cdb013651edf0697e320dbc175a7358bfb253fb97", + "sha256:9fc6c3acce1c274f36d4653ef1e1055d24222d23791f37cdf82a533fe65bde7c", + "sha256:a416cfb018da01be25c3a7b730c25fbfc395c3df82c45798e87fa5ad4ad81d34", + "sha256:a43bbd5e68e9dac7f858aa592a12b606e34b16c478acf36ae3c24ff49c1ea24d", + "sha256:a4d41cb5b8c045fa233b32b1020937fe6443af0e269b355e8368a5ccad7356df", + "sha256:ab83c97bc8422a4ee68bbb350fcc41904d3c982dd8046fdb08fb046b40edfd35", + "sha256:ad51c81a29d2c67e8bd92684cb27a7cdc099d4414a769beadcfc999a9a87d9e2", + "sha256:adea2aecc6da81ebbc2048821bd23bdf1e09dc116d56cfef9018a8e7ddfed822", + "sha256:b4a2bb4ac2243504b002c95010fd78cc1709ca8be45ee9fd90b695d458fb59a1", + "sha256:b9881d8e11137270e8ff21e8ac300cd317cb3bf089ed81b6c59b44f5fbe5f7ca", + "sha256:c056b9cd280c11c261113fbad7e3cbfb734b06421fddc69a7bb922b604aa093d", + "sha256:c10e95f060e46d0946b2f883c4ae4ed9950475839e4c5763a366bd6f11246c66", + "sha256:c3576dac1c92bd09775bded18f496dacb6095973449891be3ada1836aa226bb4", + "sha256:c8122efcc01ce7e44591aeb19d67e9fb8c8e465fd5022ce9cd3c728230591b38", + "sha256:c8e5d8c65eefc931a340eb81b65d6e24e2ed2950801ae30e58ff4f368a7ecb88", + "sha256:cbb5c52ee5c481bd9a58bd87f36c497268afd6fca6e8704d05ab53b81074e504", + "sha256:cd64add5819480cc0a4cb59d4579df37bf95ebb7616eb0d70ceabf6e6599b4a4", + "sha256:cde2021162748e54fa5cbd5bf8536c9db0a425eec5d28750d2ec2369fdc38b93", + "sha256:d382e87ae4197d36e06f26f87a636aa27592f57473a1569cc64a38200f27ed7e", + "sha256:d4c1b8a9f3fa2d3ea63b28875c780d24f2652a9dd53a2fe76fb1454598bc10d8", + "sha256:d7382e6f3569ac84249c7fc590b2290b0438c7b4ee67f397b598c789faafda58", + "sha256:dbdf95ce396e5c23417d2c7716fd650b0408de302c1334dd535b1e2bed2e4857", + "sha256:e44f6a7a4ed46543d9d8f49674ed8b38f28f68561a39d01a5929222403985f0a", + "sha256:e7ddad0e0f1ca8aae5fc457ccde940481c2a0323ac04eed015b4a97891df0ca9", + "sha256:e8aa3bde1ea6a693c5f3d31b3296c253865708583250dd9d2a58af0b11176e70", + "sha256:e9c3da7831ae7221fe82938a6c1f8e87ec230e093dece3759110ae57a119ad91", + "sha256:ef787b45d545b403094e81b6b99ae4b8142ed219b23e2488cf062f97bc0e1416", + "sha256:f345cd2e0b1f26b7e13eadab78d53de9b9011c14b44a9a0c58a7d2466234efb0", + "sha256:f43c7048f64f8e2d1461226af8bafaafc243c571ca5c88baa56b89b2db7b314f", + "sha256:f93178ccf0d8325b66c755bd0273359d2a2a0dbb408af28cee05aa902b501869", + "sha256:fa1bf4d9838e4c8cdf309500a908fc412cdc325a63e5c74ad88a794bed16c943", + "sha256:fcdd2f6b1b1500bde96b442d777a563eadca1b825db0c42ac6aef45ad9ec3c4d" + ], + "markers": "python_version < '3.12' and (platform_python_implementation != 'CPython' or python_full_version > '3.7.10') and (platform_system == 'Darwin' or platform_system == 'Windows' or platform_system == 'Linux') and (platform_machine == 'x86_64' or platform_machine == 's390x' or platform_machine == 'armv7l' or platform_machine == 'ppc64le' or platform_machine == 'ppc64' or platform_machine == 'AMD64' or platform_machine == 'aarch64' or platform_machine == 'arm64' or platform_machine == 'ARM64' or platform_machine == 'x86' or platform_machine == 'i686') and (platform_python_implementation == 'CPython' or platform_python_implementation == 'PyPy')", + "version": "==1.5.1" }, "referencing": { "hashes": [ @@ -1480,148 +1069,132 @@ }, "rpds-py": { "hashes": [ - "sha256:0047638c3aa0dbcd0ab99ed1e549bbf0e142c9ecc173b6492868432d8989a046", - "sha256:006f4342fe729a368c6df36578d7a348c7c716be1da0a1a0f86e3021f8e98724", - "sha256:041f00419e1da7a03c46042453598479f45be3d787eb837af382bfc169c0db33", - "sha256:04ecf5c1ff4d589987b4d9882872f80ba13da7d42427234fce8f22efb43133bc", - "sha256:04f2b712a2206e13800a8136b07aaedc23af3facab84918e7aa89e4be0260032", - "sha256:0aeb3329c1721c43c58cae274d7d2ca85c1690d89485d9c63a006cb79a85771a", - "sha256:0e374c0ce0ca82e5b67cd61fb964077d40ec177dd2c4eda67dba130de09085c7", - "sha256:0f00c16e089282ad68a3820fd0c831c35d3194b7cdc31d6e469511d9bffc535c", - "sha256:174e46569968ddbbeb8a806d9922f17cd2b524aa753b468f35b97ff9c19cb718", - "sha256:1b221c2457d92a1fb3c97bee9095c874144d196f47c038462ae6e4a14436f7bc", - "sha256:208b3a70a98cf3710e97cabdc308a51cd4f28aa6e7bb11de3d56cd8b74bab98d", - "sha256:20f2712bd1cc26a3cc16c5a1bfee9ed1abc33d4cdf1aabd297fe0eb724df4272", - "sha256:24795c099453e3721fda5d8ddd45f5dfcc8e5a547ce7b8e9da06fecc3832e26f", - "sha256:2a0f156e9509cee987283abd2296ec816225145a13ed0391df8f71bf1d789e2d", - "sha256:2b2356688e5d958c4d5cb964af865bea84db29971d3e563fb78e46e20fe1848b", - "sha256:2c13777ecdbbba2077670285dd1fe50828c8742f6a4119dbef6f83ea13ad10fb", - "sha256:2d3ee4615df36ab8eb16c2507b11e764dcc11fd350bbf4da16d09cda11fcedef", - "sha256:2d53747da70a4e4b17f559569d5f9506420966083a31c5fbd84e764461c4444b", - "sha256:32bab0a56eac685828e00cc2f5d1200c548f8bc11f2e44abf311d6b548ce2e45", - "sha256:34d90ad8c045df9a4259c47d2e16a3f21fdb396665c94520dbfe8766e62187a4", - "sha256:369d9c6d4c714e36d4a03957b4783217a3ccd1e222cdd67d464a3a479fc17796", - "sha256:3a55fc10fdcbf1a4bd3c018eea422c52cf08700cf99c28b5cb10fe97ab77a0d3", - "sha256:3d2d8e4508e15fc05b31285c4b00ddf2e0eb94259c2dc896771966a163122a0c", - "sha256:3fab5f4a2c64a8fb64fc13b3d139848817a64d467dd6ed60dcdd6b479e7febc9", - "sha256:43dba99f00f1d37b2a0265a259592d05fcc8e7c19d140fe51c6e6f16faabeb1f", - "sha256:44d51febb7a114293ffd56c6cf4736cb31cd68c0fddd6aa303ed09ea5a48e029", - "sha256:493fe54318bed7d124ce272fc36adbf59d46729659b2c792e87c3b95649cdee9", - "sha256:4b28e5122829181de1898c2c97f81c0b3246d49f585f22743a1246420bb8d399", - "sha256:4cd031e63bc5f05bdcda120646a0d32f6d729486d0067f09d79c8db5368f4586", - "sha256:528927e63a70b4d5f3f5ccc1fa988a35456eb5d15f804d276709c33fc2f19bda", - "sha256:564c96b6076a98215af52f55efa90d8419cc2ef45d99e314fddefe816bc24f91", - "sha256:5db385bacd0c43f24be92b60c857cf760b7f10d8234f4bd4be67b5b20a7c0b6b", - "sha256:5ef877fa3bbfb40b388a5ae1cb00636a624690dcb9a29a65267054c9ea86d88a", - "sha256:5f6e3cec44ba05ee5cbdebe92d052f69b63ae792e7d05f1020ac5e964394080c", - "sha256:5fc13b44de6419d1e7a7e592a4885b323fbc2f46e1f22151e3a8ed3b8b920405", - "sha256:60748789e028d2a46fc1c70750454f83c6bdd0d05db50f5ae83e2db500b34da5", - "sha256:60d9b630c8025b9458a9d114e3af579a2c54bd32df601c4581bd054e85258143", - "sha256:619ca56a5468f933d940e1bf431c6f4e13bef8e688698b067ae68eb4f9b30e3a", - "sha256:630d3d8ea77eabd6cbcd2ea712e1c5cecb5b558d39547ac988351195db433f6c", - "sha256:63981feca3f110ed132fd217bf7768ee8ed738a55549883628ee3da75bb9cb78", - "sha256:66420986c9afff67ef0c5d1e4cdc2d0e5262f53ad11e4f90e5e22448df485bf0", - "sha256:675269d407a257b8c00a6b58205b72eec8231656506c56fd429d924ca00bb350", - "sha256:6a4a535013aeeef13c5532f802708cecae8d66c282babb5cd916379b72110cf7", - "sha256:6a727fd083009bc83eb83d6950f0c32b3c94c8b80a9b667c87f4bd1274ca30ba", - "sha256:6e1daf5bf6c2be39654beae83ee6b9a12347cb5aced9a29eecf12a2d25fff664", - "sha256:6eea559077d29486c68218178ea946263b87f1c41ae7f996b1f30a983c476a5a", - "sha256:75a810b7664c17f24bf2ffd7f92416c00ec84b49bb68e6a0d93e542406336b56", - "sha256:772cc1b2cd963e7e17e6cc55fe0371fb9c704d63e44cacec7b9b7f523b78919e", - "sha256:78884d155fd15d9f64f5d6124b486f3d3f7fd7cd71a78e9670a0f6f6ca06fb2d", - "sha256:79e8d804c2ccd618417e96720ad5cd076a86fa3f8cb310ea386a3e6229bae7d1", - "sha256:7e80d375134ddb04231a53800503752093dbb65dad8dabacce2c84cccc78e964", - "sha256:8097b3422d020ff1c44effc40ae58e67d93e60d540a65649d2cdaf9466030791", - "sha256:8205ee14463248d3349131bb8099efe15cd3ce83b8ef3ace63c7e976998e7124", - "sha256:8212ff58ac6dfde49946bea57474a386cca3f7706fc72c25b772b9ca4af6b79e", - "sha256:823e74ab6fbaa028ec89615ff6acb409e90ff45580c45920d4dfdddb069f2120", - "sha256:84e0566f15cf4d769dade9b366b7b87c959be472c92dffb70462dd0844d7cbad", - "sha256:896c41007931217a343eff197c34513c154267636c8056fb409eafd494c3dcdc", - "sha256:8aa362811ccdc1f8dadcc916c6d47e554169ab79559319ae9fae7d7752d0d60c", - "sha256:8b3b397eefecec8e8e39fa65c630ef70a24b09141a6f9fc17b3c3a50bed6b50e", - "sha256:8ebc7e65ca4b111d928b669713865f021b7773350eeac4a31d3e70144297baba", - "sha256:9168764133fd919f8dcca2ead66de0105f4ef5659cbb4fa044f7014bed9a1797", - "sha256:921ae54f9ecba3b6325df425cf72c074cd469dea843fb5743a26ca7fb2ccb149", - "sha256:92558d37d872e808944c3c96d0423b8604879a3d1c86fdad508d7ed91ea547d5", - "sha256:951cc481c0c395c4a08639a469d53b7d4afa252529a085418b82a6b43c45c240", - "sha256:998c01b8e71cf051c28f5d6f1187abbdf5cf45fc0efce5da6c06447cba997034", - "sha256:9abc80fe8c1f87218db116016de575a7998ab1629078c90840e8d11ab423ee25", - "sha256:9be4f99bee42ac107870c61dfdb294d912bf81c3c6d45538aad7aecab468b6b7", - "sha256:9c39438c55983d48f4bb3487734d040e22dad200dab22c41e331cee145e7a50d", - "sha256:9d7e8ce990ae17dda686f7e82fd41a055c668e13ddcf058e7fb5e9da20b57793", - "sha256:9ea7f4174d2e4194289cb0c4e172d83e79a6404297ff95f2875cf9ac9bced8ba", - "sha256:a18fc371e900a21d7392517c6f60fe859e802547309e94313cd8181ad9db004d", - "sha256:a36b452abbf29f68527cf52e181fced56685731c86b52e852053e38d8b60bc8d", - "sha256:a5b66d1b201cc71bc3081bc2f1fc36b0c1f268b773e03bbc39066651b9e18391", - "sha256:a824d2c7a703ba6daaca848f9c3d5cb93af0505be505de70e7e66829affd676e", - "sha256:a88c0d17d039333a41d9bf4616bd062f0bd7aa0edeb6cafe00a2fc2a804e944f", - "sha256:aa6800adc8204ce898c8a424303969b7aa6a5e4ad2789c13f8648739830323b7", - "sha256:aad911555286884be1e427ef0dc0ba3929e6821cbeca2194b13dc415a462c7fd", - "sha256:afc6e35f344490faa8276b5f2f7cbf71f88bc2cda4328e00553bd451728c571f", - "sha256:b9a4df06c35465ef4d81799999bba810c68d29972bf1c31db61bfdb81dd9d5bb", - "sha256:bb2954155bb8f63bb19d56d80e5e5320b61d71084617ed89efedb861a684baea", - "sha256:bbc4362e06f950c62cad3d4abf1191021b2ffaf0b31ac230fbf0526453eee75e", - "sha256:c0145295ca415668420ad142ee42189f78d27af806fcf1f32a18e51d47dd2052", - "sha256:c30ff468163a48535ee7e9bf21bd14c7a81147c0e58a36c1078289a8ca7af0bd", - "sha256:c347a20d79cedc0a7bd51c4d4b7dbc613ca4e65a756b5c3e57ec84bd43505b47", - "sha256:c43583ea8517ed2e780a345dd9960896afc1327e8cf3ac8239c167530397440d", - "sha256:c61a2cb0085c8783906b2f8b1f16a7e65777823c7f4d0a6aaffe26dc0d358dd9", - "sha256:c9ca89938dff18828a328af41ffdf3902405a19f4131c88e22e776a8e228c5a8", - "sha256:cc31e13ce212e14a539d430428cd365e74f8b2d534f8bc22dd4c9c55b277b875", - "sha256:cdabcd3beb2a6dca7027007473d8ef1c3b053347c76f685f5f060a00327b8b65", - "sha256:cf86f72d705fc2ef776bb7dd9e5fbba79d7e1f3e258bf9377f8204ad0fc1c51e", - "sha256:d09dc82af2d3c17e7dd17120b202a79b578d79f2b5424bda209d9966efeed114", - "sha256:d3aa13bdf38630da298f2e0d77aca967b200b8cc1473ea05248f6c5e9c9bdb44", - "sha256:d69d003296df4840bd445a5d15fa5b6ff6ac40496f956a221c4d1f6f7b4bc4d9", - "sha256:d6e109a454412ab82979c5b1b3aee0604eca4bbf9a02693bb9df027af2bfa91a", - "sha256:d8551e733626afec514b5d15befabea0dd70a343a9f23322860c4f16a9430205", - "sha256:d8754d872a5dfc3c5bf9c0e059e8107451364a30d9fd50f1f1a85c4fb9481164", - "sha256:d8f9a6e7fd5434817526815f09ea27f2746c4a51ee11bb3439065f5fc754db58", - "sha256:dbcbb6db5582ea33ce46a5d20a5793134b5365110d84df4e30b9d37c6fd40ad3", - "sha256:e0f3ef95795efcd3b2ec3fe0a5bcfb5dadf5e3996ea2117427e524d4fbf309c6", - "sha256:e13ae74a8a3a0c2f22f450f773e35f893484fcfacb00bb4344a7e0f4f48e1f97", - "sha256:e274f62cbd274359eff63e5c7e7274c913e8e09620f6a57aae66744b3df046d6", - "sha256:e838bf2bb0b91ee67bf2b889a1a841e5ecac06dd7a2b1ef4e6151e2ce155c7ae", - "sha256:e8acd55bd5b071156bae57b555f5d33697998752673b9de554dd82f5b5352727", - "sha256:e8e5ab32cf9eb3647450bc74eb201b27c185d3857276162c101c0f8c6374e098", - "sha256:ebcb786b9ff30b994d5969213a8430cbb984cdd7ea9fd6df06663194bd3c450c", - "sha256:ebea2821cdb5f9fef44933617be76185b80150632736f3d76e54829ab4a3b4d1", - "sha256:ed0ef550042a8dbcd657dfb284a8ee00f0ba269d3f2286b0493b15a5694f9fe8", - "sha256:eda5c1e2a715a4cbbca2d6d304988460942551e4e5e3b7457b50943cd741626d", - "sha256:f5c0ed12926dec1dfe7d645333ea59cf93f4d07750986a586f511c0bc61fe103", - "sha256:f6016bd950be4dcd047b7475fdf55fb1e1f59fc7403f387be0e8123e4a576d30", - "sha256:f9e0057a509e096e47c87f753136c9b10d7a91842d8042c2ee6866899a717c0d", - "sha256:fc1c892b1ec1f8cbd5da8de287577b455e388d9c328ad592eabbdcb6fc93bee5", - "sha256:fc2c1e1b00f88317d9de6b2c2b39b012ebbfe35fe5e7bef980fd2a91f6100a07", - "sha256:fd822f019ccccd75c832deb7aa040bb02d70a92eb15a2f16c7987b7ad4ee8d83" + "sha256:098d446d76d26e394b440d73921b49c1c90274d46ccbaadf346b1b78f9fdd4b1", + "sha256:0d63a86b457069d669c423f093db4900aa102f0e5a626973eff4db8355c0fd96", + "sha256:0dcdee07ebf76223092666c72a9552db276fbe46b98830ecd1bb836cc98adc81", + "sha256:0ee0cc81f875e853ccdf3badb44b67f771fb9149baa9e752777ccdcaf052ad26", + "sha256:113d134dc5a8d2503630ca2707b58a1bf5b1b3c69b35c7dab8690ee650c111b8", + "sha256:12a84c3851f9e68633d883c01347db3cb87e6160120a489f9c47162cd276b0a5", + "sha256:12b42790c91e0041a98f0ec04244fb334696938793e785a5d4c7e56ca534d7da", + "sha256:16fb28d3a653f67c871a47c5ca0be17bce9fab8adb8bcf7bd09f3771b8c4d860", + "sha256:1e11065b759c38c4945f8c9765ed2910e31fa5b2f7733401eb7d966f468367a2", + "sha256:20af08b0b2d5b196a2bcb70becf0b97ec5af579cee0ae6750b08a2eea3b6c77d", + "sha256:240251fd95b057c26f8538d0e673bf983eba4f38da95fbaf502bfc1a768b3984", + "sha256:2649ff19291928243f90c86e4dc9cd86c8c4c6a73c3693ba2e23bc2fbcd8338c", + "sha256:28bd2969445acc2d6801a22f97a43134ae3cb18e7495d668bfaa8d82b8526cdc", + "sha256:2bd08c82336412a39a598e5baccab2ee2d7bd54e9115c8b64f2febb45da5c368", + "sha256:2f91902fc0c95dd1fa6b30ebd2af83ace91e592f7fd6340a375588a9d4b9341b", + "sha256:35c8cb5dcf7d36d3adf2ae0730b60fb550a8feb6e432bee7ef84162a0d15714b", + "sha256:36a7564deaac3f372e8b8b701eb982ea3113516e8e08cd87e3dc6ccf29bad14b", + "sha256:3752a015db89ea3e9c04d5e185549be4aa29c1882150e094c614c0de8e788feb", + "sha256:383cf0d4288baf5a16812ed70d54ecb7f2064e255eb7fe42c38e926adeae4534", + "sha256:3a21f4584f69547ae03aaa21be98753e85599f3437b84039da5dc20b53abe987", + "sha256:3d7d65aa934899849628137ab391562cdb487c6ffb9b9781319a64a9c66afbce", + "sha256:469054e6b2f8e41f1fe62b95f617082019d343eddeec3219ff3909067e672fb9", + "sha256:4acbe2349a3baac9cc212005b6cb4bbb7e5b34538886cde4f55dfc29173da1d6", + "sha256:4ad37c29adc435e6d8b24be86b03596183ee8d4bb8580cc4c676879b0b896a99", + "sha256:4d97661bf5848dd9e5eb7ded480deccf9d32ce2cd500b88a26acbf7bd2864985", + "sha256:4e5fe366fa53bd6777cf5440245366705338587b2cf8d61348ddaad744eb591a", + "sha256:4fbec54cc42fa90ca69158d75f125febc4116b2d934e71c78f97de1388a8feb2", + "sha256:540cd89d256119845b7f8f56c4bb80cad280cab92d9ca473be49ea13e678fd44", + "sha256:542a6f1d0f400b9ce1facb3e30dd3dc84e4affc60353509b00a7bdcd064be91e", + "sha256:54f925ff8d4443b7cae23a5215954abbf4736a3404188bde53c4d744ac001d89", + "sha256:551897221bbc9de17bce4574810347db8ec1ba4ec2f50f35421790d34bdb6ef9", + "sha256:57e9616a2a9da08fe0994e37a0c6f578fbaf6d35911bcba31e99660542d60c45", + "sha256:587cad3959d3d85127cf5df1624cdce569bb3796372e00420baad46af7c56b9b", + "sha256:58cfaa54752d6d2b4f10e87571688dbb7792327a69eca5417373d77d42787058", + "sha256:5afbff2822016db3c696cb0c1432e6b1f0e34aa9280bc5184dc216812a24e70d", + "sha256:5b049dd0792d51f07193cd934acec89abe84d2607109e6ca223b2f0ff24f0c7d", + "sha256:5bbfbd9c74c4dd74815bd532bf29bedea6d27d38f35ef46f9754172a14e4c655", + "sha256:5e849315963eb08c26167d0f2c0f9319c9bd379daea75092b3c595d70be6209d", + "sha256:6065a489b7b284efb29d57adffae2b9b5e9403d3c8d95cfa04e04e024e6b4e77", + "sha256:637ec39f97e342a3f76af739eda96800549d92f3aa27a2170b6dcbdffd49f480", + "sha256:653a066d2a4a332d4f8a11813e8124b643fa7b835b78468087a9898140469eee", + "sha256:6587ece9f205097c62d0e3d3cb7c06991eb0083ab6a9cf48951ec49c2ab7183c", + "sha256:66087711faf29cb3ac8ab05341939aec29968626aff8ef18e483e229055dd9a7", + "sha256:66568caacf18542f0cf213db7adf3de2da6ad58c7bf2c4fafec0d81ae557443b", + "sha256:673ba018df5ae5e7b6c9a021d51ffe39c0ae1daa0041611ed27a0bca634b2d2e", + "sha256:6a1eda14db1ac7a2ab4536dfe69e4d37fdd765e8e784ae4451e61582ebb76012", + "sha256:6b0c0f671a53c129ea48f9481e95532579cc489ab5a0ffe750c9020787181c48", + "sha256:6b5f457afffb45d3804728a54083e31fbaf460e902e3f7d063e56d0d0814301e", + "sha256:6bcca4d0d24d8c37bfe0cafdaaf4346b6c516db21ccaad5c7fba0a0df818dfc9", + "sha256:6c27156c8d836e7ff760767e93245b286ae028bfd81d305db676662d1f642637", + "sha256:6c72a4a8fab10bc96720ad40941bb471e3b1150fb8d62dab205d495511206cf1", + "sha256:6d95521901896a90a858993bfa3ec0f9160d3d97e8c8fefc279b3306cdadfee0", + "sha256:7715597186a7277be12729c896019226321bad1f047da381ab707b177aa5017c", + "sha256:77814c7a4e1dc43fba73aeb4c1ef0fe37d901f3aa869a4823de5ea843a283fd0", + "sha256:77910d6bec321c9fccfe9cf5e407fed9d2c48a5e510473b4f070d5cf2413c003", + "sha256:7c18cb2f6805861dcdf11fb0b3c111a0335f6475411687db2f6636f32bed66b0", + "sha256:7d34547810bfd61acf8a441e8a3651e7a919e8e8aed29850be14a1b05cfc6f41", + "sha256:8029c19c8a32ef3093c417dd16a5f806e7f529fcceea7c627b2635e9da5104da", + "sha256:805a0dff0674baa3f360c21dcbc622ae544f2bb4753d87a4a56a1881252a477e", + "sha256:80b37b37525492250adc7cbca20ae7084f86eb3eb62414b624d2a400370853b1", + "sha256:8155e21203161e5c78791fc049b99f0bbbf14d1d1839c8c93c8344957f9e8e1e", + "sha256:837fd066f974e5b98c69ac83ec594b79a2724a39a92a157b8651615e5032e530", + "sha256:83e103b48e63fd2b8a8e2b21ab5b5299a7146045626c2ed4011511ea8122d217", + "sha256:85587479f210350e9d9d25e505f422dd636e561658382ee8947357a4bac491ad", + "sha256:864573b6440b770db5a8693547a8728d7fd32580d4903010a8eee0bb5b03b130", + "sha256:87c6ff87b38f46d712418d78b34db1198408a3d9a42eddc640644aea561216b1", + "sha256:89260601d497fa5957c3e46f10b16cfa2a4808ad4dd46cddc0b997461923a7d9", + "sha256:89bb2b20829270aca28b1e5481be8ee24cb9aa86e6c0c81cb4ada2112c9588c5", + "sha256:8abc1a3e29b599bf8bb5ad455256a757e8b0ed5621e7e48abe8209932dc6d11e", + "sha256:8c2ad59c4342a176cb3e0d5753e1c911eabc95c210fc6d0e913c32bf560bf012", + "sha256:8f3a57f08c558d0983a708bfe6d1265f47b5debff9b366b2f2091690fada055c", + "sha256:90dbd2c42cb6463c07020695800ae8f347e7dbeff09da2975a988e467b624539", + "sha256:91a51499be506022b9f09facfc42f0c3a1c45969c0fc8f0bbebc8ff23ab9e531", + "sha256:9442cbff21122e9a529b942811007d65eabe4182e7342d102caf119b229322c6", + "sha256:94f89161a3e358db33310a8a064852a6eb119ed1aa1a3dba927b4e5140e65d00", + "sha256:96742796f499ac23b59856db734e65b286d1214a0d9b57bcd7bece92d9201fa4", + "sha256:98c729193e7abe498565266933c125780fb646e977e94289cadbb36e4eeeb370", + "sha256:9b75b5d3416b00d064a5e6f4814fdfb18a964a7cf38dc00b5c2c02fa30a7dd0b", + "sha256:9cad834f1a8f51eb037c3c4dc72c884c9e1e0644d900e2d45aa76450e4aa6282", + "sha256:9d0041bd9e2d2ef803b32d84a0c8115d178132da5691346465953a2a966ba8ca", + "sha256:9f9a1b15b875160186177f659cde2b0f899182b0aca49457d6396afc4bbda7b9", + "sha256:a05b199c11d2f39c72de8c30668734b5d20974ad44b65324ea3e647a211f135d", + "sha256:a413674eb2bd2ecb2b93fcc928871b19f7220ee04bca4af3375c50a2b32b5a50", + "sha256:a54b94b0e4de95aa92618906fb631779d9fde29b4bf659f482c354a3a79fd025", + "sha256:a60ba9d104f4e8496107b1cb86e45a68a16d13511dc3986e0780e9f85c2136f9", + "sha256:ad4a896896346adab86d52b31163c39d49e4e94c829494b96cc064bff82c5851", + "sha256:af1c2241919304cc2f90e7dcb3eb1c1df6fb4172dd338e629dd6410e48b3d1a0", + "sha256:b0a5651e350997cebcdc23016dca26c4d1993d29015a535284da3159796e30b6", + "sha256:b7d60d42f1b9571341ad2322e748f7a60f9847546cd801a3a0eb72a1b54c6519", + "sha256:bb979162323f3534dce84b59f86e689a0761a2a300e0212bfaedfa80d4eb8100", + "sha256:bc907ea12216cfc5560148fc42459d86740fc739981c6feb94230dab09362679", + "sha256:c146a24a8f0dc4a7846fb4640b88b3a68986585b8ce8397af15e66b7c5817439", + "sha256:c46bd76986e05689376d28fdc2b97d899576ce3e3aaa5a5f80f67a8300b26eb3", + "sha256:c624c82e645f6b5465d08cdc802fb0cd53aa1478782fb2992b9e09f2c9426865", + "sha256:cd36b71f9f3bf195b2dd9be5eafbfc9409e6c8007aebc38a4dc051f522008033", + "sha256:ce0518667855a1598d9b1f4fcf0fed1182c67c5ba4fe6a2c6bce93440a65cead", + "sha256:d21408eaa157063f56e58ca50da27cad67c4395a85fb44cc7a31253ea4e58918", + "sha256:d33aef3914a5b49db12ed3f24d214ffa50caefc8f4b0c7c7b9485bd4b231a898", + "sha256:d3dc8d6ce8f001c80919bdb49d8b0b815185933a0b8e9cdeaea42b0b6f27eeb0", + "sha256:d58258a66255b2500ddaa4f33191ada5ec983a429c09eb151daf81efbb9aa115", + "sha256:d8b41195a6b03280ab00749a438fbce761e7acfd5381051a570239d752376f27", + "sha256:ddf9426b740a7047b2b0dddcba775211542e8053ce1e509a1759b665fe573508", + "sha256:de34a7d1893be76cb015929690dce3bde29f4de08143da2e9ad1cedb11dbf80e", + "sha256:e3d50ac3b772c10e0b918a5ce2e871138896bfb5f35050ff1ff87ddca45961fc", + "sha256:e49e4c3e899c32884d7828c91d6c3aff08d2f18857f50f86cc91187c31a4ca58", + "sha256:eb91471640390a82744b164f8a0be4d7c89d173b1170713f9639c6bad61e9e64", + "sha256:f2e69415e4e33cdeee50ebc2c4d8fcbef12c3181d9274e512ccd2a905a76aad1", + "sha256:f3353a2d7eb7d5e0af8a7ca9fc85a34ba12619119bcdee6b8a28a6373cda65ce", + "sha256:f933b35fa563f047896a70b69414dfb3952831817e4c4b3a6faa96737627f363", + "sha256:fccd24c080850715c58a80200d367bc62b4bff6c9fb84e9564da1ebcafea6418", + "sha256:fd9167e9604cb5a218a2e847aa8cdc5f98b379a673371978ee7b0c11b4d2e140", + "sha256:fdc648d4e81eef5ac4bb35d731562dffc28358948410f3274d123320e125d613", + "sha256:fe7439d9c5b402af2c9911c7facda1808d0c8dbfa9cf085e6aeac511a23f7d87", + "sha256:ffae52cd76837a5c16409359d236b1fced79e42e0792e8adf375095a5e855368" ], "markers": "python_version >= '3.9'", - "version": "==0.24.0" + "version": "==0.25.0" }, "six": { "hashes": [ "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274", "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81" ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2'", + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", "version": "==1.17.0" }, - "tinydb": { - "hashes": [ - "sha256:f7dfc39b8d7fda7a1ca62a8dbb449ffd340a117c1206b68c50b1a481fb95181d", - "sha256:f97030ee5cbc91eeadd1d7af07ab0e48ceb04aa63d4a983adbaca4cba16e86c3" - ], - "markers": "python_version >= '3.8' and python_version < '4.0'", - "version": "==4.8.2" - }, - "tuspy": { - "hashes": [ - "sha256:156734eac5c61a046cfecd70f14119f05be92cce198eb5a1a99a664482bedb89", - "sha256:7fc5ac8fb25de37c96c90213f83a1ffdede7f48a471cb5a15a2f57846828a79a" - ], - "markers": "python_full_version >= '3.5.3'", - "version": "==1.1.0" - }, "typing-extensions": { "hashes": [ "sha256:a439e7c04b49fec3e5d3e2beaa21755cadbbdc391694e28ccdd36ca4a1408f8c", @@ -1656,11 +1229,11 @@ }, "urllib3-future": { "hashes": [ - "sha256:2468dbd8902f5696070f6cef78bacdc9448c49f974e94917d49fc07c31c704af", - "sha256:e5cf749b7861d3006d9cead2ac742f0f9d8880022b62799689cb2c4134dede6f" + "sha256:4cb9424398993016383b600ba20881217f10a99c45acac60019ffb0dd007bc8a", + "sha256:5127b8cec47bd165084de1991801c8746bda8889ec919e108fcd777f6fdadaa8" ], "markers": "python_version >= '3.7'", - "version": "==2.12.917" + "version": "==2.12.922" }, "verlib2": { "hashes": [ @@ -1773,207 +1346,114 @@ ], "markers": "python_version >= '3.9'", "version": "==3.1.3" - }, - "yarl": { - "hashes": [ - "sha256:0110f91c57ab43d1538dfa92d61c45e33b84df9257bd08fcfcda90cce931cbc9", - "sha256:01e02bb80ae0dbed44273c304095295106e1d9470460e773268a27d11e594892", - "sha256:0626ee31edb23ac36bdffe607231de2cca055ad3a5e2dc5da587ef8bc6a321bc", - "sha256:087ae8f8319848c18e0d114d0f56131a9c017f29200ab1413b0137ad7c83e2ae", - "sha256:0bae32f8ebd35c04d6528cedb4a26b8bf25339d3616b04613b97347f919b76d3", - "sha256:0df9f0221a78d858793f40cbea3915c29f969c11366646a92ca47e080a14f881", - "sha256:0e617d45d03c8dec0dfce6f51f3e1b8a31aa81aaf4a4d1442fdb232bcf0c6d8c", - "sha256:163ff326680de5f6d4966954cf9e3fe1bf980f5fee2255e46e89b8cf0f3418b5", - "sha256:1efbf4d03e6eddf5da27752e0b67a8e70599053436e9344d0969532baa99df53", - "sha256:217f69e60a14da4eed454a030ea8283f8fbd01a7d6d81e57efb865856822489b", - "sha256:24e4c367ad69988a2283dd45ea88172561ca24b2326b9781e164eb46eea68345", - "sha256:262087a8a0d73e1d169d45c2baf968126f93c97cf403e1af23a7d5455d52721f", - "sha256:2af682a1e97437382ee0791eacbf540318bd487a942e068e7e0a6c571fadbbd3", - "sha256:30eaf4459df6e91f21b2999d1ee18f891bcd51e3cbe1de301b4858c84385895b", - "sha256:32ba32d0fa23893fd8ea8d05bdb05de6eb19d7f2106787024fd969f4ba5466cb", - "sha256:3560dcba3c71ae7382975dc1e912ee76e50b4cd7c34b454ed620d55464f11876", - "sha256:362f5480ba527b6c26ff58cff1f229afe8b7fdd54ee5ffac2ab827c1a75fc71c", - "sha256:3b77173663e075d9e5a57e09d711e9da2f3266be729ecca0b8ae78190990d260", - "sha256:46ade37911b7c99ce28a959147cb28bffbd14cea9e7dd91021e06a8d2359a5aa", - "sha256:4815ec6d3d68a96557fa71bd36661b45ac773fb50e5cfa31a7e843edb098f060", - "sha256:528e86f5b1de0ad8dd758ddef4e0ed24f5d946d4a1cef80ffb2d4fca4e10f122", - "sha256:545575ecfcd465891b51546c2bcafdde0acd2c62c2097d8d71902050b20e4922", - "sha256:5507c1f7dd3d41251b67eecba331c8b2157cfd324849879bebf74676ce76aff7", - "sha256:5684e7ff93ea74e47542232bd132f608df4d449f8968fde6b05aaf9e08a140f9", - "sha256:57711f1465c06fee8825b95c0b83e82991e6d9425f9a042c3c19070a70ac92bf", - "sha256:57abd66ca913f2cfbb51eb3dbbbac3648f1f6983f614a4446e0802e241441d2a", - "sha256:57f3fed859af367b9ca316ecc05ce79ce327d6466342734305aa5cc380e4d8be", - "sha256:5864f539ce86b935053bfa18205fa08ce38e9a40ea4d51b19ce923345f0ed5db", - "sha256:59281b9ed27bc410e0793833bcbe7fc149739d56ffa071d1e0fe70536a4f7b61", - "sha256:5a70201dd1e0a4304849b6445a9891d7210604c27e67da59091d5412bc19e51c", - "sha256:5bc503e1c1fee1b86bcb58db67c032957a52cae39fe8ddd95441f414ffbab83e", - "sha256:63702f1a098d0eaaea755e9c9d63172be1acb9e2d4aeb28b187092bcc9ca2d17", - "sha256:66fc1c2926a73a2fb46e4b92e3a6c03904d9bc3a0b65e01cb7d2b84146a8bd3b", - "sha256:67a56b1acc7093451ea2de0687aa3bd4e58d6b4ef6cbeeaad137b45203deaade", - "sha256:68972df6a0cc47c8abaf77525a76ee5c5f6ea9bbdb79b9565b3234ded3c5e675", - "sha256:6ba0931b559f1345df48a78521c31cfe356585670e8be22af84a33a39f7b9221", - "sha256:70f384921c24e703d249a6ccdabeb57dd6312b568b504c69e428a8dd3e8e68ca", - "sha256:742ceffd3c7beeb2b20d47cdb92c513eef83c9ef88c46829f88d5b06be6734ee", - "sha256:75460740005de5a912b19f657848aef419387426a40f581b1dc9fac0eb9addb5", - "sha256:756b9ea5292a2c180d1fe782a377bc4159b3cfefaca7e41b5b0a00328ef62fa9", - "sha256:7908a25d33f94852b479910f9cae6cdb9e2a509894e8d5f416c8342c0253c397", - "sha256:7a8e19fd5a6fdf19a91f2409665c7a089ffe7b9b5394ab33c0eec04cbecdd01f", - "sha256:7b687c334da3ff8eab848c9620c47a253d005e78335e9ce0d6868ed7e8fd170b", - "sha256:7e4cb14a6ee5b6649ccf1c6d648b4da9220e8277d4d4380593c03cc08d8fe937", - "sha256:8015a076daf77823e7ebdcba474156587391dab4e70c732822960368c01251e6", - "sha256:8182ad422bfacdebd4759ce3adc6055c0c79d4740aea1104e05652a81cd868c6", - "sha256:8346ec72ada749a6b5d82bff7be72578eab056ad7ec38c04f668a685abde6af0", - "sha256:85ac908cd5a97bbd3048cca9f1bf37b932ea26c3885099444f34b0bf5d5e9fa6", - "sha256:8b3ade62678ee2c7c10dcd6be19045135e9badad53108f7d2ed14896ee396045", - "sha256:8c0b2371858d5a814b08542d5d548adb03ff2d7ab32f23160e54e92250961a72", - "sha256:961c3e401ea7f13d02b8bb7cb0c709152a632a6e14cdc8119e9c6ee5596cd45d", - "sha256:9931343d1c1f4e77421687b6b94bbebd8a15a64ab8279adf6fbb047eff47e536", - "sha256:9973ac95327f5d699eb620286c39365990b240031672b5c436a4cd00539596c5", - "sha256:9ba536b17ecf3c74a94239ec1137a3ad3caea8c0e4deb8c8d2ffe847d870a8c5", - "sha256:9fac2dd1c5ecb921359d9546bc23a6dcc18c6acd50c6d96f118188d68010f497", - "sha256:a251e00e445d2e9df7b827c9843c0b87f58a3254aaa3f162fb610747491fe00f", - "sha256:a39d7b807ab58e633ed760f80195cbd145b58ba265436af35f9080f1810dfe64", - "sha256:a5288adb7c59d0f54e4ad58d86fb06d4b26e08a59ed06d00a1aac978c0e32884", - "sha256:a626c4d9cca298d1be8625cff4b17004a9066330ac82d132bbda64a4c17c18d3", - "sha256:a727101eb27f66727576630d02985d8a065d09cd0b5fcbe38a5793f71b2a97ef", - "sha256:a93208282c0ccdf73065fd76c6c129bd428dba5ff65d338ae7d2ab27169861a0", - "sha256:aad67c8f13a4b79990082f72ef09c078a77de2b39899aabf3960a48069704973", - "sha256:acf9b92c4245ac8b59bc7ec66a38d3dcb8d1f97fac934672529562bb824ecadb", - "sha256:ada882e26b16ee651ab6544ce956f2f4beaed38261238f67c2a96db748e17741", - "sha256:ae584afe81a1de4c1bb06672481050f0d001cad13163e3c019477409f638f9b7", - "sha256:aee5b90a5a9b71ac57400a7bdd0feaa27c51e8f961decc8d412e720a004a1791", - "sha256:b0fe766febcf523a2930b819c87bb92407ae1368662c1bc267234e79b20ff894", - "sha256:b8179280cdeb4c36eb18d6534a328f9d40da60d2b96ac4a295c5f93e2799e9d9", - "sha256:c03607bf932aa4cfae371e2dc9ca8b76faf031f106dac6a6ff1458418140c165", - "sha256:c4228978fb59c6b10f60124ba8e311c26151e176df364e996f3f8ff8b93971b5", - "sha256:c515f7dd60ca724e4c62b34aeaa603188964abed2eb66bb8e220f7f104d5a187", - "sha256:cbeb9c145d534c240a63b6ecc8a8dd451faeb67b3dc61d729ec197bb93e29497", - "sha256:cd430c2b7df4ae92498da09e9b12cad5bdbb140d22d138f9e507de1aa3edfea3", - "sha256:cda34ab19099c3a1685ad48fe45172536610c312b993310b5f1ca3eb83453b36", - "sha256:d27a6482ad5e05e8bafd47bf42866f8a1c0c3345abcb48d4511b3c29ecc197dc", - "sha256:d8717924cf0a825b62b1a96fc7d28aab7f55a81bf5338b8ef41d7a76ab9223e9", - "sha256:d995122dcaf180fd4830a9aa425abddab7c0246107c21ecca2fa085611fa7ce9", - "sha256:dff065a1a8ed051d7e641369ba1ad030d5a707afac54cf4ede7069b959898835", - "sha256:e4807aab1bdeab6ae6f296be46337a260ae4b1f3a8c2fcd373e236b4b2b46efd", - "sha256:e66c14d162bac94973e767b24de5d7e6c5153f7305a64ff4fcba701210bcd638", - "sha256:e97d2f0a06b39e231e59ebab0e6eec45c7683b339e8262299ac952707bdf7688", - "sha256:ec2f56edaf476f70b5831bbd59700b53d9dd011b1f77cd4846b5ab5c5eafdb3f", - "sha256:eda3c2b42dc0c389b7cfda2c4df81c12eeb552019e0de28bde8f913fc3d1fcf3", - "sha256:f228f42f29cc87db67020f7d71624102b2c837686e55317b16e1d3ef2747a993", - "sha256:f408d4b4315e814e5c3668094e33d885f13c7809cbe831cbdc5b1bb8c7a448f4", - "sha256:f9b92431d8b4d4ca5ccbfdbac95b05a3a6cd70cd73aa62f32f9627acfde7549c", - "sha256:fd4b5fbd7b9dde785cfeb486b8cca211a0b138d4f3a7da27db89a25b3c482e5c" - ], - "markers": "python_version >= '3.9'", - "version": "==1.19.0" } }, "develop": { "certifi": { "hashes": [ - "sha256:3d5da6925056f6f18f119200434a4780a94263f10d1c21d032a6f6b2baa20651", - "sha256:ca78db4565a652026a4db2bcdf68f2fb589ea80d0be70e03929ed730746b84fe" + "sha256:0a816057ea3cdefcef70270d2c515e4506bbc954f417fa5ade2021213bb8f0c6", + "sha256:30350364dfe371162649852c63336a15c70c6510c2ad5015b21c2345311805f3" ], "markers": "python_version >= '3.6'", - "version": "==2025.1.31" + "version": "==2025.4.26" }, "charset-normalizer": { "hashes": [ - "sha256:0167ddc8ab6508fe81860a57dd472b2ef4060e8d378f0cc555707126830f2537", - "sha256:01732659ba9b5b873fc117534143e4feefecf3b2078b0a6a2e925271bb6f4cfa", - "sha256:01ad647cdd609225c5350561d084b42ddf732f4eeefe6e678765636791e78b9a", - "sha256:04432ad9479fa40ec0f387795ddad4437a2b50417c69fa275e212933519ff294", - "sha256:0907f11d019260cdc3f94fbdb23ff9125f6b5d1039b76003b5b0ac9d6a6c9d5b", - "sha256:0924e81d3d5e70f8126529951dac65c1010cdf117bb75eb02dd12339b57749dd", - "sha256:09b26ae6b1abf0d27570633b2b078a2a20419c99d66fb2823173d73f188ce601", - "sha256:09b5e6733cbd160dcc09589227187e242a30a49ca5cefa5a7edd3f9d19ed53fd", - "sha256:0af291f4fe114be0280cdd29d533696a77b5b49cfde5467176ecab32353395c4", - "sha256:0f55e69f030f7163dffe9fd0752b32f070566451afe180f99dbeeb81f511ad8d", - "sha256:1a2bc9f351a75ef49d664206d51f8e5ede9da246602dc2d2726837620ea034b2", - "sha256:22e14b5d70560b8dd51ec22863f370d1e595ac3d024cb8ad7d308b4cd95f8313", - "sha256:234ac59ea147c59ee4da87a0c0f098e9c8d169f4dc2a159ef720f1a61bbe27cd", - "sha256:2369eea1ee4a7610a860d88f268eb39b95cb588acd7235e02fd5a5601773d4fa", - "sha256:237bdbe6159cff53b4f24f397d43c6336c6b0b42affbe857970cefbb620911c8", - "sha256:28bf57629c75e810b6ae989f03c0828d64d6b26a5e205535585f96093e405ed1", - "sha256:2967f74ad52c3b98de4c3b32e1a44e32975e008a9cd2a8cc8966d6a5218c5cb2", - "sha256:2a75d49014d118e4198bcee5ee0a6f25856b29b12dbf7cd012791f8a6cc5c496", - "sha256:2bdfe3ac2e1bbe5b59a1a63721eb3b95fc9b6817ae4a46debbb4e11f6232428d", - "sha256:2d074908e1aecee37a7635990b2c6d504cd4766c7bc9fc86d63f9c09af3fa11b", - "sha256:2fb9bd477fdea8684f78791a6de97a953c51831ee2981f8e4f583ff3b9d9687e", - "sha256:311f30128d7d333eebd7896965bfcfbd0065f1716ec92bd5638d7748eb6f936a", - "sha256:329ce159e82018d646c7ac45b01a430369d526569ec08516081727a20e9e4af4", - "sha256:345b0426edd4e18138d6528aed636de7a9ed169b4aaf9d61a8c19e39d26838ca", - "sha256:363e2f92b0f0174b2f8238240a1a30142e3db7b957a5dd5689b0e75fb717cc78", - "sha256:3a3bd0dcd373514dcec91c411ddb9632c0d7d92aed7093b8c3bbb6d69ca74408", - "sha256:3bed14e9c89dcb10e8f3a29f9ccac4955aebe93c71ae803af79265c9ca5644c5", - "sha256:44251f18cd68a75b56585dd00dae26183e102cd5e0f9f1466e6df5da2ed64ea3", - "sha256:44ecbf16649486d4aebafeaa7ec4c9fed8b88101f4dd612dcaf65d5e815f837f", - "sha256:4532bff1b8421fd0a320463030c7520f56a79c9024a4e88f01c537316019005a", - "sha256:49402233c892a461407c512a19435d1ce275543138294f7ef013f0b63d5d3765", - "sha256:4c0907b1928a36d5a998d72d64d8eaa7244989f7aaaf947500d3a800c83a3fd6", - "sha256:4d86f7aff21ee58f26dcf5ae81a9addbd914115cdebcbb2217e4f0ed8982e146", - "sha256:5777ee0881f9499ed0f71cc82cf873d9a0ca8af166dfa0af8ec4e675b7df48e6", - "sha256:5df196eb874dae23dcfb968c83d4f8fdccb333330fe1fc278ac5ceeb101003a9", - "sha256:619a609aa74ae43d90ed2e89bdd784765de0a25ca761b93e196d938b8fd1dbbd", - "sha256:6e27f48bcd0957c6d4cb9d6fa6b61d192d0b13d5ef563e5f2ae35feafc0d179c", - "sha256:6ff8a4a60c227ad87030d76e99cd1698345d4491638dfa6673027c48b3cd395f", - "sha256:73d94b58ec7fecbc7366247d3b0b10a21681004153238750bb67bd9012414545", - "sha256:7461baadb4dc00fd9e0acbe254e3d7d2112e7f92ced2adc96e54ef6501c5f176", - "sha256:75832c08354f595c760a804588b9357d34ec00ba1c940c15e31e96d902093770", - "sha256:7709f51f5f7c853f0fb938bcd3bc59cdfdc5203635ffd18bf354f6967ea0f824", - "sha256:78baa6d91634dfb69ec52a463534bc0df05dbd546209b79a3880a34487f4b84f", - "sha256:7974a0b5ecd505609e3b19742b60cee7aa2aa2fb3151bc917e6e2646d7667dcf", - "sha256:7a4f97a081603d2050bfaffdefa5b02a9ec823f8348a572e39032caa8404a487", - "sha256:7b1bef6280950ee6c177b326508f86cad7ad4dff12454483b51d8b7d673a2c5d", - "sha256:7d053096f67cd1241601111b698f5cad775f97ab25d81567d3f59219b5f1adbd", - "sha256:804a4d582ba6e5b747c625bf1255e6b1507465494a40a2130978bda7b932c90b", - "sha256:807f52c1f798eef6cf26beb819eeb8819b1622ddfeef9d0977a8502d4db6d534", - "sha256:80ed5e856eb7f30115aaf94e4a08114ccc8813e6ed1b5efa74f9f82e8509858f", - "sha256:8417cb1f36cc0bc7eaba8ccb0e04d55f0ee52df06df3ad55259b9a323555fc8b", - "sha256:8436c508b408b82d87dc5f62496973a1805cd46727c34440b0d29d8a2f50a6c9", - "sha256:89149166622f4db9b4b6a449256291dc87a99ee53151c74cbd82a53c8c2f6ccd", - "sha256:8bfa33f4f2672964266e940dd22a195989ba31669bd84629f05fab3ef4e2d125", - "sha256:8c60ca7339acd497a55b0ea5d506b2a2612afb2826560416f6894e8b5770d4a9", - "sha256:91b36a978b5ae0ee86c394f5a54d6ef44db1de0815eb43de826d41d21e4af3de", - "sha256:955f8851919303c92343d2f66165294848d57e9bba6cf6e3625485a70a038d11", - "sha256:97f68b8d6831127e4787ad15e6757232e14e12060bec17091b85eb1486b91d8d", - "sha256:9b23ca7ef998bc739bf6ffc077c2116917eabcc901f88da1b9856b210ef63f35", - "sha256:9f0b8b1c6d84c8034a44893aba5e767bf9c7a211e313a9605d9c617d7083829f", - "sha256:aabfa34badd18f1da5ec1bc2715cadc8dca465868a4e73a0173466b688f29dda", - "sha256:ab36c8eb7e454e34e60eb55ca5d241a5d18b2c6244f6827a30e451c42410b5f7", - "sha256:b010a7a4fd316c3c484d482922d13044979e78d1861f0e0650423144c616a46a", - "sha256:b1ac5992a838106edb89654e0aebfc24f5848ae2547d22c2c3f66454daa11971", - "sha256:b7b2d86dd06bfc2ade3312a83a5c364c7ec2e3498f8734282c6c3d4b07b346b8", - "sha256:b97e690a2118911e39b4042088092771b4ae3fc3aa86518f84b8cf6888dbdb41", - "sha256:bc2722592d8998c870fa4e290c2eec2c1569b87fe58618e67d38b4665dfa680d", - "sha256:c0429126cf75e16c4f0ad00ee0eae4242dc652290f940152ca8c75c3a4b6ee8f", - "sha256:c30197aa96e8eed02200a83fba2657b4c3acd0f0aa4bdc9f6c1af8e8962e0757", - "sha256:c4c3e6da02df6fa1410a7680bd3f63d4f710232d3139089536310d027950696a", - "sha256:c75cb2a3e389853835e84a2d8fb2b81a10645b503eca9bcb98df6b5a43eb8886", - "sha256:c96836c97b1238e9c9e3fe90844c947d5afbf4f4c92762679acfe19927d81d77", - "sha256:d7f50a1f8c450f3925cb367d011448c39239bb3eb4117c36a6d354794de4ce76", - "sha256:d973f03c0cb71c5ed99037b870f2be986c3c05e63622c017ea9816881d2dd247", - "sha256:d98b1668f06378c6dbefec3b92299716b931cd4e6061f3c875a71ced1780ab85", - "sha256:d9c3cdf5390dcd29aa8056d13e8e99526cda0305acc038b96b30352aff5ff2bb", - "sha256:dad3e487649f498dd991eeb901125411559b22e8d7ab25d3aeb1af367df5efd7", - "sha256:dccbe65bd2f7f7ec22c4ff99ed56faa1e9f785482b9bbd7c717e26fd723a1d1e", - "sha256:dd78cfcda14a1ef52584dbb008f7ac81c1328c0f58184bf9a84c49c605002da6", - "sha256:e218488cd232553829be0664c2292d3af2eeeb94b32bea483cf79ac6a694e037", - "sha256:e358e64305fe12299a08e08978f51fc21fac060dcfcddd95453eabe5b93ed0e1", - "sha256:ea0d8d539afa5eb2728aa1932a988a9a7af94f18582ffae4bc10b3fbdad0626e", - "sha256:eab677309cdb30d047996b36d34caeda1dc91149e4fdca0b1a039b3f79d9a807", - "sha256:eb8178fe3dba6450a3e024e95ac49ed3400e506fd4e9e5c32d30adda88cbd407", - "sha256:ecddf25bee22fe4fe3737a399d0d177d72bc22be6913acfab364b40bce1ba83c", - "sha256:eea6ee1db730b3483adf394ea72f808b6e18cf3cb6454b4d86e04fa8c4327a12", - "sha256:f08ff5e948271dc7e18a35641d2f11a4cd8dfd5634f55228b691e62b37125eb3", - "sha256:f30bf9fd9be89ecb2360c7d94a711f00c09b976258846efe40db3d05828e8089", - "sha256:fa88b843d6e211393a37219e6a1c1df99d35e8fd90446f1118f4216e307e48cd", - "sha256:fc54db6c8593ef7d4b2a331b58653356cf04f67c960f584edb7c3d8c97e8f39e", - "sha256:fd4ec41f914fa74ad1b8304bbc634b3de73d2a0889bd32076342a573e0779e00", - "sha256:ffc9202a29ab3920fa812879e95a9e78b2465fd10be7fcbd042899695d75e616" + "sha256:005fa3432484527f9732ebd315da8da8001593e2cf46a3d817669f062c3d9ed4", + "sha256:046595208aae0120559a67693ecc65dd75d46f7bf687f159127046628178dc45", + "sha256:0c29de6a1a95f24b9a1aa7aefd27d2487263f00dfd55a77719b530788f75cff7", + "sha256:0c8c57f84ccfc871a48a47321cfa49ae1df56cd1d965a09abe84066f6853b9c0", + "sha256:0f5d9ed7f254402c9e7d35d2f5972c9bbea9040e99cd2861bd77dc68263277c7", + "sha256:18dd2e350387c87dabe711b86f83c9c78af772c748904d372ade190b5c7c9d4d", + "sha256:1b1bde144d98e446b056ef98e59c256e9294f6b74d7af6846bf5ffdafd687a7d", + "sha256:1c95a1e2902a8b722868587c0e1184ad5c55631de5afc0eb96bc4b0d738092c0", + "sha256:1cad5f45b3146325bb38d6855642f6fd609c3f7cad4dbaf75549bf3b904d3184", + "sha256:21b2899062867b0e1fde9b724f8aecb1af14f2778d69aacd1a5a1853a597a5db", + "sha256:24498ba8ed6c2e0b56d4acbf83f2d989720a93b41d712ebd4f4979660db4417b", + "sha256:25a23ea5c7edc53e0f29bae2c44fcb5a1aa10591aae107f2a2b2583a9c5cbc64", + "sha256:289200a18fa698949d2b39c671c2cc7a24d44096784e76614899a7ccf2574b7b", + "sha256:28a1005facc94196e1fb3e82a3d442a9d9110b8434fc1ded7a24a2983c9888d8", + "sha256:32fc0341d72e0f73f80acb0a2c94216bd704f4f0bce10aedea38f30502b271ff", + "sha256:36b31da18b8890a76ec181c3cf44326bf2c48e36d393ca1b72b3f484113ea344", + "sha256:3c21d4fca343c805a52c0c78edc01e3477f6dd1ad7c47653241cf2a206d4fc58", + "sha256:3fddb7e2c84ac87ac3a947cb4e66d143ca5863ef48e4a5ecb83bd48619e4634e", + "sha256:43e0933a0eff183ee85833f341ec567c0980dae57c464d8a508e1b2ceb336471", + "sha256:4a476b06fbcf359ad25d34a057b7219281286ae2477cc5ff5e3f70a246971148", + "sha256:4e594135de17ab3866138f496755f302b72157d115086d100c3f19370839dd3a", + "sha256:50bf98d5e563b83cc29471fa114366e6806bc06bc7a25fd59641e41445327836", + "sha256:5a9979887252a82fefd3d3ed2a8e3b937a7a809f65dcb1e068b090e165bbe99e", + "sha256:5baececa9ecba31eff645232d59845c07aa030f0c81ee70184a90d35099a0e63", + "sha256:5bf4545e3b962767e5c06fe1738f951f77d27967cb2caa64c28be7c4563e162c", + "sha256:6333b3aa5a12c26b2a4d4e7335a28f1475e0e5e17d69d55141ee3cab736f66d1", + "sha256:65c981bdbd3f57670af8b59777cbfae75364b483fa8a9f420f08094531d54a01", + "sha256:68a328e5f55ec37c57f19ebb1fdc56a248db2e3e9ad769919a58672958e8f366", + "sha256:6a0289e4589e8bdfef02a80478f1dfcb14f0ab696b5a00e1f4b8a14a307a3c58", + "sha256:6b66f92b17849b85cad91259efc341dce9c1af48e2173bf38a85c6329f1033e5", + "sha256:6c9379d65defcab82d07b2a9dfbfc2e95bc8fe0ebb1b176a3190230a3ef0e07c", + "sha256:6fc1f5b51fa4cecaa18f2bd7a003f3dd039dd615cd69a2afd6d3b19aed6775f2", + "sha256:70f7172939fdf8790425ba31915bfbe8335030f05b9913d7ae00a87d4395620a", + "sha256:721c76e84fe669be19c5791da68232ca2e05ba5185575086e384352e2c309597", + "sha256:7222ffd5e4de8e57e03ce2cef95a4c43c98fcb72ad86909abdfc2c17d227fc1b", + "sha256:75d10d37a47afee94919c4fab4c22b9bc2a8bf7d4f46f87363bcf0573f3ff4f5", + "sha256:76af085e67e56c8816c3ccf256ebd136def2ed9654525348cfa744b6802b69eb", + "sha256:770cab594ecf99ae64c236bc9ee3439c3f46be49796e265ce0cc8bc17b10294f", + "sha256:7a6ab32f7210554a96cd9e33abe3ddd86732beeafc7a28e9955cdf22ffadbab0", + "sha256:7c48ed483eb946e6c04ccbe02c6b4d1d48e51944b6db70f697e089c193404941", + "sha256:7f56930ab0abd1c45cd15be65cc741c28b1c9a34876ce8c17a2fa107810c0af0", + "sha256:8075c35cd58273fee266c58c0c9b670947c19df5fb98e7b66710e04ad4e9ff86", + "sha256:8272b73e1c5603666618805fe821edba66892e2870058c94c53147602eab29c7", + "sha256:82d8fd25b7f4675d0c47cf95b594d4e7b158aca33b76aa63d07186e13c0e0ab7", + "sha256:844da2b5728b5ce0e32d863af26f32b5ce61bc4273a9c720a9f3aa9df73b1455", + "sha256:8755483f3c00d6c9a77f490c17e6ab0c8729e39e6390328e42521ef175380ae6", + "sha256:915f3849a011c1f593ab99092f3cecfcb4d65d8feb4a64cf1bf2d22074dc0ec4", + "sha256:926ca93accd5d36ccdabd803392ddc3e03e6d4cd1cf17deff3b989ab8e9dbcf0", + "sha256:982bb1e8b4ffda883b3d0a521e23abcd6fd17418f6d2c4118d257a10199c0ce3", + "sha256:98f862da73774290f251b9df8d11161b6cf25b599a66baf087c1ffe340e9bfd1", + "sha256:9cbfacf36cb0ec2897ce0ebc5d08ca44213af24265bd56eca54bee7923c48fd6", + "sha256:a370b3e078e418187da8c3674eddb9d983ec09445c99a3a263c2011993522981", + "sha256:a955b438e62efdf7e0b7b52a64dc5c3396e2634baa62471768a64bc2adb73d5c", + "sha256:aa6af9e7d59f9c12b33ae4e9450619cf2488e2bbe9b44030905877f0b2324980", + "sha256:aa88ca0b1932e93f2d961bf3addbb2db902198dca337d88c89e1559e066e7645", + "sha256:aaeeb6a479c7667fbe1099af9617c83aaca22182d6cf8c53966491a0f1b7ffb7", + "sha256:aaf27faa992bfee0264dc1f03f4c75e9fcdda66a519db6b957a3f826e285cf12", + "sha256:b2680962a4848b3c4f155dc2ee64505a9c57186d0d56b43123b17ca3de18f0fa", + "sha256:b2d318c11350e10662026ad0eb71bb51c7812fc8590825304ae0bdd4ac283acd", + "sha256:b33de11b92e9f75a2b545d6e9b6f37e398d86c3e9e9653c4864eb7e89c5773ef", + "sha256:b3daeac64d5b371dea99714f08ffc2c208522ec6b06fbc7866a450dd446f5c0f", + "sha256:be1e352acbe3c78727a16a455126d9ff83ea2dfdcbc83148d2982305a04714c2", + "sha256:bee093bf902e1d8fc0ac143c88902c3dfc8941f7ea1d6a8dd2bcb786d33db03d", + "sha256:c72fbbe68c6f32f251bdc08b8611c7b3060612236e960ef848e0a517ddbe76c5", + "sha256:c9e36a97bee9b86ef9a1cf7bb96747eb7a15c2f22bdb5b516434b00f2a599f02", + "sha256:cddf7bd982eaa998934a91f69d182aec997c6c468898efe6679af88283b498d3", + "sha256:cf713fe9a71ef6fd5adf7a79670135081cd4431c2943864757f0fa3a65b1fafd", + "sha256:d11b54acf878eef558599658b0ffca78138c8c3655cf4f3a4a673c437e67732e", + "sha256:d41c4d287cfc69060fa91cae9683eacffad989f1a10811995fa309df656ec214", + "sha256:d524ba3f1581b35c03cb42beebab4a13e6cdad7b36246bd22541fa585a56cccd", + "sha256:daac4765328a919a805fa5e2720f3e94767abd632ae410a9062dff5412bae65a", + "sha256:db4c7bf0e07fc3b7d89ac2a5880a6a8062056801b83ff56d8464b70f65482b6c", + "sha256:dc7039885fa1baf9be153a0626e337aa7ec8bf96b0128605fb0d77788ddc1681", + "sha256:dccab8d5fa1ef9bfba0590ecf4d46df048d18ffe3eec01eeb73a42e0d9e7a8ba", + "sha256:dedb8adb91d11846ee08bec4c8236c8549ac721c245678282dcb06b221aab59f", + "sha256:e45ba65510e2647721e35323d6ef54c7974959f6081b58d4ef5d87c60c84919a", + "sha256:e53efc7c7cee4c1e70661e2e112ca46a575f90ed9ae3fef200f2a25e954f4b28", + "sha256:e635b87f01ebc977342e2697d05b56632f5f879a4f15955dfe8cef2448b51691", + "sha256:e70e990b2137b29dc5564715de1e12701815dacc1d056308e2b17e9095372a82", + "sha256:e8082b26888e2f8b36a042a58307d5b917ef2b1cacab921ad3323ef91901c71a", + "sha256:e8323a9b031aa0393768b87f04b4164a40037fb2a3c11ac06a03ffecd3618027", + "sha256:e92fca20c46e9f5e1bb485887d074918b13543b1c2a1185e69bb8d17ab6236a7", + "sha256:eb30abc20df9ab0814b5a2524f23d75dcf83cde762c161917a2b4b7b55b1e518", + "sha256:eba9904b0f38a143592d9fc0e19e2df0fa2e41c3c3745554761c5f6447eedabf", + "sha256:ef8de666d6179b009dce7bcb2ad4c4a779f113f12caf8dc77f0162c29d20490b", + "sha256:efd387a49825780ff861998cd959767800d54f8308936b21025326de4b5a42b9", + "sha256:f0aa37f3c979cf2546b73e8222bbfa3dc07a641585340179d768068e3455e544", + "sha256:f4074c5a429281bf056ddd4c5d3b740ebca4d43ffffe2ef4bf4d2d05114299da", + "sha256:f69a27e45c43520f5487f27627059b64aaf160415589230992cec34c5e18a509", + "sha256:fb707f3e15060adf5b7ada797624a6c6e0138e2a26baa089df64c68ee98e040f", + "sha256:fcbe676a55d7445b22c10967bceaaf0ee69407fbe0ece4d032b6eb8d4565982a", + "sha256:fdb20a30fe1175ecabed17cbf7812f7b804b8a315a25f24678bcdf120a90077f" ], "markers": "python_version >= '3.7'", - "version": "==3.4.1" + "version": "==3.4.2" }, "coverage": { "hashes": [ @@ -2070,19 +1550,19 @@ }, "packaging": { "hashes": [ - "sha256:09abb1bccd265c01f4a3aa3f7a7db064b36514d2cba19a2f694fe6150451a759", - "sha256:c228a6dc5e932d346bc5739379109d49e8853dd8223571c7c5b55260edc0b97f" + "sha256:29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484", + "sha256:d443872c98d677bf60f6a1f2f8c1cb748e8fe762d2bf9d3148b5599295b0fc4f" ], "markers": "python_version >= '3.8'", - "version": "==24.2" + "version": "==25.0" }, "pluggy": { "hashes": [ - "sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1", - "sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669" + "sha256:7dcc130b76258d33b90f61b658791dede3486c3e6bfb003ee5c9bfb396dd22f3", + "sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746" ], - "markers": "python_version >= '3.8'", - "version": "==1.5.0" + "markers": "python_version >= '3.9'", + "version": "==1.6.0" }, "pytest": { "hashes": [ diff --git a/dbrepo-dashboard-service/app.py b/dbrepo-dashboard-service/app.py index fafca139f43f7763a3757a4a33c24c31a3456c0c..20f4c8aaf2f589e2d554619f738f63f1d2457024 100644 --- a/dbrepo-dashboard-service/app.py +++ b/dbrepo-dashboard-service/app.py @@ -29,17 +29,32 @@ dictConfig({ 'format': '[%(asctime)s] %(levelname)s in %(module)s: %(message)s', }, 'simple': { - 'format': '[%(asctime)s] %(levelname)s: %(message)s', + 'format': '[%(asctime)s] [%(levelname)s] %(message)s', + }, + 'ecs': { + 'format': '{"@timestamp": "%(asctime)s", "log.level": "%(levelname)s", "log.logger": "%(module)s", "message": "%(message)s", "service_name": "dashboard-service", "service_version": "1.9.0"}', + 'datefmt': '%Y-%m-%dT%H:%M:%S' + }, + }, + 'handlers': { + 'wsgi': { + 'class': 'logging.StreamHandler', + 'stream': 'ext://flask.logging.wsgi_errors_stream', + 'formatter': 'simple' + }, + 'file': { + 'class': 'logging.handlers.TimedRotatingFileHandler', + 'formatter': 'ecs', + 'filename': '/var/log/app/service/dashboard/app.log', + 'when': 'm', + 'interval': 1, + 'backupCount': 5, + 'encoding': 'utf8' }, }, - 'handlers': {'wsgi': { - 'class': 'logging.StreamHandler', - 'stream': 'ext://flask.logging.wsgi_errors_stream', - 'formatter': 'simple' # default - }}, 'root': { 'level': 'DEBUG', - 'handlers': ['wsgi'] + 'handlers': ['wsgi', 'file'] } }) @@ -60,8 +75,8 @@ swagger_config = { "headers": [], "specs": [ { - "endpoint": "api-dashboard", - "route": "/api-dashboard.json", + "endpoint": "api-docs", + "route": "/api-docs.json", "rule_filter": lambda rule: True, "model_filter": lambda tag: True, # all in } @@ -76,7 +91,7 @@ template = { "info": { "title": "Database Repository Dashboard Service API", "description": "Service that manages the dashboards", - "version": "1.8.1", + "version": "1.9.0", "contact": { "name": "Prof. Andreas Rauber", "email": "andreas.rauber@tuwien.ac.at" @@ -191,7 +206,7 @@ def health(): @app.route("/api/dashboard", methods=["POST"], endpoint="create_dashboard") @metrics.gauge(name='dbrepo_create_dashboard', description='Time needed to create dashboard') -@swag_from("ds-yml/create_dashboard.yml") +@swag_from("/app/ds-yml/create_dashboard.yml") @auth.login_required(role=['system']) def create_dashboard(): for parameter in [param for param in ['is_public', 'is_schema_public', 'owner_username', 'database_name'] if @@ -220,14 +235,14 @@ def create_dashboard(): @app.route("/api/dashboard/<string:uid>", methods=["PUT"], endpoint="update_dashboard") @metrics.gauge(name='dbrepo_update_dashboard', description='Time needed to update dashboard') -@swag_from("ds-yml/update_dashboard.yml") +@swag_from("/app/ds-yml/update_dashboard.yml") @auth.login_required(role=['system']) def update_dashboard(uid: str): logging.debug(f'endpoint update dashboard, uid={uid}') try: database = Database.model_validate(request.json) except ValidationError as e: - logging.error(f'Model malformed: {e}') + logging.error(f'Model malformed: {str(e).strip()}') return Response(ApiError(status='BAD_REQUEST', message='Invalid database format', code='error.database.malformed').model_dump_json(), 400, headers) try: diff --git a/dbrepo-dashboard-service/init.Dockerfile b/dbrepo-dashboard-service/init.Dockerfile index 4d00c467cd4621e894c456e4a7325d87108ccfb3..a7f6beecd2cc19ca3ac47f99769f8c48f3be4a33 100644 --- a/dbrepo-dashboard-service/init.Dockerfile +++ b/dbrepo-dashboard-service/init.Dockerfile @@ -18,6 +18,9 @@ RUN adduser -D dbrepo --uid 1001 WORKDIR /app +RUN mkdir -p /var/log/app/service/dashboard && \ + chown -R 1001:1001 /var/log/app + USER 1001 COPY --chown=1001 ./init.py ./init.py diff --git a/dbrepo-dashboard-service/init.py b/dbrepo-dashboard-service/init.py index 54c01f55ebc063e0b97a4ce799ba4d529e1a5627..448a739e1e6949a4bca1e8436e97ba15b6794160 100644 --- a/dbrepo-dashboard-service/init.py +++ b/dbrepo-dashboard-service/init.py @@ -18,17 +18,32 @@ dictConfig({ 'format': '[%(asctime)s] %(levelname)s in %(module)s: %(message)s', }, 'simple': { - 'format': '[%(asctime)s] %(levelname)s: %(message)s', + 'format': '[%(asctime)s] [%(levelname)s] %(message)s', + }, + 'ecs': { + 'format': '{"@timestamp": "%(asctime)s", "log.level": "%(levelname)s", "log.logger": "%(module)s", "message": "%(message)s", "service_name": "dashboard-service-init", "service_version": "1.9.0"}', + 'datefmt': '%Y-%m-%dT%H:%M:%S' + }, + }, + 'handlers': { + 'wsgi': { + 'class': 'logging.StreamHandler', + 'stream': 'ext://flask.logging.wsgi_errors_stream', + 'formatter': 'simple' + }, + 'file': { + 'class': 'logging.handlers.TimedRotatingFileHandler', + 'formatter': 'ecs', + 'filename': '/var/log/app/service/dashboard/init.log', + 'when': 'm', + 'interval': 1, + 'backupCount': 5, + 'encoding': 'utf8' }, }, - 'handlers': {'wsgi': { - 'class': 'logging.StreamHandler', - 'stream': 'ext://flask.logging.wsgi_errors_stream', - 'formatter': 'simple' # default - }}, 'root': { 'level': 'DEBUG', - 'handlers': ['wsgi'] + 'handlers': ['wsgi', 'file'] } }) diff --git a/dbrepo-dashboard-service/lib/dbrepo-1.8.1.tar.gz b/dbrepo-dashboard-service/lib/dbrepo-1.8.1.tar.gz deleted file mode 100644 index d13869fc6f53ed38c9580789746781d52a6d0b69..0000000000000000000000000000000000000000 Binary files a/dbrepo-dashboard-service/lib/dbrepo-1.8.1.tar.gz and /dev/null differ diff --git a/dbrepo-search-service/lib/dbrepo-1.8.1-py3-none-any.whl b/dbrepo-dashboard-service/lib/dbrepo-1.9.0-py3-none-any.whl similarity index 83% rename from dbrepo-search-service/lib/dbrepo-1.8.1-py3-none-any.whl rename to dbrepo-dashboard-service/lib/dbrepo-1.9.0-py3-none-any.whl index 289f081b95f69e34e6d8a947642d7966b55a3b68..c0a8976b56d2534aac0a687119d64d800edc6a57 100644 Binary files a/dbrepo-search-service/lib/dbrepo-1.8.1-py3-none-any.whl and b/dbrepo-dashboard-service/lib/dbrepo-1.9.0-py3-none-any.whl differ diff --git a/dbrepo-dashboard-service/lib/dbrepo-1.9.0.tar.gz b/dbrepo-dashboard-service/lib/dbrepo-1.9.0.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..a3f637e0f89cf40643cc39b4778760128a9b717f Binary files /dev/null and b/dbrepo-dashboard-service/lib/dbrepo-1.9.0.tar.gz differ diff --git a/dbrepo-dashboard-service/tests/test_integration_app.py b/dbrepo-dashboard-service/tests/test_integration_app.py index c345e00dee1fdc88f5a4bc9d6277d7cef430b36f..59dc094f56a84c3eb0b2a89fa836e3bde05c51dc 100644 --- a/dbrepo-dashboard-service/tests/test_integration_app.py +++ b/dbrepo-dashboard-service/tests/test_integration_app.py @@ -1,4 +1,4 @@ -import os +import logging import os import time import unittest @@ -134,8 +134,7 @@ class AppIntegrationTest(unittest.TestCase): def test_update_dashboard_no_auth_fails(self): with app.test_client() as test_client: - headers = {'Authorization': f'Bearer {self.token(["system"])}', - 'Content-Type': 'application/json'} + headers = {'Authorization': f'Bearer {self.token(["system"])}', 'Content-Type': 'application/json'} json_payload = dict({'is_public': True, 'is_schema_public': True, 'database_name': 'some_database', @@ -148,8 +147,7 @@ class AppIntegrationTest(unittest.TestCase): def test_update_dashboard_no_body_fails(self): with app.test_client() as test_client: - headers = {'Authorization': f'Bearer {self.token(["system"])}', - 'Content-Type': 'application/json'} + headers = {'Authorization': f'Bearer {self.token(["system"])}', 'Content-Type': 'application/json'} json_payload = dict({'is_public': True, 'is_schema_public': True, 'database_name': 'some_database', @@ -163,8 +161,7 @@ class AppIntegrationTest(unittest.TestCase): def test_update_dashboard_empty_body_fails(self): with app.test_client() as test_client: - headers = {'Authorization': f'Bearer {self.token(["system"])}', - 'Content-Type': 'application/json'} + headers = {'Authorization': f'Bearer {self.token(["system"])}', 'Content-Type': 'application/json'} json_payload = dict({'is_public': True, 'is_schema_public': True, 'database_name': 'some_database', @@ -177,8 +174,7 @@ class AppIntegrationTest(unittest.TestCase): def test_update_dashboard_malformed_body_fails(self): with app.test_client() as test_client: - headers = {'Authorization': f'Bearer {self.token(["system"])}', - 'Content-Type': 'application/json'} + headers = {'Authorization': f'Bearer {self.token(["system"])}', 'Content-Type': 'application/json'} json_payload = dict({'is_public': True, 'is_schema_public': True, 'database_name': 'some_database', @@ -192,8 +188,7 @@ class AppIntegrationTest(unittest.TestCase): def test_update_dashboard_succeeds(self): with app.test_client() as test_client: - headers = {'Authorization': f'Bearer {self.token(["system"])}', - 'Content-Type': 'application/json'} + headers = {'Authorization': f'Bearer {self.token(["system"])}', 'Content-Type': 'application/json'} json_payload = dict({'is_public': True, 'is_schema_public': True, 'is_dashboard_enabled': True, @@ -233,7 +228,7 @@ class AppIntegrationTest(unittest.TestCase): exchange_name="dbrepo", is_public=True, is_schema_public=True, - is_dashboard_enabled=False, # <<< + is_dashboard_enabled=False, # <<< container=ContainerBrief(id="7efe8b27-6cdc-4387-80e3-92ee28f4a7c5", name="MariaDB", internal_name="mariadb", @@ -270,8 +265,7 @@ class AppIntegrationTest(unittest.TestCase): val_max=10)] )]) with app.test_client() as test_client: - headers = {'Authorization': f'Bearer {self.token(["system"])}', - 'Content-Type': 'application/json'} + headers = {'Authorization': f'Bearer {self.token(["system"])}', 'Content-Type': 'application/json'} json_payload = dict({'is_public': True, 'is_schema_public': True, 'is_dashboard_enabled': False, @@ -287,10 +281,9 @@ class AppIntegrationTest(unittest.TestCase): dashboard = self.dashboard_client().find(req.dashboard_uid)['dashboard'] self.assertEqual([], dashboard['tags']) - def test_update_dashboard_not_found_fails(self): + def test_update_dashboard_not_found_created_succeeds(self): with app.test_client() as test_client: - headers = {'Authorization': f'Bearer {self.token(["system"])}', - 'Content-Type': 'application/json'} + headers = {'Authorization': f'Bearer {self.token(["system"])}', 'Content-Type': 'application/json'} # test - response = test_client.put(f"/api/dashboard/idonotexist", headers=headers, json=req.model_dump()) - self.assertEqual(404, response.status_code) + response = test_client.put(f"/api/dashboard/{req.dashboard_uid}", headers=headers, json=req.model_dump()) + self.assertEqual(202, response.status_code) diff --git a/dbrepo-dashboard-ui/Dockerfile b/dbrepo-dashboard-ui/Dockerfile deleted file mode 100644 index 83683e3926506228216d274c3d50eea2dbef3d9f..0000000000000000000000000000000000000000 --- a/dbrepo-dashboard-ui/Dockerfile +++ /dev/null @@ -1,7 +0,0 @@ -FROM --platform=$BUILDPLATFORM docker.io/bitnami/grafana:11.5.3 AS runtime -LABEL org.opencontainers.image.authors="martin.weise@tuwien.ac.at" - -COPY --chown=grafana:grafana ./grafana.ini ./conf/grafana.ini -COPY --chown=grafana:grafana ./ldap.toml ./conf/ldap.toml -COPY --chown=grafana:grafana ./dashboards /app/dashboards -COPY --chown=grafana:grafana ./provisioning ./conf/provisioning diff --git a/dbrepo-dashboard-ui/dashboards/System/dbrepo.json b/dbrepo-dashboard-ui/dashboards/System/dbrepo.json index 6ce787d4560b063971bff8255b63b96b055ca9b8..0d3f4956b04c666a30d35c26ab9b3076b5db59a1 100644 --- a/dbrepo-dashboard-ui/dashboards/System/dbrepo.json +++ b/dbrepo-dashboard-ui/dashboards/System/dbrepo.json @@ -18,7 +18,7 @@ "editable": true, "fiscalYearStartMonth": 0, "graphTooltip": 1, - "id": 3, + "id": 5, "links": [ { "asDropdown": false, @@ -30,11 +30,12 @@ "title": "Docs", "tooltip": "", "type": "link", - "url": "https://www.ifs.tuwien.ac.at/infrastructures/dbrepo/1.7/" + "url": "https://www.ifs.tuwien.ac.at/infrastructures/dbrepo/1.9/" } ], "panels": [ { + "collapsed": false, "gridPos": { "h": 1, "w": 24, @@ -42,6 +43,7 @@ "y": 0 }, "id": 34, + "panels": [], "title": "tl;dr", "type": "row" }, @@ -110,7 +112,7 @@ "textMode": "auto", "wideLayout": true }, - "pluginVersion": "10.4.9", + "pluginVersion": "11.3.1", "targets": [ { "datasource": { @@ -119,7 +121,7 @@ }, "disableTextWrap": false, "editorMode": "code", - "expr": "sum(up)*100/count(up)", + "expr": "sum(up{instance=~\".*-service.*|ui.*|.*-db-metrics.*\"})*100/count(up{instance=~\".*-service.*|ui.*|.*-db-metrics.*\"})", "fullMetaSearch": false, "includeNullMetadata": true, "instant": false, @@ -180,7 +182,7 @@ "textMode": "auto", "wideLayout": true }, - "pluginVersion": "10.4.9", + "pluginVersion": "11.3.1", "targets": [ { "datasource": { @@ -248,7 +250,7 @@ "textMode": "auto", "wideLayout": true }, - "pluginVersion": "10.4.9", + "pluginVersion": "11.3.1", "targets": [ { "datasource": { @@ -316,7 +318,7 @@ "textMode": "auto", "wideLayout": true }, - "pluginVersion": "10.4.9", + "pluginVersion": "11.3.1", "targets": [ { "datasource": { @@ -432,7 +434,7 @@ "textMode": "auto", "wideLayout": true }, - "pluginVersion": "10.4.9", + "pluginVersion": "11.3.1", "targets": [ { "datasource": { @@ -478,7 +480,7 @@ }, "gridPos": { "h": 7, - "w": 8, + "w": 12, "x": 0, "y": 4 }, @@ -503,10 +505,12 @@ "values": false }, "tooltip": { + "hideZeros": false, "mode": "single", "sort": "none" } }, + "pluginVersion": "11.3.1", "targets": [ { "datasource": { @@ -524,6 +528,104 @@ "title": "Popular Data Sources", "type": "piechart" }, + { + "datasource": { + "type": "prometheus", + "uid": "dbrepometrics0" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "smooth", + "lineWidth": 2, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 7, + "w": 12, + "x": 12, + "y": 4 + }, + "id": 40, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "hideZeros": false, + "mode": "single", + "sort": "none" + } + }, + "pluginVersion": "11.3.1", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "dbrepometrics0" + }, + "disableTextWrap": false, + "editorMode": "builder", + "expr": "SeaweedFS_s3_request_total", + "fullMetaSearch": false, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "{{type}}", + "range": true, + "refId": "A", + "useBackend": false + } + ], + "title": "S3 Requests", + "type": "timeseries" + }, { "collapsed": false, "gridPos": { @@ -597,7 +699,7 @@ "textMode": "auto", "wideLayout": true }, - "pluginVersion": "10.4.9", + "pluginVersion": "11.3.1", "targets": [ { "datasource": { @@ -679,7 +781,7 @@ "textMode": "auto", "wideLayout": true }, - "pluginVersion": "10.4.9", + "pluginVersion": "11.3.1", "targets": [ { "datasource": { @@ -716,8 +818,16 @@ "mode": "absolute", "steps": [ { - "color": "blue", + "color": "red", "value": null + }, + { + "color": "yellow", + "value": 1 + }, + { + "color": "green", + "value": 2 } ] }, @@ -749,7 +859,7 @@ "textMode": "auto", "wideLayout": true }, - "pluginVersion": "10.4.9", + "pluginVersion": "11.3.1", "targets": [ { "datasource": { @@ -786,8 +896,12 @@ "mode": "absolute", "steps": [ { - "color": "blue", + "color": "red", "value": null + }, + { + "color": "green", + "value": 1 } ] }, @@ -819,7 +933,7 @@ "textMode": "auto", "wideLayout": true }, - "pluginVersion": "10.4.9", + "pluginVersion": "11.3.1", "targets": [ { "datasource": { @@ -858,7 +972,7 @@ "mode": "absolute", "steps": [ { - "color": "blue", + "color": "green", "value": null } ] @@ -879,6 +993,7 @@ "graphMode": "none", "justifyMode": "auto", "orientation": "auto", + "percentChangeColorMode": "standard", "reduceOptions": { "calcs": [ "lastNotNull" @@ -890,7 +1005,7 @@ "textMode": "auto", "wideLayout": true }, - "pluginVersion": "10.4.9", + "pluginVersion": "11.3.1", "targets": [ { "datasource": { @@ -957,6 +1072,12 @@ "id": 20, "options": { "displayMode": "basic", + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": false + }, "maxVizHeight": 300, "minVizHeight": 16, "minVizWidth": 8, @@ -973,7 +1094,7 @@ "sizing": "auto", "valueMode": "color" }, - "pluginVersion": "10.4.9", + "pluginVersion": "11.3.1", "targets": [ { "datasource": { @@ -1012,6 +1133,7 @@ "axisLabel": "", "axisPlacement": "auto", "barAlignment": 0, + "barWidthFactor": 0.6, "drawStyle": "line", "fillOpacity": 0, "gradientMode": "none", @@ -1070,10 +1192,12 @@ "showLegend": true }, "tooltip": { + "hideZeros": false, "mode": "multi", "sort": "none" } }, + "pluginVersion": "11.3.1", "targets": [ { "datasource": { @@ -1113,7 +1237,7 @@ "type": "prometheus", "uid": "dbrepometrics0" }, - "description": "Quality of Service", + "description": "", "fieldConfig": { "defaults": { "mappings": [], @@ -1122,93 +1246,13 @@ "thresholds": { "mode": "absolute", "steps": [ - { - "color": "purple" - }, { "color": "red", - "value": 0 - }, - { - "color": "orange", - "value": 60 - }, - { - "color": "#EAB839", - "value": 80 + "value": null }, { "color": "green", - "value": 100 - } - ] - }, - "unit": "percent" - }, - "overrides": [] - }, - "gridPos": { - "h": 3, - "w": 4, - "x": 0, - "y": 23 - }, - "id": 32, - "options": { - "colorMode": "background", - "graphMode": "none", - "justifyMode": "auto", - "orientation": "auto", - "percentChangeColorMode": "standard", - "reduceOptions": { - "calcs": [ - "lastNotNull" - ], - "fields": "", - "values": false - }, - "showPercentChange": false, - "textMode": "auto", - "wideLayout": true - }, - "pluginVersion": "10.4.9", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "dbrepometrics0" - }, - "disableTextWrap": false, - "editorMode": "code", - "expr": "rabbitmq_channels*100/rabbitmq_channel_consumers", - "fullMetaSearch": false, - "includeNullMetadata": true, - "instant": false, - "legendFormat": "Services Running", - "range": true, - "refId": "A", - "useBackend": false - } - ], - "title": "Broker Service QoS", - "type": "stat" - }, - { - "datasource": { - "type": "prometheus", - "uid": "dbrepometrics0" - }, - "description": "", - "fieldConfig": { - "defaults": { - "mappings": [], - "max": 100, - "min": 0, - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "blue" + "value": 1 } ] }, @@ -1219,7 +1263,7 @@ "gridPos": { "h": 3, "w": 4, - "x": 4, + "x": 0, "y": 23 }, "id": 29, @@ -1240,7 +1284,7 @@ "textMode": "auto", "wideLayout": true }, - "pluginVersion": "10.4.9", + "pluginVersion": "11.3.1", "targets": [ { "datasource": { @@ -1277,7 +1321,12 @@ "mode": "absolute", "steps": [ { - "color": "blue" + "color": "red", + "value": null + }, + { + "color": "green", + "value": 1 } ] }, @@ -1288,7 +1337,7 @@ "gridPos": { "h": 3, "w": 4, - "x": 8, + "x": 4, "y": 23 }, "id": 30, @@ -1309,7 +1358,7 @@ "textMode": "auto", "wideLayout": true }, - "pluginVersion": "10.4.9", + "pluginVersion": "11.3.1", "targets": [ { "datasource": { @@ -1346,7 +1395,8 @@ "mode": "absolute", "steps": [ { - "color": "green" + "color": "green", + "value": null }, { "color": "#EAB839", @@ -1369,7 +1419,7 @@ "gridPos": { "h": 3, "w": 4, - "x": 12, + "x": 8, "y": 23 }, "id": 35, @@ -1390,7 +1440,7 @@ "textMode": "auto", "wideLayout": true }, - "pluginVersion": "10.4.9", + "pluginVersion": "11.3.1", "targets": [ { "datasource": { @@ -1427,7 +1477,8 @@ "mode": "absolute", "steps": [ { - "color": "green" + "color": "green", + "value": null }, { "color": "#EAB839", @@ -1450,7 +1501,7 @@ "gridPos": { "h": 3, "w": 4, - "x": 16, + "x": 12, "y": 23 }, "id": 36, @@ -1471,7 +1522,7 @@ "textMode": "auto", "wideLayout": true }, - "pluginVersion": "10.4.9", + "pluginVersion": "11.3.1", "targets": [ { "datasource": { @@ -1508,7 +1559,8 @@ "mode": "absolute", "steps": [ { - "color": "green" + "color": "green", + "value": null }, { "color": "#EAB839", @@ -1531,7 +1583,7 @@ "gridPos": { "h": 3, "w": 4, - "x": 20, + "x": 16, "y": 23 }, "id": 37, @@ -1552,7 +1604,7 @@ "textMode": "auto", "wideLayout": true }, - "pluginVersion": "10.4.9", + "pluginVersion": "11.3.1", "targets": [ { "datasource": { @@ -1592,6 +1644,7 @@ "axisLabel": "", "axisPlacement": "auto", "barAlignment": 0, + "barWidthFactor": 0.6, "drawStyle": "line", "fillOpacity": 0, "gradientMode": "none", @@ -1622,7 +1675,8 @@ "mode": "absolute", "steps": [ { - "color": "green" + "color": "green", + "value": null } ] }, @@ -1676,11 +1730,12 @@ "showLegend": true }, "tooltip": { + "hideZeros": false, "mode": "single", "sort": "none" } }, - "pluginVersion": "10.4.3", + "pluginVersion": "11.3.1", "targets": [ { "datasource": { @@ -1702,72 +1757,41 @@ "title": "Throughput", "type": "timeseries" }, - { - "collapsed": false, - "gridPos": { - "h": 1, - "w": 24, - "x": 0, - "y": 33 - }, - "id": 2, - "panels": [], - "title": "REST API", - "type": "row" - }, { "datasource": { "type": "prometheus", "uid": "dbrepometrics0" }, - "description": "", "fieldConfig": { "defaults": { "color": { - "mode": "palette-classic" + "mode": "thresholds" }, - "custom": { - "axisBorderShow": false, - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "smooth", - "lineWidth": 2, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" + "mappings": [ + { + "options": { + "0": { + "index": 0, + "text": "DOWN" + }, + "1": { + "index": 1, + "text": "UP" + } + }, + "type": "value" } - }, - "mappings": [], + ], "thresholds": { "mode": "absolute", "steps": [ { - "color": "green" + "color": "red", + "value": null }, { - "color": "red", - "value": 80 + "color": "green", + "value": 1 } ] } @@ -1777,23 +1801,35 @@ "gridPos": { "h": 7, "w": 12, - "x": 0, - "y": 34 + "x": 12, + "y": 26 }, - "id": 23, + "id": 16, "options": { + "displayMode": "basic", "legend": { "calcs": [], "displayMode": "list", "placement": "bottom", - "showLegend": true + "showLegend": false }, - "tooltip": { - "mode": "multi", - "sort": "none" - } + "maxVizHeight": 300, + "minVizHeight": 16, + "minVizWidth": 8, + "namePlacement": "auto", + "orientation": "auto", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "showUnfilled": true, + "sizing": "auto", + "valueMode": "color" }, - "pluginVersion": "10.4.9", + "pluginVersion": "11.3.1", "targets": [ { "datasource": { @@ -1801,63 +1837,89 @@ "uid": "dbrepometrics0" }, "disableTextWrap": false, - "editorMode": "code", - "expr": "process_open_fds\n", + "editorMode": "builder", + "expr": "up{instance=~\".*-service.*|ui.*|.*-db-metrics.*\"}", "fullMetaSearch": false, + "hide": false, "includeNullMetadata": true, "instant": false, "legendFormat": "{{instance}}", "range": true, - "refId": "process_open_fds", + "refId": "A", "useBackend": false } ], - "title": "File Descriptors", - "type": "timeseries" + "title": "Service QoS", + "type": "bargauge" + }, + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 33 + }, + "id": 2, + "panels": [], + "title": "REST API", + "type": "row" }, { "datasource": { "type": "prometheus", "uid": "dbrepometrics0" }, + "description": "", "fieldConfig": { "defaults": { "color": { - "mode": "thresholds" + "mode": "palette-classic" }, "custom": { - "fillOpacity": 70, + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", "hideFrom": { "legend": false, "tooltip": false, "viz": false }, - "lineWidth": 1 - }, - "mappings": [ - { - "options": { - "0": { - "index": 0, - "text": "DOWN" - }, - "1": { - "index": 1, - "text": "UP" - } - }, - "type": "value" + "insertNulls": false, + "lineInterpolation": "smooth", + "lineWidth": 2, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" } - ], + }, + "mappings": [], "thresholds": { "mode": "absolute", "steps": [ { - "color": "red" + "color": "green", + "value": null }, { - "color": "green", - "value": 1 + "color": "red", + "value": 80 } ] } @@ -1867,24 +1929,24 @@ "gridPos": { "h": 7, "w": 12, - "x": 12, + "x": 0, "y": 34 }, - "id": 16, + "id": 23, "options": { - "colWidth": 0.9, "legend": { + "calcs": [], "displayMode": "list", "placement": "bottom", - "showLegend": false + "showLegend": true }, - "rowHeight": 0.9, - "showValue": "auto", "tooltip": { - "mode": "single", + "hideZeros": false, + "mode": "multi", "sort": "none" } }, + "pluginVersion": "11.3.1", "targets": [ { "datasource": { @@ -1892,25 +1954,27 @@ "uid": "dbrepometrics0" }, "disableTextWrap": false, - "editorMode": "builder", - "expr": "up", + "editorMode": "code", + "expr": "process_open_fds\n", "fullMetaSearch": false, "includeNullMetadata": true, "instant": false, "legendFormat": "{{instance}}", "range": true, - "refId": "A", + "refId": "process_open_fds", "useBackend": false } ], - "title": "Service QoS", - "type": "status-history" + "title": "File Descriptors", + "type": "timeseries" }, { "datasource": { + "default": true, "type": "prometheus", "uid": "dbrepometrics0" }, + "description": "Heap and non-heap memory summed", "fieldConfig": { "defaults": { "color": { @@ -1923,6 +1987,7 @@ "axisLabel": "", "axisPlacement": "auto", "barAlignment": 0, + "barWidthFactor": 0.6, "drawStyle": "line", "fillOpacity": 25, "gradientMode": "none", @@ -1953,11 +2018,12 @@ "mode": "absolute", "steps": [ { - "color": "green" + "color": "green", + "value": null } ] }, - "unit": "none" + "unit": "decbytes" }, "overrides": [ { @@ -2025,10 +2091,10 @@ "gridPos": { "h": 7, "w": 12, - "x": 0, - "y": 41 + "x": 12, + "y": 34 }, - "id": 6, + "id": 7, "options": { "legend": { "calcs": [], @@ -2037,11 +2103,12 @@ "showLegend": true }, "tooltip": { + "hideZeros": false, "mode": "multi", "sort": "none" } }, - "pluginVersion": "11.2.0", + "pluginVersion": "11.3.1", "targets": [ { "datasource": { @@ -2050,27 +2117,25 @@ }, "disableTextWrap": false, "editorMode": "builder", - "expr": "process_cpu_usage", + "expr": "sum by(instance) (jvm_memory_used_bytes)", "fullMetaSearch": false, "hide": false, - "includeNullMetadata": true, + "includeNullMetadata": false, "instant": false, "legendFormat": "{{instance}}", "range": true, - "refId": "process_cpu_usage", + "refId": "A", "useBackend": false } ], - "title": "CPU Usage", + "title": "JVM Memory Usage", "type": "timeseries" }, { "datasource": { - "default": true, "type": "prometheus", "uid": "dbrepometrics0" }, - "description": "Heap and non-heap memory summed", "fieldConfig": { "defaults": { "color": { @@ -2083,6 +2148,7 @@ "axisLabel": "", "axisPlacement": "auto", "barAlignment": 0, + "barWidthFactor": 0.6, "drawStyle": "line", "fillOpacity": 25, "gradientMode": "none", @@ -2113,11 +2179,12 @@ "mode": "absolute", "steps": [ { - "color": "green" + "color": "green", + "value": null } ] }, - "unit": "decbytes" + "unit": "none" }, "overrides": [ { @@ -2185,10 +2252,10 @@ "gridPos": { "h": 7, "w": 12, - "x": 12, + "x": 0, "y": 41 }, - "id": 7, + "id": 6, "options": { "legend": { "calcs": [], @@ -2197,11 +2264,12 @@ "showLegend": true }, "tooltip": { + "hideZeros": false, "mode": "multi", "sort": "none" } }, - "pluginVersion": "11.2.0", + "pluginVersion": "11.3.1", "targets": [ { "datasource": { @@ -2210,18 +2278,18 @@ }, "disableTextWrap": false, "editorMode": "builder", - "expr": "sum by(instance) (jvm_memory_used_bytes)", + "expr": "process_cpu_usage", "fullMetaSearch": false, "hide": false, - "includeNullMetadata": false, + "includeNullMetadata": true, "instant": false, "legendFormat": "{{instance}}", "range": true, - "refId": "A", + "refId": "process_cpu_usage", "useBackend": false } ], - "title": "JVM Memory Usage", + "title": "CPU Usage", "type": "timeseries" }, { @@ -2229,55 +2297,110 @@ "type": "prometheus", "uid": "dbrepometrics0" }, - "description": "Top 10 by frequency of access", "fieldConfig": { "defaults": { "color": { "mode": "palette-classic" }, "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 25, + "gradientMode": "none", "hideFrom": { "legend": false, "tooltip": false, "viz": false + }, + "insertNulls": false, + "lineInterpolation": "smooth", + "lineWidth": 2, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" } }, "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + } + ] + }, "unit": "reqps" }, - "overrides": [] - }, - "gridPos": { - "h": 7, - "w": 12, - "x": 0, - "y": 48 - }, - "id": 18, - "options": { - "displayLabels": [ - "percent" - ], - "legend": { - "calcs": [], - "displayMode": "hidden", - "placement": "right", - "showLegend": false, - "values": [] - }, - "pieType": "pie", - "reduceOptions": { - "calcs": [ - "lastNotNull" - ], - "fields": "", - "values": false - }, - "tooltip": { - "mode": "single", - "sort": "none" - } - }, + "overrides": [ + { + "matcher": { + "id": "byRegexp", + "options": "/.*search-service.*/" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "orange", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byRegexp", + "options": "/.*analyse-service.*/" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "super-light-orange", + "mode": "fixed" + } + } + ] + } + ] + }, + "gridPos": { + "h": 7, + "w": 12, + "x": 12, + "y": 41 + }, + "id": 19, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "hideZeros": false, + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "11.3.1", "targets": [ { "datasource": { @@ -2285,54 +2408,43 @@ "uid": "dbrepometrics0" }, "editorMode": "code", - "expr": "topk(10, rate(dbrepo_table_data_get_total[$__range]))", + "expr": "rate(flask_http_request_duration_seconds_count{status!~\"200|201|202\"}[$__rate_interval])", "instant": false, - "legendFormat": "__auto", + "legendFormat": "{{method}} {{instance}} ({{status}})", "range": true, "refId": "A" } ], - "title": "Popular Datasources", - "type": "piechart" + "title": "Failed API Requests", + "type": "timeseries" }, { "datasource": { - "type": "prometheus", - "uid": "dbrepometrics0" + "type": "grafana-opensearch-datasource", + "uid": "dbrepoopensearch0" }, "fieldConfig": { "defaults": { "color": { - "mode": "palette-classic" + "mode": "fixed" }, "custom": { "axisBorderShow": false, "axisCenteredZero": false, "axisColorMode": "text", - "axisLabel": "", + "axisLabel": "Count", "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 25, + "fillOpacity": 80, "gradientMode": "none", "hideFrom": { "legend": false, "tooltip": false, "viz": false }, - "insertNulls": false, - "lineInterpolation": "smooth", - "lineWidth": 2, - "pointSize": 5, + "lineWidth": 1, "scaleDistribution": { "type": "linear" }, - "showPoints": "auto", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, "thresholdsStyle": { "mode": "off" } @@ -2342,17 +2454,55 @@ "mode": "absolute", "steps": [ { - "color": "green" + "color": "green", + "value": null } ] - }, - "unit": "reqps" + } }, "overrides": [ { "matcher": { - "id": "byRegexp", - "options": "/.*search-service.*/" + "id": "byFrameRefID", + "options": "200" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "green", + "mode": "fixed" + } + }, + { + "id": "displayName", + "value": "200s" + } + ] + }, + { + "matcher": { + "id": "byFrameRefID", + "options": "300" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "purple", + "mode": "fixed" + } + }, + { + "id": "displayName", + "value": "300s" + } + ] + }, + { + "matcher": { + "id": "byFrameRefID", + "options": "400" }, "properties": [ { @@ -2361,34 +2511,368 @@ "fixedColor": "orange", "mode": "fixed" } + }, + { + "id": "displayName", + "value": "400s" } ] }, { "matcher": { - "id": "byRegexp", - "options": "/.*analyse-service.*/" + "id": "byFrameRefID", + "options": "500" }, "properties": [ { "id": "color", "value": { - "fixedColor": "super-light-orange", + "fixedColor": "red", "mode": "fixed" } + }, + { + "id": "displayName", + "value": "500s" } ] } ] }, "gridPos": { - "h": 7, + "h": 8, + "w": 12, + "x": 0, + "y": 48 + }, + "id": 43, + "options": { + "barRadius": 0, + "barWidth": 0.97, + "fullHighlight": false, + "groupWidth": 0.7, + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "right", + "showLegend": true + }, + "orientation": "auto", + "showValue": "auto", + "stacking": "normal", + "tooltip": { + "hideZeros": false, + "mode": "multi", + "sort": "none" + }, + "xTickLabelRotation": 0, + "xTickLabelSpacing": 100 + }, + "pluginVersion": "11.3.1", + "targets": [ + { + "alias": "", + "bucketAggs": [ + { + "id": "2", + "settings": { + "interval": "auto", + "min_doc_count": "0", + "trimEdges": "0" + }, + "type": "date_histogram" + } + ], + "datasource": { + "type": "grafana-opensearch-datasource", + "uid": "dbrepoopensearch0" + }, + "format": "table", + "hide": false, + "luceneQueryType": "Metric", + "metrics": [ + { + "id": "1", + "type": "count" + } + ], + "query": "status: (>=200 AND <300)", + "queryType": "lucene", + "refId": "200", + "timeField": "@timestamp" + }, + { + "alias": "", + "bucketAggs": [ + { + "id": "2", + "settings": { + "interval": "auto", + "min_doc_count": "0", + "trimEdges": "0" + }, + "type": "date_histogram" + } + ], + "datasource": { + "type": "grafana-opensearch-datasource", + "uid": "dbrepoopensearch0" + }, + "format": "table", + "hide": false, + "luceneQueryType": "Metric", + "metrics": [ + { + "id": "1", + "type": "count" + } + ], + "query": "status: (>=300 AND <400)", + "queryType": "lucene", + "refId": "300", + "timeField": "@timestamp" + }, + { + "alias": "", + "bucketAggs": [ + { + "id": "2", + "settings": { + "interval": "auto", + "min_doc_count": "0", + "trimEdges": "0" + }, + "type": "date_histogram" + } + ], + "datasource": { + "type": "grafana-opensearch-datasource", + "uid": "dbrepoopensearch0" + }, + "format": "table", + "hide": false, + "luceneQueryType": "Metric", + "metrics": [ + { + "id": "1", + "type": "count" + } + ], + "query": "status: (>=400 AND <500)", + "queryType": "lucene", + "refId": "400", + "timeField": "@timestamp" + }, + { + "alias": "", + "bucketAggs": [ + { + "id": "2", + "settings": { + "interval": "auto", + "min_doc_count": "0", + "trimEdges": "0" + }, + "type": "date_histogram" + } + ], + "datasource": { + "type": "grafana-opensearch-datasource", + "uid": "dbrepoopensearch0" + }, + "format": "table", + "hide": false, + "luceneQueryType": "Metric", + "metrics": [ + { + "id": "1", + "type": "count" + } + ], + "query": "status: >=500", + "queryType": "lucene", + "refId": "500", + "timeField": "@timestamp" + } + ], + "title": "HTTP Status Codes over Time", + "type": "barchart" + }, + { + "datasource": { + "type": "grafana-opensearch-datasource", + "uid": "dbrepoopensearch0" + }, + "fieldConfig": { + "defaults": {}, + "overrides": [ + { + "matcher": { + "id": "byFrameRefID", + "options": "200" + }, + "properties": [] + }, + { + "matcher": { + "id": "byFrameRefID", + "options": "300" + }, + "properties": [] + }, + { + "matcher": { + "id": "byFrameRefID", + "options": "400" + }, + "properties": [] + }, + { + "matcher": { + "id": "byFrameRefID", + "options": "500" + }, + "properties": [] + } + ] + }, + "gridPos": { + "h": 8, "w": 12, "x": 12, "y": 48 }, - "id": 19, + "id": 44, + "options": { + "dedupStrategy": "none", + "enableLogDetails": true, + "prettifyLogMessage": false, + "showCommonLabels": false, + "showLabels": false, + "showTime": false, + "sortOrder": "Descending", + "wrapLogMessage": false + }, + "pluginVersion": "11.3.1", + "targets": [ + { + "alias": "", + "bucketAggs": [ + { + "id": "2", + "settings": { + "interval": "auto", + "min_doc_count": "0", + "trimEdges": "0" + }, + "type": "date_histogram" + } + ], + "datasource": { + "type": "grafana-opensearch-datasource", + "uid": "dbrepoopensearch0" + }, + "format": "table", + "hide": false, + "luceneQueryType": "Logs", + "metrics": [ + { + "id": "1", + "type": "logs" + } + ], + "query": "status: >=400", + "queryType": "lucene", + "refId": "ERROR", + "timeField": "@timestamp" + } + ], + "title": "REST API Errors", + "type": "logs" + }, + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 56 + }, + "id": 39, + "panels": [], + "title": "Storage", + "type": "row" + }, + { + "datasource": { + "type": "prometheus", + "uid": "dbrepometrics0" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 10, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "smooth", + "lineWidth": 2, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "short" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 57 + }, + "id": 41, "options": { + "alertThreshold": true, "legend": { "calcs": [], "displayMode": "list", @@ -2396,30 +2880,155 @@ "showLegend": true }, "tooltip": { + "hideZeros": false, "mode": "multi", "sort": "none" } }, + "pluginVersion": "11.3.1", "targets": [ { "datasource": { "type": "prometheus", "uid": "dbrepometrics0" }, - "editorMode": "code", - "expr": "rate(flask_http_request_duration_seconds_count{status!~\"200|201|202\"}[$__rate_interval])", - "instant": false, - "legendFormat": "{{method}} {{instance}} ({{status}})", - "range": true, + "expr": "sum(SeaweedFS_volumeServer_volumes) by (collection, type)", + "format": "time_series", + "hide": false, + "intervalFactor": 2, + "legendFormat": "{{collection}} {{type}}", "refId": "A" + }, + { + "datasource": { + "type": "prometheus", + "uid": "dbrepometrics0" + }, + "expr": "sum(SeaweedFS_volumeServer_max_volumes)", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "Total", + "refId": "B" } ], - "title": "Failed API Requests", + "title": "Volume Count", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "dbrepometrics0" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 10, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "smooth", + "lineWidth": 2, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "bytes" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 57 + }, + "id": 42, + "options": { + "alertThreshold": true, + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "hideZeros": false, + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "11.3.1", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "dbrepometrics0" + }, + "expr": "sum(SeaweedFS_volumeServer_total_disk_size) by (collection, type)", + "format": "time_series", + "hide": false, + "intervalFactor": 2, + "legendFormat": "{{collection}} {{type}}", + "refId": "A" + }, + { + "datasource": { + "type": "prometheus", + "uid": "dbrepometrics0" + }, + "expr": "sum(SeaweedFS_volumeServer_total_disk_size)", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "Total", + "refId": "B" + } + ], + "title": "Used Disk Space by Collection and Type", "type": "timeseries" } ], - "refresh": "1m", - "schemaVersion": 39, + "preload": false, + "refresh": "5m", + "schemaVersion": 40, "tags": [ "ui", "dashboard", @@ -2434,13 +3043,13 @@ "list": [] }, "time": { - "from": "now-1h", + "from": "now-3h", "to": "now" }, "timepicker": {}, "timezone": "browser", "title": "DBRepo", "uid": "bdz20owu8zn5se", - "version": 8, + "version": 2, "weekStart": "" } \ No newline at end of file diff --git a/dbrepo-dashboard-ui/dashboards/System/keycloak.json b/dbrepo-dashboard-ui/dashboards/System/keycloak.json new file mode 100644 index 0000000000000000000000000000000000000000..aa5e2a8c572b6a5273bb9c89c908b3adff857dfa --- /dev/null +++ b/dbrepo-dashboard-ui/dashboards/System/keycloak.json @@ -0,0 +1,2393 @@ +{ + "__inputs": [], + "__requires": [ + { + "type": "panel", + "id": "gauge", + "name": "Gauge", + "version": "" + }, + { + "type": "grafana", + "id": "grafana", + "name": "Grafana", + "version": "7.2.0" + }, + { + "type": "panel", + "id": "grafana-piechart-panel", + "name": "Pie Chart", + "version": "1.6.1" + }, + { + "type": "panel", + "id": "graph", + "name": "Graph", + "version": "" + }, + { + "type": "panel", + "id": "heatmap", + "name": "Heatmap", + "version": "" + }, + { + "type": "datasource", + "id": "prometheus", + "name": "Prometheus", + "version": "1.0.0" + } + ], + "annotations": { + "list": [ + { + "builtIn": 1, + "datasource": "-- Grafana --", + "enable": true, + "hide": true, + "iconColor": "rgba(0, 211, 255, 1)", + "name": "Annotations & Alerts", + "type": "dashboard" + }, + { + "datasource": "-- Grafana --", + "enable": true, + "iconColor": "rgba(0, 211, 255, 1)", + "iconSize": 0, + "lineColor": "", + "name": "Annotations & Alerts", + "query": "", + "showLine": false, + "tags": null, + "tagsField": "", + "textField": "", + "type": "dashboard" + } + ] + }, + "editable": true, + "gnetId": 10441, + "graphTooltip": 1, + "id": null, + "iteration": 1624395370240, + "links": [], + "panels": [ + { + "CustomPanel": { + "cacheTimeout": null, + "datasource": "dbrepometrics0", + "description": "Memory currently being used by Keycloak.", + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "custom": {}, + "mappings": [], + "max": 100, + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "#EAB839", + "value": 80 + }, + { + "color": "red", + "value": 90 + } + ] + }, + "unit": "percent" + }, + "overrides": [] + }, + "gridPos": { + "h": 7, + "w": 6, + "x": 0, + "y": 0 + }, + "hideTimeOverride": false, + "id": 5, + "links": [], + "options": { + "orientation": "auto", + "reduceOptions": { + "calcs": [ + "mean" + ], + "fields": "", + "values": false + }, + "showThresholdLabels": false, + "showThresholdMarkers": true + }, + "pluginVersion": "7.2.0", + "targets": [ + { + "expr": "sum(jvm_memory_bytes_used{area=\"heap\"})*100/sum(jvm_memory_bytes_max{area=\"heap\"})\n", + "format": "time_series", + "hide": false, + "instant": false, + "intervalFactor": 1, + "legendFormat": "", + "refId": "B" + } + ], + "timeFrom": null, + "timeShift": null, + "title": "Current Memory HEAP", + "type": "gauge" + }, + "datasource": { + "default": true, + "type": "prometheus", + "uid": "dbrepometrics0" + }, + "editable": false, + "error": false, + "fieldConfig": { + "defaults": { + "custom": {}, + "mappings": [], + "thresholds": { + "mode": "percentage", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "#EAB839", + "value": 80 + }, + { + "color": "red", + "value": 90 + } + ] + }, + "unit": "percent" + }, + "overrides": [] + }, + "gridPos": { + "h": 7, + "w": 6, + "x": 0, + "y": 0 + }, + "hideTimeOverride": false, + "id": 5, + "isNew": false, + "options": { + "reduceOptions": { + "calcs": [ + "mean" + ], + "fields": "", + "values": false + }, + "showThresholdLabels": false, + "showThresholdMarkers": true + }, + "pluginVersion": "7.2.0", + "span": 0, + "targets": [ + { + "expr": "sum(jvm_memory_bytes_used{area=\"heap\"})*100/sum(jvm_memory_bytes_max{area=\"heap\"})", + "interval": "", + "legendFormat": "", + "refId": "A" + } + ], + "title": "Current Memory HEAP", + "type": "gauge" + }, + { + "CustomPanel": { + "cacheTimeout": null, + "datasource": "dbrepometrics0", + "description": "Memory currently being used by Keycloak.", + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "custom": {}, + "mappings": [], + "max": 100, + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "#EAB839", + "value": 80 + }, + { + "color": "red", + "value": 90 + } + ] + }, + "unit": "percent" + }, + "overrides": [] + }, + "gridPos": { + "h": 7, + "w": 6, + "x": 6, + "y": 0 + }, + "hideTimeOverride": false, + "id": 23, + "links": [], + "options": { + "orientation": "auto", + "reduceOptions": { + "calcs": [ + "mean" + ], + "fields": "", + "values": false + }, + "showThresholdLabels": false, + "showThresholdMarkers": true + }, + "pluginVersion": "7.2.0", + "targets": [ + { + "expr": "sum(jvm_memory_bytes_used{area=\"nonheap\"})*100/sum(jvm_memory_bytes_max{area=\"nonheap\"})", + "format": "time_series", + "hide": false, + "instant": false, + "intervalFactor": 1, + "legendFormat": "", + "refId": "B" + } + ], + "timeFrom": null, + "title": "Current Memory nonHEAP", + "type": "gauge" + }, + "datasource": "dbrepometrics0", + "editable": false, + "error": false, + "fieldConfig": { + "defaults": { + "custom": {}, + "mappings": [], + "thresholds": { + "mode": "percentage", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "#EAB839", + "value": 80 + }, + { + "color": "red", + "value": 90 + } + ] + }, + "unit": "percent" + }, + "overrides": [] + }, + "gridPos": { + "h": 7, + "w": 6, + "x": 6, + "y": 0 + }, + "hideTimeOverride": false, + "id": 23, + "isNew": false, + "options": { + "reduceOptions": { + "calcs": [ + "mean" + ], + "fields": "", + "values": false + }, + "showThresholdLabels": false, + "showThresholdMarkers": true + }, + "pluginVersion": "7.2.0", + "span": 0, + "targets": [ + { + "expr": "sum(jvm_memory_bytes_used{area=\"nonheap\"})*100/sum(jvm_memory_bytes_max{area=\"nonheap\"})", + "interval": "", + "legendFormat": "", + "refId": "A" + } + ], + "title": "Current Memory nonHEAP", + "type": "gauge" + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "dbrepometrics0", + "editable": false, + "error": false, + "fieldConfig": { + "defaults": { + "custom": {} + }, + "overrides": [] + }, + "fill": 2, + "fillGradient": 0, + "gridPos": { + "h": 7, + "w": 12, + "x": 12, + "y": 0 + }, + "hiddenSeries": false, + "hideTimeOverride": false, + "id": 12, + "isNew": false, + "legend": { + "alignAsTable": false, + "avg": false, + "current": false, + "hideEmpty": false, + "hideZero": false, + "max": false, + "min": false, + "rightSide": true, + "show": true, + "sideWidth": 70, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "nullPointMode": "connected", + "options": { + "alertThreshold": true + }, + "percentage": false, + "pluginVersion": "7.2.0", + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "span": 0, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "sum(jvm_memory_bytes_max)", + "format": "time_series", + "interval": "", + "intervalFactor": 1, + "legendFormat": "Max", + "refId": "A" + }, + { + "expr": "sum(jvm_memory_bytes_committed)", + "format": "time_series", + "interval": "", + "intervalFactor": 1, + "legendFormat": "Comitted", + "refId": "C" + }, + { + "expr": "sum(jvm_memory_bytes_used)", + "format": "time_series", + "interval": "", + "intervalFactor": 1, + "legendFormat": "Used", + "refId": "B" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Memory Usage", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "format": "", + "logBase": 0, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "bytes", + "logBase": 1, + "min": 0, + "show": true + }, + { + "format": "short", + "logBase": 1, + "show": false + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "CustomPanel": { + "aliasColors": {}, + "breakPoint": "50%", + "cacheTimeout": null, + "combine": { + "label": "Others", + "threshold": 0 + }, + "datasource": "dbrepometrics0", + "fieldConfig": { + "defaults": { + "custom": {} + }, + "overrides": [] + }, + "fontSize": "80%", + "format": "none", + "gridPos": { + "h": 7, + "w": 6, + "x": 0, + "y": 7 + }, + "hideTimeOverride": true, + "id": 16, + "interval": null, + "legend": { + "percentage": true, + "percentageDecimals": 0, + "show": true, + "values": false + }, + "legendType": "Right side", + "links": [], + "maxDataPoints": 3, + "nullPointMode": "connected", + "pieType": "donut", + "strokeWidth": "", + "targets": [ + { + "expr": "sum(keycloak_logins) by (realm)", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "{{realm}}", + "refId": "B" + } + ], + "timeFrom": null, + "title": "Logins Per REALM", + "type": "grafana-piechart-panel", + "valueName": "current" + }, + "aliasColors": {}, + "breakPoint": "50%", + "cacheTimeout": null, + "combine": { + "label": "Others", + "threshold": 0 + }, + "datasource": "dbrepometrics0", + "editable": false, + "error": false, + "fieldConfig": { + "defaults": { + "custom": {} + }, + "overrides": [] + }, + "fontSize": "80%", + "format": "short", + "gridPos": { + "h": 7, + "w": 6, + "x": 0, + "y": 7 + }, + "hideTimeOverride": true, + "id": 16, + "interval": null, + "isNew": false, + "legend": { + "percentage": true, + "show": true, + "values": false + }, + "legendType": "Right side", + "links": [], + "nullPointMode": "connected", + "pieType": "pie", + "span": 0, + "strokeWidth": 1, + "targets": [ + { + "expr": "sum by (realm)(increase(keycloak_logins[24h]))", + "interval": "", + "legendFormat": "{{realm}}", + "refId": "A" + } + ], + "title": "Logins Per REALM for past 24h", + "type": "grafana-piechart-panel", + "valueName": "current" + }, + { + "aliasColors": {}, + "breakPoint": "50%", + "cacheTimeout": null, + "combine": { + "label": "Others", + "threshold": 0 + }, + "datasource": "dbrepometrics0", + "fieldConfig": { + "defaults": { + "custom": {} + }, + "overrides": [] + }, + "fontSize": "80%", + "format": "short", + "gridPos": { + "h": 7, + "w": 6, + "x": 6, + "y": 7 + }, + "id": 44, + "interval": null, + "legend": { + "percentage": true, + "show": true, + "values": false + }, + "legendType": "Right side", + "links": [], + "nullPointMode": "connected", + "pieType": "pie", + "pluginVersion": "7.2.0", + "strokeWidth": 1, + "targets": [ + { + "expr": "sum by (realm)(increase(keycloak_registrations[24h]))", + "interval": "", + "legendFormat": "{{realm}}", + "refId": "A" + } + ], + "timeFrom": null, + "timeShift": null, + "title": "Registrations Per REALM for past 24h", + "type": "grafana-piechart-panel", + "valueName": "current" + }, + { + "CustomPanel": { + "aliasColors": {}, + "breakPoint": "50%", + "cacheTimeout": null, + "combine": { + "label": "Others", + "threshold": 0 + }, + "datasource": "dbrepometrics0", + "fieldConfig": { + "defaults": { + "custom": {} + }, + "overrides": [] + }, + "fontSize": "80%", + "format": "none", + "gridPos": { + "h": 7, + "w": 12, + "x": 6, + "y": 7 + }, + "hideTimeOverride": true, + "id": 20, + "interval": null, + "legend": { + "percentage": true, + "percentageDecimals": 0, + "show": true, + "values": false + }, + "legendType": "Right side", + "links": [], + "maxDataPoints": 3, + "nullPointMode": "connected", + "pieType": "donut", + "strokeWidth": "", + "targets": [ + { + "expr": "sum(keycloak_logins) by (client_id)", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "{{client_id}}", + "refId": "B" + } + ], + "timeFrom": null, + "title": "Logins Per CLIENT", + "type": "grafana-piechart-panel", + "valueName": "current" + }, + "aliasColors": {}, + "breakPoint": "50%", + "cacheTimeout": null, + "combine": { + "label": "Others", + "threshold": 0 + }, + "datasource": "dbrepometrics0", + "editable": false, + "error": false, + "fieldConfig": { + "defaults": { + "custom": {} + }, + "overrides": [] + }, + "fontSize": "80%", + "format": "short", + "gridPos": { + "h": 7, + "w": 6, + "x": 12, + "y": 7 + }, + "hideTimeOverride": true, + "id": 20, + "interval": null, + "isNew": false, + "legend": { + "percentage": true, + "show": true, + "values": false + }, + "legendType": "Right side", + "links": [], + "nullPointMode": "connected", + "pieType": "pie", + "span": 0, + "strokeWidth": 1, + "targets": [ + { + "expr": "sum by (client_id)(increase(keycloak_logins[24h]))", + "interval": "", + "legendFormat": "{{client_id}}", + "refId": "A" + } + ], + "title": "Logins Per CLIENT for past 24h", + "type": "grafana-piechart-panel", + "valueName": "current" + }, + { + "CustomPanel": { + "aliasColors": {}, + "breakPoint": "50%", + "cacheTimeout": null, + "combine": { + "label": "Others", + "threshold": 0 + }, + "datasource": "dbrepometrics0", + "fieldConfig": { + "defaults": { + "custom": {} + }, + "overrides": [] + }, + "fontSize": "80%", + "format": "none", + "gridPos": { + "h": 7, + "w": 6, + "x": 18, + "y": 7 + }, + "hideTimeOverride": true, + "id": 17, + "interval": null, + "legend": { + "percentage": true, + "percentageDecimals": 0, + "show": true, + "values": false + }, + "legendType": "Under graph", + "links": [], + "maxDataPoints": 3, + "nullPointMode": "connected", + "pieType": "donut", + "strokeWidth": "", + "targets": [ + { + "expr": "sum(keycloak_registrations) by (client_id)", + "format": "time_series", + "hide": false, + "instant": false, + "intervalFactor": 1, + "legendFormat": "{{client_id}}", + "refId": "A" + } + ], + "timeFrom": null, + "title": "Registrations Per CLIENT", + "type": "grafana-piechart-panel", + "valueName": "current" + }, + "aliasColors": {}, + "breakPoint": "50%", + "cacheTimeout": null, + "combine": { + "label": "Others", + "threshold": 0 + }, + "datasource": "dbrepometrics0", + "editable": false, + "error": false, + "fieldConfig": { + "defaults": { + "custom": {} + }, + "overrides": [] + }, + "fontSize": "80%", + "format": "short", + "gridPos": { + "h": 7, + "w": 6, + "x": 18, + "y": 7 + }, + "hideTimeOverride": true, + "id": 17, + "interval": null, + "isNew": false, + "legend": { + "percentage": true, + "show": true, + "values": false + }, + "legendType": "Right side", + "links": [], + "nullPointMode": "connected", + "pieType": "pie", + "span": 0, + "strokeWidth": 1, + "targets": [ + { + "expr": "sum by (client_id)(increase(keycloak_registrations[24h]))", + "interval": "", + "legendFormat": "{{client_id}}", + "refId": "A" + } + ], + "title": "Registrations Per CLIENT for past 24h", + "type": "grafana-piechart-panel", + "valueName": "current" + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "dbrepometrics0", + "fieldConfig": { + "defaults": { + "custom": {} + }, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 8, + "w": 12, + "x": 6, + "y": 14 + }, + "hiddenSeries": false, + "id": 46, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "nullPointMode": "null", + "options": { + "alertThreshold": true + }, + "percentage": false, + "pluginVersion": "7.2.0", + "pointradius": 2, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "sum by (code)(increase(keycloak_response_errors_total[30m]))", + "interval": "", + "legendFormat": "{{code}}", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "4xx and 5xx Responses", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "$$hashKey": "object:98", + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "$$hashKey": "object:99", + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "dbrepometrics0", + "editable": false, + "error": false, + "fieldConfig": { + "defaults": { + "custom": {} + }, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 22 + }, + "hiddenSeries": false, + "hideTimeOverride": false, + "id": 1, + "isNew": false, + "legend": { + "alignAsTable": true, + "avg": false, + "current": false, + "hideEmpty": false, + "hideZero": false, + "max": false, + "min": false, + "rightSide": true, + "show": true, + "sideWidth": 100, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "nullPointMode": "connected", + "options": { + "alertThreshold": true + }, + "percentage": false, + "pluginVersion": "7.2.0", + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "span": 0, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "sum by (realm)(increase(keycloak_logins[30m]))", + "format": "time_series", + "interval": "", + "intervalFactor": 1, + "legendFormat": "{{realm}}", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Logins per REALM", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "format": "", + "logBase": 0, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "$$hashKey": "object:160", + "format": "none", + "logBase": 1, + "min": 0, + "show": true + }, + { + "$$hashKey": "object:161", + "format": "short", + "logBase": 1, + "show": false + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "dbrepometrics0", + "editable": false, + "error": false, + "fieldConfig": { + "defaults": { + "custom": {} + }, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 22 + }, + "hiddenSeries": false, + "hideTimeOverride": false, + "id": 7, + "isNew": false, + "legend": { + "alignAsTable": true, + "avg": false, + "current": true, + "hideEmpty": false, + "hideZero": true, + "max": false, + "min": false, + "rightSide": true, + "show": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "nullPointMode": "connected", + "options": { + "alertThreshold": true + }, + "percentage": false, + "pluginVersion": "7.2.0", + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "span": 0, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "sum by (error) (increase(keycloak_failed_login_attempts{provider=\"keycloak\",realm=\"dbrepo\"}[30m]))", + "format": "time_series", + "interval": "", + "intervalFactor": 1, + "legendFormat": "{{dbrepo }} {{error}}", + "refId": "A" + }, + { + "expr": "sum by (realm) (increase(keycloak_failed_login_attempts{provider=\"keycloak\",realm=\"dialog-test\"} [30m]))", + "interval": "", + "legendFormat": "{{sum by dbrepo}}", + "refId": "B" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Login Errors on realm dbrepo", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "format": "", + "logBase": 0, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "none", + "logBase": 1, + "min": 0, + "show": true + }, + { + "format": "short", + "logBase": 1, + "show": false + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "dbrepometrics0", + "editable": false, + "error": false, + "fieldConfig": { + "defaults": { + "custom": {} + }, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 30 + }, + "hiddenSeries": false, + "hideTimeOverride": false, + "id": 18, + "isNew": false, + "legend": { + "alignAsTable": true, + "avg": false, + "current": false, + "hideEmpty": false, + "hideZero": false, + "max": false, + "min": false, + "rightSide": true, + "show": true, + "sideWidth": 100, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "nullPointMode": "connected", + "options": { + "alertThreshold": true + }, + "percentage": false, + "pluginVersion": "7.2.0", + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "span": 0, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "sum by (client_id)(increase(keycloak_logins{realm=\"dbrepo\",provider=\"keycloak\"}[30m]))", + "format": "time_series", + "interval": "", + "intervalFactor": 2, + "legendFormat": "{{client_id}}", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Logins per CLIENT on realm dbrepo", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "format": "", + "logBase": 0, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "none", + "logBase": 1, + "min": 0, + "show": true + }, + { + "format": "short", + "logBase": 1, + "show": false + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "dbrepometrics0", + "editable": false, + "error": false, + "fieldConfig": { + "defaults": { + "custom": {} + }, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 30 + }, + "hiddenSeries": false, + "hideTimeOverride": false, + "id": 21, + "isNew": false, + "legend": { + "alignAsTable": true, + "avg": false, + "current": false, + "hideEmpty": false, + "hideZero": false, + "max": false, + "min": false, + "rightSide": true, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "nullPointMode": "null", + "options": { + "alertThreshold": false + }, + "percentage": false, + "pluginVersion": "7.2.0", + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "span": 0, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "sum by (realm) (increase(keycloak_registrations_errors{provider=\"keycloak\",realm=\"dbrepo\"} [30m]))", + "format": "time_series", + "interval": "", + "intervalFactor": 2, + "legendFormat": "Sum by {{realm}}", + "refId": "A" + }, + { + "expr": "sum by (error) (increase(keycloak_registrations_errors{provider=\"keycloak\",realm=\"dbrepo\"} [30m]))", + "interval": "", + "legendFormat": "{{error}}", + "refId": "B" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Registration Errors on realm dbrepo", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "format": "", + "logBase": 0, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "logBase": 1, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "dbrepometrics0", + "editable": false, + "error": false, + "fieldConfig": { + "defaults": { + "custom": {} + }, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 38 + }, + "hiddenSeries": false, + "hideTimeOverride": false, + "id": 33, + "isNew": false, + "legend": { + "alignAsTable": true, + "avg": false, + "current": false, + "hideEmpty": false, + "hideZero": false, + "max": false, + "min": false, + "rightSide": true, + "show": true, + "sideWidth": 100, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "nullPointMode": "null", + "options": { + "alertThreshold": false + }, + "percentage": false, + "pluginVersion": "7.2.0", + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "span": 0, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "sum by (realm)(increase(keycloak_registrations[30m]))", + "format": "time_series", + "interval": "", + "intervalFactor": 1, + "legendFormat": "{{realm}}", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Registrations per REALM", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "format": "", + "logBase": 0, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": "", + "logBase": 1, + "min": 0, + "show": true + }, + { + "format": "short", + "logBase": 1, + "show": false + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "dbrepometrics0", + "editable": false, + "error": false, + "fieldConfig": { + "defaults": { + "custom": {} + }, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 38 + }, + "hiddenSeries": false, + "hideTimeOverride": false, + "id": 19, + "isNew": false, + "legend": { + "alignAsTable": true, + "avg": false, + "current": true, + "hideEmpty": false, + "hideZero": false, + "max": false, + "min": false, + "rightSide": true, + "show": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "nullPointMode": "connected", + "options": { + "alertThreshold": true + }, + "percentage": false, + "pluginVersion": "7.2.0", + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "span": 0, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "sum by (error) (increase(keycloak_failed_login_attempts{provider=\"keycloak\",realm=\"dbrepo\",client_id=\"dbrepo-client\"}[30m]))", + "format": "time_series", + "interval": "", + "intervalFactor": 2, + "legendFormat": "{{error}}", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Login Errors for dbrepo-client", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "format": "", + "logBase": 0, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "none", + "logBase": 1, + "min": 0, + "show": true + }, + { + "format": "short", + "logBase": 1, + "show": false + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "dbrepometrics0", + "editable": false, + "error": false, + "fieldConfig": { + "defaults": { + "custom": {} + }, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 46 + }, + "hiddenSeries": false, + "hideTimeOverride": false, + "id": 22, + "isNew": false, + "legend": { + "alignAsTable": true, + "avg": false, + "current": false, + "hideEmpty": false, + "hideZero": false, + "max": false, + "min": false, + "rightSide": true, + "show": true, + "sideWidth": 100, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "nullPointMode": "connected", + "options": { + "alertThreshold": true + }, + "percentage": false, + "pluginVersion": "7.2.0", + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "span": 0, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "sum by (client_id)(increase(keycloak_registrations{realm=\"dbrepo\",provider=\"keycloak\"}[30m]))", + "format": "time_series", + "interval": "", + "intervalFactor": 2, + "legendFormat": "{{client_id}}", + "refId": "A" + }, + { + "expr": "sum by (realm)(increase(keycloak_registrations{provider=\"keycloak\",realm=\"dbrepo\"} [30m]))", + "interval": "", + "legendFormat": "Sum by {{realm}}", + "refId": "B" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Registrations per CLIENT on relm dbrepo", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "format": "", + "logBase": 0, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "none", + "logBase": 1, + "min": 0, + "show": true + }, + { + "format": "short", + "logBase": 1, + "show": false + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "dbrepometrics0", + "editable": false, + "error": false, + "fieldConfig": { + "defaults": { + "custom": {} + }, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 46 + }, + "hiddenSeries": false, + "hideTimeOverride": false, + "id": 34, + "isNew": false, + "legend": { + "alignAsTable": true, + "avg": false, + "current": true, + "hideEmpty": false, + "hideZero": false, + "max": false, + "min": false, + "rightSide": true, + "show": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "nullPointMode": "connected", + "options": { + "alertThreshold": true + }, + "percentage": false, + "pluginVersion": "7.2.0", + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "span": 0, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "sum by (error) (increase(keycloak_registrations_errors{provider=\"keycloak\",realm=\"dbrepo\",client_id=\"dbrepo-client\"}[30m]))", + "format": "time_series", + "interval": "", + "intervalFactor": 2, + "legendFormat": "{{error}}", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Registration Errors for dbrepo-client", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "format": "", + "logBase": 0, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "none", + "logBase": 1, + "min": 0, + "show": true + }, + { + "format": "short", + "logBase": 1, + "show": false + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "cards": { + "cardPadding": null, + "cardRound": null + }, + "color": { + "cardColor": "#73BF69", + "colorScale": "sqrt", + "colorScheme": "interpolateGreens", + "exponent": 0.4, + "min": null, + "mode": "opacity" + }, + "dataFormat": "tsbuckets", + "datasource": "dbrepometrics0", + "description": "", + "fieldConfig": { + "defaults": { + "custom": {} + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 54 + }, + "heatmap": {}, + "hideTimeOverride": false, + "hideZeroBuckets": true, + "highlightCards": true, + "id": 35, + "legend": { + "show": true + }, + "pluginVersion": "7.2.0", + "reverseYBuckets": false, + "targets": [ + { + "expr": "sum(increase(keycloak_request_duration_bucket{method=\"GET\"}[30m])) by (le)", + "format": "heatmap", + "interval": "", + "intervalFactor": 4, + "legendFormat": "{{ le }}", + "refId": "A" + } + ], + "timeFrom": null, + "timeShift": null, + "title": "Request duration method = \"GET\" Heatmap", + "tooltip": { + "show": true, + "showHistogram": false + }, + "type": "heatmap", + "xAxis": { + "show": true + }, + "xBucketNumber": null, + "xBucketSize": null, + "yAxis": { + "decimals": null, + "format": "ms", + "logBase": 1, + "max": null, + "min": null, + "show": true, + "splitFactor": null + }, + "yBucketBound": "auto", + "yBucketNumber": null, + "yBucketSize": null + }, + { + "datasource": "dbrepometrics0", + "description": "", + "fieldConfig": { + "defaults": { + "custom": {}, + "mappings": [], + "thresholds": { + "mode": "percentage", + "steps": [ + { + "color": "red", + "value": null + }, + { + "color": "red", + "value": 80 + }, + { + "color": "#EAB839", + "value": 90 + }, + { + "color": "green", + "value": 98 + } + ] + }, + "unit": "percent" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 54 + }, + "hideTimeOverride": false, + "id": 39, + "options": { + "reduceOptions": { + "calcs": [ + "mean" + ], + "fields": "", + "values": false + }, + "showThresholdLabels": false, + "showThresholdMarkers": true + }, + "pluginVersion": "7.2.0", + "targets": [ + { + "expr": "sum(rate(keycloak_request_duration_bucket{method=\"GET\", le=\"100.0\"}[30m])) / sum(rate(keycloak_request_duration_count{method=\"GET\"}[30m])) * 100", + "format": "time_series", + "interval": "", + "intervalFactor": 2, + "legendFormat": "", + "refId": "A" + } + ], + "timeFrom": null, + "timeShift": null, + "title": "Percentage of requests \"GET\" method was served in 100ms or below", + "type": "gauge" + }, + { + "cards": { + "cardPadding": null, + "cardRound": null + }, + "color": { + "cardColor": "#73BF69", + "colorScale": "sqrt", + "colorScheme": "interpolateGreens", + "exponent": 0.4, + "min": null, + "mode": "opacity" + }, + "dataFormat": "tsbuckets", + "datasource": "dbrepometrics0", + "description": "", + "fieldConfig": { + "defaults": { + "custom": {} + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 62 + }, + "heatmap": {}, + "hideTimeOverride": false, + "hideZeroBuckets": true, + "highlightCards": true, + "id": 36, + "legend": { + "show": true + }, + "pluginVersion": "7.2.0", + "reverseYBuckets": false, + "targets": [ + { + "expr": "sum(increase(keycloak_request_duration_bucket{method=\"POST\"}[30m])) by (le)", + "format": "heatmap", + "interval": "", + "intervalFactor": 4, + "legendFormat": "{{ le }}", + "refId": "A" + } + ], + "timeFrom": null, + "timeShift": null, + "title": "Request duration method = \"POST\" Heatmap", + "tooltip": { + "show": true, + "showHistogram": false + }, + "type": "heatmap", + "xAxis": { + "show": true + }, + "xBucketNumber": null, + "xBucketSize": null, + "yAxis": { + "decimals": null, + "format": "ms", + "logBase": 1, + "max": null, + "min": null, + "show": true, + "splitFactor": null + }, + "yBucketBound": "auto", + "yBucketNumber": null, + "yBucketSize": null + }, + { + "datasource": "dbrepometrics0", + "description": "", + "fieldConfig": { + "defaults": { + "custom": {}, + "mappings": [], + "thresholds": { + "mode": "percentage", + "steps": [ + { + "color": "red", + "value": null + }, + { + "color": "red", + "value": 80 + }, + { + "color": "#EAB839", + "value": 90 + }, + { + "color": "green", + "value": 98 + } + ] + }, + "unit": "percent" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 62 + }, + "hideTimeOverride": false, + "id": 40, + "options": { + "reduceOptions": { + "calcs": [ + "mean" + ], + "fields": "", + "values": false + }, + "showThresholdLabels": false, + "showThresholdMarkers": true + }, + "pluginVersion": "7.2.0", + "targets": [ + { + "expr": "sum(rate(keycloak_request_duration_bucket{method=\"POST\", le=\"100.0\"}[30m])) / sum(rate(keycloak_request_duration_count{method=\"POST\"}[30m])) * 100", + "format": "time_series", + "interval": "", + "intervalFactor": 2, + "legendFormat": "", + "refId": "A" + } + ], + "timeFrom": null, + "timeShift": null, + "title": "Percentage of requests \"POST\" method was served in 100ms or below", + "type": "gauge" + }, + { + "cards": { + "cardPadding": null, + "cardRound": null + }, + "color": { + "cardColor": "#73BF69", + "colorScale": "sqrt", + "colorScheme": "interpolateGreens", + "exponent": 0.4, + "min": null, + "mode": "opacity" + }, + "dataFormat": "tsbuckets", + "datasource": "dbrepometrics0", + "description": "", + "fieldConfig": { + "defaults": { + "custom": {} + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 70 + }, + "heatmap": {}, + "hideTimeOverride": false, + "hideZeroBuckets": true, + "highlightCards": true, + "id": 37, + "legend": { + "show": true + }, + "pluginVersion": "7.2.0", + "reverseYBuckets": false, + "targets": [ + { + "expr": "sum(increase(keycloak_request_duration_bucket{method=\"HEAD\"}[30m])) by (le)", + "format": "heatmap", + "interval": "", + "intervalFactor": 4, + "legendFormat": "{{ le }}", + "refId": "A" + } + ], + "timeFrom": null, + "timeShift": null, + "title": "Request duration method = \"HEAD\" Heatmap", + "tooltip": { + "show": true, + "showHistogram": false + }, + "type": "heatmap", + "xAxis": { + "show": true + }, + "xBucketNumber": null, + "xBucketSize": null, + "yAxis": { + "decimals": null, + "format": "ms", + "logBase": 1, + "max": null, + "min": null, + "show": true, + "splitFactor": null + }, + "yBucketBound": "auto", + "yBucketNumber": null, + "yBucketSize": null + }, + { + "datasource": "dbrepometrics0", + "description": "", + "fieldConfig": { + "defaults": { + "custom": {}, + "mappings": [], + "thresholds": { + "mode": "percentage", + "steps": [ + { + "color": "red", + "value": null + }, + { + "color": "red", + "value": 80 + }, + { + "color": "#EAB839", + "value": 90 + }, + { + "color": "green", + "value": 98 + } + ] + }, + "unit": "percent" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 70 + }, + "hideTimeOverride": false, + "id": 41, + "options": { + "reduceOptions": { + "calcs": [ + "mean" + ], + "fields": "", + "values": false + }, + "showThresholdLabels": false, + "showThresholdMarkers": true + }, + "pluginVersion": "7.2.0", + "targets": [ + { + "expr": "sum(rate(keycloak_request_duration_bucket{method=\"HEAD\", le=\"100.0\"}[30m])) / sum(rate(keycloak_request_duration_count{method=\"HEAD\"}[30m])) * 100", + "format": "time_series", + "interval": "", + "intervalFactor": 2, + "legendFormat": "", + "refId": "A" + } + ], + "timeFrom": null, + "timeShift": null, + "title": "Percentage of requests \"HEAD\" method was served in 100ms or below", + "type": "gauge" + }, + { + "cards": { + "cardPadding": null, + "cardRound": null + }, + "color": { + "cardColor": "#73BF69", + "colorScale": "sqrt", + "colorScheme": "interpolateGreens", + "exponent": 0.4, + "min": null, + "mode": "opacity" + }, + "dataFormat": "tsbuckets", + "datasource": "dbrepometrics0", + "description": "", + "fieldConfig": { + "defaults": { + "custom": {} + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 78 + }, + "heatmap": {}, + "hideTimeOverride": false, + "hideZeroBuckets": true, + "highlightCards": true, + "id": 38, + "legend": { + "show": true + }, + "pluginVersion": "7.2.0", + "reverseYBuckets": false, + "targets": [ + { + "expr": "sum(increase(keycloak_request_duration_bucket{method=\"PUT\"}[30m])) by (le)", + "format": "heatmap", + "interval": "", + "intervalFactor": 4, + "legendFormat": "{{ le }}", + "refId": "A" + } + ], + "timeFrom": null, + "timeShift": null, + "title": "Request duration method = \"PUT\" Heatmap", + "tooltip": { + "show": true, + "showHistogram": false + }, + "type": "heatmap", + "xAxis": { + "show": true + }, + "xBucketNumber": null, + "xBucketSize": null, + "yAxis": { + "decimals": null, + "format": "ms", + "logBase": 1, + "max": null, + "min": null, + "show": true, + "splitFactor": null + }, + "yBucketBound": "auto", + "yBucketNumber": null, + "yBucketSize": null + }, + { + "datasource": "dbrepometrics0", + "description": "", + "fieldConfig": { + "defaults": { + "custom": {}, + "mappings": [], + "thresholds": { + "mode": "percentage", + "steps": [ + { + "color": "red", + "value": null + }, + { + "color": "red", + "value": 80 + }, + { + "color": "#EAB839", + "value": 90 + }, + { + "color": "green", + "value": 98 + } + ] + }, + "unit": "percent" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 78 + }, + "hideTimeOverride": false, + "id": 42, + "options": { + "reduceOptions": { + "calcs": [ + "mean" + ], + "fields": "", + "values": false + }, + "showThresholdLabels": false, + "showThresholdMarkers": true + }, + "pluginVersion": "7.2.0", + "targets": [ + { + "expr": "sum(rate(keycloak_request_duration_bucket{method=\"PUT\", le=\"100.0\"}[30m])) / sum(rate(keycloak_request_duration_count{method=\"PUT\"}[30m])) * 100", + "format": "time_series", + "interval": "", + "intervalFactor": 2, + "legendFormat": "", + "refId": "A" + } + ], + "timeFrom": null, + "timeShift": null, + "title": "Percentage of requests \"PUT\" method was served in 100ms or below", + "type": "gauge" + } + ], + "refresh": "5m", + "schemaVersion": 26, + "style": "dark", + "tags": ["provisioned", "auth"], + "templating": { + "list": [ + { + "datasource": "prometheus", + "filters": [], + "hide": 0, + "label": "", + "name": "Filters", + "skipUrlSync": false, + "type": "adhoc" + } + ] + }, + "time": { + "from": "now-3h", + "to": "now" + }, + "timepicker": { + "refresh_intervals": [ + "5s", + "10s", + "30s", + "1m", + "5m", + "15m", + "30m", + "1h", + "2h", + "1d" + ], + "time_options": [ + "5m", + "15m", + "1h", + "6h", + "12h", + "24h", + "2d", + "7d", + "30d" + ] + }, + "timezone": "", + "title": "Keycloak - Overview", + "uid": "keycloak-dashboard", + "version": 6, + "description": "Dashboard of Keycloak metrics exported with Keycloak Metrics SPI\r\n\r\nhttps://github.com/aerogear/keycloak-metrics-spi" +} \ No newline at end of file diff --git a/dbrepo-dashboard-ui/dashboards/System/mariadb.json b/dbrepo-dashboard-ui/dashboards/System/mariadb.json new file mode 100644 index 0000000000000000000000000000000000000000..b6297de19c2dcd0c179c49a8c616ab2f230caf6b --- /dev/null +++ b/dbrepo-dashboard-ui/dashboards/System/mariadb.json @@ -0,0 +1,1377 @@ +{ + "annotations": { + "list": [ + { + "builtIn": 1, + "datasource": "-- Grafana --", + "enable": true, + "hide": true, + "iconColor": "rgba(0, 211, 255, 1)", + "name": "Annotations & Alerts", + "type": "dashboard" + } + ] + }, + "description": "mariadb galera cluster overview. metrics from mysqld exporter.", + "editable": true, + "gnetId": 13106, + "graphTooltip": 0, + "id": null, + "iteration": 1601970485064, + "links": [], + "panels": [ + { + "datasource": { + "default": true, + "type": "prometheus", + "uid": "dbrepometrics0" + }, + "fieldConfig": { + "defaults": { + "custom": { + "align": null, + "filterable": false + }, + "mappings": [ + { + "from": "", + "id": 0, + "text": "UP", + "to": "", + "type": 1, + "value": "1" + }, + { + "from": "", + "id": 1, + "text": "DOWN", + "to": "", + "type": 1, + "value": "0" + } + ], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 0 + } + ] + } + }, + "overrides": [ + { + "matcher": { + "id": "byType", + "options": "number" + }, + "properties": [ + { + "id": "custom.displayMode", + "value": "color-background" + }, + { + "id": "thresholds", + "value": { + "mode": "absolute", + "steps": [ + { + "color": "red", + "value": null + }, + { + "color": "green", + "value": 1 + } + ] + } + }, + { + "id": "custom.width", + "value": 200 + } + ] + } + ] + }, + "gridPos": { + "h": 5, + "w": 12, + "x": 0, + "y": 0 + }, + "id": 2, + "options": { + "showHeader": true, + "sortBy": [] + }, + "pluginVersion": "7.2.0", + "targets": [ + { + "expr": "mysql_up", + "format": "table", + "instant": true, + "interval": "", + "intervalFactor": 1, + "legendFormat": "", + "refId": "A" + } + ], + "timeFrom": null, + "timeShift": null, + "title": "Service Status", + "transformations": [ + { + "id": "filterFieldsByName", + "options": { + "include": { + "names": [ + "instance", + "Value" + ] + } + } + } + ], + "type": "table" + }, + { + "datasource": "dbrepometrics0", + "fieldConfig": { + "defaults": { + "custom": { + "align": null, + "filterable": false + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [ + { + "matcher": { + "id": "byType", + "options": "number" + }, + "properties": [ + { + "id": "unit", + "value": "s" + }, + { + "id": "custom.width", + "value": 200 + }, + { + "id": "custom.displayMode", + "value": "color-background" + }, + { + "id": "thresholds", + "value": { + "mode": "absolute", + "steps": [ + { + "color": "red", + "value": null + }, + { + "color": "green", + "value": 80 + } + ] + } + } + ] + } + ] + }, + "gridPos": { + "h": 5, + "w": 12, + "x": 12, + "y": 0 + }, + "id": 4, + "options": { + "showHeader": true + }, + "pluginVersion": "7.2.0", + "targets": [ + { + "expr": "mysql_global_status_uptime", + "format": "table", + "instant": true, + "interval": "", + "legendFormat": "", + "refId": "A" + } + ], + "timeFrom": null, + "timeShift": null, + "title": "Service Uptime", + "transformations": [ + { + "id": "filterFieldsByName", + "options": { + "include": { + "names": [ + "instance", + "Value" + ] + } + } + } + ], + "type": "table" + }, + { + "datasource": "dbrepometrics0", + "fieldConfig": { + "defaults": { + "custom": {}, + "mappings": [], + "max": 3, + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "red", + "value": null + }, + { + "color": "yellow", + "value": 1.0001 + }, + { + "color": "green", + "value": 2.0001 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 5, + "w": 12, + "x": 0, + "y": 5 + }, + "id": 6, + "options": { + "reduceOptions": { + "calcs": [ + "last" + ], + "fields": "", + "values": false + }, + "showThresholdLabels": false, + "showThresholdMarkers": true + }, + "pluginVersion": "7.2.0", + "targets": [ + { + "expr": "mysql_global_status_wsrep_cluster_size", + "format": "time_series", + "instant": false, + "interval": "", + "legendFormat": "", + "refId": "A" + } + ], + "timeFrom": null, + "timeShift": null, + "title": "Cluster Size", + "transformations": [ + { + "id": "labelsToFields", + "options": { + "valueLabel": "instance" + } + } + ], + "type": "gauge" + }, + { + "datasource": "dbrepometrics0", + "fieldConfig": { + "defaults": { + "custom": { + "align": null, + "filterable": false + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "red", + "value": null + }, + { + "color": "green", + "value": 1 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 5, + "w": 12, + "x": 12, + "y": 5 + }, + "id": 8, + "options": { + "colorMode": "value", + "graphMode": "area", + "justifyMode": "auto", + "orientation": "auto", + "reduceOptions": { + "calcs": [ + "mean" + ], + "fields": "", + "values": false + }, + "textMode": "auto" + }, + "pluginVersion": "7.2.0", + "targets": [ + { + "expr": "mysql_global_status_wsrep_cluster_status", + "instant": false, + "interval": "", + "legendFormat": "", + "refId": "A" + } + ], + "timeFrom": null, + "timeShift": null, + "title": "Cluster Status", + "transformations": [ + { + "id": "labelsToFields", + "options": { + "valueLabel": "instance" + } + } + ], + "transparent": true, + "type": "stat" + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "dbrepometrics0", + "fieldConfig": { + "defaults": { + "custom": {}, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 7, + "w": 12, + "x": 0, + "y": 10 + }, + "hiddenSeries": false, + "id": 16, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "rightSide": true, + "show": true, + "sideWidth": 200, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "nullPointMode": "null", + "options": { + "alertThreshold": true + }, + "percentage": false, + "pluginVersion": "7.2.0", + "pointradius": 2, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "rate(mysql_global_status_queries[1m])", + "interval": "", + "legendFormat": "{{ instance }}", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Current QPS", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "dbrepometrics0", + "fieldConfig": { + "defaults": { + "custom": {}, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 7, + "w": 12, + "x": 12, + "y": 10 + }, + "hiddenSeries": false, + "id": 10, + "legend": { + "alignAsTable": true, + "avg": false, + "current": false, + "max": false, + "min": false, + "rightSide": true, + "show": true, + "sideWidth": 200, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "options": { + "alertThreshold": true + }, + "percentage": false, + "pluginVersion": "7.2.0", + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "mysql_global_status_max_used_connections", + "format": "time_series", + "interval": "", + "intervalFactor": 1, + "legendFormat": "Current - {{ instance }}", + "refId": "A" + }, + { + "expr": "mysql_global_variables_max_connections", + "format": "time_series", + "interval": "", + "intervalFactor": 1, + "legendFormat": "Max - {{ instance }}", + "refId": "B" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Mysql Connections", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "dbrepometrics0", + "fieldConfig": { + "defaults": { + "custom": {} + }, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 7, + "w": 12, + "x": 0, + "y": 17 + }, + "hiddenSeries": false, + "id": 12, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "rightSide": true, + "show": true, + "sideWidth": 200, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "options": { + "alertThreshold": true + }, + "percentage": false, + "pluginVersion": "7.2.0", + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [ + { + "alias": "write", + "transform": "negative-Y" + } + ], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "irate(mysql_global_status_innodb_data_reads[10m])", + "format": "time_series", + "interval": "", + "intervalFactor": 1, + "legendFormat": "reads - {{ instance }}", + "refId": "A" + }, + { + "expr": "irate(mysql_global_status_innodb_data_writes[10m])", + "format": "time_series", + "interval": "", + "intervalFactor": 1, + "legendFormat": "write - {{ instance }}", + "refId": "B" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "mysql disk reads vs writes", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "dbrepometrics0", + "fieldConfig": { + "defaults": { + "custom": {} + }, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 7, + "w": 12, + "x": 12, + "y": 17 + }, + "hiddenSeries": false, + "id": 14, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "rightSide": true, + "show": true, + "sideWidth": 200, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null", + "options": { + "alertThreshold": true + }, + "percentage": false, + "pluginVersion": "7.2.0", + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [ + { + "alias": "/sent/", + "transform": "negative-Y" + } + ], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "irate(mysql_global_status_bytes_received[5m])", + "format": "time_series", + "interval": "", + "intervalFactor": 1, + "legendFormat": "received - {{ instance }}", + "refId": "A" + }, + { + "expr": "irate(mysql_global_status_bytes_sent[5m])", + "format": "time_series", + "interval": "", + "intervalFactor": 1, + "legendFormat": "sent - {{ instance }}", + "refId": "B" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "mysql network received vs sent", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "dbrepometrics0", + "fieldConfig": { + "defaults": { + "custom": {} + }, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 8, + "w": 24, + "x": 0, + "y": 24 + }, + "hiddenSeries": false, + "id": 18, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "rightSide": true, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "nullPointMode": "null", + "options": { + "alertThreshold": true + }, + "percentage": false, + "pluginVersion": "7.2.0", + "pointradius": 2, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "topk(5, rate(mysql_global_status_commands_total[5m]))", + "interval": "", + "legendFormat": "Com_{{ command }}", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Top Command Counters", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "dbrepometrics0", + "decimals": 2, + "fieldConfig": { + "defaults": { + "custom": {} + }, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 32 + }, + "hiddenSeries": false, + "id": 20, + "legend": { + "alignAsTable": true, + "avg": true, + "current": false, + "max": true, + "min": true, + "show": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "nullPointMode": "null", + "options": { + "alertThreshold": true + }, + "percentage": false, + "pluginVersion": "7.2.0", + "pointradius": 2, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "rate(mysql_global_status_opened_files[1m])", + "interval": "", + "legendFormat": "{{ instance }}", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "MySQL File Openings", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "dbrepometrics0", + "decimals": 2, + "fieldConfig": { + "defaults": { + "custom": {} + }, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 32 + }, + "hiddenSeries": false, + "id": 22, + "legend": { + "alignAsTable": true, + "avg": true, + "current": false, + "max": true, + "min": true, + "show": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "nullPointMode": "null", + "options": { + "alertThreshold": true + }, + "percentage": false, + "pluginVersion": "7.2.0", + "pointradius": 2, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "mysql_global_status_open_files", + "interval": "", + "legendFormat": "Open Files - {{ instance }}", + "refId": "A" + }, + { + "expr": "mysql_global_variables_open_files_limit", + "interval": "", + "legendFormat": "Open Files Limit - {{ instance }}", + "refId": "B" + }, + { + "expr": "mysql_global_status_innodb_num_open_files", + "interval": "", + "legendFormat": "InnoDB Open Files - {{ instance }}", + "refId": "C" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "MySQL Open Files", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "dbrepometrics0", + "decimals": 1, + "fieldConfig": { + "defaults": { + "custom": {} + }, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 40 + }, + "hiddenSeries": false, + "id": 24, + "legend": { + "alignAsTable": true, + "avg": true, + "current": true, + "max": true, + "min": false, + "rightSide": false, + "show": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "nullPointMode": "null", + "options": { + "alertThreshold": true + }, + "percentage": false, + "pluginVersion": "7.2.0", + "pointradius": 2, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "irate(mysql_global_status_slow_queries[1m])", + "interval": "", + "legendFormat": "Slow Queries on {{ instance }}", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "MySQL Slow Queries", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "$$hashKey": "object:94", + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "$$hashKey": "object:95", + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "dbrepometrics0", + "fieldConfig": { + "defaults": { + "custom": {} + }, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 40 + }, + "hiddenSeries": false, + "id": 26, + "legend": { + "alignAsTable": true, + "avg": true, + "current": false, + "max": true, + "min": false, + "show": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "nullPointMode": "null", + "options": { + "alertThreshold": true + }, + "percentage": false, + "pluginVersion": "7.2.0", + "pointradius": 2, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "irate(mysql_global_status_aborted_connects[1m])", + "interval": "", + "legendFormat": "Aborted Connects (attempts) on - {{ instance }}", + "refId": "A" + }, + { + "expr": "irate(mysql_global_status_aborted_clients[1m])", + "interval": "", + "legendFormat": "Aborted Clients (timeout) on - {{ instance }}", + "refId": "B" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "MySQL Aborted Connections", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "$$hashKey": "object:206", + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "$$hashKey": "object:207", + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + } + ], + "refresh": "5m", + "schemaVersion": 26, + "style": "dark", + "tags": ["provisioned", "galera", "mariadb"], + "templating": { + "list": [ + { + "datasource": "prometheus", + "filters": [], + "hide": 0, + "label": "", + "name": "Filters", + "skipUrlSync": false, + "type": "adhoc" + } + ] + }, + "time": { + "from": "now-3h", + "to": "now" + }, + "timepicker": {}, + "timezone": "", + "title": "MariaDB Galera - Overview", + "uid": "pXgz0qFGk", + "version": 2 +} \ No newline at end of file diff --git a/dbrepo-dashboard-ui/dashboards/System/rabbitmq.json b/dbrepo-dashboard-ui/dashboards/System/rabbitmq.json index 6958b05e83f7e1437a024b70a37a75063b9848f8..fbaaf04ba0f7b32f7da9a10ac3edbafab23f273a 100644 --- a/dbrepo-dashboard-ui/dashboards/System/rabbitmq.json +++ b/dbrepo-dashboard-ui/dashboards/System/rabbitmq.json @@ -8053,10 +8053,10 @@ "type": "timeseries" } ], - "refresh": "15s", + "refresh": "24h", "schemaVersion": 34, "style": "dark", - "tags": ["rabbitmq", "amqp", "mqtt"], + "tags": ["provisioned", "rabbitmq"], "templating": { "list": [ { @@ -8133,7 +8133,7 @@ ] }, "time": { - "from": "now-15m", + "from": "now-3h", "to": "now" }, "timepicker": { @@ -8157,7 +8157,7 @@ ] }, "timezone": "", - "title": "Broker Service", + "title": "RabbitMQ - Overview", "uid": "Kn5xm-gZk", "version": 20220805, "weekStart": "", diff --git a/dbrepo-dashboard-ui/grafana.ini b/dbrepo-dashboard-ui/grafana.ini index f0d0539a1ec2644c9d6caa1adb9ef437a7dd0431..83dc5eb81ee8a490aa7690d5c6835a9a0200fe04 100644 --- a/dbrepo-dashboard-ui/grafana.ini +++ b/dbrepo-dashboard-ui/grafana.ini @@ -1,5 +1,12 @@ # order of config evaluation is grafana.ini < defaults.ini +[database] +type = postgres +host = dashboard-db:5432 +name = ${DASHBOARD_DB_NAME} +user = ${DASHBOARD_DB_USERNAME} +password = ${DASHBOARD_DB_PASSWORD} + [security] disable_initial_admin_creation = true diff --git a/dbrepo-dashboard-ui/provisioning/datasources/opensearch.yaml b/dbrepo-dashboard-ui/provisioning/datasources/opensearch.yaml new file mode 100644 index 0000000000000000000000000000000000000000..3b26f0a4746712c597b90799f5004aab23d31b51 --- /dev/null +++ b/dbrepo-dashboard-ui/provisioning/datasources/opensearch.yaml @@ -0,0 +1,14 @@ +apiVersion: 1 + +datasources: + - name: dbrepo-opensearch + uid: dbrepoopensearch0 + type: grafana-opensearch-datasource + basicAuth: false + url: http://search-db:9200 + jsonData: + flavor: "opensearch" + logLevelField: "level" + logMessageField: "message" + timeField: "@timestamp" + version: "2.19.0" diff --git a/dbrepo-data-db/metrics.cnf b/dbrepo-data-db/metrics.cnf new file mode 100644 index 0000000000000000000000000000000000000000..10dd32998a5aab20ed52756e1e1678c9cd281d27 --- /dev/null +++ b/dbrepo-data-db/metrics.cnf @@ -0,0 +1,3 @@ +[client] +user=readonly +password=readonly \ No newline at end of file diff --git a/dbrepo-data-service/Dockerfile b/dbrepo-data-service/Dockerfile index 537f88fe71ec84b8fcdd29b671c172300df71b8e..32cdfc7d7a8b0f5b463012b22fe00591d7018f7f 100644 --- a/dbrepo-data-service/Dockerfile +++ b/dbrepo-data-service/Dockerfile @@ -26,12 +26,15 @@ RUN apk --no-cache add \ WORKDIR /app +RUN mkdir -p /var/log/app/service/data && \ + chown -R 1001:1001 /var/log/app/service/data + RUN adduser -D dbrepo --uid 1001 && \ chown -R 1001:1001 /app USER 1001 -COPY --from=build --chown=1001 ./rest-service/target/*rest-service-*.jar ./data-service.jar +COPY --from=build --chown=1001 ./rest-service/target/*service-*.jar ./data-service.jar # non-root port EXPOSE 8080 diff --git a/dbrepo-data-service/pom.xml b/dbrepo-data-service/pom.xml index 4593cb0ae5d7b18c8e1dd09ee8a12bab053fceb6..566fe3728d38f051599719470f37d7ad531edeaf 100644 --- a/dbrepo-data-service/pom.xml +++ b/dbrepo-data-service/pom.xml @@ -5,7 +5,7 @@ <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> - <version>3.3.5</version> + <version>3.4.0</version> </parent> <organization> @@ -16,7 +16,7 @@ <groupId>at.ac.tuwien.ifs.dbrepo</groupId> <artifactId>data-service</artifactId> <name>data-service</name> - <version>1.8.1</version> + <version>1.9.0</version> <description>Service that manages the data</description> @@ -28,7 +28,7 @@ <module>report</module> </modules> - <url>https://www.ifs.tuwien.ac.at/infrastructures/dbrepo/1.8/</url> + <url>https://www.ifs.tuwien.ac.at/infrastructures/dbrepo/1.9/</url> <developers> <developer> <name>Martin Weise</name> @@ -96,7 +96,7 @@ <dependency> <groupId>at.ac.tuwien.ifs.dbrepo</groupId> <artifactId>dbrepo-core</artifactId> - <version>1.8.1</version> + <version>1.9.0</version> </dependency> <!-- Spark --> <dependency> @@ -168,6 +168,12 @@ <groupId>software.amazon.awssdk</groupId> <artifactId>s3</artifactId> <version>${aws-s3.version}</version> + <exclusions> + <exclusion> + <groupId>commons-logging</groupId> + <artifactId>commons-logging</artifactId> + </exclusion> + </exclusions> </dependency> <!-- Monitoring --> <dependency> @@ -206,6 +212,12 @@ <groupId>commons-validator</groupId> <artifactId>commons-validator</artifactId> <version>${commons-validator.version}</version> + <exclusions> + <exclusion> + <groupId>commons-logging</groupId> + <artifactId>commons-logging</artifactId> + </exclusion> + </exclusions> </dependency> <dependency> <groupId>org.jooq</groupId> @@ -239,6 +251,13 @@ <artifactId>amqp-client</artifactId> <version>${rabbitmq.version}</version> </dependency> + <!-- Api --> + <dependency> + <groupId>org.projectlombok</groupId> + <artifactId>lombok</artifactId> + <version>${lombok.version}</version> + <scope>provided</scope> + </dependency> <!-- Testing --> <dependency> <groupId>org.springframework</groupId> @@ -293,6 +312,7 @@ <filtering>true</filtering> <includes> <include>**/application*.yml</include> + <include>**/*.properties</include> <include>**/jars/*.jar</include> </includes> </resource> diff --git a/dbrepo-data-service/querystore/pom.xml b/dbrepo-data-service/querystore/pom.xml index df7ebf027142fe95303824142dec822f58bf76bd..8b7d0812711ce5f16b1f7f9b942fcb8f3b0ee002 100644 --- a/dbrepo-data-service/querystore/pom.xml +++ b/dbrepo-data-service/querystore/pom.xml @@ -6,12 +6,12 @@ <parent> <groupId>at.ac.tuwien.ifs.dbrepo</groupId> <artifactId>data-service</artifactId> - <version>1.8.1</version> + <version>1.9.0</version> </parent> <name>querystore</name> <artifactId>querystore</artifactId> - <version>1.8.1</version> + <version>1.9.0</version> <dependencies/> diff --git a/dbrepo-data-service/report/pom.xml b/dbrepo-data-service/report/pom.xml index 31dc7e5dcf938186053181c83c8749e7607a58f2..409ffcc5622e175daedb1b12d816659fe87344f0 100644 --- a/dbrepo-data-service/report/pom.xml +++ b/dbrepo-data-service/report/pom.xml @@ -6,28 +6,23 @@ <parent> <groupId>at.ac.tuwien.ifs.dbrepo</groupId> <artifactId>data-service</artifactId> - <version>1.8.1</version> + <version>1.9.0</version> </parent> <name>report</name> <artifactId>report</artifactId> - <version>1.8.1</version> - - <description> - This module is only intended for the pipeline coverage report. See the detailed report in the - respective modules - </description> + <version>1.9.0</version> <dependencies> <dependency> <groupId>at.ac.tuwien.ifs.dbrepo</groupId> <artifactId>rest-service</artifactId> - <version>1.8.1</version> + <version>1.9.0</version> </dependency> <dependency> <groupId>at.ac.tuwien.ifs.dbrepo</groupId> <artifactId>services</artifactId> - <version>1.8.1</version> + <version>1.9.0</version> </dependency> </dependencies> diff --git a/dbrepo-data-service/rest-service/pom.xml b/dbrepo-data-service/rest-service/pom.xml index ab400a68ede799641f8c919a53163099bcf47646..8965b3d36dbbe9c3a4c5c5aa2f3696192515d8bf 100644 --- a/dbrepo-data-service/rest-service/pom.xml +++ b/dbrepo-data-service/rest-service/pom.xml @@ -6,25 +6,21 @@ <parent> <groupId>at.ac.tuwien.ifs.dbrepo</groupId> <artifactId>data-service</artifactId> - <version>1.8.1</version> + <version>1.9.0</version> </parent> <name>rest-service</name> <artifactId>rest-service</artifactId> - <version>1.8.1</version> + <version>1.9.0</version> <dependencies> <dependency> <groupId>at.ac.tuwien.ifs.dbrepo</groupId> <artifactId>services</artifactId> - <version>1.8.1</version> + <version>1.9.0</version> </dependency> </dependencies> - <properties> - <jacoco.version>0.8.7</jacoco.version> - </properties> - <build> <plugins> <plugin> @@ -38,14 +34,6 @@ </execution> </executions> </plugin> - <plugin> - <groupId>org.apache.maven.plugins</groupId> - <artifactId>maven-compiler-plugin</artifactId> - <configuration> - <source>9</source> - <target>9</target> - </configuration> - </plugin> </plugins> </build> diff --git a/dbrepo-data-service/rest-service/src/main/java/at/ac/tuwien/ifs/dbrepo/DataServiceApplication.java b/dbrepo-data-service/rest-service/src/main/java/at/ac/tuwien/ifs/dbrepo/DataServiceApplication.java index ec2cdc1676191fd03ce03096c065c114614603de..0a34f8df8f1c2d06c320486721f3ab5d203e75c3 100644 --- a/dbrepo-data-service/rest-service/src/main/java/at/ac/tuwien/ifs/dbrepo/DataServiceApplication.java +++ b/dbrepo-data-service/rest-service/src/main/java/at/ac/tuwien/ifs/dbrepo/DataServiceApplication.java @@ -1,15 +1,15 @@ package at.ac.tuwien.ifs.dbrepo; -import at.ac.tuwien.ifs.dbrepo.gateway.MetadataServiceGateway; -import at.ac.tuwien.ifs.dbrepo.service.CacheService; -import at.ac.tuwien.ifs.dbrepo.service.ContainerService; -import at.ac.tuwien.ifs.dbrepo.service.DatabaseService; import at.ac.tuwien.ifs.dbrepo.core.api.database.DatabaseBriefDto; import at.ac.tuwien.ifs.dbrepo.core.api.database.DatabaseDto; import at.ac.tuwien.ifs.dbrepo.core.api.database.ViewDto; import at.ac.tuwien.ifs.dbrepo.core.api.database.table.TableDto; import at.ac.tuwien.ifs.dbrepo.core.exception.*; -import lombok.extern.log4j.Log4j2; +import at.ac.tuwien.ifs.dbrepo.gateway.MetadataServiceGateway; +import at.ac.tuwien.ifs.dbrepo.service.CacheService; +import at.ac.tuwien.ifs.dbrepo.service.ContainerService; +import at.ac.tuwien.ifs.dbrepo.service.DatabaseService; +import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.CommandLineRunner; import org.springframework.boot.SpringApplication; @@ -20,7 +20,7 @@ import org.springframework.scheduling.annotation.EnableScheduling; import java.sql.SQLException; import java.util.List; -@Log4j2 +@Slf4j @EnableScheduling @SpringBootApplication public class DataServiceApplication implements CommandLineRunner { diff --git a/dbrepo-data-service/rest-service/src/main/java/at/ac/tuwien/ifs/dbrepo/endpoints/AccessEndpoint.java b/dbrepo-data-service/rest-service/src/main/java/at/ac/tuwien/ifs/dbrepo/endpoints/AccessEndpoint.java index 70b3e59616d1e73244efe290abe633abcc7d9186..fb28579cb37e49c659a1745586bf019c74e0db9b 100644 --- a/dbrepo-data-service/rest-service/src/main/java/at/ac/tuwien/ifs/dbrepo/endpoints/AccessEndpoint.java +++ b/dbrepo-data-service/rest-service/src/main/java/at/ac/tuwien/ifs/dbrepo/endpoints/AccessEndpoint.java @@ -15,7 +15,7 @@ import io.swagger.v3.oas.annotations.responses.ApiResponses; import io.swagger.v3.oas.annotations.security.SecurityRequirement; import jakarta.validation.Valid; import jakarta.validation.constraints.NotNull; -import lombok.extern.log4j.Log4j2; +import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; @@ -25,7 +25,7 @@ import org.springframework.web.bind.annotation.*; import java.sql.SQLException; import java.util.UUID; -@Log4j2 +@Slf4j @RestController @CrossOrigin(origins = "*") @RequestMapping(path = "/api/database/{databaseId}/access") diff --git a/dbrepo-data-service/rest-service/src/main/java/at/ac/tuwien/ifs/dbrepo/endpoints/DatabaseEndpoint.java b/dbrepo-data-service/rest-service/src/main/java/at/ac/tuwien/ifs/dbrepo/endpoints/DatabaseEndpoint.java index 34f42725c0f1e0f31afa345b2e359a31d288c202..abd843150b99ce5d541945234de1df78efae996a 100644 --- a/dbrepo-data-service/rest-service/src/main/java/at/ac/tuwien/ifs/dbrepo/endpoints/DatabaseEndpoint.java +++ b/dbrepo-data-service/rest-service/src/main/java/at/ac/tuwien/ifs/dbrepo/endpoints/DatabaseEndpoint.java @@ -20,7 +20,7 @@ import io.swagger.v3.oas.annotations.responses.ApiResponses; import io.swagger.v3.oas.annotations.security.SecurityRequirement; import jakarta.validation.Valid; import jakarta.validation.constraints.NotNull; -import lombok.extern.log4j.Log4j2; +import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; @@ -30,7 +30,7 @@ import org.springframework.web.bind.annotation.*; import java.sql.SQLException; import java.util.UUID; -@Log4j2 +@Slf4j @RestController @CrossOrigin(origins = "*") @RequestMapping(path = "/api/database") diff --git a/dbrepo-data-service/rest-service/src/main/java/at/ac/tuwien/ifs/dbrepo/endpoints/SubsetEndpoint.java b/dbrepo-data-service/rest-service/src/main/java/at/ac/tuwien/ifs/dbrepo/endpoints/SubsetEndpoint.java index 8c3656b0cd603f69946a8c69c6b02ff887ede6ad..d6a045d0eb259f29bc41c364d5540c8d9c74f03b 100644 --- a/dbrepo-data-service/rest-service/src/main/java/at/ac/tuwien/ifs/dbrepo/endpoints/SubsetEndpoint.java +++ b/dbrepo-data-service/rest-service/src/main/java/at/ac/tuwien/ifs/dbrepo/endpoints/SubsetEndpoint.java @@ -28,7 +28,7 @@ import io.swagger.v3.oas.annotations.security.SecurityRequirement; import jakarta.servlet.http.HttpServletRequest; import jakarta.validation.Valid; import jakarta.validation.constraints.NotNull; -import lombok.extern.log4j.Log4j2; +import lombok.extern.slf4j.Slf4j; import org.apache.spark.sql.Dataset; import org.apache.spark.sql.Row; import org.springframework.beans.factory.annotation.Autowired; @@ -42,7 +42,7 @@ import java.time.Instant; import java.util.List; import java.util.UUID; -@Log4j2 +@Slf4j @RestController @CrossOrigin(origins = "*") @RequestMapping(path = "/api/database/{databaseId}/subset") @@ -86,7 +86,7 @@ public class SubsetEndpoint extends RestEndpoint { mediaType = "application/json", schema = @Schema(implementation = ApiErrorDto.class))}), @ApiResponse(responseCode = "404", - description = "Failed to find database in metadata database or query in query store of the data database", + description = "Failed to find database or user in metadata database or query in query store of the data database", content = {@Content( mediaType = "application/json", schema = @Schema(implementation = ApiErrorDto.class))}), @@ -100,7 +100,7 @@ public class SubsetEndpoint extends RestEndpoint { @RequestParam(name = "persisted", required = false) Boolean filterPersisted, Principal principal) throws DatabaseUnavailableException, DatabaseNotFoundException, RemoteUnavailableException, - QueryNotFoundException, NotAllowedException, MetadataServiceException { + QueryNotFoundException, NotAllowedException, MetadataServiceException, UserNotFoundException { log.debug("endpoint find subsets in database, databaseId={}, filterPersisted={}", databaseId, filterPersisted); final DatabaseDto database = cacheService.getDatabase(databaseId); if (!database.getIsPublic()) { diff --git a/dbrepo-data-service/rest-service/src/main/java/at/ac/tuwien/ifs/dbrepo/endpoints/TableEndpoint.java b/dbrepo-data-service/rest-service/src/main/java/at/ac/tuwien/ifs/dbrepo/endpoints/TableEndpoint.java index 8ea36ff682ace6f66d1744662668b485f61cbc9a..b3dbaac99ab5f708787f9c71d48e52e56a9168e7 100644 --- a/dbrepo-data-service/rest-service/src/main/java/at/ac/tuwien/ifs/dbrepo/endpoints/TableEndpoint.java +++ b/dbrepo-data-service/rest-service/src/main/java/at/ac/tuwien/ifs/dbrepo/endpoints/TableEndpoint.java @@ -25,7 +25,7 @@ import io.swagger.v3.oas.annotations.security.SecurityRequirement; import jakarta.servlet.http.HttpServletRequest; import jakarta.validation.Valid; import jakarta.validation.constraints.NotNull; -import lombok.extern.log4j.Log4j2; +import lombok.extern.slf4j.Slf4j; import org.apache.spark.sql.Dataset; import org.apache.spark.sql.Row; import org.springframework.beans.factory.annotation.Autowired; @@ -40,9 +40,10 @@ import java.security.Principal; import java.sql.SQLException; import java.time.Instant; import java.util.List; +import java.util.Map; import java.util.UUID; -@Log4j2 +@Slf4j @RestController @CrossOrigin(origins = "*") @RequestMapping(path = "/api/database/{databaseId}/table") @@ -57,6 +58,8 @@ public class TableEndpoint extends RestEndpoint { private final EndpointValidator endpointValidator; private final MetadataServiceGateway metadataServiceGateway; + private static final String MEDIA_TYPE_TEXT_CSV = "text/csv"; + @Autowired public TableEndpoint(CacheService cacheService, TableService tableService, MariaDbMapper mariaDbMapper, SubsetService subsetService, StorageService storageService, DatabaseService databaseService, @@ -306,8 +309,8 @@ public class TableEndpoint extends RestEndpoint { headers.set("X-Headers", String.join(",", table.getColumns().stream().map(ColumnDto::getInternalName).toList())); final String query = mariaDbMapper.defaultRawSelectQuery(database.getInternalName(), table.getInternalName(), timestamp, - accept.equals("text/csv") ? null : page, - accept.equals("text/csv") ? null : size); + accept.equals(MEDIA_TYPE_TEXT_CSV) ? null : page, + accept.equals(MEDIA_TYPE_TEXT_CSV) ? null : size); final Dataset<Row> dataset = subsetService.getData(database, query); switch (accept) { case MediaType.APPLICATION_JSON_VALUE: @@ -315,7 +318,7 @@ public class TableEndpoint extends RestEndpoint { return ResponseEntity.ok() .headers(headers) .body(transform(dataset)); - case "text/csv": + case MEDIA_TYPE_TEXT_CSV: log.trace("accept header matches csv"); final ExportResourceDto resource = storageService.transformDataset(dataset); headers.add("Content-Disposition", "attachment; filename=\"" + resource.getFilename() + "\""); @@ -323,8 +326,13 @@ public class TableEndpoint extends RestEndpoint { .headers(headers) .body(storageService.transformDataset(dataset) .getResource()); + default: + log.atError() + .setMessage("Invalid data format " + accept + " accepted") + .addKeyValue("request_header_accept", accept) + .log(); + throw new FormatNotAvailableException("Header 'Accept' must be one of: application/json, text/csv value"); } - throw new FormatNotAvailableException("Must provide either application/json or text/csv value for header 'Accept': provided " + accept + " instead"); } catch (SQLException | QueryMalformedException e) { log.error("Failed to establish connection to database: {}", e.getMessage()); throw new DatabaseUnavailableException("Failed to establish connection to database: " + e.getMessage(), e); @@ -648,7 +656,12 @@ public class TableEndpoint extends RestEndpoint { throws RemoteUnavailableException, TableNotFoundException, NotAllowedException, MetadataServiceException, StorageNotFoundException, MalformedException, StorageUnavailableException, QueryMalformedException, DatabaseUnavailableException, DatabaseNotFoundException { - log.debug("endpoint insert table data, databaseId={}, tableId={}, data.location={}", databaseId, tableId, data.getLocation()); + log.atDebug() + .setMessage("endpoint insert table data") + .addKeyValue("database_id", databaseId) + .addKeyValue("table_id", tableId) + .addKeyValue("data", data) + .log(); final TableDto table = cacheService.getTable(databaseId, tableId); final DatabaseAccessDto access = cacheService.getAccess(databaseId, getId(principal)); endpointValidator.validateOnlyWriteOwnOrWriteAllAccess(access.getType(), table.getOwner().getId(), getId(principal)); diff --git a/dbrepo-data-service/rest-service/src/main/java/at/ac/tuwien/ifs/dbrepo/endpoints/UploadEndpoint.java b/dbrepo-data-service/rest-service/src/main/java/at/ac/tuwien/ifs/dbrepo/endpoints/UploadEndpoint.java index b7a88fc3f7c63116689dbbe26d4466ed43e0160b..ffe49226397c1d6c0af69784df9bf762f764eae9 100644 --- a/dbrepo-data-service/rest-service/src/main/java/at/ac/tuwien/ifs/dbrepo/endpoints/UploadEndpoint.java +++ b/dbrepo-data-service/rest-service/src/main/java/at/ac/tuwien/ifs/dbrepo/endpoints/UploadEndpoint.java @@ -12,7 +12,7 @@ import io.swagger.v3.oas.annotations.responses.ApiResponse; import io.swagger.v3.oas.annotations.responses.ApiResponses; import io.swagger.v3.oas.annotations.security.SecurityRequirement; import jakarta.validation.constraints.NotNull; -import lombok.extern.log4j.Log4j2; +import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; @@ -22,7 +22,7 @@ import org.springframework.web.multipart.MultipartFile; import java.io.IOException; -@Log4j2 +@Slf4j @RestController @CrossOrigin(origins = "*") @RequestMapping(path = "/api/upload") @@ -52,14 +52,18 @@ public class UploadEndpoint extends RestEndpoint { mediaType = "application/json", schema = @Schema(implementation = ApiErrorDto.class))}), }) - public ResponseEntity<UploadResponseDto> create(@NotNull @RequestParam("file") MultipartFile file) throws DatabaseUnavailableException, - DatabaseNotFoundException, RemoteUnavailableException, ViewMalformedException, MetadataServiceException { - log.debug("endpoint upload file, file.originalFilename={}", file.getOriginalFilename()); + public ResponseEntity<UploadResponseDto> create(@NotNull @RequestParam("file") MultipartFile file) + throws DatabaseUnavailableException, DatabaseNotFoundException, RemoteUnavailableException, + ViewMalformedException, MetadataServiceException { + log.atDebug() + .setMessage("endpoint upload file") + .addKeyValue("file", file) + .log(); try { - final String key = storageService.putObject(file.getBytes()); + storageService.putObject(file.getOriginalFilename(), file.getBytes()); return ResponseEntity.status(HttpStatus.CREATED) .body(UploadResponseDto.builder() - .s3Key(key) + .s3Key(file.getOriginalFilename()) .build()); } catch (IOException e) { log.error("Failed to establish connection to database: {}", e.getMessage()); diff --git a/dbrepo-data-service/rest-service/src/main/java/at/ac/tuwien/ifs/dbrepo/endpoints/ViewEndpoint.java b/dbrepo-data-service/rest-service/src/main/java/at/ac/tuwien/ifs/dbrepo/endpoints/ViewEndpoint.java index b589d66a06fadd7543ca103217dca41085f6f0a9..5d4b85668a38d75fe481b9dded655d8030567254 100644 --- a/dbrepo-data-service/rest-service/src/main/java/at/ac/tuwien/ifs/dbrepo/endpoints/ViewEndpoint.java +++ b/dbrepo-data-service/rest-service/src/main/java/at/ac/tuwien/ifs/dbrepo/endpoints/ViewEndpoint.java @@ -22,7 +22,7 @@ import io.swagger.v3.oas.annotations.security.SecurityRequirement; import jakarta.servlet.http.HttpServletRequest; import jakarta.validation.Valid; import jakarta.validation.constraints.NotNull; -import lombok.extern.log4j.Log4j2; +import lombok.extern.slf4j.Slf4j; import org.apache.spark.sql.Dataset; import org.apache.spark.sql.Row; import org.jooq.DSLContext; @@ -40,7 +40,7 @@ import java.time.Instant; import java.util.List; import java.util.UUID; -@Log4j2 +@Slf4j @RestController @CrossOrigin(origins = "*") @RequestMapping(path = "/api/database/{databaseId}/view") diff --git a/dbrepo-data-service/rest-service/src/main/java/at/ac/tuwien/ifs/dbrepo/handlers/ApiExceptionHandler.java b/dbrepo-data-service/rest-service/src/main/java/at/ac/tuwien/ifs/dbrepo/handlers/ApiExceptionHandler.java index 6aea3e878221c6766a76d8e1e245b54ac3e1a089..0cb85e19072df7aea2d6f4cecdd56a28a76f88b6 100644 --- a/dbrepo-data-service/rest-service/src/main/java/at/ac/tuwien/ifs/dbrepo/handlers/ApiExceptionHandler.java +++ b/dbrepo-data-service/rest-service/src/main/java/at/ac/tuwien/ifs/dbrepo/handlers/ApiExceptionHandler.java @@ -3,7 +3,7 @@ package at.ac.tuwien.ifs.dbrepo.handlers; import at.ac.tuwien.ifs.dbrepo.core.api.error.ApiErrorDto; import at.ac.tuwien.ifs.dbrepo.core.exception.*; import io.swagger.v3.oas.annotations.Hidden; -import lombok.extern.log4j.Log4j2; +import lombok.extern.slf4j.Slf4j; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; @@ -13,7 +13,7 @@ import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.ResponseStatus; import org.springframework.web.servlet.mvc.method.annotation.ResponseEntityExceptionHandler; -@Log4j2 +@Slf4j @ControllerAdvice public class ApiExceptionHandler extends ResponseEntityExceptionHandler { diff --git a/dbrepo-data-service/rest-service/src/main/java/at/ac/tuwien/ifs/dbrepo/validation/EndpointValidator.java b/dbrepo-data-service/rest-service/src/main/java/at/ac/tuwien/ifs/dbrepo/validation/EndpointValidator.java index 009c3b0b3fe5ced4ee469a3d9512d4e92927d3ce..0b873e59c65fb5cd499624713b86e24fb2a90c2e 100644 --- a/dbrepo-data-service/rest-service/src/main/java/at/ac/tuwien/ifs/dbrepo/validation/EndpointValidator.java +++ b/dbrepo-data-service/rest-service/src/main/java/at/ac/tuwien/ifs/dbrepo/validation/EndpointValidator.java @@ -9,7 +9,7 @@ import at.ac.tuwien.ifs.dbrepo.core.api.database.query.SubsetDto; import at.ac.tuwien.ifs.dbrepo.endpoints.RestEndpoint; import at.ac.tuwien.ifs.dbrepo.core.exception.*; import at.ac.tuwien.ifs.dbrepo.service.CacheService; -import lombok.extern.log4j.Log4j2; +import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @@ -17,7 +17,7 @@ import java.security.Principal; import java.util.List; import java.util.UUID; -@Log4j2 +@Slf4j @Component public class EndpointValidator extends RestEndpoint { diff --git a/dbrepo-data-service/rest-service/src/main/resources/application.yml b/dbrepo-data-service/rest-service/src/main/resources/application.yml index d8dec2e455c0d5fb199207deb3fe3ff3dc7fd21f..70ad1bde9ca32afd7106597922e5be6d3bee637e 100644 --- a/dbrepo-data-service/rest-service/src/main/resources/application.yml +++ b/dbrepo-data-service/rest-service/src/main/resources/application.yml @@ -48,11 +48,17 @@ server: tomcat: max-swallow-size: -1 logging: - pattern.console: "%d %highlight(%-5level) %msg%n" + file: + name: /var/log/app/service/data/app.log level: root: warn at.ac.tuwien.ifs.dbrepo.: "${LOG_LEVEL:info}" org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver: debug + pattern: + console: "%d %highlight(%-5level) %msg%n" + structured: + format: + file: ecs dbrepo: endpoints: metadataService: "${METADATA_SERVICE_ENDPOINT:http://metadata-service:8080}" diff --git a/dbrepo-data-service/rest-service/src/main/resources/config.properties b/dbrepo-data-service/rest-service/src/main/resources/config.properties index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..bc63beba4a21ad527d0821d228c5192f73fe1183 100644 --- a/dbrepo-data-service/rest-service/src/main/resources/config.properties +++ b/dbrepo-data-service/rest-service/src/main/resources/config.properties @@ -0,0 +1 @@ +# empty \ No newline at end of file diff --git a/dbrepo-data-service/rest-service/src/main/resources/hadoop-metrics2-s3a-file-system.properties b/dbrepo-data-service/rest-service/src/main/resources/hadoop-metrics2-s3a-file-system.properties new file mode 100644 index 0000000000000000000000000000000000000000..bc63beba4a21ad527d0821d228c5192f73fe1183 --- /dev/null +++ b/dbrepo-data-service/rest-service/src/main/resources/hadoop-metrics2-s3a-file-system.properties @@ -0,0 +1 @@ +# empty \ No newline at end of file diff --git a/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/config/MariaDbConfig.java b/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/config/MariaDbConfig.java index eed50bf5fb3995d322f7aea2c679cfa719e1ce22..e8604aabd3d56fcf43287206f5ccf9633ce7abfb 100644 --- a/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/config/MariaDbConfig.java +++ b/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/config/MariaDbConfig.java @@ -3,7 +3,7 @@ package at.ac.tuwien.ifs.dbrepo.config; import at.ac.tuwien.ifs.dbrepo.core.api.container.ContainerDto; import at.ac.tuwien.ifs.dbrepo.core.api.database.DatabaseDto; import at.ac.tuwien.ifs.dbrepo.core.api.database.query.QueryDto; -import lombok.extern.log4j.Log4j2; +import lombok.extern.slf4j.Slf4j; import org.springframework.context.annotation.Configuration; import org.springframework.core.io.ClassPathResource; import org.springframework.jdbc.datasource.init.ResourceDatabasePopulator; @@ -13,7 +13,7 @@ import java.util.*; import java.util.regex.Matcher; import java.util.regex.Pattern; -@Log4j2 +@Slf4j @Configuration public class MariaDbConfig { diff --git a/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/config/MariaDbContainerConfig.java b/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/config/MariaDbContainerConfig.java index 6a6fbc7476b719be47fa0c17e49e82c65c623c0a..2f5fa1acd8aa5d9fe0b6bf727d40b86593b3bf7c 100644 --- a/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/config/MariaDbContainerConfig.java +++ b/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/config/MariaDbContainerConfig.java @@ -2,7 +2,7 @@ package at.ac.tuwien.ifs.dbrepo.config; import at.ac.tuwien.ifs.dbrepo.core.test.BaseTest; import at.ac.tuwien.ifs.dbrepo.core.test.BaseTest; -import lombok.extern.log4j.Log4j2; +import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -14,7 +14,7 @@ import org.testcontainers.utility.DockerImageName; /** * This class configures the MariaDB container for the integration tests. */ -@Log4j2 +@Slf4j @Configuration public class MariaDbContainerConfig extends BaseTest { diff --git a/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/config/MariadbConfigTest.java b/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/config/MariadbConfigTest.java index eee4b27b4456a696680bb69b3dda49056f493707..a1b37c632fff2ac7684cfdcd96bacb0df3b152c3 100644 --- a/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/config/MariadbConfigTest.java +++ b/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/config/MariadbConfigTest.java @@ -1,13 +1,11 @@ package at.ac.tuwien.ifs.dbrepo.config; -import at.ac.tuwien.ifs.dbrepo.service.DatabaseService; import at.ac.tuwien.ifs.dbrepo.core.test.BaseTest; -import lombok.extern.log4j.Log4j2; +import lombok.extern.slf4j.Slf4j; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit.jupiter.SpringExtension; import org.testcontainers.containers.MariaDBContainer; @@ -18,25 +16,25 @@ import java.sql.SQLException; import java.sql.SQLTimeoutException; import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; -@Log4j2 +@Slf4j @SpringBootTest @ExtendWith(SpringExtension.class) @Testcontainers public class MariadbConfigTest extends BaseTest { - @Autowired - private DatabaseService databaseService; - @Container private static MariaDBContainer<?> mariaDBContainer = MariaDbContainerConfig.getContainer(); @BeforeAll + @SuppressWarnings("java:S2925") public static void beforeAll() throws InterruptedException { Thread.sleep(1000) /* wait for test container some more */; } @BeforeEach + @SuppressWarnings("java:S2925") public void beforeEach() throws SQLException, InterruptedException { /* metadata database */ MariaDbConfig.dropDatabase(CONTAINER_1_PRIVILEGED_DTO, DATABASE_1_INTERNAL_NAME); @@ -49,6 +47,7 @@ public class MariadbConfigTest extends BaseTest { /* test */ MariaDbConfig.execute(DATABASE_1_PRIVILEGED_DTO, "SELECT SLEEP(8);"); // -2 + assertTrue(true); } @Test diff --git a/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/endpoint/AccessEndpointUnitTest.java b/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/endpoint/AccessEndpointUnitTest.java index a634c2b45239f85fd528cdb697242743d01291ea..7d00f2888b5b7f4b5ae8011996f0e2f35ba2f492 100644 --- a/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/endpoint/AccessEndpointUnitTest.java +++ b/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/endpoint/AccessEndpointUnitTest.java @@ -8,12 +8,12 @@ import at.ac.tuwien.ifs.dbrepo.core.test.BaseTest; import at.ac.tuwien.ifs.dbrepo.endpoints.AccessEndpoint; import at.ac.tuwien.ifs.dbrepo.service.AccessService; import at.ac.tuwien.ifs.dbrepo.service.CacheService; -import lombok.extern.log4j.Log4j2; +import lombok.extern.slf4j.Slf4j; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.test.context.bean.override.mockito.MockitoBean; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.security.test.context.support.WithMockUser; @@ -24,7 +24,7 @@ import java.sql.SQLException; import static org.junit.jupiter.api.Assertions.*; import static org.mockito.Mockito.*; -@Log4j2 +@Slf4j @SpringBootTest @ExtendWith(SpringExtension.class) public class AccessEndpointUnitTest extends BaseTest { @@ -32,10 +32,10 @@ public class AccessEndpointUnitTest extends BaseTest { @Autowired private AccessEndpoint accessEndpoint; - @MockBean + @MockitoBean private CacheService credentialService; - @MockBean + @MockitoBean private AccessService accessService; @Test diff --git a/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/endpoint/DatabaseEndpointUnitTest.java b/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/endpoint/DatabaseEndpointUnitTest.java index 01a575b4609b4dd2a882f2bae6e40ba520229b74..c77423fd6a68095e28e3fc7e44339c81533ff966 100644 --- a/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/endpoint/DatabaseEndpointUnitTest.java +++ b/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/endpoint/DatabaseEndpointUnitTest.java @@ -10,15 +10,15 @@ import at.ac.tuwien.ifs.dbrepo.service.AccessService; import at.ac.tuwien.ifs.dbrepo.service.CacheService; import at.ac.tuwien.ifs.dbrepo.service.ContainerService; import at.ac.tuwien.ifs.dbrepo.service.DatabaseService; -import lombok.extern.log4j.Log4j2; +import lombok.extern.slf4j.Slf4j; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.security.test.context.support.WithMockUser; +import org.springframework.test.context.bean.override.mockito.MockitoBean; import org.springframework.test.context.junit.jupiter.SpringExtension; import java.sql.SQLException; @@ -29,7 +29,7 @@ import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.*; -@Log4j2 +@Slf4j @SpringBootTest @ExtendWith(SpringExtension.class) public class DatabaseEndpointUnitTest extends BaseTest { @@ -37,16 +37,16 @@ public class DatabaseEndpointUnitTest extends BaseTest { @Autowired private DatabaseEndpoint databaseEndpoint; - @MockBean + @MockitoBean private ContainerService containerService; - @MockBean + @MockitoBean private AccessService accessService; - @MockBean + @MockitoBean private DatabaseService databaseService; - @MockBean + @MockitoBean private CacheService credentialService; @Test diff --git a/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/endpoint/SubsetEndpointUnitTest.java b/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/endpoint/SubsetEndpointUnitTest.java index 023ed55471036fe464f8dea0cd300bb48d899f48..3a0db90a6d07146101a369c8e12a17aee36ef457 100644 --- a/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/endpoint/SubsetEndpointUnitTest.java +++ b/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/endpoint/SubsetEndpointUnitTest.java @@ -13,7 +13,7 @@ import at.ac.tuwien.ifs.dbrepo.service.DatabaseService; import at.ac.tuwien.ifs.dbrepo.service.StorageService; import at.ac.tuwien.ifs.dbrepo.service.SubsetService; import jakarta.servlet.http.HttpServletRequest; -import lombok.extern.log4j.Log4j2; +import lombok.extern.slf4j.Slf4j; import org.apache.spark.sql.Dataset; import org.apache.spark.sql.Row; import org.apache.spark.sql.SparkSession; @@ -21,11 +21,11 @@ import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.security.test.context.support.WithAnonymousUser; import org.springframework.security.test.context.support.WithMockUser; +import org.springframework.test.context.bean.override.mockito.MockitoBean; import org.springframework.test.context.junit.jupiter.SpringExtension; import java.security.Principal; @@ -38,7 +38,7 @@ import static org.junit.jupiter.api.Assertions.*; import static org.mockito.ArgumentMatchers.*; import static org.mockito.Mockito.*; -@Log4j2 +@Slf4j @SpringBootTest @ExtendWith(SpringExtension.class) public class SubsetEndpointUnitTest extends BaseTest { @@ -49,43 +49,47 @@ public class SubsetEndpointUnitTest extends BaseTest { @Autowired private SparkSession sparkSession; - @MockBean + @MockitoBean private SubsetService subsetService; - @MockBean + @MockitoBean private HttpServletRequest httpServletRequest; - @MockBean + @MockitoBean private StorageService storageService; - @MockBean + @MockitoBean private DatabaseService databaseService; - @MockBean + @MockitoBean private CacheService cacheService; - @MockBean + @MockitoBean private MetadataServiceGateway metadataServiceGateway; @Test @WithAnonymousUser public void list_publicDataPrivateSchemaAnonymous_succeeds() throws QueryNotFoundException, DatabaseNotFoundException, RemoteUnavailableException, SQLException, MetadataServiceException, - DatabaseUnavailableException, NotAllowedException { + DatabaseUnavailableException, NotAllowedException, UserNotFoundException { /* mock */ when(subsetService.findAll(DATABASE_3_PRIVILEGED_DTO, null)) .thenReturn(List.of(QUERY_3_DTO, QUERY_4_DTO, QUERY_5_DTO)); /* test */ - generic_list(DATABASE_3_ID, DATABASE_3_PRIVILEGED_DTO, null); + final List<QueryDto> response = generic_list(DATABASE_3_ID, DATABASE_3_PRIVILEGED_DTO, null); + assertEquals(3, response.size()); + assertEquals(QUERY_3_DTO, response.get(0)); + assertEquals(QUERY_4_DTO, response.get(1)); + assertEquals(QUERY_5_DTO, response.get(2)); } @Test @WithMockUser(username = USER_3_USERNAME) public void list_publicDataPrivateSchema_succeeds() throws DatabaseUnavailableException, NotAllowedException, QueryNotFoundException, DatabaseNotFoundException, RemoteUnavailableException, SQLException, - MetadataServiceException { + MetadataServiceException, UserNotFoundException { /* mock */ when(cacheService.getAccess(DATABASE_3_ID, USER_3_ID)) @@ -96,6 +100,12 @@ public class SubsetEndpointUnitTest extends BaseTest { /* test */ final List<QueryDto> response = generic_list(DATABASE_3_ID, DATABASE_3_PRIVILEGED_DTO, USER_3_PRINCIPAL); assertEquals(6, response.size()); + assertEquals(QUERY_1_DTO, response.get(0)); + assertEquals(QUERY_2_DTO, response.get(1)); + assertEquals(QUERY_3_DTO, response.get(2)); + assertEquals(QUERY_4_DTO, response.get(3)); + assertEquals(QUERY_5_DTO, response.get(4)); + assertEquals(QUERY_6_DTO, response.get(5)); } @Test @@ -111,7 +121,7 @@ public class SubsetEndpointUnitTest extends BaseTest { @Test @WithMockUser(username = USER_3_USERNAME) public void list_publicDataAndPrivateSchemaUnavailable_fails() throws SQLException, QueryNotFoundException, - DatabaseNotFoundException, RemoteUnavailableException, MetadataServiceException { + DatabaseNotFoundException, RemoteUnavailableException, MetadataServiceException, UserNotFoundException { /* mock */ when(cacheService.getDatabase(DATABASE_3_ID)) @@ -698,7 +708,7 @@ public class SubsetEndpointUnitTest extends BaseTest { protected List<QueryDto> generic_list(UUID databaseId, DatabaseDto database, Principal principal) throws NotAllowedException, DatabaseUnavailableException, QueryNotFoundException, DatabaseNotFoundException, - RemoteUnavailableException, MetadataServiceException { + RemoteUnavailableException, MetadataServiceException, UserNotFoundException { /* mock */ if (database != null) { diff --git a/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/endpoint/TableEndpointUnitTest.java b/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/endpoint/TableEndpointUnitTest.java index 8bfd1c527fc1d4ad772aa22460219b306a611492..f33cd9ee049915c1808117f4b3b3c0eeff6b9511 100644 --- a/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/endpoint/TableEndpointUnitTest.java +++ b/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/endpoint/TableEndpointUnitTest.java @@ -15,7 +15,7 @@ import at.ac.tuwien.ifs.dbrepo.service.DatabaseService; import at.ac.tuwien.ifs.dbrepo.service.SubsetService; import at.ac.tuwien.ifs.dbrepo.service.TableService; import jakarta.servlet.http.HttpServletRequest; -import lombok.extern.log4j.Log4j2; +import lombok.extern.slf4j.Slf4j; import org.apache.spark.sql.Dataset; import org.apache.spark.sql.Row; import org.apache.spark.sql.SparkSession; @@ -26,7 +26,7 @@ import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.MethodSource; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.test.context.bean.override.mockito.MockitoBean; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.security.access.AccessDeniedException; @@ -43,7 +43,7 @@ import java.util.stream.Stream; import static org.junit.jupiter.api.Assertions.*; import static org.mockito.Mockito.*; -@Log4j2 +@Slf4j @SpringBootTest @ExtendWith(SpringExtension.class) public class TableEndpointUnitTest extends BaseTest { @@ -54,22 +54,22 @@ public class TableEndpointUnitTest extends BaseTest { @Autowired private SparkSession sparkSession; - @MockBean + @MockitoBean private HttpServletRequest httpServletRequest; - @MockBean + @MockitoBean private TableService tableService; - @MockBean + @MockitoBean private SubsetService subsetService; - @MockBean + @MockitoBean private DatabaseService databaseService; - @MockBean + @MockitoBean private CacheService credentialService; - @MockBean + @MockitoBean private MetadataServiceGateway metadataServiceGateway; public static Stream<Arguments> size_arguments() { diff --git a/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/endpoint/ViewEndpointUnitTest.java b/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/endpoint/ViewEndpointUnitTest.java index 9e0b1c4454f3a6abd12af702d5658b5b6bec9802..9ce9d1aded8056dd53f26f644bc4195084361513 100644 --- a/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/endpoint/ViewEndpointUnitTest.java +++ b/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/endpoint/ViewEndpointUnitTest.java @@ -10,7 +10,7 @@ import at.ac.tuwien.ifs.dbrepo.service.DatabaseService; import at.ac.tuwien.ifs.dbrepo.service.SubsetService; import at.ac.tuwien.ifs.dbrepo.service.ViewService; import jakarta.servlet.http.HttpServletRequest; -import lombok.extern.log4j.Log4j2; +import lombok.extern.slf4j.Slf4j; import org.apache.spark.sql.Dataset; import org.apache.spark.sql.Row; import org.apache.spark.sql.SparkSession; @@ -18,7 +18,7 @@ import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.test.context.bean.override.mockito.MockitoBean; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.security.test.context.support.WithAnonymousUser; @@ -33,24 +33,24 @@ import static org.junit.jupiter.api.Assertions.*; import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.Mockito.*; -@Log4j2 +@Slf4j @SpringBootTest @ExtendWith(SpringExtension.class) public class ViewEndpointUnitTest extends BaseTest { - @MockBean + @MockitoBean private ViewService viewService; - @MockBean + @MockitoBean private DatabaseService databaseService; - @MockBean + @MockitoBean private CacheService credentialService; - @MockBean + @MockitoBean private HttpServletRequest httpServletRequest; - @MockBean + @MockitoBean private SubsetService subsetService; @Autowired diff --git a/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/gateway/InterceptorUnitTest.java b/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/gateway/InterceptorUnitTest.java index b56888551b5da6ca4bb34cfb6f3bc96481ba3a04..e8e6925a66b0f36110c4ce345e2278b7f6665376 100644 --- a/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/gateway/InterceptorUnitTest.java +++ b/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/gateway/InterceptorUnitTest.java @@ -2,12 +2,12 @@ package at.ac.tuwien.ifs.dbrepo.gateway; import at.ac.tuwien.ifs.dbrepo.core.api.keycloak.TokenDto; import at.ac.tuwien.ifs.dbrepo.core.test.BaseTest; -import lombok.extern.log4j.Log4j2; +import lombok.extern.slf4j.Slf4j; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.test.context.bean.override.mockito.MockitoBean; import org.springframework.http.HttpEntity; import org.springframework.http.HttpMethod; import org.springframework.http.ResponseEntity; @@ -17,12 +17,12 @@ import org.springframework.web.client.RestTemplate; import static org.mockito.ArgumentMatchers.*; import static org.mockito.Mockito.when; -@Log4j2 +@Slf4j @SpringBootTest @ExtendWith(SpringExtension.class) public class InterceptorUnitTest extends BaseTest { - @MockBean + @MockitoBean @Qualifier("keycloakRestTemplate") private RestTemplate restTemplate; diff --git a/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/gateway/MetadataServiceGatewayUnitTest.java b/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/gateway/MetadataServiceGatewayUnitTest.java index 60860315edd4f23aea7dc43fc6960a628c2ef996..d9b2af28e96e8800e4ec3e6ef16dd692ac73d927 100644 --- a/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/gateway/MetadataServiceGatewayUnitTest.java +++ b/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/gateway/MetadataServiceGatewayUnitTest.java @@ -9,13 +9,13 @@ import at.ac.tuwien.ifs.dbrepo.core.api.identifier.IdentifierBriefDto; import at.ac.tuwien.ifs.dbrepo.core.api.user.UserDto; import at.ac.tuwien.ifs.dbrepo.core.exception.*; import at.ac.tuwien.ifs.dbrepo.core.test.BaseTest; -import lombok.extern.log4j.Log4j2; +import lombok.extern.slf4j.Slf4j; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.test.context.bean.override.mockito.MockitoBean; import org.springframework.http.*; import org.springframework.test.context.junit.jupiter.SpringExtension; import org.springframework.web.client.HttpClientErrorException; @@ -30,12 +30,12 @@ import static org.mockito.ArgumentMatchers.*; import static org.mockito.Mockito.doThrow; import static org.mockito.Mockito.when; -@Log4j2 +@Slf4j @SpringBootTest @ExtendWith(SpringExtension.class) public class MetadataServiceGatewayUnitTest extends BaseTest { - @MockBean + @MockitoBean @Qualifier("internalRestTemplate") private RestTemplate internalRestTemplate; diff --git a/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/handlers/ApiExceptionHandlerTest.java b/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/handlers/ApiExceptionHandlerTest.java index ede6492560b8f0e76e3a329ef7561c6137d97cd7..46f308769e83755d7c4b15cc20e41c821b78042e 100644 --- a/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/handlers/ApiExceptionHandlerTest.java +++ b/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/handlers/ApiExceptionHandlerTest.java @@ -3,7 +3,7 @@ package at.ac.tuwien.ifs.dbrepo.handlers; import at.ac.tuwien.ifs.dbrepo.core.api.error.ApiErrorDto; import at.ac.tuwien.ifs.dbrepo.core.exception.*; import at.ac.tuwien.ifs.dbrepo.core.test.BaseTest; -import lombok.extern.log4j.Log4j2; +import lombok.extern.slf4j.Slf4j; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; @@ -26,7 +26,7 @@ import static at.ac.tuwien.ifs.dbrepo.core.test.utils.EndpointUtils.getException import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNotNull; -@Log4j2 +@Slf4j @ExtendWith(SpringExtension.class) @SpringBootTest public class ApiExceptionHandlerTest extends BaseTest { diff --git a/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/listener/DefaultListenerIntegrationTest.java b/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/listener/DefaultListenerIntegrationTest.java index dcb0af3d66d698f4db8eeffe6e7e13401848a9d5..3d4f432a0c7784b98c4ed72519e24e6a2b441b7e 100644 --- a/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/listener/DefaultListenerIntegrationTest.java +++ b/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/listener/DefaultListenerIntegrationTest.java @@ -8,14 +8,14 @@ import at.ac.tuwien.ifs.dbrepo.core.test.BaseTest; import at.ac.tuwien.ifs.dbrepo.config.MariaDbConfig; import at.ac.tuwien.ifs.dbrepo.config.MariaDbContainerConfig; import at.ac.tuwien.ifs.dbrepo.service.CacheService; -import lombok.extern.log4j.Log4j2; +import lombok.extern.slf4j.Slf4j; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.springframework.amqp.core.Message; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.test.context.bean.override.mockito.MockitoBean; import org.springframework.boot.test.system.CapturedOutput; import org.springframework.boot.test.system.OutputCaptureExtension; import org.springframework.test.annotation.DirtiesContext; @@ -32,7 +32,7 @@ import static at.ac.tuwien.ifs.dbrepo.utils.RabbitMqUtils.buildMessage; import static org.junit.jupiter.api.Assertions.assertTrue; import static org.mockito.Mockito.when; -@Log4j2 +@Slf4j @SpringBootTest @ExtendWith({SpringExtension.class, OutputCaptureExtension.class}) @Testcontainers @@ -40,7 +40,7 @@ import static org.mockito.Mockito.when; @DirtiesContext(classMode = DirtiesContext.ClassMode.BEFORE_EACH_TEST_METHOD) public class DefaultListenerIntegrationTest extends BaseTest { - @MockBean + @MockitoBean private CacheService credentialService; @Autowired diff --git a/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/listener/DefaultListenerUnitTest.java b/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/listener/DefaultListenerUnitTest.java index 8b0eedcebebf8a01ef8cd7a42ea916afd30ebf7a..80b01dc533fc65b57c9eeda64ddc5e2530df90aa 100644 --- a/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/listener/DefaultListenerUnitTest.java +++ b/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/listener/DefaultListenerUnitTest.java @@ -2,13 +2,13 @@ package at.ac.tuwien.ifs.dbrepo.listener; import at.ac.tuwien.ifs.dbrepo.config.MariaDbContainerConfig; import at.ac.tuwien.ifs.dbrepo.service.CacheService; -import lombok.extern.log4j.Log4j2; +import lombok.extern.slf4j.Slf4j; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.springframework.amqp.core.Message; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.test.context.bean.override.mockito.MockitoBean; import org.springframework.boot.test.system.CapturedOutput; import org.springframework.boot.test.system.OutputCaptureExtension; import org.springframework.test.context.junit.jupiter.SpringExtension; @@ -23,13 +23,13 @@ import static at.ac.tuwien.ifs.dbrepo.utils.RabbitMqUtils.buildMessage; import static org.junit.jupiter.api.Assertions.assertTrue; import static org.mockito.Mockito.doThrow; -@Log4j2 +@Slf4j @SpringBootTest @ExtendWith({SpringExtension.class, OutputCaptureExtension.class}) @Testcontainers public class DefaultListenerUnitTest { - @MockBean + @MockitoBean private CacheService credentialService; @Autowired diff --git a/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/mapper/MariaDbMapperUnitTest.java b/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/mapper/MariaDbMapperUnitTest.java index b85c3935ff93d56d6eae8b4b86356f18d3b33394..de154cbe6f7b1aa5faf44c56ab95cb1aadc3e7b2 100644 --- a/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/mapper/MariaDbMapperUnitTest.java +++ b/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/mapper/MariaDbMapperUnitTest.java @@ -1,7 +1,7 @@ package at.ac.tuwien.ifs.dbrepo.mapper; import at.ac.tuwien.ifs.dbrepo.core.test.BaseTest; -import lombok.extern.log4j.Log4j2; +import lombok.extern.slf4j.Slf4j; import org.junit.jupiter.api.extension.ExtendWith; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.Arguments; @@ -14,7 +14,7 @@ import java.util.stream.Stream; import static org.junit.jupiter.api.Assertions.assertEquals; -@Log4j2 +@Slf4j @SpringBootTest @ExtendWith(SpringExtension.class) public class MariaDbMapperUnitTest extends BaseTest { diff --git a/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/mvc/ActuatorEndpointMvcTest.java b/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/mvc/ActuatorEndpointMvcTest.java index 7d8c74437a1204dda49c7f18bdaba94ff668d01e..c17587d97fea435d79acd9ee67df5940840cc461 100644 --- a/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/mvc/ActuatorEndpointMvcTest.java +++ b/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/mvc/ActuatorEndpointMvcTest.java @@ -1,7 +1,7 @@ package at.ac.tuwien.ifs.dbrepo.mvc; import at.ac.tuwien.ifs.dbrepo.core.test.BaseTest; -import lombok.extern.log4j.Log4j2; +import lombok.extern.slf4j.Slf4j; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.springframework.beans.factory.annotation.Autowired; @@ -15,7 +15,7 @@ import static org.springframework.test.web.servlet.request.MockMvcRequestBuilder import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; -@Log4j2 +@Slf4j @ExtendWith(SpringExtension.class) @AutoConfigureMockMvc @SpringBootTest diff --git a/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/mvc/OpenApiEndpointMvcTest.java b/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/mvc/OpenApiEndpointMvcTest.java index 102b50fe745bbe265b9e63d7a41a23008050b2ef..2289ecf0668c23d57a29e58f5c65bb2d5c8a358a 100644 --- a/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/mvc/OpenApiEndpointMvcTest.java +++ b/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/mvc/OpenApiEndpointMvcTest.java @@ -6,7 +6,7 @@ import at.ac.tuwien.ifs.dbrepo.core.test.BaseTest; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.media.Content; import io.swagger.v3.oas.annotations.responses.ApiResponse; -import lombok.extern.log4j.Log4j2; +import lombok.extern.slf4j.Slf4j; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.springframework.beans.factory.annotation.Autowired; @@ -26,7 +26,7 @@ import static org.springframework.test.web.servlet.request.MockMvcRequestBuilder import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; -@Log4j2 +@Slf4j @ExtendWith(SpringExtension.class) @AutoConfigureMockMvc @SpringBootTest diff --git a/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/mvc/PrometheusEndpointMvcTest.java b/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/mvc/PrometheusEndpointMvcTest.java index 956e09e7d684ceb0dce1282a997f7c9dbf0641be..ad75aebf55d60918fad9a03c7e8262912f92d5ed 100644 --- a/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/mvc/PrometheusEndpointMvcTest.java +++ b/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/mvc/PrometheusEndpointMvcTest.java @@ -13,7 +13,7 @@ import at.ac.tuwien.ifs.dbrepo.listener.DefaultListener; import at.ac.tuwien.ifs.dbrepo.core.test.BaseTest; import io.micrometer.observation.tck.TestObservationRegistry; import jakarta.servlet.http.HttpServletRequest; -import lombok.extern.log4j.Log4j2; +import lombok.extern.slf4j.Slf4j; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.springframework.beans.factory.annotation.Autowired; @@ -36,7 +36,7 @@ import static org.springframework.test.web.servlet.request.MockMvcRequestBuilder import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; -@Log4j2 +@Slf4j @ExtendWith(SpringExtension.class) @AutoConfigureMockMvc @SpringBootTest diff --git a/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/mvc/SubsetEndpointMvcTest.java b/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/mvc/SubsetEndpointMvcTest.java index 593954df956fc4e599bba665355b01a405e0611e..122b168e83a6cbbec87d8a3b02129a1433cd26e4 100644 --- a/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/mvc/SubsetEndpointMvcTest.java +++ b/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/mvc/SubsetEndpointMvcTest.java @@ -3,14 +3,14 @@ package at.ac.tuwien.ifs.dbrepo.mvc; import at.ac.tuwien.ifs.dbrepo.gateway.MetadataServiceGateway; import at.ac.tuwien.ifs.dbrepo.service.SubsetService; import at.ac.tuwien.ifs.dbrepo.core.test.BaseTest; -import lombok.extern.log4j.Log4j2; +import lombok.extern.slf4j.Slf4j; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.actuate.observability.AutoConfigureObservability; import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.test.context.bean.override.mockito.MockitoBean; import org.springframework.http.MediaType; import org.springframework.test.context.junit.jupiter.SpringExtension; import org.springframework.test.web.servlet.MockMvc; @@ -20,17 +20,17 @@ import static org.springframework.test.web.servlet.request.MockMvcRequestBuilder import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; -@Log4j2 +@Slf4j @ExtendWith(SpringExtension.class) @AutoConfigureMockMvc @SpringBootTest @AutoConfigureObservability public class SubsetEndpointMvcTest extends BaseTest { - @MockBean + @MockitoBean private MetadataServiceGateway metadataServiceGateway; - @MockBean + @MockitoBean private SubsetService subsetService; @Autowired diff --git a/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/service/AccessServiceIntegrationTest.java b/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/service/AccessServiceIntegrationTest.java index 0834d8a34ce72be9e8dd2b22d8d49694fdf1d2ae..9e17d447dde57109fd35202bf302660be7b42386 100644 --- a/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/service/AccessServiceIntegrationTest.java +++ b/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/service/AccessServiceIntegrationTest.java @@ -5,7 +5,7 @@ import at.ac.tuwien.ifs.dbrepo.config.MariaDbConfig; import at.ac.tuwien.ifs.dbrepo.config.MariaDbContainerConfig; import at.ac.tuwien.ifs.dbrepo.core.exception.DatabaseMalformedException; import at.ac.tuwien.ifs.dbrepo.core.test.BaseTest; -import lombok.extern.log4j.Log4j2; +import lombok.extern.slf4j.Slf4j; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; @@ -22,7 +22,7 @@ import java.util.List; import static org.junit.jupiter.api.Assertions.*; -@Log4j2 +@Slf4j @SpringBootTest @ExtendWith(SpringExtension.class) @Testcontainers diff --git a/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/service/ContainerServiceIntegrationTest.java b/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/service/ContainerServiceIntegrationTest.java index 24f8be45f54d5ffc0a4e41f25e546fd8186e71e5..0e3d1a4d9a3e58c1e776d528022f046b2aa9f01b 100644 --- a/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/service/ContainerServiceIntegrationTest.java +++ b/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/service/ContainerServiceIntegrationTest.java @@ -6,7 +6,7 @@ import at.ac.tuwien.ifs.dbrepo.config.MariaDbContainerConfig; import at.ac.tuwien.ifs.dbrepo.core.exception.DatabaseMalformedException; import at.ac.tuwien.ifs.dbrepo.core.exception.QueryStoreCreateException; import at.ac.tuwien.ifs.dbrepo.core.test.BaseTest; -import lombok.extern.log4j.Log4j2; +import lombok.extern.slf4j.Slf4j; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -24,7 +24,7 @@ import java.util.Map; import static org.junit.jupiter.api.Assertions.*; -@Log4j2 +@Slf4j @SpringBootTest @ExtendWith(SpringExtension.class) @Testcontainers diff --git a/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/service/CredentialServiceUnitTest.java b/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/service/CredentialServiceUnitTest.java index febf388d59531bb4e8a831b43a81facf19a7eb01..d235ea05e09418bfd46545d02914f6276dfc06f1 100644 --- a/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/service/CredentialServiceUnitTest.java +++ b/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/service/CredentialServiceUnitTest.java @@ -10,13 +10,13 @@ import at.ac.tuwien.ifs.dbrepo.core.exception.*; import at.ac.tuwien.ifs.dbrepo.gateway.MetadataServiceGateway; import at.ac.tuwien.ifs.dbrepo.service.impl.CacheServiceImpl; import at.ac.tuwien.ifs.dbrepo.core.test.BaseTest; -import lombok.extern.log4j.Log4j2; +import lombok.extern.slf4j.Slf4j; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.test.context.bean.override.mockito.MockitoBean; import org.springframework.test.context.junit.jupiter.SpringExtension; import java.sql.SQLException; @@ -24,7 +24,7 @@ import java.sql.SQLException; import static org.junit.jupiter.api.Assertions.*; import static org.mockito.Mockito.when; -@Log4j2 +@Slf4j @SpringBootTest @ExtendWith(SpringExtension.class) public class CredentialServiceUnitTest extends BaseTest { @@ -32,7 +32,7 @@ public class CredentialServiceUnitTest extends BaseTest { @Autowired private CacheServiceImpl credentialService; - @MockBean + @MockitoBean private MetadataServiceGateway metadataServiceGateway; @BeforeEach diff --git a/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/service/DatabaseServiceIntegrationTest.java b/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/service/DatabaseServiceIntegrationTest.java index db1b29a29e5a4c720969c35b7778c29df347ccfc..493a2430b863b962e10b6a64737dbeee459f696f 100644 --- a/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/service/DatabaseServiceIntegrationTest.java +++ b/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/service/DatabaseServiceIntegrationTest.java @@ -20,7 +20,7 @@ import at.ac.tuwien.ifs.dbrepo.config.MariaDbConfig; import at.ac.tuwien.ifs.dbrepo.config.MariaDbContainerConfig; import at.ac.tuwien.ifs.dbrepo.core.exception.*; import at.ac.tuwien.ifs.dbrepo.core.test.BaseTest; -import lombok.extern.log4j.Log4j2; +import lombok.extern.slf4j.Slf4j; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.BeforeEach; @@ -41,7 +41,7 @@ import java.util.UUID; import static org.junit.jupiter.api.Assertions.*; -@Log4j2 +@Slf4j @SpringBootTest @ExtendWith(SpringExtension.class) @Testcontainers diff --git a/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/service/QueueServiceIntegrationTest.java b/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/service/QueueServiceIntegrationTest.java index 99e3f77f807c1d5c09c1f58773d31724006c42ee..8a839e189813a3a3b31208849b4322620a293266 100644 --- a/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/service/QueueServiceIntegrationTest.java +++ b/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/service/QueueServiceIntegrationTest.java @@ -9,14 +9,14 @@ import at.ac.tuwien.ifs.dbrepo.core.exception.TableNotFoundException; import at.ac.tuwien.ifs.dbrepo.gateway.MetadataServiceGateway; import at.ac.tuwien.ifs.dbrepo.service.impl.QueueServiceRabbitMqImpl; import at.ac.tuwien.ifs.dbrepo.core.test.BaseTest; -import lombok.extern.log4j.Log4j2; +import lombok.extern.slf4j.Slf4j; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.test.context.bean.override.mockito.MockitoBean; import org.springframework.test.context.junit.jupiter.SpringExtension; import org.testcontainers.containers.MariaDBContainer; import org.testcontainers.junit.jupiter.Container; @@ -28,7 +28,7 @@ import java.util.Map; import static org.mockito.Mockito.when; -@Log4j2 +@Slf4j @SpringBootTest @ExtendWith(SpringExtension.class) @Testcontainers @@ -37,7 +37,7 @@ public class QueueServiceIntegrationTest extends BaseTest { @Autowired private QueueServiceRabbitMqImpl queueService; - @MockBean + @MockitoBean private MetadataServiceGateway metadataServiceGateway; @Container diff --git a/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/service/StorageServiceIntegrationTest.java b/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/service/StorageServiceIntegrationTest.java index 4f1c6efe40329961c213a463c1aa2fccb2168a33..b60809d418bc413940b3be075557238dfb40d28b 100644 --- a/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/service/StorageServiceIntegrationTest.java +++ b/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/service/StorageServiceIntegrationTest.java @@ -7,7 +7,7 @@ import at.ac.tuwien.ifs.dbrepo.core.exception.StorageNotFoundException; import at.ac.tuwien.ifs.dbrepo.core.exception.StorageUnavailableException; import at.ac.tuwien.ifs.dbrepo.core.exception.TableMalformedException; import at.ac.tuwien.ifs.dbrepo.core.test.BaseTest; -import lombok.extern.log4j.Log4j2; +import lombok.extern.slf4j.Slf4j; import org.apache.commons.io.FileUtils; import org.apache.spark.sql.Dataset; import org.apache.spark.sql.Row; @@ -44,7 +44,7 @@ import java.util.stream.Stream; import static org.junit.jupiter.api.Assertions.*; -@Log4j2 +@Slf4j @SpringBootTest @ExtendWith(SpringExtension.class) @Testcontainers @@ -166,21 +166,6 @@ public class StorageServiceIntegrationTest extends BaseTest { }); } - @Test - public void getResource_succeeds() throws StorageUnavailableException, StorageNotFoundException { - - /* mock */ - s3Client.putObject(PutObjectRequest.builder() - .key("s3key") - .bucket(s3Config.getS3Bucket()) - .build(), RequestBody.fromFile(new File("src/test/resources/csv/weather_aus.csv"))); - - /* test */ - final ExportResourceDto response = storageService.getResource(s3Config.getS3Bucket(), "s3key"); - assertEquals("s3key", response.getFilename()); - assertNotNull(response.getResource()); - } - @Test public void getResource_notFound_fails() { diff --git a/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/service/SubsetServiceIntegrationTest.java b/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/service/SubsetServiceIntegrationTest.java index abc992bf4bdb96233004f20e0bab866f5e2776aa..58fe62bae6981fd398ab746ec5a0f014c6782007 100644 --- a/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/service/SubsetServiceIntegrationTest.java +++ b/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/service/SubsetServiceIntegrationTest.java @@ -7,7 +7,7 @@ import at.ac.tuwien.ifs.dbrepo.config.MariaDbContainerConfig; import at.ac.tuwien.ifs.dbrepo.core.exception.*; import at.ac.tuwien.ifs.dbrepo.gateway.MetadataServiceGateway; import at.ac.tuwien.ifs.dbrepo.core.test.BaseTest; -import lombok.extern.log4j.Log4j2; +import lombok.extern.slf4j.Slf4j; import org.apache.spark.sql.Dataset; import org.apache.spark.sql.Row; import org.junit.jupiter.api.BeforeEach; @@ -18,7 +18,7 @@ import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.MethodSource; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.test.context.bean.override.mockito.MockitoBean; import org.springframework.test.context.junit.jupiter.SpringExtension; import org.testcontainers.containers.MariaDBContainer; import org.testcontainers.junit.jupiter.Container; @@ -35,7 +35,7 @@ import java.util.stream.Stream; import static org.junit.jupiter.api.Assertions.*; import static org.mockito.Mockito.when; -@Log4j2 +@Slf4j @SpringBootTest @ExtendWith(SpringExtension.class) @Testcontainers @@ -44,7 +44,7 @@ public class SubsetServiceIntegrationTest extends BaseTest { @Autowired private SubsetService subsetService; - @MockBean + @MockitoBean private MetadataServiceGateway metadataServiceGateway; public static Stream<Arguments> create_arguments() { @@ -66,8 +66,9 @@ public class SubsetServiceIntegrationTest extends BaseTest { } @Test - public void findAll_succeeds() throws SQLException, QueryNotFoundException, RemoteUnavailableException, - MetadataServiceException, DatabaseNotFoundException, InterruptedException { + public void findAll_succeeds() throws SQLException, QueryNotFoundException, + RemoteUnavailableException, MetadataServiceException, DatabaseNotFoundException, InterruptedException, + UserNotFoundException { /* test */ final List<QueryDto> response = findAll_generic(null); @@ -77,8 +78,9 @@ public class SubsetServiceIntegrationTest extends BaseTest { } @Test - public void findAll_onlyPersisted_succeeds() throws SQLException, QueryNotFoundException, - RemoteUnavailableException, MetadataServiceException, DatabaseNotFoundException, InterruptedException { + public void findAll_onlyPersisted_succeeds() throws SQLException, QueryNotFoundException, + RemoteUnavailableException, MetadataServiceException, DatabaseNotFoundException, InterruptedException, + UserNotFoundException { /* test */ final List<QueryDto> response = findAll_generic(true); @@ -88,7 +90,8 @@ public class SubsetServiceIntegrationTest extends BaseTest { @Test public void findAll_onlyNonPersisted_succeeds() throws SQLException, QueryNotFoundException, - RemoteUnavailableException, MetadataServiceException, DatabaseNotFoundException, InterruptedException { + RemoteUnavailableException, MetadataServiceException, DatabaseNotFoundException, InterruptedException, + UserNotFoundException { /* test */ final List<QueryDto> response = findAll_generic(false); @@ -303,7 +306,7 @@ public class SubsetServiceIntegrationTest extends BaseTest { protected List<QueryDto> findAll_generic(Boolean filterPersisted) throws SQLException, QueryNotFoundException, RemoteUnavailableException, MetadataServiceException, DatabaseNotFoundException, - InterruptedException { + InterruptedException, UserNotFoundException { /* pre-condition */ Thread.sleep(1000) /* wait for test container some more */; diff --git a/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/service/TableServiceIntegrationTest.java b/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/service/TableServiceIntegrationTest.java index 8029dc3081fdb0187decf6028f18a5214448af0b..977aaafec9d5572a3bf3887adf9f36a785bf636d 100644 --- a/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/service/TableServiceIntegrationTest.java +++ b/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/service/TableServiceIntegrationTest.java @@ -9,7 +9,7 @@ import at.ac.tuwien.ifs.dbrepo.config.S3Config; import at.ac.tuwien.ifs.dbrepo.core.exception.*; import at.ac.tuwien.ifs.dbrepo.core.test.BaseTest; import com.google.common.io.Files; -import lombok.extern.log4j.Log4j2; +import lombok.extern.slf4j.Slf4j; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Disabled; @@ -41,7 +41,7 @@ import java.util.Set; import static org.junit.jupiter.api.Assertions.*; -@Log4j2 +@Slf4j @SpringBootTest @ExtendWith(SpringExtension.class) @Testcontainers diff --git a/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/service/ViewServiceIntegrationTest.java b/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/service/ViewServiceIntegrationTest.java index 55776ac7118544b10e7c090f8805dfc853d8cf89..8053b24ed6ded12279d23c8a0f0acc8116eee3d4 100644 --- a/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/service/ViewServiceIntegrationTest.java +++ b/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/service/ViewServiceIntegrationTest.java @@ -4,7 +4,7 @@ import at.ac.tuwien.ifs.dbrepo.config.MariaDbConfig; import at.ac.tuwien.ifs.dbrepo.config.MariaDbContainerConfig; import at.ac.tuwien.ifs.dbrepo.core.exception.ViewMalformedException; import at.ac.tuwien.ifs.dbrepo.core.test.BaseTest; -import lombok.extern.log4j.Log4j2; +import lombok.extern.slf4j.Slf4j; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; @@ -17,7 +17,7 @@ import org.testcontainers.junit.jupiter.Testcontainers; import java.sql.SQLException; -@Log4j2 +@Slf4j @SpringBootTest @ExtendWith(SpringExtension.class) @Testcontainers diff --git a/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/validation/EndpointValidatorUnitTest.java b/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/validation/EndpointValidatorUnitTest.java index f63c7618bc3b3583a8e69dfcd7cc8b5f01387185..759e9e34ab723316fa1b002c2258df7ed4e7a27d 100644 --- a/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/validation/EndpointValidatorUnitTest.java +++ b/dbrepo-data-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/validation/EndpointValidatorUnitTest.java @@ -2,7 +2,7 @@ package at.ac.tuwien.ifs.dbrepo.validation; import at.ac.tuwien.ifs.dbrepo.core.exception.PaginationException; import at.ac.tuwien.ifs.dbrepo.core.test.BaseTest; -import lombok.extern.log4j.Log4j2; +import lombok.extern.slf4j.Slf4j; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.springframework.beans.factory.annotation.Autowired; @@ -13,7 +13,7 @@ import org.springframework.test.context.junit.jupiter.SpringExtension; import static org.junit.jupiter.api.Assertions.assertThrows; -@Log4j2 +@Slf4j @ExtendWith(SpringExtension.class) @AutoConfigureMockMvc @SpringBootTest diff --git a/dbrepo-data-service/services/pom.xml b/dbrepo-data-service/services/pom.xml index c423837f3747f6b6ca34963e19883995a02ddcaa..3388d031acae457da0a0d434112f4baf6afb8da3 100644 --- a/dbrepo-data-service/services/pom.xml +++ b/dbrepo-data-service/services/pom.xml @@ -6,18 +6,18 @@ <parent> <groupId>at.ac.tuwien.ifs.dbrepo</groupId> <artifactId>data-service</artifactId> - <version>1.8.1</version> + <version>1.9.0</version> </parent> <name>services</name> <artifactId>services</artifactId> - <version>1.8.1</version> + <version>1.9.0</version> <dependencies> <dependency> <groupId>at.ac.tuwien.ifs.dbrepo</groupId> <artifactId>querystore</artifactId> - <version>1.8.1</version> + <version>1.9.0</version> </dependency> </dependencies> @@ -47,4 +47,4 @@ </plugins> </build> -</project> \ No newline at end of file +</project> diff --git a/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/auth/AuthTokenFilter.java b/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/auth/AuthTokenFilter.java index 1e748a391b887c52769dabfdf74eef5a992ac4fc..9f85478588dace37214902a02810f2756cf92da4 100644 --- a/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/auth/AuthTokenFilter.java +++ b/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/auth/AuthTokenFilter.java @@ -11,7 +11,7 @@ import jakarta.servlet.FilterChain; import jakarta.servlet.ServletException; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; -import lombok.extern.log4j.Log4j2; +import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Value; import org.springframework.security.authentication.BadCredentialsException; import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; @@ -32,7 +32,7 @@ import java.util.Arrays; import java.util.Base64; import java.util.stream.Collectors; -@Log4j2 +@Slf4j public class AuthTokenFilter extends OncePerRequestFilter { @Value("${dbrepo.jwt.public_key}") diff --git a/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/auth/BasicAuthenticationProvider.java b/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/auth/BasicAuthenticationProvider.java index 5ab64107cd4dc80be7b16a8db0db4815372cc3fc..86debdbe920bc2eaa1d00b27234fdc5684d8242c 100644 --- a/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/auth/BasicAuthenticationProvider.java +++ b/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/auth/BasicAuthenticationProvider.java @@ -2,7 +2,7 @@ package at.ac.tuwien.ifs.dbrepo.auth; import at.ac.tuwien.ifs.dbrepo.core.api.keycloak.TokenDto; import at.ac.tuwien.ifs.dbrepo.service.CredentialService; -import lombok.extern.log4j.Log4j2; +import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.authentication.AuthenticationManager; import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; @@ -11,7 +11,7 @@ import org.springframework.security.core.AuthenticationException; import org.springframework.security.core.userdetails.UserDetails; import org.springframework.stereotype.Component; -@Log4j2 +@Slf4j @Component public class BasicAuthenticationProvider implements AuthenticationManager { diff --git a/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/auth/InternalRequestInterceptor.java b/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/auth/InternalRequestInterceptor.java index 09076f95b993b17f2b53112d96ceb8bd6c4a5dae..1436256554bb92a25f564f4c8e44549fa6b5bfb5 100644 --- a/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/auth/InternalRequestInterceptor.java +++ b/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/auth/InternalRequestInterceptor.java @@ -3,7 +3,7 @@ package at.ac.tuwien.ifs.dbrepo.auth; import at.ac.tuwien.ifs.dbrepo.core.api.keycloak.TokenDto; import at.ac.tuwien.ifs.dbrepo.config.GatewayConfig; import at.ac.tuwien.ifs.dbrepo.service.CredentialService; -import lombok.extern.log4j.Log4j2; +import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpRequest; @@ -15,7 +15,7 @@ import org.springframework.http.client.ClientHttpResponse; import java.io.IOException; import java.util.List; -@Log4j2 +@Slf4j public class InternalRequestInterceptor implements ClientHttpRequestInterceptor { private final CredentialService credentialService; diff --git a/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/config/GatewayConfig.java b/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/config/GatewayConfig.java index 12bd674a50388badc118535f9192609adf95d130..e4ec051092bc49d28556ed93cda8b2a14fac400a 100644 --- a/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/config/GatewayConfig.java +++ b/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/config/GatewayConfig.java @@ -3,7 +3,7 @@ package at.ac.tuwien.ifs.dbrepo.config; import at.ac.tuwien.ifs.dbrepo.auth.InternalRequestInterceptor; import at.ac.tuwien.ifs.dbrepo.service.CredentialService; import lombok.Getter; -import lombok.extern.log4j.Log4j2; +import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; @@ -11,7 +11,7 @@ import org.springframework.context.annotation.Configuration; import org.springframework.web.client.RestTemplate; import org.springframework.web.util.DefaultUriBuilderFactory; -@Log4j2 +@Slf4j @Getter @Configuration public class GatewayConfig { diff --git a/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/config/JacksonConfig.java b/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/config/JacksonConfig.java index 567d223eb31cedc2fb0445854e8da2509f212905..8ff2d5434e15532168491e1f5f466b041d475c9d 100644 --- a/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/config/JacksonConfig.java +++ b/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/config/JacksonConfig.java @@ -5,13 +5,13 @@ import com.fasterxml.jackson.databind.SerializationFeature; import com.fasterxml.jackson.datatype.hibernate6.Hibernate6Module; import com.fasterxml.jackson.datatype.jdk8.Jdk8Module; import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; -import lombok.extern.log4j.Log4j2; +import lombok.extern.slf4j.Slf4j; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import java.util.TimeZone; -@Log4j2 +@Slf4j @Configuration public class JacksonConfig { diff --git a/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/config/QueryConfig.java b/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/config/QueryConfig.java index eed47bdf467947c821b2c8ef0be0dfbd4fdbe385..59b58aef0226c3d3d44127d2c3f75f41a64129bb 100644 --- a/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/config/QueryConfig.java +++ b/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/config/QueryConfig.java @@ -1,7 +1,7 @@ package at.ac.tuwien.ifs.dbrepo.config; import lombok.Getter; -import lombok.extern.log4j.Log4j2; +import lombok.extern.slf4j.Slf4j; import org.jooq.DSLContext; import org.jooq.SQLDialect; import org.jooq.conf.Settings; @@ -12,7 +12,7 @@ import org.springframework.context.annotation.Configuration; import static org.jooq.impl.DSL.using; -@Log4j2 +@Slf4j @Getter @Configuration public class QueryConfig { diff --git a/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/config/RabbitConfig.java b/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/config/RabbitConfig.java index 347aca691a734badc1fc9eb9bce86bbc29758bed..7cf12d8adb27fdb8b1296761226a44f39de73834 100644 --- a/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/config/RabbitConfig.java +++ b/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/config/RabbitConfig.java @@ -2,7 +2,7 @@ package at.ac.tuwien.ifs.dbrepo.config; import at.ac.tuwien.ifs.dbrepo.listener.DefaultListener; import lombok.Getter; -import lombok.extern.log4j.Log4j2; +import lombok.extern.slf4j.Slf4j; import org.springframework.amqp.rabbit.connection.ConnectionFactory; import org.springframework.amqp.rabbit.core.RabbitTemplate; import org.springframework.amqp.rabbit.listener.SimpleMessageListenerContainer; @@ -12,7 +12,7 @@ import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Getter -@Log4j2 +@Slf4j @Configuration public class RabbitConfig { diff --git a/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/config/S3Config.java b/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/config/S3Config.java index e9d1aa41a966c9d907007d7228c6ac72e81f67b6..6202d2b2a85edf1a35b739fa45892fc364d2eb09 100644 --- a/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/config/S3Config.java +++ b/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/config/S3Config.java @@ -1,7 +1,7 @@ package at.ac.tuwien.ifs.dbrepo.config; import lombok.Getter; -import lombok.extern.log4j.Log4j2; +import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -13,7 +13,7 @@ import software.amazon.awssdk.services.s3.S3Client; import java.net.URI; -@Log4j2 +@Slf4j @Getter @Configuration public class S3Config { diff --git a/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/config/SparkConfig.java b/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/config/SparkConfig.java index fe9421f2d0746087375e5568f81258b20500a52b..12640fbc42c10211beecacde41708ce5fa718cbd 100644 --- a/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/config/SparkConfig.java +++ b/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/config/SparkConfig.java @@ -1,7 +1,7 @@ package at.ac.tuwien.ifs.dbrepo.config; import lombok.Getter; -import lombok.extern.log4j.Log4j2; +import lombok.extern.slf4j.Slf4j; import org.apache.spark.SparkConf; import org.apache.spark.sql.SparkSession; import org.springframework.beans.factory.annotation.Value; @@ -11,7 +11,7 @@ import org.springframework.context.annotation.Configuration; import java.util.LinkedHashMap; import java.util.Map; -@Log4j2 +@Slf4j @Getter @Configuration public class SparkConfig { diff --git a/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/gateway/impl/KeycloakGatewayImpl.java b/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/gateway/impl/KeycloakGatewayImpl.java index b5b623551137187b33b28e1157f6b6463229db0f..f7af25d5d40a949c61a211de502942dec8a89139 100644 --- a/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/gateway/impl/KeycloakGatewayImpl.java +++ b/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/gateway/impl/KeycloakGatewayImpl.java @@ -5,7 +5,7 @@ import at.ac.tuwien.ifs.dbrepo.gateway.KeycloakGateway; import at.ac.tuwien.ifs.dbrepo.core.api.keycloak.TokenDto; import at.ac.tuwien.ifs.dbrepo.mapper.DataMapper; import jakarta.ws.rs.NotAuthorizedException; -import lombok.extern.log4j.Log4j2; +import lombok.extern.slf4j.Slf4j; import org.keycloak.OAuth2Constants; import org.keycloak.admin.client.Keycloak; import org.keycloak.admin.client.KeycloakBuilder; @@ -13,7 +13,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.authentication.BadCredentialsException; import org.springframework.stereotype.Service; -@Log4j2 +@Slf4j @Service public class KeycloakGatewayImpl implements KeycloakGateway { diff --git a/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/gateway/impl/MetadataServiceGatewayImpl.java b/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/gateway/impl/MetadataServiceGatewayImpl.java index 16e89cfc1a40f01889b23d616db4130d6a4ddd5a..bb5f4120d5d1e28f1a9a55f4518c3625ba59b1af 100644 --- a/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/gateway/impl/MetadataServiceGatewayImpl.java +++ b/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/gateway/impl/MetadataServiceGatewayImpl.java @@ -13,7 +13,7 @@ import at.ac.tuwien.ifs.dbrepo.config.GatewayConfig; import at.ac.tuwien.ifs.dbrepo.gateway.MetadataServiceGateway; import at.ac.tuwien.ifs.dbrepo.mapper.DataMapper; import jakarta.validation.constraints.NotNull; -import lombok.extern.log4j.Log4j2; +import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.http.*; @@ -28,20 +28,21 @@ import java.time.Instant; import java.util.List; import java.util.UUID; -@Log4j2 +@Slf4j @Service public class MetadataServiceGatewayImpl implements MetadataServiceGateway { private final DataMapper dataMapper; - private final GatewayConfig gatewayConfig; private final RestTemplate internalRestTemplate; + private final GatewayConfig gatewayConfig; @Autowired - public MetadataServiceGatewayImpl(DataMapper dataMapper, GatewayConfig gatewayConfig, - @Qualifier("internalRestTemplate") RestTemplate internalRestTemplate) { + public MetadataServiceGatewayImpl(DataMapper dataMapper, + @Qualifier("internalRestTemplate") RestTemplate internalRestTemplate, + GatewayConfig gatewayConfig) { this.dataMapper = dataMapper; - this.gatewayConfig = gatewayConfig; this.internalRestTemplate = internalRestTemplate; + this.gatewayConfig = gatewayConfig; } @Override diff --git a/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/listener/DefaultListener.java b/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/listener/DefaultListener.java index 436cadc3d3e63680b0953cf3633a54b60faa33b4..98ae26e4b6f3398baf934914ca251ea29760980f 100644 --- a/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/listener/DefaultListener.java +++ b/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/listener/DefaultListener.java @@ -12,7 +12,7 @@ import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; import io.micrometer.observation.annotation.Observed; import io.swagger.v3.oas.annotations.Operation; -import lombok.extern.log4j.Log4j2; +import lombok.extern.slf4j.Slf4j; import org.springframework.amqp.core.Message; import org.springframework.amqp.core.MessageListener; import org.springframework.amqp.core.MessageProperties; @@ -25,7 +25,7 @@ import java.util.HashMap; import java.util.Map; import java.util.UUID; -@Log4j2 +@Slf4j @Component public class DefaultListener implements MessageListener { diff --git a/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/mapper/DataMapper.java b/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/mapper/DataMapper.java index ddf7f9a882ab9b460f101b09a4a83b7c3b41e410..641136652d639561ac76e2f7b0779f747dbbd36f 100644 --- a/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/mapper/DataMapper.java +++ b/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/mapper/DataMapper.java @@ -1,10 +1,7 @@ package at.ac.tuwien.ifs.dbrepo.mapper; import at.ac.tuwien.ifs.dbrepo.core.api.container.ContainerDto; -import at.ac.tuwien.ifs.dbrepo.core.api.database.DatabaseBriefDto; -import at.ac.tuwien.ifs.dbrepo.core.api.database.DatabaseDto; -import at.ac.tuwien.ifs.dbrepo.core.api.database.ViewColumnDto; -import at.ac.tuwien.ifs.dbrepo.core.api.database.ViewDto; +import at.ac.tuwien.ifs.dbrepo.core.api.database.*; import at.ac.tuwien.ifs.dbrepo.core.api.database.internal.CreateDatabaseDto; import at.ac.tuwien.ifs.dbrepo.core.api.database.query.QueryDto; import at.ac.tuwien.ifs.dbrepo.core.api.database.table.*; @@ -257,6 +254,7 @@ public interface DataMapper { final QueryDto subset = QueryDto.builder() .id(UUID.fromString(data.getString(1))) .query(data.getString(4)) + .queryNormalized(data.getString(4)) .queryHash(data.getString(5)) .resultHash(data.getString(6)) .resultNumber(data.getLong(7)) diff --git a/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/mapper/MariaDbMapper.java b/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/mapper/MariaDbMapper.java index 21707c0b6d35c57c688c27e4434b02123fab3e40..bdbc1528661318d353659e2e485b57dacc5b019f 100644 --- a/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/mapper/MariaDbMapper.java +++ b/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/mapper/MariaDbMapper.java @@ -501,6 +501,16 @@ public interface MariaDbMapper { return statement.toString(); } + default String copyTableSchemaToRawQuery(String from, String to) { + final StringBuilder statement = new StringBuilder("CREATE TABLE `") + .append(to) + .append("` LIKE `") + .append(from) + .append("`;"); + log.trace("mapped copy table schema statement: {}", statement); + return statement.toString(); + } + default String temporaryTableToRawMergeQuery(String tmp, String table, List<String> columns) { final StringBuilder statement = new StringBuilder("INSERT INTO `") .append(table) diff --git a/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/StorageService.java b/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/StorageService.java index 19540194abbb08be71fe741e5d0b9586ec992e47..3fe18cced81857fbf6c26a39b3abc9b02896676a 100644 --- a/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/StorageService.java +++ b/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/StorageService.java @@ -13,7 +13,7 @@ import java.util.List; public interface StorageService { - String putObject(byte[] content); + void putObject(String key, byte[] content); /** * Loads an object of a bucket from the Storage Service into an input stream. @@ -47,29 +47,7 @@ public interface StorageService { */ byte[] getBytes(String bucket, String key) throws StorageUnavailableException, StorageNotFoundException; - void deleteObject(String bucket, String key); - - /** - * Loads an object of the default export bucket from the Storage Service into an export resource. - * - * @param key The object key. - * @return The export resource, if successful. - * @throws StorageUnavailableException The object failed to be loaded from the Storage Service. - * @throws StorageNotFoundException The key was not found in the Storage Service. - */ - ExportResourceDto getResource(String key) throws StorageUnavailableException, StorageNotFoundException; - - /** - * Loads an object of a bucket from the Storage Service into an export resource. - * - * @param bucket The bucket name. - * @param key The object key. - * @return The export resource, if successful. - * @throws StorageUnavailableException The object failed to be loaded from the Storage Service. - * @throws StorageNotFoundException The key was not found in the Storage Service. - */ - ExportResourceDto getResource(String bucket, String key) throws StorageUnavailableException, - StorageNotFoundException; + void deleteObject(String key); /** * Transforms the given dataset into a downloadable dataset. diff --git a/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/SubsetService.java b/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/SubsetService.java index eb341c95eb13ddd824f5ec177dd273094e4f47fc..a7ee9b1ca08d2c3389efad0d07f9959bfaa5fb7c 100644 --- a/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/SubsetService.java +++ b/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/SubsetService.java @@ -63,7 +63,7 @@ public interface SubsetService { * @throws MetadataServiceException The Metadata Service responded unexpected. */ List<QueryDto> findAll(DatabaseDto database, Boolean filterPersisted) throws SQLException, - QueryNotFoundException, RemoteUnavailableException, DatabaseNotFoundException, MetadataServiceException; + QueryNotFoundException, RemoteUnavailableException, DatabaseNotFoundException, MetadataServiceException, UserNotFoundException; /** * Executes a subset query without saving it. diff --git a/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/AccessServiceMariaDbImpl.java b/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/AccessServiceMariaDbImpl.java index 7e02560b78df6a481014433adde1b8952e7286af..8a6d79de51c222cbf78e64e0045a91245ce339b6 100644 --- a/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/AccessServiceMariaDbImpl.java +++ b/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/AccessServiceMariaDbImpl.java @@ -7,7 +7,7 @@ import at.ac.tuwien.ifs.dbrepo.core.exception.DatabaseMalformedException; import at.ac.tuwien.ifs.dbrepo.mapper.MariaDbMapper; import at.ac.tuwien.ifs.dbrepo.service.AccessService; import com.mchange.v2.c3p0.ComboPooledDataSource; -import lombok.extern.log4j.Log4j2; +import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; @@ -15,7 +15,7 @@ import org.springframework.stereotype.Service; import java.sql.Connection; import java.sql.SQLException; -@Log4j2 +@Slf4j @Service public class AccessServiceMariaDbImpl extends DataConnector implements AccessService { diff --git a/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/CacheServiceImpl.java b/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/CacheServiceImpl.java index 1ad95511304912d1b4304e0bcbd1d94e1a162b87..2178f89707949077bc9bbf254a408abd84e4e72b 100644 --- a/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/CacheServiceImpl.java +++ b/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/CacheServiceImpl.java @@ -12,7 +12,7 @@ import at.ac.tuwien.ifs.dbrepo.gateway.MetadataServiceGateway; import at.ac.tuwien.ifs.dbrepo.service.CacheService; import at.ac.tuwien.ifs.dbrepo.service.TableService; import com.github.benmanes.caffeine.cache.Cache; -import lombok.extern.log4j.Log4j2; +import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -20,7 +20,7 @@ import java.sql.SQLException; import java.time.Instant; import java.util.UUID; -@Log4j2 +@Slf4j @Service public class CacheServiceImpl implements CacheService { diff --git a/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/ContainerServiceMariaDbImpl.java b/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/ContainerServiceMariaDbImpl.java index 1860f488d342a1665770b792c91abddf44deed04..c58d9270e9096d6d7405fae7f3d0aff82ecde0c5 100644 --- a/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/ContainerServiceMariaDbImpl.java +++ b/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/ContainerServiceMariaDbImpl.java @@ -10,14 +10,15 @@ import at.ac.tuwien.ifs.dbrepo.config.RabbitConfig; import at.ac.tuwien.ifs.dbrepo.mapper.MariaDbMapper; import at.ac.tuwien.ifs.dbrepo.service.ContainerService; import com.mchange.v2.c3p0.ComboPooledDataSource; -import lombok.extern.log4j.Log4j2; +import lombok.extern.slf4j.Slf4j; +import org.apache.logging.log4j.message.MapMessage; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.sql.Connection; import java.sql.SQLException; -@Log4j2 +@Slf4j @Service public class ContainerServiceMariaDbImpl extends DataConnector implements ContainerService { diff --git a/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/CredentialServiceImpl.java b/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/CredentialServiceImpl.java index 9d708e28d87e963370920e2f1e2cdf2ea71049d1..d995073ccee6a757f8b9d697851214ecb5f899be 100644 --- a/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/CredentialServiceImpl.java +++ b/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/CredentialServiceImpl.java @@ -5,13 +5,13 @@ import at.ac.tuwien.ifs.dbrepo.core.api.keycloak.TokenDto; import at.ac.tuwien.ifs.dbrepo.gateway.KeycloakGateway; import at.ac.tuwien.ifs.dbrepo.service.CredentialService; import com.github.benmanes.caffeine.cache.Cache; -import lombok.extern.log4j.Log4j2; +import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.time.Instant; -@Log4j2 +@Slf4j @Service public class CredentialServiceImpl implements CredentialService { diff --git a/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/DataConnector.java b/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/DataConnector.java index 1100b0e7b98adf975e59c23e61ea4cd9e76ebf19..c1f97158f48a5a3ce408b86834fe4f6fbfb2f1db 100644 --- a/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/DataConnector.java +++ b/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/DataConnector.java @@ -3,14 +3,14 @@ package at.ac.tuwien.ifs.dbrepo.service.impl; import at.ac.tuwien.ifs.dbrepo.core.api.container.ContainerDto; import at.ac.tuwien.ifs.dbrepo.core.api.database.DatabaseDto; import com.mchange.v2.c3p0.ComboPooledDataSource; -import lombok.extern.log4j.Log4j2; +import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.SQLException; -@Log4j2 +@Slf4j @Service public abstract class DataConnector { @@ -26,8 +26,6 @@ public abstract class DataConnector { dataSource.setAcquireIncrement(5); dataSource.setMaxPoolSize(20); dataSource.setMaxStatements(100); - log.trace("mapped datasource, jdbcUrl={}, user={}, password={}", getJdbcUrl(container, databaseName), - container.getUsername(), container.getPassword()); return dataSource; } diff --git a/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/DatabaseServiceMariaDbImpl.java b/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/DatabaseServiceMariaDbImpl.java index 5db0fd57136161caf87c6038f201102aafc8c294..266ccf7f13d7bb309cb7520ce16eeb977bebfff9 100644 --- a/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/DatabaseServiceMariaDbImpl.java +++ b/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/DatabaseServiceMariaDbImpl.java @@ -12,7 +12,7 @@ import at.ac.tuwien.ifs.dbrepo.core.api.user.internal.UpdateUserPasswordDto; import at.ac.tuwien.ifs.dbrepo.core.exception.*; import com.google.common.hash.Hashing; import com.mchange.v2.c3p0.ComboPooledDataSource; -import lombok.extern.log4j.Log4j2; +import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -24,7 +24,7 @@ import java.sql.SQLException; import java.util.LinkedList; import java.util.List; -@Log4j2 +@Slf4j @Service public class DatabaseServiceMariaDbImpl extends DataConnector implements DatabaseService { diff --git a/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/QueueServiceRabbitMqImpl.java b/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/QueueServiceRabbitMqImpl.java index 190863696306b1942036a85cf9f7c95847e2f745..f6bd0287ae30921333d1842a90424ee526253163 100644 --- a/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/QueueServiceRabbitMqImpl.java +++ b/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/QueueServiceRabbitMqImpl.java @@ -6,7 +6,7 @@ import at.ac.tuwien.ifs.dbrepo.core.api.database.table.columns.ColumnDto; import at.ac.tuwien.ifs.dbrepo.mapper.DataMapper; import at.ac.tuwien.ifs.dbrepo.service.QueueService; import com.mchange.v2.c3p0.ComboPooledDataSource; -import lombok.extern.log4j.Log4j2; +import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -16,7 +16,7 @@ import java.sql.SQLException; import java.util.Map; import java.util.Optional; -@Log4j2 +@Slf4j @Service public class QueueServiceRabbitMqImpl extends DataConnector implements QueueService { diff --git a/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/StorageServiceS3Impl.java b/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/StorageServiceS3Impl.java index d29f5e2a2dc8c864402c4d0d66c4ab7de336461b..00fd26d190cc5e9281bbff6a55c7ca67b5057382 100644 --- a/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/StorageServiceS3Impl.java +++ b/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/StorageServiceS3Impl.java @@ -1,14 +1,13 @@ package at.ac.tuwien.ifs.dbrepo.service.impl; import at.ac.tuwien.ifs.dbrepo.config.S3Config; -import at.ac.tuwien.ifs.dbrepo.service.StorageService; import at.ac.tuwien.ifs.dbrepo.core.api.ExportResourceDto; import at.ac.tuwien.ifs.dbrepo.core.exception.MalformedException; import at.ac.tuwien.ifs.dbrepo.core.exception.StorageNotFoundException; import at.ac.tuwien.ifs.dbrepo.core.exception.StorageUnavailableException; import at.ac.tuwien.ifs.dbrepo.core.exception.TableMalformedException; -import lombok.extern.log4j.Log4j2; -import org.apache.commons.lang3.RandomStringUtils; +import at.ac.tuwien.ifs.dbrepo.service.StorageService; +import lombok.extern.slf4j.Slf4j; import org.apache.spark.sql.*; import org.apache.spark.sql.catalyst.ExtendedAnalysisException; import org.apache.spark.sql.types.StructField; @@ -28,7 +27,7 @@ import java.util.Map; import static scala.collection.JavaConverters.asScalaIteratorConverter; -@Log4j2 +@Slf4j @Service public class StorageServiceS3Impl implements StorageService { @@ -44,15 +43,12 @@ public class StorageServiceS3Impl implements StorageService { } @Override - public String putObject(byte[] content) { - final String key = "dbr_" + RandomStringUtils.randomAlphanumeric(96) - .toLowerCase(); + public void putObject(String key, byte[] content) { s3Client.putObject(PutObjectRequest.builder() .key(key) .bucket(s3Config.getS3Bucket()) .build(), RequestBody.fromBytes(content)); log.debug("put object in S3 bucket {} with key: {}", s3Config.getS3Bucket(), key); - return key; } @Override @@ -89,31 +85,20 @@ public class StorageServiceS3Impl implements StorageService { } @Override - public void deleteObject(String bucket, String key) { - log.trace("delete object with key {} from bucket: {}", key, bucket); + public void deleteObject(String key) { s3Client.deleteObject(DeleteObjectRequest.builder() - .bucket(bucket) + .bucket(s3Config.getS3Bucket()) .key(key) .build()); + log.atDebug() + .setMessage("deleted object " + key + " in bucket " + s3Config.getS3Bucket()) + .addKeyValue("key", key) + .addKeyValue("bucket", s3Config.getS3Bucket()) + .log(); } @Override - public ExportResourceDto getResource(String key) throws StorageNotFoundException, StorageUnavailableException { - return getResource(s3Config.getS3Bucket(), key); - } - - @Override - public ExportResourceDto getResource(String bucket, String key) throws StorageNotFoundException, - StorageUnavailableException { - final InputStreamResource resource = new InputStreamResource(getObject(bucket, key)); - log.trace("return export resource with filename: {}", key); - return ExportResourceDto.builder() - .resource(resource) - .filename(key) - .build(); - } - - @Override + // TODO should be export to S3 -> load from S3 public ExportResourceDto transformDataset(Dataset<Row> dataset) throws StorageUnavailableException { final List<Map<String, String>> inMemory = dataset.collectAsList() .stream() @@ -159,11 +144,14 @@ public class StorageServiceS3Impl implements StorageService { public Dataset<Row> loadDataset(List<String> columns, String key, String delimiter, Boolean withHeader) throws StorageNotFoundException, StorageUnavailableException, MalformedException, TableMalformedException { final String path = "s3a://" + s3Config.getS3Bucket() + "/" + key; - log.debug("read dataset from s3 path: {} using header: {}", path, withHeader); + log.atDebug() + .setMessage("read dataset " + key + " using header: " + withHeader) + .addKeyValue("s3_key", key) + .addKeyValue("s3_bucket", s3Config.getS3Bucket()) + .addKeyValue("header", withHeader) + .log(); Dataset<Row> dataset; try { - final String logDelimiter = delimiter.equals("\t") ? "[tab]" : delimiter; - log.trace("spark read conf: header={}, delimiter={}", withHeader, logDelimiter); dataset = sparkSession.read() .option("delimiter", delimiter) .option("header", withHeader) @@ -172,19 +160,34 @@ public class StorageServiceS3Impl implements StorageService { if (e instanceof AnalysisException) { final AnalysisException exception = (AnalysisException) e; if (exception.getSimpleMessage().contains("PATH_NOT_FOUND")) { - log.error("Failed to find dataset {} in storage service: {}", key, e.getMessage()); + log.atError() + .setMessage("Failed to find dataset " + key + " in storage service") + .addKeyValue("s3_key", key) + .setCause(e) + .log(); throw new StorageNotFoundException("Failed to find dataset in storage service: " + e.getMessage()); } if (exception.getSimpleMessage().contains("UNRESOLVED_COLUMN")) { - log.error("Failed to resolve column from dataset in database: {}", e.getMessage()); + log.atError() + .setMessage("Failed to resolve column from dataset in database") + .addKeyValue("s3_key", key) + .setCause(e) + .log(); throw new TableMalformedException("Failed to resolve column from dataset in database: " + e.getMessage()); } } - log.error("Failed to connect to storage service: {}", e.getMessage()); + log.atError() + .setMessage("Failed to connect to storage service") + .addKeyValue("s3_key", key) + .setCause(e) + .log(); throw new StorageUnavailableException("Failed to connect to storage service: " + e.getMessage()); } if (!withHeader) { - log.debug("no header provided: use table column names: {}", columns); + log.atDebug() + .setMessage("no header provided: use table column names") + .addKeyValue("columns", columns) + .log(); try { dataset = dataset.toDF(asScalaIteratorConverter(columns.iterator()) .asScala() @@ -203,15 +206,22 @@ public class StorageServiceS3Impl implements StorageService { final List<Column> columnOrder = columns.stream() .map(Column::new) .toList(); - log.trace("ordered columns: {}", columnOrder); try { return dataset.select(columnOrder.toArray(new Column[0])); } catch (Exception e) { if (e instanceof ExtendedAnalysisException exception) { - log.error("Failed to resolve column from dataset in database: {}", exception.getSimpleMessage()); + log.atError() + .setMessage("Failed to resolve column from dataset in database") + .addKeyValue("s3_key", key) + .setCause(e) + .log(); throw new TableMalformedException("Failed to resolve column from dataset in database: " + exception.getSimpleMessage()); } - log.error("Failed to select columns from dataset: {}", e.getMessage()); + log.atError() + .setMessage("Failed to select columns from dataset") + .addKeyValue("s3_key", key) + .setCause(e) + .log(); throw new MalformedException("Failed to select columns from dataset: " + e.getMessage()); } } diff --git a/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/SubsetServiceMariaDbImpl.java b/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/SubsetServiceMariaDbImpl.java index b8044175dc5abbed006093211e2b89335b90e316..738dfa96429c6ae7458dc04ea50cce629bedc79c 100644 --- a/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/SubsetServiceMariaDbImpl.java +++ b/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/SubsetServiceMariaDbImpl.java @@ -2,6 +2,7 @@ package at.ac.tuwien.ifs.dbrepo.service.impl; import at.ac.tuwien.ifs.dbrepo.core.api.database.DatabaseDto; import at.ac.tuwien.ifs.dbrepo.core.api.database.query.QueryDto; +import at.ac.tuwien.ifs.dbrepo.core.api.database.query.QueryTypeDto; import at.ac.tuwien.ifs.dbrepo.core.api.database.query.SubsetDto; import at.ac.tuwien.ifs.dbrepo.core.api.identifier.IdentifierBriefDto; import at.ac.tuwien.ifs.dbrepo.core.api.identifier.IdentifierTypeDto; @@ -11,7 +12,7 @@ import at.ac.tuwien.ifs.dbrepo.mapper.DataMapper; import at.ac.tuwien.ifs.dbrepo.mapper.MariaDbMapper; import at.ac.tuwien.ifs.dbrepo.service.SubsetService; import com.mchange.v2.c3p0.ComboPooledDataSource; -import lombok.extern.log4j.Log4j2; +import lombok.extern.slf4j.Slf4j; import org.apache.spark.sql.Dataset; import org.apache.spark.sql.Row; import org.apache.spark.sql.SparkSession; @@ -26,7 +27,7 @@ import java.util.LinkedList; import java.util.List; import java.util.UUID; -@Log4j2 +@Slf4j @Service public class SubsetServiceMariaDbImpl extends DataConnector implements SubsetService { @@ -59,7 +60,10 @@ public class SubsetServiceMariaDbImpl extends DataConnector implements SubsetSer } catch (Exception e) { if (e instanceof ExtendedAnalysisException && e.getMessage().contains("TABLE_OR_VIEW_NOT_FOUND") || e instanceof SQLSyntaxErrorException && e.getMessage().contains("doesn't exist")) { - log.error("Failed to find named reference: {}", e.getMessage()); + log.atError() + .setMessage("Failed to find named reference") + .setCause(e) + .log(); throw new TableNotFoundException("Failed to find named reference: " + e.getMessage()) /* remove throwable on purpose, clutters the output */; } log.error("Malformed query: {}", e.getMessage()); @@ -82,7 +86,7 @@ public class SubsetServiceMariaDbImpl extends DataConnector implements SubsetSer @Override public List<QueryDto> findAll(DatabaseDto database, Boolean filterPersisted) throws SQLException, - QueryNotFoundException, RemoteUnavailableException, DatabaseNotFoundException, MetadataServiceException { + QueryNotFoundException, RemoteUnavailableException, DatabaseNotFoundException, MetadataServiceException, UserNotFoundException { final List<IdentifierBriefDto> identifiers = metadataServiceGateway.getIdentifiers(database.getId(), null); final ComboPooledDataSource dataSource = getDataSource(database); final Connection connection = dataSource.getConnection(); @@ -102,6 +106,11 @@ public class SubsetServiceMariaDbImpl extends DataConnector implements SubsetSer .filter(i -> i.getType().equals(IdentifierTypeDto.SUBSET)) .filter(i -> i.getQueryId().equals(query.getId())) .toList()); + query.setOwner(dataMapper.userDtoToUserBriefDto(metadataServiceGateway.getUserById(query.getOwner() + .getId()))); + query.setType(QueryTypeDto.QUERY); + query.setDatabaseId(database.getId()); + queries.add(query); } log.info("Find {} queries", queries.size()); @@ -150,6 +159,7 @@ public class SubsetServiceMariaDbImpl extends DataConnector implements SubsetSer final QueryDto query = dataMapper.resultSetToQueryDto(resultSet); query.setOwner(dataMapper.userDtoToUserBriefDto(metadataServiceGateway.getUserById(query.getOwner() .getId()))); + query.setType(QueryTypeDto.QUERY); query.setDatabaseId(database.getId()); return query; } catch (SQLException e) { diff --git a/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/TableServiceMariaDbImpl.java b/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/TableServiceMariaDbImpl.java index 1ca0da14d8e87972dc58eedc1e139f1da8b62451..2dabbb28778f003f54120731d6dd30c0258bd275 100644 --- a/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/TableServiceMariaDbImpl.java +++ b/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/TableServiceMariaDbImpl.java @@ -14,8 +14,7 @@ import at.ac.tuwien.ifs.dbrepo.service.StorageService; import at.ac.tuwien.ifs.dbrepo.service.TableService; import at.ac.tuwien.ifs.dbrepo.utils.MariaDbUtil; import com.mchange.v2.c3p0.ComboPooledDataSource; -import lombok.extern.log4j.Log4j2; -import org.apache.spark.sql.AnalysisException; +import lombok.extern.slf4j.Slf4j; import org.apache.spark.sql.Dataset; import org.apache.spark.sql.Row; import org.apache.spark.sql.SaveMode; @@ -32,7 +31,7 @@ import java.util.Map; import java.util.Optional; import java.util.Properties; -@Log4j2 +@Slf4j @Service public class TableServiceMariaDbImpl extends DataConnector implements TableService { @@ -210,26 +209,35 @@ public class TableServiceMariaDbImpl extends DataConnector implements TableServi properties.setProperty("user", database.getContainer().getUsername()); properties.setProperty("password", database.getContainer().getPassword()); final String temporaryTable = table.getInternalName() + "_tmp"; + final ComboPooledDataSource dataSource = getDataSource(database); + final Connection connection = dataSource.getConnection(); + try { + /* import tuple */ + connection.prepareStatement(mariaDbMapper.copyTableSchemaToRawQuery(table.getInternalName(), temporaryTable)) + .execute(); + connection.commit(); + } catch (SQLException e) { + connection.rollback(); + log.atError() + .setMessage("Failed to import data from temporary table " + database.getInternalName() + "." + temporaryTable) + .setCause(e) + .log(); + throw new QueryMalformedException("Failed to import data: " + e.getMessage(), e); + } + log.debug("copied schema from target table {} to import table: {}", table.getInternalName(), temporaryTable); try { - log.trace("import dataset to temporary table: {}", temporaryTable); dataset.write() .mode(SaveMode.Overwrite) .option("header", data.getHeader()) - .option("inferSchema", "true") +// .option("inferSchema", "true") .jdbc(getSparkUrl(database), temporaryTable, properties); } catch (Exception e) { - if (e instanceof AnalysisException exception) { - final String message = exception.getSimpleMessage() - .replaceAll(" Some\\(.*", ""); - log.error("Failed to write dataset: schema malformed: {}", message); - throw new MalformedException("Failed to write dataset: schema malformed: " + message) /* remove throwable on purpose, clutters the output */; - } - log.error("Failed to write dataset: {}", e.getMessage()); - throw new MalformedException("Failed to write dataset: " + e.getMessage()) /* remove throwable on purpose, clutters the output */; + log.atError() + .setMessage("Failed to write dataset: schema malformed") + .setCause(e) + .log(); + throw new MalformedException("Failed to write dataset: schema malformed: " + e.getMessage()) /* remove throwable on purpose, clutters the output */; } - /* import .csv to database */ - final ComboPooledDataSource dataSource = getDataSource(database); - final Connection connection = dataSource.getConnection(); try { /* import tuple */ connection.prepareStatement(mariaDbMapper.temporaryTableToRawMergeQuery(temporaryTable, @@ -238,17 +246,26 @@ public class TableServiceMariaDbImpl extends DataConnector implements TableServi connection.commit(); } catch (SQLException e) { connection.rollback(); - log.error("Failed to import tuple: {}", e.getMessage()); + log.atError() + .setMessage("Failed to import data from temporary table " + database.getInternalName() + "." + temporaryTable) + .setCause(e) + .log(); throw new QueryMalformedException("Failed to import tuple: " + e.getMessage(), e); } finally { /* delete temporary table */ connection.prepareStatement(mariaDbMapper.dropTableRawQuery(database.getInternalName(), temporaryTable, false)) .execute(); + log.debug("deleted temporary table: {}", temporaryTable); connection.commit(); dataSource.close(); } - log.info("Imported dataset into table: {}.{}", database, table.getInternalName()); + storageService.deleteObject(data.getLocation()); + log.atInfo() + .setMessage("Imported dataset into table " + database.getInternalName() + "." + table.getInternalName()) + .addKeyValue("s3_key", data.getLocation()) + .addKeyValue("table_name", database.getInternalName() + "." + table.getInternalName()) + .log(); } @Override diff --git a/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/ViewServiceMariaDbImpl.java b/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/ViewServiceMariaDbImpl.java index 5b8f2017aaaa13c02cad9252bed36d8686abec04..589b7eda06f36c6204225da610e369298bff42e5 100644 --- a/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/ViewServiceMariaDbImpl.java +++ b/dbrepo-data-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/ViewServiceMariaDbImpl.java @@ -7,7 +7,7 @@ import at.ac.tuwien.ifs.dbrepo.core.exception.ViewMalformedException; import at.ac.tuwien.ifs.dbrepo.mapper.MariaDbMapper; import at.ac.tuwien.ifs.dbrepo.service.ViewService; import com.mchange.v2.c3p0.ComboPooledDataSource; -import lombok.extern.log4j.Log4j2; +import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -16,7 +16,7 @@ import java.sql.ResultSet; import java.sql.SQLException; import java.time.Instant; -@Log4j2 +@Slf4j @Service public class ViewServiceMariaDbImpl extends DataConnector implements ViewService { diff --git a/dbrepo-gateway-service/README.md b/dbrepo-gateway-service/README.md deleted file mode 100644 index 025b6a81ed37ba5bf21a05b71e14923604385e5f..0000000000000000000000000000000000000000 --- a/dbrepo-gateway-service/README.md +++ /dev/null @@ -1,3 +0,0 @@ -# Gateway Service - -NGINX, test the syntax/regex with https://nginx.viraptor.info/ \ No newline at end of file diff --git a/dbrepo-gateway-service/dbrepo.conf b/dbrepo-gateway-service/dbrepo.conf index 0ee5bfdfb5fb5c8950e61fff324abc4044a5bc1d..153d6fb7f50444c94fbcd2a29371f12833d20d6d 100644 --- a/dbrepo-gateway-service/dbrepo.conf +++ b/dbrepo-gateway-service/dbrepo.conf @@ -4,8 +4,6 @@ map $http_upgrade $connection_upgrade { '' close; } -client_max_body_size 20G; - proxy_buffer_size 128k; proxy_buffers 4 256k; proxy_busy_buffers_size 256k; diff --git a/dbrepo-metadata-db/1_setup-schema.sql b/dbrepo-metadata-db/1_setup-schema.sql index 4ba9d70b174dca5b3481d8042f47c332afc4cf2b..818439cf448d617684dee1b3a030f1f4ccf21e6b 100644 --- a/dbrepo-metadata-db/1_setup-schema.sql +++ b/dbrepo-metadata-db/1_setup-schema.sql @@ -374,11 +374,12 @@ CREATE TABLE IF NOT EXISTS `mdb_identifier_licenses` CREATE TABLE IF NOT EXISTS `mdb_identifier_titles` ( - id VARCHAR(36) NOT NULL DEFAULT UUID(), - pid VARCHAR(36) NOT NULL, - title TEXT NOT NULL, - title_type ENUM ('ALTERNATIVE_TITLE', 'SUBTITLE', 'TRANSLATED_TITLE', 'OTHER'), - language VARCHAR(2), + id VARCHAR(36) NOT NULL DEFAULT UUID(), + pid VARCHAR(36) NOT NULL, + title TEXT NOT NULL, + title_type ENUM ('ALTERNATIVE_TITLE', 'SUBTITLE', 'TRANSLATED_TITLE', 'OTHER'), + ordinal_position INT NOT NULL, + language VARCHAR(2), PRIMARY KEY (`id`), FOREIGN KEY (`pid`) REFERENCES mdb_identifiers (`id`) ) WITH SYSTEM VERSIONING; @@ -394,6 +395,7 @@ CREATE TABLE IF NOT EXISTS `mdb_identifier_funders` award_number VARCHAR(255), award_title TEXT, language VARCHAR(255), + ordinal_position INT NOT NULL, PRIMARY KEY (`id`), FOREIGN KEY (`pid`) REFERENCES mdb_identifiers (`id`) ) WITH SYSTEM VERSIONING; @@ -405,17 +407,19 @@ CREATE TABLE IF NOT EXISTS `mdb_identifier_descriptions` description TEXT NOT NULL, description_type ENUM ('ABSTRACT', 'METHODS', 'SERIES_INFORMATION', 'TABLE_OF_CONTENTS', 'TECHNICAL_INFO', 'OTHER'), language VARCHAR(2), + ordinal_position INT NOT NULL, PRIMARY KEY (`id`), FOREIGN KEY (`pid`) REFERENCES mdb_identifiers (`id`) ) WITH SYSTEM VERSIONING; CREATE TABLE IF NOT EXISTS `mdb_identifier_related` ( - id VARCHAR(36) NOT NULL DEFAULT UUID(), - pid VARCHAR(36) NOT NULL DEFAULT UUID(), - value VARCHAR(255) NOT NULL, - type ENUM ('DOI','URL','URN','ARK','ARXIV','BIBCODE','EAN13','EISSN','HANDLE','IGSN','ISBN','ISTC','LISSN','LSID','PMID','PURL','UPC','W3ID') NOT NULL, - relation ENUM ('IS_CITED_BY','CITES','IS_SUPPLEMENT_TO','IS_SUPPLEMENTED_BY','IS_CONTINUED_BY','CONTINUES','IS_DESCRIBED_BY','DESCRIBES','HAS_METADATA','IS_METADATA_FOR','HAS_VERSION','IS_VERSION_OF','IS_NEW_VERSION_OF','IS_PREVIOUS_VERSION_OF','IS_PART_OF','HAS_PART','IS_PUBLISHED_IN','IS_REFERENCED_BY','REFERENCES','IS_DOCUMENTED_BY','DOCUMENTS','IS_COMPILED_BY','COMPILES','IS_VARIANT_FORM_OF','IS_ORIGINAL_FORM_OF','IS_IDENTICAL_TO','IS_REVIEWED_BY','REVIEWS','IS_DERIVED_FROM','IS_SOURCE_OF','IS_REQUIRED_BY','REQUIRES','IS_OBSOLETED_BY','OBSOLETES') NOT NULL, + id VARCHAR(36) NOT NULL DEFAULT UUID(), + pid VARCHAR(36) NOT NULL DEFAULT UUID(), + value VARCHAR(255) NOT NULL, + type ENUM ('DOI','URL','URN','ARK','ARXIV','BIBCODE','EAN13','EISSN','HANDLE','IGSN','ISBN','ISTC','LISSN','LSID','PMID','PURL','UPC','W3ID') NOT NULL, + relation ENUM ('IS_CITED_BY','CITES','IS_SUPPLEMENT_TO','IS_SUPPLEMENTED_BY','IS_CONTINUED_BY','CONTINUES','IS_DESCRIBED_BY','DESCRIBES','HAS_METADATA','IS_METADATA_FOR','HAS_VERSION','IS_VERSION_OF','IS_NEW_VERSION_OF','IS_PREVIOUS_VERSION_OF','IS_PART_OF','HAS_PART','IS_PUBLISHED_IN','IS_REFERENCED_BY','REFERENCES','IS_DOCUMENTED_BY','DOCUMENTS','IS_COMPILED_BY','COMPILES','IS_VARIANT_FORM_OF','IS_ORIGINAL_FORM_OF','IS_IDENTICAL_TO','IS_REVIEWED_BY','REVIEWS','IS_DERIVED_FROM','IS_SOURCE_OF','IS_REQUIRED_BY','REQUIRES','IS_OBSOLETED_BY','OBSOLETES') NOT NULL, + ordinal_position INT NOT NULL, PRIMARY KEY (`id`), /* must be a single id from persistent identifier concept */ FOREIGN KEY (`pid`) REFERENCES mdb_identifiers (`id`), UNIQUE (pid, value) @@ -425,6 +429,7 @@ CREATE TABLE IF NOT EXISTS `mdb_identifier_creators` ( id VARCHAR(36) NOT NULL DEFAULT UUID(), pid VARCHAR(36) NOT NULL, + ordinal_position INT NOT NULL, given_names TEXT, family_name TEXT, creator_name VARCHAR(255) NOT NULL, diff --git a/dbrepo-metadata-db/metrics.cnf b/dbrepo-metadata-db/metrics.cnf new file mode 100644 index 0000000000000000000000000000000000000000..10dd32998a5aab20ed52756e1e1678c9cd281d27 --- /dev/null +++ b/dbrepo-metadata-db/metrics.cnf @@ -0,0 +1,3 @@ +[client] +user=readonly +password=readonly \ No newline at end of file diff --git a/dbrepo-metadata-service/Dockerfile b/dbrepo-metadata-service/Dockerfile index 2d3acf1bd192eda57a807b8e0be6b48ccde398fc..f9bb4cb4da6a136acde726f8cfdf97df07ed1b5e 100644 --- a/dbrepo-metadata-service/Dockerfile +++ b/dbrepo-metadata-service/Dockerfile @@ -27,12 +27,15 @@ RUN apk --no-cache add \ WORKDIR /app +RUN mkdir -p /var/log/app/service/metadata && \ + chown -R 1001:1001 /var/log/app + RUN adduser -D dbrepo --uid 1001 && \ chown -R 1001:1001 /app USER 1001 -COPY --from=build --chown=1001 ./rest-service/target/*rest-service-*.jar ./metadata-service.jar +COPY --from=build --chown=1001 ./rest-service/target/*service*.jar ./metadata-service.jar # non-root port EXPOSE 8080 diff --git a/dbrepo-metadata-service/oai/pom.xml b/dbrepo-metadata-service/oai/pom.xml index 89391bf8e210663a621f8bdae36bf78c32b685c4..b2f58fb5f516721f2625d857e510d9a9938e9d7b 100644 --- a/dbrepo-metadata-service/oai/pom.xml +++ b/dbrepo-metadata-service/oai/pom.xml @@ -6,12 +6,12 @@ <parent> <groupId>at.ac.tuwien.ifs.dbrepo</groupId> <artifactId>metadata-service</artifactId> - <version>1.8.1</version> + <version>1.9.0</version> </parent> <name>oai</name> - <artifactId>metadata-service-oai</artifactId> - <version>1.8.1</version> + <artifactId>oai</artifactId> + <version>1.9.0</version> <dependencies/> diff --git a/dbrepo-metadata-service/pom.xml b/dbrepo-metadata-service/pom.xml index 5697be3b2b9e5f5e88762d2781bda8aea15db9b7..d7adb9dfae03884e59ead564f6f78dd82bfdd145 100644 --- a/dbrepo-metadata-service/pom.xml +++ b/dbrepo-metadata-service/pom.xml @@ -5,7 +5,7 @@ <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> - <version>3.3.5</version> + <version>3.4.0</version> </parent> <organization> @@ -18,7 +18,7 @@ <groupId>at.ac.tuwien.ifs.dbrepo</groupId> <artifactId>metadata-service</artifactId> - <version>1.8.1</version> + <version>1.9.0</version> <packaging>pom</packaging> <modules> @@ -29,7 +29,7 @@ <module>report</module> </modules> - <url>https://www.ifs.tuwien.ac.at/infrastructures/dbrepo/1.8/</url> + <url>https://www.ifs.tuwien.ac.at/infrastructures/dbrepo/1.9/</url> <developers> <developer> <name>Martin Weise</name> @@ -67,9 +67,9 @@ <dependencies> <dependency> - <groupId>${project.groupId}</groupId> + <groupId>at.ac.tuwien.ifs.dbrepo</groupId> <artifactId>dbrepo-core</artifactId> - <version>${project.version}</version> + <version>1.9.0</version> </dependency> <!-- Data Source --> <dependency> diff --git a/dbrepo-metadata-service/report/pom.xml b/dbrepo-metadata-service/report/pom.xml index 10a221ef6c7bfce7327c0e017c5aeb7d2798658e..84ac2939e101b9f0320a7de44e1dc4c8bbc1e544 100644 --- a/dbrepo-metadata-service/report/pom.xml +++ b/dbrepo-metadata-service/report/pom.xml @@ -6,18 +6,18 @@ <parent> <groupId>at.ac.tuwien.ifs.dbrepo</groupId> <artifactId>metadata-service</artifactId> - <version>1.8.1</version> + <version>1.9.0</version> </parent> <name>report</name> - <artifactId>metadata-service-report</artifactId> - <version>1.8.1</version> + <artifactId>report</artifactId> + <version>1.9.0</version> <dependencies> <dependency> <groupId>at.ac.tuwien.ifs.dbrepo</groupId> - <artifactId>metadata-service-services</artifactId> - <version>1.8.1</version> + <artifactId>services</artifactId> + <version>1.9.0</version> </dependency> </dependencies> diff --git a/dbrepo-metadata-service/repositories/pom.xml b/dbrepo-metadata-service/repositories/pom.xml index 1928e3b33ffa405d60b58c6970604f0a054bfb79..6d568fee19a1ac50527e9c8e6db005dd33b29b56 100644 --- a/dbrepo-metadata-service/repositories/pom.xml +++ b/dbrepo-metadata-service/repositories/pom.xml @@ -6,18 +6,18 @@ <parent> <groupId>at.ac.tuwien.ifs.dbrepo</groupId> <artifactId>metadata-service</artifactId> - <version>1.8.1</version> + <version>1.9.0</version> </parent> <name>repositories</name> - <artifactId>metadata-service-repositories</artifactId> - <version>1.8.1</version> + <artifactId>repositories</artifactId> + <version>1.9.0</version> <dependencies> <dependency> <groupId>at.ac.tuwien.ifs.dbrepo</groupId> - <artifactId>metadata-service-oai</artifactId> - <version>1.8.1</version> + <artifactId>oai</artifactId> + <version>1.9.0</version> </dependency> </dependencies> diff --git a/dbrepo-metadata-service/repositories/src/main/java/at/ac/tuwien/ifs/dbrepo/repository/IdentifierRepository.java b/dbrepo-metadata-service/repositories/src/main/java/at/ac/tuwien/ifs/dbrepo/repository/IdentifierRepository.java index 4011a8d1683329af5181d387b6031cefa8fd461b..35eebe00f36c175043984c5d277aae7dcebaa3ab 100644 --- a/dbrepo-metadata-service/repositories/src/main/java/at/ac/tuwien/ifs/dbrepo/repository/IdentifierRepository.java +++ b/dbrepo-metadata-service/repositories/src/main/java/at/ac/tuwien/ifs/dbrepo/repository/IdentifierRepository.java @@ -11,6 +11,8 @@ import java.util.UUID; @Repository public interface IdentifierRepository extends JpaRepository<Identifier, UUID> { + List<Identifier> findAll(); + /** * Finds identifiers by given database id. * diff --git a/dbrepo-metadata-service/rest-service/pom.xml b/dbrepo-metadata-service/rest-service/pom.xml index bb75d96288c218e1c3dc04cb5c1d2d678e2380a0..8b87ec8a0338deaf8ba5960bb9c2f87ed464916b 100644 --- a/dbrepo-metadata-service/rest-service/pom.xml +++ b/dbrepo-metadata-service/rest-service/pom.xml @@ -6,18 +6,18 @@ <parent> <groupId>at.ac.tuwien.ifs.dbrepo</groupId> <artifactId>metadata-service</artifactId> - <version>1.8.1</version> + <version>1.9.0</version> </parent> <name>rest-service</name> - <artifactId>metadata-service-service</artifactId> - <version>1.8.1</version> + <artifactId>rest-service</artifactId> + <version>1.9.0</version> <dependencies> <dependency> <groupId>at.ac.tuwien.ifs.dbrepo</groupId> - <artifactId>metadata-service-services</artifactId> - <version>1.8.1</version> + <artifactId>services</artifactId> + <version>1.9.0</version> </dependency> </dependencies> diff --git a/dbrepo-metadata-service/rest-service/src/main/java/at/ac/tuwien/ifs/dbrepo/endpoints/AbstractEndpoint.java b/dbrepo-metadata-service/rest-service/src/main/java/at/ac/tuwien/ifs/dbrepo/endpoints/AbstractEndpoint.java index d11baa387b662768a85ee531923ce72296716f4d..a500d7c39c742139135a4e2ec31de7da0bebf795 100644 --- a/dbrepo-metadata-service/rest-service/src/main/java/at/ac/tuwien/ifs/dbrepo/endpoints/AbstractEndpoint.java +++ b/dbrepo-metadata-service/rest-service/src/main/java/at/ac/tuwien/ifs/dbrepo/endpoints/AbstractEndpoint.java @@ -7,7 +7,7 @@ import at.ac.tuwien.ifs.dbrepo.core.entity.database.Database; import at.ac.tuwien.ifs.dbrepo.core.entity.database.DatabaseAccess; import at.ac.tuwien.ifs.dbrepo.core.entity.database.View; import at.ac.tuwien.ifs.dbrepo.core.exception.NotAllowedException; -import lombok.extern.log4j.Log4j2; +import lombok.extern.slf4j.Slf4j; import org.springframework.security.core.Authentication; import java.security.Principal; @@ -15,7 +15,7 @@ import java.util.List; import java.util.Optional; import java.util.UUID; -@Log4j2 +@Slf4j public abstract class AbstractEndpoint { public boolean hasRole(Principal principal, String role) { diff --git a/dbrepo-metadata-service/rest-service/src/main/java/at/ac/tuwien/ifs/dbrepo/endpoints/AccessEndpoint.java b/dbrepo-metadata-service/rest-service/src/main/java/at/ac/tuwien/ifs/dbrepo/endpoints/AccessEndpoint.java index a605ec126fdafb30369ed594ef18d74b3ce900b7..7207869636a6b3b9959c3f5f285c9b3dab7c47d0 100644 --- a/dbrepo-metadata-service/rest-service/src/main/java/at/ac/tuwien/ifs/dbrepo/endpoints/AccessEndpoint.java +++ b/dbrepo-metadata-service/rest-service/src/main/java/at/ac/tuwien/ifs/dbrepo/endpoints/AccessEndpoint.java @@ -21,7 +21,7 @@ import io.swagger.v3.oas.annotations.responses.ApiResponses; import io.swagger.v3.oas.annotations.security.SecurityRequirement; import jakarta.validation.Valid; import jakarta.validation.constraints.NotNull; -import lombok.extern.log4j.Log4j2; +import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.ResponseEntity; import org.springframework.security.access.prepost.PreAuthorize; @@ -31,7 +31,7 @@ import org.springframework.web.bind.annotation.*; import java.security.Principal; import java.util.UUID; -@Log4j2 +@Slf4j @RestController @CrossOrigin(origins = "*") @RequestMapping(path = "/api/database/{databaseId}/access") diff --git a/dbrepo-metadata-service/rest-service/src/main/java/at/ac/tuwien/ifs/dbrepo/endpoints/ConceptEndpoint.java b/dbrepo-metadata-service/rest-service/src/main/java/at/ac/tuwien/ifs/dbrepo/endpoints/ConceptEndpoint.java index 11b2d8ea0c8fb564e05cbf6290854da85476c6a9..c0eabd765d66a13ee24b50a627df33a36f22173a 100644 --- a/dbrepo-metadata-service/rest-service/src/main/java/at/ac/tuwien/ifs/dbrepo/endpoints/ConceptEndpoint.java +++ b/dbrepo-metadata-service/rest-service/src/main/java/at/ac/tuwien/ifs/dbrepo/endpoints/ConceptEndpoint.java @@ -10,7 +10,7 @@ import io.swagger.v3.oas.annotations.media.Content; import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.responses.ApiResponse; import io.swagger.v3.oas.annotations.responses.ApiResponses; -import lombok.extern.log4j.Log4j2; +import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.ResponseEntity; import org.springframework.transaction.annotation.Transactional; @@ -21,7 +21,7 @@ import org.springframework.web.bind.annotation.RestController; import java.util.List; -@Log4j2 +@Slf4j @CrossOrigin(origins = "*") @RestController @RequestMapping(path = "/api/concept") diff --git a/dbrepo-metadata-service/rest-service/src/main/java/at/ac/tuwien/ifs/dbrepo/endpoints/ContainerEndpoint.java b/dbrepo-metadata-service/rest-service/src/main/java/at/ac/tuwien/ifs/dbrepo/endpoints/ContainerEndpoint.java index d98901f53595da0bbcfb0f77c1b53118b09a8d48..e7a664f2893a4b66c15b41f3be47eefe64c8c9c9 100644 --- a/dbrepo-metadata-service/rest-service/src/main/java/at/ac/tuwien/ifs/dbrepo/endpoints/ContainerEndpoint.java +++ b/dbrepo-metadata-service/rest-service/src/main/java/at/ac/tuwien/ifs/dbrepo/endpoints/ContainerEndpoint.java @@ -20,7 +20,7 @@ import io.swagger.v3.oas.annotations.responses.ApiResponses; import io.swagger.v3.oas.annotations.security.SecurityRequirement; import jakarta.validation.Valid; import jakarta.validation.constraints.NotNull; -import lombok.extern.log4j.Log4j2; +import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; @@ -35,7 +35,7 @@ import java.util.UUID; import java.util.stream.Collectors; -@Log4j2 +@Slf4j @RestController @CrossOrigin(origins = "*") @ControllerAdvice diff --git a/dbrepo-metadata-service/rest-service/src/main/java/at/ac/tuwien/ifs/dbrepo/endpoints/DatabaseEndpoint.java b/dbrepo-metadata-service/rest-service/src/main/java/at/ac/tuwien/ifs/dbrepo/endpoints/DatabaseEndpoint.java index 0474215e01fce6ccd392441e8ea1cfef8ccd6726..485967e56814ee0b5449e1faa95c7fc2ab21eef6 100644 --- a/dbrepo-metadata-service/rest-service/src/main/java/at/ac/tuwien/ifs/dbrepo/endpoints/DatabaseEndpoint.java +++ b/dbrepo-metadata-service/rest-service/src/main/java/at/ac/tuwien/ifs/dbrepo/endpoints/DatabaseEndpoint.java @@ -20,7 +20,7 @@ import io.swagger.v3.oas.annotations.responses.ApiResponses; import io.swagger.v3.oas.annotations.security.SecurityRequirement; import jakarta.validation.Valid; import jakarta.validation.constraints.NotNull; -import lombok.extern.log4j.Log4j2; +import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; @@ -34,7 +34,7 @@ import java.security.Principal; import java.util.List; import java.util.UUID; -@Log4j2 +@Slf4j @RestController @CrossOrigin(origins = "*") @RequestMapping(path = "/api/database") diff --git a/dbrepo-metadata-service/rest-service/src/main/java/at/ac/tuwien/ifs/dbrepo/endpoints/IdentifierEndpoint.java b/dbrepo-metadata-service/rest-service/src/main/java/at/ac/tuwien/ifs/dbrepo/endpoints/IdentifierEndpoint.java index ea6e569e52d8c0e575fe85b78106b5297eb1caf2..02ce030220cf6ef1f1b7ef1b780f743678095c16 100644 --- a/dbrepo-metadata-service/rest-service/src/main/java/at/ac/tuwien/ifs/dbrepo/endpoints/IdentifierEndpoint.java +++ b/dbrepo-metadata-service/rest-service/src/main/java/at/ac/tuwien/ifs/dbrepo/endpoints/IdentifierEndpoint.java @@ -24,7 +24,7 @@ import io.swagger.v3.oas.annotations.responses.ApiResponses; import io.swagger.v3.oas.annotations.security.SecurityRequirement; import jakarta.validation.Valid; import jakarta.validation.constraints.NotNull; -import lombok.extern.log4j.Log4j2; +import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; @@ -41,7 +41,7 @@ import java.util.UUID; import java.util.regex.Matcher; import java.util.regex.Pattern; -@Log4j2 +@Slf4j @CrossOrigin(origins = "*") @RestController @RequestMapping(path = "/api/identifier") diff --git a/dbrepo-metadata-service/rest-service/src/main/java/at/ac/tuwien/ifs/dbrepo/endpoints/ImageEndpoint.java b/dbrepo-metadata-service/rest-service/src/main/java/at/ac/tuwien/ifs/dbrepo/endpoints/ImageEndpoint.java index 3137e08a6833617afb27e075b1de9980867568da..fa11732d3814e6a2c19a5828d1884bf1bfbd7936 100644 --- a/dbrepo-metadata-service/rest-service/src/main/java/at/ac/tuwien/ifs/dbrepo/endpoints/ImageEndpoint.java +++ b/dbrepo-metadata-service/rest-service/src/main/java/at/ac/tuwien/ifs/dbrepo/endpoints/ImageEndpoint.java @@ -21,7 +21,7 @@ import io.swagger.v3.oas.annotations.responses.ApiResponses; import io.swagger.v3.oas.annotations.security.SecurityRequirement; import jakarta.validation.Valid; import jakarta.validation.constraints.NotNull; -import lombok.extern.log4j.Log4j2; +import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; @@ -33,7 +33,7 @@ import java.security.Principal; import java.util.List; import java.util.UUID; -@Log4j2 +@Slf4j @RestController @CrossOrigin(origins = "*") @ControllerAdvice diff --git a/dbrepo-metadata-service/rest-service/src/main/java/at/ac/tuwien/ifs/dbrepo/endpoints/LicenseEndpoint.java b/dbrepo-metadata-service/rest-service/src/main/java/at/ac/tuwien/ifs/dbrepo/endpoints/LicenseEndpoint.java index f82127b86a5f554fe585b3472d955a207bdc25b2..cfd9f23bf979b7e1e7b45bc851dffebb95c6ba0b 100644 --- a/dbrepo-metadata-service/rest-service/src/main/java/at/ac/tuwien/ifs/dbrepo/endpoints/LicenseEndpoint.java +++ b/dbrepo-metadata-service/rest-service/src/main/java/at/ac/tuwien/ifs/dbrepo/endpoints/LicenseEndpoint.java @@ -10,7 +10,7 @@ import io.swagger.v3.oas.annotations.media.Content; import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.responses.ApiResponse; import io.swagger.v3.oas.annotations.responses.ApiResponses; -import lombok.extern.log4j.Log4j2; +import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; @@ -22,7 +22,7 @@ import org.springframework.web.bind.annotation.RestController; import java.util.List; -@Log4j2 +@Slf4j @RestController @CrossOrigin(origins = "*") @RequestMapping(path = "/api/license") diff --git a/dbrepo-metadata-service/rest-service/src/main/java/at/ac/tuwien/ifs/dbrepo/endpoints/MessageEndpoint.java b/dbrepo-metadata-service/rest-service/src/main/java/at/ac/tuwien/ifs/dbrepo/endpoints/MessageEndpoint.java index 6d6f3c8591a9a00393866f9031d305509d44e9ac..6851d716807a2f2a0d1041cabd07e980004c36a5 100644 --- a/dbrepo-metadata-service/rest-service/src/main/java/at/ac/tuwien/ifs/dbrepo/endpoints/MessageEndpoint.java +++ b/dbrepo-metadata-service/rest-service/src/main/java/at/ac/tuwien/ifs/dbrepo/endpoints/MessageEndpoint.java @@ -19,7 +19,7 @@ import io.swagger.v3.oas.annotations.responses.ApiResponses; import io.swagger.v3.oas.annotations.security.SecurityRequirement; import jakarta.validation.Valid; import jakarta.validation.constraints.NotNull; -import lombok.extern.log4j.Log4j2; +import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; @@ -29,7 +29,7 @@ import org.springframework.web.bind.annotation.*; import java.util.List; import java.util.UUID; -@Log4j2 +@Slf4j @CrossOrigin(origins = "*") @RestController @RequestMapping(path = "/api/message") diff --git a/dbrepo-metadata-service/rest-service/src/main/java/at/ac/tuwien/ifs/dbrepo/endpoints/MetadataEndpoint.java b/dbrepo-metadata-service/rest-service/src/main/java/at/ac/tuwien/ifs/dbrepo/endpoints/MetadataEndpoint.java index 4916ed8612ea04ba16375d645e3ac08424dc56a6..891e0ada52733ac457e8f4e3d7a203ebc0a37f04 100644 --- a/dbrepo-metadata-service/rest-service/src/main/java/at/ac/tuwien/ifs/dbrepo/endpoints/MetadataEndpoint.java +++ b/dbrepo-metadata-service/rest-service/src/main/java/at/ac/tuwien/ifs/dbrepo/endpoints/MetadataEndpoint.java @@ -13,7 +13,7 @@ import io.swagger.v3.oas.annotations.media.Content; import io.swagger.v3.oas.annotations.media.ExampleObject; import io.swagger.v3.oas.annotations.responses.ApiResponse; import io.swagger.v3.oas.annotations.responses.ApiResponses; -import lombok.extern.log4j.Log4j2; +import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; @@ -25,7 +25,7 @@ import org.springframework.web.bind.annotation.RestController; import java.util.List; -@Log4j2 +@Slf4j @CrossOrigin(origins = "*") @RestController @RequestMapping(path = "/api/oai") diff --git a/dbrepo-metadata-service/rest-service/src/main/java/at/ac/tuwien/ifs/dbrepo/endpoints/OntologyEndpoint.java b/dbrepo-metadata-service/rest-service/src/main/java/at/ac/tuwien/ifs/dbrepo/endpoints/OntologyEndpoint.java index da48971adb762783ab7812d513a327cca94c3886..7f06ab0b101baa9c8d17e83dc64c5a1b72feb3b3 100644 --- a/dbrepo-metadata-service/rest-service/src/main/java/at/ac/tuwien/ifs/dbrepo/endpoints/OntologyEndpoint.java +++ b/dbrepo-metadata-service/rest-service/src/main/java/at/ac/tuwien/ifs/dbrepo/endpoints/OntologyEndpoint.java @@ -20,7 +20,7 @@ import io.swagger.v3.oas.annotations.responses.ApiResponses; import io.swagger.v3.oas.annotations.security.SecurityRequirement; import jakarta.validation.Valid; import jakarta.validation.constraints.NotNull; -import lombok.extern.log4j.Log4j2; +import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; @@ -31,7 +31,7 @@ import java.security.Principal; import java.util.List; import java.util.UUID; -@Log4j2 +@Slf4j @CrossOrigin(origins = "*") @RestController @RequestMapping(path = "/api/ontology") diff --git a/dbrepo-metadata-service/rest-service/src/main/java/at/ac/tuwien/ifs/dbrepo/endpoints/TableEndpoint.java b/dbrepo-metadata-service/rest-service/src/main/java/at/ac/tuwien/ifs/dbrepo/endpoints/TableEndpoint.java index 211efe731e673919223103aabcb5f8c0f8aa58cc..dd5b65317eeca3587e93adaae82b982aac10e69b 100644 --- a/dbrepo-metadata-service/rest-service/src/main/java/at/ac/tuwien/ifs/dbrepo/endpoints/TableEndpoint.java +++ b/dbrepo-metadata-service/rest-service/src/main/java/at/ac/tuwien/ifs/dbrepo/endpoints/TableEndpoint.java @@ -26,7 +26,7 @@ import io.swagger.v3.oas.annotations.responses.ApiResponses; import io.swagger.v3.oas.annotations.security.SecurityRequirement; import jakarta.validation.Valid; import jakarta.validation.constraints.NotNull; -import lombok.extern.log4j.Log4j2; +import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; @@ -40,7 +40,7 @@ import java.util.Optional; import java.util.UUID; import java.util.stream.Collectors; -@Log4j2 +@Slf4j @CrossOrigin(origins = "*") @RestController @RequestMapping(path = "/api/database/{databaseId}/table") diff --git a/dbrepo-metadata-service/rest-service/src/main/java/at/ac/tuwien/ifs/dbrepo/endpoints/UnitEndpoint.java b/dbrepo-metadata-service/rest-service/src/main/java/at/ac/tuwien/ifs/dbrepo/endpoints/UnitEndpoint.java index a0f5630c7ab219b473839b3a0936ea3f85f58322..8c51242ea6391411e7dae34ccbbdddc6fa6899a5 100644 --- a/dbrepo-metadata-service/rest-service/src/main/java/at/ac/tuwien/ifs/dbrepo/endpoints/UnitEndpoint.java +++ b/dbrepo-metadata-service/rest-service/src/main/java/at/ac/tuwien/ifs/dbrepo/endpoints/UnitEndpoint.java @@ -10,7 +10,7 @@ import io.swagger.v3.oas.annotations.media.Content; import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.responses.ApiResponse; import io.swagger.v3.oas.annotations.responses.ApiResponses; -import lombok.extern.log4j.Log4j2; +import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.ResponseEntity; import org.springframework.transaction.annotation.Transactional; @@ -21,7 +21,7 @@ import org.springframework.web.bind.annotation.RestController; import java.util.List; -@Log4j2 +@Slf4j @CrossOrigin(origins = "*") @RestController @RequestMapping(path = "/api/unit") diff --git a/dbrepo-metadata-service/rest-service/src/main/java/at/ac/tuwien/ifs/dbrepo/endpoints/UserEndpoint.java b/dbrepo-metadata-service/rest-service/src/main/java/at/ac/tuwien/ifs/dbrepo/endpoints/UserEndpoint.java index 1de29eef1b25d267901b3dbbff75c329fd099940..0f1ec13f3bb91664934a80ddf11ca19f4783e378 100644 --- a/dbrepo-metadata-service/rest-service/src/main/java/at/ac/tuwien/ifs/dbrepo/endpoints/UserEndpoint.java +++ b/dbrepo-metadata-service/rest-service/src/main/java/at/ac/tuwien/ifs/dbrepo/endpoints/UserEndpoint.java @@ -21,7 +21,7 @@ import io.swagger.v3.oas.annotations.responses.ApiResponses; import io.swagger.v3.oas.annotations.security.SecurityRequirement; import jakarta.validation.Valid; import jakarta.validation.constraints.NotNull; -import lombok.extern.log4j.Log4j2; +import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; @@ -34,7 +34,7 @@ import java.security.Principal; import java.util.List; import java.util.UUID; -@Log4j2 +@Slf4j @CrossOrigin(origins = "*") @RestController @RequestMapping(path = "/api/user") diff --git a/dbrepo-metadata-service/rest-service/src/main/java/at/ac/tuwien/ifs/dbrepo/endpoints/ViewEndpoint.java b/dbrepo-metadata-service/rest-service/src/main/java/at/ac/tuwien/ifs/dbrepo/endpoints/ViewEndpoint.java index 2c4bfd4e44d22e7def2846da883b6c555e0d2551..61d64b7d2088b0afb685ea0570354c6d661ebfd9 100644 --- a/dbrepo-metadata-service/rest-service/src/main/java/at/ac/tuwien/ifs/dbrepo/endpoints/ViewEndpoint.java +++ b/dbrepo-metadata-service/rest-service/src/main/java/at/ac/tuwien/ifs/dbrepo/endpoints/ViewEndpoint.java @@ -24,7 +24,7 @@ import io.swagger.v3.oas.annotations.responses.ApiResponses; import io.swagger.v3.oas.annotations.security.SecurityRequirement; import jakarta.validation.Valid; import jakarta.validation.constraints.NotNull; -import lombok.extern.log4j.Log4j2; +import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; @@ -38,7 +38,7 @@ import java.util.Optional; import java.util.UUID; import java.util.stream.Collectors; -@Log4j2 +@Slf4j @CrossOrigin(origins = "*") @RestController @RequestMapping(path = "/api/database/{databaseId}/view") diff --git a/dbrepo-metadata-service/rest-service/src/main/java/at/ac/tuwien/ifs/dbrepo/handlers/ApiExceptionHandler.java b/dbrepo-metadata-service/rest-service/src/main/java/at/ac/tuwien/ifs/dbrepo/handlers/ApiExceptionHandler.java index 0d4a6170016a3f138d734e872939905e5e17278d..b1e06ce9951d245d038566367f212e3625078102 100644 --- a/dbrepo-metadata-service/rest-service/src/main/java/at/ac/tuwien/ifs/dbrepo/handlers/ApiExceptionHandler.java +++ b/dbrepo-metadata-service/rest-service/src/main/java/at/ac/tuwien/ifs/dbrepo/handlers/ApiExceptionHandler.java @@ -5,7 +5,7 @@ import at.ac.tuwien.ifs.dbrepo.core.exception.*; import com.auth0.jwt.exceptions.TokenExpiredException; import io.swagger.v3.oas.annotations.Hidden; import jakarta.ws.rs.NotAuthorizedException; -import lombok.extern.log4j.Log4j2; +import lombok.extern.slf4j.Slf4j; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; @@ -14,7 +14,7 @@ import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.ResponseStatus; import org.springframework.web.servlet.mvc.method.annotation.ResponseEntityExceptionHandler; -@Log4j2 +@Slf4j @ControllerAdvice public class ApiExceptionHandler extends ResponseEntityExceptionHandler { diff --git a/dbrepo-metadata-service/rest-service/src/main/java/at/ac/tuwien/ifs/dbrepo/validation/EndpointValidator.java b/dbrepo-metadata-service/rest-service/src/main/java/at/ac/tuwien/ifs/dbrepo/validation/EndpointValidator.java index 8068a8d734102988195943163733b0e2cb35cd5f..af87409942f1da59250adbc5b033cf0e4651d238 100644 --- a/dbrepo-metadata-service/rest-service/src/main/java/at/ac/tuwien/ifs/dbrepo/validation/EndpointValidator.java +++ b/dbrepo-metadata-service/rest-service/src/main/java/at/ac/tuwien/ifs/dbrepo/validation/EndpointValidator.java @@ -14,7 +14,7 @@ import at.ac.tuwien.ifs.dbrepo.core.entity.user.User; import at.ac.tuwien.ifs.dbrepo.core.exception.*; import at.ac.tuwien.ifs.dbrepo.service.AccessService; import at.ac.tuwien.ifs.dbrepo.service.UserService; -import lombok.extern.log4j.Log4j2; +import lombok.extern.slf4j.Slf4j; import org.apache.commons.validator.GenericValidator; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @@ -25,7 +25,7 @@ import java.util.List; import java.util.Objects; import java.util.Optional; -@Log4j2 +@Slf4j @Component public class EndpointValidator extends AbstractEndpoint { diff --git a/dbrepo-metadata-service/rest-service/src/main/resources/application.yml b/dbrepo-metadata-service/rest-service/src/main/resources/application.yml index 492aafb6c558a28956190e5c48f198b9e1f333ae..72fd264e48ab00e4c305d3d98db7036b30a0a75a 100644 --- a/dbrepo-metadata-service/rest-service/src/main/resources/application.yml +++ b/dbrepo-metadata-service/rest-service/src/main/resources/application.yml @@ -42,11 +42,17 @@ management: server: port: 8080 logging: - pattern.console: "%d %highlight(%-5level) %msg%n" + file: + name: /var/log/app/service/metadata/app.log level: root: warn at.ac.tuwien.ifs.dbrepo.: "${LOG_LEVEL:info}" org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver: debug + pattern: + console: "%d %highlight(%-5level) %msg%n" + structured: + format: + file: ecs dbrepo: datacite: url: "${DATACITE_URL:https://api.datacite.org}" diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/ApplicationIntegrationTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/ApplicationIntegrationTest.java index 30b82efb1f626c07a866f9f7f157149a905e6556..fa49ecc091e6161103e6d8d376a75e04af78ad6b 100644 --- a/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/ApplicationIntegrationTest.java +++ b/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/ApplicationIntegrationTest.java @@ -1,13 +1,13 @@ package at.ac.tuwien.ifs.dbrepo; -import lombok.extern.log4j.Log4j2; +import lombok.extern.slf4j.Slf4j; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.annotation.DirtiesContext; import org.springframework.test.context.junit.jupiter.SpringExtension; -@Log4j2 +@Slf4j @DirtiesContext(classMode = DirtiesContext.ClassMode.BEFORE_EACH_TEST_METHOD) @SpringBootTest @ExtendWith(SpringExtension.class) diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/config/RabbitConfig.java b/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/config/RabbitConfig.java index 3dddb8cf33d8adade6efc587daf0d50dec057acb..70e6c53c28a9f42c883e0e0b9dbf38316eab452b 100644 --- a/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/config/RabbitConfig.java +++ b/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/config/RabbitConfig.java @@ -2,7 +2,7 @@ package at.ac.tuwien.ifs.dbrepo.config; import at.ac.tuwien.ifs.dbrepo.core.test.BaseTest; import lombok.Getter; -import lombok.extern.log4j.Log4j2; +import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -14,7 +14,7 @@ import org.springframework.web.util.DefaultUriBuilderFactory; import java.io.IOException; @Getter -@Log4j2 +@Slf4j @Configuration public class RabbitConfig extends BaseTest { diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/converters/IdentifierStatusTypeDtoConverterUnitTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/converters/IdentifierStatusTypeDtoConverterUnitTest.java index 20f1f615eb786b1f44697f9fa7a50b2671a3baa2..cc00c5c22d2b5ae1849f9d1c83a7e58c0399a049 100644 --- a/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/converters/IdentifierStatusTypeDtoConverterUnitTest.java +++ b/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/converters/IdentifierStatusTypeDtoConverterUnitTest.java @@ -2,7 +2,7 @@ package at.ac.tuwien.ifs.dbrepo.converters; import at.ac.tuwien.ifs.dbrepo.core.api.identifier.IdentifierStatusTypeDto; import at.ac.tuwien.ifs.dbrepo.core.test.BaseTest; -import lombok.extern.log4j.Log4j2; +import lombok.extern.slf4j.Slf4j; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; @@ -12,7 +12,7 @@ import java.io.IOException; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertThrows; -@Log4j2 +@Slf4j @SpringBootTest public class IdentifierStatusTypeDtoConverterUnitTest extends BaseTest { diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/converters/IdentifierTypeDtoConverterUnitTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/converters/IdentifierTypeDtoConverterUnitTest.java index 1d73cc34452a120c9da246457693fff9dd6615f4..dbc4d2bcff8e2520439f19d988a9aae63b1c6599 100644 --- a/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/converters/IdentifierTypeDtoConverterUnitTest.java +++ b/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/converters/IdentifierTypeDtoConverterUnitTest.java @@ -2,7 +2,7 @@ package at.ac.tuwien.ifs.dbrepo.converters; import at.ac.tuwien.ifs.dbrepo.core.api.identifier.IdentifierTypeDto; import at.ac.tuwien.ifs.dbrepo.core.test.BaseTest; -import lombok.extern.log4j.Log4j2; +import lombok.extern.slf4j.Slf4j; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; @@ -12,7 +12,7 @@ import java.io.IOException; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertThrows; -@Log4j2 +@Slf4j @SpringBootTest public class IdentifierTypeDtoConverterUnitTest extends BaseTest { diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/endpoints/AbstractEndpointUnitTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/endpoints/AbstractEndpointUnitTest.java index 52ffe690fa39b99d37308277005391f72f568093..faa95fb244ffed812206f08c76016cbb6219dec8 100644 --- a/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/endpoints/AbstractEndpointUnitTest.java +++ b/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/endpoints/AbstractEndpointUnitTest.java @@ -2,7 +2,7 @@ package at.ac.tuwien.ifs.dbrepo.endpoints; import at.ac.tuwien.ifs.dbrepo.core.test.BaseTest; import at.ac.tuwien.ifs.dbrepo.core.api.user.UserDetailsDto; -import lombok.extern.log4j.Log4j2; +import lombok.extern.slf4j.Slf4j; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.springframework.beans.factory.annotation.Autowired; @@ -14,7 +14,7 @@ import java.security.Principal; import static org.junit.jupiter.api.Assertions.*; -@Log4j2 +@Slf4j @SpringBootTest @ExtendWith(SpringExtension.class) public class AbstractEndpointUnitTest extends BaseTest { diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/endpoints/AccessEndpointUnitTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/endpoints/AccessEndpointUnitTest.java index 3c041352ea8b74846cf1693176799ac66fbed5fd..d32b6385faf9a481365c9df92e8baeae10079502 100644 --- a/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/endpoints/AccessEndpointUnitTest.java +++ b/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/endpoints/AccessEndpointUnitTest.java @@ -13,7 +13,7 @@ import at.ac.tuwien.ifs.dbrepo.service.AccessService; import at.ac.tuwien.ifs.dbrepo.service.DashboardService; import at.ac.tuwien.ifs.dbrepo.service.DatabaseService; import at.ac.tuwien.ifs.dbrepo.service.UserService; -import lombok.extern.log4j.Log4j2; +import lombok.extern.slf4j.Slf4j; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.springframework.beans.factory.annotation.Autowired; @@ -35,7 +35,7 @@ import static org.junit.jupiter.api.Assertions.*; import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.*; -@Log4j2 +@Slf4j @SpringBootTest @ExtendWith(SpringExtension.class) public class AccessEndpointUnitTest extends BaseTest { diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/endpoints/ActuatorComponentTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/endpoints/ActuatorComponentTest.java index f86a8c4e8b4641ad05d9d2b62a233b56df38953a..6a86fb3b54c175478a61beb59b808c313cc2752f 100644 --- a/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/endpoints/ActuatorComponentTest.java +++ b/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/endpoints/ActuatorComponentTest.java @@ -1,7 +1,7 @@ package at.ac.tuwien.ifs.dbrepo.endpoints; import at.ac.tuwien.ifs.dbrepo.core.test.BaseTest; -import lombok.extern.log4j.Log4j2; +import lombok.extern.slf4j.Slf4j; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.springframework.beans.factory.annotation.Autowired; @@ -17,7 +17,7 @@ import static org.springframework.test.web.servlet.result.MockMvcResultHandlers. import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; -@Log4j2 +@Slf4j @ExtendWith(SpringExtension.class) @AutoConfigureMockMvc @SpringBootTest diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/endpoints/ConceptEndpointUnitTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/endpoints/ConceptEndpointUnitTest.java index ba1d324299c2dc1541345a53376a9dadb08572ed..74a021b50b9dbbeef7f33a1fa7b3662f62b3bdc2 100644 --- a/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/endpoints/ConceptEndpointUnitTest.java +++ b/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/endpoints/ConceptEndpointUnitTest.java @@ -3,7 +3,7 @@ package at.ac.tuwien.ifs.dbrepo.endpoints; import at.ac.tuwien.ifs.dbrepo.core.api.database.table.columns.concepts.ConceptDto; import at.ac.tuwien.ifs.dbrepo.core.test.BaseTest; import at.ac.tuwien.ifs.dbrepo.service.ConceptService; -import lombok.extern.log4j.Log4j2; +import lombok.extern.slf4j.Slf4j; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.springframework.beans.factory.annotation.Autowired; @@ -21,7 +21,7 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.mockito.Mockito.when; -@Log4j2 +@Slf4j @SpringBootTest @ExtendWith(SpringExtension.class) public class ConceptEndpointUnitTest extends BaseTest { diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/endpoints/ContainerEndpointUnitTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/endpoints/ContainerEndpointUnitTest.java index 0933ab65ef5cb699f35b3c45691c450fcdacedd7..1de68f3fff845a2c69e3f1fcc70d51b4f8e91105 100644 --- a/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/endpoints/ContainerEndpointUnitTest.java +++ b/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/endpoints/ContainerEndpointUnitTest.java @@ -9,7 +9,7 @@ import at.ac.tuwien.ifs.dbrepo.core.exception.ContainerNotFoundException; import at.ac.tuwien.ifs.dbrepo.core.exception.ImageNotFoundException; import at.ac.tuwien.ifs.dbrepo.core.test.BaseTest; import at.ac.tuwien.ifs.dbrepo.service.impl.ContainerServiceImpl; -import lombok.extern.log4j.Log4j2; +import lombok.extern.slf4j.Slf4j; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.springframework.beans.factory.annotation.Autowired; @@ -30,7 +30,7 @@ import static org.junit.jupiter.api.Assertions.*; import static org.mockito.Mockito.doNothing; import static org.mockito.Mockito.when; -@Log4j2 +@Slf4j @ExtendWith(SpringExtension.class) @SpringBootTest public class ContainerEndpointUnitTest extends BaseTest { diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/endpoints/DatabaseEndpointUnitTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/endpoints/DatabaseEndpointUnitTest.java index 7f185fd98968c15d0b5dcdc17a9225ec1f22345e..5c6da0c477ae1e36ae00cbd53664e159e68b196e 100644 --- a/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/endpoints/DatabaseEndpointUnitTest.java +++ b/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/endpoints/DatabaseEndpointUnitTest.java @@ -8,7 +8,7 @@ import at.ac.tuwien.ifs.dbrepo.core.exception.*; import at.ac.tuwien.ifs.dbrepo.core.test.BaseTest; import at.ac.tuwien.ifs.dbrepo.service.*; import at.ac.tuwien.ifs.dbrepo.service.impl.DatabaseServiceImpl; -import lombok.extern.log4j.Log4j2; +import lombok.extern.slf4j.Slf4j; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.springframework.beans.factory.annotation.Autowired; @@ -31,7 +31,7 @@ import static org.junit.jupiter.api.Assertions.*; import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.*; -@Log4j2 +@Slf4j @SpringBootTest @ExtendWith(SpringExtension.class) public class DatabaseEndpointUnitTest extends BaseTest { diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/endpoints/IdentifierEndpointUnitTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/endpoints/IdentifierEndpointUnitTest.java index 38b8ee221794b7fd353e1fa86e7a11a3b8405106..054c96e3d925412cc746a81c97e9f8d3d448d7bc 100644 --- a/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/endpoints/IdentifierEndpointUnitTest.java +++ b/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/endpoints/IdentifierEndpointUnitTest.java @@ -13,7 +13,7 @@ import at.ac.tuwien.ifs.dbrepo.core.test.BaseTest; import at.ac.tuwien.ifs.dbrepo.gateway.DataServiceGateway; import at.ac.tuwien.ifs.dbrepo.service.*; import com.fasterxml.jackson.databind.ObjectMapper; -import lombok.extern.log4j.Log4j2; +import lombok.extern.slf4j.Slf4j; import org.apache.commons.io.FileUtils; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; @@ -44,7 +44,7 @@ import java.util.stream.Stream; import static org.junit.jupiter.api.Assertions.*; import static org.mockito.Mockito.*; -@Log4j2 +@Slf4j @ExtendWith(SpringExtension.class) @SpringBootTest public class IdentifierEndpointUnitTest extends BaseTest { diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/endpoints/ImageEndpointUnitTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/endpoints/ImageEndpointUnitTest.java index 9a1289a86b3b3884d030e0b4a63203ee16cd9cf1..c6e88e085746d1a35ee89603e9b0094decebf595 100644 --- a/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/endpoints/ImageEndpointUnitTest.java +++ b/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/endpoints/ImageEndpointUnitTest.java @@ -11,7 +11,7 @@ import at.ac.tuwien.ifs.dbrepo.core.exception.ImageNotFoundException; import at.ac.tuwien.ifs.dbrepo.core.mapper.MetadataMapper; import at.ac.tuwien.ifs.dbrepo.core.test.BaseTest; import at.ac.tuwien.ifs.dbrepo.service.impl.ImageServiceImpl; -import lombok.extern.log4j.Log4j2; +import lombok.extern.slf4j.Slf4j; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.springframework.beans.factory.annotation.Autowired; @@ -30,7 +30,7 @@ import java.util.UUID; import static org.junit.jupiter.api.Assertions.*; import static org.mockito.Mockito.*; -@Log4j2 +@Slf4j @ExtendWith(SpringExtension.class) @SpringBootTest public class ImageEndpointUnitTest extends BaseTest { diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/endpoints/LicenseEndpointUnitTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/endpoints/LicenseEndpointUnitTest.java index 765d16dc834d717659f08eecaa81e1021cc75ce5..5591983b91e655602c36110684e77b2beff6834a 100644 --- a/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/endpoints/LicenseEndpointUnitTest.java +++ b/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/endpoints/LicenseEndpointUnitTest.java @@ -3,7 +3,7 @@ package at.ac.tuwien.ifs.dbrepo.endpoints; import at.ac.tuwien.ifs.dbrepo.core.api.database.LicenseDto; import at.ac.tuwien.ifs.dbrepo.repository.LicenseRepository; import at.ac.tuwien.ifs.dbrepo.core.test.BaseTest; -import lombok.extern.log4j.Log4j2; +import lombok.extern.slf4j.Slf4j; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.springframework.beans.factory.annotation.Autowired; @@ -19,7 +19,7 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.mockito.Mockito.when; -@Log4j2 +@Slf4j @SpringBootTest @ExtendWith(SpringExtension.class) public class LicenseEndpointUnitTest extends BaseTest { diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/endpoints/MessageEndpointUnitTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/endpoints/MessageEndpointUnitTest.java index f31518e8e20bce9c0bbd6c2b296d91469dc9c693..0afe907bd3b8e82fa248708bf83763ef83ab3881 100644 --- a/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/endpoints/MessageEndpointUnitTest.java +++ b/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/endpoints/MessageEndpointUnitTest.java @@ -7,7 +7,7 @@ import at.ac.tuwien.ifs.dbrepo.core.entity.maintenance.BannerMessage; import at.ac.tuwien.ifs.dbrepo.core.exception.MessageNotFoundException; import at.ac.tuwien.ifs.dbrepo.service.BannerMessageService; import at.ac.tuwien.ifs.dbrepo.core.test.BaseTest; -import lombok.extern.log4j.Log4j2; +import lombok.extern.slf4j.Slf4j; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.springframework.beans.factory.annotation.Autowired; @@ -25,7 +25,7 @@ import java.util.UUID; import static org.junit.jupiter.api.Assertions.*; import static org.mockito.Mockito.*; -@Log4j2 +@Slf4j @SpringBootTest @ExtendWith(SpringExtension.class) public class MessageEndpointUnitTest extends BaseTest { diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/endpoints/MetadataEndpointUnitTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/endpoints/MetadataEndpointUnitTest.java index 012ca1f1c0dc4f8545959870357a96db674a8675..ec7b3982107cc330c0e25ff58b850c10c53f6d5a 100644 --- a/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/endpoints/MetadataEndpointUnitTest.java +++ b/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/endpoints/MetadataEndpointUnitTest.java @@ -5,7 +5,7 @@ import at.ac.tuwien.ifs.dbrepo.oaipmh.OaiRecordParameters; import at.ac.tuwien.ifs.dbrepo.repository.IdentifierRepository; import at.ac.tuwien.ifs.dbrepo.core.test.BaseTest; import at.ac.tuwien.ifs.dbrepo.utils.XmlUtils; -import lombok.extern.log4j.Log4j2; +import lombok.extern.slf4j.Slf4j; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.springframework.beans.factory.annotation.Autowired; @@ -23,7 +23,7 @@ import java.util.UUID; import static org.junit.jupiter.api.Assertions.*; import static org.mockito.Mockito.when; -@Log4j2 +@Slf4j @SpringBootTest @ExtendWith(SpringExtension.class) public class MetadataEndpointUnitTest extends BaseTest { diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/endpoints/OntologyEndpointUnitTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/endpoints/OntologyEndpointUnitTest.java index 3055de08cd09da60386ab44572e60c628697089a..18763f40826c860505af66113b1331e96bad09f4 100644 --- a/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/endpoints/OntologyEndpointUnitTest.java +++ b/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/endpoints/OntologyEndpointUnitTest.java @@ -8,7 +8,7 @@ import at.ac.tuwien.ifs.dbrepo.service.EntityService; import at.ac.tuwien.ifs.dbrepo.service.OntologyService; import at.ac.tuwien.ifs.dbrepo.service.UserService; import at.ac.tuwien.ifs.dbrepo.core.test.BaseTest; -import lombok.extern.log4j.Log4j2; +import lombok.extern.slf4j.Slf4j; import org.apache.jena.sys.JenaSystem; import org.hibernate.HibernateException; import org.junit.jupiter.api.BeforeAll; @@ -30,7 +30,7 @@ import java.util.UUID; import static org.junit.jupiter.api.Assertions.*; import static org.mockito.Mockito.*; -@Log4j2 +@Slf4j @SpringBootTest @ExtendWith(SpringExtension.class) public class OntologyEndpointUnitTest extends BaseTest { diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/endpoints/TableEndpointUnitTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/endpoints/TableEndpointUnitTest.java index 9c756b8311dd606157991343626a5e1ac84b1bcb..eeea825d64b9c31e781f67e0aa3ffa32bc503038 100644 --- a/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/endpoints/TableEndpointUnitTest.java +++ b/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/endpoints/TableEndpointUnitTest.java @@ -20,7 +20,7 @@ import at.ac.tuwien.ifs.dbrepo.core.exception.*; import at.ac.tuwien.ifs.dbrepo.service.*; import at.ac.tuwien.ifs.dbrepo.core.test.BaseTest; import at.ac.tuwien.ifs.dbrepo.validation.EndpointValidator; -import lombok.extern.log4j.Log4j2; +import lombok.extern.slf4j.Slf4j; import org.apache.jena.sys.JenaSystem; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; @@ -45,7 +45,7 @@ import java.util.stream.Stream; import static org.junit.jupiter.api.Assertions.*; import static org.mockito.Mockito.*; -@Log4j2 +@Slf4j @SpringBootTest @ExtendWith(SpringExtension.class) public class TableEndpointUnitTest extends BaseTest { diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/endpoints/UnitEndpointUnitTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/endpoints/UnitEndpointUnitTest.java index 77f8bebaa2c5f6f7172b43244de6434fda3ac548..27488468ca10abd4ecdd48d4001095bf99dfed4f 100644 --- a/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/endpoints/UnitEndpointUnitTest.java +++ b/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/endpoints/UnitEndpointUnitTest.java @@ -3,7 +3,7 @@ package at.ac.tuwien.ifs.dbrepo.endpoints; import at.ac.tuwien.ifs.dbrepo.core.api.database.table.columns.concepts.UnitDto; import at.ac.tuwien.ifs.dbrepo.service.UnitService; import at.ac.tuwien.ifs.dbrepo.core.test.BaseTest; -import lombok.extern.log4j.Log4j2; +import lombok.extern.slf4j.Slf4j; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.springframework.beans.factory.annotation.Autowired; @@ -21,7 +21,7 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.mockito.Mockito.when; -@Log4j2 +@Slf4j @SpringBootTest @ExtendWith(SpringExtension.class) public class UnitEndpointUnitTest extends BaseTest { diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/endpoints/UserEndpointUnitTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/endpoints/UserEndpointUnitTest.java index c24461a16400e5187ae3ac8656073fa9b0d7223f..65cbf3ce930ab151ec7533a0fd5951b3793ce644 100644 --- a/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/endpoints/UserEndpointUnitTest.java +++ b/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/endpoints/UserEndpointUnitTest.java @@ -10,7 +10,7 @@ import at.ac.tuwien.ifs.dbrepo.core.exception.NotAllowedException; import at.ac.tuwien.ifs.dbrepo.core.exception.UserNotFoundException; import at.ac.tuwien.ifs.dbrepo.service.UserService; import at.ac.tuwien.ifs.dbrepo.core.test.BaseTest; -import lombok.extern.log4j.Log4j2; +import lombok.extern.slf4j.Slf4j; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.springframework.beans.factory.annotation.Autowired; @@ -33,7 +33,7 @@ import static org.junit.jupiter.api.Assertions.*; import static org.mockito.Mockito.doThrow; import static org.mockito.Mockito.when; -@Log4j2 +@Slf4j @SpringBootTest @ExtendWith(SpringExtension.class) public class UserEndpointUnitTest extends BaseTest { diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/endpoints/ViewEndpointUnitTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/endpoints/ViewEndpointUnitTest.java index d0cb350758e2de484a6ab82871690f1f76183a80..595f20d90727e5cf5126c739d01d4c2633f7621c 100644 --- a/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/endpoints/ViewEndpointUnitTest.java +++ b/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/endpoints/ViewEndpointUnitTest.java @@ -11,7 +11,7 @@ import at.ac.tuwien.ifs.dbrepo.core.entity.user.User; import at.ac.tuwien.ifs.dbrepo.core.exception.*; import at.ac.tuwien.ifs.dbrepo.service.*; import at.ac.tuwien.ifs.dbrepo.core.test.BaseTest; -import lombok.extern.log4j.Log4j2; +import lombok.extern.slf4j.Slf4j; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.springframework.beans.factory.annotation.Autowired; @@ -31,7 +31,7 @@ import java.util.UUID; import static org.junit.jupiter.api.Assertions.*; import static org.mockito.Mockito.*; -@Log4j2 +@Slf4j @SpringBootTest @ExtendWith(SpringExtension.class) public class ViewEndpointUnitTest extends BaseTest { diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/entity/EntitiesUnitTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/entity/EntitiesUnitTest.java index 32f5b79f667b36135c06cb7f3447a36dd29d08c1..2bbc1cee531f53f197d3fab6b21d49cb76f8b399 100644 --- a/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/entity/EntitiesUnitTest.java +++ b/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/entity/EntitiesUnitTest.java @@ -1,14 +1,14 @@ package at.ac.tuwien.ifs.dbrepo.core.entity; import at.ac.tuwien.ifs.dbrepo.core.test.BaseTest; -import lombok.extern.log4j.Log4j2; +import lombok.extern.slf4j.Slf4j; import org.junit.jupiter.api.Test; import java.util.UUID; import static org.junit.jupiter.api.Assertions.assertEquals; -@Log4j2 +@Slf4j public class EntitiesUnitTest extends BaseTest { @Test diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/gateway/BrokerServiceGatewayUnitTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/gateway/BrokerServiceGatewayUnitTest.java index e8d2b0192303cf32a428759de306c5f437e87ebd..b1002c5d4acdd32cf3000f43b6ebb75d22c1204a 100644 --- a/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/gateway/BrokerServiceGatewayUnitTest.java +++ b/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/gateway/BrokerServiceGatewayUnitTest.java @@ -4,7 +4,7 @@ import at.ac.tuwien.ifs.dbrepo.core.api.amqp.GrantExchangePermissionsDto; import at.ac.tuwien.ifs.dbrepo.core.exception.BrokerServiceConnectionException; import at.ac.tuwien.ifs.dbrepo.core.exception.BrokerServiceException; import at.ac.tuwien.ifs.dbrepo.core.test.BaseTest; -import lombok.extern.log4j.Log4j2; +import lombok.extern.slf4j.Slf4j; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.springframework.beans.factory.annotation.Autowired; @@ -23,7 +23,7 @@ import org.springframework.web.client.RestTemplate; import static org.junit.jupiter.api.Assertions.assertThrows; import static org.mockito.Mockito.*; -@Log4j2 +@Slf4j @SpringBootTest @ExtendWith(SpringExtension.class) public class BrokerServiceGatewayUnitTest extends BaseTest { diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/gateway/CrossRefGatewayUnitTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/gateway/CrossRefGatewayUnitTest.java index 7513622f37a0dc8f50f13611715097bf0b8c2787..c47bad3a3e95a8b04dc392e7082a82093cf37d9e 100644 --- a/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/gateway/CrossRefGatewayUnitTest.java +++ b/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/gateway/CrossRefGatewayUnitTest.java @@ -3,7 +3,7 @@ package at.ac.tuwien.ifs.dbrepo.gateway; import at.ac.tuwien.ifs.dbrepo.core.api.crossref.CrossRefDto; import at.ac.tuwien.ifs.dbrepo.core.exception.DoiNotFoundException; import at.ac.tuwien.ifs.dbrepo.core.test.BaseTest; -import lombok.extern.log4j.Log4j2; +import lombok.extern.slf4j.Slf4j; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.springframework.beans.factory.annotation.Autowired; @@ -21,7 +21,7 @@ import org.springframework.web.client.RestTemplate; import static org.junit.jupiter.api.Assertions.assertThrows; import static org.mockito.Mockito.*; -@Log4j2 +@Slf4j @SpringBootTest @ExtendWith(SpringExtension.class) public class CrossRefGatewayUnitTest extends BaseTest { diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/gateway/DashboardServiceGatewayUnitTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/gateway/DashboardServiceGatewayUnitTest.java index c1a60d0115d5c02e81ff49d13bcb6a486cccd12a..4af9c6b30e09048604981894bb962cce3d0d7d88 100644 --- a/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/gateway/DashboardServiceGatewayUnitTest.java +++ b/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/gateway/DashboardServiceGatewayUnitTest.java @@ -5,7 +5,7 @@ import at.ac.tuwien.ifs.dbrepo.core.api.grafana.PermissionTypeDto; import at.ac.tuwien.ifs.dbrepo.core.exception.DashboardServiceConnectionException; import at.ac.tuwien.ifs.dbrepo.core.exception.DashboardServiceException; import at.ac.tuwien.ifs.dbrepo.core.test.BaseTest; -import lombok.extern.log4j.Log4j2; +import lombok.extern.slf4j.Slf4j; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.springframework.beans.factory.annotation.Autowired; @@ -27,7 +27,7 @@ import static org.mockito.ArgumentMatchers.*; import static org.mockito.Mockito.doThrow; import static org.mockito.Mockito.when; -@Log4j2 +@Slf4j @SpringBootTest @ExtendWith(SpringExtension.class) public class DashboardServiceGatewayUnitTest extends BaseTest { diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/gateway/DataServiceGatewayUnitTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/gateway/DataServiceGatewayUnitTest.java index 14df28608a18d6bddd5519abb67b8bcb20a09113..19e7929430b4d9b15700ef06b7d246812491fb61 100644 --- a/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/gateway/DataServiceGatewayUnitTest.java +++ b/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/gateway/DataServiceGatewayUnitTest.java @@ -8,7 +8,7 @@ import at.ac.tuwien.ifs.dbrepo.core.api.database.table.TableDto; import at.ac.tuwien.ifs.dbrepo.core.api.database.table.TableStatisticDto; import at.ac.tuwien.ifs.dbrepo.core.exception.*; import at.ac.tuwien.ifs.dbrepo.core.test.BaseTest; -import lombok.extern.log4j.Log4j2; +import lombok.extern.slf4j.Slf4j; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.springframework.beans.factory.annotation.Autowired; @@ -29,7 +29,7 @@ import static org.mockito.ArgumentMatchers.*; import static org.mockito.Mockito.doThrow; import static org.mockito.Mockito.when; -@Log4j2 +@Slf4j @SpringBootTest @ExtendWith(SpringExtension.class) public class DataServiceGatewayUnitTest extends BaseTest { diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/gateway/KeycloakGatewayIntegrationTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/gateway/KeycloakGatewayIntegrationTest.java index 40d8eab970de1ae48e0fa39005cba88b7c9ae2bd..f8266772b9780363f099274d33ed13a8ef0cd2e4 100644 --- a/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/gateway/KeycloakGatewayIntegrationTest.java +++ b/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/gateway/KeycloakGatewayIntegrationTest.java @@ -6,7 +6,7 @@ import at.ac.tuwien.ifs.dbrepo.gateway.impl.KeycloakGatewayImpl; import at.ac.tuwien.ifs.dbrepo.core.test.BaseTest; import at.ac.tuwien.ifs.dbrepo.utils.KeycloakUtils; import dasniko.testcontainers.keycloak.KeycloakContainer; -import lombok.extern.log4j.Log4j2; +import lombok.extern.slf4j.Slf4j; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; @@ -22,7 +22,7 @@ import org.testcontainers.junit.jupiter.Testcontainers; import static org.junit.jupiter.api.Assertions.*; -@Log4j2 +@Slf4j @SpringBootTest @Testcontainers @ExtendWith(SpringExtension.class) diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/gateway/OrcidGatewayUnitTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/gateway/OrcidGatewayUnitTest.java index 31d8baeab55a9122b1ea7b252a59446a31aa58eb..8cc81d89c6730eaa9fcf37899d08f117cdb992d7 100644 --- a/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/gateway/OrcidGatewayUnitTest.java +++ b/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/gateway/OrcidGatewayUnitTest.java @@ -3,7 +3,7 @@ package at.ac.tuwien.ifs.dbrepo.gateway; import at.ac.tuwien.ifs.dbrepo.core.test.BaseTest; import at.ac.tuwien.ifs.dbrepo.core.api.orcid.OrcidDto; import at.ac.tuwien.ifs.dbrepo.core.exception.OrcidNotFoundException; -import lombok.extern.log4j.Log4j2; +import lombok.extern.slf4j.Slf4j; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.springframework.beans.factory.annotation.Autowired; @@ -22,7 +22,7 @@ import java.io.IOException; import static org.junit.jupiter.api.Assertions.assertThrows; import static org.mockito.Mockito.*; -@Log4j2 +@Slf4j @SpringBootTest @ExtendWith(SpringExtension.class) public class OrcidGatewayUnitTest extends BaseTest { diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/gateway/RorGatewayUnitTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/gateway/RorGatewayUnitTest.java index b8b100c413761cbed6b57738146c1001345e70a6..f6b46031065b92bb7352cc3316b767f8b404fc73 100644 --- a/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/gateway/RorGatewayUnitTest.java +++ b/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/gateway/RorGatewayUnitTest.java @@ -3,7 +3,7 @@ package at.ac.tuwien.ifs.dbrepo.gateway; import at.ac.tuwien.ifs.dbrepo.core.api.ror.RorDto; import at.ac.tuwien.ifs.dbrepo.core.exception.RorNotFoundException; import at.ac.tuwien.ifs.dbrepo.core.test.BaseTest; -import lombok.extern.log4j.Log4j2; +import lombok.extern.slf4j.Slf4j; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.springframework.beans.factory.annotation.Autowired; @@ -20,7 +20,7 @@ import org.springframework.web.client.RestTemplate; import static org.junit.jupiter.api.Assertions.assertThrows; import static org.mockito.Mockito.*; -@Log4j2 +@Slf4j @SpringBootTest @ExtendWith(SpringExtension.class) public class RorGatewayUnitTest extends BaseTest { diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/gateway/SearchServiceGatewayUnitTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/gateway/SearchServiceGatewayUnitTest.java index 3ff4a3a508b19a2c29f10df1b9bcabfaf2448980..61c5fae3a320be2ff28d1c2300da20b899ebf7ab 100644 --- a/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/gateway/SearchServiceGatewayUnitTest.java +++ b/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/gateway/SearchServiceGatewayUnitTest.java @@ -5,7 +5,7 @@ import at.ac.tuwien.ifs.dbrepo.core.exception.DatabaseNotFoundException; import at.ac.tuwien.ifs.dbrepo.core.exception.SearchServiceConnectionException; import at.ac.tuwien.ifs.dbrepo.core.exception.SearchServiceException; import at.ac.tuwien.ifs.dbrepo.core.test.BaseTest; -import lombok.extern.log4j.Log4j2; +import lombok.extern.slf4j.Slf4j; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.springframework.beans.factory.annotation.Autowired; @@ -24,7 +24,7 @@ import org.springframework.web.client.RestTemplate; import static org.junit.jupiter.api.Assertions.assertThrows; import static org.mockito.Mockito.*; -@Log4j2 +@Slf4j @SpringBootTest @ExtendWith(SpringExtension.class) public class SearchServiceGatewayUnitTest extends BaseTest { diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/handlers/ApiExceptionHandlerTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/handlers/ApiExceptionHandlerTest.java index 7ab54f089c254c22b1f17af4622f6d65fe4a4044..fadbea76c7201ad892cb74d0e3c4c097b13c5694 100644 --- a/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/handlers/ApiExceptionHandlerTest.java +++ b/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/handlers/ApiExceptionHandlerTest.java @@ -5,7 +5,7 @@ import at.ac.tuwien.ifs.dbrepo.core.exception.*; import at.ac.tuwien.ifs.dbrepo.core.test.BaseTest; import com.auth0.jwt.exceptions.TokenExpiredException; import jakarta.ws.rs.NotAuthorizedException; -import lombok.extern.log4j.Log4j2; +import lombok.extern.slf4j.Slf4j; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; @@ -27,7 +27,7 @@ import static at.ac.tuwien.ifs.dbrepo.core.test.utils.EndpointUtils.getErrorCode import static at.ac.tuwien.ifs.dbrepo.core.test.utils.EndpointUtils.getExceptions; import static org.junit.jupiter.api.Assertions.*; -@Log4j2 +@Slf4j @ExtendWith(SpringExtension.class) @SpringBootTest public class ApiExceptionHandlerTest extends BaseTest { diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/mapper/MetadataMapperUnitTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/mapper/MetadataMapperUnitTest.java index 0b3c5fdf68712c95cf1b72f5639bb75c235caaf1..10c2c09766192731d5413e62a26d191101baa45f 100644 --- a/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/mapper/MetadataMapperUnitTest.java +++ b/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/mapper/MetadataMapperUnitTest.java @@ -6,7 +6,7 @@ import at.ac.tuwien.ifs.dbrepo.core.entity.identifier.Identifier; import at.ac.tuwien.ifs.dbrepo.core.entity.identifier.IdentifierType; import at.ac.tuwien.ifs.dbrepo.core.mapper.MetadataMapper; import at.ac.tuwien.ifs.dbrepo.core.test.BaseTest; -import lombok.extern.log4j.Log4j2; +import lombok.extern.slf4j.Slf4j; import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.Arguments; @@ -22,7 +22,7 @@ import java.util.stream.Stream; import static org.junit.jupiter.api.Assertions.*; -@Log4j2 +@Slf4j @SpringBootTest public class MetadataMapperUnitTest extends BaseTest { diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/mvc/ActuatorEndpointMvcTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/mvc/ActuatorEndpointMvcTest.java index 7d8c74437a1204dda49c7f18bdaba94ff668d01e..c17587d97fea435d79acd9ee67df5940840cc461 100644 --- a/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/mvc/ActuatorEndpointMvcTest.java +++ b/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/mvc/ActuatorEndpointMvcTest.java @@ -1,7 +1,7 @@ package at.ac.tuwien.ifs.dbrepo.mvc; import at.ac.tuwien.ifs.dbrepo.core.test.BaseTest; -import lombok.extern.log4j.Log4j2; +import lombok.extern.slf4j.Slf4j; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.springframework.beans.factory.annotation.Autowired; @@ -15,7 +15,7 @@ import static org.springframework.test.web.servlet.request.MockMvcRequestBuilder import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; -@Log4j2 +@Slf4j @ExtendWith(SpringExtension.class) @AutoConfigureMockMvc @SpringBootTest diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/mvc/AuthenticationPrivilegedIntegrationMvcTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/mvc/AuthenticationPrivilegedIntegrationMvcTest.java index 9a6354453b14b5248f0828769ea89e9334928ca5..1384226856975ec09a6f2f024b3a8c26e96fb6dd 100644 --- a/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/mvc/AuthenticationPrivilegedIntegrationMvcTest.java +++ b/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/mvc/AuthenticationPrivilegedIntegrationMvcTest.java @@ -13,7 +13,7 @@ import at.ac.tuwien.ifs.dbrepo.core.test.BaseTest; import at.ac.tuwien.ifs.dbrepo.utils.KeycloakUtils; import dasniko.testcontainers.keycloak.KeycloakContainer; import jakarta.transaction.Transactional; -import lombok.extern.log4j.Log4j2; +import lombok.extern.slf4j.Slf4j; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; @@ -36,7 +36,7 @@ import static org.springframework.test.web.servlet.result.MockMvcResultHandlers. import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.header; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; -@Log4j2 +@Slf4j @ExtendWith(SpringExtension.class) @AutoConfigureMockMvc @Testcontainers diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/mvc/IdentifierEndpointMvcTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/mvc/IdentifierEndpointMvcTest.java index b0cdca73e25243c1f59a8b3069bc6926a4e386cc..31c949829fec41a614649654efc29315696c4a16 100644 --- a/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/mvc/IdentifierEndpointMvcTest.java +++ b/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/mvc/IdentifierEndpointMvcTest.java @@ -3,7 +3,7 @@ package at.ac.tuwien.ifs.dbrepo.mvc; import at.ac.tuwien.ifs.dbrepo.gateway.OrcidGateway; import at.ac.tuwien.ifs.dbrepo.core.test.BaseTest; import com.mchange.io.FileUtils; -import lombok.extern.log4j.Log4j2; +import lombok.extern.slf4j.Slf4j; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.springframework.beans.factory.annotation.Autowired; @@ -23,7 +23,7 @@ import static org.springframework.test.web.servlet.result.MockMvcResultHandlers. import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; -@Log4j2 +@Slf4j @ExtendWith(SpringExtension.class) @AutoConfigureMockMvc @SpringBootTest diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/mvc/MetadataEndpointMvcTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/mvc/MetadataEndpointMvcTest.java index 870251323e0af7913d07da4bf24872a94e7544bf..4094b7e52dbd26eb1e98b3e9512c3decc956fde2 100644 --- a/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/mvc/MetadataEndpointMvcTest.java +++ b/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/mvc/MetadataEndpointMvcTest.java @@ -3,7 +3,7 @@ package at.ac.tuwien.ifs.dbrepo.mvc; import at.ac.tuwien.ifs.dbrepo.config.MetadataConfig; import at.ac.tuwien.ifs.dbrepo.repository.IdentifierRepository; import at.ac.tuwien.ifs.dbrepo.core.test.BaseTest; -import lombok.extern.log4j.Log4j2; +import lombok.extern.slf4j.Slf4j; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.springframework.beans.factory.annotation.Autowired; @@ -22,7 +22,7 @@ import static org.springframework.test.web.servlet.request.MockMvcRequestBuilder import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*; -@Log4j2 +@Slf4j @ExtendWith(SpringExtension.class) @DirtiesContext(classMode = DirtiesContext.ClassMode.BEFORE_EACH_TEST_METHOD) @AutoConfigureMockMvc diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/mvc/OpenApiEndpointMvcTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/mvc/OpenApiEndpointMvcTest.java index 0d37944ba9baa546d3e499efd002218e13360354..c90a8381e3ed3d241e841a851e103e4ee130d4f1 100644 --- a/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/mvc/OpenApiEndpointMvcTest.java +++ b/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/mvc/OpenApiEndpointMvcTest.java @@ -6,7 +6,7 @@ import at.ac.tuwien.ifs.dbrepo.core.test.BaseTest; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.media.Content; import io.swagger.v3.oas.annotations.responses.ApiResponse; -import lombok.extern.log4j.Log4j2; +import lombok.extern.slf4j.Slf4j; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.springframework.beans.factory.annotation.Autowired; @@ -26,7 +26,7 @@ import static org.springframework.test.web.servlet.request.MockMvcRequestBuilder import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; -@Log4j2 +@Slf4j @ExtendWith(SpringExtension.class) @AutoConfigureMockMvc @SpringBootTest diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/mvc/PrometheusEndpointMvcTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/mvc/PrometheusEndpointMvcTest.java index f3a15c7f3f840530b7ca72f80277dab34b8b2ac1..90f79350f7a5e1249c5821b77e4a65658aa20126 100644 --- a/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/mvc/PrometheusEndpointMvcTest.java +++ b/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/mvc/PrometheusEndpointMvcTest.java @@ -11,7 +11,7 @@ import at.ac.tuwien.ifs.dbrepo.core.mapper.MetadataMapper; import at.ac.tuwien.ifs.dbrepo.endpoints.*; import at.ac.tuwien.ifs.dbrepo.core.test.BaseTest; import io.micrometer.observation.tck.TestObservationRegistry; -import lombok.extern.log4j.Log4j2; +import lombok.extern.slf4j.Slf4j; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.springframework.beans.factory.annotation.Autowired; @@ -33,7 +33,7 @@ import static org.springframework.test.web.servlet.request.MockMvcRequestBuilder import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; -@Log4j2 +@Slf4j @ExtendWith(SpringExtension.class) @AutoConfigureMockMvc @SpringBootTest diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/service/AccessServiceUnitTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/service/AccessServiceUnitTest.java index 17a7cb32f84e6b39ebead7f7ea81672604c5d259..52093cb5d52495a1cc513998d3e88b43b2755aba 100644 --- a/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/service/AccessServiceUnitTest.java +++ b/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/service/AccessServiceUnitTest.java @@ -8,7 +8,7 @@ import at.ac.tuwien.ifs.dbrepo.core.entity.database.DatabaseAccess; import at.ac.tuwien.ifs.dbrepo.core.exception.*; import at.ac.tuwien.ifs.dbrepo.repository.DatabaseRepository; import at.ac.tuwien.ifs.dbrepo.core.test.BaseTest; -import lombok.extern.log4j.Log4j2; +import lombok.extern.slf4j.Slf4j; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.springframework.beans.factory.annotation.Autowired; @@ -30,7 +30,7 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertThrows; import static org.mockito.Mockito.*; -@Log4j2 +@Slf4j @SpringBootTest @ExtendWith(SpringExtension.class) public class AccessServiceUnitTest extends BaseTest { diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/service/AuthenticationServiceIntegrationTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/service/AuthenticationServiceIntegrationTest.java index 016e0f949b23d7db857c4944f015753e20defa34..b6739d8139ea07d28a83e78179718e907cbeb871 100644 --- a/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/service/AuthenticationServiceIntegrationTest.java +++ b/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/service/AuthenticationServiceIntegrationTest.java @@ -6,7 +6,7 @@ import at.ac.tuwien.ifs.dbrepo.gateway.KeycloakGateway; import at.ac.tuwien.ifs.dbrepo.core.test.BaseTest; import at.ac.tuwien.ifs.dbrepo.utils.KeycloakUtils; import dasniko.testcontainers.keycloak.KeycloakContainer; -import lombok.extern.log4j.Log4j2; +import lombok.extern.slf4j.Slf4j; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.springframework.beans.factory.annotation.Autowired; @@ -21,7 +21,7 @@ import org.testcontainers.junit.jupiter.Testcontainers; import java.util.UUID; -@Log4j2 +@Slf4j @Testcontainers @DirtiesContext(classMode = DirtiesContext.ClassMode.BEFORE_EACH_TEST_METHOD) @SpringBootTest diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/service/BrokerServiceIntegrationTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/service/BrokerServiceIntegrationTest.java index ada49fbd9a165b8e8b303306b7306e4900895aba..30a4cd53af123fc25be28bedd14d3c4c95ca04db 100644 --- a/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/service/BrokerServiceIntegrationTest.java +++ b/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/service/BrokerServiceIntegrationTest.java @@ -11,7 +11,7 @@ import at.ac.tuwien.ifs.dbrepo.core.exception.BrokerServiceConnectionException; import at.ac.tuwien.ifs.dbrepo.core.exception.BrokerServiceException; import at.ac.tuwien.ifs.dbrepo.core.test.BaseTest; import at.ac.tuwien.ifs.dbrepo.utils.AmqpUtils; -import lombok.extern.log4j.Log4j2; +import lombok.extern.slf4j.Slf4j; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.springframework.beans.factory.annotation.Autowired; @@ -30,7 +30,7 @@ import java.util.Set; import static org.junit.jupiter.api.Assertions.assertEquals; -@Log4j2 +@Slf4j @Testcontainers @SpringBootTest @ExtendWith(SpringExtension.class) diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/service/ConceptServiceUnitTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/service/ConceptServiceUnitTest.java index 67f14f3ebb6e9f236512cf06a8a86f9cc3d777ae..2cd8f63ae80c29c6001e1eb5e9f41891df534b6a 100644 --- a/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/service/ConceptServiceUnitTest.java +++ b/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/service/ConceptServiceUnitTest.java @@ -4,7 +4,7 @@ import at.ac.tuwien.ifs.dbrepo.core.entity.database.table.columns.TableColumnCon import at.ac.tuwien.ifs.dbrepo.core.exception.ConceptNotFoundException; import at.ac.tuwien.ifs.dbrepo.repository.ConceptRepository; import at.ac.tuwien.ifs.dbrepo.core.test.BaseTest; -import lombok.extern.log4j.Log4j2; +import lombok.extern.slf4j.Slf4j; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.springframework.beans.factory.annotation.Autowired; @@ -19,7 +19,7 @@ import static org.junit.jupiter.api.Assertions.*; import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.Mockito.when; -@Log4j2 +@Slf4j @SpringBootTest @ExtendWith(SpringExtension.class) public class ConceptServiceUnitTest extends BaseTest { diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/service/ContainerServiceUnitTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/service/ContainerServiceUnitTest.java index e8e17ea3ae3ec1f7d0438f9e06d53aa4dc837e33..9c6c019ab12e602520d594c0ee0b9f46a5436b8c 100644 --- a/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/service/ContainerServiceUnitTest.java +++ b/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/service/ContainerServiceUnitTest.java @@ -8,7 +8,7 @@ import at.ac.tuwien.ifs.dbrepo.core.exception.ImageNotFoundException; import at.ac.tuwien.ifs.dbrepo.repository.ContainerRepository; import at.ac.tuwien.ifs.dbrepo.repository.ImageRepository; import at.ac.tuwien.ifs.dbrepo.core.test.BaseTest; -import lombok.extern.log4j.Log4j2; +import lombok.extern.slf4j.Slf4j; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.springframework.beans.factory.annotation.Autowired; @@ -28,7 +28,7 @@ import static org.junit.jupiter.api.Assertions.assertThrows; import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.when; -@Log4j2 +@Slf4j @SpringBootTest @ExtendWith(SpringExtension.class) public class ContainerServiceUnitTest extends BaseTest { diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/service/DatabaseServicePersistenceTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/service/DatabaseServicePersistenceTest.java index 2bb1d9e89d665f0bb0a389ad167faac38d09315a..76dda924f1c3b24ae7dcc83b49d3992da525a3b6 100644 --- a/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/service/DatabaseServicePersistenceTest.java +++ b/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/service/DatabaseServicePersistenceTest.java @@ -7,7 +7,7 @@ import at.ac.tuwien.ifs.dbrepo.repository.DatabaseRepository; import at.ac.tuwien.ifs.dbrepo.repository.LicenseRepository; import at.ac.tuwien.ifs.dbrepo.repository.UserRepository; import at.ac.tuwien.ifs.dbrepo.core.test.BaseTest; -import lombok.extern.log4j.Log4j2; +import lombok.extern.slf4j.Slf4j; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; @@ -21,7 +21,7 @@ import java.util.List; import static org.junit.jupiter.api.Assertions.assertEquals; -@Log4j2 +@Slf4j @SpringBootTest @DirtiesContext(classMode = DirtiesContext.ClassMode.BEFORE_EACH_TEST_METHOD) @ExtendWith(SpringExtension.class) diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/service/DatabaseServiceUnitTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/service/DatabaseServiceUnitTest.java index b2f42bd167d1814ed93f1f0cbdd1bbe5c0bf1030..b33d1cb800a1cc7c55009ca83a18e00410bae68e 100644 --- a/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/service/DatabaseServiceUnitTest.java +++ b/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/service/DatabaseServiceUnitTest.java @@ -11,7 +11,7 @@ import at.ac.tuwien.ifs.dbrepo.gateway.DataServiceGateway; import at.ac.tuwien.ifs.dbrepo.gateway.SearchServiceGateway; import at.ac.tuwien.ifs.dbrepo.repository.DatabaseRepository; import at.ac.tuwien.ifs.dbrepo.core.test.BaseTest; -import lombok.extern.log4j.Log4j2; +import lombok.extern.slf4j.Slf4j; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.springframework.beans.factory.annotation.Autowired; @@ -28,7 +28,7 @@ import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.*; -@Log4j2 +@Slf4j @SpringBootTest @ExtendWith(SpringExtension.class) public class DatabaseServiceUnitTest extends BaseTest { diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/service/EntityServiceUnitTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/service/EntityServiceUnitTest.java index 27987dd6b43c518a5f301241e762c4186e6b83c8..623df8cfe95b33a535198f212646816e2c59f3b2 100644 --- a/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/service/EntityServiceUnitTest.java +++ b/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/service/EntityServiceUnitTest.java @@ -6,7 +6,7 @@ import at.ac.tuwien.ifs.dbrepo.core.exception.MalformedException; import at.ac.tuwien.ifs.dbrepo.core.exception.OntologyNotFoundException; import at.ac.tuwien.ifs.dbrepo.core.exception.SemanticEntityNotFoundException; import at.ac.tuwien.ifs.dbrepo.core.test.BaseTest; -import lombok.extern.log4j.Log4j2; +import lombok.extern.slf4j.Slf4j; import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; @@ -22,7 +22,7 @@ import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.Mockito.doThrow; import static org.mockito.Mockito.when; -@Log4j2 +@Slf4j @SpringBootTest @ExtendWith(SpringExtension.class) public class EntityServiceUnitTest extends BaseTest { diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/service/IdentifierServicePersistenceTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/service/IdentifierServicePersistenceTest.java index 259680ad1a23f95ef0d222ee19850f5876898c4a..a2e01768775e0f81e9cc6eccf9752536ae9e67eb 100644 --- a/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/service/IdentifierServicePersistenceTest.java +++ b/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/service/IdentifierServicePersistenceTest.java @@ -14,7 +14,7 @@ import at.ac.tuwien.ifs.dbrepo.repository.ContainerRepository; import at.ac.tuwien.ifs.dbrepo.repository.DatabaseRepository; import at.ac.tuwien.ifs.dbrepo.repository.LicenseRepository; import at.ac.tuwien.ifs.dbrepo.repository.UserRepository; -import lombok.extern.log4j.Log4j2; +import lombok.extern.slf4j.Slf4j; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; @@ -38,7 +38,7 @@ import static org.junit.jupiter.api.Assertions.*; import static org.mockito.ArgumentMatchers.*; import static org.mockito.Mockito.when; -@Log4j2 +@Slf4j @SpringBootTest @ExtendWith(SpringExtension.class) @DirtiesContext(classMode = DirtiesContext.ClassMode.BEFORE_EACH_TEST_METHOD) diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/service/ImageServicePersistenceTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/service/ImageServicePersistenceTest.java index 8e597f5c6b8f9e3b048ba4ac8e85f2579e8c698c..bbd29b455fb46f79b911ae959fcf747bf9ee3acf 100644 --- a/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/service/ImageServicePersistenceTest.java +++ b/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/service/ImageServicePersistenceTest.java @@ -6,7 +6,7 @@ import at.ac.tuwien.ifs.dbrepo.core.exception.ImageInvalidException; import at.ac.tuwien.ifs.dbrepo.repository.ContainerRepository; import at.ac.tuwien.ifs.dbrepo.repository.ImageRepository; import at.ac.tuwien.ifs.dbrepo.core.test.BaseTest; -import lombok.extern.log4j.Log4j2; +import lombok.extern.slf4j.Slf4j; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; @@ -17,7 +17,7 @@ import org.springframework.test.context.junit.jupiter.SpringExtension; import static org.junit.jupiter.api.Assertions.*; -@Log4j2 +@Slf4j @DirtiesContext(classMode = DirtiesContext.ClassMode.BEFORE_EACH_TEST_METHOD) @ExtendWith(SpringExtension.class) @SpringBootTest diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/service/LicenseServiceUnitTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/service/LicenseServiceUnitTest.java index 417c50424fb5280f6a22fc710782deb94d3839d8..6a81b7cdaac0adea08a1455f81781590b85c62b0 100644 --- a/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/service/LicenseServiceUnitTest.java +++ b/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/service/LicenseServiceUnitTest.java @@ -4,7 +4,7 @@ import at.ac.tuwien.ifs.dbrepo.core.entity.database.License; import at.ac.tuwien.ifs.dbrepo.core.exception.LicenseNotFoundException; import at.ac.tuwien.ifs.dbrepo.repository.LicenseRepository; import at.ac.tuwien.ifs.dbrepo.core.test.BaseTest; -import lombok.extern.log4j.Log4j2; +import lombok.extern.slf4j.Slf4j; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.springframework.beans.factory.annotation.Autowired; @@ -20,7 +20,7 @@ import static org.junit.jupiter.api.Assertions.assertThrows; import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.Mockito.when; -@Log4j2 +@Slf4j @SpringBootTest @ExtendWith(SpringExtension.class) public class LicenseServiceUnitTest extends BaseTest { diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/service/MessageServiceUnitTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/service/MessageServiceUnitTest.java index 0fb606d6dfea57eb506fa10d1d9ce7f3a99b714c..e5b9cf1c5336671846068c1b8f8117396b7210c0 100644 --- a/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/service/MessageServiceUnitTest.java +++ b/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/service/MessageServiceUnitTest.java @@ -6,7 +6,7 @@ import at.ac.tuwien.ifs.dbrepo.core.entity.maintenance.BannerMessage; import at.ac.tuwien.ifs.dbrepo.core.exception.MessageNotFoundException; import at.ac.tuwien.ifs.dbrepo.repository.BannerMessageRepository; import at.ac.tuwien.ifs.dbrepo.core.test.BaseTest; -import lombok.extern.log4j.Log4j2; +import lombok.extern.slf4j.Slf4j; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.springframework.beans.factory.annotation.Autowired; @@ -24,7 +24,7 @@ import static org.junit.jupiter.api.Assertions.assertThrows; import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.when; -@Log4j2 +@Slf4j @DirtiesContext(classMode = DirtiesContext.ClassMode.BEFORE_EACH_TEST_METHOD) @SpringBootTest @ExtendWith(SpringExtension.class) diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/service/MetadataServiceUnitTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/service/MetadataServiceUnitTest.java index f96d6807f0071d9c3ee7b2a64c6846559022b80e..5d39034a48774e97246fc67ba7b72ef6459438e6 100644 --- a/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/service/MetadataServiceUnitTest.java +++ b/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/service/MetadataServiceUnitTest.java @@ -15,7 +15,7 @@ import at.ac.tuwien.ifs.dbrepo.oaipmh.OaiListIdentifiersParameters; import at.ac.tuwien.ifs.dbrepo.oaipmh.OaiRecordParameters; import com.fasterxml.jackson.databind.DeserializationFeature; import com.fasterxml.jackson.databind.ObjectMapper; -import lombok.extern.log4j.Log4j2; +import lombok.extern.slf4j.Slf4j; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.springframework.beans.factory.annotation.Autowired; @@ -36,7 +36,7 @@ import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.Mockito.doThrow; import static org.mockito.Mockito.when; -@Log4j2 +@Slf4j @SpringBootTest @ExtendWith(SpringExtension.class) public class MetadataServiceUnitTest extends BaseTest { diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/service/StorageServiceIntegrationTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/service/StorageServiceIntegrationTest.java index 21c2f6199a058fddc777e509fa144199510c21d4..d0eef70f72e828a7740d4d331218acc93c24d96b 100644 --- a/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/service/StorageServiceIntegrationTest.java +++ b/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/service/StorageServiceIntegrationTest.java @@ -4,7 +4,7 @@ import at.ac.tuwien.ifs.dbrepo.config.S3Config; import at.ac.tuwien.ifs.dbrepo.core.exception.StorageNotFoundException; import at.ac.tuwien.ifs.dbrepo.core.exception.StorageUnavailableException; import at.ac.tuwien.ifs.dbrepo.core.test.BaseTest; -import lombok.extern.log4j.Log4j2; +import lombok.extern.slf4j.Slf4j; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; @@ -29,7 +29,7 @@ import java.sql.SQLException; import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertThrows; -@Log4j2 +@Slf4j @Testcontainers @DirtiesContext(classMode = DirtiesContext.ClassMode.BEFORE_EACH_TEST_METHOD) @SpringBootTest diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/service/TableServicePersistenceTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/service/TableServicePersistenceTest.java index 9cdacb06b3296ff87581f8f6e59c34f61828d8a5..6df54fc71e0f718e694700caf5e2ce62b206d94c 100644 --- a/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/service/TableServicePersistenceTest.java +++ b/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/service/TableServicePersistenceTest.java @@ -19,7 +19,7 @@ import at.ac.tuwien.ifs.dbrepo.repository.DatabaseRepository; import at.ac.tuwien.ifs.dbrepo.repository.LicenseRepository; import at.ac.tuwien.ifs.dbrepo.repository.UserRepository; import at.ac.tuwien.ifs.dbrepo.core.test.BaseTest; -import lombok.extern.log4j.Log4j2; +import lombok.extern.slf4j.Slf4j; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; @@ -38,7 +38,7 @@ import static org.junit.jupiter.api.Assertions.*; import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.*; -@Log4j2 +@Slf4j @SpringBootTest @DirtiesContext(classMode = DirtiesContext.ClassMode.BEFORE_EACH_TEST_METHOD) @ExtendWith(SpringExtension.class) diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/service/TableServiceUnitTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/service/TableServiceUnitTest.java index 0c260f3ed673d51f5c1e588978607cf7f15580a6..02453c021fc5401de7013a873d5c5602ad369acd 100644 --- a/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/service/TableServiceUnitTest.java +++ b/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/service/TableServiceUnitTest.java @@ -21,7 +21,7 @@ import at.ac.tuwien.ifs.dbrepo.gateway.DataServiceGateway; import at.ac.tuwien.ifs.dbrepo.gateway.SearchServiceGateway; import at.ac.tuwien.ifs.dbrepo.repository.DatabaseRepository; import at.ac.tuwien.ifs.dbrepo.core.test.BaseTest; -import lombok.extern.log4j.Log4j2; +import lombok.extern.slf4j.Slf4j; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.springframework.beans.factory.annotation.Autowired; @@ -38,7 +38,7 @@ import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.*; -@Log4j2 +@Slf4j @SpringBootTest @ExtendWith(SpringExtension.class) public class TableServiceUnitTest extends BaseTest { diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/service/UnitServiceUnitTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/service/UnitServiceUnitTest.java index e8e73fca32043680abfa0e473840daaf1acdad49..b7cff24d5e28206b794b968cadf115c943dc0bdf 100644 --- a/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/service/UnitServiceUnitTest.java +++ b/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/service/UnitServiceUnitTest.java @@ -4,7 +4,7 @@ import at.ac.tuwien.ifs.dbrepo.core.entity.database.table.columns.TableColumnUni import at.ac.tuwien.ifs.dbrepo.core.exception.UnitNotFoundException; import at.ac.tuwien.ifs.dbrepo.repository.UnitRepository; import at.ac.tuwien.ifs.dbrepo.core.test.BaseTest; -import lombok.extern.log4j.Log4j2; +import lombok.extern.slf4j.Slf4j; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.springframework.beans.factory.annotation.Autowired; @@ -20,7 +20,7 @@ import static org.junit.jupiter.api.Assertions.*; import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.Mockito.when; -@Log4j2 +@Slf4j @SpringBootTest @ExtendWith(SpringExtension.class) public class UnitServiceUnitTest extends BaseTest { diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/service/UserServiceIntegrationTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/service/UserServiceIntegrationTest.java index 9311d0dd3461b19b0a13c9e85224dc8ae63259b5..0f49809a93d31534160b330df9f4a540e6bad5ea 100644 --- a/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/service/UserServiceIntegrationTest.java +++ b/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/service/UserServiceIntegrationTest.java @@ -7,7 +7,7 @@ import at.ac.tuwien.ifs.dbrepo.repository.UserRepository; import at.ac.tuwien.ifs.dbrepo.core.test.BaseTest; import at.ac.tuwien.ifs.dbrepo.utils.KeycloakUtils; import dasniko.testcontainers.keycloak.KeycloakContainer; -import lombok.extern.log4j.Log4j2; +import lombok.extern.slf4j.Slf4j; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; @@ -23,7 +23,7 @@ import org.testcontainers.junit.jupiter.Testcontainers; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNotNull; -@Log4j2 +@Slf4j @Testcontainers @ExtendWith(SpringExtension.class) @SpringBootTest diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/service/UserServicePersistenceTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/service/UserServicePersistenceTest.java index cb4e873ac9d27ee9e74505a71053eecb144ba1d5..fe30b39bb71be6667809f30ac77efffb92bb1f85 100644 --- a/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/service/UserServicePersistenceTest.java +++ b/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/service/UserServicePersistenceTest.java @@ -7,7 +7,7 @@ import at.ac.tuwien.ifs.dbrepo.core.exception.UserNotFoundException; import at.ac.tuwien.ifs.dbrepo.gateway.KeycloakGateway; import at.ac.tuwien.ifs.dbrepo.repository.UserRepository; import at.ac.tuwien.ifs.dbrepo.core.test.BaseTest; -import lombok.extern.log4j.Log4j2; +import lombok.extern.slf4j.Slf4j; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; @@ -22,7 +22,7 @@ import java.util.List; import static org.junit.jupiter.api.Assertions.*; import static org.mockito.Mockito.doNothing; -@Log4j2 +@Slf4j @DirtiesContext(classMode = DirtiesContext.ClassMode.BEFORE_EACH_TEST_METHOD) @SpringBootTest @ExtendWith(SpringExtension.class) diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/service/ViewServicePersistenceTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/service/ViewServicePersistenceTest.java index 33cc7db8a441c46b32d419c7ad804262028b65e8..899f244d5374f9f73ef2e5e76d74243b524145b8 100644 --- a/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/service/ViewServicePersistenceTest.java +++ b/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/service/ViewServicePersistenceTest.java @@ -10,7 +10,7 @@ import at.ac.tuwien.ifs.dbrepo.repository.DatabaseRepository; import at.ac.tuwien.ifs.dbrepo.repository.LicenseRepository; import at.ac.tuwien.ifs.dbrepo.repository.UserRepository; import at.ac.tuwien.ifs.dbrepo.core.test.BaseTest; -import lombok.extern.log4j.Log4j2; +import lombok.extern.slf4j.Slf4j; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; @@ -29,7 +29,7 @@ import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.doNothing; import static org.mockito.Mockito.when; -@Log4j2 +@Slf4j @SpringBootTest @Disabled("CI/CD") @DirtiesContext(classMode = DirtiesContext.ClassMode.BEFORE_EACH_TEST_METHOD) diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/service/ViewServiceUnitTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/service/ViewServiceUnitTest.java index a50b7ca3397d1738ab16c30b711576b3d89b3113..a5b25977f7d3a304e3b63d46deabd1bc6351aa6f 100644 --- a/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/service/ViewServiceUnitTest.java +++ b/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/service/ViewServiceUnitTest.java @@ -8,7 +8,7 @@ import at.ac.tuwien.ifs.dbrepo.gateway.DataServiceGateway; import at.ac.tuwien.ifs.dbrepo.gateway.SearchServiceGateway; import at.ac.tuwien.ifs.dbrepo.repository.DatabaseRepository; import at.ac.tuwien.ifs.dbrepo.core.test.BaseTest; -import lombok.extern.log4j.Log4j2; +import lombok.extern.slf4j.Slf4j; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.springframework.beans.factory.annotation.Autowired; @@ -24,7 +24,7 @@ import static org.junit.jupiter.api.Assertions.assertThrows; import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.*; -@Log4j2 +@Slf4j @Testcontainers @SpringBootTest @ExtendWith(SpringExtension.class) diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/utils/AmqpUtils.java b/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/utils/AmqpUtils.java index 09017252d8f539c8d3119751d68905edde2a1e5a..bad729b3e7d30c85e47ec4330109439120ddc5e7 100644 --- a/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/utils/AmqpUtils.java +++ b/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/utils/AmqpUtils.java @@ -2,7 +2,7 @@ package at.ac.tuwien.ifs.dbrepo.utils; import at.ac.tuwien.ifs.dbrepo.core.api.amqp.*; import at.ac.tuwien.ifs.dbrepo.core.test.BaseTest; -import lombok.extern.log4j.Log4j2; +import lombok.extern.slf4j.Slf4j; import org.apache.commons.codec.binary.Base64; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; @@ -23,7 +23,7 @@ import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; -@Log4j2 +@Slf4j public class AmqpUtils extends BaseTest { private static final String BASIC_AUTH = new String(Base64.encodeBase64((USER_1_USERNAME + ":" + USER_1_PASSWORD).getBytes(Charset.defaultCharset()))); diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/utils/H2Utils.java b/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/utils/H2Utils.java index f10486047aabaec096dd2d98763f76f62c3a1e9b..7716185b69b5b76498dc8b2535d6af80e0808f07 100644 --- a/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/utils/H2Utils.java +++ b/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/utils/H2Utils.java @@ -1,7 +1,7 @@ package at.ac.tuwien.ifs.dbrepo.utils; import jakarta.persistence.EntityManager; -import lombok.extern.log4j.Log4j2; +import lombok.extern.slf4j.Slf4j; import org.apache.commons.io.FileUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @@ -11,7 +11,7 @@ import java.io.File; import java.io.IOException; import java.nio.charset.StandardCharsets; -@Log4j2 +@Slf4j @Component public class H2Utils { diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/utils/KeycloakUtils.java b/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/utils/KeycloakUtils.java index 9a0ea26a733c6c92b3c3cbd04ca9dfdc86808db0..341a042d6e597239738b48dfef26cb630333e158 100644 --- a/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/utils/KeycloakUtils.java +++ b/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/utils/KeycloakUtils.java @@ -5,7 +5,7 @@ import at.ac.tuwien.ifs.dbrepo.config.KeycloakConfig; import at.ac.tuwien.ifs.dbrepo.core.exception.UserNotFoundException; import at.ac.tuwien.ifs.dbrepo.core.mapper.MetadataMapper; import jakarta.ws.rs.core.Response; -import lombok.extern.log4j.Log4j2; +import lombok.extern.slf4j.Slf4j; import org.keycloak.admin.client.Keycloak; import org.keycloak.representations.idm.UserRepresentation; import org.springframework.beans.factory.annotation.Autowired; @@ -14,7 +14,7 @@ import org.springframework.stereotype.Component; import java.util.List; import java.util.UUID; -@Log4j2 +@Slf4j @Component public class KeycloakUtils { diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/utils/XmlUtils.java b/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/utils/XmlUtils.java index 268d2c0be5c1de0d471d35cb40bc4317ec337a59..90e489d6a3efad9a1832798e70e373b9bb775d72 100644 --- a/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/utils/XmlUtils.java +++ b/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/utils/XmlUtils.java @@ -8,11 +8,11 @@ import javax.xml.validation.Schema; import javax.xml.validation.SchemaFactory; import javax.xml.validation.Validator; -import lombok.extern.log4j.Log4j2; +import lombok.extern.slf4j.Slf4j; import org.apache.commons.io.IOUtils; import org.xml.sax.SAXException; -@Log4j2 +@Slf4j public class XmlUtils { public static boolean validateXmlResponse(String xsdUrl, String xmlDocument) { diff --git a/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/validator/EndpointValidatorUnitTest.java b/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/validator/EndpointValidatorUnitTest.java index 3d3675c28531b213fcbbaf0282809eb4855122f3..e8e590805fb2d8537b073d834a4dae2a349bd623 100644 --- a/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/validator/EndpointValidatorUnitTest.java +++ b/dbrepo-metadata-service/rest-service/src/test/java/at/ac/tuwien/ifs/dbrepo/validator/EndpointValidatorUnitTest.java @@ -13,7 +13,7 @@ import at.ac.tuwien.ifs.dbrepo.service.DatabaseService; import at.ac.tuwien.ifs.dbrepo.service.TableService; import at.ac.tuwien.ifs.dbrepo.core.test.BaseTest; import at.ac.tuwien.ifs.dbrepo.validation.EndpointValidator; -import lombok.extern.log4j.Log4j2; +import lombok.extern.slf4j.Slf4j; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.junit.jupiter.params.ParameterizedTest; @@ -34,7 +34,7 @@ import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.doThrow; import static org.mockito.Mockito.when; -@Log4j2 +@Slf4j @SpringBootTest @ExtendWith(SpringExtension.class) public class EndpointValidatorUnitTest extends BaseTest { diff --git a/dbrepo-metadata-service/services/pom.xml b/dbrepo-metadata-service/services/pom.xml index 3c0a3e1bccdcf5d06d7e91004182151be83be260..b1453e12a6f90c225858bfa917f486e9a9367fd3 100644 --- a/dbrepo-metadata-service/services/pom.xml +++ b/dbrepo-metadata-service/services/pom.xml @@ -6,23 +6,23 @@ <parent> <groupId>at.ac.tuwien.ifs.dbrepo</groupId> <artifactId>metadata-service</artifactId> - <version>1.8.1</version> + <version>1.9.0</version> </parent> <name>services</name> - <artifactId>metadata-service-services</artifactId> - <version>1.8.1</version> + <artifactId>services</artifactId> + <version>1.9.0</version> <dependencies> <dependency> <groupId>at.ac.tuwien.ifs.dbrepo</groupId> - <artifactId>metadata-service-oai</artifactId> - <version>1.8.1</version> + <artifactId>oai</artifactId> + <version>1.9.0</version> </dependency> <dependency> <groupId>at.ac.tuwien.ifs.dbrepo</groupId> - <artifactId>metadata-service-repositories</artifactId> - <version>1.8.1</version> + <artifactId>repositories</artifactId> + <version>1.9.0</version> </dependency> </dependencies> diff --git a/dbrepo-metadata-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/auth/BasicAuthenticationProvider.java b/dbrepo-metadata-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/auth/BasicAuthenticationProvider.java index 5ab64107cd4dc80be7b16a8db0db4815372cc3fc..86debdbe920bc2eaa1d00b27234fdc5684d8242c 100644 --- a/dbrepo-metadata-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/auth/BasicAuthenticationProvider.java +++ b/dbrepo-metadata-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/auth/BasicAuthenticationProvider.java @@ -2,7 +2,7 @@ package at.ac.tuwien.ifs.dbrepo.auth; import at.ac.tuwien.ifs.dbrepo.core.api.keycloak.TokenDto; import at.ac.tuwien.ifs.dbrepo.service.CredentialService; -import lombok.extern.log4j.Log4j2; +import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.authentication.AuthenticationManager; import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; @@ -11,7 +11,7 @@ import org.springframework.security.core.AuthenticationException; import org.springframework.security.core.userdetails.UserDetails; import org.springframework.stereotype.Component; -@Log4j2 +@Slf4j @Component public class BasicAuthenticationProvider implements AuthenticationManager { diff --git a/dbrepo-metadata-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/auth/InternalRequestInterceptor.java b/dbrepo-metadata-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/auth/InternalRequestInterceptor.java index 272dfda2cf05e5ae8188492340632b1b2916aa70..eef0cfae3c34b4d1fe4d5deccd61ec9e50fad50c 100644 --- a/dbrepo-metadata-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/auth/InternalRequestInterceptor.java +++ b/dbrepo-metadata-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/auth/InternalRequestInterceptor.java @@ -3,7 +3,7 @@ package at.ac.tuwien.ifs.dbrepo.auth; import at.ac.tuwien.ifs.dbrepo.core.api.keycloak.TokenDto; import at.ac.tuwien.ifs.dbrepo.config.GatewayConfig; import at.ac.tuwien.ifs.dbrepo.service.CredentialService; -import lombok.extern.log4j.Log4j2; +import lombok.extern.slf4j.Slf4j; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpRequest; import org.springframework.http.MediaType; @@ -14,7 +14,7 @@ import org.springframework.http.client.ClientHttpResponse; import java.io.IOException; import java.util.List; -@Log4j2 +@Slf4j public class InternalRequestInterceptor implements ClientHttpRequestInterceptor { private final CredentialService credentialService; diff --git a/dbrepo-metadata-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/config/DataCiteConfig.java b/dbrepo-metadata-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/config/DataCiteConfig.java index 1c00d625ddd4f0f01295088d33d5e8671b3fbcab..fc9b7d715deea4f6d2778c6dca6416071c2c6026 100644 --- a/dbrepo-metadata-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/config/DataCiteConfig.java +++ b/dbrepo-metadata-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/config/DataCiteConfig.java @@ -1,7 +1,7 @@ package at.ac.tuwien.ifs.dbrepo.config; import lombok.Getter; -import lombok.extern.log4j.Log4j2; +import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -13,7 +13,7 @@ import org.springframework.web.util.DefaultUriBuilderFactory; import java.util.List; @Getter -@Log4j2 +@Slf4j @Profile("doi") @Configuration public class DataCiteConfig { diff --git a/dbrepo-metadata-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/config/GatewayConfig.java b/dbrepo-metadata-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/config/GatewayConfig.java index a7f99926509ddad057edabd5671eb4da0adfc0d7..be7eabb939e17ef8c6b7ac5fab9f0006afed5e4e 100644 --- a/dbrepo-metadata-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/config/GatewayConfig.java +++ b/dbrepo-metadata-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/config/GatewayConfig.java @@ -3,14 +3,14 @@ package at.ac.tuwien.ifs.dbrepo.config; import at.ac.tuwien.ifs.dbrepo.auth.InternalRequestInterceptor; import at.ac.tuwien.ifs.dbrepo.service.CredentialService; import lombok.Getter; -import lombok.extern.log4j.Log4j2; +import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.*; import org.springframework.web.client.RestTemplate; import org.springframework.web.util.DefaultUriBuilderFactory; -@Log4j2 +@Slf4j @Getter @Configuration public class GatewayConfig { diff --git a/dbrepo-metadata-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/config/MetricsConfig.java b/dbrepo-metadata-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/config/MetricsConfig.java index 8509d27c4407e66e1554d5bf9aeefd1623743b13..231d6d8033cae3020b3f1dc2b405a62ae4f1a1a6 100644 --- a/dbrepo-metadata-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/config/MetricsConfig.java +++ b/dbrepo-metadata-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/config/MetricsConfig.java @@ -9,14 +9,14 @@ import io.micrometer.core.instrument.Gauge; import io.micrometer.core.instrument.Metrics; import io.micrometer.observation.ObservationRegistry; import io.micrometer.observation.aop.ObservedAspect; -import lombok.extern.log4j.Log4j2; +import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import java.util.Objects; -@Log4j2 +@Slf4j @Configuration public class MetricsConfig { diff --git a/dbrepo-metadata-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/config/RabbitConfig.java b/dbrepo-metadata-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/config/RabbitConfig.java index a727e972e253382a8a9bfa4fd25931e642e83dcf..6897cf621f96cfc9de6dcdc8c236698853881576 100644 --- a/dbrepo-metadata-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/config/RabbitConfig.java +++ b/dbrepo-metadata-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/config/RabbitConfig.java @@ -1,12 +1,12 @@ package at.ac.tuwien.ifs.dbrepo.config; import lombok.Getter; -import lombok.extern.log4j.Log4j2; +import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Configuration; @Getter -@Log4j2 +@Slf4j @Configuration public class RabbitConfig { diff --git a/dbrepo-metadata-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/gateway/impl/CrossRefGatewayImpl.java b/dbrepo-metadata-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/gateway/impl/CrossRefGatewayImpl.java index 559f3b7657efc8ce1a891d628034914e5dfa2632..74fc4a2a2e1d3260bc235b1b87ea44c3f2bf4d82 100644 --- a/dbrepo-metadata-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/gateway/impl/CrossRefGatewayImpl.java +++ b/dbrepo-metadata-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/gateway/impl/CrossRefGatewayImpl.java @@ -4,7 +4,7 @@ import at.ac.tuwien.ifs.dbrepo.config.GatewayConfig; import at.ac.tuwien.ifs.dbrepo.core.api.crossref.CrossRefDto; import at.ac.tuwien.ifs.dbrepo.core.exception.DoiNotFoundException; import at.ac.tuwien.ifs.dbrepo.gateway.CrossRefGateway; -import lombok.extern.log4j.Log4j2; +import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.http.HttpEntity; @@ -14,7 +14,7 @@ import org.springframework.stereotype.Service; import org.springframework.web.client.HttpServerErrorException; import org.springframework.web.client.RestTemplate; -@Log4j2 +@Slf4j @Service public class CrossRefGatewayImpl implements CrossRefGateway { diff --git a/dbrepo-metadata-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/gateway/impl/DashboardServiceGatewayImpl.java b/dbrepo-metadata-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/gateway/impl/DashboardServiceGatewayImpl.java index 8f36db0f3b5814aa3ee3a0729c0248a7690e9451..70bbea261bbf4f25aa1e03043c315b131c9d2937 100644 --- a/dbrepo-metadata-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/gateway/impl/DashboardServiceGatewayImpl.java +++ b/dbrepo-metadata-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/gateway/impl/DashboardServiceGatewayImpl.java @@ -10,7 +10,7 @@ import at.ac.tuwien.ifs.dbrepo.config.GatewayConfig; import at.ac.tuwien.ifs.dbrepo.core.exception.DashboardServiceConnectionException; import at.ac.tuwien.ifs.dbrepo.core.exception.DashboardServiceException; import at.ac.tuwien.ifs.dbrepo.gateway.DashboardServiceGateway; -import lombok.extern.log4j.Log4j2; +import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.http.HttpEntity; @@ -23,7 +23,7 @@ import org.springframework.web.client.HttpServerErrorException; import org.springframework.web.client.ResourceAccessException; import org.springframework.web.client.RestTemplate; -@Log4j2 +@Slf4j @Service public class DashboardServiceGatewayImpl implements DashboardServiceGateway { diff --git a/dbrepo-metadata-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/gateway/impl/DataServiceGatewayImpl.java b/dbrepo-metadata-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/gateway/impl/DataServiceGatewayImpl.java index 41ab74b9cc1e97a755669ea431ca2907c1e52c98..882c6c49d7ecf15361375db4ad5ad346b833602a 100644 --- a/dbrepo-metadata-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/gateway/impl/DataServiceGatewayImpl.java +++ b/dbrepo-metadata-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/gateway/impl/DataServiceGatewayImpl.java @@ -11,7 +11,7 @@ import at.ac.tuwien.ifs.dbrepo.core.api.user.internal.UpdateUserPasswordDto; import at.ac.tuwien.ifs.dbrepo.config.GatewayConfig; import at.ac.tuwien.ifs.dbrepo.core.exception.*; import at.ac.tuwien.ifs.dbrepo.gateway.DataServiceGateway; -import lombok.extern.log4j.Log4j2; +import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.http.HttpEntity; import org.springframework.http.HttpMethod; @@ -26,7 +26,7 @@ import java.util.Arrays; import java.util.List; import java.util.UUID; -@Log4j2 +@Slf4j @Service public class DataServiceGatewayImpl implements DataServiceGateway { diff --git a/dbrepo-metadata-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/gateway/impl/KeycloakGatewayImpl.java b/dbrepo-metadata-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/gateway/impl/KeycloakGatewayImpl.java index f3f5c4ad09823b7ff6e9223892ca437a55e170fc..8087c91bb7b425c3689c614364df5d79f3eed00e 100644 --- a/dbrepo-metadata-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/gateway/impl/KeycloakGatewayImpl.java +++ b/dbrepo-metadata-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/gateway/impl/KeycloakGatewayImpl.java @@ -11,7 +11,7 @@ import jakarta.ws.rs.ForbiddenException; import jakarta.ws.rs.NotAuthorizedException; import jakarta.ws.rs.NotFoundException; import jakarta.ws.rs.core.Response; -import lombok.extern.log4j.Log4j2; +import lombok.extern.slf4j.Slf4j; import org.keycloak.OAuth2Constants; import org.keycloak.admin.client.Keycloak; import org.keycloak.admin.client.KeycloakBuilder; @@ -24,7 +24,7 @@ import org.springframework.stereotype.Service; import java.util.List; import java.util.UUID; -@Log4j2 +@Slf4j @Service public class KeycloakGatewayImpl implements KeycloakGateway { diff --git a/dbrepo-metadata-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/gateway/impl/OrcidGatewayImpl.java b/dbrepo-metadata-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/gateway/impl/OrcidGatewayImpl.java index 78751b72be9bb69819290d6577aa27686d14cb9d..c8d2b6ab8258eed59bf0000009a82f2b05960e34 100644 --- a/dbrepo-metadata-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/gateway/impl/OrcidGatewayImpl.java +++ b/dbrepo-metadata-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/gateway/impl/OrcidGatewayImpl.java @@ -3,7 +3,7 @@ package at.ac.tuwien.ifs.dbrepo.gateway.impl; import at.ac.tuwien.ifs.dbrepo.core.api.orcid.OrcidDto; import at.ac.tuwien.ifs.dbrepo.core.exception.OrcidNotFoundException; import at.ac.tuwien.ifs.dbrepo.gateway.OrcidGateway; -import lombok.extern.log4j.Log4j2; +import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpEntity; import org.springframework.http.HttpMethod; @@ -12,7 +12,7 @@ import org.springframework.stereotype.Service; import org.springframework.web.client.HttpServerErrorException; import org.springframework.web.client.RestTemplate; -@Log4j2 +@Slf4j @Service public class OrcidGatewayImpl implements OrcidGateway { diff --git a/dbrepo-metadata-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/gateway/impl/RorGatewayImpl.java b/dbrepo-metadata-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/gateway/impl/RorGatewayImpl.java index b8af43362d2c029e97f2853572ca94fa6359598e..e7242284ab71f50d83c4b7e202e82d38c33f451f 100644 --- a/dbrepo-metadata-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/gateway/impl/RorGatewayImpl.java +++ b/dbrepo-metadata-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/gateway/impl/RorGatewayImpl.java @@ -4,7 +4,7 @@ import at.ac.tuwien.ifs.dbrepo.core.api.ror.RorDto; import at.ac.tuwien.ifs.dbrepo.config.GatewayConfig; import at.ac.tuwien.ifs.dbrepo.core.exception.RorNotFoundException; import at.ac.tuwien.ifs.dbrepo.gateway.RorGateway; -import lombok.extern.log4j.Log4j2; +import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpEntity; import org.springframework.http.HttpMethod; @@ -13,7 +13,7 @@ import org.springframework.stereotype.Service; import org.springframework.web.client.HttpServerErrorException; import org.springframework.web.client.RestTemplate; -@Log4j2 +@Slf4j @Service public class RorGatewayImpl implements RorGateway { diff --git a/dbrepo-metadata-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/gateway/impl/SearchServiceGatewayImpl.java b/dbrepo-metadata-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/gateway/impl/SearchServiceGatewayImpl.java index 97977fbb433963676996118ae1f5796124445a06..33caee5179848d74c55ae4eb00441ac7498a4a5e 100644 --- a/dbrepo-metadata-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/gateway/impl/SearchServiceGatewayImpl.java +++ b/dbrepo-metadata-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/gateway/impl/SearchServiceGatewayImpl.java @@ -8,7 +8,7 @@ import at.ac.tuwien.ifs.dbrepo.core.exception.SearchServiceConnectionException; import at.ac.tuwien.ifs.dbrepo.core.exception.SearchServiceException; import at.ac.tuwien.ifs.dbrepo.core.mapper.MetadataMapper; import at.ac.tuwien.ifs.dbrepo.gateway.SearchServiceGateway; -import lombok.extern.log4j.Log4j2; +import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.http.*; @@ -20,7 +20,7 @@ import org.springframework.web.client.RestTemplate; import java.util.UUID; -@Log4j2 +@Slf4j @Service public class SearchServiceGatewayImpl implements SearchServiceGateway { diff --git a/dbrepo-metadata-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/AccessServiceImpl.java b/dbrepo-metadata-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/AccessServiceImpl.java index 7d3120bba2d2eccf643045658b8e7ecc8753bfc2..8ab61d2767b9bcdf298b1dcdeaa203de17ee3063 100644 --- a/dbrepo-metadata-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/AccessServiceImpl.java +++ b/dbrepo-metadata-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/AccessServiceImpl.java @@ -11,7 +11,7 @@ import at.ac.tuwien.ifs.dbrepo.gateway.SearchServiceGateway; import at.ac.tuwien.ifs.dbrepo.repository.DatabaseRepository; import at.ac.tuwien.ifs.dbrepo.service.AccessService; import at.ac.tuwien.ifs.dbrepo.service.DatabaseService; -import lombok.extern.log4j.Log4j2; +import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -19,7 +19,7 @@ import org.springframework.transaction.annotation.Transactional; import java.util.List; import java.util.Optional; -@Log4j2 +@Slf4j @Service public class AccessServiceImpl implements AccessService { diff --git a/dbrepo-metadata-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/AuthenticationServiceImpl.java b/dbrepo-metadata-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/AuthenticationServiceImpl.java index b2b485327120efc855a0ac13c3407ca06eec1355..ae694c7812d0163570fdd7fd30efc6cafbdc8af1 100644 --- a/dbrepo-metadata-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/AuthenticationServiceImpl.java +++ b/dbrepo-metadata-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/AuthenticationServiceImpl.java @@ -5,11 +5,11 @@ import at.ac.tuwien.ifs.dbrepo.core.exception.AuthServiceException; import at.ac.tuwien.ifs.dbrepo.core.exception.UserNotFoundException; import at.ac.tuwien.ifs.dbrepo.gateway.KeycloakGateway; import at.ac.tuwien.ifs.dbrepo.service.AuthenticationService; -import lombok.extern.log4j.Log4j2; +import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; -@Log4j2 +@Slf4j @Service public class AuthenticationServiceImpl implements AuthenticationService { diff --git a/dbrepo-metadata-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/BannerMessageServiceImpl.java b/dbrepo-metadata-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/BannerMessageServiceImpl.java index 8b8766401a3c482d202f3a64400abe0194b2fdb5..c2330f3011fa48c65668d562a67bcbcfa17ddf32 100644 --- a/dbrepo-metadata-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/BannerMessageServiceImpl.java +++ b/dbrepo-metadata-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/BannerMessageServiceImpl.java @@ -7,7 +7,7 @@ import at.ac.tuwien.ifs.dbrepo.core.exception.MessageNotFoundException; import at.ac.tuwien.ifs.dbrepo.core.mapper.MetadataMapper; import at.ac.tuwien.ifs.dbrepo.repository.BannerMessageRepository; import at.ac.tuwien.ifs.dbrepo.service.BannerMessageService; -import lombok.extern.log4j.Log4j2; +import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -15,7 +15,7 @@ import java.util.List; import java.util.Optional; import java.util.UUID; -@Log4j2 +@Slf4j @Service public class BannerMessageServiceImpl implements BannerMessageService { diff --git a/dbrepo-metadata-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/BrokerServiceRabbitMqImpl.java b/dbrepo-metadata-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/BrokerServiceRabbitMqImpl.java index 709e7cebde2bcd054f8c59d4643866cb20a1563d..42478c18b3a5f89f205088d72776cdd6a0071151 100644 --- a/dbrepo-metadata-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/BrokerServiceRabbitMqImpl.java +++ b/dbrepo-metadata-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/BrokerServiceRabbitMqImpl.java @@ -8,13 +8,13 @@ import at.ac.tuwien.ifs.dbrepo.core.entity.user.User; import at.ac.tuwien.ifs.dbrepo.core.exception.*; import at.ac.tuwien.ifs.dbrepo.gateway.BrokerServiceGateway; import at.ac.tuwien.ifs.dbrepo.service.BrokerService; -import lombok.extern.log4j.Log4j2; +import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.stream.Collectors; -@Log4j2 +@Slf4j @Service public class BrokerServiceRabbitMqImpl implements BrokerService { diff --git a/dbrepo-metadata-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/ConceptServiceImpl.java b/dbrepo-metadata-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/ConceptServiceImpl.java index 93f64a16ea13efa86934f089ce5f8a9d778fc47e..ca2f716cd86a1e7cadc46dec8035a5029fb613a4 100644 --- a/dbrepo-metadata-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/ConceptServiceImpl.java +++ b/dbrepo-metadata-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/ConceptServiceImpl.java @@ -4,7 +4,7 @@ import at.ac.tuwien.ifs.dbrepo.core.entity.database.table.columns.TableColumnCon import at.ac.tuwien.ifs.dbrepo.core.exception.ConceptNotFoundException; import at.ac.tuwien.ifs.dbrepo.repository.ConceptRepository; import at.ac.tuwien.ifs.dbrepo.service.ConceptService; -import lombok.extern.log4j.Log4j2; +import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -12,7 +12,7 @@ import org.springframework.transaction.annotation.Transactional; import java.util.List; import java.util.Optional; -@Log4j2 +@Slf4j @Service public class ConceptServiceImpl implements ConceptService { diff --git a/dbrepo-metadata-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/ContainerServiceImpl.java b/dbrepo-metadata-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/ContainerServiceImpl.java index 27daf634877cd316a51aa9677a82bda7f3145865..1d5cd6f6354bb887c94beb02ec42031869e10e75 100644 --- a/dbrepo-metadata-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/ContainerServiceImpl.java +++ b/dbrepo-metadata-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/ContainerServiceImpl.java @@ -10,7 +10,7 @@ import at.ac.tuwien.ifs.dbrepo.core.mapper.MetadataMapper; import at.ac.tuwien.ifs.dbrepo.repository.ContainerRepository; import at.ac.tuwien.ifs.dbrepo.repository.ImageRepository; import at.ac.tuwien.ifs.dbrepo.service.ContainerService; -import lombok.extern.log4j.Log4j2; +import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.dao.DataAccessException; import org.springframework.data.domain.Pageable; @@ -21,7 +21,7 @@ import java.util.List; import java.util.Optional; import java.util.UUID; -@Log4j2 +@Slf4j @Service public class ContainerServiceImpl implements ContainerService { diff --git a/dbrepo-metadata-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/CredentialServiceImpl.java b/dbrepo-metadata-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/CredentialServiceImpl.java index 65597ec056b7f03cc4bd9f88db11f2e15c212485..5286f61a774458e3024d413309e46390cb473eaa 100644 --- a/dbrepo-metadata-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/CredentialServiceImpl.java +++ b/dbrepo-metadata-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/CredentialServiceImpl.java @@ -4,11 +4,11 @@ import at.ac.tuwien.ifs.dbrepo.core.api.keycloak.TokenDto; import at.ac.tuwien.ifs.dbrepo.gateway.KeycloakGateway; import at.ac.tuwien.ifs.dbrepo.service.CredentialService; import com.github.benmanes.caffeine.cache.Cache; -import lombok.extern.log4j.Log4j2; +import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; -@Log4j2 +@Slf4j @Service public class CredentialServiceImpl implements CredentialService { diff --git a/dbrepo-metadata-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/DashboardServiceImpl.java b/dbrepo-metadata-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/DashboardServiceImpl.java index af76ee2d4fb13a966d10ba5999725f58589f3ea2..8ed7c01ec9c2746de35b57f1468ef7e6ace06d72 100644 --- a/dbrepo-metadata-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/DashboardServiceImpl.java +++ b/dbrepo-metadata-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/DashboardServiceImpl.java @@ -9,11 +9,11 @@ import at.ac.tuwien.ifs.dbrepo.core.exception.DashboardServiceException; import at.ac.tuwien.ifs.dbrepo.core.mapper.MetadataMapper; import at.ac.tuwien.ifs.dbrepo.gateway.DashboardServiceGateway; import at.ac.tuwien.ifs.dbrepo.service.DashboardService; -import lombok.extern.log4j.Log4j2; +import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; -@Log4j2 +@Slf4j @Service public class DashboardServiceImpl implements DashboardService { diff --git a/dbrepo-metadata-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/DataCiteIdentifierServiceImpl.java b/dbrepo-metadata-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/DataCiteIdentifierServiceImpl.java index 5c109633183eb1d62f4a560e878140d15d75a6cd..0ce9c93a5407241bb5523fb4ac5b5661b87f0158 100644 --- a/dbrepo-metadata-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/DataCiteIdentifierServiceImpl.java +++ b/dbrepo-metadata-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/DataCiteIdentifierServiceImpl.java @@ -1,5 +1,7 @@ package at.ac.tuwien.ifs.dbrepo.service.impl; +import at.ac.tuwien.ifs.dbrepo.config.DataCiteConfig; +import at.ac.tuwien.ifs.dbrepo.config.EndpointConfig; import at.ac.tuwien.ifs.dbrepo.core.api.datacite.DataCiteBody; import at.ac.tuwien.ifs.dbrepo.core.api.datacite.DataCiteData; import at.ac.tuwien.ifs.dbrepo.core.api.datacite.doi.DataCiteCreateDoi; @@ -9,8 +11,6 @@ import at.ac.tuwien.ifs.dbrepo.core.api.identifier.BibliographyTypeDto; import at.ac.tuwien.ifs.dbrepo.core.api.identifier.CreateIdentifierDto; import at.ac.tuwien.ifs.dbrepo.core.api.identifier.IdentifierSaveDto; import at.ac.tuwien.ifs.dbrepo.core.api.identifier.IdentifierTypeDto; -import at.ac.tuwien.ifs.dbrepo.config.DataCiteConfig; -import at.ac.tuwien.ifs.dbrepo.config.EndpointConfig; import at.ac.tuwien.ifs.dbrepo.core.entity.database.Database; import at.ac.tuwien.ifs.dbrepo.core.entity.identifier.Identifier; import at.ac.tuwien.ifs.dbrepo.core.entity.identifier.IdentifierStatusType; @@ -48,6 +48,8 @@ public class DataCiteIdentifierServiceImpl implements IdentifierService { private final IdentifierService identifierService; private final IdentifierRepository identifierRepository; + private static final String LOG_MINT_FAILED = "Failed to mint doi"; + private final ParameterizedTypeReference<DataCiteBody<DataCiteDoi>> dataCiteBodyParameterizedTypeReference = new ParameterizedTypeReference<>() { }; @@ -128,36 +130,54 @@ public class DataCiteIdentifierServiceImpl implements IdentifierService { final HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_JSON); headers.setBasicAuth(dataCiteConfig.getUsername(), dataCiteConfig.getPassword()); + final DataCiteCreateDoi attributes = metadataMapper.identifierToDataCiteCreateDoi(identifier, + endpointConfig.getWebsiteUrl() + "/pid/" + identifier.getId(), + dataCiteConfig.getPrefix(), event); final HttpEntity<DataCiteBody<DataCiteCreateDoi>> request = new HttpEntity<>( DataCiteBody.<DataCiteCreateDoi>builder() .data(DataCiteData.<DataCiteCreateDoi>builder() .type("dois") - .attributes(metadataMapper.identifierToDataCiteCreateDoi(identifier, - endpointConfig.getWebsiteUrl() + "/pid/" + identifier.getId(), - dataCiteConfig.getPrefix(), event)) + .attributes(attributes) .build()) .build(), headers ); final String url = dataCiteConfig.getUrl() + "/dois"; + log.atDebug() + .setMessage("register doi from datacite url: " + url) + .addKeyValue("type", "dois") + .addKeyValue("event", event) + .addKeyValue("attributes", attributes) + .log(); log.trace("request doi from url {}", url); try { final ResponseEntity<DataCiteBody<DataCiteDoi>> response = restTemplate.exchange(url, HttpMethod.POST, request, dataCiteBodyParameterizedTypeReference); if (response.getStatusCode() != HttpStatus.CREATED || response.getBody() == null) { - log.error("Failed to mint doi: {}", response); - throw new ExternalServiceException("Failed to mint doi: " + response.getBody()); + log.error(LOG_MINT_FAILED + ": {}", response); + throw new ExternalServiceException(LOG_MINT_FAILED + ": " + response.getBody()); } - return response.getBody() + final String doi = response.getBody() .getData() .getAttributes() .getDoi(); + log.atInfo() + .setMessage("Saved doi: " + doi) + .addKeyValue("doi", doi) + .log(); + return doi; } catch (HttpClientErrorException e) { - log.error("Failed to mint doi: malformed metadata: {}", e.getMessage()); - throw new MalformedException("Failed to mint doi: malformed metadata: " + e.getMessage(), e); + log.atError() + .setMessage(LOG_MINT_FAILED) + .setCause(e) + .log(); + throw new MalformedException(LOG_MINT_FAILED + ": " + e.getMessage(), e); } catch (RestClientException e) { - log.error("Failed to mint doi: {}", e.getMessage()); - throw new DataServiceConnectionException("Failed to mint doi: " + e.getMessage(), e); + log.atError() + .setMessage(LOG_MINT_FAILED) + .setCause(e) + .log(); + throw new DataServiceConnectionException(LOG_MINT_FAILED + ": " + e.getMessage(), e); } } diff --git a/dbrepo-metadata-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/DatabaseServiceImpl.java b/dbrepo-metadata-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/DatabaseServiceImpl.java index 6cfa0180a8891c97e49fdcebd1c2923da8088adf..cdb1a2b4d0996da64d5b3f8607789d605b5902e3 100644 --- a/dbrepo-metadata-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/DatabaseServiceImpl.java +++ b/dbrepo-metadata-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/DatabaseServiceImpl.java @@ -1,9 +1,6 @@ package at.ac.tuwien.ifs.dbrepo.service.impl; -import at.ac.tuwien.ifs.dbrepo.core.api.database.CreateDatabaseDto; -import at.ac.tuwien.ifs.dbrepo.core.api.database.DatabaseDto; -import at.ac.tuwien.ifs.dbrepo.core.api.database.DatabaseModifyVisibilityDto; -import at.ac.tuwien.ifs.dbrepo.core.api.database.ViewDto; +import at.ac.tuwien.ifs.dbrepo.core.api.database.*; import at.ac.tuwien.ifs.dbrepo.core.api.database.table.TableDto; import at.ac.tuwien.ifs.dbrepo.core.api.user.internal.UpdateUserPasswordDto; import at.ac.tuwien.ifs.dbrepo.core.entity.container.Container; @@ -23,7 +20,7 @@ import at.ac.tuwien.ifs.dbrepo.gateway.DataServiceGateway; import at.ac.tuwien.ifs.dbrepo.gateway.SearchServiceGateway; import at.ac.tuwien.ifs.dbrepo.repository.DatabaseRepository; import at.ac.tuwien.ifs.dbrepo.service.DatabaseService; -import lombok.extern.log4j.Log4j2; +import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.RandomStringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -34,7 +31,7 @@ import java.util.List; import java.util.Optional; import java.util.UUID; -@Log4j2 +@Slf4j @Service public class DatabaseServiceImpl implements DatabaseService { diff --git a/dbrepo-metadata-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/EntityServiceImpl.java b/dbrepo-metadata-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/EntityServiceImpl.java index 60001b92ac0685e424b468caeea10a1c367fdfe2..cd288f4d2eedc0a36cb1906c528b5a968ce9c677 100644 --- a/dbrepo-metadata-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/EntityServiceImpl.java +++ b/dbrepo-metadata-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/EntityServiceImpl.java @@ -10,7 +10,7 @@ import at.ac.tuwien.ifs.dbrepo.core.exception.*; import at.ac.tuwien.ifs.dbrepo.mapper.SparqlMapper; import at.ac.tuwien.ifs.dbrepo.service.EntityService; import at.ac.tuwien.ifs.dbrepo.service.OntologyService; -import lombok.extern.log4j.Log4j2; +import lombok.extern.slf4j.Slf4j; import org.apache.jena.query.*; import org.apache.jena.rdf.model.RDFNode; import org.apache.jena.riot.RDFDataMgr; @@ -24,7 +24,7 @@ import java.util.LinkedList; import java.util.List; import java.util.concurrent.TimeUnit; -@Log4j2 +@Slf4j @Service public class EntityServiceImpl implements EntityService { diff --git a/dbrepo-metadata-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/IdentifierServiceImpl.java b/dbrepo-metadata-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/IdentifierServiceImpl.java index f8b2c273e8c9032a103b327f84892528aad7826f..4e275ea07f7b9892829fba8eee7b229f3f2d8a55 100644 --- a/dbrepo-metadata-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/IdentifierServiceImpl.java +++ b/dbrepo-metadata-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/IdentifierServiceImpl.java @@ -1,11 +1,11 @@ package at.ac.tuwien.ifs.dbrepo.service.impl; +import at.ac.tuwien.ifs.dbrepo.config.MetadataConfig; import at.ac.tuwien.ifs.dbrepo.core.api.database.query.QueryDto; import at.ac.tuwien.ifs.dbrepo.core.api.identifier.BibliographyTypeDto; import at.ac.tuwien.ifs.dbrepo.core.api.identifier.CreateIdentifierDto; import at.ac.tuwien.ifs.dbrepo.core.api.identifier.IdentifierSaveDto; import at.ac.tuwien.ifs.dbrepo.core.api.identifier.IdentifierTypeDto; -import at.ac.tuwien.ifs.dbrepo.config.MetadataConfig; import at.ac.tuwien.ifs.dbrepo.core.entity.database.Database; import at.ac.tuwien.ifs.dbrepo.core.entity.database.LanguageType; import at.ac.tuwien.ifs.dbrepo.core.entity.database.View; @@ -22,6 +22,7 @@ import at.ac.tuwien.ifs.dbrepo.service.IdentifierService; import at.ac.tuwien.ifs.dbrepo.service.ViewService; import lombok.extern.slf4j.Slf4j; import org.apache.commons.io.IOUtils; +import org.slf4j.spi.LoggingEventBuilder; import org.springframework.core.io.InputStreamResource; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -150,7 +151,10 @@ public class IdentifierServiceImpl implements IdentifierService { identifier = identifierRepository.save(identifier); /* update in search service */ searchServiceGateway.update(identifier.getDatabase()); - log.info("Published identifier with id {}", identifier.getId()); + log.atInfo() + .setMessage("Published identifier") + .addKeyValue("id", identifier.getId()) + .log(); return identifier; } @@ -184,40 +188,60 @@ public class IdentifierServiceImpl implements IdentifierService { .stream() .map(metadataMapper::creatorCreateDtoToCreator) .toList())); + final int[] idx = new int[]{0}; identifier.getCreators() - .forEach(c -> c.setIdentifier(identifier)); + .forEach(c -> { + c.setOrdinalPosition(idx[0]++); + c.setIdentifier(identifier); + }); } if (data.getRelatedIdentifiers() != null) { identifier.setRelatedIdentifiers(new LinkedList<>(data.getRelatedIdentifiers() .stream() .map(metadataMapper::relatedIdentifierCreateDtoToRelatedIdentifier) .toList())); + final int[] idx = new int[]{0}; identifier.getRelatedIdentifiers() - .forEach(r -> r.setIdentifier(identifier)); + .forEach(r -> { + r.setOrdinalPosition(idx[0]++); + r.setIdentifier(identifier); + }); } if (data.getTitles() != null) { identifier.setTitles(new LinkedList<>(data.getTitles() .stream() .map(metadataMapper::identifierCreateTitleDtoToIdentifierTitle) .toList())); + final int[] idx = new int[]{0}; identifier.getTitles() - .forEach(t -> t.setIdentifier(identifier)); + .forEach(t -> { + t.setOrdinalPosition(idx[0]++); + t.setIdentifier(identifier); + }); } if (data.getDescriptions() != null) { identifier.setDescriptions(new LinkedList<>(data.getDescriptions() .stream() .map(metadataMapper::identifierCreateDescriptionDtoToIdentifierDescription) .toList())); + final int[] idx = new int[]{0}; identifier.getDescriptions() - .forEach(d -> d.setIdentifier(identifier)); + .forEach(d -> { + d.setOrdinalPosition(idx[0]++); + d.setIdentifier(identifier); + }); } if (data.getFunders() != null) { identifier.setFunders(new LinkedList<>(data.getFunders() .stream() .map(metadataMapper::identifierFunderSaveDtoToIdentifierFunder) .toList())); + final int[] idx = new int[]{0}; identifier.getFunders() - .forEach(f -> f.setIdentifier(identifier)); + .forEach(f -> { + f.setOrdinalPosition(idx[0]++); + f.setIdentifier(identifier); + }); } return save(identifier); } @@ -280,10 +304,14 @@ public class IdentifierServiceImpl implements IdentifierService { public Identifier save(Identifier identifier) throws DataServiceException, DataServiceConnectionException, ViewNotFoundException, DatabaseNotFoundException, QueryNotFoundException, SearchServiceException, SearchServiceConnectionException { + LoggingEventBuilder loggingBuilder = log.atDebug() + .setMessage("save identifier") + .addKeyValue("type", identifier.getType()) + .addKeyValue("database_id", identifier.getDatabase().getId()); /* save identifier */ switch (identifier.getType()) { case SUBSET -> { - log.debug("identifier type: subset with id {}", identifier.getQueryId()); + loggingBuilder = loggingBuilder.addKeyValue("query_id", identifier.getQueryId()); final QueryDto query = dataServiceGateway.findQuery(identifier.getDatabase().getId(), identifier.getQueryId()); identifier.setQuery(query.getQuery()); identifier.setQueryId(query.getId()); @@ -294,16 +322,16 @@ public class IdentifierServiceImpl implements IdentifierService { identifier.setResultHash(query.getResultHash()); } case VIEW -> { - log.debug("identifier type: view with id {}", identifier.getViewId()); + loggingBuilder = loggingBuilder.addKeyValue("view_id", identifier.getViewId()); final View view = viewService.findById(identifier.getDatabase(), identifier.getViewId()); identifier.setViewId(view.getId()); identifier.setQuery(view.getQuery()); identifier.setQueryNormalized(view.getQuery()); identifier.setQueryHash(view.getQueryHash()); } - case DATABASE -> log.debug("identifier type: database with id {}", identifier.getDatabase().getId()); - case TABLE -> log.debug("identifier type: table with id {}", identifier.getTableId()); + case TABLE -> loggingBuilder = loggingBuilder.addKeyValue("table_id", identifier.getTableId()); } + loggingBuilder.log(); /* save identifier in metadata database */ final Identifier out = identifierRepository.save(identifier); /* update in search database */ @@ -326,9 +354,7 @@ public class IdentifierServiceImpl implements IdentifierService { /* map */ final String body = templateEngine.process("record_oai_datacite.xml", context) .replaceAll("\\s+", " "); - final InputStreamResource resource = new InputStreamResource(IOUtils.toInputStream(body, Charset.defaultCharset())); - log.debug("mapped file stream {}", resource.getDescription()); - return resource; + return new InputStreamResource(IOUtils.toInputStream(body, Charset.defaultCharset())); } @Override @@ -366,7 +392,10 @@ public class IdentifierServiceImpl implements IdentifierService { .getIdentifiers() .remove(identifier); searchServiceGateway.update(identifier.getDatabase()); - log.info("Deleted identifier with id {}", identifier.getId()); + log.atInfo() + .setMessage("Deleted identifier") + .addKeyValue("id", identifier.getId()) + .log(); } public IdentifierTitle preferTitle(List<IdentifierTitle> titles) { diff --git a/dbrepo-metadata-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/LicenseServiceImpl.java b/dbrepo-metadata-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/LicenseServiceImpl.java index 41765fb36a51ce192bd8b28867f78751293b5e0b..f868e49f0c18b28c4e298ec3e73b1ed24305e7f3 100644 --- a/dbrepo-metadata-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/LicenseServiceImpl.java +++ b/dbrepo-metadata-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/LicenseServiceImpl.java @@ -4,13 +4,13 @@ import at.ac.tuwien.ifs.dbrepo.core.entity.database.License; import at.ac.tuwien.ifs.dbrepo.core.exception.LicenseNotFoundException; import at.ac.tuwien.ifs.dbrepo.repository.LicenseRepository; import at.ac.tuwien.ifs.dbrepo.service.LicenseService; -import lombok.extern.log4j.Log4j2; +import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import java.util.List; import java.util.Optional; -@Log4j2 +@Slf4j @Service public class LicenseServiceImpl implements LicenseService { diff --git a/dbrepo-metadata-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/OntologyServiceImpl.java b/dbrepo-metadata-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/OntologyServiceImpl.java index 182f1eb5c9f354c17b782834a7eb95d6f51419d5..1ccfcea925cd69ac617aea02a70de8ef38e226de 100644 --- a/dbrepo-metadata-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/OntologyServiceImpl.java +++ b/dbrepo-metadata-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/OntologyServiceImpl.java @@ -7,7 +7,7 @@ import at.ac.tuwien.ifs.dbrepo.core.exception.OntologyNotFoundException; import at.ac.tuwien.ifs.dbrepo.core.mapper.MetadataMapper; import at.ac.tuwien.ifs.dbrepo.repository.OntologyRepository; import at.ac.tuwien.ifs.dbrepo.service.OntologyService; -import lombok.extern.log4j.Log4j2; +import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -18,7 +18,7 @@ import java.util.List; import java.util.Optional; import java.util.UUID; -@Log4j2 +@Slf4j @Service public class OntologyServiceImpl implements OntologyService { diff --git a/dbrepo-metadata-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/StorageServiceS3Impl.java b/dbrepo-metadata-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/StorageServiceS3Impl.java index 345529486aaee6b1af596dc89da29298b060baff..ab926c792229d8fbe9575132254e76267e0895b2 100644 --- a/dbrepo-metadata-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/StorageServiceS3Impl.java +++ b/dbrepo-metadata-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/StorageServiceS3Impl.java @@ -4,7 +4,7 @@ import at.ac.tuwien.ifs.dbrepo.config.S3Config; import at.ac.tuwien.ifs.dbrepo.core.exception.StorageNotFoundException; import at.ac.tuwien.ifs.dbrepo.core.exception.StorageUnavailableException; import at.ac.tuwien.ifs.dbrepo.service.StorageService; -import lombok.extern.log4j.Log4j2; +import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import software.amazon.awssdk.services.s3.S3Client; @@ -15,7 +15,7 @@ import software.amazon.awssdk.services.s3.model.S3Exception; import java.io.IOException; import java.io.InputStream; -@Log4j2 +@Slf4j @Service public class StorageServiceS3Impl implements StorageService { diff --git a/dbrepo-metadata-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/TableServiceImpl.java b/dbrepo-metadata-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/TableServiceImpl.java index 520f84b401be428c7f877e7456abdc49cc2461b8..6742d3c839c8888c6d772cbdc3c43d9927992260 100644 --- a/dbrepo-metadata-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/TableServiceImpl.java +++ b/dbrepo-metadata-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/TableServiceImpl.java @@ -17,7 +17,7 @@ import at.ac.tuwien.ifs.dbrepo.gateway.DataServiceGateway; import at.ac.tuwien.ifs.dbrepo.gateway.SearchServiceGateway; import at.ac.tuwien.ifs.dbrepo.repository.DatabaseRepository; import at.ac.tuwien.ifs.dbrepo.service.*; -import lombok.extern.log4j.Log4j2; +import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -28,7 +28,7 @@ import java.util.List; import java.util.Optional; import java.util.UUID; -@Log4j2 +@Slf4j @Service public class TableServiceImpl implements TableService { diff --git a/dbrepo-metadata-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/UnitServiceImpl.java b/dbrepo-metadata-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/UnitServiceImpl.java index ae24d0342fb47ba0bc3363190dce2bd11274bd31..49c09c6dc29b53cef30835cca4410f87ac2c7a55 100644 --- a/dbrepo-metadata-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/UnitServiceImpl.java +++ b/dbrepo-metadata-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/UnitServiceImpl.java @@ -4,7 +4,7 @@ import at.ac.tuwien.ifs.dbrepo.core.entity.database.table.columns.TableColumnUni import at.ac.tuwien.ifs.dbrepo.core.exception.UnitNotFoundException; import at.ac.tuwien.ifs.dbrepo.repository.UnitRepository; import at.ac.tuwien.ifs.dbrepo.service.UnitService; -import lombok.extern.log4j.Log4j2; +import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -12,7 +12,7 @@ import org.springframework.transaction.annotation.Transactional; import java.util.List; import java.util.Optional; -@Log4j2 +@Slf4j @Service public class UnitServiceImpl implements UnitService { diff --git a/dbrepo-metadata-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/UserServiceImpl.java b/dbrepo-metadata-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/UserServiceImpl.java index f93dacc21c112d9bdbd1be6f511c0d89829ea836..f50a5cd05ae9f63367ea25ffbc9ee5360fea5b0f 100644 --- a/dbrepo-metadata-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/UserServiceImpl.java +++ b/dbrepo-metadata-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/UserServiceImpl.java @@ -8,18 +8,19 @@ import at.ac.tuwien.ifs.dbrepo.core.exception.UserNotFoundException; import at.ac.tuwien.ifs.dbrepo.gateway.KeycloakGateway; import at.ac.tuwien.ifs.dbrepo.repository.UserRepository; import at.ac.tuwien.ifs.dbrepo.service.UserService; -import lombok.extern.log4j.Log4j2; +import lombok.extern.slf4j.Slf4j; import org.apache.commons.codec.digest.DigestUtils; import org.apache.commons.lang3.RandomStringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import java.nio.charset.StandardCharsets; import java.util.List; import java.util.Optional; import java.util.UUID; -@Log4j2 +@Slf4j @Service public class UserServiceImpl implements UserService { @@ -33,11 +34,13 @@ public class UserServiceImpl implements UserService { } @Override + @Transactional(readOnly = true) public List<User> findAll() { return userRepository.findAll(); } @Override + @Transactional(readOnly = true) public User findByUsername(String username) throws UserNotFoundException { final Optional<User> optional = userRepository.findByUsername(username); if (optional.isEmpty()) { @@ -48,11 +51,13 @@ public class UserServiceImpl implements UserService { } @Override + @Transactional(readOnly = true) public List<User> findAllInternalUsers() { return userRepository.findAllInternal(); } @Override + @Transactional(readOnly = true) public User findById(UUID id) throws UserNotFoundException { final Optional<User> optional = userRepository.findById(id); if (optional.isEmpty()) { @@ -63,6 +68,7 @@ public class UserServiceImpl implements UserService { } @Override + @Transactional public User create(CreateUserDto data) { /* create at authentication service */ final String passwordHash = "*" + DigestUtils.sha1Hex(DigestUtils.sha1(RandomStringUtils.randomAlphabetic(40) @@ -86,6 +92,7 @@ public class UserServiceImpl implements UserService { } @Override + @Transactional public User modify(User user, UserUpdateDto data) throws UserNotFoundException, AuthServiceException { user.setFirstname(data.getFirstname()); user.setLastname(data.getLastname()); diff --git a/dbrepo-metadata-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/ViewServiceImpl.java b/dbrepo-metadata-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/ViewServiceImpl.java index e952e25e4233d383f3eb38cff9a0b233881d8954..490f1f82089070e8500e03310ebe7e6327cd45af 100644 --- a/dbrepo-metadata-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/ViewServiceImpl.java +++ b/dbrepo-metadata-service/services/src/main/java/at/ac/tuwien/ifs/dbrepo/service/impl/ViewServiceImpl.java @@ -13,7 +13,7 @@ import at.ac.tuwien.ifs.dbrepo.gateway.SearchServiceGateway; import at.ac.tuwien.ifs.dbrepo.repository.DatabaseRepository; import at.ac.tuwien.ifs.dbrepo.service.ViewService; import com.google.common.hash.Hashing; -import lombok.extern.log4j.Log4j2; +import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -23,7 +23,7 @@ import java.util.LinkedList; import java.util.Optional; import java.util.UUID; -@Log4j2 +@Slf4j @Service public class ViewServiceImpl implements ViewService { diff --git a/dbrepo-metric-db/prometheus.yml b/dbrepo-metric-db/prometheus.yml index 333420ee559caa20e420b86bec5f2d08a881ef43..e5e5252e9de64de24de1b73b9caf9cf7a6d77cdd 100644 --- a/dbrepo-metric-db/prometheus.yml +++ b/dbrepo-metric-db/prometheus.yml @@ -1,5 +1,6 @@ global: scrape_interval: 1m + scrape_timeout: 10s rule_files: [] @@ -12,8 +13,25 @@ scrape_configs: - job_name: 'java actuator scrape' metrics_path: '/actuator/prometheus' static_configs: - - targets: ['data-service:8080', 'metadata-service:8080'] + - targets: + - data-service:8080 + - metadata-service:8080 - job_name: 'metrics scrape' metrics_path: '/metrics' static_configs: - - targets: ['ui:3000', 'auth-service:9000', 'analyse-service:8080', 'search-service:8080', 'storage-service:9090', 'dashboard-service:8080', 'dashboard-ui:3000', 'broker-service:15692'] + - targets: + - analyse-service:8080 + - auth-service:9000 + - broker-service:15692 + - data-db-metrics:9104 + - dashboard-service:8080 + - dashboard-ui:3000 + - metadata-db-metrics:9104 + - search-service:8080 + - storage-service:9090 + - ui:3000 + - job_name: 'realm scrape' + metrics_path: '/realms/dbrepo/metrics' + static_configs: + - targets: + - auth-service:8080 diff --git a/dbrepo-search-service/Dockerfile b/dbrepo-search-service/Dockerfile index 1d0862a9e51d82a0f8e8154caea2efec9a51dba0..c290684944d7ff48d177f21c728cbb4d1ee760fc 100644 --- a/dbrepo-search-service/Dockerfile +++ b/dbrepo-search-service/Dockerfile @@ -18,6 +18,9 @@ RUN adduser -D dbrepo --uid 1001 WORKDIR /app +RUN mkdir -p /var/log/app/service/search && \ + chown -R 1001:1001 /var/log/app + USER 1001 COPY --chown=1001 ./friendly_names_overrides.json ./friendly_names_overrides.json diff --git a/dbrepo-search-service/Pipfile b/dbrepo-search-service/Pipfile index 8b070aae40a403e2335fd61e557aeb4bf6d359a6..8e492a5d226f03b095d47b0b2f6d61e3604a81fa 100644 --- a/dbrepo-search-service/Pipfile +++ b/dbrepo-search-service/Pipfile @@ -17,7 +17,7 @@ flask_httpauth = "*" jwt = "~=1.3" rdflib = "*" grafana-client = "*" -dbrepo = {path = "./lib/dbrepo-1.8.1.tar.gz"} +dbrepo = {path = "./lib/dbrepo-1.9.0.tar.gz"} gunicorn = "*" [dev-packages] diff --git a/dbrepo-search-service/Pipfile.lock b/dbrepo-search-service/Pipfile.lock index 6a84b140e9721e0d3c18493d86ec7b0b3bd8d862..e7d2660ca1a3ff218696047ca3256157a1e1510f 100644 --- a/dbrepo-search-service/Pipfile.lock +++ b/dbrepo-search-service/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "5fdbe53734156bd7a407865df89d565d0a9c253c4fbf452d7cdaf2caef73f85b" + "sha256": "3a91c289059bef3bbb9dc4f0686dd2c378e3c3cb19b003d4f0e10de9fd741b55" }, "pipfile-spec": 6, "requires": { @@ -16,109 +16,6 @@ ] }, "default": { - "aiohappyeyeballs": { - "hashes": [ - "sha256:c3f9d0113123803ccadfdf3f0faa505bc78e6a72d1cc4806cbd719826e943558", - "sha256:f349ba8f4b75cb25c99c5c2d84e997e485204d2902a9597802b0371f09331fb8" - ], - "markers": "python_version >= '3.9'", - "version": "==2.6.1" - }, - "aiohttp": { - "hashes": [ - "sha256:004511d3413737700835e949433536a2fe95a7d0297edd911a1e9705c5b5ea43", - "sha256:0902e887b0e1d50424112f200eb9ae3dfed6c0d0a19fc60f633ae5a57c809656", - "sha256:09b00dd520d88eac9d1768439a59ab3d145065c91a8fab97f900d1b5f802895e", - "sha256:0a2f451849e6b39e5c226803dcacfa9c7133e9825dcefd2f4e837a2ec5a3bb98", - "sha256:0a950c2eb8ff17361abd8c85987fd6076d9f47d040ebffce67dce4993285e973", - "sha256:0ad1fb47da60ae1ddfb316f0ff16d1f3b8e844d1a1e154641928ea0583d486ed", - "sha256:13ceac2c5cdcc3f64b9015710221ddf81c900c5febc505dbd8f810e770011540", - "sha256:14461157d8426bcb40bd94deb0450a6fa16f05129f7da546090cebf8f3123b0f", - "sha256:16f8a2c9538c14a557b4d309ed4d0a7c60f0253e8ed7b6c9a2859a7582f8b1b8", - "sha256:17ae4664031aadfbcb34fd40ffd90976671fa0c0286e6c4113989f78bebab37a", - "sha256:1ce63ae04719513dd2651202352a2beb9f67f55cb8490c40f056cea3c5c355ce", - "sha256:23a15727fbfccab973343b6d1b7181bfb0b4aa7ae280f36fd2f90f5476805682", - "sha256:2540ddc83cc724b13d1838026f6a5ad178510953302a49e6d647f6e1de82bc34", - "sha256:37dcee4906454ae377be5937ab2a66a9a88377b11dd7c072df7a7c142b63c37c", - "sha256:38bea84ee4fe24ebcc8edeb7b54bf20f06fd53ce4d2cc8b74344c5b9620597fd", - "sha256:3ab3367bb7f61ad18793fea2ef71f2d181c528c87948638366bf1de26e239183", - "sha256:3ad1d59fd7114e6a08c4814983bb498f391c699f3c78712770077518cae63ff7", - "sha256:3b4e6db8dc4879015b9955778cfb9881897339c8fab7b3676f8433f849425913", - "sha256:3e061b09f6fa42997cf627307f220315e313ece74907d35776ec4373ed718b86", - "sha256:42864e70a248f5f6a49fdaf417d9bc62d6e4d8ee9695b24c5916cb4bb666c802", - "sha256:493910ceb2764f792db4dc6e8e4b375dae1b08f72e18e8f10f18b34ca17d0979", - "sha256:4d0c970c0d602b1017e2067ff3b7dac41c98fef4f7472ec2ea26fd8a4e8c2149", - "sha256:54eb3aead72a5c19fad07219acd882c1643a1027fbcdefac9b502c267242f955", - "sha256:56a3443aca82abda0e07be2e1ecb76a050714faf2be84256dae291182ba59049", - "sha256:576f5ca28d1b3276026f7df3ec841ae460e0fc3aac2a47cbf72eabcfc0f102e1", - "sha256:58ede86453a6cf2d6ce40ef0ca15481677a66950e73b0a788917916f7e35a0bb", - "sha256:61c721764e41af907c9d16b6daa05a458f066015abd35923051be8705108ed17", - "sha256:634d96869be6c4dc232fc503e03e40c42d32cfaa51712aee181e922e61d74814", - "sha256:696ef00e8a1f0cec5e30640e64eca75d8e777933d1438f4facc9c0cdf288a810", - "sha256:69a2cbd61788d26f8f1e626e188044834f37f6ae3f937bd9f08b65fc9d7e514e", - "sha256:6a792ce34b999fbe04a7a71a90c74f10c57ae4c51f65461a411faa70e154154e", - "sha256:6ac13b71761e49d5f9e4d05d33683bbafef753e876e8e5a7ef26e937dd766713", - "sha256:6fdec0213244c39973674ca2a7f5435bf74369e7d4e104d6c7473c81c9bcc8c4", - "sha256:72b1b03fb4655c1960403c131740755ec19c5898c82abd3961c364c2afd59fe7", - "sha256:745f1ed5e2c687baefc3c5e7b4304e91bf3e2f32834d07baaee243e349624b24", - "sha256:776c8e959a01e5e8321f1dec77964cb6101020a69d5a94cd3d34db6d555e01f7", - "sha256:780df0d837276276226a1ff803f8d0fa5f8996c479aeef52eb040179f3156cbd", - "sha256:78e6e23b954644737e385befa0deb20233e2dfddf95dd11e9db752bdd2a294d3", - "sha256:7951decace76a9271a1ef181b04aa77d3cc309a02a51d73826039003210bdc86", - "sha256:7ba92a2d9ace559a0a14b03d87f47e021e4fa7681dc6970ebbc7b447c7d4b7cd", - "sha256:7f6428fee52d2bcf96a8aa7b62095b190ee341ab0e6b1bcf50c615d7966fd45b", - "sha256:87944bd16b7fe6160607f6a17808abd25f17f61ae1e26c47a491b970fb66d8cb", - "sha256:87a6e922b2b2401e0b0cf6b976b97f11ec7f136bfed445e16384fbf6fd5e8602", - "sha256:8cb0688a8d81c63d716e867d59a9ccc389e97ac7037ebef904c2b89334407180", - "sha256:8df6612df74409080575dca38a5237282865408016e65636a76a2eb9348c2567", - "sha256:911a6e91d08bb2c72938bc17f0a2d97864c531536b7832abee6429d5296e5b27", - "sha256:92b7ee222e2b903e0a4b329a9943d432b3767f2d5029dbe4ca59fb75223bbe2e", - "sha256:938f756c2b9374bbcc262a37eea521d8a0e6458162f2a9c26329cc87fdf06534", - "sha256:9756d9b9d4547e091f99d554fbba0d2a920aab98caa82a8fb3d3d9bee3c9ae85", - "sha256:98b88a2bf26965f2015a771381624dd4b0839034b70d406dc74fd8be4cc053e3", - "sha256:9b751a6306f330801665ae69270a8a3993654a85569b3469662efaad6cf5cc50", - "sha256:a2a450bcce4931b295fc0848f384834c3f9b00edfc2150baafb4488c27953de6", - "sha256:a3814760a1a700f3cfd2f977249f1032301d0a12c92aba74605cfa6ce9f78489", - "sha256:a5abcbba9f4b463a45c8ca8b7720891200658f6f46894f79517e6cd11f3405ca", - "sha256:a6db7458ab89c7d80bc1f4e930cc9df6edee2200127cfa6f6e080cf619eddfbd", - "sha256:ad497f38a0d6c329cb621774788583ee12321863cd4bd9feee1effd60f2ad133", - "sha256:ad9509ffb2396483ceacb1eee9134724443ee45b92141105a4645857244aecc8", - "sha256:bbcba75fe879ad6fd2e0d6a8d937f34a571f116a0e4db37df8079e738ea95c71", - "sha256:c10d85e81d0b9ef87970ecbdbfaeec14a361a7fa947118817fcea8e45335fa46", - "sha256:c15b2271c44da77ee9d822552201180779e5e942f3a71fb74e026bf6172ff287", - "sha256:ca37057625693d097543bd88076ceebeb248291df9d6ca8481349efc0b05dcd0", - "sha256:cc3a145479a76ad0ed646434d09216d33d08eef0d8c9a11f5ae5cdc37caa3540", - "sha256:ccf10f16ab498d20e28bc2b5c1306e9c1512f2840f7b6a67000a517a4b37d5ee", - "sha256:cd464ba806e27ee24a91362ba3621bfc39dbbb8b79f2e1340201615197370f7c", - "sha256:d007aa39a52d62373bd23428ba4a2546eed0e7643d7bf2e41ddcefd54519842c", - "sha256:d0666afbe984f6933fe72cd1f1c3560d8c55880a0bdd728ad774006eb4241ecd", - "sha256:d07502cc14ecd64f52b2a74ebbc106893d9a9717120057ea9ea1fd6568a747e7", - "sha256:d489d9778522fbd0f8d6a5c6e48e3514f11be81cb0a5954bdda06f7e1594b321", - "sha256:df7db76400bf46ec6a0a73192b14c8295bdb9812053f4fe53f4e789f3ea66bbb", - "sha256:e3538bc9fe1b902bef51372462e3d7c96fce2b566642512138a480b7adc9d508", - "sha256:e87fd812899aa78252866ae03a048e77bd11b80fb4878ce27c23cade239b42b2", - "sha256:ecdb8173e6c7aa09eee342ac62e193e6904923bd232e76b4157ac0bfa670609f", - "sha256:f244b8e541f414664889e2c87cac11a07b918cb4b540c36f7ada7bfa76571ea2", - "sha256:f4065145bf69de124accdd17ea5f4dc770da0a6a6e440c53f6e0a8c27b3e635c", - "sha256:f420bfe862fb357a6d76f2065447ef6f484bc489292ac91e29bc65d2d7a2c84d", - "sha256:f6ddd90d9fb4b501c97a4458f1c1720e42432c26cb76d28177c5b5ad4e332601", - "sha256:fa73e8c2656a3653ae6c307b3f4e878a21f87859a9afab228280ddccd7369d71", - "sha256:fadbb8f1d4140825069db3fedbbb843290fd5f5bc0a5dbd7eaf81d91bf1b003b", - "sha256:fb3d0cc5cdb926090748ea60172fa8a213cec728bd6c54eae18b96040fcd6227", - "sha256:fb46bb0f24813e6cede6cc07b1961d4b04f331f7112a23b5e21f567da4ee50aa", - "sha256:fd36c119c5d6551bce374fcb5c19269638f8d09862445f85a5a48596fd59f4bb" - ], - "markers": "python_version >= '3.9'", - "version": "==3.11.16" - }, - "aiosignal": { - "hashes": [ - "sha256:45cde58e409a301715980c2b01d0c28bdde3770d8290b5eb2173759d9acb31a5", - "sha256:a8c255c66fafb1e499c9351d0bf32ff2d8a0321595ebac3b93713656d2436f54" - ], - "markers": "python_version >= '3.9'", - "version": "==1.3.2" - }, "annotated-types": { "hashes": [ "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53", @@ -145,11 +42,11 @@ }, "certifi": { "hashes": [ - "sha256:3d5da6925056f6f18f119200434a4780a94263f10d1c21d032a6f6b2baa20651", - "sha256:ca78db4565a652026a4db2bcdf68f2fb589ea80d0be70e03929ed730746b84fe" + "sha256:0a816057ea3cdefcef70270d2c515e4506bbc954f417fa5ade2021213bb8f0c6", + "sha256:30350364dfe371162649852c63336a15c70c6510c2ad5015b21c2345311805f3" ], "markers": "python_version >= '3.6'", - "version": "==2025.1.31" + "version": "==2025.4.26" }, "cffi": { "hashes": [ @@ -226,157 +123,160 @@ }, "charset-normalizer": { "hashes": [ - "sha256:0167ddc8ab6508fe81860a57dd472b2ef4060e8d378f0cc555707126830f2537", - "sha256:01732659ba9b5b873fc117534143e4feefecf3b2078b0a6a2e925271bb6f4cfa", - "sha256:01ad647cdd609225c5350561d084b42ddf732f4eeefe6e678765636791e78b9a", - "sha256:04432ad9479fa40ec0f387795ddad4437a2b50417c69fa275e212933519ff294", - "sha256:0907f11d019260cdc3f94fbdb23ff9125f6b5d1039b76003b5b0ac9d6a6c9d5b", - "sha256:0924e81d3d5e70f8126529951dac65c1010cdf117bb75eb02dd12339b57749dd", - "sha256:09b26ae6b1abf0d27570633b2b078a2a20419c99d66fb2823173d73f188ce601", - "sha256:09b5e6733cbd160dcc09589227187e242a30a49ca5cefa5a7edd3f9d19ed53fd", - "sha256:0af291f4fe114be0280cdd29d533696a77b5b49cfde5467176ecab32353395c4", - "sha256:0f55e69f030f7163dffe9fd0752b32f070566451afe180f99dbeeb81f511ad8d", - "sha256:1a2bc9f351a75ef49d664206d51f8e5ede9da246602dc2d2726837620ea034b2", - "sha256:22e14b5d70560b8dd51ec22863f370d1e595ac3d024cb8ad7d308b4cd95f8313", - "sha256:234ac59ea147c59ee4da87a0c0f098e9c8d169f4dc2a159ef720f1a61bbe27cd", - "sha256:2369eea1ee4a7610a860d88f268eb39b95cb588acd7235e02fd5a5601773d4fa", - "sha256:237bdbe6159cff53b4f24f397d43c6336c6b0b42affbe857970cefbb620911c8", - "sha256:28bf57629c75e810b6ae989f03c0828d64d6b26a5e205535585f96093e405ed1", - "sha256:2967f74ad52c3b98de4c3b32e1a44e32975e008a9cd2a8cc8966d6a5218c5cb2", - "sha256:2a75d49014d118e4198bcee5ee0a6f25856b29b12dbf7cd012791f8a6cc5c496", - "sha256:2bdfe3ac2e1bbe5b59a1a63721eb3b95fc9b6817ae4a46debbb4e11f6232428d", - "sha256:2d074908e1aecee37a7635990b2c6d504cd4766c7bc9fc86d63f9c09af3fa11b", - "sha256:2fb9bd477fdea8684f78791a6de97a953c51831ee2981f8e4f583ff3b9d9687e", - "sha256:311f30128d7d333eebd7896965bfcfbd0065f1716ec92bd5638d7748eb6f936a", - "sha256:329ce159e82018d646c7ac45b01a430369d526569ec08516081727a20e9e4af4", - "sha256:345b0426edd4e18138d6528aed636de7a9ed169b4aaf9d61a8c19e39d26838ca", - "sha256:363e2f92b0f0174b2f8238240a1a30142e3db7b957a5dd5689b0e75fb717cc78", - "sha256:3a3bd0dcd373514dcec91c411ddb9632c0d7d92aed7093b8c3bbb6d69ca74408", - "sha256:3bed14e9c89dcb10e8f3a29f9ccac4955aebe93c71ae803af79265c9ca5644c5", - "sha256:44251f18cd68a75b56585dd00dae26183e102cd5e0f9f1466e6df5da2ed64ea3", - "sha256:44ecbf16649486d4aebafeaa7ec4c9fed8b88101f4dd612dcaf65d5e815f837f", - "sha256:4532bff1b8421fd0a320463030c7520f56a79c9024a4e88f01c537316019005a", - "sha256:49402233c892a461407c512a19435d1ce275543138294f7ef013f0b63d5d3765", - "sha256:4c0907b1928a36d5a998d72d64d8eaa7244989f7aaaf947500d3a800c83a3fd6", - "sha256:4d86f7aff21ee58f26dcf5ae81a9addbd914115cdebcbb2217e4f0ed8982e146", - "sha256:5777ee0881f9499ed0f71cc82cf873d9a0ca8af166dfa0af8ec4e675b7df48e6", - "sha256:5df196eb874dae23dcfb968c83d4f8fdccb333330fe1fc278ac5ceeb101003a9", - "sha256:619a609aa74ae43d90ed2e89bdd784765de0a25ca761b93e196d938b8fd1dbbd", - "sha256:6e27f48bcd0957c6d4cb9d6fa6b61d192d0b13d5ef563e5f2ae35feafc0d179c", - "sha256:6ff8a4a60c227ad87030d76e99cd1698345d4491638dfa6673027c48b3cd395f", - "sha256:73d94b58ec7fecbc7366247d3b0b10a21681004153238750bb67bd9012414545", - "sha256:7461baadb4dc00fd9e0acbe254e3d7d2112e7f92ced2adc96e54ef6501c5f176", - "sha256:75832c08354f595c760a804588b9357d34ec00ba1c940c15e31e96d902093770", - "sha256:7709f51f5f7c853f0fb938bcd3bc59cdfdc5203635ffd18bf354f6967ea0f824", - "sha256:78baa6d91634dfb69ec52a463534bc0df05dbd546209b79a3880a34487f4b84f", - "sha256:7974a0b5ecd505609e3b19742b60cee7aa2aa2fb3151bc917e6e2646d7667dcf", - "sha256:7a4f97a081603d2050bfaffdefa5b02a9ec823f8348a572e39032caa8404a487", - "sha256:7b1bef6280950ee6c177b326508f86cad7ad4dff12454483b51d8b7d673a2c5d", - "sha256:7d053096f67cd1241601111b698f5cad775f97ab25d81567d3f59219b5f1adbd", - "sha256:804a4d582ba6e5b747c625bf1255e6b1507465494a40a2130978bda7b932c90b", - "sha256:807f52c1f798eef6cf26beb819eeb8819b1622ddfeef9d0977a8502d4db6d534", - "sha256:80ed5e856eb7f30115aaf94e4a08114ccc8813e6ed1b5efa74f9f82e8509858f", - "sha256:8417cb1f36cc0bc7eaba8ccb0e04d55f0ee52df06df3ad55259b9a323555fc8b", - "sha256:8436c508b408b82d87dc5f62496973a1805cd46727c34440b0d29d8a2f50a6c9", - "sha256:89149166622f4db9b4b6a449256291dc87a99ee53151c74cbd82a53c8c2f6ccd", - "sha256:8bfa33f4f2672964266e940dd22a195989ba31669bd84629f05fab3ef4e2d125", - "sha256:8c60ca7339acd497a55b0ea5d506b2a2612afb2826560416f6894e8b5770d4a9", - "sha256:91b36a978b5ae0ee86c394f5a54d6ef44db1de0815eb43de826d41d21e4af3de", - "sha256:955f8851919303c92343d2f66165294848d57e9bba6cf6e3625485a70a038d11", - "sha256:97f68b8d6831127e4787ad15e6757232e14e12060bec17091b85eb1486b91d8d", - "sha256:9b23ca7ef998bc739bf6ffc077c2116917eabcc901f88da1b9856b210ef63f35", - "sha256:9f0b8b1c6d84c8034a44893aba5e767bf9c7a211e313a9605d9c617d7083829f", - "sha256:aabfa34badd18f1da5ec1bc2715cadc8dca465868a4e73a0173466b688f29dda", - "sha256:ab36c8eb7e454e34e60eb55ca5d241a5d18b2c6244f6827a30e451c42410b5f7", - "sha256:b010a7a4fd316c3c484d482922d13044979e78d1861f0e0650423144c616a46a", - "sha256:b1ac5992a838106edb89654e0aebfc24f5848ae2547d22c2c3f66454daa11971", - "sha256:b7b2d86dd06bfc2ade3312a83a5c364c7ec2e3498f8734282c6c3d4b07b346b8", - "sha256:b97e690a2118911e39b4042088092771b4ae3fc3aa86518f84b8cf6888dbdb41", - "sha256:bc2722592d8998c870fa4e290c2eec2c1569b87fe58618e67d38b4665dfa680d", - "sha256:c0429126cf75e16c4f0ad00ee0eae4242dc652290f940152ca8c75c3a4b6ee8f", - "sha256:c30197aa96e8eed02200a83fba2657b4c3acd0f0aa4bdc9f6c1af8e8962e0757", - "sha256:c4c3e6da02df6fa1410a7680bd3f63d4f710232d3139089536310d027950696a", - "sha256:c75cb2a3e389853835e84a2d8fb2b81a10645b503eca9bcb98df6b5a43eb8886", - "sha256:c96836c97b1238e9c9e3fe90844c947d5afbf4f4c92762679acfe19927d81d77", - "sha256:d7f50a1f8c450f3925cb367d011448c39239bb3eb4117c36a6d354794de4ce76", - "sha256:d973f03c0cb71c5ed99037b870f2be986c3c05e63622c017ea9816881d2dd247", - "sha256:d98b1668f06378c6dbefec3b92299716b931cd4e6061f3c875a71ced1780ab85", - "sha256:d9c3cdf5390dcd29aa8056d13e8e99526cda0305acc038b96b30352aff5ff2bb", - "sha256:dad3e487649f498dd991eeb901125411559b22e8d7ab25d3aeb1af367df5efd7", - "sha256:dccbe65bd2f7f7ec22c4ff99ed56faa1e9f785482b9bbd7c717e26fd723a1d1e", - "sha256:dd78cfcda14a1ef52584dbb008f7ac81c1328c0f58184bf9a84c49c605002da6", - "sha256:e218488cd232553829be0664c2292d3af2eeeb94b32bea483cf79ac6a694e037", - "sha256:e358e64305fe12299a08e08978f51fc21fac060dcfcddd95453eabe5b93ed0e1", - "sha256:ea0d8d539afa5eb2728aa1932a988a9a7af94f18582ffae4bc10b3fbdad0626e", - "sha256:eab677309cdb30d047996b36d34caeda1dc91149e4fdca0b1a039b3f79d9a807", - "sha256:eb8178fe3dba6450a3e024e95ac49ed3400e506fd4e9e5c32d30adda88cbd407", - "sha256:ecddf25bee22fe4fe3737a399d0d177d72bc22be6913acfab364b40bce1ba83c", - "sha256:eea6ee1db730b3483adf394ea72f808b6e18cf3cb6454b4d86e04fa8c4327a12", - "sha256:f08ff5e948271dc7e18a35641d2f11a4cd8dfd5634f55228b691e62b37125eb3", - "sha256:f30bf9fd9be89ecb2360c7d94a711f00c09b976258846efe40db3d05828e8089", - "sha256:fa88b843d6e211393a37219e6a1c1df99d35e8fd90446f1118f4216e307e48cd", - "sha256:fc54db6c8593ef7d4b2a331b58653356cf04f67c960f584edb7c3d8c97e8f39e", - "sha256:fd4ec41f914fa74ad1b8304bbc634b3de73d2a0889bd32076342a573e0779e00", - "sha256:ffc9202a29ab3920fa812879e95a9e78b2465fd10be7fcbd042899695d75e616" + "sha256:005fa3432484527f9732ebd315da8da8001593e2cf46a3d817669f062c3d9ed4", + "sha256:046595208aae0120559a67693ecc65dd75d46f7bf687f159127046628178dc45", + "sha256:0c29de6a1a95f24b9a1aa7aefd27d2487263f00dfd55a77719b530788f75cff7", + "sha256:0c8c57f84ccfc871a48a47321cfa49ae1df56cd1d965a09abe84066f6853b9c0", + "sha256:0f5d9ed7f254402c9e7d35d2f5972c9bbea9040e99cd2861bd77dc68263277c7", + "sha256:18dd2e350387c87dabe711b86f83c9c78af772c748904d372ade190b5c7c9d4d", + "sha256:1b1bde144d98e446b056ef98e59c256e9294f6b74d7af6846bf5ffdafd687a7d", + "sha256:1c95a1e2902a8b722868587c0e1184ad5c55631de5afc0eb96bc4b0d738092c0", + "sha256:1cad5f45b3146325bb38d6855642f6fd609c3f7cad4dbaf75549bf3b904d3184", + "sha256:21b2899062867b0e1fde9b724f8aecb1af14f2778d69aacd1a5a1853a597a5db", + "sha256:24498ba8ed6c2e0b56d4acbf83f2d989720a93b41d712ebd4f4979660db4417b", + "sha256:25a23ea5c7edc53e0f29bae2c44fcb5a1aa10591aae107f2a2b2583a9c5cbc64", + "sha256:289200a18fa698949d2b39c671c2cc7a24d44096784e76614899a7ccf2574b7b", + "sha256:28a1005facc94196e1fb3e82a3d442a9d9110b8434fc1ded7a24a2983c9888d8", + "sha256:32fc0341d72e0f73f80acb0a2c94216bd704f4f0bce10aedea38f30502b271ff", + "sha256:36b31da18b8890a76ec181c3cf44326bf2c48e36d393ca1b72b3f484113ea344", + "sha256:3c21d4fca343c805a52c0c78edc01e3477f6dd1ad7c47653241cf2a206d4fc58", + "sha256:3fddb7e2c84ac87ac3a947cb4e66d143ca5863ef48e4a5ecb83bd48619e4634e", + "sha256:43e0933a0eff183ee85833f341ec567c0980dae57c464d8a508e1b2ceb336471", + "sha256:4a476b06fbcf359ad25d34a057b7219281286ae2477cc5ff5e3f70a246971148", + "sha256:4e594135de17ab3866138f496755f302b72157d115086d100c3f19370839dd3a", + "sha256:50bf98d5e563b83cc29471fa114366e6806bc06bc7a25fd59641e41445327836", + "sha256:5a9979887252a82fefd3d3ed2a8e3b937a7a809f65dcb1e068b090e165bbe99e", + "sha256:5baececa9ecba31eff645232d59845c07aa030f0c81ee70184a90d35099a0e63", + "sha256:5bf4545e3b962767e5c06fe1738f951f77d27967cb2caa64c28be7c4563e162c", + "sha256:6333b3aa5a12c26b2a4d4e7335a28f1475e0e5e17d69d55141ee3cab736f66d1", + "sha256:65c981bdbd3f57670af8b59777cbfae75364b483fa8a9f420f08094531d54a01", + "sha256:68a328e5f55ec37c57f19ebb1fdc56a248db2e3e9ad769919a58672958e8f366", + "sha256:6a0289e4589e8bdfef02a80478f1dfcb14f0ab696b5a00e1f4b8a14a307a3c58", + "sha256:6b66f92b17849b85cad91259efc341dce9c1af48e2173bf38a85c6329f1033e5", + "sha256:6c9379d65defcab82d07b2a9dfbfc2e95bc8fe0ebb1b176a3190230a3ef0e07c", + "sha256:6fc1f5b51fa4cecaa18f2bd7a003f3dd039dd615cd69a2afd6d3b19aed6775f2", + "sha256:70f7172939fdf8790425ba31915bfbe8335030f05b9913d7ae00a87d4395620a", + "sha256:721c76e84fe669be19c5791da68232ca2e05ba5185575086e384352e2c309597", + "sha256:7222ffd5e4de8e57e03ce2cef95a4c43c98fcb72ad86909abdfc2c17d227fc1b", + "sha256:75d10d37a47afee94919c4fab4c22b9bc2a8bf7d4f46f87363bcf0573f3ff4f5", + "sha256:76af085e67e56c8816c3ccf256ebd136def2ed9654525348cfa744b6802b69eb", + "sha256:770cab594ecf99ae64c236bc9ee3439c3f46be49796e265ce0cc8bc17b10294f", + "sha256:7a6ab32f7210554a96cd9e33abe3ddd86732beeafc7a28e9955cdf22ffadbab0", + "sha256:7c48ed483eb946e6c04ccbe02c6b4d1d48e51944b6db70f697e089c193404941", + "sha256:7f56930ab0abd1c45cd15be65cc741c28b1c9a34876ce8c17a2fa107810c0af0", + "sha256:8075c35cd58273fee266c58c0c9b670947c19df5fb98e7b66710e04ad4e9ff86", + "sha256:8272b73e1c5603666618805fe821edba66892e2870058c94c53147602eab29c7", + "sha256:82d8fd25b7f4675d0c47cf95b594d4e7b158aca33b76aa63d07186e13c0e0ab7", + "sha256:844da2b5728b5ce0e32d863af26f32b5ce61bc4273a9c720a9f3aa9df73b1455", + "sha256:8755483f3c00d6c9a77f490c17e6ab0c8729e39e6390328e42521ef175380ae6", + "sha256:915f3849a011c1f593ab99092f3cecfcb4d65d8feb4a64cf1bf2d22074dc0ec4", + "sha256:926ca93accd5d36ccdabd803392ddc3e03e6d4cd1cf17deff3b989ab8e9dbcf0", + "sha256:982bb1e8b4ffda883b3d0a521e23abcd6fd17418f6d2c4118d257a10199c0ce3", + "sha256:98f862da73774290f251b9df8d11161b6cf25b599a66baf087c1ffe340e9bfd1", + "sha256:9cbfacf36cb0ec2897ce0ebc5d08ca44213af24265bd56eca54bee7923c48fd6", + "sha256:a370b3e078e418187da8c3674eddb9d983ec09445c99a3a263c2011993522981", + "sha256:a955b438e62efdf7e0b7b52a64dc5c3396e2634baa62471768a64bc2adb73d5c", + "sha256:aa6af9e7d59f9c12b33ae4e9450619cf2488e2bbe9b44030905877f0b2324980", + "sha256:aa88ca0b1932e93f2d961bf3addbb2db902198dca337d88c89e1559e066e7645", + "sha256:aaeeb6a479c7667fbe1099af9617c83aaca22182d6cf8c53966491a0f1b7ffb7", + "sha256:aaf27faa992bfee0264dc1f03f4c75e9fcdda66a519db6b957a3f826e285cf12", + "sha256:b2680962a4848b3c4f155dc2ee64505a9c57186d0d56b43123b17ca3de18f0fa", + "sha256:b2d318c11350e10662026ad0eb71bb51c7812fc8590825304ae0bdd4ac283acd", + "sha256:b33de11b92e9f75a2b545d6e9b6f37e398d86c3e9e9653c4864eb7e89c5773ef", + "sha256:b3daeac64d5b371dea99714f08ffc2c208522ec6b06fbc7866a450dd446f5c0f", + "sha256:be1e352acbe3c78727a16a455126d9ff83ea2dfdcbc83148d2982305a04714c2", + "sha256:bee093bf902e1d8fc0ac143c88902c3dfc8941f7ea1d6a8dd2bcb786d33db03d", + "sha256:c72fbbe68c6f32f251bdc08b8611c7b3060612236e960ef848e0a517ddbe76c5", + "sha256:c9e36a97bee9b86ef9a1cf7bb96747eb7a15c2f22bdb5b516434b00f2a599f02", + "sha256:cddf7bd982eaa998934a91f69d182aec997c6c468898efe6679af88283b498d3", + "sha256:cf713fe9a71ef6fd5adf7a79670135081cd4431c2943864757f0fa3a65b1fafd", + "sha256:d11b54acf878eef558599658b0ffca78138c8c3655cf4f3a4a673c437e67732e", + "sha256:d41c4d287cfc69060fa91cae9683eacffad989f1a10811995fa309df656ec214", + "sha256:d524ba3f1581b35c03cb42beebab4a13e6cdad7b36246bd22541fa585a56cccd", + "sha256:daac4765328a919a805fa5e2720f3e94767abd632ae410a9062dff5412bae65a", + "sha256:db4c7bf0e07fc3b7d89ac2a5880a6a8062056801b83ff56d8464b70f65482b6c", + "sha256:dc7039885fa1baf9be153a0626e337aa7ec8bf96b0128605fb0d77788ddc1681", + "sha256:dccab8d5fa1ef9bfba0590ecf4d46df048d18ffe3eec01eeb73a42e0d9e7a8ba", + "sha256:dedb8adb91d11846ee08bec4c8236c8549ac721c245678282dcb06b221aab59f", + "sha256:e45ba65510e2647721e35323d6ef54c7974959f6081b58d4ef5d87c60c84919a", + "sha256:e53efc7c7cee4c1e70661e2e112ca46a575f90ed9ae3fef200f2a25e954f4b28", + "sha256:e635b87f01ebc977342e2697d05b56632f5f879a4f15955dfe8cef2448b51691", + "sha256:e70e990b2137b29dc5564715de1e12701815dacc1d056308e2b17e9095372a82", + "sha256:e8082b26888e2f8b36a042a58307d5b917ef2b1cacab921ad3323ef91901c71a", + "sha256:e8323a9b031aa0393768b87f04b4164a40037fb2a3c11ac06a03ffecd3618027", + "sha256:e92fca20c46e9f5e1bb485887d074918b13543b1c2a1185e69bb8d17ab6236a7", + "sha256:eb30abc20df9ab0814b5a2524f23d75dcf83cde762c161917a2b4b7b55b1e518", + "sha256:eba9904b0f38a143592d9fc0e19e2df0fa2e41c3c3745554761c5f6447eedabf", + "sha256:ef8de666d6179b009dce7bcb2ad4c4a779f113f12caf8dc77f0162c29d20490b", + "sha256:efd387a49825780ff861998cd959767800d54f8308936b21025326de4b5a42b9", + "sha256:f0aa37f3c979cf2546b73e8222bbfa3dc07a641585340179d768068e3455e544", + "sha256:f4074c5a429281bf056ddd4c5d3b740ebca4d43ffffe2ef4bf4d2d05114299da", + "sha256:f69a27e45c43520f5487f27627059b64aaf160415589230992cec34c5e18a509", + "sha256:fb707f3e15060adf5b7ada797624a6c6e0138e2a26baa089df64c68ee98e040f", + "sha256:fcbe676a55d7445b22c10967bceaaf0ee69407fbe0ece4d032b6eb8d4565982a", + "sha256:fdb20a30fe1175ecabed17cbf7812f7b804b8a315a25f24678bcdf120a90077f" ], "markers": "python_version >= '3.7'", - "version": "==3.4.1" + "version": "==3.4.2" }, "click": { "hashes": [ - "sha256:63c132bbbed01578a06712a2d1f497bb62d9c1c0d329b7903a866228027263b2", - "sha256:ed53c9d8990d83c2a27deae68e4ee337473f6330c040a31d4225c9574d16096a" + "sha256:6b303f0b2aa85f1cb4e5303078fadcbcd4e476f114fab9b5007005711839325c", + "sha256:f5452aeddd9988eefa20f90f05ab66f17fce1ee2a36907fd30b05bbb5953814d" ], - "markers": "python_version >= '3.7'", - "version": "==8.1.8" + "markers": "python_version >= '3.10'", + "version": "==8.2.0" }, "cryptography": { "hashes": [ - "sha256:04abd71114848aa25edb28e225ab5f268096f44cf0127f3d36975bdf1bdf3390", - "sha256:0529b1d5a0105dd3731fa65680b45ce49da4d8115ea76e9da77a875396727b41", - "sha256:1bc312dfb7a6e5d66082c87c34c8a62176e684b6fe3d90fcfe1568de675e6688", - "sha256:268e4e9b177c76d569e8a145a6939eca9a5fec658c932348598818acf31ae9a5", - "sha256:29ecec49f3ba3f3849362854b7253a9f59799e3763b0c9d0826259a88efa02f1", - "sha256:2bf7bf75f7df9715f810d1b038870309342bff3069c5bd8c6b96128cb158668d", - "sha256:3b721b8b4d948b218c88cb8c45a01793483821e709afe5f622861fc6182b20a7", - "sha256:3c00b6b757b32ce0f62c574b78b939afab9eecaf597c4d624caca4f9e71e7843", - "sha256:3dc62975e31617badc19a906481deacdeb80b4bb454394b4098e3f2525a488c5", - "sha256:4973da6ca3db4405c54cd0b26d328be54c7747e89e284fcff166132eb7bccc9c", - "sha256:4e389622b6927d8133f314949a9812972711a111d577a5d1f4bee5e58736b80a", - "sha256:51e4de3af4ec3899d6d178a8c005226491c27c4ba84101bfb59c901e10ca9f79", - "sha256:5f6f90b72d8ccadb9c6e311c775c8305381db88374c65fa1a68250aa8a9cb3a6", - "sha256:6210c05941994290f3f7f175a4a57dbbb2afd9273657614c506d5976db061181", - "sha256:6f101b1f780f7fc613d040ca4bdf835c6ef3b00e9bd7125a4255ec574c7916e4", - "sha256:7bdcd82189759aba3816d1f729ce42ffded1ac304c151d0a8e89b9996ab863d5", - "sha256:7ca25849404be2f8e4b3c59483d9d3c51298a22c1c61a0e84415104dacaf5562", - "sha256:81276f0ea79a208d961c433a947029e1a15948966658cf6710bbabb60fcc2639", - "sha256:8cadc6e3b5a1f144a039ea08a0bdb03a2a92e19c46be3285123d32029f40a922", - "sha256:8e0ddd63e6bf1161800592c71ac794d3fb8001f2caebe0966e77c5234fa9efc3", - "sha256:909c97ab43a9c0c0b0ada7a1281430e4e5ec0458e6d9244c0e821bbf152f061d", - "sha256:96e7a5e9d6e71f9f4fca8eebfd603f8e86c5225bb18eb621b2c1e50b290a9471", - "sha256:9a1e657c0f4ea2a23304ee3f964db058c9e9e635cc7019c4aa21c330755ef6fd", - "sha256:9eb9d22b0a5d8fd9925a7764a054dca914000607dff201a24c791ff5c799e1fa", - "sha256:af4ff3e388f2fa7bff9f7f2b31b87d5651c45731d3e8cfa0944be43dff5cfbdb", - "sha256:b042d2a275c8cee83a4b7ae30c45a15e6a4baa65a179a0ec2d78ebb90e4f6699", - "sha256:bc821e161ae88bfe8088d11bb39caf2916562e0a2dc7b6d56714a48b784ef0bb", - "sha256:c505d61b6176aaf982c5717ce04e87da5abc9a36a5b39ac03905c4aafe8de7aa", - "sha256:c63454aa261a0cf0c5b4718349629793e9e634993538db841165b3df74f37ec0", - "sha256:c7362add18b416b69d58c910caa217f980c5ef39b23a38a0880dfd87bdf8cd23", - "sha256:d03806036b4f89e3b13b6218fefea8d5312e450935b1a2d55f0524e2ed7c59d9", - "sha256:d1b3031093a366ac767b3feb8bcddb596671b3aaff82d4050f984da0c248b615", - "sha256:d1c3572526997b36f245a96a2b1713bf79ce99b271bbcf084beb6b9b075f29ea", - "sha256:efcfe97d1b3c79e486554efddeb8f6f53a4cdd4cf6086642784fa31fc384e1d7", - "sha256:f514ef4cd14bb6fb484b4a60203e912cfcb64f2ab139e88c2274511514bf7308" + "sha256:057723b79752a142efbc609e90b0dff27b0361ccbee3bd48312d70f5cdf53b78", + "sha256:05c2385b1f5c89a17df19900cfb1345115a77168f5ed44bdf6fd3de1ce5cc65b", + "sha256:08281de408e7eb71ba3cd5098709a356bfdf65eebd7ee7633c3610f0aa80d79b", + "sha256:10d68763892a7b19c22508ab57799c4423c7c8cd61d7eee4c5a6a55a46511949", + "sha256:1655d3a76e3dedb683c982a6c3a2cbfae2d08f47a48ec5a3d58db52b3d29ea6f", + "sha256:18f8084b7ca3ce1b8d38bdfe33c48116edf9a08b4d056ef4a96dceaa36d8d965", + "sha256:2cb03a944a1a412724d15a7c051d50e63a868031f26b6a312f2016965b661942", + "sha256:4142e20c29224cec63e9e32eb1e6014fb285fe39b7be66b3564ca978a3a8afe9", + "sha256:463096533acd5097f8751115bc600b0b64620c4aafcac10c6d0041e6e68f88fe", + "sha256:48caa55c528617fa6db1a9c3bf2e37ccb31b73e098ac2b71408d1f2db551dde4", + "sha256:49af56491473231159c98c2c26f1a8f3799a60e5cf0e872d00745b858ddac9d2", + "sha256:4cc31c66411e14dd70e2f384a9204a859dc25b05e1f303df0f5326691061b839", + "sha256:501de1296b2041dccf2115e3c7d4947430585601b251b140970ce255c5cfb985", + "sha256:59c0c8f043dd376bbd9d4f636223836aed50431af4c5a467ed9bf61520294627", + "sha256:614bca7c6ed0d8ad1dce683a6289afae1f880675b4090878a0136c3da16bc693", + "sha256:61a8b1bbddd9332917485b2453d1de49f142e6334ce1d97b7916d5a85d179c84", + "sha256:7429936146063bd1b2cfc54f0e04016b90ee9b1c908a7bed0800049cbace70eb", + "sha256:7c73968fbb7698a4c5d6160859db560d3aac160edde89c751edd5a8bc6560c88", + "sha256:80303ee6a02ef38c4253160446cbeb5c400c07e01d4ddbd4ff722a89b736d95a", + "sha256:965611880c3fa8e504b7458484c0697e00ae6e937279cd6734fdaa2bc954dc49", + "sha256:9a900036b42f7324df7c7ad9569eb92ba0b613cf699160dd9c2154b24fd02f8e", + "sha256:9cfd1399064b13043082c660ddd97a0358e41c8b0dc7b77c1243e013d305c344", + "sha256:a8ec324711596fbf21837d3a5db543937dd84597d364769b46e0102250023f77", + "sha256:a9727a21957d3327cf6b7eb5ffc9e4b663909a25fea158e3fcbc49d4cdd7881b", + "sha256:b19f4b28dd2ef2e6d600307fee656c00825a2980c4356a7080bd758d633c3a6f", + "sha256:b2de529027579e43b6dc1f805f467b102fb7d13c1e54c334f1403ee2b37d0059", + "sha256:c0c000c1a09f069632d8a9eb3b610ac029fcc682f1d69b758e625d6ee713f4ed", + "sha256:cdafb86eb673c3211accffbffdb3cdffa3aaafacd14819e0898d23696d18e4d3", + "sha256:d2a90ce2f0f5b695e4785ac07c19a58244092f3c85d57db6d8eb1a2b26d2aad6", + "sha256:d784d57b958ffd07e9e226d17272f9af0c41572557604ca7554214def32c26bf", + "sha256:d891942592789fa0ab71b502550bbadb12f540d7413d7d7c4cef4b02af0f5bc6", + "sha256:dc7693573f16535428183de8fd27f0ca1ca37a51baa0b41dc5ed7b3d68fe80e2", + "sha256:ddb8d01aa900b741d6b7cc585a97aff787175f160ab975e21f880e89d810781a", + "sha256:e328357b6bbf79928363dbf13f4635b7aac0306afb7e5ad24d21d0c5761c3253", + "sha256:e86c8d54cd19a13e9081898b3c24351683fd39d726ecf8e774aaa9d8d96f5f3a", + "sha256:e9e4bdcd70216b08801e267c0b563316b787f957a46e215249921f99288456f9", + "sha256:f169469d04a23282de9d0be349499cb6683b6ff1b68901210faacac9b0c24b7d" ], "markers": "python_version >= '3.7' and python_full_version not in '3.9.0, 3.9.1'", - "version": "==44.0.2" + "version": "==45.0.2" }, "dbrepo": { "hashes": [ - "sha256:4dc7da6e48b618d44e82f3ad392c4d1ef7917a0cd46bb13af78a73f3062d7319" + "sha256:76f0ab97d1e914a779aa51b5e5a17591b2f1c88f15dc9df27273deb4dc7ed125", + "sha256:f01ee3102dc405c00b5e61cd1d62a46f9644ca33d131912cc25130a5ec304378" ], - "path": "./lib/dbrepo-1.8.1.tar.gz", - "version": "==1.8.1" + "path": "./lib/dbrepo-1.9.0.tar.gz", + "version": "==1.9.0" }, "events": { "hashes": [ @@ -431,104 +331,6 @@ "index": "pypi", "version": "==3.1.1" }, - "frozenlist": { - "hashes": [ - "sha256:000a77d6034fbad9b6bb880f7ec073027908f1b40254b5d6f26210d2dab1240e", - "sha256:03d33c2ddbc1816237a67f66336616416e2bbb6beb306e5f890f2eb22b959cdf", - "sha256:04a5c6babd5e8fb7d3c871dc8b321166b80e41b637c31a995ed844a6139942b6", - "sha256:0996c66760924da6e88922756d99b47512a71cfd45215f3570bf1e0b694c206a", - "sha256:0cc974cc93d32c42e7b0f6cf242a6bd941c57c61b618e78b6c0a96cb72788c1d", - "sha256:0f253985bb515ecd89629db13cb58d702035ecd8cfbca7d7a7e29a0e6d39af5f", - "sha256:11aabdd62b8b9c4b84081a3c246506d1cddd2dd93ff0ad53ede5defec7886b28", - "sha256:12f78f98c2f1c2429d42e6a485f433722b0061d5c0b0139efa64f396efb5886b", - "sha256:140228863501b44b809fb39ec56b5d4071f4d0aa6d216c19cbb08b8c5a7eadb9", - "sha256:1431d60b36d15cda188ea222033eec8e0eab488f39a272461f2e6d9e1a8e63c2", - "sha256:15538c0cbf0e4fa11d1e3a71f823524b0c46299aed6e10ebb4c2089abd8c3bec", - "sha256:15b731db116ab3aedec558573c1a5eec78822b32292fe4f2f0345b7f697745c2", - "sha256:17dcc32fc7bda7ce5875435003220a457bcfa34ab7924a49a1c19f55b6ee185c", - "sha256:1893f948bf6681733aaccf36c5232c231e3b5166d607c5fa77773611df6dc336", - "sha256:189f03b53e64144f90990d29a27ec4f7997d91ed3d01b51fa39d2dbe77540fd4", - "sha256:1a8ea951bbb6cacd492e3948b8da8c502a3f814f5d20935aae74b5df2b19cf3d", - "sha256:1b96af8c582b94d381a1c1f51ffaedeb77c821c690ea5f01da3d70a487dd0a9b", - "sha256:1e76bfbc72353269c44e0bc2cfe171900fbf7f722ad74c9a7b638052afe6a00c", - "sha256:2150cc6305a2c2ab33299453e2968611dacb970d2283a14955923062c8d00b10", - "sha256:226d72559fa19babe2ccd920273e767c96a49b9d3d38badd7c91a0fdeda8ea08", - "sha256:237f6b23ee0f44066219dae14c70ae38a63f0440ce6750f868ee08775073f942", - "sha256:29d94c256679247b33a3dc96cce0f93cbc69c23bf75ff715919332fdbb6a32b8", - "sha256:2b5e23253bb709ef57a8e95e6ae48daa9ac5f265637529e4ce6b003a37b2621f", - "sha256:2d0da8bbec082bf6bf18345b180958775363588678f64998c2b7609e34719b10", - "sha256:2f3f7a0fbc219fb4455264cae4d9f01ad41ae6ee8524500f381de64ffaa077d5", - "sha256:30c72000fbcc35b129cb09956836c7d7abf78ab5416595e4857d1cae8d6251a6", - "sha256:31115ba75889723431aa9a4e77d5f398f5cf976eea3bdf61749731f62d4a4a21", - "sha256:31a9ac2b38ab9b5a8933b693db4939764ad3f299fcaa931a3e605bc3460e693c", - "sha256:366d8f93e3edfe5a918c874702f78faac300209a4d5bf38352b2c1bdc07a766d", - "sha256:374ca2dabdccad8e2a76d40b1d037f5bd16824933bf7bcea3e59c891fd4a0923", - "sha256:44c49271a937625619e862baacbd037a7ef86dd1ee215afc298a417ff3270608", - "sha256:45e0896250900b5aa25180f9aec243e84e92ac84bd4a74d9ad4138ef3f5c97de", - "sha256:498524025a5b8ba81695761d78c8dd7382ac0b052f34e66939c42df860b8ff17", - "sha256:50cf5e7ee9b98f22bdecbabf3800ae78ddcc26e4a435515fc72d97903e8488e0", - "sha256:52ef692a4bc60a6dd57f507429636c2af8b6046db8b31b18dac02cbc8f507f7f", - "sha256:561eb1c9579d495fddb6da8959fd2a1fca2c6d060d4113f5844b433fc02f2641", - "sha256:5a3ba5f9a0dfed20337d3e966dc359784c9f96503674c2faf015f7fe8e96798c", - "sha256:5b6a66c18b5b9dd261ca98dffcb826a525334b2f29e7caa54e182255c5f6a65a", - "sha256:5c28f4b5dbef8a0d8aad0d4de24d1e9e981728628afaf4ea0792f5d0939372f0", - "sha256:5d7f5a50342475962eb18b740f3beecc685a15b52c91f7d975257e13e029eca9", - "sha256:6321899477db90bdeb9299ac3627a6a53c7399c8cd58d25da094007402b039ab", - "sha256:6482a5851f5d72767fbd0e507e80737f9c8646ae7fd303def99bfe813f76cf7f", - "sha256:666534d15ba8f0fda3f53969117383d5dc021266b3c1a42c9ec4855e4b58b9d3", - "sha256:683173d371daad49cffb8309779e886e59c2f369430ad28fe715f66d08d4ab1a", - "sha256:6e9080bb2fb195a046e5177f10d9d82b8a204c0736a97a153c2466127de87784", - "sha256:73f2e31ea8dd7df61a359b731716018c2be196e5bb3b74ddba107f694fbd7604", - "sha256:7437601c4d89d070eac8323f121fcf25f88674627505334654fd027b091db09d", - "sha256:76e4753701248476e6286f2ef492af900ea67d9706a0155335a40ea21bf3b2f5", - "sha256:7707a25d6a77f5d27ea7dc7d1fc608aa0a478193823f88511ef5e6b8a48f9d03", - "sha256:7948140d9f8ece1745be806f2bfdf390127cf1a763b925c4a805c603df5e697e", - "sha256:7a1a048f9215c90973402e26c01d1cff8a209e1f1b53f72b95c13db61b00f953", - "sha256:7d57d8f702221405a9d9b40f9da8ac2e4a1a8b5285aac6100f3393675f0a85ee", - "sha256:7f3c8c1dacd037df16e85227bac13cca58c30da836c6f936ba1df0c05d046d8d", - "sha256:81d5af29e61b9c8348e876d442253723928dce6433e0e76cd925cd83f1b4b817", - "sha256:828afae9f17e6de596825cf4228ff28fbdf6065974e5ac1410cecc22f699d2b3", - "sha256:87f724d055eb4785d9be84e9ebf0f24e392ddfad00b3fe036e43f489fafc9039", - "sha256:8969190d709e7c48ea386db202d708eb94bdb29207a1f269bab1196ce0dcca1f", - "sha256:90646abbc7a5d5c7c19461d2e3eeb76eb0b204919e6ece342feb6032c9325ae9", - "sha256:91d6c171862df0a6c61479d9724f22efb6109111017c87567cfeb7b5d1449fdf", - "sha256:9272fa73ca71266702c4c3e2d4a28553ea03418e591e377a03b8e3659d94fa76", - "sha256:92b5278ed9d50fe610185ecd23c55d8b307d75ca18e94c0e7de328089ac5dcba", - "sha256:97160e245ea33d8609cd2b8fd997c850b56db147a304a262abc2b3be021a9171", - "sha256:977701c081c0241d0955c9586ffdd9ce44f7a7795df39b9151cd9a6fd0ce4cfb", - "sha256:9b7dc0c4338e6b8b091e8faf0db3168a37101943e687f373dce00959583f7439", - "sha256:9b93d7aaa36c966fa42efcaf716e6b3900438632a626fb09c049f6a2f09fc631", - "sha256:9bbcdfaf4af7ce002694a4e10a0159d5a8d20056a12b05b45cea944a4953f972", - "sha256:9c2623347b933fcb9095841f1cc5d4ff0b278addd743e0e966cb3d460278840d", - "sha256:a2fe128eb4edeabe11896cb6af88fca5346059f6c8d807e3b910069f39157869", - "sha256:a72b7a6e3cd2725eff67cd64c8f13335ee18fc3c7befc05aed043d24c7b9ccb9", - "sha256:a9fe0f1c29ba24ba6ff6abf688cb0b7cf1efab6b6aa6adc55441773c252f7411", - "sha256:b97f7b575ab4a8af9b7bc1d2ef7f29d3afee2226bd03ca3875c16451ad5a7723", - "sha256:bdac3c7d9b705d253b2ce370fde941836a5f8b3c5c2b8fd70940a3ea3af7f4f2", - "sha256:c03eff4a41bd4e38415cbed054bbaff4a075b093e2394b6915dca34a40d1e38b", - "sha256:c16d2fa63e0800723139137d667e1056bee1a1cf7965153d2d104b62855e9b99", - "sha256:c1fac3e2ace2eb1052e9f7c7db480818371134410e1f5c55d65e8f3ac6d1407e", - "sha256:ce3aa154c452d2467487765e3adc730a8c153af77ad84096bc19ce19a2400840", - "sha256:cee6798eaf8b1416ef6909b06f7dc04b60755206bddc599f52232606e18179d3", - "sha256:d1b3eb7b05ea246510b43a7e53ed1653e55c2121019a97e60cad7efb881a97bb", - "sha256:d994863bba198a4a518b467bb971c56e1db3f180a25c6cf7bb1949c267f748c3", - "sha256:dd47a5181ce5fcb463b5d9e17ecfdb02b678cca31280639255ce9d0e5aa67af0", - "sha256:dd94994fc91a6177bfaafd7d9fd951bc8689b0a98168aa26b5f543868548d3ca", - "sha256:de537c11e4aa01d37db0d403b57bd6f0546e71a82347a97c6a9f0dcc532b3a45", - "sha256:df6e2f325bfee1f49f81aaac97d2aa757c7646534a06f8f577ce184afe2f0a9e", - "sha256:e66cc454f97053b79c2ab09c17fbe3c825ea6b4de20baf1be28919460dd7877f", - "sha256:e79225373c317ff1e35f210dd5f1344ff31066ba8067c307ab60254cd3a78ad5", - "sha256:f1577515d35ed5649d52ab4319db757bb881ce3b2b796d7283e6634d99ace307", - "sha256:f1e6540b7fa044eee0bb5111ada694cf3dc15f2b0347ca125ee9ca984d5e9e6e", - "sha256:f2ac49a9bedb996086057b75bf93538240538c6d9b38e57c82d51f75a73409d2", - "sha256:f47c9c9028f55a04ac254346e92977bf0f166c483c74b4232bee19a6697e4778", - "sha256:f5f9da7f5dbc00a604fe74aa02ae7c98bcede8a3b8b9666f9f86fc13993bc71a", - "sha256:fd74520371c3c4175142d02a976aee0b4cb4a7cc912a60586ffd8d5929979b30", - "sha256:feeb64bc9bcc6b45c6311c9e9b99406660a9c05ca8a5b30d14a78555088b0b3a" - ], - "markers": "python_version >= '3.8'", - "version": "==1.5.0" - }, "grafana-client": { "hashes": [ "sha256:2477a47b923fd0637947e620b0b777c641af18a3025464fa4505783dbf05dfcc", @@ -539,82 +341,64 @@ }, "greenlet": { "hashes": [ - "sha256:0153404a4bb921f0ff1abeb5ce8a5131da56b953eda6e14b88dc6bbc04d2049e", - "sha256:03a088b9de532cbfe2ba2034b2b85e82df37874681e8c470d6fb2f8c04d7e4b7", - "sha256:04b013dc07c96f83134b1e99888e7a79979f1a247e2a9f59697fa14b5862ed01", - "sha256:05175c27cb459dcfc05d026c4232f9de8913ed006d42713cb8a5137bd49375f1", - "sha256:09fc016b73c94e98e29af67ab7b9a879c307c6731a2c9da0db5a7d9b7edd1159", - "sha256:0bbae94a29c9e5c7e4a2b7f0aae5c17e8e90acbfd3bf6270eeba60c39fce3563", - "sha256:0fde093fb93f35ca72a556cf72c92ea3ebfda3d79fc35bb19fbe685853869a83", - "sha256:1443279c19fca463fc33e65ef2a935a5b09bb90f978beab37729e1c3c6c25fe9", - "sha256:1776fd7f989fc6b8d8c8cb8da1f6b82c5814957264d1f6cf818d475ec2bf6395", - "sha256:1d3755bcb2e02de341c55b4fca7a745a24a9e7212ac953f6b3a48d117d7257aa", - "sha256:23f20bb60ae298d7d8656c6ec6db134bca379ecefadb0b19ce6f19d1f232a942", - "sha256:275f72decf9932639c1c6dd1013a1bc266438eb32710016a1c742df5da6e60a1", - "sha256:2846930c65b47d70b9d178e89c7e1a69c95c1f68ea5aa0a58646b7a96df12441", - "sha256:3319aa75e0e0639bc15ff54ca327e8dc7a6fe404003496e3c6925cd3142e0e22", - "sha256:346bed03fe47414091be4ad44786d1bd8bef0c3fcad6ed3dee074a032ab408a9", - "sha256:36b89d13c49216cadb828db8dfa6ce86bbbc476a82d3a6c397f0efae0525bdd0", - "sha256:37b9de5a96111fc15418819ab4c4432e4f3c2ede61e660b1e33971eba26ef9ba", - "sha256:396979749bd95f018296af156201d6211240e7a23090f50a8d5d18c370084dc3", - "sha256:3b2813dc3de8c1ee3f924e4d4227999285fd335d1bcc0d2be6dc3f1f6a318ec1", - "sha256:411f015496fec93c1c8cd4e5238da364e1da7a124bcb293f085bf2860c32c6f6", - "sha256:47da355d8687fd65240c364c90a31569a133b7b60de111c255ef5b606f2ae291", - "sha256:48ca08c771c268a768087b408658e216133aecd835c0ded47ce955381105ba39", - "sha256:4afe7ea89de619adc868e087b4d2359282058479d7cfb94970adf4b55284574d", - "sha256:4ce3ac6cdb6adf7946475d7ef31777c26d94bccc377e070a7986bd2d5c515467", - "sha256:4ead44c85f8ab905852d3de8d86f6f8baf77109f9da589cb4fa142bd3b57b475", - "sha256:54558ea205654b50c438029505def3834e80f0869a70fb15b871c29b4575ddef", - "sha256:5e06afd14cbaf9e00899fae69b24a32f2196c19de08fcb9f4779dd4f004e5e7c", - "sha256:62ee94988d6b4722ce0028644418d93a52429e977d742ca2ccbe1c4f4a792511", - "sha256:63e4844797b975b9af3a3fb8f7866ff08775f5426925e1e0bbcfe7932059a12c", - "sha256:6510bf84a6b643dabba74d3049ead221257603a253d0a9873f55f6a59a65f822", - "sha256:667a9706c970cb552ede35aee17339a18e8f2a87a51fba2ed39ceeeb1004798a", - "sha256:6ef9ea3f137e5711f0dbe5f9263e8c009b7069d8a1acea822bd5e9dae0ae49c8", - "sha256:7017b2be767b9d43cc31416aba48aab0d2309ee31b4dbf10a1d38fb7972bdf9d", - "sha256:7124e16b4c55d417577c2077be379514321916d5790fa287c9ed6f23bd2ffd01", - "sha256:73aaad12ac0ff500f62cebed98d8789198ea0e6f233421059fa68a5aa7220145", - "sha256:77c386de38a60d1dfb8e55b8c1101d68c79dfdd25c7095d51fec2dd800892b80", - "sha256:7876452af029456b3f3549b696bb36a06db7c90747740c5302f74a9e9fa14b13", - "sha256:7939aa3ca7d2a1593596e7ac6d59391ff30281ef280d8632fa03d81f7c5f955e", - "sha256:8320f64b777d00dd7ccdade271eaf0cad6636343293a25074cc5566160e4de7b", - "sha256:85f3ff71e2e60bd4b4932a043fbbe0f499e263c628390b285cb599154a3b03b1", - "sha256:8b8b36671f10ba80e159378df9c4f15c14098c4fd73a36b9ad715f057272fbef", - "sha256:93147c513fac16385d1036b7e5b102c7fbbdb163d556b791f0f11eada7ba65dc", - "sha256:935e943ec47c4afab8965954bf49bfa639c05d4ccf9ef6e924188f762145c0ff", - "sha256:94b6150a85e1b33b40b1464a3f9988dcc5251d6ed06842abff82e42632fac120", - "sha256:94ebba31df2aa506d7b14866fed00ac141a867e63143fe5bca82a8e503b36437", - "sha256:95ffcf719966dd7c453f908e208e14cde192e09fde6c7186c8f1896ef778d8cd", - "sha256:98884ecf2ffb7d7fe6bd517e8eb99d31ff7855a840fa6d0d63cd07c037f6a981", - "sha256:99cfaa2110534e2cf3ba31a7abcac9d328d1d9f1b95beede58294a60348fba36", - "sha256:9e8f8c9cb53cdac7ba9793c276acd90168f416b9ce36799b9b885790f8ad6c0a", - "sha256:a0dfc6c143b519113354e780a50381508139b07d2177cb6ad6a08278ec655798", - "sha256:b2795058c23988728eec1f36a4e5e4ebad22f8320c85f3587b539b9ac84128d7", - "sha256:b42703b1cf69f2aa1df7d1030b9d77d3e584a70755674d60e710f0af570f3761", - "sha256:b7cede291382a78f7bb5f04a529cb18e068dd29e0fb27376074b6d0317bf4dd0", - "sha256:b8a678974d1f3aa55f6cc34dc480169d58f2e6d8958895d68845fa4ab566509e", - "sha256:b8da394b34370874b4572676f36acabac172602abf054cbc4ac910219f3340af", - "sha256:c3a701fe5a9695b238503ce5bbe8218e03c3bcccf7e204e455e7462d770268aa", - "sha256:c4aab7f6381f38a4b42f269057aee279ab0fc7bf2e929e3d4abfae97b682a12c", - "sha256:ca9d0ff5ad43e785350894d97e13633a66e2b50000e8a183a50a88d834752d42", - "sha256:d0028e725ee18175c6e422797c407874da24381ce0690d6b9396c204c7f7276e", - "sha256:d21e10da6ec19b457b82636209cbe2331ff4306b54d06fa04b7c138ba18c8a81", - "sha256:d5e975ca70269d66d17dd995dafc06f1b06e8cb1ec1e9ed54c1d1e4a7c4cf26e", - "sha256:da7a9bff22ce038e19bf62c4dd1ec8391062878710ded0a845bcf47cc0200617", - "sha256:db32b5348615a04b82240cc67983cb315309e88d444a288934ee6ceaebcad6cc", - "sha256:dcc62f31eae24de7f8dce72134c8651c58000d3b1868e01392baea7c32c247de", - "sha256:dfc59d69fc48664bc693842bd57acfdd490acafda1ab52c7836e3fc75c90a111", - "sha256:e347b3bfcf985a05e8c0b7d462ba6f15b1ee1c909e2dcad795e49e91b152c383", - "sha256:e4d333e558953648ca09d64f13e6d8f0523fa705f51cae3f03b5983489958c70", - "sha256:ed10eac5830befbdd0c32f83e8aa6288361597550ba669b04c48f0f9a2c843c6", - "sha256:efc0f674aa41b92da8c49e0346318c6075d734994c3c4e4430b1c3f853e498e4", - "sha256:f1695e76146579f8c06c1509c7ce4dfe0706f49c6831a817ac04eebb2fd02011", - "sha256:f1d4aeb8891338e60d1ab6127af1fe45def5259def8094b9c7e34690c8858803", - "sha256:f406b22b7c9a9b4f8aa9d2ab13d6ae0ac3e85c9a809bd590ad53fed2bf70dc79", - "sha256:f6ff3b14f2df4c41660a7dec01045a045653998784bf8cfcb5a525bdffffbc8f" - ], - "markers": "python_version < '3.14' and (platform_machine == 'aarch64' or (platform_machine == 'ppc64le' or (platform_machine == 'x86_64' or (platform_machine == 'amd64' or (platform_machine == 'AMD64' or (platform_machine == 'win32' or platform_machine == 'WIN32'))))))", - "version": "==3.1.1" + "sha256:00cd814b8959b95a546e47e8d589610534cfb71f19802ea8a2ad99d95d702057", + "sha256:02a98600899ca1ca5d3a2590974c9e3ec259503b2d6ba6527605fcd74e08e207", + "sha256:02f5972ff02c9cf615357c17ab713737cccfd0eaf69b951084a9fd43f39833d3", + "sha256:055916fafad3e3388d27dd68517478933a97edc2fc54ae79d3bec827de2c64c4", + "sha256:0a16fb934fcabfdfacf21d79e6fed81809d8cd97bc1be9d9c89f0e4567143d7b", + "sha256:1592a615b598643dbfd566bac8467f06c8c8ab6e56f069e573832ed1d5d528cc", + "sha256:1919cbdc1c53ef739c94cf2985056bcc0838c1f217b57647cbf4578576c63825", + "sha256:1e4747712c4365ef6765708f948acc9c10350719ca0545e362c24ab973017370", + "sha256:1e76106b6fc55fa3d6fe1c527f95ee65e324a13b62e243f77b48317346559708", + "sha256:1f72667cc341c95184f1c68f957cb2d4fc31eef81646e8e59358a10ce6689457", + "sha256:2593283bf81ca37d27d110956b79e8723f9aa50c4bcdc29d3c0543d4743d2763", + "sha256:2dc5c43bb65ec3669452af0ab10729e8fdc17f87a1f2ad7ec65d4aaaefabf6bf", + "sha256:3091bc45e6b0c73f225374fefa1536cd91b1e987377b12ef5b19129b07d93ebe", + "sha256:354f67445f5bed6604e493a06a9a49ad65675d3d03477d38a4db4a427e9aad0e", + "sha256:3885f85b61798f4192d544aac7b25a04ece5fe2704670b4ab73c2d2c14ab740d", + "sha256:3ab7194ee290302ca15449f601036007873028712e92ca15fc76597a0aeb4c59", + "sha256:3aeca9848d08ce5eb653cf16e15bb25beeab36e53eb71cc32569f5f3afb2a3aa", + "sha256:44671c29da26539a5f142257eaba5110f71887c24d40df3ac87f1117df589e0e", + "sha256:45f9f4853fb4cc46783085261c9ec4706628f3b57de3e68bae03e8f8b3c0de51", + "sha256:4bd139e4943547ce3a56ef4b8b1b9479f9e40bb47e72cc906f0f66b9d0d5cab3", + "sha256:4fefc7aa68b34b9224490dfda2e70ccf2131368493add64b4ef2d372955c207e", + "sha256:6629311595e3fe7304039c67f00d145cd1d38cf723bb5b99cc987b23c1433d61", + "sha256:6fadd183186db360b61cb34e81117a096bff91c072929cd1b529eb20dd46e6c5", + "sha256:71566302219b17ca354eb274dfd29b8da3c268e41b646f330e324e3967546a74", + "sha256:7409796591d879425997a518138889d8d17e63ada7c99edc0d7a1c22007d4907", + "sha256:752f0e79785e11180ebd2e726c8a88109ded3e2301d40abced2543aa5d164275", + "sha256:7791dcb496ec53d60c7f1c78eaa156c21f402dda38542a00afc3e20cae0f480f", + "sha256:782743700ab75716650b5238a4759f840bb2dcf7bff56917e9ffdf9f1f23ec59", + "sha256:7c9896249fbef2c615853b890ee854f22c671560226c9221cfd27c995db97e5c", + "sha256:85f3e248507125bf4af607a26fd6cb8578776197bd4b66e35229cdf5acf1dfbf", + "sha256:89c69e9a10670eb7a66b8cef6354c24671ba241f46152dd3eed447f79c29fb5b", + "sha256:8cb8553ee954536500d88a1a2f58fcb867e45125e600e80f586ade399b3f8819", + "sha256:9ae572c996ae4b5e122331e12bbb971ea49c08cc7c232d1bd43150800a2d6c65", + "sha256:9c7b15fb9b88d9ee07e076f5a683027bc3befd5bb5d25954bb633c385d8b737e", + "sha256:9ea5231428af34226c05f927e16fc7f6fa5e39e3ad3cd24ffa48ba53a47f4240", + "sha256:a31ead8411a027c2c4759113cf2bd473690517494f3d6e4bf67064589afcd3c5", + "sha256:a8fa80665b1a29faf76800173ff5325095f3e66a78e62999929809907aca5659", + "sha256:ad053d34421a2debba45aa3cc39acf454acbcd025b3fc1a9f8a0dee237abd485", + "sha256:b24c7844c0a0afc3ccbeb0b807adeefb7eff2b5599229ecedddcfeb0ef333bec", + "sha256:b50a8c5c162469c3209e5ec92ee4f95c8231b11db6a04db09bbe338176723bb8", + "sha256:ba30e88607fb6990544d84caf3c706c4b48f629e18853fc6a646f82db9629418", + "sha256:bf3fc9145141250907730886b031681dfcc0de1c158f3cc51c092223c0f381ce", + "sha256:c23ea227847c9dbe0b3910f5c0dd95658b607137614eb821e6cbaecd60d81cc6", + "sha256:c3cc1a3ed00ecfea8932477f729a9f616ad7347a5e55d50929efa50a86cb7be7", + "sha256:c49e9f7c6f625507ed83a7485366b46cbe325717c60837f7244fc99ba16ba9d6", + "sha256:d0cb7d47199001de7658c213419358aa8937df767936506db0db7ce1a71f4a2f", + "sha256:d8009ae46259e31bc73dc183e402f548e980c96f33a6ef58cc2e7865db012e13", + "sha256:da956d534a6d1b9841f95ad0f18ace637668f680b1339ca4dcfb2c1837880a0b", + "sha256:dcb9cebbf3f62cb1e5afacae90761ccce0effb3adaa32339a0670fe7805d8068", + "sha256:decb0658ec19e5c1f519faa9a160c0fc85a41a7e6654b3ce1b44b939f8bf1325", + "sha256:df4d1509efd4977e6a844ac96d8be0b9e5aa5d5c77aa27ca9f4d3f92d3fcf330", + "sha256:eeb27bece45c0c2a5842ac4c5a1b5c2ceaefe5711078eed4e8043159fa05c834", + "sha256:efcdfb9df109e8a3b475c016f60438fcd4be68cd13a365d42b35914cdab4bb2b", + "sha256:fd9fb7c941280e2c837b603850efc93c999ae58aae2b40765ed682a6907ebbc5", + "sha256:fe46d4f8e94e637634d54477b0cfabcf93c53f29eedcbdeecaf2af32029b4421" + ], + "markers": "python_version < '3.14' and platform_machine == 'aarch64' or (platform_machine == 'ppc64le' or (platform_machine == 'x86_64' or (platform_machine == 'amd64' or (platform_machine == 'AMD64' or (platform_machine == 'win32' or platform_machine == 'WIN32')))))", + "version": "==3.2.2" }, "gunicorn": { "hashes": [ @@ -626,11 +410,11 @@ }, "h11": { "hashes": [ - "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d", - "sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761" + "sha256:4e35b956cf45792e4caa5885e69fba00bdbc6ffafbfa020300e549b208ee5ff1", + "sha256:63cf8bbe7522de3bf65932fda1d9c2772064ffb3dae62d55932da54b31cb6c86" ], - "markers": "python_version >= '3.7'", - "version": "==0.14.0" + "markers": "python_version >= '3.8'", + "version": "==0.16.0" }, "idna": { "hashes": [ @@ -650,105 +434,106 @@ }, "jh2": { "hashes": [ - "sha256:038091480cd1544e9389b0adbb1b1645a797689dcb68ceae7e45eec96ed24497", - "sha256:0c8e336df8ed1687590695f4469f480eeb4159bf13bb6193791c6530fe114b49", - "sha256:0c9bf2d5e4ef45c1686c6f76935e7ca263f5eae4de92bf5d1873a0e737e4eb7d", - "sha256:0faf6e96f74d27b8ca816b40217904891f91b664ed1c0388737949ceb50ac15d", - "sha256:10ea7f497e6226372e1d4fdbf42c8381f4887819a643ab930bff4072ad298d84", - "sha256:11650f7ed77ee1df30f25d6b3b74b2fa1c94124e074fd455abafea3cbc913d53", - "sha256:12ead3ee3e9c7caa00356b528a5cc7fe210fbe2060628af6e19ed76b8416572e", - "sha256:136b3c5b08883681fcb58f12393a5bbfa422d6e2d5ba887e263e776874276bc6", - "sha256:17d6e1691154ea9f726e43dcb717df48e56c66b5a01c90ad675c6494c36e5be1", - "sha256:19cb987915cc0d321746a12f2a693d087ffb721c37ac9a153cc088c57d4d90eb", - "sha256:1cdf15de698c4026e64fd914fead3180e52bf2a7bcbe44a3392404582dbf2d22", - "sha256:1e81e1c64e33506b8508ba5e3c7c139b2577e78b079c2c16a8e7a02a161f1080", - "sha256:2226c76e4ff2149c5d9f94bed22bf9c4f3411d38cc53d4a7ddfbe0899c8b558c", - "sha256:2837412fb7b684c6ce7392c8bc57440c6dbadaf1bde7a53144381f7df7083c1c", - "sha256:293f0f3da3c391e997e0d55fdb85540e98a8b0406622bb4ba57fb7617697f31e", - "sha256:2b9cc6c0239215a349d28c192fa4c4e7a7348eee7980531525c01bffe39eea80", - "sha256:2f3ad679f84ff236a0d7b71ddc4b3c09fe467abee2f1a86671f0cd417be5352b", - "sha256:358cad2f328c52c15756cf32b0ad17afb0d617e7cdfe93d59aa2616966d825b7", - "sha256:3663712305b509f79c002c8c0ca9994f716cadba576f5a59632dda1aec1ca8c6", - "sha256:41794820ccca039ca2ead6245f30b34601dd1456eee5b5dde620672bb989e79d", - "sha256:44b7e64aff542471c474c24f771eae5efd9152da02a12556f7cb7607020e1420", - "sha256:45770eb0990166026538d3c2fd7d92f17cfde13ca6567570c4baec3ce9162936", - "sha256:498060078a4d1b458e9381fefb027d85329397b50d65287712b3d48233e20836", - "sha256:4c2f18f337c2393f84e45e5011c8b02697b81638b1cec49da60a01b9ed067695", - "sha256:5162d6e475d2762035fb8ea25982bcbec6c58715e33bd0951499f743cd90b110", - "sha256:51e8c890bb59008c95b3a552cefd8bd9ce50a7466a6c920a78cf586e885d7449", - "sha256:56ad3839ac6ac5fd3d023cf59d4b04264b74bb4cb44c0780faf51d6b5ff38fbc", - "sha256:5821638ef0d7c973071810a6786f59b305172197f7e7e469a2ce169e7f4978e3", - "sha256:5ac1b2d379f4d40c13dcce537e69704452943cddbe991fd54a84fdb2da9026d5", - "sha256:5b465d4311b0429fe6fa85df8e2cfcb038c9fface95396dd14e838ecabaaadf2", - "sha256:5d8656b98057329bd03d968aac8d5198389cf51517511295cfc4cb827a507e39", - "sha256:5dcfb3e823ef4b91b70b92848570d1d8cfd584304bd2bd54272dc100c9494def", - "sha256:5e40d23ea43f683f3a7c032dde391104f609b05c21b6d284101120b51dbd50c1", - "sha256:63a01522bde161c713f7fa5ee5d850fee6386fc386073490ebcd438f14579cf2", - "sha256:6b2a3d7756035dde13571f4ad232629b78b7f35c2cd5fda7b464079fc697db3a", - "sha256:6b3be1a6bf6c965aea3b4e3a40df9d2c134c516d89c76cf2b6c81f67e6c5c6ed", - "sha256:6c7bea3357f2dc653756e6da55f66cd21c73d3875c8f3dc4e8d196a876252de0", - "sha256:6e6c8e229507cf29333a2f491cbaa7dff5b8a4a3e613af8090ccce9ce3e4f7a0", - "sha256:6fad27f2a63884ee45d491aebec4b1f38752cd6aaccc625038c21e7f43c02c49", - "sha256:71bfef52547c2b8b145897fa8d1b5142bc52313cfa38c0742e0ef755f0d09c60", - "sha256:72370d312323282b1bf74426e53fae861a310d7ae519b419da46673c38e7d147", - "sha256:76c7d36043a9c478b0c846fcec7da5cb095983722473e503e0122ccd170182b5", - "sha256:78d8a81ef51edb9a2f278a6fb278789b49e304b12bb21bccf2fe7e344f71a9fb", - "sha256:798a6b159ce32181a5e7ab7611c17d1080e74a5541fec47f961b728dab25a76f", - "sha256:7e370567f66a57e2c0e3ae2afcc6f126e1d6babd36831cfd0caad279b05c1c88", - "sha256:8004b845f606b95a8b17efa112aa10b327e46e95dcda604a257b4633d4ed45c8", - "sha256:80b20bf9ea4e709b3b9ae364ac298dfa872b084c186e5c1d60b0b79c79a7ee7e", - "sha256:87303f4bb1b493997f911a4f126123ccd2827d3a2e7dd2390cc6143fbc75805b", - "sha256:8d423f4631395b92dceda39f481a463498131ac02a58581124a44495491f715b", - "sha256:94ee262192db50fb9c069a0be7bb1a426fb1b43af26ce12bf4c6c30e13f46b56", - "sha256:960e4be2e7de340300ab4bcc2b45bed46be1d62330575b8265e6602dbcb9a14c", - "sha256:99397d5e1da6b345cec3e6125e2902b0e6864eb8eaa4be43a2013f059c502c93", - "sha256:9abbb8c1bad08817bad62ae1ea76c01bdbd0ee8c827d05f3ba038c9f6d6f14bb", - "sha256:9c0b8fadf80bc70d341032f92702bda1b0ed78c01e9c495f0df701938c99bcf5", - "sha256:9f977da9abae170eebdcf02bda33727c342fad5dcdbc08498bfdfb6cc6c65489", - "sha256:a6be712ca39d5e9c89b705bc9800be36739436fefb8d0b52b2d332f7d6d22a01", - "sha256:aa434418d6ee44b0ba3a5a407bc9e1543cf496328f43f149e9b58f74a63d5c21", - "sha256:ac4f778e32f7de0ba63346893a4af87c2280ffc1783f594a117be51d908a10da", - "sha256:ac85d65ee369c09b2904b55078ad589961e2e2e03c810963d35a26e6a3931425", - "sha256:ad5d78c664d39960435d4162db31117c8945ba74fb0c414e79ba85a8bdeafdec", - "sha256:ad91f57c3485d87a8edee558dafab0f08c716857d748731c0998dcefe9d3fd5f", - "sha256:afd255d42b340036883ca95bded553b29065b064e2fe5db64ad5988517db9694", - "sha256:b1c2c74f100a0c2110a8e30445554ae331860d32f145c60a2a1e1c27702022a2", - "sha256:b49a8c71378d40d43c6a56eaa536d7823baa43c27c93e082aeb60a9717be0c10", - "sha256:b5f52611323e8e35705e6750a760f32165b41c052d22da154ae343871e7cd50d", - "sha256:b6bf99ae529ac359263269710356d3ddb173c15d8f8dc8849ae794ab811e5cd0", - "sha256:ba361bf87c4701f11241be92c99ef5cf916865dd225955cccb2376bf76717b3c", - "sha256:bc351aa2158575e68943d8e1d5531719ad86bf6607776627ed5a1a60657664af", - "sha256:bd6eb7b1e12e4dd0b75cab1b023272f1333494add5ad61deedac738af1ffeede", - "sha256:bf8852595f5e2d2b072e24c29394b5aca7fba96ecc8656d56660535f9e9872c9", - "sha256:c1dd66541569a2bdbe92589cc96a89f470b20d168f2238fd463e1b59ee3e2d49", - "sha256:c36a7a004cba4e370d0675826eeefe4e42a256638b6b1432263ddb4af317bc02", - "sha256:c886cda61da4d39010be84802bed11bc75f03e8a6094cc18016957a2c80254d4", - "sha256:cc7aa83946f80c66a5d2dea7e165f15aa3eb21e7b74b24d8f850afc0d44bb00e", - "sha256:cea9c4bef70d1358bafec6019164abce362f4de15d79d1ecd64ae31c1749d77a", - "sha256:cfe1951e80869695857986be104a40a1e7fa8ec7de05f86bcbd7bd20854be764", - "sha256:d36cf6f139da3279644794fcfda18af425c8bb122ef9c2e7c762a937bbf7b0f4", - "sha256:d81308faaa9393b7e6ed20718d465c4c2b73c24d5e4826024961acf4b87b1524", - "sha256:db51ea1f9c5ac790848bc271fcdf4108ad1b77a77c6949a96320477962cf7ba5", - "sha256:dd05c18c920a15e00d7a52df37bffd3930fe2c004c690f9422b20e12077e6dbd", - "sha256:df05918a11e1db0198d00486e36673b4b4a89390e4458ff9479b4908dde357ac", - "sha256:e4c31dccf6be131709e545d0258eb5b75c5fac304857ad3976331c6740e8b9d6", - "sha256:e60954d673040430802b29fe5bba698e262182b5ba5f302ff4458e39f8101881", - "sha256:e60e2d2c88a0552e61c37172fe377f6a8abf479130a445314886de4a360ba940", - "sha256:e786f773ddc153846b2ebdb854011cfd1f7c874b8ee79cced3706801341c9f5d", - "sha256:e7cd91548fb95b69edd376f5204e27115ac7d093ec7d80066123a5bdb31c71d9", - "sha256:eaef2ea4f5602aefaaf3d6e8235f3b9ffde35aff15aac1c16cc802f6bbf0a3b5", - "sha256:ec8c5ea93a03775fbadd08462200cf34ce617ec75a032abfa44fd6d3a00e5424", - "sha256:eddeb8574bc9d9abb8491d4a46b60e553c2cea235b80373756acb06568101175", - "sha256:eeb300b0e4b428aab2f70d785cad4306529262af6de8c8c5fe6a4b41a674a434", - "sha256:f39d71ece8e97cf069e4154868eaac1256b133fe23e0459829432e4bb6406472", - "sha256:f4840ddad2b9d53710e92361391944da89e3576641a290066a1719520059247c", - "sha256:f70723a00bcbce0f9a216853139955be45da35741335eb3afead304e77662560", - "sha256:f829cf2ba5b553e6529d6238928c07096f1feb47f4ad536b7f06bca6cc77173f", - "sha256:f96386910467725895f7972939a6faabd6e96b1de0cc2c092e4bd2c40e956e25", - "sha256:fe259a9d6f555bc79aed9bb4b9a7fff73db443b4c483e4a81a428c8a2860428b" + "sha256:02015fd68d73cfbe623c7ee93130dd8be53f9eed5cd644fce12d298929c6a15d", + "sha256:0fc980bc55ec4de7b696aab45b1e8d89465608f48f1ba06db1184c2cb8e4ff82", + "sha256:1005f57c2866305432588fb001e6ac9f99258cf2620ff1f93f6eae2c164db403", + "sha256:11909c2a63d342bf84211673ced4ea1a7c701362a375e1e2308e613535ba9865", + "sha256:12c9a67a94c7b0b1bc15f90e57647f5b73e3d8e67a117f649c67b7aa71664ee8", + "sha256:162396cc26bdab52818b9c2926fe75533b0dc6dfc0db90779807159eff896c22", + "sha256:1643f6ba8f9fbb03b933cca8dd84bec19f3f33acab513e57e083ebe9462a4ef3", + "sha256:16cbfcb2f9934e7693eef985f1e4bf64ff1d533dbc9cca4554a7e24804170e4d", + "sha256:1a52ef916d076842ba1252fc9d0fe78ec0ea93d4b2985ae46b3b0f05e6b3348f", + "sha256:1e9ff345926c4ac650acea101463b4f8468f5069dda136366585ff7ce4aac38c", + "sha256:1ed0cf5558d4d8cbb2b8a407295ba101a79686ff452fb2ab5fac1c6b9ef40d79", + "sha256:20b3d8eb3469c2c368cced0da918b4e8ff8e91f2a48810b8242dd8a8ff0de0da", + "sha256:2138ad06e011cb0ebc00f7485377888f0c6f076b1aa21f167d7cd5adf8f85ca5", + "sha256:23df2b4433ebf275e096c66fd4fe2a27d8d802fcab8ac49ec856a168808b7ad4", + "sha256:28b5a1c3aa84f09ab2b004cb9e16bc13a798933607806bb5ec5a38e1406d7e19", + "sha256:2a76f29548199744b210308aac184d897bfda4ec7300ce1d4b9a498874aeceab", + "sha256:2b2768b896e0351328a7f6377d77d21deadef5a50afd84bc66995a8323faf921", + "sha256:2f2f8fba36fd9c9463cc55a27957735f46e9b4d3551d4bb7fd9539749d141647", + "sha256:33bf11c9f6b6308823147e8d8da0828b5e7f330399a5b12c08c586e798119195", + "sha256:3451a18af56eb324b438721107922bead16a6427935a7f33cdf66423f7579b39", + "sha256:34f88cff35a18b7b74579ab08272fdf0a4ef92fcd119fedda010d0e234339bcc", + "sha256:36e26dbfcee621001a6abeabc9e24a38c347f63c630d20557d98de427305ac0b", + "sha256:37cb6b97e577fb4079a3b37ae6037ceb16ea6f267b0d94a1aaddb15e07217390", + "sha256:39da0fb5f29bae4158052c4515d38d0c1636dac484d2fd1a621ff76d206d217d", + "sha256:3b51280e4721f761d753da5b8c1c66db60b52f1ac239f808049bdc3676bb49a1", + "sha256:40276a7aec8f1c3e8f9363d58ce8e6272e8c8bb6253cb9a602aa8023e359c977", + "sha256:423a64f75d4a9dd619054eb0574b94feb93a5fc9dc3173e97e3d469a12e979a2", + "sha256:4bed27b58c97ceb8dcdba6506ba266f39d67736ee5ab33ad19573d983b4969d3", + "sha256:514bbd814696a39579cfda789ac830b7e1ab6e3409dcc06aab7a161ca0a81000", + "sha256:557c23250afa4a1432fecd14818d3ee1e46d9b229c292b6214083789bdfb135e", + "sha256:5756c58005a2773cd692beaa9ad31a2f15781a1ffd1cd6346bbce7072bd1b280", + "sha256:579985e10c39df85246d8386484abf3315cb3802a0e1fde09923ac1f8810f5bc", + "sha256:5fb48c8cb7b24a1f4122de052a482bec46e58626cf3f1fd0ca0accbd9fd97d3c", + "sha256:5feec0be4b56987c4c68be7d39f696177d714a70a35c93a68776a1dd6116d314", + "sha256:601f8a1ac81e2a4d830acd6d1d248b32e9e34a6d3dc0987f7b0af60c1427dc4b", + "sha256:6056d8c64a3863327859b5999eb8e83b7ef591db276148c0724da33e83659c18", + "sha256:607f5fbb92132e61959904c25a88f381be4559b566e03243ce5f71332f40e14b", + "sha256:65a7a4efc2a937af2b00f8d47812b4b665ce7a1e5bf91c9741166c5804f6ff2b", + "sha256:6639f549083a17a902fa51116882962708f2e44180cebd0d311548383fbfa616", + "sha256:66ca52ffdfd19e16f2a05b3761a013337b2d937385be52ebbeec6906dc68b316", + "sha256:6d1d55d29fdb8721b6d590cd5167c2d78d94ee0020e3bd2887cefeae90b4f3b5", + "sha256:6e61235c0f24cb2c4ee8d9d57efea80c412e9f12627704c2924e8f8097ddc2f5", + "sha256:7066220730be2da6b5e85a5a12b60728fab3eee79265de7f65effbdcc3af17a3", + "sha256:71fe5094f89c1b9147eae3662e6b92dae845a583e06e603bc4d79f9cc3f20693", + "sha256:747d0e9e3200cb883f2f8c2a8a7b7ec150e5f84e966c921d50e5194b8db81594", + "sha256:7b72ed5aaa1f4160d9ebed48013194b92baf3a14dfa22b2fd113b17c976c34d5", + "sha256:7bb2e761ce3692e54a2c61b8e57f0abdd970a653114ca5c3a12acae4f167199d", + "sha256:7c74fc0fab0d903f4736972f64e0f277f632e9766d4558911fd46abfe955e231", + "sha256:7d9d4d83fbf75362d0986ee4305ec85eb06ed124e299d38af5ed4eb20ed0cc74", + "sha256:7f87be4eff3f1e6821ce0ae085126aba46b77895d6aaa3a5bf2c6157fd121923", + "sha256:88aba8ef44162c96083690952e6ddde1b044957125ac67e3b92a87fd72407eff", + "sha256:88d2bbcbdb149101f0f211aa870ce18dfb563f62f10eecf834101c8b9cbcd145", + "sha256:88db9078be359ccdea973c99ab88a0312012d40fe2878ff106dfe3fe918bf5b2", + "sha256:8aa82f946aebf69b38f0537fb51577284d0caa351ce096a0401ed27129ae9b3c", + "sha256:9794c6b1ff04d8d6d1764e7490b34fc5a3435583672ca5466f39fa3640dafe54", + "sha256:98c4613061269dd0c201441e31d83bbf36493fe1482648f31fd62628346af1e7", + "sha256:9c6cc4f3d4d237184030ffd3721a8f59fde97f5f1cdab1547d2bb0b093250427", + "sha256:9dd0faae92a299f0b960d46aef675df2c118e26299ae9ebac4ec7051fa227c35", + "sha256:9f5d30e46bd8a01b646825a2157a4cb1d98c8eb01ffe80ac379ed791ca639687", + "sha256:a35be731dc0889c2689c66c05023390e026bdbbfdb47da214d99bd1e1c25f8bb", + "sha256:a54d437f3bd120f0d2971ea990e665d3487e252f2453618fd98196404a04f90b", + "sha256:a86b2ddd8e1671f24111fbcfb1db7fd2b6bf4cf6ad7966c370e3bc5342a51977", + "sha256:aaa3ddabe69cd09c7d2cc5b06ff428125ecb47a04d3ac1941ff86017b87f4063", + "sha256:ad37a22911f1e87b53b236efd02dcf17c23dd7de87b0f079e971a14d33c0866c", + "sha256:af00e2a680e89ceb8cf41d221a4d639be4c4212a2c7ab933155b727fd3dacbac", + "sha256:b02dfe24a1c4b2169e182d12a0b52516809fb608252dc384d437b99ef4b84de0", + "sha256:b6c7a988fe6b4310d045147966c5f82bb1493f3a2c8b1d9580e7c872ed80faaf", + "sha256:b75fbdb62ddeb6aecaebb9bc601ff75b36d2b69cc8e5841d75c375b96f02ea7a", + "sha256:b7fcc7a55a11ce4f2d588cb0b9746b8f3b753d080326e7b8395b3398ae0c0188", + "sha256:ba2de41d4946fb2ddde7af9b55b31fba0f8c6a26f15d7e281e59221337d6b37d", + "sha256:bc8c07c8ceea477e7a10d899eacb2c0cf4c59d595c9316a6b5c2063378d34f20", + "sha256:bec06ebc7d37beba62503c955d90580cfa1e5fff2b44f05cebecf2378b7f54b1", + "sha256:c3f3e88960a265116b8a972fc7ceb5b534b5a1730d581cd5fbedea90212f79de", + "sha256:c595c46f2fe39f235a463796c2ff80889a5d61c99db94235c8d2d7f654f04fa3", + "sha256:c725e40e881b8e35381a4d2667f4c3ad978929fb890c1822f8524e3d6846ad49", + "sha256:c90c141a4edd6ac99780b77abe7132d48d5e0fee7741ba2e217a53a503833441", + "sha256:ca2381a51ea8c1261c70ca33181c6557aacd8a06bea73d27dbef053243fe8ca7", + "sha256:cb063308aeb5f103f1c82526b02fbdb464a0b42f00ebf927dc9dd8b76b37bfda", + "sha256:cb843586cac2e0663804777ca5efa5d7b565bcd824da9b2ee1e98cfbd7d8382a", + "sha256:ce5707b2876e421080fdfb9d89752a1d111f57d8f3cddba57c24d93f17aa2074", + "sha256:d6802287d937f2cdb7ff8ca47c7994d4f8c06b7f0b67f138b8a3152de3c624cf", + "sha256:daa2010e0c1c1de21c0e6128571f609e690fcfcb174f75090b8863c16b3aa12c", + "sha256:db35002d92896783277c88d3aac6b9d33cdd65f2323dc786100a661723cf442f", + "sha256:e1adb17a5614d372d2b42b876542ba7a790e77cbbd674620aa920eaa27483165", + "sha256:e2ec53d084a147a6092ad748406310b3789ea252b3a007c8653c71cad9656d8d", + "sha256:e2fea0793376ab9aeb3258d1c192e0ceebd9b51a2f699379224d4f2ca473645d", + "sha256:e409f64962ab74da170fb9085ba17668c9e8da3efa6b4dc5e6084dca702954a1", + "sha256:e7bb595e9d9eeeef45d630766fd3d8c926a25b907631fc0f36411f5f576bb960", + "sha256:e852f812ea8323e269722653ba1bef6a9e5b9e496d5c8e52178b83d3ae435791", + "sha256:f1137d66f4f0670a21d8f146f7cce7282ca20dac8705b11c0bf0d9ac450ad206", + "sha256:f2f5e0cbbac4d158b68e2706a18c5494c0c72908f5d572f934ae6b440cf917cc", + "sha256:f3d028980542939c54e604488530c592fb172c6f48bc5262ba9ac205e8f5b5a7", + "sha256:fa57efb9974a3a36d3396212a43d7a8c68a4de616587cdb36ea2e1ff4164fe07", + "sha256:fb910f4d0791417dc983649145b6d18fd61fd7e7ca019635b79e30acf4daa1cd", + "sha256:fb91f22b639642dd2bac71ac40a7e8082470c9647db7003fdbe63e7ee9db851e", + "sha256:fdddba0689058f3faa5e7ffaaf039aac62dc528ec3e5f031a1e5a81392737237", + "sha256:fec6c5019a22848d092fcfc63cccee76b64ec7b1c7d5495b0b524c17327917ff" ], "markers": "python_version >= '3.7'", - "version": "==5.0.8" + "version": "==5.0.9" }, "jinja2": { "hashes": [ @@ -768,11 +553,11 @@ }, "jsonschema-specifications": { "hashes": [ - "sha256:0f38b83639958ce1152d02a7f062902c41c8fd20d558b0c34344292d417ae272", - "sha256:a09a0680616357d9a0ecf05c12ad234479f549239d0f5b55f3deea67475da9bf" + "sha256:4653bffbd6584f7de83a67e0d620ef16900b390ddc7939d56684d6c81e33f1af", + "sha256:630159c9f4dbea161a6a2205c3011cc4f18ff381b189fff48bb39b9bf26ae608" ], "markers": "python_version >= '3.9'", - "version": "==2024.10.1" + "version": "==2025.4.1" }, "jwt": { "hashes": [ @@ -856,184 +641,74 @@ "markers": "python_version >= '3.8'", "version": "==3.1.3" }, - "multidict": { - "hashes": [ - "sha256:032efeab3049e37eef2ff91271884303becc9e54d740b492a93b7e7266e23756", - "sha256:062428944a8dc69df9fdc5d5fc6279421e5f9c75a9ee3f586f274ba7b05ab3c8", - "sha256:0bb8f8302fbc7122033df959e25777b0b7659b1fd6bcb9cb6bed76b5de67afef", - "sha256:0d4b31f8a68dccbcd2c0ea04f0e014f1defc6b78f0eb8b35f2265e8716a6df0c", - "sha256:0ecdc12ea44bab2807d6b4a7e5eef25109ab1c82a8240d86d3c1fc9f3b72efd5", - "sha256:0ee1bf613c448997f73fc4efb4ecebebb1c02268028dd4f11f011f02300cf1e8", - "sha256:11990b5c757d956cd1db7cb140be50a63216af32cd6506329c2c59d732d802db", - "sha256:1535cec6443bfd80d028052e9d17ba6ff8a5a3534c51d285ba56c18af97e9713", - "sha256:1748cb2743bedc339d63eb1bca314061568793acd603a6e37b09a326334c9f44", - "sha256:1b2019317726f41e81154df636a897de1bfe9228c3724a433894e44cd2512378", - "sha256:1c152c49e42277bc9a2f7b78bd5fa10b13e88d1b0328221e7aef89d5c60a99a5", - "sha256:1f1c2f58f08b36f8475f3ec6f5aeb95270921d418bf18f90dffd6be5c7b0e676", - "sha256:1f4e0334d7a555c63f5c8952c57ab6f1c7b4f8c7f3442df689fc9f03df315c08", - "sha256:1f6f90700881438953eae443a9c6f8a509808bc3b185246992c4233ccee37fea", - "sha256:224b79471b4f21169ea25ebc37ed6f058040c578e50ade532e2066562597b8a9", - "sha256:236966ca6c472ea4e2d3f02f6673ebfd36ba3f23159c323f5a496869bc8e47c9", - "sha256:2427370f4a255262928cd14533a70d9738dfacadb7563bc3b7f704cc2360fc4e", - "sha256:24a8caa26521b9ad09732972927d7b45b66453e6ebd91a3c6a46d811eeb7349b", - "sha256:255dac25134d2b141c944b59a0d2f7211ca12a6d4779f7586a98b4b03ea80508", - "sha256:26ae9ad364fc61b936fb7bf4c9d8bd53f3a5b4417142cd0be5c509d6f767e2f1", - "sha256:2e329114f82ad4b9dd291bef614ea8971ec119ecd0f54795109976de75c9a852", - "sha256:3002a856367c0b41cad6784f5b8d3ab008eda194ed7864aaa58f65312e2abcac", - "sha256:30a3ebdc068c27e9d6081fca0e2c33fdf132ecea703a72ea216b81a66860adde", - "sha256:30c433a33be000dd968f5750722eaa0991037be0be4a9d453eba121774985bc8", - "sha256:31469d5832b5885adeb70982e531ce86f8c992334edd2f2254a10fa3182ac504", - "sha256:32a998bd8a64ca48616eac5a8c1cc4fa38fb244a3facf2eeb14abe186e0f6cc5", - "sha256:3307b48cd156153b117c0ea54890a3bdbf858a5b296ddd40dc3852e5f16e9b02", - "sha256:389cfefb599edf3fcfd5f64c0410da686f90f5f5e2c4d84e14f6797a5a337af4", - "sha256:3ada0b058c9f213c5f95ba301f922d402ac234f1111a7d8fd70f1b99f3c281ec", - "sha256:3b73e7227681f85d19dec46e5b881827cd354aabe46049e1a61d2f9aaa4e285a", - "sha256:3ccdde001578347e877ca4f629450973c510e88e8865d5aefbcb89b852ccc666", - "sha256:3cd06d88cb7398252284ee75c8db8e680aa0d321451132d0dba12bc995f0adcc", - "sha256:3cf62f8e447ea2c1395afa289b332e49e13d07435369b6f4e41f887db65b40bf", - "sha256:3d75e621e7d887d539d6e1d789f0c64271c250276c333480a9e1de089611f790", - "sha256:422a5ec315018e606473ba1f5431e064cf8b2a7468019233dcf8082fabad64c8", - "sha256:43173924fa93c7486402217fab99b60baf78d33806af299c56133a3755f69589", - "sha256:43fe10524fb0a0514be3954be53258e61d87341008ce4914f8e8b92bee6f875d", - "sha256:4543d8dc6470a82fde92b035a92529317191ce993533c3c0c68f56811164ed07", - "sha256:4eb33b0bdc50acd538f45041f5f19945a1f32b909b76d7b117c0c25d8063df56", - "sha256:5427a2679e95a642b7f8b0f761e660c845c8e6fe3141cddd6b62005bd133fc21", - "sha256:578568c4ba5f2b8abd956baf8b23790dbfdc953e87d5b110bce343b4a54fc9e7", - "sha256:59fe01ee8e2a1e8ceb3f6dbb216b09c8d9f4ef1c22c4fc825d045a147fa2ebc9", - "sha256:5e3929269e9d7eff905d6971d8b8c85e7dbc72c18fb99c8eae6fe0a152f2e343", - "sha256:61ed4d82f8a1e67eb9eb04f8587970d78fe7cddb4e4d6230b77eda23d27938f9", - "sha256:64bc2bbc5fba7b9db5c2c8d750824f41c6994e3882e6d73c903c2afa78d091e4", - "sha256:659318c6c8a85f6ecfc06b4e57529e5a78dfdd697260cc81f683492ad7e9435a", - "sha256:66eb80dd0ab36dbd559635e62fba3083a48a252633164857a1d1684f14326427", - "sha256:6b5a272bc7c36a2cd1b56ddc6bff02e9ce499f9f14ee4a45c45434ef083f2459", - "sha256:6d79cf5c0c6284e90f72123f4a3e4add52d6c6ebb4a9054e88df15b8d08444c6", - "sha256:7146a8742ea71b5d7d955bffcef58a9e6e04efba704b52a460134fefd10a8208", - "sha256:740915eb776617b57142ce0bb13b7596933496e2f798d3d15a20614adf30d229", - "sha256:75482f43465edefd8a5d72724887ccdcd0c83778ded8f0cb1e0594bf71736cc0", - "sha256:7a76534263d03ae0cfa721fea40fd2b5b9d17a6f85e98025931d41dc49504474", - "sha256:7d50d4abf6729921e9613d98344b74241572b751c6b37feed75fb0c37bd5a817", - "sha256:805031c2f599eee62ac579843555ed1ce389ae00c7e9f74c2a1b45e0564a88dd", - "sha256:8aac2eeff69b71f229a405c0a4b61b54bade8e10163bc7b44fcd257949620618", - "sha256:8b6fcf6054fc4114a27aa865f8840ef3d675f9316e81868e0ad5866184a6cba5", - "sha256:8bd2b875f4ca2bb527fe23e318ddd509b7df163407b0fb717df229041c6df5d3", - "sha256:8eac0c49df91b88bf91f818e0a24c1c46f3622978e2c27035bfdca98e0e18124", - "sha256:909f7d43ff8f13d1adccb6a397094adc369d4da794407f8dd592c51cf0eae4b1", - "sha256:995015cf4a3c0d72cbf453b10a999b92c5629eaf3a0c3e1efb4b5c1f602253bb", - "sha256:99592bd3162e9c664671fd14e578a33bfdba487ea64bcb41d281286d3c870ad7", - "sha256:9c64f4ddb3886dd8ab71b68a7431ad4aa01a8fa5be5b11543b29674f29ca0ba3", - "sha256:9e78006af1a7c8a8007e4f56629d7252668344442f66982368ac06522445e375", - "sha256:9f35de41aec4b323c71f54b0ca461ebf694fb48bec62f65221f52e0017955b39", - "sha256:a059ad6b80de5b84b9fa02a39400319e62edd39d210b4e4f8c4f1243bdac4752", - "sha256:a2b0fabae7939d09d7d16a711468c385272fa1b9b7fb0d37e51143585d8e72e0", - "sha256:a54ec568f1fc7f3c313c2f3b16e5db346bf3660e1309746e7fccbbfded856188", - "sha256:a62d78a1c9072949018cdb05d3c533924ef8ac9bcb06cbf96f6d14772c5cd451", - "sha256:a7bd27f7ab3204f16967a6f899b3e8e9eb3362c0ab91f2ee659e0345445e0078", - "sha256:a7be07e5df178430621c716a63151165684d3e9958f2bbfcb644246162007ab7", - "sha256:ab583ac203af1d09034be41458feeab7863c0635c650a16f15771e1386abf2d7", - "sha256:abcfed2c4c139f25c2355e180bcc077a7cae91eefbb8b3927bb3f836c9586f1f", - "sha256:acc9fa606f76fc111b4569348cc23a771cb52c61516dcc6bcef46d612edb483b", - "sha256:ae93e0ff43b6f6892999af64097b18561691ffd835e21a8348a441e256592e1f", - "sha256:b038f10e23f277153f86f95c777ba1958bcd5993194fda26a1d06fae98b2f00c", - "sha256:b128dbf1c939674a50dd0b28f12c244d90e5015e751a4f339a96c54f7275e291", - "sha256:b1b389ae17296dd739015d5ddb222ee99fd66adeae910de21ac950e00979d897", - "sha256:b57e28dbc031d13916b946719f213c494a517b442d7b48b29443e79610acd887", - "sha256:b90e27b4674e6c405ad6c64e515a505c6d113b832df52fdacb6b1ffd1fa9a1d1", - "sha256:b9cb19dfd83d35b6ff24a4022376ea6e45a2beba8ef3f0836b8a4b288b6ad685", - "sha256:ba46b51b6e51b4ef7bfb84b82f5db0dc5e300fb222a8a13b8cd4111898a869cf", - "sha256:be8751869e28b9c0d368d94f5afcb4234db66fe8496144547b4b6d6a0645cfc6", - "sha256:c23831bdee0a2a3cf21be057b5e5326292f60472fb6c6f86392bbf0de70ba731", - "sha256:c2e98c840c9c8e65c0e04b40c6c5066c8632678cd50c8721fdbcd2e09f21a507", - "sha256:c56c179839d5dcf51d565132185409d1d5dd8e614ba501eb79023a6cab25576b", - "sha256:c605a2b2dc14282b580454b9b5d14ebe0668381a3a26d0ac39daa0ca115eb2ae", - "sha256:ce5b3082e86aee80b3925ab4928198450d8e5b6466e11501fe03ad2191c6d777", - "sha256:d4e8535bd4d741039b5aad4285ecd9b902ef9e224711f0b6afda6e38d7ac02c7", - "sha256:daeac9dd30cda8703c417e4fddccd7c4dc0c73421a0b54a7da2713be125846be", - "sha256:dd53893675b729a965088aaadd6a1f326a72b83742b056c1065bdd2e2a42b4df", - "sha256:e1eb72c741fd24d5a28242ce72bb61bc91f8451877131fa3fe930edb195f7054", - "sha256:e413152e3212c4d39f82cf83c6f91be44bec9ddea950ce17af87fbf4e32ca6b2", - "sha256:ead46b0fa1dcf5af503a46e9f1c2e80b5d95c6011526352fa5f42ea201526124", - "sha256:eccb67b0e78aa2e38a04c5ecc13bab325a43e5159a181a9d1a6723db913cbb3c", - "sha256:edf74dc5e212b8c75165b435c43eb0d5e81b6b300a938a4eb82827119115e840", - "sha256:f2882bf27037eb687e49591690e5d491e677272964f9ec7bc2abbe09108bdfb8", - "sha256:f6f19170197cc29baccd33ccc5b5d6a331058796485857cf34f7635aa25fb0cd", - "sha256:f84627997008390dd15762128dcf73c3365f4ec0106739cde6c20a07ed198ec8", - "sha256:f901a5aace8e8c25d78960dcc24c870c8d356660d3b49b93a78bf38eb682aac3", - "sha256:f92c7f62d59373cd93bc9969d2da9b4b21f78283b1379ba012f7ee8127b3152e", - "sha256:fb6214fe1750adc2a1b801a199d64b5a67671bf76ebf24c730b157846d0e90d2", - "sha256:fbd8d737867912b6c5f99f56782b8cb81f978a97b4437a1c476de90a3e41c9a1", - "sha256:fbf226ac85f7d6b6b9ba77db4ec0704fde88463dc17717aec78ec3c8546c70ad" - ], - "markers": "python_version >= '3.9'", - "version": "==6.4.3" - }, "niquests": { "hashes": [ - "sha256:68e0a7e9f338466b3606945fffd11f75e3c90af7498aa9336ef03812323b7e36", - "sha256:86e484c2c60444aa96069c15f6295af6e25a8bad50781e1326df1b5c7ab48339" + "sha256:c5cdc126862090b09030addc23b6bbf06dbd433a4c7c70ddf6657638153bc367", + "sha256:f1dbf2c028223e97839f5b467f875376a014abf51e8f9b284be799fc9a10791c" ], "markers": "python_version >= '3.7'", - "version": "==3.14.0" + "version": "==3.14.1" }, "numpy": { "hashes": [ - "sha256:05c076d531e9998e7e694c36e8b349969c56eadd2cdcd07242958489d79a7286", - "sha256:0d54974f9cf14acf49c60f0f7f4084b6579d24d439453d5fc5805d46a165b542", - "sha256:11c43995255eb4127115956495f43e9343736edb7fcdb0d973defd9de14cd84f", - "sha256:188dcbca89834cc2e14eb2f106c96d6d46f200fe0200310fc29089657379c58d", - "sha256:1974afec0b479e50438fc3648974268f972e2d908ddb6d7fb634598cdb8260a0", - "sha256:1cf4e5c6a278d620dee9ddeb487dc6a860f9b199eadeecc567f777daace1e9e7", - "sha256:207a2b8441cc8b6a2a78c9ddc64d00d20c303d79fba08c577752f080c4007ee3", - "sha256:218f061d2faa73621fa23d6359442b0fc658d5b9a70801373625d958259eaca3", - "sha256:2aad3c17ed2ff455b8eaafe06bcdae0062a1db77cb99f4b9cbb5f4ecb13c5146", - "sha256:2fa8fa7697ad1646b5c93de1719965844e004fcad23c91228aca1cf0800044a1", - "sha256:31504f970f563d99f71a3512d0c01a645b692b12a63630d6aafa0939e52361e6", - "sha256:3387dd7232804b341165cedcb90694565a6015433ee076c6754775e85d86f1fc", - "sha256:4ba5054787e89c59c593a4169830ab362ac2bee8a969249dc56e5d7d20ff8df9", - "sha256:4f92084defa704deadd4e0a5ab1dc52d8ac9e8a8ef617f3fbb853e79b0ea3592", - "sha256:65ef3468b53269eb5fdb3a5c09508c032b793da03251d5f8722b1194f1790c00", - "sha256:6f527d8fdb0286fd2fd97a2a96c6be17ba4232da346931d967a0630050dfd298", - "sha256:7051ee569db5fbac144335e0f3b9c2337e0c8d5c9fee015f259a5bd70772b7e8", - "sha256:7716e4a9b7af82c06a2543c53ca476fa0b57e4d760481273e09da04b74ee6ee2", - "sha256:79bd5f0a02aa16808fcbc79a9a376a147cc1045f7dfe44c6e7d53fa8b8a79392", - "sha256:7a4e84a6283b36632e2a5b56e121961f6542ab886bc9e12f8f9818b3c266bfbb", - "sha256:8120575cb4882318c791f839a4fd66161a6fa46f3f0a5e613071aae35b5dd8f8", - "sha256:81413336ef121a6ba746892fad881a83351ee3e1e4011f52e97fba79233611fd", - "sha256:8146f3550d627252269ac42ae660281d673eb6f8b32f113538e0cc2a9aed42b9", - "sha256:879cf3a9a2b53a4672a168c21375166171bc3932b7e21f622201811c43cdd3b0", - "sha256:892c10d6a73e0f14935c31229e03325a7b3093fafd6ce0af704be7f894d95687", - "sha256:92bda934a791c01d6d9d8e038363c50918ef7c40601552a58ac84c9613a665bc", - "sha256:9ba03692a45d3eef66559efe1d1096c4b9b75c0986b5dff5530c378fb8331d4f", - "sha256:9eeea959168ea555e556b8188da5fa7831e21d91ce031e95ce23747b7609f8a4", - "sha256:a0258ad1f44f138b791327961caedffbf9612bfa504ab9597157806faa95194a", - "sha256:a761ba0fa886a7bb33c6c8f6f20213735cb19642c580a931c625ee377ee8bd39", - "sha256:a7b9084668aa0f64e64bd00d27ba5146ef1c3a8835f3bd912e7a9e01326804c4", - "sha256:a84eda42bd12edc36eb5b53bbcc9b406820d3353f1994b6cfe453a33ff101775", - "sha256:ab2939cd5bec30a7430cbdb2287b63151b77cf9624de0532d629c9a1c59b1d5c", - "sha256:ac0280f1ba4a4bfff363a99a6aceed4f8e123f8a9b234c89140f5e894e452ecd", - "sha256:adf8c1d66f432ce577d0197dceaac2ac00c0759f573f28516246351c58a85020", - "sha256:b4adfbbc64014976d2f91084915ca4e626fbf2057fb81af209c1a6d776d23e3d", - "sha256:bb649f8b207ab07caebba230d851b579a3c8711a851d29efe15008e31bb4de24", - "sha256:bce43e386c16898b91e162e5baaad90c4b06f9dcbe36282490032cec98dc8ae7", - "sha256:bd3ad3b0a40e713fc68f99ecfd07124195333f1e689387c180813f0e94309d6f", - "sha256:c3f7ac96b16955634e223b579a3e5798df59007ca43e8d451a0e6a50f6bfdfba", - "sha256:cf28633d64294969c019c6df4ff37f5698e8326db68cc2b66576a51fad634880", - "sha256:d0f35b19894a9e08639fd60a1ec1978cb7f5f7f1eace62f38dd36be8aecdef4d", - "sha256:db1f1c22173ac1c58db249ae48aa7ead29f534b9a948bc56828337aa84a32ed6", - "sha256:dbe512c511956b893d2dacd007d955a3f03d555ae05cfa3ff1c1ff6df8851854", - "sha256:df2f57871a96bbc1b69733cd4c51dc33bea66146b8c63cacbfed73eec0883017", - "sha256:e2f085ce2e813a50dfd0e01fbfc0c12bbe5d2063d99f8b29da30e544fb6483b8", - "sha256:e642d86b8f956098b564a45e6f6ce68a22c2c97a04f5acd3f221f57b8cb850ae", - "sha256:e9e0a277bb2eb5d8a7407e14688b85fd8ad628ee4e0c7930415687b6564207a4", - "sha256:ea2bb7e2ae9e37d96835b3576a4fa4b3a97592fbea8ef7c3587078b0068b8f09", - "sha256:ee4d528022f4c5ff67332469e10efe06a267e32f4067dc76bb7e2cddf3cd25ff", - "sha256:f05d4198c1bacc9124018109c5fba2f3201dbe7ab6e92ff100494f236209c960", - "sha256:f34dc300df798742b3d06515aa2a0aee20941c13579d7a2f2e10af01ae4901ee", - "sha256:f4162988a360a29af158aeb4a2f4f09ffed6a969c9776f8f3bdee9b06a8ab7e5", - "sha256:f486038e44caa08dbd97275a9a35a283a8f1d2f0ee60ac260a1790e76660833c", - "sha256:f7de08cbe5551911886d1ab60de58448c6df0f67d9feb7d1fb21e9875ef95e91" + "sha256:038613e9fb8c72b0a41f025a7e4c3f0b7a1b5d768ece4796b674c8f3fe13efff", + "sha256:0678000bb9ac1475cd454c6b8c799206af8107e310843532b04d49649c717a47", + "sha256:0811bb762109d9708cca4d0b13c4f67146e3c3b7cf8d34018c722adb2d957c84", + "sha256:0b605b275d7bd0c640cad4e5d30fa701a8d59302e127e5f79138ad62762c3e3d", + "sha256:0bca768cd85ae743b2affdc762d617eddf3bcf8724435498a1e80132d04879e6", + "sha256:1bc23a79bfabc5d056d106f9befb8d50c31ced2fbc70eedb8155aec74a45798f", + "sha256:287cc3162b6f01463ccd86be154f284d0893d2b3ed7292439ea97eafa8170e0b", + "sha256:37c0ca431f82cd5fa716eca9506aefcabc247fb27ba69c5062a6d3ade8cf8f49", + "sha256:37e990a01ae6ec7fe7fa1c26c55ecb672dd98b19c3d0e1d1f326fa13cb38d163", + "sha256:389d771b1623ec92636b0786bc4ae56abafad4a4c513d36a55dce14bd9ce8571", + "sha256:3d70692235e759f260c3d837193090014aebdf026dfd167834bcba43e30c2a42", + "sha256:41c5a21f4a04fa86436124d388f6ed60a9343a6f767fced1a8a71c3fbca038ff", + "sha256:481b49095335f8eed42e39e8041327c05b0f6f4780488f61286ed3c01368d491", + "sha256:4eeaae00d789f66c7a25ac5f34b71a7035bb474e679f410e5e1a94deb24cf2d4", + "sha256:55a4d33fa519660d69614a9fad433be87e5252f4b03850642f88993f7b2ca566", + "sha256:5a6429d4be8ca66d889b7cf70f536a397dc45ba6faeb5f8c5427935d9592e9cf", + "sha256:5bd4fc3ac8926b3819797a7c0e2631eb889b4118a9898c84f585a54d475b7e40", + "sha256:5beb72339d9d4fa36522fc63802f469b13cdbe4fdab4a288f0c441b74272ebfd", + "sha256:6031dd6dfecc0cf9f668681a37648373bddd6421fff6c66ec1624eed0180ee06", + "sha256:71594f7c51a18e728451bb50cc60a3ce4e6538822731b2933209a1f3614e9282", + "sha256:74d4531beb257d2c3f4b261bfb0fc09e0f9ebb8842d82a7b4209415896adc680", + "sha256:7befc596a7dc9da8a337f79802ee8adb30a552a94f792b9c9d18c840055907db", + "sha256:894b3a42502226a1cac872f840030665f33326fc3dac8e57c607905773cdcde3", + "sha256:8e41fd67c52b86603a91c1a505ebaef50b3314de0213461c7a6e99c9a3beff90", + "sha256:8e9ace4a37db23421249ed236fdcdd457d671e25146786dfc96835cd951aa7c1", + "sha256:8fc377d995680230e83241d8a96def29f204b5782f371c532579b4f20607a289", + "sha256:9551a499bf125c1d4f9e250377c1ee2eddd02e01eac6644c080162c0c51778ab", + "sha256:b0544343a702fa80c95ad5d3d608ea3599dd54d4632df855e4c8d24eb6ecfa1c", + "sha256:b093dd74e50a8cba3e873868d9e93a85b78e0daf2e98c6797566ad8044e8363d", + "sha256:b412caa66f72040e6d268491a59f2c43bf03eb6c96dd8f0307829feb7fa2b6fb", + "sha256:b4f13750ce79751586ae2eb824ba7e1e8dba64784086c98cdbbcc6a42112ce0d", + "sha256:b64d8d4d17135e00c8e346e0a738deb17e754230d7e0810ac5012750bbd85a5a", + "sha256:ba10f8411898fc418a521833e014a77d3ca01c15b0c6cdcce6a0d2897e6dbbdf", + "sha256:bd48227a919f1bafbdda0583705e547892342c26fb127219d60a5c36882609d1", + "sha256:c1f9540be57940698ed329904db803cf7a402f3fc200bfe599334c9bd84a40b2", + "sha256:c820a93b0255bc360f53eca31a0e676fd1101f673dda8da93454a12e23fc5f7a", + "sha256:ce47521a4754c8f4593837384bd3424880629f718d87c5d44f8ed763edd63543", + "sha256:d042d24c90c41b54fd506da306759e06e568864df8ec17ccc17e9e884634fd00", + "sha256:de749064336d37e340f640b05f24e9e3dd678c57318c7289d222a8a2f543e90c", + "sha256:e1dda9c7e08dc141e0247a5b8f49cf05984955246a327d4c48bda16821947b2f", + "sha256:e29554e2bef54a90aa5cc07da6ce955accb83f21ab5de01a62c8478897b264fd", + "sha256:e3143e4451880bed956e706a3220b4e5cf6172ef05fcc397f6f36a550b1dd868", + "sha256:e8213002e427c69c45a52bbd94163084025f533a55a59d6f9c5b820774ef3303", + "sha256:efd28d4e9cd7d7a8d39074a4d44c63eda73401580c5c76acda2ce969e0a38e83", + "sha256:f0fd6321b839904e15c46e0d257fdd101dd7f530fe03fd6359c1ea63738703f3", + "sha256:f1372f041402e37e5e633e586f62aa53de2eac8d98cbfb822806ce4bbefcb74d", + "sha256:f2618db89be1b4e05f7a1a847a9c1c0abd63e63a1607d892dd54668dd92faf87", + "sha256:f447e6acb680fd307f40d3da4852208af94afdfab89cf850986c3ca00562f4fa", + "sha256:f92729c95468a2f4f15e9bb94c432a9229d0d50de67304399627a943201baa2f", + "sha256:f9f1adb22318e121c5c69a09142811a201ef17ab257a1e66ca3025065b7f53ae", + "sha256:fc0c5673685c508a142ca65209b4e79ed6740a4ed6b2267dbba90f34b0b3cfda", + "sha256:fc7b73d02efb0e18c000e9ad8b83480dfcd5dfd11065997ed4c6747470ae8915", + "sha256:fd83c01228a688733f1ded5201c678f0c53ecc1006ffbc404db9f7a899ac6249", + "sha256:fe27749d33bb772c80dcd84ae7e8df2adc920ae8297400dabec45f0dedb3f6de", + "sha256:fee4236c876c4e8369388054d02d0e9bb84821feb1a64dd59e137e6511a551f8" ], "markers": "python_version == '3.11'", - "version": "==2.2.4" + "version": "==2.2.6" }, "opensearch-py": { "hashes": [ @@ -1045,11 +720,11 @@ }, "packaging": { "hashes": [ - "sha256:09abb1bccd265c01f4a3aa3f7a7db064b36514d2cba19a2f694fe6150451a759", - "sha256:c228a6dc5e932d346bc5739379109d49e8853dd8223571c7c5b55260edc0b97f" + "sha256:29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484", + "sha256:d443872c98d677bf60f6a1f2f8c1cb748e8fe762d2bf9d3148b5599295b0fc4f" ], "markers": "python_version >= '3.8'", - "version": "==24.2" + "version": "==25.0" }, "pandas": { "hashes": [ @@ -1109,11 +784,11 @@ }, "prometheus-client": { "hashes": [ - "sha256:252505a722ac04b0456be05c05f75f45d760c2911ffc45f2a06bcaed9f3ae3fb", - "sha256:594b45c410d6f4f8888940fe80b5cc2521b305a1fafe1c58609ef715a001f301" + "sha256:18da1d2241ac2d10c8d2110f13eedcd5c7c0c8af18c926e8731f04fc10cd575c", + "sha256:c8951bbe64e62b96cd8e8f5d917279d1b9b91ab766793f33d4dce6c228558713" ], - "markers": "python_version >= '3.8'", - "version": "==0.21.1" + "markers": "python_version >= '3.9'", + "version": "==0.22.0" }, "prometheus-flask-exporter": { "hashes": [ @@ -1123,110 +798,6 @@ "index": "pypi", "version": "==0.23.2" }, - "propcache": { - "hashes": [ - "sha256:050b571b2e96ec942898f8eb46ea4bfbb19bd5502424747e83badc2d4a99a44e", - "sha256:05543250deac8e61084234d5fc54f8ebd254e8f2b39a16b1dce48904f45b744b", - "sha256:069e7212890b0bcf9b2be0a03afb0c2d5161d91e1bf51569a64f629acc7defbf", - "sha256:09400e98545c998d57d10035ff623266927cb784d13dd2b31fd33b8a5316b85b", - "sha256:0c3c3a203c375b08fd06a20da3cf7aac293b834b6f4f4db71190e8422750cca5", - "sha256:0c86e7ceea56376216eba345aa1fc6a8a6b27ac236181f840d1d7e6a1ea9ba5c", - "sha256:0fbe94666e62ebe36cd652f5fc012abfbc2342de99b523f8267a678e4dfdee3c", - "sha256:17d1c688a443355234f3c031349da69444be052613483f3e4158eef751abcd8a", - "sha256:19a06db789a4bd896ee91ebc50d059e23b3639c25d58eb35be3ca1cbe967c3bf", - "sha256:1c5c7ab7f2bb3f573d1cb921993006ba2d39e8621019dffb1c5bc94cdbae81e8", - "sha256:1eb34d90aac9bfbced9a58b266f8946cb5935869ff01b164573a7634d39fbcb5", - "sha256:1f6cc0ad7b4560e5637eb2c994e97b4fa41ba8226069c9277eb5ea7101845b42", - "sha256:27c6ac6aa9fc7bc662f594ef380707494cb42c22786a558d95fcdedb9aa5d035", - "sha256:2d219b0dbabe75e15e581fc1ae796109b07c8ba7d25b9ae8d650da582bed01b0", - "sha256:2fce1df66915909ff6c824bbb5eb403d2d15f98f1518e583074671a30fe0c21e", - "sha256:319fa8765bfd6a265e5fa661547556da381e53274bc05094fc9ea50da51bfd46", - "sha256:359e81a949a7619802eb601d66d37072b79b79c2505e6d3fd8b945538411400d", - "sha256:3a02a28095b5e63128bcae98eb59025924f121f048a62393db682f049bf4ac24", - "sha256:3e19ea4ea0bf46179f8a3652ac1426e6dcbaf577ce4b4f65be581e237340420d", - "sha256:3e584b6d388aeb0001d6d5c2bd86b26304adde6d9bb9bfa9c4889805021b96de", - "sha256:40d980c33765359098837527e18eddefc9a24cea5b45e078a7f3bb5b032c6ecf", - "sha256:4114c4ada8f3181af20808bedb250da6bae56660e4b8dfd9cd95d4549c0962f7", - "sha256:43593c6772aa12abc3af7784bff4a41ffa921608dd38b77cf1dfd7f5c4e71371", - "sha256:47ef24aa6511e388e9894ec16f0fbf3313a53ee68402bc428744a367ec55b833", - "sha256:4cf9e93a81979f1424f1a3d155213dc928f1069d697e4353edb8a5eba67c6259", - "sha256:4d0dfdd9a2ebc77b869a0b04423591ea8823f791293b527dc1bb896c1d6f1136", - "sha256:563f9d8c03ad645597b8d010ef4e9eab359faeb11a0a2ac9f7b4bc8c28ebef25", - "sha256:58aa11f4ca8b60113d4b8e32d37e7e78bd8af4d1a5b5cb4979ed856a45e62005", - "sha256:5a0a9898fdb99bf11786265468571e628ba60af80dc3f6eb89a3545540c6b0ef", - "sha256:5aed8d8308215089c0734a2af4f2e95eeb360660184ad3912686c181e500b2e7", - "sha256:5b9145c35cc87313b5fd480144f8078716007656093d23059e8993d3a8fa730f", - "sha256:5cb5918253912e088edbf023788de539219718d3b10aef334476b62d2b53de53", - "sha256:5cdb0f3e1eb6dfc9965d19734d8f9c481b294b5274337a8cb5cb01b462dcb7e0", - "sha256:5ced33d827625d0a589e831126ccb4f5c29dfdf6766cac441d23995a65825dcb", - "sha256:603f1fe4144420374f1a69b907494c3acbc867a581c2d49d4175b0de7cc64566", - "sha256:61014615c1274df8da5991a1e5da85a3ccb00c2d4701ac6f3383afd3ca47ab0a", - "sha256:64a956dff37080b352c1c40b2966b09defb014347043e740d420ca1eb7c9b908", - "sha256:668ddddc9f3075af019f784456267eb504cb77c2c4bd46cc8402d723b4d200bf", - "sha256:6d8e309ff9a0503ef70dc9a0ebd3e69cf7b3894c9ae2ae81fc10943c37762458", - "sha256:6f173bbfe976105aaa890b712d1759de339d8a7cef2fc0a1714cc1a1e1c47f64", - "sha256:71ebe3fe42656a2328ab08933d420df5f3ab121772eef78f2dc63624157f0ed9", - "sha256:730178f476ef03d3d4d255f0c9fa186cb1d13fd33ffe89d39f2cda4da90ceb71", - "sha256:7d2d5a0028d920738372630870e7d9644ce437142197f8c827194fca404bf03b", - "sha256:7f30241577d2fef2602113b70ef7231bf4c69a97e04693bde08ddab913ba0ce5", - "sha256:813fbb8b6aea2fc9659815e585e548fe706d6f663fa73dff59a1677d4595a037", - "sha256:82de5da8c8893056603ac2d6a89eb8b4df49abf1a7c19d536984c8dd63f481d5", - "sha256:83be47aa4e35b87c106fc0c84c0fc069d3f9b9b06d3c494cd404ec6747544894", - "sha256:8638f99dca15b9dff328fb6273e09f03d1c50d9b6512f3b65a4154588a7595fe", - "sha256:87380fb1f3089d2a0b8b00f006ed12bd41bd858fabfa7330c954c70f50ed8757", - "sha256:88c423efef9d7a59dae0614eaed718449c09a5ac79a5f224a8b9664d603f04a3", - "sha256:89498dd49c2f9a026ee057965cdf8192e5ae070ce7d7a7bd4b66a8e257d0c976", - "sha256:8a17583515a04358b034e241f952f1715243482fc2c2945fd99a1b03a0bd77d6", - "sha256:916cd229b0150129d645ec51614d38129ee74c03293a9f3f17537be0029a9641", - "sha256:9532ea0b26a401264b1365146c440a6d78269ed41f83f23818d4b79497aeabe7", - "sha256:967a8eec513dbe08330f10137eacb427b2ca52118769e82ebcfcab0fba92a649", - "sha256:975af16f406ce48f1333ec5e912fe11064605d5c5b3f6746969077cc3adeb120", - "sha256:9979643ffc69b799d50d3a7b72b5164a2e97e117009d7af6dfdd2ab906cb72cd", - "sha256:9a8ecf38de50a7f518c21568c80f985e776397b902f1ce0b01f799aba1608b40", - "sha256:9cec3239c85ed15bfaded997773fdad9fb5662b0a7cbc854a43f291eb183179e", - "sha256:9e64e948ab41411958670f1093c0a57acfdc3bee5cf5b935671bbd5313bcf229", - "sha256:9f64d91b751df77931336b5ff7bafbe8845c5770b06630e27acd5dbb71e1931c", - "sha256:a0ab8cf8cdd2194f8ff979a43ab43049b1df0b37aa64ab7eca04ac14429baeb7", - "sha256:a110205022d077da24e60b3df8bcee73971be9575dec5573dd17ae5d81751111", - "sha256:a34aa3a1abc50740be6ac0ab9d594e274f59960d3ad253cd318af76b996dd654", - "sha256:a444192f20f5ce8a5e52761a031b90f5ea6288b1eef42ad4c7e64fef33540b8f", - "sha256:a461959ead5b38e2581998700b26346b78cd98540b5524796c175722f18b0294", - "sha256:a75801768bbe65499495660b777e018cbe90c7980f07f8aa57d6be79ea6f71da", - "sha256:aa8efd8c5adc5a2c9d3b952815ff8f7710cefdcaf5f2c36d26aff51aeca2f12f", - "sha256:aca63103895c7d960a5b9b044a83f544b233c95e0dcff114389d64d762017af7", - "sha256:b0313e8b923b3814d1c4a524c93dfecea5f39fa95601f6a9b1ac96cd66f89ea0", - "sha256:b23c11c2c9e6d4e7300c92e022046ad09b91fd00e36e83c44483df4afa990073", - "sha256:b303b194c2e6f171cfddf8b8ba30baefccf03d36a4d9cab7fd0bb68ba476a3d7", - "sha256:b655032b202028a582d27aeedc2e813299f82cb232f969f87a4fde491a233f11", - "sha256:bd39c92e4c8f6cbf5f08257d6360123af72af9f4da75a690bef50da77362d25f", - "sha256:bef100c88d8692864651b5f98e871fb090bd65c8a41a1cb0ff2322db39c96c27", - "sha256:c2fe5c910f6007e716a06d269608d307b4f36e7babee5f36533722660e8c4a70", - "sha256:c66d8ccbc902ad548312b96ed8d5d266d0d2c6d006fd0f66323e9d8f2dd49be7", - "sha256:cd6a55f65241c551eb53f8cf4d2f4af33512c39da5d9777694e9d9c60872f519", - "sha256:d249609e547c04d190e820d0d4c8ca03ed4582bcf8e4e160a6969ddfb57b62e5", - "sha256:d4e89cde74154c7b5957f87a355bb9c8ec929c167b59c83d90654ea36aeb6180", - "sha256:dc1915ec523b3b494933b5424980831b636fe483d7d543f7afb7b3bf00f0c10f", - "sha256:e1c4d24b804b3a87e9350f79e2371a705a188d292fd310e663483af6ee6718ee", - "sha256:e474fc718e73ba5ec5180358aa07f6aded0ff5f2abe700e3115c37d75c947e18", - "sha256:e4fe2a6d5ce975c117a6bb1e8ccda772d1e7029c1cca1acd209f91d30fa72815", - "sha256:e7fb9a84c9abbf2b2683fa3e7b0d7da4d8ecf139a1c635732a8bda29c5214b0e", - "sha256:e861ad82892408487be144906a368ddbe2dc6297074ade2d892341b35c59844a", - "sha256:ec314cde7314d2dd0510c6787326bbffcbdc317ecee6b7401ce218b3099075a7", - "sha256:ed5f6d2edbf349bd8d630e81f474d33d6ae5d07760c44d33cd808e2f5c8f4ae6", - "sha256:ef2e4e91fb3945769e14ce82ed53007195e616a63aa43b40fb7ebaaf907c8d4c", - "sha256:f011f104db880f4e2166bcdcf7f58250f7a465bc6b068dc84c824a3d4a5c94dc", - "sha256:f1528ec4374617a7a753f90f20e2f551121bb558fcb35926f99e3c42367164b8", - "sha256:f27785888d2fdd918bc36de8b8739f2d6c791399552333721b58193f68ea3e98", - "sha256:f35c7070eeec2cdaac6fd3fe245226ed2a6292d3ee8c938e5bb645b434c5f256", - "sha256:f3bbecd2f34d0e6d3c543fdb3b15d6b60dd69970c2b4c822379e5ec8f6f621d5", - "sha256:f6f1324db48f001c2ca26a25fa25af60711e09b9aaf4b28488602776f4f9a744", - "sha256:f78eb8422acc93d7b69964012ad7048764bb45a54ba7a39bb9e146c72ea29723", - "sha256:fb6e0faf8cb6b4beea5d6ed7b5a578254c6d7df54c36ccd3d8b3eb00d6770277", - "sha256:feccd282de1f6322f56f6845bf1207a537227812f0a9bf5571df52bb418d79d5" - ], - "markers": "python_version >= '3.9'", - "version": "==0.3.1" - }, "pycparser": { "hashes": [ "sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6", @@ -1237,116 +808,116 @@ }, "pydantic": { "hashes": [ - "sha256:7471657138c16adad9322fe3070c0116dd6c3ad8d649300e3cbdfe91f4db4ec3", - "sha256:a082753436a07f9ba1289c6ffa01cd93db3548776088aa917cc43b63f68fa60f" + "sha256:32738d19d63a226a52eed76645a98ee07c1f410ee41d93b4afbfa85ed8111c2d", + "sha256:d9615eaa9ac5a063471da949c8fc16376a84afb5024688b3ff885693506764eb" ], "markers": "python_version >= '3.9'", - "version": "==2.11.3" + "version": "==2.11.4" }, "pydantic-core": { "hashes": [ - "sha256:0483847fa9ad5e3412265c1bd72aad35235512d9ce9d27d81a56d935ef489672", - "sha256:048831bd363490be79acdd3232f74a0e9951b11b2b4cc058aeb72b22fdc3abe1", - "sha256:048c01eee07d37cbd066fc512b9d8b5ea88ceeb4e629ab94b3e56965ad655add", - "sha256:049e0de24cf23766f12cc5cc71d8abc07d4a9deb9061b334b62093dedc7cb068", - "sha256:08530b8ac922003033f399128505f513e30ca770527cc8bbacf75a84fcc2c74b", - "sha256:0fb935c5591573ae3201640579f30128ccc10739b45663f93c06796854405505", - "sha256:1293d7febb995e9d3ec3ea09caf1a26214eec45b0f29f6074abb004723fc1de8", - "sha256:177d50460bc976a0369920b6c744d927b0ecb8606fb56858ff542560251b19e5", - "sha256:1a28239037b3d6f16916a4c831a5a0eadf856bdd6d2e92c10a0da3a59eadcf3e", - "sha256:1b30d92c9412beb5ac6b10a3eb7ef92ccb14e3f2a8d7732e2d739f58b3aa7544", - "sha256:1c607801d85e2e123357b3893f82c97a42856192997b95b4d8325deb1cd0c5f4", - "sha256:1d20eb4861329bb2484c021b9d9a977566ab16d84000a57e28061151c62b349a", - "sha256:1dfae24cf9921875ca0ca6a8ecb4bb2f13c855794ed0d468d6abbec6e6dcd44a", - "sha256:25626fb37b3c543818c14821afe0fd3830bc327a43953bc88db924b68c5723f1", - "sha256:282b3fe1bbbe5ae35224a0dbd05aed9ccabccd241e8e6b60370484234b456266", - "sha256:2ea62419ba8c397e7da28a9170a16219d310d2cf4970dbc65c32faf20d828c83", - "sha256:2f593494876eae852dc98c43c6f260f45abdbfeec9e4324e31a481d948214764", - "sha256:2f9284e11c751b003fd4215ad92d325d92c9cb19ee6729ebd87e3250072cdcde", - "sha256:3077cfdb6125cc8dab61b155fdd714663e401f0e6883f9632118ec12cf42df26", - "sha256:32cd11c5914d1179df70406427097c7dcde19fddf1418c787540f4b730289896", - "sha256:338ea9b73e6e109f15ab439e62cb3b78aa752c7fd9536794112e14bee02c8d18", - "sha256:35a5ec3fa8c2fe6c53e1b2ccc2454398f95d5393ab398478f53e1afbbeb4d939", - "sha256:398a38d323f37714023be1e0285765f0a27243a8b1506b7b7de87b647b517e48", - "sha256:3a371dc00282c4b84246509a5ddc808e61b9864aa1eae9ecc92bb1268b82db4a", - "sha256:3a64e81e8cba118e108d7126362ea30e021291b7805d47e4896e52c791be2761", - "sha256:3ab2d36e20fbfcce8f02d73c33a8a7362980cff717926bbae030b93ae46b56c7", - "sha256:3f1fdb790440a34f6ecf7679e1863b825cb5ffde858a9197f851168ed08371e5", - "sha256:3f2648b9262607a7fb41d782cc263b48032ff7a03a835581abbf7a3bec62bcf5", - "sha256:401d7b76e1000d0dd5538e6381d28febdcacb097c8d340dde7d7fc6e13e9f95d", - "sha256:495bc156026efafd9ef2d82372bd38afce78ddd82bf28ef5276c469e57c0c83e", - "sha256:4b315e596282bbb5822d0c7ee9d255595bd7506d1cb20c2911a4da0b970187d3", - "sha256:5183e4f6a2d468787243ebcd70cf4098c247e60d73fb7d68d5bc1e1beaa0c4db", - "sha256:5277aec8d879f8d05168fdd17ae811dd313b8ff894aeeaf7cd34ad28b4d77e33", - "sha256:52928d8c1b6bda03cc6d811e8923dffc87a2d3c8b3bfd2ce16471c7147a24850", - "sha256:549150be302428b56fdad0c23c2741dcdb5572413776826c965619a25d9c6bde", - "sha256:5773da0ee2d17136b1f1c6fbde543398d452a6ad2a7b54ea1033e2daa739b8d2", - "sha256:5ab77f45d33d264de66e1884fca158bc920cb5e27fd0764a72f72f5756ae8bdb", - "sha256:5c834f54f8f4640fd7e4b193f80eb25a0602bba9e19b3cd2fc7ffe8199f5ae02", - "sha256:5ccd429694cf26af7997595d627dd2637e7932214486f55b8a357edaac9dae8c", - "sha256:681d65e9011f7392db5aa002b7423cc442d6a673c635668c227c6c8d0e5a4f77", - "sha256:694ad99a7f6718c1a498dc170ca430687a39894a60327f548e02a9c7ee4b6504", - "sha256:6dd8ecfde08d8bfadaea669e83c63939af76f4cf5538a72597016edfa3fad516", - "sha256:6e966fc3caaf9f1d96b349b0341c70c8d6573bf1bac7261f7b0ba88f96c56c24", - "sha256:70af6a21237b53d1fe7b9325b20e65cbf2f0a848cf77bed492b029139701e66a", - "sha256:723c5630c4259400818b4ad096735a829074601805d07f8cafc366d95786d331", - "sha256:7965c13b3967909a09ecc91f21d09cfc4576bf78140b988904e94f130f188396", - "sha256:7aeb055a42d734c0255c9e489ac67e75397d59c6fbe60d155851e9782f276a9c", - "sha256:7edbc454a29fc6aeae1e1eecba4f07b63b8d76e76a748532233c4c167b4cb9ea", - "sha256:7fb66263e9ba8fea2aa85e1e5578980d127fb37d7f2e292773e7bc3a38fb0c7b", - "sha256:87d3776f0001b43acebfa86f8c64019c043b55cc5a6a2e313d728b5c95b46969", - "sha256:8ab581d3530611897d863d1a649fb0644b860286b4718db919bfd51ece41f10b", - "sha256:8d13f0276806ee722e70a1c93da19748594f19ac4299c7e41237fc791d1861ea", - "sha256:8ffab8b2908d152e74862d276cf5017c81a2f3719f14e8e3e8d6b83fda863927", - "sha256:902dbc832141aa0ec374f4310f1e4e7febeebc3256f00dc359a9ac3f264a45dc", - "sha256:9097b9f17f91eea659b9ec58148c0747ec354a42f7389b9d50701610d86f812e", - "sha256:91815221101ad3c6b507804178a7bb5cb7b2ead9ecd600041669c8d805ebd595", - "sha256:948b73114f47fd7016088e5186d13faf5e1b2fe83f5e320e371f035557fd264d", - "sha256:99b56acd433386c8f20be5c4000786d1e7ca0523c8eefc995d14d79c7a081498", - "sha256:9d3da303ab5f378a268fa7d45f37d7d85c3ec19769f28d2cc0c61826a8de21fe", - "sha256:9f466e8bf0a62dc43e068c12166281c2eca72121dd2adc1040f3aa1e21ef8599", - "sha256:9fea9c1869bb4742d174a57b4700c6dadea951df8b06de40c2fedb4f02931c2e", - "sha256:a0d5f3acc81452c56895e90643a625302bd6be351e7010664151cc55b7b97f89", - "sha256:a3edde68d1a1f9af1273b2fe798997b33f90308fb6d44d8550c89fc6a3647cf6", - "sha256:a62c3c3ef6a7e2c45f7853b10b5bc4ddefd6ee3cd31024754a1a5842da7d598d", - "sha256:aa687a23d4b7871a00e03ca96a09cad0f28f443690d300500603bd0adba4b523", - "sha256:ab0277cedb698749caada82e5d099dc9fed3f906a30d4c382d1a21725777a1e5", - "sha256:ad05b683963f69a1d5d2c2bdab1274a31221ca737dbbceaa32bcb67359453cdd", - "sha256:b172f7b9d2f3abc0efd12e3386f7e48b576ef309544ac3a63e5e9cdd2e24585d", - "sha256:b1caa0bc2741b043db7823843e1bde8aaa58a55a58fda06083b0569f8b45693a", - "sha256:bae370459da6a5466978c0eacf90690cb57ec9d533f8e63e564ef3822bfa04fe", - "sha256:bcc9c6fdb0ced789245b02b7d6603e17d1563064ddcfc36f046b61c0c05dd9df", - "sha256:bdc84017d28459c00db6f918a7272a5190bec3090058334e43a76afb279eac7c", - "sha256:bfd0adeee563d59c598ceabddf2c92eec77abcb3f4a391b19aa7366170bd9e30", - "sha256:c566dd9c5f63d22226409553531f89de0cac55397f2ab8d97d6f06cfce6d947e", - "sha256:c91dbb0ab683fa0cd64a6e81907c8ff41d6497c346890e26b23de7ee55353f96", - "sha256:c964fd24e6166420d18fb53996d8c9fd6eac9bf5ae3ec3d03015be4414ce497f", - "sha256:cc77ec5b7e2118b152b0d886c7514a4653bcb58c6b1d760134a9fab915f777b3", - "sha256:d100e3ae783d2167782391e0c1c7a20a31f55f8015f3293647544df3f9c67824", - "sha256:d3a07fadec2a13274a8d861d3d37c61e97a816beae717efccaa4b36dfcaadcde", - "sha256:d5e3d15245b08fa4a84cefc6c9222e6f37c98111c8679fbd94aa145f9a0ae23d", - "sha256:de9e06abe3cc5ec6a2d5f75bc99b0bdca4f5c719a5b34026f8c57efbdecd2ee3", - "sha256:df6a94bf9452c6da9b5d76ed229a5683d0306ccb91cca8e1eea883189780d568", - "sha256:e100c52f7355a48413e2999bfb4e139d2977a904495441b374f3d4fb4a170961", - "sha256:e11f3864eb516af21b01e25fac915a82e9ddad3bb0fb9e95a246067398b435a4", - "sha256:e14f369c98a7c15772b9da98987f58e2b509a93235582838bd0d1d8c08b68fda", - "sha256:e3de2777e3b9f4d603112f78006f4ae0acb936e95f06da6cb1a45fbad6bdb4b5", - "sha256:e7aaba1b4b03aaea7bb59e1b5856d734be011d3e6d98f5bcaa98cb30f375f2ad", - "sha256:ec259f62538e8bf364903a7d0d0239447059f9434b284f5536e8402b7dd198db", - "sha256:ec79de2a8680b1a67a07490bddf9636d5c2fab609ba8c57597e855fa5fa4dacd", - "sha256:ed3eb16d51257c763539bde21e011092f127a2202692afaeaccb50db55a31383", - "sha256:ede9b407e39949d2afc46385ce6bd6e11588660c26f80576c11c958e6647bc40", - "sha256:ee12a7be1742f81b8a65b36c6921022301d466b82d80315d215c4c691724986f", - "sha256:ef99779001d7ac2e2461d8ab55d3373fe7315caefdbecd8ced75304ae5a6fc6b", - "sha256:f59295ecc75a1788af8ba92f2e8c6eeaa5a94c22fc4d151e8d9638814f85c8fc", - "sha256:f995719707e0e29f0f41a8aa3bcea6e761a36c9136104d3189eafb83f5cec5e5", - "sha256:f99aeda58dce827f76963ee87a0ebe75e648c72ff9ba1174a253f6744f518f65", - "sha256:fc6bf8869e193855e8d91d91f6bf59699a5cdfaa47a404e278e776dd7f168b39", - "sha256:fc903512177361e868bc1f5b80ac8c8a6e05fcdd574a5fb5ffeac5a9982b9e89", - "sha256:fe44d56aa0b00d66640aa84a3cbe80b7a3ccdc6f0b1ca71090696a6d4777c091" + "sha256:0069c9acc3f3981b9ff4cdfaf088e98d83440a4c7ea1bc07460af3d4dc22e72d", + "sha256:031c57d67ca86902726e0fae2214ce6770bbe2f710dc33063187a68744a5ecac", + "sha256:0405262705a123b7ce9f0b92f123334d67b70fd1f20a9372b907ce1080c7ba02", + "sha256:04a1a413977ab517154eebb2d326da71638271477d6ad87a769102f7c2488c56", + "sha256:09fb9dd6571aacd023fe6aaca316bd01cf60ab27240d7eb39ebd66a3a15293b4", + "sha256:0a39979dcbb70998b0e505fb1556a1d550a0781463ce84ebf915ba293ccb7e22", + "sha256:0a9f2c9dd19656823cb8250b0724ee9c60a82f3cdf68a080979d13092a3b0fef", + "sha256:0e03262ab796d986f978f79c943fc5f620381be7287148b8010b4097f79a39ec", + "sha256:0e5b2671f05ba48b94cb90ce55d8bdcaaedb8ba00cc5359f6810fc918713983d", + "sha256:0e6116757f7959a712db11f3e9c0a99ade00a5bbedae83cb801985aa154f071b", + "sha256:0fb2d542b4d66f9470e8065c5469ec676978d625a8b7a363f07d9a501a9cb36a", + "sha256:1082dd3e2d7109ad8b7da48e1d4710c8d06c253cbc4a27c1cff4fbcaa97a9e3f", + "sha256:1a8695a8d00c73e50bff9dfda4d540b7dee29ff9b8053e38380426a85ef10052", + "sha256:1e063337ef9e9820c77acc768546325ebe04ee38b08703244c1309cccc4f1bab", + "sha256:1ea40a64d23faa25e62a70ad163571c0b342b8bf66d5fa612ac0dec4f069d916", + "sha256:2058a32994f1fde4ca0480ab9d1e75a0e8c87c22b53a3ae66554f9af78f2fe8c", + "sha256:235f45e5dbcccf6bd99f9f472858849f73d11120d76ea8707115415f8e5ebebf", + "sha256:2807668ba86cb38c6817ad9bc66215ab8584d1d304030ce4f0887336f28a5e27", + "sha256:2b0a451c263b01acebe51895bfb0e1cc842a5c666efe06cdf13846c7418caa9a", + "sha256:2b3d326aaef0c0399d9afffeb6367d5e26ddc24d351dbc9c636840ac355dc5d8", + "sha256:2bfb5112df54209d820d7bf9317c7a6c9025ea52e49f46b6a2060104bba37de7", + "sha256:2f82865531efd18d6e07a04a17331af02cb7a651583c418df8266f17a63c6612", + "sha256:329467cecfb529c925cf2bbd4d60d2c509bc2fb52a20c1045bf09bb70971a9c1", + "sha256:3a1c81334778f9e3af2f8aeb7a960736e5cab1dfebfb26aabca09afd2906c039", + "sha256:3abcd9392a36025e3bd55f9bd38d908bd17962cc49bc6da8e7e96285336e2bca", + "sha256:3c6db6e52c6d70aa0d00d45cdb9b40f0433b96380071ea80b09277dba021ddf7", + "sha256:3dc625f4aa79713512d1976fe9f0bc99f706a9dee21dfd1810b4bbbf228d0e8a", + "sha256:3eb3fe62804e8f859c49ed20a8451342de53ed764150cb14ca71357c765dc2a6", + "sha256:44857c3227d3fb5e753d5fe4a3420d6376fa594b07b621e220cd93703fe21782", + "sha256:4b25d91e288e2c4e0662b8038a28c6a07eaac3e196cfc4ff69de4ea3db992a1b", + "sha256:4c5b0a576fb381edd6d27f0a85915c6daf2f8138dc5c267a57c08a62900758c7", + "sha256:4e61206137cbc65e6d5256e1166f88331d3b6238e082d9f74613b9b765fb9025", + "sha256:52fb90784e0a242bb96ec53f42196a17278855b0f31ac7c3cc6f5c1ec4811849", + "sha256:53a57d2ed685940a504248187d5685e49eb5eef0f696853647bf37c418c538f7", + "sha256:572c7e6c8bb4774d2ac88929e3d1f12bc45714ae5ee6d9a788a9fb35e60bb04b", + "sha256:5c4aa4e82353f65e548c476b37e64189783aa5384903bfea4f41580f255fddfa", + "sha256:5c92edd15cd58b3c2d34873597a1e20f13094f59cf88068adb18947df5455b4e", + "sha256:5f483cfb75ff703095c59e365360cb73e00185e01aaea067cd19acffd2ab20ea", + "sha256:61c18fba8e5e9db3ab908620af374db0ac1baa69f0f32df4f61ae23f15e586ac", + "sha256:6368900c2d3ef09b69cb0b913f9f8263b03786e5b2a387706c5afb66800efd51", + "sha256:64632ff9d614e5eecfb495796ad51b0ed98c453e447a76bcbeeb69615079fc7e", + "sha256:65132b7b4a1c0beded5e057324b7e16e10910c106d43675d9bd87d4f38dde162", + "sha256:6b99022f1d19bc32a4c2a0d544fc9a76e3be90f0b3f4af413f87d38749300e65", + "sha256:6bdfe4b3789761f3bcb4b1ddf33355a71079858958e3a552f16d5af19768fef2", + "sha256:6fa6dfc3e4d1f734a34710f391ae822e0a8eb8559a85c6979e14e65ee6ba2954", + "sha256:73662edf539e72a9440129f231ed3757faab89630d291b784ca99237fb94db2b", + "sha256:73cf6373c21bc80b2e0dc88444f41ae60b2f070ed02095754eb5a01df12256de", + "sha256:7cb8bc3605c29176e1b105350d2e6474142d7c1bd1d9327c4a9bdb46bf827acc", + "sha256:7f92c15cd1e97d4b12acd1cc9004fa092578acfa57b67ad5e43a197175d01a64", + "sha256:82f68293f055f51b51ea42fafc74b6aad03e70e191799430b90c13d643059ebb", + "sha256:83aa99b1285bc8f038941ddf598501a86f1536789740991d7d8756e34f1e74d9", + "sha256:87acbfcf8e90ca885206e98359d7dca4bcbb35abdc0ff66672a293e1d7a19101", + "sha256:87b31b6846e361ef83fedb187bb5b4372d0da3f7e28d85415efa92d6125d6e6d", + "sha256:881b21b5549499972441da4758d662aeea93f1923f953e9cbaff14b8b9565aef", + "sha256:8d55ab81c57b8ff8548c3e4947f119551253f4e3787a7bbc0b6b3ca47498a9d3", + "sha256:8f57a69461af2a5fa6e6bbd7a5f60d3b7e6cebb687f55106933188e79ad155c1", + "sha256:95237e53bb015f67b63c91af7518a62a8660376a6a0db19b89acc77a4d6199f5", + "sha256:96081f1605125ba0855dfda83f6f3df5ec90c61195421ba72223de35ccfb2f88", + "sha256:970919794d126ba8645f3837ab6046fb4e72bbc057b3709144066204c19a455d", + "sha256:9cb1da0f5a471435a7bc7e439b8a728e8b61e59784b2af70d7c169f8dd8ae290", + "sha256:9fcd347d2cc5c23b06de6d3b7b8275be558a0c90549495c699e379a80bf8379e", + "sha256:9fdac5d6ffa1b5a83bca06ffe7583f5576555e6c8b3a91fbd25ea7780f825f7d", + "sha256:a11c8d26a50bfab49002947d3d237abe4d9e4b5bdc8846a63537b6488e197808", + "sha256:a144d4f717285c6d9234a66778059f33a89096dfb9b39117663fd8413d582dcc", + "sha256:a2b911a5b90e0374d03813674bf0a5fbbb7741570dcd4b4e85a2e48d17def29d", + "sha256:a7ec89dc587667f22b6a0b6579c249fca9026ce7c333fc142ba42411fa243cdc", + "sha256:aa9d91b338f2df0508606f7009fde642391425189bba6d8c653afd80fd6bb64e", + "sha256:b0379a2b24882fef529ec3b4987cb5d003b9cda32256024e6fe1586ac45fc640", + "sha256:bc7aee6f634a6f4a95676fcb5d6559a2c2a390330098dba5e5a5f28a2e4ada30", + "sha256:bdc25f3681f7b78572699569514036afe3c243bc3059d3942624e936ec93450e", + "sha256:c083a3bdd5a93dfe480f1125926afcdbf2917ae714bdb80b36d34318b2bec5d9", + "sha256:c20c462aa4434b33a2661701b861604913f912254e441ab8d78d30485736115a", + "sha256:c2fc0a768ef76c15ab9238afa6da7f69895bb5d1ee83aeea2e3509af4472d0b9", + "sha256:c52b02ad8b4e2cf14ca7b3d918f3eb0ee91e63b3167c32591e57c4317e134f8f", + "sha256:c54c939ee22dc8e2d545da79fc5381f1c020d6d3141d3bd747eab59164dc89fb", + "sha256:c8e7af2f4e0194c22b5b37205bfb293d166a7344a5b0d0eaccebc376546d77d5", + "sha256:cca3868ddfaccfbc4bfb1d608e2ccaaebe0ae628e1416aeb9c4d88c001bb45ab", + "sha256:d3f26877a748dc4251cfcfda9dfb5f13fcb034f5308388066bcfe9031b63ae7d", + "sha256:d53b22f2032c42eaaf025f7c40c2e3b94568ae077a606f006d206a463bc69572", + "sha256:d87c561733f66531dced0da6e864f44ebf89a8fba55f31407b00c2f7f9449593", + "sha256:d946c8bf0d5c24bf4fe333af284c59a19358aa3ec18cb3dc4370080da1e8ad29", + "sha256:dac89aea9af8cd672fa7b510e7b8c33b0bba9a43186680550ccf23020f32d535", + "sha256:db4b41f9bd95fbe5acd76d89920336ba96f03e149097365afe1cb092fceb89a1", + "sha256:dc46a01bf8d62f227d5ecee74178ffc448ff4e5197c756331f71efcc66dc980f", + "sha256:dd14041875d09cc0f9308e37a6f8b65f5585cf2598a53aa0123df8b129d481f8", + "sha256:de4b83bb311557e439b9e186f733f6c645b9417c84e2eb8203f3f820a4b988bf", + "sha256:e799c050df38a639db758c617ec771fd8fb7a5f8eaaa4b27b101f266b216a246", + "sha256:e80b087132752f6b3d714f041ccf74403799d3b23a72722ea2e6ba2e892555b9", + "sha256:eb8c529b2819c37140eb51b914153063d27ed88e3bdc31b71198a198e921e011", + "sha256:eb9b459ca4df0e5c87deb59d37377461a538852765293f9e6ee834f0435a93b9", + "sha256:efec8db3266b76ef9607c2c4c419bdb06bf335ae433b80816089ea7585816f6a", + "sha256:f481959862f57f29601ccced557cc2e817bce7533ab8e01a797a48b49c9692b3", + "sha256:f517ca031dfc037a9c07e748cefd8d96235088b83b4f4ba8939105d20fa1dcd6", + "sha256:f889f7a40498cc077332c7ab6b4608d296d852182211787d4f3ee377aaae66e8", + "sha256:f8de619080e944347f5f20de29a975c2d815d9ddd8be9b9b7268e2e3ef68605a", + "sha256:f941635f2a3d96b2973e867144fde513665c87f13fe0e193c158ac51bfaaa7b2", + "sha256:fa754d1850735a0b0e03bcffd9d4b4343eb417e47196e4485d9cca326073a42c", + "sha256:fa854f5cf7e33842a892e5c73f45327760bc7bc516339fda888c75ae60edaeb6", + "sha256:fe5b32187cbc0c862ee201ad66c30cf218e5ed468ec8dc1cf49dec66e160cc4d" ], "markers": "python_version >= '3.9'", - "version": "==2.33.1" + "version": "==2.33.2" }, "pyjwt": { "hashes": [ @@ -1369,7 +940,7 @@ "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3", "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427" ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2'", + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", "version": "==2.9.0.post0" }, "python-dotenv": { @@ -1448,104 +1019,104 @@ }, "qh3": { "hashes": [ - "sha256:0125a69720b3a436fbf3ce1f5e4c7a8b48858360e037bfab19cd16465d9fe325", - "sha256:0561f53b5d3727d2306762ee9d03381763febf34bab2ced8490ad57c6facb025", - "sha256:0af6d7b5a02da5e53f2534c051e05f7a895c4842735d2d83e546962534fbfe7a", - "sha256:0b9d66f05d396b7ab49aabbd7ecfa8248e2be6afac49dda80cd5ddcc509a5183", - "sha256:121ddb3d5b98a4a91636b1609d5de5e3026dbe45b8c2036bce38be5827be2e49", - "sha256:1ec470854283a88364549019aa59eb0a97f3d394cee4df90a7279fd9ec11b8ff", - "sha256:1fac05a823b7d244a44b5f1e14c8afa45488e8b9bfc7bf4f3e7f7bbe82b3f7be", - "sha256:20b6f7423ce21649aefb0cc5085620c2a9fedcce5ae8c3d85fb65b0e8814706a", - "sha256:236e9fda8ebab9f8295a9161a02c387d21a9f08d87da1880ff26c983c84db073", - "sha256:23dd497adb4278680c25bcdaebadbe04e6b2a8922e6e9d61e2697452a1a762ac", - "sha256:266a000569966f44005a43002ac6bbadd82e48f9edab2c024a41210dc2f3e7c1", - "sha256:2759963b4c6882d935bdf0acbaeed7d3ad60ccdcf9445481ca9681f534d30907", - "sha256:2bae7c280599ee9c97406d165ede9a1f7a54a59d4770d0d4d951e85132adc192", - "sha256:30778f9028ed4dbff9d395e14b0665358446dd1c0797f8053eb71b6bdb7f7ed5", - "sha256:334955044a5d9458521f054748d8fa6830d3cea4c5af8803846d1211536375f1", - "sha256:390ee1a67c377cdb3b97e4d12da1898fd2d0355fa56296df980e8a559a943182", - "sha256:393a3a63c6b6ea92663ed6009d9fd317d03dd5054e68f43428eb4f683ef1bd64", - "sha256:3cb8ea722dc62e953437163a2d28251b9588210e96e629847e66b845bc28ca9d", - "sha256:3cc67e18046d274b38a77331b776d07087e1f96ee31525a977798fa975a653ed", - "sha256:3d2ebe0176e82104aa19bf25b4cdb9630bb5e3d7cb7771d18a474d34927f39e9", - "sha256:40bb818fbaa01cdfcbe9db4bc1deb43ecd5461d2a124af2ceeb2adf4ddfff605", - "sha256:446a4f6adfb41aa769083417e9eaed89f5af5b60051a4ffab4aa78aecd966f3a", - "sha256:446d288ce2c29c542f86ce13912c15a862571455c0bbb067ec2e7966ea90d55a", - "sha256:48e2cabaa621ae34cd98caaf1b114fb6ce893ef5d222189eff1edea285073519", - "sha256:4d9911d8684a5f45e4f18a744577386e60287cf18a0196dff88ffe9152410ba4", - "sha256:4e5bdb8ac8a6770fa6c4940bee92db6c1eebce51ef856a65038207dfb84013d9", - "sha256:50f8dd5b7423eb3c8cc74d0fd9b5df1214afe3bc9b86f9043d9721d5e722ea78", - "sha256:51a55d1a1b21c54ed67c65bf6f9a4e8aabb616579518062f4d7c0ea883fdfa34", - "sha256:537386ab886915d9a7abb5c7754aeef8e07ac04a23c5a3cc6a0a9a9f2c0fc6ec", - "sha256:55b9cdffa46ef9ad2478e5cd38bfc2d582da07a40a75dc4d02a44499409a983b", - "sha256:56a444ddc7b8ca670c81b333639a8a059b0eef34801ee528a4598b1e130b99c9", - "sha256:5d6eb5574be188181f8af56e2593daeca26c81d805752a5589039d7e1abb7e04", - "sha256:5dd7b2cc5169ac63e2e3b2ce913e5a8ff88da1f3658bbfdf1d0defef4e8f071e", - "sha256:5efca680dcce979355cd4f11b1270383869a21ac57b7b54a7074b2d0ad732acd", - "sha256:5f26bf8f7d3af25baae0e54523304d205f187643b60f1cb002356dbf81a6a6e8", - "sha256:62c1c38258ddb949f068cd1b5b19a6f33d3020d1864b5aafef7e5ddad04ed3ce", - "sha256:6d82486d855b03423b7ccb1c176b511a490568de3565b5632d139f092f7d6852", - "sha256:70c26db8495acd44adab970df902a5446566eb5e10265b6bceb417cae051a1d8", - "sha256:7172f94689f75f5bdf71656707af138b6429496ce6943839e2b275dadd270e7e", - "sha256:72d883bf3048375aaa6283a8c7dfa98764ec014466589408b66a7b520b5bd08b", - "sha256:7417e76526930a81db7dffe9b7178ca8d62f470aabe98264d131222404a77b11", - "sha256:799c20c623802eb9d74d0de7b698bc9822b8949d724728cfad3d787b3f076973", - "sha256:79ca66272b93ad9605e1f510a2f98660a2e5afce395d27ec877e41e6db718562", - "sha256:7af0facc1843e390752dbffa34975ed6ebfa0d614e87f2b21730b81e324524b6", - "sha256:7c7509a10cfb8d0b7f611c598c9a22154505b4cf653fab5900378807958db611", - "sha256:802ca75ed7c79c7e2bf7ce92c038006b8c458dccbd4922fac05044ae7e6db9fb", - "sha256:8688dfc27bfff0e0caaece83e9b1b29605a41fb582df924a9b5486cf19d667fb", - "sha256:8b70f085cbfd5685e4d923d451302934897a0c9e8707e1dd9c4955aaea254f87", - "sha256:8dd09a4559fc689a52b9712e4887fcf5f930633d14a463de05380bd01da27529", - "sha256:8e84916b4b1a7f397de0ff9870baff5a5b5b59841a55d3e3ae5759d3b490f653", - "sha256:91d6a93b5c370d014f87b50a28e6cda6b2391eb8e4c6129f431e0797b721d396", - "sha256:9c4d198f84d77931f2a20339f746d8e9f3d9f202b85c680797945efda2cdb122", - "sha256:a0ad122255a9600918af163d55c62d2df5364967faa29f1256bf46e6b565cd5b", - "sha256:a3cd011751106526fe7fd7dfebc6381ce360fc82a67a030eaa88f374d589570d", - "sha256:a4143112727ebfa554c6b484bc4b84344c68137af77159fca28360f52ee65880", - "sha256:a527160ccbb9dedb233aa477a59c33b15fd59516c5774657e2d5686296f18528", - "sha256:ab29da155e5d858b4f5d1f52726bbf183b737bf96b5dc35e45ce5bd7e8fcef41", - "sha256:acf34cd529a0499abc5eef651baf25f6eed42c35d878872bbfd07fbf7e9a85f6", - "sha256:b22c709f5774d9fe6b25c4369fe1e6e5c80c47fa97e5a782a0a82c781c45b580", - "sha256:b26c3de5a2cb48480e62ded0c46f58143791b57a2031b954e116a21f6a810a14", - "sha256:b46946d5f60bbc43ae31f267cf607443de63c33d8b3b516bc2c0ee34dbeadde9", - "sha256:b5104913760767bab5369f7fc283cdb8a6cdf3da38ef645af14411e4096456f3", - "sha256:b72d0b5b3e9d2aa3cf8cf689b2dce7eed401d8bd7e1adabd224d5ae41bb1c873", - "sha256:b811e388e48e386f7f35005c6f3cfa099ddf1eb35f0592dc6266dfb7e53e1760", - "sha256:cf1fef4feaba719974aa4421acbf373f83669b2c4c51747415076f40ff380de3", - "sha256:d1a21656bb7ff6150e8a6dd4eb6327221521b9942239e7ea7d62660185b1114a", - "sha256:d28a94ce57860103b2e2a1aae071fdd47c2c6b84ac88f18ef1eb4e47fb59f9cd", - "sha256:d482c8d92e137f7227aebe4f49c9add93cdb0ae032bf0a8a00bdda5157239483", - "sha256:d637c80cf19b2738413f2b694d3b3a69f0a2d68eb00489bb51b9dd8b78e8e8ee", - "sha256:d74018ef46ea1ec16b8561d1a3f7dd4c8628b6e3f63b80d364e8bbea0bae1de3", - "sha256:d7ac6781c945b05f06cb237ef99ef63b21f578e973dcda72b363931d5c4bf453", - "sha256:d7b35a5d79eb78ca2bb8490f4a3c6948dd5c6e9c8884241edb8597c0c4135fc4", - "sha256:d7e71a3e2d0116408d1f7a86b415014677fa4d6c3a873cf7344123abaf97792e", - "sha256:da5b5bdbfc2bfc2ed8af4dbd03a7dd1612acf64ca62ca1b4fca1292807bbedcd", - "sha256:dc0eee7abd896f0e8d483d7d129b1ff201bc6a358b2a6b6e41f95af41c62956d", - "sha256:df1866347cab2b97e427d61540342b58461797ca30a573a4ee19dd9ddd932fd8", - "sha256:e29c30106bccef52764ca5003be91001a28c132ff47a03caadc9ed33e66d5156", - "sha256:e44345527484f7cf0674788c78d44820bd499d04c42bff7984fd1f9bbf962964", - "sha256:e462cb1a4ba08cc17da3e7f6431d666518ef38b256322812a47272f8c4157e88", - "sha256:e4b607940929d9151c3d3bcce4d02cbebdc246a17afd16dfa32d2ae1ab1fdc01", - "sha256:e7f9ee153dd48804d0c3070c7c52f8863cf7e903ddecc5646a1e1798b2e41389", - "sha256:e948de73b71a35910aee9e62acbabf56c7ecba29da83e99f740bd37d36672d41", - "sha256:ea099fba44dc4ee54254fc9c9d9a51beea62f5d25266dc2b0eb3e1762505704e", - "sha256:ea238a5e3e140104917781c4cabaad42e26a2ddc973899f2d3af295c4cc9e061", - "sha256:ed5c9c36dc3a6ebf0981bd1e03cecebb4d51c58bce95485172666e3dcbc0973c", - "sha256:f2f119969e68bb7dc599c19768424894d65700ed2f35966fb5199a453a1086bb", - "sha256:f3082c67d6a7e3333e2232054831dbf64f2b18ae2df05fdcd76e483d306e7f01", - "sha256:f455446bd7425b17f3f6a6d915c784e83cf058259f58573db5413b7507acf586", - "sha256:f45d81e4e16cfce039788c0e44f8a5ad57fd6d303799a98866a3ad28bf9eeccf", - "sha256:f46929f9a4eae5f95fc8a2be1ed123c5e2f48621128ebdd296a77936328e59e7", - "sha256:f52d237553488dcf07f0a6297a5f3497ea3a616e996176840c4cb2c47765b9fd", - "sha256:f6e4d1f11e119673a0ae79ee749a93907d8e932cd3172d9885c4663511e6cdac", - "sha256:fc7d0b3ec1130eade130abf8434a319f86fe4a3d85861ab4b6fe08fc09b6497a", - "sha256:ff0a911de71092966df1abfa6a35180f703fe81e01dc317729132f89e22d6c46", - "sha256:ff222c695872ada25369a3ee4e3e3a0fb4ecfe4396aef3900789a0f128a24f16" - ], - "markers": "(platform_python_implementation != 'CPython' or python_full_version > '3.7.10') and (platform_system == 'Darwin' or platform_system == 'Windows' or platform_system == 'Linux') and (platform_machine == 'x86_64' or platform_machine == 's390x' or platform_machine == 'armv7l' or platform_machine == 'ppc64le' or platform_machine == 'ppc64' or platform_machine == 'AMD64' or platform_machine == 'aarch64' or platform_machine == 'arm64' or platform_machine == 'ARM64' or platform_machine == 'x86' or platform_machine == 'i686') and (platform_python_implementation == 'CPython' or (platform_python_implementation == 'PyPy' and python_version < '3.12'))", - "version": "==1.4.4" + "sha256:02130af8f4d5f58ae858bd0b90358bf4607b4a6be16d254c4a81527a48306111", + "sha256:032221480f04cce330988c4acdc5527ccf31515b02c7a15257530b00a1b16a46", + "sha256:04b1682d4b4199b7ddbc7367dad4e52c23e5e33def9bf47b30ba2a5a75d77337", + "sha256:074f9c6765f6753cf69f786325f7bbe7c943ae23e23af43db59c240376c21c41", + "sha256:08c96471e452bace59e4daedb6d51db047dac3737f359293e276ab466ea98fe2", + "sha256:0af350c466eac335d5984d6ea8f40bc186ec6ae34f11c2b2109bf63863b88846", + "sha256:0d175c13eb8b255b0bcb0044546bbc2cab8bd8af354ed222a9d4d38a60c3815d", + "sha256:0e0a1a1890d3e74a8b48b735ac3c52c26653e27edaa1fda1b9f533c9b0c57cff", + "sha256:0e448cbeb887e7ccd30551812ee9a32e2bf6d9e13fb97976426dd15d2c6fa9bf", + "sha256:0eee72469ea4befd0e87dab58c359417f42e80a1d1ca7c2ac4a27b89158c5075", + "sha256:118e6a141001a204536044e07ac3908bc4c8f3fe42caefae64281ff2de0860ac", + "sha256:1537270b7affb352d9c6ae5f303aaa513ac22df1b7795b317cfcec1cbc31c84e", + "sha256:156219090c0dff9e7256b069bb83a8ebebea32d5478a92ee9b9de40e22ee22d6", + "sha256:1d7c6ec44dd0a0f44c3beb128401af9233f155a45995d278e79722d561cd73a4", + "sha256:1eed1e1873427bd56f130320f8827ceb0f70600321fffe429e544ea9249ee865", + "sha256:2263d18b75d4320f5626490b9ea9181944b552f9e2e3a40bd4dbfe3705c700ff", + "sha256:2713476b262346ed8d9cb0afb6c1c2475417cdfc18c607e28d834da63731d072", + "sha256:27892c4d79629c8a1e9a989f9a9a22b8141b515fe2b120f55b1731933ff24e52", + "sha256:279b5961b094c6fb13548612298019297156cd718e999e666bf947fb47933435", + "sha256:29980aefd4778aa21d5a45a34cc4b9ca7f1635160f6938de2927c4a69d1aa735", + "sha256:29e4d422cd858a4e284336eeda167ddc3c669eea61a772efe4341b800478f89f", + "sha256:35c7b38458520301298b0cc6d979907bc59b71ba4a87fc5e487536ea65a2d517", + "sha256:3682dc975e6d42a77186f568f39f69ff6319e9d9117b03d2af116742c8289a57", + "sha256:37003232c34f0777e8c009a75a6a44bc9edf14065298d290acc75561cc8a7244", + "sha256:3cf1720799a5546462ff33bd81e25d88e1f4b220aa9935613b7460ab0c614d74", + "sha256:3de0c67c3de5ce9c35ac507f31bdde7e081a128ef13665a6534af065bdd40976", + "sha256:4017f07629338c9a86de6b6d8e5fa34b62ee8ea6efec77a283f3166c0db532e3", + "sha256:45ee055192d5e81751be864774f66a4113ff96e3b8565242ae957f734ffb2f36", + "sha256:4bb12cacf16952fa4b19618386fe132c9d8984dfa38e73a3a57043cf773b7663", + "sha256:4c055867471392fafe314ed2296fc009552c85af1405feba3381148cbcc38956", + "sha256:5001f0460f222bd32b08cc03d6692cae7e7b9669678fcd5b7f555a768c3360f6", + "sha256:52ad639c3e04e31be880ed0808616f15c1a14bd65e3ba812373207d287fe01ca", + "sha256:556b305f8d9bce5da8c99563521415b9e6e43d3bc4781a7f2da2a43e8735a30d", + "sha256:565cfe50e199689d3d34670b85e57394e33f399d1ab3167deb26d4f888d1865b", + "sha256:56f83ecde8656052669ccb32897fa15fbeb5427d6d550b5df1fd56b0a7e51908", + "sha256:576dc2cd85336735b9e33a9a226977b347c37fb92445d13a2c95790186eda147", + "sha256:586510eb7e6fc1c0d8cb0234fed2c0e4d19c873d39c6bca0f6c8899cc1355e6d", + "sha256:5c81df3b745e6a8ef758f027823525e880dfbe10e6e1d417146df447f29b8590", + "sha256:5c82b561c82f8883672d2f5eee55311759bdeef2143378d9e90b36558492c652", + "sha256:6104cf7ca8c6351546d28600a497bf1a205b833295af47d23aa32afad422d84c", + "sha256:618ec54a581fbf1580f3611c828ff01e16b57eadf69dc67f71494b2c36624568", + "sha256:63c0e51b6d24aa9a86a8258966a00554a7876b4c0f634fb60fbf28cccfee72a2", + "sha256:64c0b076acae5cd2cbffd38f4aa612c71e4a5fe9d828f4c740a1d6bf872a765f", + "sha256:67c30e47c489ca9102fa64f6fe0d6eb388b57ec68059a7fa8baaa06c5bb47e1b", + "sha256:68e45279615c561fe90dbffd7cc3406137b0a1dced328469f340e9a8fa9be522", + "sha256:6cf1fb74c6811ba940b284cab987fed61aeb13bdbe7e3700b0316795409fcb70", + "sha256:6ebfddd19dd046ee9f0e886120d8840177af24571f6c439747689759c0c51339", + "sha256:744664c6e23ee8643a309ff9f8c390a9a367c476380c82852bf05b1bf718f163", + "sha256:75d879d67457c079012f096dcbaa8d040ec43aa97210d6096bc3ff6be8eb1099", + "sha256:7656090018fb5629c504373b80116e30e54dc1be88df88f2a736a18370dd7a20", + "sha256:80157816dbbf89f372e9b971f0168a886b4520686b92a973f67051064663a4be", + "sha256:83334c95f7f5f1c39b5d4053f953500f85bcddeaa3ff85904079773d5504ca6a", + "sha256:8429531a674fc81843272b23e8b918651ca4082e54073266a19e7ac2a77fe203", + "sha256:848d71c5f6750513401a28e64ed1094706f83157f2203342f9355f00ffef5b85", + "sha256:857ded39921b556ec13d318d62aa0734c1ffbc415d5595366327fdb73b020404", + "sha256:8bdf93cff9d7283b809320f1ceff9f1bc9df2a8e912f6ba511614f648da91ede", + "sha256:8dbc83e5d1be9596c48446daa5f6039a3b7df13a3943f4519d6423bf3ccfedbf", + "sha256:8ec3c943a37d57ec836b23b0c2f28a389ecc7a2e690aaeda5b44debd04762972", + "sha256:91072f72f302ae307ee62b32ce1903cd9b5298e3e4ed08701be5714eaa1051c6", + "sha256:9888d7ce62ce2bbc252a88adf482a2ab561aada3ac50654f2ab730da60d4ef6d", + "sha256:988e53cbed460577ea2f692a30bbbb9d5963bd0e8bd26f7d20ea83b170320e65", + "sha256:9a1a175a0b8732c3e60dcb5595c3f6da66da8c70abb22bbaa67dbca82e91e435", + "sha256:9db78edb44d4ef978329df38f417dee8a20dd65ef67800b9013f81e21f9396cb", + "sha256:9e164eb332547143efdf6c0cdb013651edf0697e320dbc175a7358bfb253fb97", + "sha256:9fc6c3acce1c274f36d4653ef1e1055d24222d23791f37cdf82a533fe65bde7c", + "sha256:a416cfb018da01be25c3a7b730c25fbfc395c3df82c45798e87fa5ad4ad81d34", + "sha256:a43bbd5e68e9dac7f858aa592a12b606e34b16c478acf36ae3c24ff49c1ea24d", + "sha256:a4d41cb5b8c045fa233b32b1020937fe6443af0e269b355e8368a5ccad7356df", + "sha256:ab83c97bc8422a4ee68bbb350fcc41904d3c982dd8046fdb08fb046b40edfd35", + "sha256:ad51c81a29d2c67e8bd92684cb27a7cdc099d4414a769beadcfc999a9a87d9e2", + "sha256:adea2aecc6da81ebbc2048821bd23bdf1e09dc116d56cfef9018a8e7ddfed822", + "sha256:b4a2bb4ac2243504b002c95010fd78cc1709ca8be45ee9fd90b695d458fb59a1", + "sha256:b9881d8e11137270e8ff21e8ac300cd317cb3bf089ed81b6c59b44f5fbe5f7ca", + "sha256:c056b9cd280c11c261113fbad7e3cbfb734b06421fddc69a7bb922b604aa093d", + "sha256:c10e95f060e46d0946b2f883c4ae4ed9950475839e4c5763a366bd6f11246c66", + "sha256:c3576dac1c92bd09775bded18f496dacb6095973449891be3ada1836aa226bb4", + "sha256:c8122efcc01ce7e44591aeb19d67e9fb8c8e465fd5022ce9cd3c728230591b38", + "sha256:c8e5d8c65eefc931a340eb81b65d6e24e2ed2950801ae30e58ff4f368a7ecb88", + "sha256:cbb5c52ee5c481bd9a58bd87f36c497268afd6fca6e8704d05ab53b81074e504", + "sha256:cd64add5819480cc0a4cb59d4579df37bf95ebb7616eb0d70ceabf6e6599b4a4", + "sha256:cde2021162748e54fa5cbd5bf8536c9db0a425eec5d28750d2ec2369fdc38b93", + "sha256:d382e87ae4197d36e06f26f87a636aa27592f57473a1569cc64a38200f27ed7e", + "sha256:d4c1b8a9f3fa2d3ea63b28875c780d24f2652a9dd53a2fe76fb1454598bc10d8", + "sha256:d7382e6f3569ac84249c7fc590b2290b0438c7b4ee67f397b598c789faafda58", + "sha256:dbdf95ce396e5c23417d2c7716fd650b0408de302c1334dd535b1e2bed2e4857", + "sha256:e44f6a7a4ed46543d9d8f49674ed8b38f28f68561a39d01a5929222403985f0a", + "sha256:e7ddad0e0f1ca8aae5fc457ccde940481c2a0323ac04eed015b4a97891df0ca9", + "sha256:e8aa3bde1ea6a693c5f3d31b3296c253865708583250dd9d2a58af0b11176e70", + "sha256:e9c3da7831ae7221fe82938a6c1f8e87ec230e093dece3759110ae57a119ad91", + "sha256:ef787b45d545b403094e81b6b99ae4b8142ed219b23e2488cf062f97bc0e1416", + "sha256:f345cd2e0b1f26b7e13eadab78d53de9b9011c14b44a9a0c58a7d2466234efb0", + "sha256:f43c7048f64f8e2d1461226af8bafaafc243c571ca5c88baa56b89b2db7b314f", + "sha256:f93178ccf0d8325b66c755bd0273359d2a2a0dbb408af28cee05aa902b501869", + "sha256:fa1bf4d9838e4c8cdf309500a908fc412cdc325a63e5c74ad88a794bed16c943", + "sha256:fcdd2f6b1b1500bde96b442d777a563eadca1b825db0c42ac6aef45ad9ec3c4d" + ], + "markers": "python_version < '3.12' and (platform_python_implementation != 'CPython' or python_full_version > '3.7.10') and (platform_system == 'Darwin' or platform_system == 'Windows' or platform_system == 'Linux') and (platform_machine == 'x86_64' or platform_machine == 's390x' or platform_machine == 'armv7l' or platform_machine == 'ppc64le' or platform_machine == 'ppc64' or platform_machine == 'AMD64' or platform_machine == 'aarch64' or platform_machine == 'arm64' or platform_machine == 'ARM64' or platform_machine == 'x86' or platform_machine == 'i686') and (platform_python_implementation == 'CPython' or platform_python_implementation == 'PyPy')", + "version": "==1.5.1" }, "rdflib": { "hashes": [ @@ -1573,194 +1144,194 @@ }, "rpds-py": { "hashes": [ - "sha256:0047638c3aa0dbcd0ab99ed1e549bbf0e142c9ecc173b6492868432d8989a046", - "sha256:006f4342fe729a368c6df36578d7a348c7c716be1da0a1a0f86e3021f8e98724", - "sha256:041f00419e1da7a03c46042453598479f45be3d787eb837af382bfc169c0db33", - "sha256:04ecf5c1ff4d589987b4d9882872f80ba13da7d42427234fce8f22efb43133bc", - "sha256:04f2b712a2206e13800a8136b07aaedc23af3facab84918e7aa89e4be0260032", - "sha256:0aeb3329c1721c43c58cae274d7d2ca85c1690d89485d9c63a006cb79a85771a", - "sha256:0e374c0ce0ca82e5b67cd61fb964077d40ec177dd2c4eda67dba130de09085c7", - "sha256:0f00c16e089282ad68a3820fd0c831c35d3194b7cdc31d6e469511d9bffc535c", - "sha256:174e46569968ddbbeb8a806d9922f17cd2b524aa753b468f35b97ff9c19cb718", - "sha256:1b221c2457d92a1fb3c97bee9095c874144d196f47c038462ae6e4a14436f7bc", - "sha256:208b3a70a98cf3710e97cabdc308a51cd4f28aa6e7bb11de3d56cd8b74bab98d", - "sha256:20f2712bd1cc26a3cc16c5a1bfee9ed1abc33d4cdf1aabd297fe0eb724df4272", - "sha256:24795c099453e3721fda5d8ddd45f5dfcc8e5a547ce7b8e9da06fecc3832e26f", - "sha256:2a0f156e9509cee987283abd2296ec816225145a13ed0391df8f71bf1d789e2d", - "sha256:2b2356688e5d958c4d5cb964af865bea84db29971d3e563fb78e46e20fe1848b", - "sha256:2c13777ecdbbba2077670285dd1fe50828c8742f6a4119dbef6f83ea13ad10fb", - "sha256:2d3ee4615df36ab8eb16c2507b11e764dcc11fd350bbf4da16d09cda11fcedef", - "sha256:2d53747da70a4e4b17f559569d5f9506420966083a31c5fbd84e764461c4444b", - "sha256:32bab0a56eac685828e00cc2f5d1200c548f8bc11f2e44abf311d6b548ce2e45", - "sha256:34d90ad8c045df9a4259c47d2e16a3f21fdb396665c94520dbfe8766e62187a4", - "sha256:369d9c6d4c714e36d4a03957b4783217a3ccd1e222cdd67d464a3a479fc17796", - "sha256:3a55fc10fdcbf1a4bd3c018eea422c52cf08700cf99c28b5cb10fe97ab77a0d3", - "sha256:3d2d8e4508e15fc05b31285c4b00ddf2e0eb94259c2dc896771966a163122a0c", - "sha256:3fab5f4a2c64a8fb64fc13b3d139848817a64d467dd6ed60dcdd6b479e7febc9", - "sha256:43dba99f00f1d37b2a0265a259592d05fcc8e7c19d140fe51c6e6f16faabeb1f", - "sha256:44d51febb7a114293ffd56c6cf4736cb31cd68c0fddd6aa303ed09ea5a48e029", - "sha256:493fe54318bed7d124ce272fc36adbf59d46729659b2c792e87c3b95649cdee9", - "sha256:4b28e5122829181de1898c2c97f81c0b3246d49f585f22743a1246420bb8d399", - "sha256:4cd031e63bc5f05bdcda120646a0d32f6d729486d0067f09d79c8db5368f4586", - "sha256:528927e63a70b4d5f3f5ccc1fa988a35456eb5d15f804d276709c33fc2f19bda", - "sha256:564c96b6076a98215af52f55efa90d8419cc2ef45d99e314fddefe816bc24f91", - "sha256:5db385bacd0c43f24be92b60c857cf760b7f10d8234f4bd4be67b5b20a7c0b6b", - "sha256:5ef877fa3bbfb40b388a5ae1cb00636a624690dcb9a29a65267054c9ea86d88a", - "sha256:5f6e3cec44ba05ee5cbdebe92d052f69b63ae792e7d05f1020ac5e964394080c", - "sha256:5fc13b44de6419d1e7a7e592a4885b323fbc2f46e1f22151e3a8ed3b8b920405", - "sha256:60748789e028d2a46fc1c70750454f83c6bdd0d05db50f5ae83e2db500b34da5", - "sha256:60d9b630c8025b9458a9d114e3af579a2c54bd32df601c4581bd054e85258143", - "sha256:619ca56a5468f933d940e1bf431c6f4e13bef8e688698b067ae68eb4f9b30e3a", - "sha256:630d3d8ea77eabd6cbcd2ea712e1c5cecb5b558d39547ac988351195db433f6c", - "sha256:63981feca3f110ed132fd217bf7768ee8ed738a55549883628ee3da75bb9cb78", - "sha256:66420986c9afff67ef0c5d1e4cdc2d0e5262f53ad11e4f90e5e22448df485bf0", - "sha256:675269d407a257b8c00a6b58205b72eec8231656506c56fd429d924ca00bb350", - "sha256:6a4a535013aeeef13c5532f802708cecae8d66c282babb5cd916379b72110cf7", - "sha256:6a727fd083009bc83eb83d6950f0c32b3c94c8b80a9b667c87f4bd1274ca30ba", - "sha256:6e1daf5bf6c2be39654beae83ee6b9a12347cb5aced9a29eecf12a2d25fff664", - "sha256:6eea559077d29486c68218178ea946263b87f1c41ae7f996b1f30a983c476a5a", - "sha256:75a810b7664c17f24bf2ffd7f92416c00ec84b49bb68e6a0d93e542406336b56", - "sha256:772cc1b2cd963e7e17e6cc55fe0371fb9c704d63e44cacec7b9b7f523b78919e", - "sha256:78884d155fd15d9f64f5d6124b486f3d3f7fd7cd71a78e9670a0f6f6ca06fb2d", - "sha256:79e8d804c2ccd618417e96720ad5cd076a86fa3f8cb310ea386a3e6229bae7d1", - "sha256:7e80d375134ddb04231a53800503752093dbb65dad8dabacce2c84cccc78e964", - "sha256:8097b3422d020ff1c44effc40ae58e67d93e60d540a65649d2cdaf9466030791", - "sha256:8205ee14463248d3349131bb8099efe15cd3ce83b8ef3ace63c7e976998e7124", - "sha256:8212ff58ac6dfde49946bea57474a386cca3f7706fc72c25b772b9ca4af6b79e", - "sha256:823e74ab6fbaa028ec89615ff6acb409e90ff45580c45920d4dfdddb069f2120", - "sha256:84e0566f15cf4d769dade9b366b7b87c959be472c92dffb70462dd0844d7cbad", - "sha256:896c41007931217a343eff197c34513c154267636c8056fb409eafd494c3dcdc", - "sha256:8aa362811ccdc1f8dadcc916c6d47e554169ab79559319ae9fae7d7752d0d60c", - "sha256:8b3b397eefecec8e8e39fa65c630ef70a24b09141a6f9fc17b3c3a50bed6b50e", - "sha256:8ebc7e65ca4b111d928b669713865f021b7773350eeac4a31d3e70144297baba", - "sha256:9168764133fd919f8dcca2ead66de0105f4ef5659cbb4fa044f7014bed9a1797", - "sha256:921ae54f9ecba3b6325df425cf72c074cd469dea843fb5743a26ca7fb2ccb149", - "sha256:92558d37d872e808944c3c96d0423b8604879a3d1c86fdad508d7ed91ea547d5", - "sha256:951cc481c0c395c4a08639a469d53b7d4afa252529a085418b82a6b43c45c240", - "sha256:998c01b8e71cf051c28f5d6f1187abbdf5cf45fc0efce5da6c06447cba997034", - "sha256:9abc80fe8c1f87218db116016de575a7998ab1629078c90840e8d11ab423ee25", - "sha256:9be4f99bee42ac107870c61dfdb294d912bf81c3c6d45538aad7aecab468b6b7", - "sha256:9c39438c55983d48f4bb3487734d040e22dad200dab22c41e331cee145e7a50d", - "sha256:9d7e8ce990ae17dda686f7e82fd41a055c668e13ddcf058e7fb5e9da20b57793", - "sha256:9ea7f4174d2e4194289cb0c4e172d83e79a6404297ff95f2875cf9ac9bced8ba", - "sha256:a18fc371e900a21d7392517c6f60fe859e802547309e94313cd8181ad9db004d", - "sha256:a36b452abbf29f68527cf52e181fced56685731c86b52e852053e38d8b60bc8d", - "sha256:a5b66d1b201cc71bc3081bc2f1fc36b0c1f268b773e03bbc39066651b9e18391", - "sha256:a824d2c7a703ba6daaca848f9c3d5cb93af0505be505de70e7e66829affd676e", - "sha256:a88c0d17d039333a41d9bf4616bd062f0bd7aa0edeb6cafe00a2fc2a804e944f", - "sha256:aa6800adc8204ce898c8a424303969b7aa6a5e4ad2789c13f8648739830323b7", - "sha256:aad911555286884be1e427ef0dc0ba3929e6821cbeca2194b13dc415a462c7fd", - "sha256:afc6e35f344490faa8276b5f2f7cbf71f88bc2cda4328e00553bd451728c571f", - "sha256:b9a4df06c35465ef4d81799999bba810c68d29972bf1c31db61bfdb81dd9d5bb", - "sha256:bb2954155bb8f63bb19d56d80e5e5320b61d71084617ed89efedb861a684baea", - "sha256:bbc4362e06f950c62cad3d4abf1191021b2ffaf0b31ac230fbf0526453eee75e", - "sha256:c0145295ca415668420ad142ee42189f78d27af806fcf1f32a18e51d47dd2052", - "sha256:c30ff468163a48535ee7e9bf21bd14c7a81147c0e58a36c1078289a8ca7af0bd", - "sha256:c347a20d79cedc0a7bd51c4d4b7dbc613ca4e65a756b5c3e57ec84bd43505b47", - "sha256:c43583ea8517ed2e780a345dd9960896afc1327e8cf3ac8239c167530397440d", - "sha256:c61a2cb0085c8783906b2f8b1f16a7e65777823c7f4d0a6aaffe26dc0d358dd9", - "sha256:c9ca89938dff18828a328af41ffdf3902405a19f4131c88e22e776a8e228c5a8", - "sha256:cc31e13ce212e14a539d430428cd365e74f8b2d534f8bc22dd4c9c55b277b875", - "sha256:cdabcd3beb2a6dca7027007473d8ef1c3b053347c76f685f5f060a00327b8b65", - "sha256:cf86f72d705fc2ef776bb7dd9e5fbba79d7e1f3e258bf9377f8204ad0fc1c51e", - "sha256:d09dc82af2d3c17e7dd17120b202a79b578d79f2b5424bda209d9966efeed114", - "sha256:d3aa13bdf38630da298f2e0d77aca967b200b8cc1473ea05248f6c5e9c9bdb44", - "sha256:d69d003296df4840bd445a5d15fa5b6ff6ac40496f956a221c4d1f6f7b4bc4d9", - "sha256:d6e109a454412ab82979c5b1b3aee0604eca4bbf9a02693bb9df027af2bfa91a", - "sha256:d8551e733626afec514b5d15befabea0dd70a343a9f23322860c4f16a9430205", - "sha256:d8754d872a5dfc3c5bf9c0e059e8107451364a30d9fd50f1f1a85c4fb9481164", - "sha256:d8f9a6e7fd5434817526815f09ea27f2746c4a51ee11bb3439065f5fc754db58", - "sha256:dbcbb6db5582ea33ce46a5d20a5793134b5365110d84df4e30b9d37c6fd40ad3", - "sha256:e0f3ef95795efcd3b2ec3fe0a5bcfb5dadf5e3996ea2117427e524d4fbf309c6", - "sha256:e13ae74a8a3a0c2f22f450f773e35f893484fcfacb00bb4344a7e0f4f48e1f97", - "sha256:e274f62cbd274359eff63e5c7e7274c913e8e09620f6a57aae66744b3df046d6", - "sha256:e838bf2bb0b91ee67bf2b889a1a841e5ecac06dd7a2b1ef4e6151e2ce155c7ae", - "sha256:e8acd55bd5b071156bae57b555f5d33697998752673b9de554dd82f5b5352727", - "sha256:e8e5ab32cf9eb3647450bc74eb201b27c185d3857276162c101c0f8c6374e098", - "sha256:ebcb786b9ff30b994d5969213a8430cbb984cdd7ea9fd6df06663194bd3c450c", - "sha256:ebea2821cdb5f9fef44933617be76185b80150632736f3d76e54829ab4a3b4d1", - "sha256:ed0ef550042a8dbcd657dfb284a8ee00f0ba269d3f2286b0493b15a5694f9fe8", - "sha256:eda5c1e2a715a4cbbca2d6d304988460942551e4e5e3b7457b50943cd741626d", - "sha256:f5c0ed12926dec1dfe7d645333ea59cf93f4d07750986a586f511c0bc61fe103", - "sha256:f6016bd950be4dcd047b7475fdf55fb1e1f59fc7403f387be0e8123e4a576d30", - "sha256:f9e0057a509e096e47c87f753136c9b10d7a91842d8042c2ee6866899a717c0d", - "sha256:fc1c892b1ec1f8cbd5da8de287577b455e388d9c328ad592eabbdcb6fc93bee5", - "sha256:fc2c1e1b00f88317d9de6b2c2b39b012ebbfe35fe5e7bef980fd2a91f6100a07", - "sha256:fd822f019ccccd75c832deb7aa040bb02d70a92eb15a2f16c7987b7ad4ee8d83" + "sha256:098d446d76d26e394b440d73921b49c1c90274d46ccbaadf346b1b78f9fdd4b1", + "sha256:0d63a86b457069d669c423f093db4900aa102f0e5a626973eff4db8355c0fd96", + "sha256:0dcdee07ebf76223092666c72a9552db276fbe46b98830ecd1bb836cc98adc81", + "sha256:0ee0cc81f875e853ccdf3badb44b67f771fb9149baa9e752777ccdcaf052ad26", + "sha256:113d134dc5a8d2503630ca2707b58a1bf5b1b3c69b35c7dab8690ee650c111b8", + "sha256:12a84c3851f9e68633d883c01347db3cb87e6160120a489f9c47162cd276b0a5", + "sha256:12b42790c91e0041a98f0ec04244fb334696938793e785a5d4c7e56ca534d7da", + "sha256:16fb28d3a653f67c871a47c5ca0be17bce9fab8adb8bcf7bd09f3771b8c4d860", + "sha256:1e11065b759c38c4945f8c9765ed2910e31fa5b2f7733401eb7d966f468367a2", + "sha256:20af08b0b2d5b196a2bcb70becf0b97ec5af579cee0ae6750b08a2eea3b6c77d", + "sha256:240251fd95b057c26f8538d0e673bf983eba4f38da95fbaf502bfc1a768b3984", + "sha256:2649ff19291928243f90c86e4dc9cd86c8c4c6a73c3693ba2e23bc2fbcd8338c", + "sha256:28bd2969445acc2d6801a22f97a43134ae3cb18e7495d668bfaa8d82b8526cdc", + "sha256:2bd08c82336412a39a598e5baccab2ee2d7bd54e9115c8b64f2febb45da5c368", + "sha256:2f91902fc0c95dd1fa6b30ebd2af83ace91e592f7fd6340a375588a9d4b9341b", + "sha256:35c8cb5dcf7d36d3adf2ae0730b60fb550a8feb6e432bee7ef84162a0d15714b", + "sha256:36a7564deaac3f372e8b8b701eb982ea3113516e8e08cd87e3dc6ccf29bad14b", + "sha256:3752a015db89ea3e9c04d5e185549be4aa29c1882150e094c614c0de8e788feb", + "sha256:383cf0d4288baf5a16812ed70d54ecb7f2064e255eb7fe42c38e926adeae4534", + "sha256:3a21f4584f69547ae03aaa21be98753e85599f3437b84039da5dc20b53abe987", + "sha256:3d7d65aa934899849628137ab391562cdb487c6ffb9b9781319a64a9c66afbce", + "sha256:469054e6b2f8e41f1fe62b95f617082019d343eddeec3219ff3909067e672fb9", + "sha256:4acbe2349a3baac9cc212005b6cb4bbb7e5b34538886cde4f55dfc29173da1d6", + "sha256:4ad37c29adc435e6d8b24be86b03596183ee8d4bb8580cc4c676879b0b896a99", + "sha256:4d97661bf5848dd9e5eb7ded480deccf9d32ce2cd500b88a26acbf7bd2864985", + "sha256:4e5fe366fa53bd6777cf5440245366705338587b2cf8d61348ddaad744eb591a", + "sha256:4fbec54cc42fa90ca69158d75f125febc4116b2d934e71c78f97de1388a8feb2", + "sha256:540cd89d256119845b7f8f56c4bb80cad280cab92d9ca473be49ea13e678fd44", + "sha256:542a6f1d0f400b9ce1facb3e30dd3dc84e4affc60353509b00a7bdcd064be91e", + "sha256:54f925ff8d4443b7cae23a5215954abbf4736a3404188bde53c4d744ac001d89", + "sha256:551897221bbc9de17bce4574810347db8ec1ba4ec2f50f35421790d34bdb6ef9", + "sha256:57e9616a2a9da08fe0994e37a0c6f578fbaf6d35911bcba31e99660542d60c45", + "sha256:587cad3959d3d85127cf5df1624cdce569bb3796372e00420baad46af7c56b9b", + "sha256:58cfaa54752d6d2b4f10e87571688dbb7792327a69eca5417373d77d42787058", + "sha256:5afbff2822016db3c696cb0c1432e6b1f0e34aa9280bc5184dc216812a24e70d", + "sha256:5b049dd0792d51f07193cd934acec89abe84d2607109e6ca223b2f0ff24f0c7d", + "sha256:5bbfbd9c74c4dd74815bd532bf29bedea6d27d38f35ef46f9754172a14e4c655", + "sha256:5e849315963eb08c26167d0f2c0f9319c9bd379daea75092b3c595d70be6209d", + "sha256:6065a489b7b284efb29d57adffae2b9b5e9403d3c8d95cfa04e04e024e6b4e77", + "sha256:637ec39f97e342a3f76af739eda96800549d92f3aa27a2170b6dcbdffd49f480", + "sha256:653a066d2a4a332d4f8a11813e8124b643fa7b835b78468087a9898140469eee", + "sha256:6587ece9f205097c62d0e3d3cb7c06991eb0083ab6a9cf48951ec49c2ab7183c", + "sha256:66087711faf29cb3ac8ab05341939aec29968626aff8ef18e483e229055dd9a7", + "sha256:66568caacf18542f0cf213db7adf3de2da6ad58c7bf2c4fafec0d81ae557443b", + "sha256:673ba018df5ae5e7b6c9a021d51ffe39c0ae1daa0041611ed27a0bca634b2d2e", + "sha256:6a1eda14db1ac7a2ab4536dfe69e4d37fdd765e8e784ae4451e61582ebb76012", + "sha256:6b0c0f671a53c129ea48f9481e95532579cc489ab5a0ffe750c9020787181c48", + "sha256:6b5f457afffb45d3804728a54083e31fbaf460e902e3f7d063e56d0d0814301e", + "sha256:6bcca4d0d24d8c37bfe0cafdaaf4346b6c516db21ccaad5c7fba0a0df818dfc9", + "sha256:6c27156c8d836e7ff760767e93245b286ae028bfd81d305db676662d1f642637", + "sha256:6c72a4a8fab10bc96720ad40941bb471e3b1150fb8d62dab205d495511206cf1", + "sha256:6d95521901896a90a858993bfa3ec0f9160d3d97e8c8fefc279b3306cdadfee0", + "sha256:7715597186a7277be12729c896019226321bad1f047da381ab707b177aa5017c", + "sha256:77814c7a4e1dc43fba73aeb4c1ef0fe37d901f3aa869a4823de5ea843a283fd0", + "sha256:77910d6bec321c9fccfe9cf5e407fed9d2c48a5e510473b4f070d5cf2413c003", + "sha256:7c18cb2f6805861dcdf11fb0b3c111a0335f6475411687db2f6636f32bed66b0", + "sha256:7d34547810bfd61acf8a441e8a3651e7a919e8e8aed29850be14a1b05cfc6f41", + "sha256:8029c19c8a32ef3093c417dd16a5f806e7f529fcceea7c627b2635e9da5104da", + "sha256:805a0dff0674baa3f360c21dcbc622ae544f2bb4753d87a4a56a1881252a477e", + "sha256:80b37b37525492250adc7cbca20ae7084f86eb3eb62414b624d2a400370853b1", + "sha256:8155e21203161e5c78791fc049b99f0bbbf14d1d1839c8c93c8344957f9e8e1e", + "sha256:837fd066f974e5b98c69ac83ec594b79a2724a39a92a157b8651615e5032e530", + "sha256:83e103b48e63fd2b8a8e2b21ab5b5299a7146045626c2ed4011511ea8122d217", + "sha256:85587479f210350e9d9d25e505f422dd636e561658382ee8947357a4bac491ad", + "sha256:864573b6440b770db5a8693547a8728d7fd32580d4903010a8eee0bb5b03b130", + "sha256:87c6ff87b38f46d712418d78b34db1198408a3d9a42eddc640644aea561216b1", + "sha256:89260601d497fa5957c3e46f10b16cfa2a4808ad4dd46cddc0b997461923a7d9", + "sha256:89bb2b20829270aca28b1e5481be8ee24cb9aa86e6c0c81cb4ada2112c9588c5", + "sha256:8abc1a3e29b599bf8bb5ad455256a757e8b0ed5621e7e48abe8209932dc6d11e", + "sha256:8c2ad59c4342a176cb3e0d5753e1c911eabc95c210fc6d0e913c32bf560bf012", + "sha256:8f3a57f08c558d0983a708bfe6d1265f47b5debff9b366b2f2091690fada055c", + "sha256:90dbd2c42cb6463c07020695800ae8f347e7dbeff09da2975a988e467b624539", + "sha256:91a51499be506022b9f09facfc42f0c3a1c45969c0fc8f0bbebc8ff23ab9e531", + "sha256:9442cbff21122e9a529b942811007d65eabe4182e7342d102caf119b229322c6", + "sha256:94f89161a3e358db33310a8a064852a6eb119ed1aa1a3dba927b4e5140e65d00", + "sha256:96742796f499ac23b59856db734e65b286d1214a0d9b57bcd7bece92d9201fa4", + "sha256:98c729193e7abe498565266933c125780fb646e977e94289cadbb36e4eeeb370", + "sha256:9b75b5d3416b00d064a5e6f4814fdfb18a964a7cf38dc00b5c2c02fa30a7dd0b", + "sha256:9cad834f1a8f51eb037c3c4dc72c884c9e1e0644d900e2d45aa76450e4aa6282", + "sha256:9d0041bd9e2d2ef803b32d84a0c8115d178132da5691346465953a2a966ba8ca", + "sha256:9f9a1b15b875160186177f659cde2b0f899182b0aca49457d6396afc4bbda7b9", + "sha256:a05b199c11d2f39c72de8c30668734b5d20974ad44b65324ea3e647a211f135d", + "sha256:a413674eb2bd2ecb2b93fcc928871b19f7220ee04bca4af3375c50a2b32b5a50", + "sha256:a54b94b0e4de95aa92618906fb631779d9fde29b4bf659f482c354a3a79fd025", + "sha256:a60ba9d104f4e8496107b1cb86e45a68a16d13511dc3986e0780e9f85c2136f9", + "sha256:ad4a896896346adab86d52b31163c39d49e4e94c829494b96cc064bff82c5851", + "sha256:af1c2241919304cc2f90e7dcb3eb1c1df6fb4172dd338e629dd6410e48b3d1a0", + "sha256:b0a5651e350997cebcdc23016dca26c4d1993d29015a535284da3159796e30b6", + "sha256:b7d60d42f1b9571341ad2322e748f7a60f9847546cd801a3a0eb72a1b54c6519", + "sha256:bb979162323f3534dce84b59f86e689a0761a2a300e0212bfaedfa80d4eb8100", + "sha256:bc907ea12216cfc5560148fc42459d86740fc739981c6feb94230dab09362679", + "sha256:c146a24a8f0dc4a7846fb4640b88b3a68986585b8ce8397af15e66b7c5817439", + "sha256:c46bd76986e05689376d28fdc2b97d899576ce3e3aaa5a5f80f67a8300b26eb3", + "sha256:c624c82e645f6b5465d08cdc802fb0cd53aa1478782fb2992b9e09f2c9426865", + "sha256:cd36b71f9f3bf195b2dd9be5eafbfc9409e6c8007aebc38a4dc051f522008033", + "sha256:ce0518667855a1598d9b1f4fcf0fed1182c67c5ba4fe6a2c6bce93440a65cead", + "sha256:d21408eaa157063f56e58ca50da27cad67c4395a85fb44cc7a31253ea4e58918", + "sha256:d33aef3914a5b49db12ed3f24d214ffa50caefc8f4b0c7c7b9485bd4b231a898", + "sha256:d3dc8d6ce8f001c80919bdb49d8b0b815185933a0b8e9cdeaea42b0b6f27eeb0", + "sha256:d58258a66255b2500ddaa4f33191ada5ec983a429c09eb151daf81efbb9aa115", + "sha256:d8b41195a6b03280ab00749a438fbce761e7acfd5381051a570239d752376f27", + "sha256:ddf9426b740a7047b2b0dddcba775211542e8053ce1e509a1759b665fe573508", + "sha256:de34a7d1893be76cb015929690dce3bde29f4de08143da2e9ad1cedb11dbf80e", + "sha256:e3d50ac3b772c10e0b918a5ce2e871138896bfb5f35050ff1ff87ddca45961fc", + "sha256:e49e4c3e899c32884d7828c91d6c3aff08d2f18857f50f86cc91187c31a4ca58", + "sha256:eb91471640390a82744b164f8a0be4d7c89d173b1170713f9639c6bad61e9e64", + "sha256:f2e69415e4e33cdeee50ebc2c4d8fcbef12c3181d9274e512ccd2a905a76aad1", + "sha256:f3353a2d7eb7d5e0af8a7ca9fc85a34ba12619119bcdee6b8a28a6373cda65ce", + "sha256:f933b35fa563f047896a70b69414dfb3952831817e4c4b3a6faa96737627f363", + "sha256:fccd24c080850715c58a80200d367bc62b4bff6c9fb84e9564da1ebcafea6418", + "sha256:fd9167e9604cb5a218a2e847aa8cdc5f98b379a673371978ee7b0c11b4d2e140", + "sha256:fdc648d4e81eef5ac4bb35d731562dffc28358948410f3274d123320e125d613", + "sha256:fe7439d9c5b402af2c9911c7facda1808d0c8dbfa9cf085e6aeac511a23f7d87", + "sha256:ffae52cd76837a5c16409359d236b1fced79e42e0792e8adf375095a5e855368" ], "markers": "python_version >= '3.9'", - "version": "==0.24.0" + "version": "==0.25.0" }, "six": { "hashes": [ "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274", "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81" ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2'", + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", "version": "==1.17.0" }, "sqlalchemy": { "hashes": [ - "sha256:00a494ea6f42a44c326477b5bee4e0fc75f6a80c01570a32b57e89cf0fbef85a", - "sha256:0bb933a650323e476a2e4fbef8997a10d0003d4da996aad3fd7873e962fdde4d", - "sha256:110179728e442dae85dd39591beb74072ae4ad55a44eda2acc6ec98ead80d5f2", - "sha256:15d08d5ef1b779af6a0909b97be6c1fd4298057504eb6461be88bd1696cb438e", - "sha256:16d325ea898f74b26ffcd1cf8c593b0beed8714f0317df2bed0d8d1de05a8f26", - "sha256:1abb387710283fc5983d8a1209d9696a4eae9db8d7ac94b402981fe2fe2e39ad", - "sha256:1ffdf9c91428e59744f8e6f98190516f8e1d05eec90e936eb08b257332c5e870", - "sha256:2be94d75ee06548d2fc591a3513422b873490efb124048f50556369a834853b0", - "sha256:2cbafc8d39ff1abdfdda96435f38fab141892dc759a2165947d1a8fffa7ef596", - "sha256:2ee5f9999a5b0e9689bed96e60ee53c3384f1a05c2dd8068cc2e8361b0df5b7a", - "sha256:32587e2e1e359276957e6fe5dad089758bc042a971a8a09ae8ecf7a8fe23d07a", - "sha256:35904d63412db21088739510216e9349e335f142ce4a04b69e2528020ee19ed4", - "sha256:37a5c21ab099a83d669ebb251fddf8f5cee4d75ea40a5a1653d9c43d60e20867", - "sha256:37f7a0f506cf78c80450ed1e816978643d3969f99c4ac6b01104a6fe95c5490a", - "sha256:46628ebcec4f23a1584fb52f2abe12ddb00f3bb3b7b337618b80fc1b51177aff", - "sha256:4a4c5a2905a9ccdc67a8963e24abd2f7afcd4348829412483695c59e0af9a705", - "sha256:4aeb939bcac234b88e2d25d5381655e8353fe06b4e50b1c55ecffe56951d18c2", - "sha256:50f5885bbed261fc97e2e66c5156244f9704083a674b8d17f24c72217d29baf5", - "sha256:519624685a51525ddaa7d8ba8265a1540442a2ec71476f0e75241eb8263d6f51", - "sha256:5434223b795be5c5ef8244e5ac98056e290d3a99bdcc539b916e282b160dda00", - "sha256:55028d7a3ebdf7ace492fab9895cbc5270153f75442a0472d8516e03159ab364", - "sha256:5654d1ac34e922b6c5711631f2da497d3a7bffd6f9f87ac23b35feea56098011", - "sha256:574aea2c54d8f1dd1699449f332c7d9b71c339e04ae50163a3eb5ce4c4325ee4", - "sha256:5cfa124eda500ba4b0d3afc3e91ea27ed4754e727c7f025f293a22f512bcd4c9", - "sha256:5ea9181284754d37db15156eb7be09c86e16e50fbe77610e9e7bee09291771a1", - "sha256:641ee2e0834812d657862f3a7de95e0048bdcb6c55496f39c6fa3d435f6ac6ad", - "sha256:650490653b110905c10adac69408380688cefc1f536a137d0d69aca1069dc1d1", - "sha256:6959738971b4745eea16f818a2cd086fb35081383b078272c35ece2b07012716", - "sha256:6cfedff6878b0e0d1d0a50666a817ecd85051d12d56b43d9d425455e608b5ba0", - "sha256:7e0505719939e52a7b0c65d20e84a6044eb3712bb6f239c6b1db77ba8e173a37", - "sha256:8b6b28d303b9d57c17a5164eb1fd2d5119bb6ff4413d5894e74873280483eeb5", - "sha256:8bb131ffd2165fae48162c7bbd0d97c84ab961deea9b8bab16366543deeab625", - "sha256:915866fd50dd868fdcc18d61d8258db1bf9ed7fbd6dfec960ba43365952f3b01", - "sha256:9408fd453d5f8990405cc9def9af46bfbe3183e6110401b407c2d073c3388f47", - "sha256:957f8d85d5e834397ef78a6109550aeb0d27a53b5032f7a57f2451e1adc37e98", - "sha256:9c7a80ed86d6aaacb8160a1caef6680d4ddd03c944d985aecee940d168c411d1", - "sha256:9d3b31d0a1c44b74d3ae27a3de422dfccd2b8f0b75e51ecb2faa2bf65ab1ba0d", - "sha256:a669cbe5be3c63f75bcbee0b266779706f1a54bcb1000f302685b87d1b8c1500", - "sha256:a8aae085ea549a1eddbc9298b113cffb75e514eadbb542133dd2b99b5fb3b6af", - "sha256:ae9597cab738e7cc823f04a704fb754a9249f0b6695a6aeb63b74055cd417a96", - "sha256:afe63b208153f3a7a2d1a5b9df452b0673082588933e54e7c8aac457cf35e758", - "sha256:b5a5bbe29c10c5bfd63893747a1bf6f8049df607638c786252cb9243b86b6706", - "sha256:baf7cee56bd552385c1ee39af360772fbfc2f43be005c78d1140204ad6148438", - "sha256:bb19e30fdae77d357ce92192a3504579abe48a66877f476880238a962e5b96db", - "sha256:bece9527f5a98466d67fb5d34dc560c4da964240d8b09024bb21c1246545e04e", - "sha256:c0cae71e20e3c02c52f6b9e9722bca70e4a90a466d59477822739dc31ac18b4b", - "sha256:c268b5100cfeaa222c40f55e169d484efa1384b44bf9ca415eae6d556f02cb08", - "sha256:c7b927155112ac858357ccf9d255dd8c044fd9ad2dc6ce4c4149527c901fa4c3", - "sha256:c884de19528e0fcd9dc34ee94c810581dd6e74aef75437ff17e696c2bfefae3e", - "sha256:cd2f75598ae70bcfca9117d9e51a3b06fe29edd972fdd7fd57cc97b4dbf3b08a", - "sha256:cf0e99cdb600eabcd1d65cdba0d3c91418fee21c4aa1d28db47d095b1064a7d8", - "sha256:d827099289c64589418ebbcaead0145cd19f4e3e8a93919a0100247af245fa00", - "sha256:e8040680eaacdce4d635f12c55c714f3d4c7f57da2bc47a01229d115bd319191", - "sha256:f0fda83e113bb0fb27dc003685f32a5dcb99c9c4f41f4fa0838ac35265c23b5c", - "sha256:f1ea21bef99c703f44444ad29c2c1b6bd55d202750b6de8e06a955380f4725d7", - "sha256:f6bacab7514de6146a1976bc56e1545bee247242fab030b89e5f70336fc0003e", - "sha256:fe147fcd85aaed53ce90645c91ed5fca0cc88a797314c70dfd9d35925bd5d106" + "sha256:023b3ee6169969beea3bb72312e44d8b7c27c75b347942d943cf49397b7edeb5", + "sha256:03968a349db483936c249f4d9cd14ff2c296adfa1290b660ba6516f973139582", + "sha256:05132c906066142103b83d9c250b60508af556982a385d96c4eaa9fb9720ac2b", + "sha256:087b6b52de812741c27231b5a3586384d60c353fbd0e2f81405a814b5591dc8b", + "sha256:0b3dbf1e7e9bc95f4bac5e2fb6d3fb2f083254c3fdd20a1789af965caf2d2348", + "sha256:118c16cd3f1b00c76d69343e38602006c9cfb9998fa4f798606d28d63f23beda", + "sha256:1936af879e3db023601196a1684d28e12f19ccf93af01bf3280a3262c4b6b4e5", + "sha256:1e3f196a0c59b0cae9a0cd332eb1a4bda4696e863f4f1cf84ab0347992c548c2", + "sha256:23a8825495d8b195c4aa9ff1c430c28f2c821e8c5e2d98089228af887e5d7e29", + "sha256:293cd444d82b18da48c9f71cd7005844dbbd06ca19be1ccf6779154439eec0b8", + "sha256:32f9dc8c44acdee06c8fc6440db9eae8b4af8b01e4b1aee7bdd7241c22edff4f", + "sha256:34ea30ab3ec98355235972dadc497bb659cc75f8292b760394824fab9cf39826", + "sha256:3d3549fc3e40667ec7199033a4e40a2f669898a00a7b18a931d3efb4c7900504", + "sha256:41836fe661cc98abfae476e14ba1906220f92c4e528771a8a3ae6a151242d2ae", + "sha256:4d44522480e0bf34c3d63167b8cfa7289c1c54264c2950cc5fc26e7850967e45", + "sha256:4eeb195cdedaf17aab6b247894ff2734dcead6c08f748e617bfe05bd5a218443", + "sha256:4f67766965996e63bb46cfbf2ce5355fc32d9dd3b8ad7e536a920ff9ee422e23", + "sha256:57df5dc6fdb5ed1a88a1ed2195fd31927e705cad62dedd86b46972752a80f576", + "sha256:598d9ebc1e796431bbd068e41e4de4dc34312b7aa3292571bb3674a0cb415dd1", + "sha256:5b14e97886199c1f52c14629c11d90c11fbb09e9334fa7bb5f6d068d9ced0ce0", + "sha256:5e22575d169529ac3e0a120cf050ec9daa94b6a9597993d1702884f6954a7d71", + "sha256:60c578c45c949f909a4026b7807044e7e564adf793537fc762b2489d522f3d11", + "sha256:6145afea51ff0af7f2564a05fa95eb46f542919e6523729663a5d285ecb3cf5e", + "sha256:6375cd674fe82d7aa9816d1cb96ec592bac1726c11e0cafbf40eeee9a4516b5f", + "sha256:6854175807af57bdb6425e47adbce7d20a4d79bbfd6f6d6519cd10bb7109a7f8", + "sha256:6ab60a5089a8f02009f127806f777fca82581c49e127f08413a66056bd9166dd", + "sha256:725875a63abf7c399d4548e686debb65cdc2549e1825437096a0af1f7e374814", + "sha256:7492967c3386df69f80cf67efd665c0f667cee67032090fe01d7d74b0e19bb08", + "sha256:81965cc20848ab06583506ef54e37cf15c83c7e619df2ad16807c03100745dea", + "sha256:81c24e0c0fde47a9723c81d5806569cddef103aebbf79dbc9fcbb617153dea30", + "sha256:81eedafa609917040d39aa9332e25881a8e7a0862495fcdf2023a9667209deda", + "sha256:81f413674d85cfd0dfcd6512e10e0f33c19c21860342a4890c3a2b59479929f9", + "sha256:8280856dd7c6a68ab3a164b4a4b1c51f7691f6d04af4d4ca23d6ecf2261b7923", + "sha256:82ca366a844eb551daff9d2e6e7a9e5e76d2612c8564f58db6c19a726869c1df", + "sha256:8b4af17bda11e907c51d10686eda89049f9ce5669b08fbe71a29747f1e876036", + "sha256:90144d3b0c8b139408da50196c5cad2a6909b51b23df1f0538411cd23ffa45d3", + "sha256:906e6b0d7d452e9a98e5ab8507c0da791856b2380fdee61b765632bb8698026f", + "sha256:90c11ceb9a1f482c752a71f203a81858625d8df5746d787a4786bca4ffdf71c6", + "sha256:911cc493ebd60de5f285bcae0491a60b4f2a9f0f5c270edd1c4dbaef7a38fc04", + "sha256:9a420a91913092d1e20c86a2f5f1fc85c1a8924dbcaf5e0586df8aceb09c9cc2", + "sha256:9f8c9fdd15a55d9465e590a402f42082705d66b05afc3ffd2d2eb3c6ba919560", + "sha256:a104c5694dfd2d864a6f91b0956eb5d5883234119cb40010115fd45a16da5e70", + "sha256:a373a400f3e9bac95ba2a06372c4fd1412a7cee53c37fc6c05f829bf672b8769", + "sha256:a62448526dd9ed3e3beedc93df9bb6b55a436ed1474db31a2af13b313a70a7e1", + "sha256:a8808d5cf866c781150d36a3c8eb3adccfa41a8105d031bf27e92c251e3969d6", + "sha256:b1f09b6821406ea1f94053f346f28f8215e293344209129a9c0fcc3578598d7b", + "sha256:b2ac41acfc8d965fb0c464eb8f44995770239668956dc4cdf502d1b1ffe0d747", + "sha256:b46fa6eae1cd1c20e6e6f44e19984d438b6b2d8616d21d783d150df714f44078", + "sha256:b50eab9994d64f4a823ff99a0ed28a6903224ddbe7fef56a6dd865eec9243440", + "sha256:bfc9064f6658a3d1cadeaa0ba07570b83ce6801a1314985bf98ec9b95d74e15f", + "sha256:c0b0e5e1b5d9f3586601048dd68f392dc0cc99a59bb5faf18aab057ce00d00b2", + "sha256:c153265408d18de4cc5ded1941dcd8315894572cddd3c58df5d5b5705b3fa28d", + "sha256:d4ae769b9c1c7757e4ccce94b0641bc203bbdf43ba7a2413ab2523d8d047d8dc", + "sha256:dc56c9788617b8964ad02e8fcfeed4001c1f8ba91a9e1f31483c0dffb207002a", + "sha256:dd5ec3aa6ae6e4d5b5de9357d2133c07be1aff6405b136dad753a16afb6717dd", + "sha256:edba70118c4be3c2b1f90754d308d0b79c6fe2c0fdc52d8ddf603916f83f4db9", + "sha256:ff8e80c4c4932c10493ff97028decfdb622de69cae87e0f127a7ebe32b4069c6" ], "markers": "python_version >= '3.7'", - "version": "==2.0.40" + "version": "==2.0.41" }, "sqlalchemy-utils": { "hashes": [ @@ -1770,22 +1341,6 @@ "index": "pypi", "version": "==0.41.2" }, - "tinydb": { - "hashes": [ - "sha256:f7dfc39b8d7fda7a1ca62a8dbb449ffd340a117c1206b68c50b1a481fb95181d", - "sha256:f97030ee5cbc91eeadd1d7af07ab0e48ceb04aa63d4a983adbaca4cba16e86c3" - ], - "markers": "python_version >= '3.8' and python_version < '4.0'", - "version": "==4.8.2" - }, - "tuspy": { - "hashes": [ - "sha256:156734eac5c61a046cfecd70f14119f05be92cce198eb5a1a99a664482bedb89", - "sha256:7fc5ac8fb25de37c96c90213f83a1ffdede7f48a471cb5a15a2f57846828a79a" - ], - "markers": "python_full_version >= '3.5.3'", - "version": "==1.1.0" - }, "typing-extensions": { "hashes": [ "sha256:a439e7c04b49fec3e5d3e2beaa21755cadbbdc391694e28ccdd36ca4a1408f8c", @@ -1820,11 +1375,11 @@ }, "urllib3-future": { "hashes": [ - "sha256:2468dbd8902f5696070f6cef78bacdc9448c49f974e94917d49fc07c31c704af", - "sha256:e5cf749b7861d3006d9cead2ac742f0f9d8880022b62799689cb2c4134dede6f" + "sha256:4cb9424398993016383b600ba20881217f10a99c45acac60019ffb0dd007bc8a", + "sha256:5127b8cec47bd165084de1991801c8746bda8889ec919e108fcd777f6fdadaa8" ], "markers": "python_version >= '3.7'", - "version": "==2.12.917" + "version": "==2.12.922" }, "verlib2": { "hashes": [ @@ -1937,109 +1492,16 @@ ], "markers": "python_version >= '3.9'", "version": "==3.1.3" - }, - "yarl": { - "hashes": [ - "sha256:0110f91c57ab43d1538dfa92d61c45e33b84df9257bd08fcfcda90cce931cbc9", - "sha256:01e02bb80ae0dbed44273c304095295106e1d9470460e773268a27d11e594892", - "sha256:0626ee31edb23ac36bdffe607231de2cca055ad3a5e2dc5da587ef8bc6a321bc", - "sha256:087ae8f8319848c18e0d114d0f56131a9c017f29200ab1413b0137ad7c83e2ae", - "sha256:0bae32f8ebd35c04d6528cedb4a26b8bf25339d3616b04613b97347f919b76d3", - "sha256:0df9f0221a78d858793f40cbea3915c29f969c11366646a92ca47e080a14f881", - "sha256:0e617d45d03c8dec0dfce6f51f3e1b8a31aa81aaf4a4d1442fdb232bcf0c6d8c", - "sha256:163ff326680de5f6d4966954cf9e3fe1bf980f5fee2255e46e89b8cf0f3418b5", - "sha256:1efbf4d03e6eddf5da27752e0b67a8e70599053436e9344d0969532baa99df53", - "sha256:217f69e60a14da4eed454a030ea8283f8fbd01a7d6d81e57efb865856822489b", - "sha256:24e4c367ad69988a2283dd45ea88172561ca24b2326b9781e164eb46eea68345", - "sha256:262087a8a0d73e1d169d45c2baf968126f93c97cf403e1af23a7d5455d52721f", - "sha256:2af682a1e97437382ee0791eacbf540318bd487a942e068e7e0a6c571fadbbd3", - "sha256:30eaf4459df6e91f21b2999d1ee18f891bcd51e3cbe1de301b4858c84385895b", - "sha256:32ba32d0fa23893fd8ea8d05bdb05de6eb19d7f2106787024fd969f4ba5466cb", - "sha256:3560dcba3c71ae7382975dc1e912ee76e50b4cd7c34b454ed620d55464f11876", - "sha256:362f5480ba527b6c26ff58cff1f229afe8b7fdd54ee5ffac2ab827c1a75fc71c", - "sha256:3b77173663e075d9e5a57e09d711e9da2f3266be729ecca0b8ae78190990d260", - "sha256:46ade37911b7c99ce28a959147cb28bffbd14cea9e7dd91021e06a8d2359a5aa", - "sha256:4815ec6d3d68a96557fa71bd36661b45ac773fb50e5cfa31a7e843edb098f060", - "sha256:528e86f5b1de0ad8dd758ddef4e0ed24f5d946d4a1cef80ffb2d4fca4e10f122", - "sha256:545575ecfcd465891b51546c2bcafdde0acd2c62c2097d8d71902050b20e4922", - "sha256:5507c1f7dd3d41251b67eecba331c8b2157cfd324849879bebf74676ce76aff7", - "sha256:5684e7ff93ea74e47542232bd132f608df4d449f8968fde6b05aaf9e08a140f9", - "sha256:57711f1465c06fee8825b95c0b83e82991e6d9425f9a042c3c19070a70ac92bf", - "sha256:57abd66ca913f2cfbb51eb3dbbbac3648f1f6983f614a4446e0802e241441d2a", - "sha256:57f3fed859af367b9ca316ecc05ce79ce327d6466342734305aa5cc380e4d8be", - "sha256:5864f539ce86b935053bfa18205fa08ce38e9a40ea4d51b19ce923345f0ed5db", - "sha256:59281b9ed27bc410e0793833bcbe7fc149739d56ffa071d1e0fe70536a4f7b61", - "sha256:5a70201dd1e0a4304849b6445a9891d7210604c27e67da59091d5412bc19e51c", - "sha256:5bc503e1c1fee1b86bcb58db67c032957a52cae39fe8ddd95441f414ffbab83e", - "sha256:63702f1a098d0eaaea755e9c9d63172be1acb9e2d4aeb28b187092bcc9ca2d17", - "sha256:66fc1c2926a73a2fb46e4b92e3a6c03904d9bc3a0b65e01cb7d2b84146a8bd3b", - "sha256:67a56b1acc7093451ea2de0687aa3bd4e58d6b4ef6cbeeaad137b45203deaade", - "sha256:68972df6a0cc47c8abaf77525a76ee5c5f6ea9bbdb79b9565b3234ded3c5e675", - "sha256:6ba0931b559f1345df48a78521c31cfe356585670e8be22af84a33a39f7b9221", - "sha256:70f384921c24e703d249a6ccdabeb57dd6312b568b504c69e428a8dd3e8e68ca", - "sha256:742ceffd3c7beeb2b20d47cdb92c513eef83c9ef88c46829f88d5b06be6734ee", - "sha256:75460740005de5a912b19f657848aef419387426a40f581b1dc9fac0eb9addb5", - "sha256:756b9ea5292a2c180d1fe782a377bc4159b3cfefaca7e41b5b0a00328ef62fa9", - "sha256:7908a25d33f94852b479910f9cae6cdb9e2a509894e8d5f416c8342c0253c397", - "sha256:7a8e19fd5a6fdf19a91f2409665c7a089ffe7b9b5394ab33c0eec04cbecdd01f", - "sha256:7b687c334da3ff8eab848c9620c47a253d005e78335e9ce0d6868ed7e8fd170b", - "sha256:7e4cb14a6ee5b6649ccf1c6d648b4da9220e8277d4d4380593c03cc08d8fe937", - "sha256:8015a076daf77823e7ebdcba474156587391dab4e70c732822960368c01251e6", - "sha256:8182ad422bfacdebd4759ce3adc6055c0c79d4740aea1104e05652a81cd868c6", - "sha256:8346ec72ada749a6b5d82bff7be72578eab056ad7ec38c04f668a685abde6af0", - "sha256:85ac908cd5a97bbd3048cca9f1bf37b932ea26c3885099444f34b0bf5d5e9fa6", - "sha256:8b3ade62678ee2c7c10dcd6be19045135e9badad53108f7d2ed14896ee396045", - "sha256:8c0b2371858d5a814b08542d5d548adb03ff2d7ab32f23160e54e92250961a72", - "sha256:961c3e401ea7f13d02b8bb7cb0c709152a632a6e14cdc8119e9c6ee5596cd45d", - "sha256:9931343d1c1f4e77421687b6b94bbebd8a15a64ab8279adf6fbb047eff47e536", - "sha256:9973ac95327f5d699eb620286c39365990b240031672b5c436a4cd00539596c5", - "sha256:9ba536b17ecf3c74a94239ec1137a3ad3caea8c0e4deb8c8d2ffe847d870a8c5", - "sha256:9fac2dd1c5ecb921359d9546bc23a6dcc18c6acd50c6d96f118188d68010f497", - "sha256:a251e00e445d2e9df7b827c9843c0b87f58a3254aaa3f162fb610747491fe00f", - "sha256:a39d7b807ab58e633ed760f80195cbd145b58ba265436af35f9080f1810dfe64", - "sha256:a5288adb7c59d0f54e4ad58d86fb06d4b26e08a59ed06d00a1aac978c0e32884", - "sha256:a626c4d9cca298d1be8625cff4b17004a9066330ac82d132bbda64a4c17c18d3", - "sha256:a727101eb27f66727576630d02985d8a065d09cd0b5fcbe38a5793f71b2a97ef", - "sha256:a93208282c0ccdf73065fd76c6c129bd428dba5ff65d338ae7d2ab27169861a0", - "sha256:aad67c8f13a4b79990082f72ef09c078a77de2b39899aabf3960a48069704973", - "sha256:acf9b92c4245ac8b59bc7ec66a38d3dcb8d1f97fac934672529562bb824ecadb", - "sha256:ada882e26b16ee651ab6544ce956f2f4beaed38261238f67c2a96db748e17741", - "sha256:ae584afe81a1de4c1bb06672481050f0d001cad13163e3c019477409f638f9b7", - "sha256:aee5b90a5a9b71ac57400a7bdd0feaa27c51e8f961decc8d412e720a004a1791", - "sha256:b0fe766febcf523a2930b819c87bb92407ae1368662c1bc267234e79b20ff894", - "sha256:b8179280cdeb4c36eb18d6534a328f9d40da60d2b96ac4a295c5f93e2799e9d9", - "sha256:c03607bf932aa4cfae371e2dc9ca8b76faf031f106dac6a6ff1458418140c165", - "sha256:c4228978fb59c6b10f60124ba8e311c26151e176df364e996f3f8ff8b93971b5", - "sha256:c515f7dd60ca724e4c62b34aeaa603188964abed2eb66bb8e220f7f104d5a187", - "sha256:cbeb9c145d534c240a63b6ecc8a8dd451faeb67b3dc61d729ec197bb93e29497", - "sha256:cd430c2b7df4ae92498da09e9b12cad5bdbb140d22d138f9e507de1aa3edfea3", - "sha256:cda34ab19099c3a1685ad48fe45172536610c312b993310b5f1ca3eb83453b36", - "sha256:d27a6482ad5e05e8bafd47bf42866f8a1c0c3345abcb48d4511b3c29ecc197dc", - "sha256:d8717924cf0a825b62b1a96fc7d28aab7f55a81bf5338b8ef41d7a76ab9223e9", - "sha256:d995122dcaf180fd4830a9aa425abddab7c0246107c21ecca2fa085611fa7ce9", - "sha256:dff065a1a8ed051d7e641369ba1ad030d5a707afac54cf4ede7069b959898835", - "sha256:e4807aab1bdeab6ae6f296be46337a260ae4b1f3a8c2fcd373e236b4b2b46efd", - "sha256:e66c14d162bac94973e767b24de5d7e6c5153f7305a64ff4fcba701210bcd638", - "sha256:e97d2f0a06b39e231e59ebab0e6eec45c7683b339e8262299ac952707bdf7688", - "sha256:ec2f56edaf476f70b5831bbd59700b53d9dd011b1f77cd4846b5ab5c5eafdb3f", - "sha256:eda3c2b42dc0c389b7cfda2c4df81c12eeb552019e0de28bde8f913fc3d1fcf3", - "sha256:f228f42f29cc87db67020f7d71624102b2c837686e55317b16e1d3ef2747a993", - "sha256:f408d4b4315e814e5c3668094e33d885f13c7809cbe831cbdc5b1bb8c7a448f4", - "sha256:f9b92431d8b4d4ca5ccbfdbac95b05a3a6cd70cd73aa62f32f9627acfde7549c", - "sha256:fd4b5fbd7b9dde785cfeb486b8cca211a0b138d4f3a7da27db89a25b3c482e5c" - ], - "markers": "python_version >= '3.9'", - "version": "==1.19.0" } }, "develop": { "certifi": { "hashes": [ - "sha256:3d5da6925056f6f18f119200434a4780a94263f10d1c21d032a6f6b2baa20651", - "sha256:ca78db4565a652026a4db2bcdf68f2fb589ea80d0be70e03929ed730746b84fe" + "sha256:0a816057ea3cdefcef70270d2c515e4506bbc954f417fa5ade2021213bb8f0c6", + "sha256:30350364dfe371162649852c63336a15c70c6510c2ad5015b21c2345311805f3" ], "markers": "python_version >= '3.6'", - "version": "==2025.1.31" + "version": "==2025.4.26" }, "cffi": { "hashes": [ @@ -2116,101 +1578,101 @@ }, "charset-normalizer": { "hashes": [ - "sha256:0167ddc8ab6508fe81860a57dd472b2ef4060e8d378f0cc555707126830f2537", - "sha256:01732659ba9b5b873fc117534143e4feefecf3b2078b0a6a2e925271bb6f4cfa", - "sha256:01ad647cdd609225c5350561d084b42ddf732f4eeefe6e678765636791e78b9a", - "sha256:04432ad9479fa40ec0f387795ddad4437a2b50417c69fa275e212933519ff294", - "sha256:0907f11d019260cdc3f94fbdb23ff9125f6b5d1039b76003b5b0ac9d6a6c9d5b", - "sha256:0924e81d3d5e70f8126529951dac65c1010cdf117bb75eb02dd12339b57749dd", - "sha256:09b26ae6b1abf0d27570633b2b078a2a20419c99d66fb2823173d73f188ce601", - "sha256:09b5e6733cbd160dcc09589227187e242a30a49ca5cefa5a7edd3f9d19ed53fd", - "sha256:0af291f4fe114be0280cdd29d533696a77b5b49cfde5467176ecab32353395c4", - "sha256:0f55e69f030f7163dffe9fd0752b32f070566451afe180f99dbeeb81f511ad8d", - "sha256:1a2bc9f351a75ef49d664206d51f8e5ede9da246602dc2d2726837620ea034b2", - "sha256:22e14b5d70560b8dd51ec22863f370d1e595ac3d024cb8ad7d308b4cd95f8313", - "sha256:234ac59ea147c59ee4da87a0c0f098e9c8d169f4dc2a159ef720f1a61bbe27cd", - "sha256:2369eea1ee4a7610a860d88f268eb39b95cb588acd7235e02fd5a5601773d4fa", - "sha256:237bdbe6159cff53b4f24f397d43c6336c6b0b42affbe857970cefbb620911c8", - "sha256:28bf57629c75e810b6ae989f03c0828d64d6b26a5e205535585f96093e405ed1", - "sha256:2967f74ad52c3b98de4c3b32e1a44e32975e008a9cd2a8cc8966d6a5218c5cb2", - "sha256:2a75d49014d118e4198bcee5ee0a6f25856b29b12dbf7cd012791f8a6cc5c496", - "sha256:2bdfe3ac2e1bbe5b59a1a63721eb3b95fc9b6817ae4a46debbb4e11f6232428d", - "sha256:2d074908e1aecee37a7635990b2c6d504cd4766c7bc9fc86d63f9c09af3fa11b", - "sha256:2fb9bd477fdea8684f78791a6de97a953c51831ee2981f8e4f583ff3b9d9687e", - "sha256:311f30128d7d333eebd7896965bfcfbd0065f1716ec92bd5638d7748eb6f936a", - "sha256:329ce159e82018d646c7ac45b01a430369d526569ec08516081727a20e9e4af4", - "sha256:345b0426edd4e18138d6528aed636de7a9ed169b4aaf9d61a8c19e39d26838ca", - "sha256:363e2f92b0f0174b2f8238240a1a30142e3db7b957a5dd5689b0e75fb717cc78", - "sha256:3a3bd0dcd373514dcec91c411ddb9632c0d7d92aed7093b8c3bbb6d69ca74408", - "sha256:3bed14e9c89dcb10e8f3a29f9ccac4955aebe93c71ae803af79265c9ca5644c5", - "sha256:44251f18cd68a75b56585dd00dae26183e102cd5e0f9f1466e6df5da2ed64ea3", - "sha256:44ecbf16649486d4aebafeaa7ec4c9fed8b88101f4dd612dcaf65d5e815f837f", - "sha256:4532bff1b8421fd0a320463030c7520f56a79c9024a4e88f01c537316019005a", - "sha256:49402233c892a461407c512a19435d1ce275543138294f7ef013f0b63d5d3765", - "sha256:4c0907b1928a36d5a998d72d64d8eaa7244989f7aaaf947500d3a800c83a3fd6", - "sha256:4d86f7aff21ee58f26dcf5ae81a9addbd914115cdebcbb2217e4f0ed8982e146", - "sha256:5777ee0881f9499ed0f71cc82cf873d9a0ca8af166dfa0af8ec4e675b7df48e6", - "sha256:5df196eb874dae23dcfb968c83d4f8fdccb333330fe1fc278ac5ceeb101003a9", - "sha256:619a609aa74ae43d90ed2e89bdd784765de0a25ca761b93e196d938b8fd1dbbd", - "sha256:6e27f48bcd0957c6d4cb9d6fa6b61d192d0b13d5ef563e5f2ae35feafc0d179c", - "sha256:6ff8a4a60c227ad87030d76e99cd1698345d4491638dfa6673027c48b3cd395f", - "sha256:73d94b58ec7fecbc7366247d3b0b10a21681004153238750bb67bd9012414545", - "sha256:7461baadb4dc00fd9e0acbe254e3d7d2112e7f92ced2adc96e54ef6501c5f176", - "sha256:75832c08354f595c760a804588b9357d34ec00ba1c940c15e31e96d902093770", - "sha256:7709f51f5f7c853f0fb938bcd3bc59cdfdc5203635ffd18bf354f6967ea0f824", - "sha256:78baa6d91634dfb69ec52a463534bc0df05dbd546209b79a3880a34487f4b84f", - "sha256:7974a0b5ecd505609e3b19742b60cee7aa2aa2fb3151bc917e6e2646d7667dcf", - "sha256:7a4f97a081603d2050bfaffdefa5b02a9ec823f8348a572e39032caa8404a487", - "sha256:7b1bef6280950ee6c177b326508f86cad7ad4dff12454483b51d8b7d673a2c5d", - "sha256:7d053096f67cd1241601111b698f5cad775f97ab25d81567d3f59219b5f1adbd", - "sha256:804a4d582ba6e5b747c625bf1255e6b1507465494a40a2130978bda7b932c90b", - "sha256:807f52c1f798eef6cf26beb819eeb8819b1622ddfeef9d0977a8502d4db6d534", - "sha256:80ed5e856eb7f30115aaf94e4a08114ccc8813e6ed1b5efa74f9f82e8509858f", - "sha256:8417cb1f36cc0bc7eaba8ccb0e04d55f0ee52df06df3ad55259b9a323555fc8b", - "sha256:8436c508b408b82d87dc5f62496973a1805cd46727c34440b0d29d8a2f50a6c9", - "sha256:89149166622f4db9b4b6a449256291dc87a99ee53151c74cbd82a53c8c2f6ccd", - "sha256:8bfa33f4f2672964266e940dd22a195989ba31669bd84629f05fab3ef4e2d125", - "sha256:8c60ca7339acd497a55b0ea5d506b2a2612afb2826560416f6894e8b5770d4a9", - "sha256:91b36a978b5ae0ee86c394f5a54d6ef44db1de0815eb43de826d41d21e4af3de", - "sha256:955f8851919303c92343d2f66165294848d57e9bba6cf6e3625485a70a038d11", - "sha256:97f68b8d6831127e4787ad15e6757232e14e12060bec17091b85eb1486b91d8d", - "sha256:9b23ca7ef998bc739bf6ffc077c2116917eabcc901f88da1b9856b210ef63f35", - "sha256:9f0b8b1c6d84c8034a44893aba5e767bf9c7a211e313a9605d9c617d7083829f", - "sha256:aabfa34badd18f1da5ec1bc2715cadc8dca465868a4e73a0173466b688f29dda", - "sha256:ab36c8eb7e454e34e60eb55ca5d241a5d18b2c6244f6827a30e451c42410b5f7", - "sha256:b010a7a4fd316c3c484d482922d13044979e78d1861f0e0650423144c616a46a", - "sha256:b1ac5992a838106edb89654e0aebfc24f5848ae2547d22c2c3f66454daa11971", - "sha256:b7b2d86dd06bfc2ade3312a83a5c364c7ec2e3498f8734282c6c3d4b07b346b8", - "sha256:b97e690a2118911e39b4042088092771b4ae3fc3aa86518f84b8cf6888dbdb41", - "sha256:bc2722592d8998c870fa4e290c2eec2c1569b87fe58618e67d38b4665dfa680d", - "sha256:c0429126cf75e16c4f0ad00ee0eae4242dc652290f940152ca8c75c3a4b6ee8f", - "sha256:c30197aa96e8eed02200a83fba2657b4c3acd0f0aa4bdc9f6c1af8e8962e0757", - "sha256:c4c3e6da02df6fa1410a7680bd3f63d4f710232d3139089536310d027950696a", - "sha256:c75cb2a3e389853835e84a2d8fb2b81a10645b503eca9bcb98df6b5a43eb8886", - "sha256:c96836c97b1238e9c9e3fe90844c947d5afbf4f4c92762679acfe19927d81d77", - "sha256:d7f50a1f8c450f3925cb367d011448c39239bb3eb4117c36a6d354794de4ce76", - "sha256:d973f03c0cb71c5ed99037b870f2be986c3c05e63622c017ea9816881d2dd247", - "sha256:d98b1668f06378c6dbefec3b92299716b931cd4e6061f3c875a71ced1780ab85", - "sha256:d9c3cdf5390dcd29aa8056d13e8e99526cda0305acc038b96b30352aff5ff2bb", - "sha256:dad3e487649f498dd991eeb901125411559b22e8d7ab25d3aeb1af367df5efd7", - "sha256:dccbe65bd2f7f7ec22c4ff99ed56faa1e9f785482b9bbd7c717e26fd723a1d1e", - "sha256:dd78cfcda14a1ef52584dbb008f7ac81c1328c0f58184bf9a84c49c605002da6", - "sha256:e218488cd232553829be0664c2292d3af2eeeb94b32bea483cf79ac6a694e037", - "sha256:e358e64305fe12299a08e08978f51fc21fac060dcfcddd95453eabe5b93ed0e1", - "sha256:ea0d8d539afa5eb2728aa1932a988a9a7af94f18582ffae4bc10b3fbdad0626e", - "sha256:eab677309cdb30d047996b36d34caeda1dc91149e4fdca0b1a039b3f79d9a807", - "sha256:eb8178fe3dba6450a3e024e95ac49ed3400e506fd4e9e5c32d30adda88cbd407", - "sha256:ecddf25bee22fe4fe3737a399d0d177d72bc22be6913acfab364b40bce1ba83c", - "sha256:eea6ee1db730b3483adf394ea72f808b6e18cf3cb6454b4d86e04fa8c4327a12", - "sha256:f08ff5e948271dc7e18a35641d2f11a4cd8dfd5634f55228b691e62b37125eb3", - "sha256:f30bf9fd9be89ecb2360c7d94a711f00c09b976258846efe40db3d05828e8089", - "sha256:fa88b843d6e211393a37219e6a1c1df99d35e8fd90446f1118f4216e307e48cd", - "sha256:fc54db6c8593ef7d4b2a331b58653356cf04f67c960f584edb7c3d8c97e8f39e", - "sha256:fd4ec41f914fa74ad1b8304bbc634b3de73d2a0889bd32076342a573e0779e00", - "sha256:ffc9202a29ab3920fa812879e95a9e78b2465fd10be7fcbd042899695d75e616" + "sha256:005fa3432484527f9732ebd315da8da8001593e2cf46a3d817669f062c3d9ed4", + "sha256:046595208aae0120559a67693ecc65dd75d46f7bf687f159127046628178dc45", + "sha256:0c29de6a1a95f24b9a1aa7aefd27d2487263f00dfd55a77719b530788f75cff7", + "sha256:0c8c57f84ccfc871a48a47321cfa49ae1df56cd1d965a09abe84066f6853b9c0", + "sha256:0f5d9ed7f254402c9e7d35d2f5972c9bbea9040e99cd2861bd77dc68263277c7", + "sha256:18dd2e350387c87dabe711b86f83c9c78af772c748904d372ade190b5c7c9d4d", + "sha256:1b1bde144d98e446b056ef98e59c256e9294f6b74d7af6846bf5ffdafd687a7d", + "sha256:1c95a1e2902a8b722868587c0e1184ad5c55631de5afc0eb96bc4b0d738092c0", + "sha256:1cad5f45b3146325bb38d6855642f6fd609c3f7cad4dbaf75549bf3b904d3184", + "sha256:21b2899062867b0e1fde9b724f8aecb1af14f2778d69aacd1a5a1853a597a5db", + "sha256:24498ba8ed6c2e0b56d4acbf83f2d989720a93b41d712ebd4f4979660db4417b", + "sha256:25a23ea5c7edc53e0f29bae2c44fcb5a1aa10591aae107f2a2b2583a9c5cbc64", + "sha256:289200a18fa698949d2b39c671c2cc7a24d44096784e76614899a7ccf2574b7b", + "sha256:28a1005facc94196e1fb3e82a3d442a9d9110b8434fc1ded7a24a2983c9888d8", + "sha256:32fc0341d72e0f73f80acb0a2c94216bd704f4f0bce10aedea38f30502b271ff", + "sha256:36b31da18b8890a76ec181c3cf44326bf2c48e36d393ca1b72b3f484113ea344", + "sha256:3c21d4fca343c805a52c0c78edc01e3477f6dd1ad7c47653241cf2a206d4fc58", + "sha256:3fddb7e2c84ac87ac3a947cb4e66d143ca5863ef48e4a5ecb83bd48619e4634e", + "sha256:43e0933a0eff183ee85833f341ec567c0980dae57c464d8a508e1b2ceb336471", + "sha256:4a476b06fbcf359ad25d34a057b7219281286ae2477cc5ff5e3f70a246971148", + "sha256:4e594135de17ab3866138f496755f302b72157d115086d100c3f19370839dd3a", + "sha256:50bf98d5e563b83cc29471fa114366e6806bc06bc7a25fd59641e41445327836", + "sha256:5a9979887252a82fefd3d3ed2a8e3b937a7a809f65dcb1e068b090e165bbe99e", + "sha256:5baececa9ecba31eff645232d59845c07aa030f0c81ee70184a90d35099a0e63", + "sha256:5bf4545e3b962767e5c06fe1738f951f77d27967cb2caa64c28be7c4563e162c", + "sha256:6333b3aa5a12c26b2a4d4e7335a28f1475e0e5e17d69d55141ee3cab736f66d1", + "sha256:65c981bdbd3f57670af8b59777cbfae75364b483fa8a9f420f08094531d54a01", + "sha256:68a328e5f55ec37c57f19ebb1fdc56a248db2e3e9ad769919a58672958e8f366", + "sha256:6a0289e4589e8bdfef02a80478f1dfcb14f0ab696b5a00e1f4b8a14a307a3c58", + "sha256:6b66f92b17849b85cad91259efc341dce9c1af48e2173bf38a85c6329f1033e5", + "sha256:6c9379d65defcab82d07b2a9dfbfc2e95bc8fe0ebb1b176a3190230a3ef0e07c", + "sha256:6fc1f5b51fa4cecaa18f2bd7a003f3dd039dd615cd69a2afd6d3b19aed6775f2", + "sha256:70f7172939fdf8790425ba31915bfbe8335030f05b9913d7ae00a87d4395620a", + "sha256:721c76e84fe669be19c5791da68232ca2e05ba5185575086e384352e2c309597", + "sha256:7222ffd5e4de8e57e03ce2cef95a4c43c98fcb72ad86909abdfc2c17d227fc1b", + "sha256:75d10d37a47afee94919c4fab4c22b9bc2a8bf7d4f46f87363bcf0573f3ff4f5", + "sha256:76af085e67e56c8816c3ccf256ebd136def2ed9654525348cfa744b6802b69eb", + "sha256:770cab594ecf99ae64c236bc9ee3439c3f46be49796e265ce0cc8bc17b10294f", + "sha256:7a6ab32f7210554a96cd9e33abe3ddd86732beeafc7a28e9955cdf22ffadbab0", + "sha256:7c48ed483eb946e6c04ccbe02c6b4d1d48e51944b6db70f697e089c193404941", + "sha256:7f56930ab0abd1c45cd15be65cc741c28b1c9a34876ce8c17a2fa107810c0af0", + "sha256:8075c35cd58273fee266c58c0c9b670947c19df5fb98e7b66710e04ad4e9ff86", + "sha256:8272b73e1c5603666618805fe821edba66892e2870058c94c53147602eab29c7", + "sha256:82d8fd25b7f4675d0c47cf95b594d4e7b158aca33b76aa63d07186e13c0e0ab7", + "sha256:844da2b5728b5ce0e32d863af26f32b5ce61bc4273a9c720a9f3aa9df73b1455", + "sha256:8755483f3c00d6c9a77f490c17e6ab0c8729e39e6390328e42521ef175380ae6", + "sha256:915f3849a011c1f593ab99092f3cecfcb4d65d8feb4a64cf1bf2d22074dc0ec4", + "sha256:926ca93accd5d36ccdabd803392ddc3e03e6d4cd1cf17deff3b989ab8e9dbcf0", + "sha256:982bb1e8b4ffda883b3d0a521e23abcd6fd17418f6d2c4118d257a10199c0ce3", + "sha256:98f862da73774290f251b9df8d11161b6cf25b599a66baf087c1ffe340e9bfd1", + "sha256:9cbfacf36cb0ec2897ce0ebc5d08ca44213af24265bd56eca54bee7923c48fd6", + "sha256:a370b3e078e418187da8c3674eddb9d983ec09445c99a3a263c2011993522981", + "sha256:a955b438e62efdf7e0b7b52a64dc5c3396e2634baa62471768a64bc2adb73d5c", + "sha256:aa6af9e7d59f9c12b33ae4e9450619cf2488e2bbe9b44030905877f0b2324980", + "sha256:aa88ca0b1932e93f2d961bf3addbb2db902198dca337d88c89e1559e066e7645", + "sha256:aaeeb6a479c7667fbe1099af9617c83aaca22182d6cf8c53966491a0f1b7ffb7", + "sha256:aaf27faa992bfee0264dc1f03f4c75e9fcdda66a519db6b957a3f826e285cf12", + "sha256:b2680962a4848b3c4f155dc2ee64505a9c57186d0d56b43123b17ca3de18f0fa", + "sha256:b2d318c11350e10662026ad0eb71bb51c7812fc8590825304ae0bdd4ac283acd", + "sha256:b33de11b92e9f75a2b545d6e9b6f37e398d86c3e9e9653c4864eb7e89c5773ef", + "sha256:b3daeac64d5b371dea99714f08ffc2c208522ec6b06fbc7866a450dd446f5c0f", + "sha256:be1e352acbe3c78727a16a455126d9ff83ea2dfdcbc83148d2982305a04714c2", + "sha256:bee093bf902e1d8fc0ac143c88902c3dfc8941f7ea1d6a8dd2bcb786d33db03d", + "sha256:c72fbbe68c6f32f251bdc08b8611c7b3060612236e960ef848e0a517ddbe76c5", + "sha256:c9e36a97bee9b86ef9a1cf7bb96747eb7a15c2f22bdb5b516434b00f2a599f02", + "sha256:cddf7bd982eaa998934a91f69d182aec997c6c468898efe6679af88283b498d3", + "sha256:cf713fe9a71ef6fd5adf7a79670135081cd4431c2943864757f0fa3a65b1fafd", + "sha256:d11b54acf878eef558599658b0ffca78138c8c3655cf4f3a4a673c437e67732e", + "sha256:d41c4d287cfc69060fa91cae9683eacffad989f1a10811995fa309df656ec214", + "sha256:d524ba3f1581b35c03cb42beebab4a13e6cdad7b36246bd22541fa585a56cccd", + "sha256:daac4765328a919a805fa5e2720f3e94767abd632ae410a9062dff5412bae65a", + "sha256:db4c7bf0e07fc3b7d89ac2a5880a6a8062056801b83ff56d8464b70f65482b6c", + "sha256:dc7039885fa1baf9be153a0626e337aa7ec8bf96b0128605fb0d77788ddc1681", + "sha256:dccab8d5fa1ef9bfba0590ecf4d46df048d18ffe3eec01eeb73a42e0d9e7a8ba", + "sha256:dedb8adb91d11846ee08bec4c8236c8549ac721c245678282dcb06b221aab59f", + "sha256:e45ba65510e2647721e35323d6ef54c7974959f6081b58d4ef5d87c60c84919a", + "sha256:e53efc7c7cee4c1e70661e2e112ca46a575f90ed9ae3fef200f2a25e954f4b28", + "sha256:e635b87f01ebc977342e2697d05b56632f5f879a4f15955dfe8cef2448b51691", + "sha256:e70e990b2137b29dc5564715de1e12701815dacc1d056308e2b17e9095372a82", + "sha256:e8082b26888e2f8b36a042a58307d5b917ef2b1cacab921ad3323ef91901c71a", + "sha256:e8323a9b031aa0393768b87f04b4164a40037fb2a3c11ac06a03ffecd3618027", + "sha256:e92fca20c46e9f5e1bb485887d074918b13543b1c2a1185e69bb8d17ab6236a7", + "sha256:eb30abc20df9ab0814b5a2524f23d75dcf83cde762c161917a2b4b7b55b1e518", + "sha256:eba9904b0f38a143592d9fc0e19e2df0fa2e41c3c3745554761c5f6447eedabf", + "sha256:ef8de666d6179b009dce7bcb2ad4c4a779f113f12caf8dc77f0162c29d20490b", + "sha256:efd387a49825780ff861998cd959767800d54f8308936b21025326de4b5a42b9", + "sha256:f0aa37f3c979cf2546b73e8222bbfa3dc07a641585340179d768068e3455e544", + "sha256:f4074c5a429281bf056ddd4c5d3b740ebca4d43ffffe2ef4bf4d2d05114299da", + "sha256:f69a27e45c43520f5487f27627059b64aaf160415589230992cec34c5e18a509", + "sha256:fb707f3e15060adf5b7ada797624a6c6e0138e2a26baa089df64c68ee98e040f", + "sha256:fcbe676a55d7445b22c10967bceaaf0ee69407fbe0ece4d032b6eb8d4565982a", + "sha256:fdb20a30fe1175ecabed17cbf7812f7b804b8a315a25f24678bcdf120a90077f" ], "markers": "python_version >= '3.7'", - "version": "==3.4.1" + "version": "==3.4.2" }, "coverage": { "hashes": [ @@ -2283,44 +1745,46 @@ }, "cryptography": { "hashes": [ - "sha256:04abd71114848aa25edb28e225ab5f268096f44cf0127f3d36975bdf1bdf3390", - "sha256:0529b1d5a0105dd3731fa65680b45ce49da4d8115ea76e9da77a875396727b41", - "sha256:1bc312dfb7a6e5d66082c87c34c8a62176e684b6fe3d90fcfe1568de675e6688", - "sha256:268e4e9b177c76d569e8a145a6939eca9a5fec658c932348598818acf31ae9a5", - "sha256:29ecec49f3ba3f3849362854b7253a9f59799e3763b0c9d0826259a88efa02f1", - "sha256:2bf7bf75f7df9715f810d1b038870309342bff3069c5bd8c6b96128cb158668d", - "sha256:3b721b8b4d948b218c88cb8c45a01793483821e709afe5f622861fc6182b20a7", - "sha256:3c00b6b757b32ce0f62c574b78b939afab9eecaf597c4d624caca4f9e71e7843", - "sha256:3dc62975e31617badc19a906481deacdeb80b4bb454394b4098e3f2525a488c5", - "sha256:4973da6ca3db4405c54cd0b26d328be54c7747e89e284fcff166132eb7bccc9c", - "sha256:4e389622b6927d8133f314949a9812972711a111d577a5d1f4bee5e58736b80a", - "sha256:51e4de3af4ec3899d6d178a8c005226491c27c4ba84101bfb59c901e10ca9f79", - "sha256:5f6f90b72d8ccadb9c6e311c775c8305381db88374c65fa1a68250aa8a9cb3a6", - "sha256:6210c05941994290f3f7f175a4a57dbbb2afd9273657614c506d5976db061181", - "sha256:6f101b1f780f7fc613d040ca4bdf835c6ef3b00e9bd7125a4255ec574c7916e4", - "sha256:7bdcd82189759aba3816d1f729ce42ffded1ac304c151d0a8e89b9996ab863d5", - "sha256:7ca25849404be2f8e4b3c59483d9d3c51298a22c1c61a0e84415104dacaf5562", - "sha256:81276f0ea79a208d961c433a947029e1a15948966658cf6710bbabb60fcc2639", - "sha256:8cadc6e3b5a1f144a039ea08a0bdb03a2a92e19c46be3285123d32029f40a922", - "sha256:8e0ddd63e6bf1161800592c71ac794d3fb8001f2caebe0966e77c5234fa9efc3", - "sha256:909c97ab43a9c0c0b0ada7a1281430e4e5ec0458e6d9244c0e821bbf152f061d", - "sha256:96e7a5e9d6e71f9f4fca8eebfd603f8e86c5225bb18eb621b2c1e50b290a9471", - "sha256:9a1e657c0f4ea2a23304ee3f964db058c9e9e635cc7019c4aa21c330755ef6fd", - "sha256:9eb9d22b0a5d8fd9925a7764a054dca914000607dff201a24c791ff5c799e1fa", - "sha256:af4ff3e388f2fa7bff9f7f2b31b87d5651c45731d3e8cfa0944be43dff5cfbdb", - "sha256:b042d2a275c8cee83a4b7ae30c45a15e6a4baa65a179a0ec2d78ebb90e4f6699", - "sha256:bc821e161ae88bfe8088d11bb39caf2916562e0a2dc7b6d56714a48b784ef0bb", - "sha256:c505d61b6176aaf982c5717ce04e87da5abc9a36a5b39ac03905c4aafe8de7aa", - "sha256:c63454aa261a0cf0c5b4718349629793e9e634993538db841165b3df74f37ec0", - "sha256:c7362add18b416b69d58c910caa217f980c5ef39b23a38a0880dfd87bdf8cd23", - "sha256:d03806036b4f89e3b13b6218fefea8d5312e450935b1a2d55f0524e2ed7c59d9", - "sha256:d1b3031093a366ac767b3feb8bcddb596671b3aaff82d4050f984da0c248b615", - "sha256:d1c3572526997b36f245a96a2b1713bf79ce99b271bbcf084beb6b9b075f29ea", - "sha256:efcfe97d1b3c79e486554efddeb8f6f53a4cdd4cf6086642784fa31fc384e1d7", - "sha256:f514ef4cd14bb6fb484b4a60203e912cfcb64f2ab139e88c2274511514bf7308" + "sha256:057723b79752a142efbc609e90b0dff27b0361ccbee3bd48312d70f5cdf53b78", + "sha256:05c2385b1f5c89a17df19900cfb1345115a77168f5ed44bdf6fd3de1ce5cc65b", + "sha256:08281de408e7eb71ba3cd5098709a356bfdf65eebd7ee7633c3610f0aa80d79b", + "sha256:10d68763892a7b19c22508ab57799c4423c7c8cd61d7eee4c5a6a55a46511949", + "sha256:1655d3a76e3dedb683c982a6c3a2cbfae2d08f47a48ec5a3d58db52b3d29ea6f", + "sha256:18f8084b7ca3ce1b8d38bdfe33c48116edf9a08b4d056ef4a96dceaa36d8d965", + "sha256:2cb03a944a1a412724d15a7c051d50e63a868031f26b6a312f2016965b661942", + "sha256:4142e20c29224cec63e9e32eb1e6014fb285fe39b7be66b3564ca978a3a8afe9", + "sha256:463096533acd5097f8751115bc600b0b64620c4aafcac10c6d0041e6e68f88fe", + "sha256:48caa55c528617fa6db1a9c3bf2e37ccb31b73e098ac2b71408d1f2db551dde4", + "sha256:49af56491473231159c98c2c26f1a8f3799a60e5cf0e872d00745b858ddac9d2", + "sha256:4cc31c66411e14dd70e2f384a9204a859dc25b05e1f303df0f5326691061b839", + "sha256:501de1296b2041dccf2115e3c7d4947430585601b251b140970ce255c5cfb985", + "sha256:59c0c8f043dd376bbd9d4f636223836aed50431af4c5a467ed9bf61520294627", + "sha256:614bca7c6ed0d8ad1dce683a6289afae1f880675b4090878a0136c3da16bc693", + "sha256:61a8b1bbddd9332917485b2453d1de49f142e6334ce1d97b7916d5a85d179c84", + "sha256:7429936146063bd1b2cfc54f0e04016b90ee9b1c908a7bed0800049cbace70eb", + "sha256:7c73968fbb7698a4c5d6160859db560d3aac160edde89c751edd5a8bc6560c88", + "sha256:80303ee6a02ef38c4253160446cbeb5c400c07e01d4ddbd4ff722a89b736d95a", + "sha256:965611880c3fa8e504b7458484c0697e00ae6e937279cd6734fdaa2bc954dc49", + "sha256:9a900036b42f7324df7c7ad9569eb92ba0b613cf699160dd9c2154b24fd02f8e", + "sha256:9cfd1399064b13043082c660ddd97a0358e41c8b0dc7b77c1243e013d305c344", + "sha256:a8ec324711596fbf21837d3a5db543937dd84597d364769b46e0102250023f77", + "sha256:a9727a21957d3327cf6b7eb5ffc9e4b663909a25fea158e3fcbc49d4cdd7881b", + "sha256:b19f4b28dd2ef2e6d600307fee656c00825a2980c4356a7080bd758d633c3a6f", + "sha256:b2de529027579e43b6dc1f805f467b102fb7d13c1e54c334f1403ee2b37d0059", + "sha256:c0c000c1a09f069632d8a9eb3b610ac029fcc682f1d69b758e625d6ee713f4ed", + "sha256:cdafb86eb673c3211accffbffdb3cdffa3aaafacd14819e0898d23696d18e4d3", + "sha256:d2a90ce2f0f5b695e4785ac07c19a58244092f3c85d57db6d8eb1a2b26d2aad6", + "sha256:d784d57b958ffd07e9e226d17272f9af0c41572557604ca7554214def32c26bf", + "sha256:d891942592789fa0ab71b502550bbadb12f540d7413d7d7c4cef4b02af0f5bc6", + "sha256:dc7693573f16535428183de8fd27f0ca1ca37a51baa0b41dc5ed7b3d68fe80e2", + "sha256:ddb8d01aa900b741d6b7cc585a97aff787175f160ab975e21f880e89d810781a", + "sha256:e328357b6bbf79928363dbf13f4635b7aac0306afb7e5ad24d21d0c5761c3253", + "sha256:e86c8d54cd19a13e9081898b3c24351683fd39d726ecf8e774aaa9d8d96f5f3a", + "sha256:e9e4bdcd70216b08801e267c0b563316b787f957a46e215249921f99288456f9", + "sha256:f169469d04a23282de9d0be349499cb6683b6ff1b68901210faacac9b0c24b7d" ], "markers": "python_version >= '3.7' and python_full_version not in '3.9.0, 3.9.1'", - "version": "==44.0.2" + "version": "==45.0.2" }, "docker": { "hashes": [ @@ -2369,19 +1833,19 @@ }, "packaging": { "hashes": [ - "sha256:09abb1bccd265c01f4a3aa3f7a7db064b36514d2cba19a2f694fe6150451a759", - "sha256:c228a6dc5e932d346bc5739379109d49e8853dd8223571c7c5b55260edc0b97f" + "sha256:29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484", + "sha256:d443872c98d677bf60f6a1f2f8c1cb748e8fe762d2bf9d3148b5599295b0fc4f" ], "markers": "python_version >= '3.8'", - "version": "==24.2" + "version": "==25.0" }, "pluggy": { "hashes": [ - "sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1", - "sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669" + "sha256:7dcc130b76258d33b90f61b658791dede3486c3e6bfb003ee5c9bfb396dd22f3", + "sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746" ], - "markers": "python_version >= '3.8'", - "version": "==1.5.0" + "markers": "python_version >= '3.9'", + "version": "==1.6.0" }, "pycparser": { "hashes": [ @@ -2404,7 +1868,7 @@ "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3", "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427" ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2'", + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", "version": "==2.9.0.post0" }, "requests": { @@ -2428,7 +1892,7 @@ "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274", "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81" ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2'", + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", "version": "==1.17.0" }, "testcontainers-core": { diff --git a/dbrepo-search-service/app.py b/dbrepo-search-service/app.py index 5d4f8b09decf600860293753ee0fbd044a9fdf6b..812882d8c155cc9f3e386c32c6386271b55b7e0e 100644 --- a/dbrepo-search-service/app.py +++ b/dbrepo-search-service/app.py @@ -29,17 +29,32 @@ dictConfig({ 'format': '[%(asctime)s] %(levelname)s in %(module)s: %(message)s', }, 'simple': { - 'format': '[%(asctime)s] %(levelname)s: %(message)s', + 'format': '[%(asctime)s] [%(levelname)s] %(message)s', + }, + 'ecs': { + 'format': '{"@timestamp": "%(asctime)s", "log.level": "%(levelname)s", "log.logger": "%(module)s", "message": "%(message)s", "service_name": "search-service", "service_version": "1.9.0"}', + 'datefmt': '%Y-%m-%dT%H:%M:%S' + }, + }, + 'handlers': { + 'wsgi': { + 'class': 'logging.StreamHandler', + 'stream': 'ext://flask.logging.wsgi_errors_stream', + 'formatter': 'simple' + }, + 'file': { + 'class': 'logging.handlers.TimedRotatingFileHandler', + 'formatter': 'ecs', + 'filename': '/var/log/app/service/search/app.log', + 'when': 'm', + 'interval': 1, + 'backupCount': 5, + 'encoding': 'utf8' }, }, - 'handlers': {'wsgi': { - 'class': 'logging.StreamHandler', - 'stream': 'ext://flask.logging.wsgi_errors_stream', - 'formatter': 'simple' # default - }}, 'root': { 'level': 'DEBUG', - 'handlers': ['wsgi'] + 'handlers': ['wsgi', 'file'] } }) @@ -60,8 +75,8 @@ swagger_config = { "headers": [], "specs": [ { - "endpoint": "api-search", - "route": "/api-search.json", + "endpoint": "api-docs", + "route": "/api-docs.json", "rule_filter": lambda rule: rule.endpoint.startswith('search'), "model_filter": lambda tag: True, # all in } @@ -169,7 +184,7 @@ template = { "info": { "title": "Database Repository Search Service API", "description": "Service that searches the search database", - "version": "1.8.1", + "version": "1.9.0", "contact": { "name": "Prof. Andreas Rauber", "email": "andreas.rauber@tuwien.ac.at" @@ -281,7 +296,7 @@ def health(): @app.route("/api/search/<string:index>", methods=["GET"], endpoint="search_get_index") @metrics.gauge(name='dbrepo_search_index_list', description='Time needed to list search index') -@swag_from("os-yml/get_index.yml") +@swag_from("/app/os-yml/get_index.yml") def get_index(index: str): """ returns all entries in a specific index @@ -305,7 +320,7 @@ def get_index(index: str): @app.route("/api/search/<string:field_type>/fields", methods=["GET"], endpoint="search_get_index_fields") @metrics.gauge(name='dbrepo_search_type_list', description='Time needed to list search types') -@swag_from("os-yml/get_fields.yml") +@swag_from("/app/os-yml/get_fields.yml") def get_fields(field_type: str): """ returns a list of attributes of the data for a specific index. @@ -324,7 +339,7 @@ def get_fields(field_type: str): @app.route("/api/search", methods=["GET"], endpoint="search_fuzzy_search") @metrics.gauge(name='dbrepo_search_fuzzy', description='Time needed to search fuzzy') -@swag_from("os-yml/get_fuzzy_search.yml") +@swag_from("/app/os-yml/get_fuzzy_search.yml") def get_fuzzy_search(): """ Main endpoint for fuzzy searching. @@ -347,7 +362,7 @@ def get_fuzzy_search(): @app.route("/api/search/<string:field_type>", methods=["POST"], endpoint="search_post_general_search") @metrics.gauge(name='dbrepo_search_type', description='Time needed to search by type') -@swag_from("os-yml/post_general_search.yml") +@swag_from("/app/os-yml/post_general_search.yml") def post_general_search(field_type): """ Main endpoint for fuzzy searching. @@ -430,8 +445,8 @@ def save_database(database_id: str): try: payload = Database.model_validate(request.json) except ValidationError as e: - logging.error(f"Failed to validate: {e}") - return ApiError(status='BAD_REQUEST', message=f'Malformed payload: {e}', + logging.error(f"Failed to validate: {str(e).strip()}") + return ApiError(status='BAD_REQUEST', message=f'Malformed payload: {str(e).strip()}', code='search.general.missing').model_dump(), 400 search_client().save_database(database_id, payload) return Response(), 202, headers diff --git a/dbrepo-search-service/init.Dockerfile b/dbrepo-search-service/init.Dockerfile index 2099df48cc53586a0cfa64bae3ea1dd4615c6780..231e8d85513adb62beac7c208b2fa97a4924ec37 100644 --- a/dbrepo-search-service/init.Dockerfile +++ b/dbrepo-search-service/init.Dockerfile @@ -18,6 +18,9 @@ RUN adduser -D dbrepo --uid 1001 WORKDIR /app +RUN mkdir -p /var/log/app/service/search && \ + chown -R 1001:1001 /var/log/app + USER 1001 COPY --chown=1001 ./database.json ./database.json diff --git a/dbrepo-search-service/init.py b/dbrepo-search-service/init.py index 48a59538e01fc232fe49675db5692cb21c2f8942..1df3e6bcdf657b47fa1ce367dc06335e1fec7dda 100644 --- a/dbrepo-search-service/init.py +++ b/dbrepo-search-service/init.py @@ -19,17 +19,32 @@ dictConfig({ 'format': '[%(asctime)s] %(levelname)s in %(module)s: %(message)s', }, 'simple': { - 'format': '[%(asctime)s] %(levelname)s: %(message)s', + 'format': '[%(asctime)s] [%(levelname)s] %(message)s', + }, + 'ecs': { + 'format': '{"@timestamp": "%(asctime)s", "log.level": "%(levelname)s", "log.logger": "%(module)s", "message": "%(message)s", "service_name": "search-service-init", "service_version": "1.9.0"}', + 'datefmt': '%Y-%m-%dT%H:%M:%S' + }, + }, + 'handlers': { + 'wsgi': { + 'class': 'logging.StreamHandler', + 'stream': 'ext://flask.logging.wsgi_errors_stream', + 'formatter': 'simple' + }, + 'file': { + 'class': 'logging.handlers.TimedRotatingFileHandler', + 'formatter': 'ecs', + 'filename': '/var/log/app/service/search/init.log', + 'when': 'm', + 'interval': 1, + 'backupCount': 5, + 'encoding': 'utf8' }, }, - 'handlers': {'wsgi': { - 'class': 'logging.StreamHandler', - 'stream': 'ext://flask.logging.wsgi_errors_stream', - 'formatter': 'simple' # default - }}, 'root': { 'level': 'DEBUG', - 'handlers': ['wsgi'] + 'handlers': ['wsgi', 'file'] } }) diff --git a/dbrepo-search-service/lib/dbrepo-1.8.1.tar.gz b/dbrepo-search-service/lib/dbrepo-1.8.1.tar.gz deleted file mode 100644 index d13869fc6f53ed38c9580789746781d52a6d0b69..0000000000000000000000000000000000000000 Binary files a/dbrepo-search-service/lib/dbrepo-1.8.1.tar.gz and /dev/null differ diff --git a/dbrepo-dashboard-service/lib/dbrepo-1.8.1-py3-none-any.whl b/dbrepo-search-service/lib/dbrepo-1.9.0-py3-none-any.whl similarity index 83% rename from dbrepo-dashboard-service/lib/dbrepo-1.8.1-py3-none-any.whl rename to dbrepo-search-service/lib/dbrepo-1.9.0-py3-none-any.whl index 289f081b95f69e34e6d8a947642d7966b55a3b68..c0a8976b56d2534aac0a687119d64d800edc6a57 100644 Binary files a/dbrepo-dashboard-service/lib/dbrepo-1.8.1-py3-none-any.whl and b/dbrepo-search-service/lib/dbrepo-1.9.0-py3-none-any.whl differ diff --git a/dbrepo-search-service/lib/dbrepo-1.9.0.tar.gz b/dbrepo-search-service/lib/dbrepo-1.9.0.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..a3f637e0f89cf40643cc39b4778760128a9b717f Binary files /dev/null and b/dbrepo-search-service/lib/dbrepo-1.9.0.tar.gz differ diff --git a/dbrepo-storage-service/init/Dockerfile b/dbrepo-storage-service/init/Dockerfile index ad0d2ae853b7a0cb9a4aa87c782c939547c3dd4b..7ea74cddf1e5d1ca5fe686aee621c5f988756560 100644 --- a/dbrepo-storage-service/init/Dockerfile +++ b/dbrepo-storage-service/init/Dockerfile @@ -7,6 +7,9 @@ RUN apk --no-cache add \ WORKDIR /app +RUN mkdir -p /var/log/app/service/storage && \ + chown -R 1001:1001 /var/log/app/service/storage + RUN adduser -D dbrepo --uid 1001 COPY --chown=1001 --chmod=0744 ./init.sh /app/init.sh diff --git a/dbrepo-storage-service/init/init.sh b/dbrepo-storage-service/init/init.sh index f7d8d21a4b6f8135e11409cfeb8fe337d0dd49c4..f40712e81be5e7030c4c3988896411e8fde7f36a 100644 --- a/dbrepo-storage-service/init/init.sh +++ b/dbrepo-storage-service/init/init.sh @@ -4,18 +4,24 @@ access_key = ${S3_ACCESS_KEY_ID} secret_key = ${S3_SECRET_ACCESS_KEY} # Setup endpoint host_base = ${STORAGE_ENDPOINT} -host_bucket = ${STORAGE_ENDPOINT} +host_bucket = ${S3_BUCKET} use_https = False # Enable S3 v4 signature APIs signature_v2 = False EOF +function log() { + echo "{\"@timestamp\":\"$(date --rfc-3339='seconds')\", \"log.level\": \"$1\", \"message\": \"$2\"}" >> /var/log/app/service/storage/init.log +} + # create bucket if s3cmd --config=/app/.s3cfg ls | grep -q "s3://${S3_BUCKET}"; then - echo "[INFO] Bucket s3://${S3_BUCKET} already exists, skip." + echo "[INFO] Bucket s3://${S3_BUCKET} already exists, skip" + log "INFO" "Bucket s3://${S3_BUCKET} already exists, skip" else if ! s3cmd --config=/app/.s3cfg mb s3://${S3_BUCKET}; then echo "[ERROR] Failed to create bucket s3://${S3_BUCKET}" + log "ERROR" "Failed to create bucket s3://${S3_BUCKET}" fi fi diff --git a/dbrepo-ui-new/requirements.txt b/dbrepo-ui-new/requirements.txt new file mode 100644 index 0000000000000000000000000000000000000000..607fa97eb38239c11fda50d1f7c58625e98635e7 --- /dev/null +++ b/dbrepo-ui-new/requirements.txt @@ -0,0 +1,37 @@ +aiohappyeyeballs==2.4.4 +aiohttp==3.11.11 +aiosignal==1.3.2 +annotated-types==0.7.0 +attrs==24.3.0 +blinker==1.8.2 +certifi==2024.12.14 +charset-normalizer==3.4.1 +click==8.1.7 +colorama==0.4.6 +dbrepo==1.6.0 +Flask==3.0.3 +frozenlist==1.5.0 +idna==3.10 +itsdangerous==2.2.0 +Jinja2==3.1.4 +MarkupSafe==2.1.5 +multidict==6.1.0 +numpy==2.2.1 +pandas==2.2.3 +pika==1.3.2 +propcache==0.2.1 +pydantic==2.10.5 +pydantic_core==2.27.2 +python-dateutil==2.9.0.post0 +python-dotenv==1.0.1 +pytz==2024.2 +requests==2.32.3 +six==1.17.0 +tinydb==4.8.2 +tuspy==1.1.0 +typing_extensions==4.12.2 +tzdata==2024.2 +urllib3==2.3.0 +watchdog==5.0.2 +Werkzeug==3.0.4 +yarl==1.18.3 diff --git a/dbrepo-ui/bun.lockb b/dbrepo-ui/bun.lockb index a4bc73dcd16c8e4a59a34fd431a7acf3a20627fa..d455f25e4329f14f8ca9973e541a3a5a1bba5281 100755 Binary files a/dbrepo-ui/bun.lockb and b/dbrepo-ui/bun.lockb differ diff --git a/dbrepo-ui/components/database/DatabaseToolbar.vue b/dbrepo-ui/components/database/DatabaseToolbar.vue index 028cf4c3e979a81fbc253551599314179efd2550..642f75a529194b2524cb1e5bd9cf08a68013782f 100644 --- a/dbrepo-ui/components/database/DatabaseToolbar.vue +++ b/dbrepo-ui/components/database/DatabaseToolbar.vue @@ -66,7 +66,7 @@ :text="$t('toolbars.database.views.tab')" :to="`/database/${$route.params.database_id}/view`" /> <v-tab - v-if="hasReadAccess" + v-if="canViewSubsets" :text="$t('toolbars.database.subsets.tab')" :to="`/database/${$route.params.database_id}/subset`" /> <v-tab @@ -161,6 +161,9 @@ export default { } return this.roles.includes('create-table') }, + canViewSubsets () { + return this.hasReadAccess + }, isOwner () { if (!this.database || !this.cacheUser) { return false diff --git a/dbrepo-ui/components/table/TableSchema.vue b/dbrepo-ui/components/table/TableSchema.vue index d6b9c138853e9638ad5291bfd30ccf6b6da09e07..f7cb3b3eb09a7d708a4cef5dce9d9e402ad7fc0b 100644 --- a/dbrepo-ui/components/table/TableSchema.vue +++ b/dbrepo-ui/components/table/TableSchema.vue @@ -152,7 +152,6 @@ <v-checkbox v-model="c.unique" :disabled="disabled || c.type === 'serial'" - :hidden="c.primary_key" :label="$t('pages.table.subpages.schema.unique.label')" /> </v-col> <v-col @@ -169,7 +168,6 @@ </v-col> </v-row> <v-row - v-if="columns.length !== 0" dense> <v-col> <v-btn @@ -182,8 +180,7 @@ @click="addColumn()" /> </v-col> </v-row> - <v-row - v-if="columns.length !== 0"> + <v-row> <v-col> <v-btn color="secondary" @@ -252,7 +249,7 @@ export default { return this.$vuetify.theme.global.name.toLowerCase().endsWith('contrast') ? runtimeConfig.public.variant.button.contrast : runtimeConfig.public.variant.button.normal }, showPrimaryKeyWarning () { - if (this.columns.length === 0) { + if (this.disabled) { return false } return this.columns.filter(c => c.primary_key).length === 0 diff --git a/dbrepo-ui/layouts/default.vue b/dbrepo-ui/layouts/default.vue index 7267242288c5eadaf184fdb1afe4e485a03f78dc..5784905294da2842c18aa9779e191a34f3c4ab76 100644 --- a/dbrepo-ui/layouts/default.vue +++ b/dbrepo-ui/layouts/default.vue @@ -56,7 +56,7 @@ <v-spacer /> <v-btn variant="plain" - :text="commitShort" + :text="commit" size="x-small" prepend-icon="mdi-source-commit" :href="`https://gitlab.phaidra.org/fair-data-austria-db-repository/fda-services/-/commit/${commit}`" /> @@ -249,9 +249,6 @@ export default { commit () { return this.$config.public.commit }, - commitShort () { - return this.$config.public.commit.substr(0, 8) - }, error () { if (this.identifier) { return null diff --git a/dbrepo-ui/package-lock.json b/dbrepo-ui/package-lock.json deleted file mode 100644 index 52dbae9ae9248f8c70c251817a101b95ecf42ed9..0000000000000000000000000000000000000000 --- a/dbrepo-ui/package-lock.json +++ /dev/null @@ -1,12446 +0,0 @@ -{ - "name": "dbrepo-ui", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "dbrepo-ui", - "hasInstallScript": true, - "dependencies": { - "@artmizu/nuxt-prometheus": "^2.4.0", - "@date-fns/utc": "^2.1.0", - "@fontsource/open-sans": "^5.0.24", - "@mdi/font": "^7.4.47", - "@nuxtjs/robots": "^3.0.0", - "@nuxtjs/sitemap": "^5.2.0", - "@pinia/nuxt": "^0.5.1", - "ace-builds": "^1.32.6", - "axios": "^1.6.7", - "buffer": "^6.0.3", - "chart.js": "^4.4.1", - "date-fns": "^3.3.1", - "http-status-codes": "^2.3.0", - "jwt-decode": "^4.0.0", - "merkle-json": "^2.6.0", - "moment": "^2.30.1", - "nuxt": "^3.10.3", - "nuxt-oidc-auth": "^1.0.0-beta.5", - "parse-md": "^3.0.3", - "pinia": "^2.1.7", - "qs": "^6.11.2", - "sql-formatter": "^15.2.0", - "tus-js-client": "^4.0.1", - "vue": "^3.4.21", - "vue-axios": "^3.5.2", - "vue-chartjs": "^5.3.0", - "vue-meta": "^2.4.0", - "vue-toast-notification": "^3.1.2", - "vue3-ace-editor": "^2.2.4", - "vuetify": "^3.7.2" - }, - "devDependencies": { - "@nuxtjs/i18n": "^8.1.1", - "@pinia-plugin-persistedstate/nuxt": "^1.2.0", - "@types/qs": "^6.9.12", - "sass": "^1.71.0", - "vite-plugin-vuetify": "^2.0.4" - } - }, - "node_modules/@ampproject/remapping": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", - "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.24" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@antfu/install-pkg": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@antfu/install-pkg/-/install-pkg-1.0.0.tgz", - "integrity": "sha512-xvX6P/lo1B3ej0OsaErAjqgFYzYVcJpamjLAFLYh9vRJngBrMoUG7aVnrGTeqM7yxbyTD5p3F2+0/QUEh8Vzhw==", - "dependencies": { - "package-manager-detector": "^0.2.8", - "tinyexec": "^0.3.2" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/@antfu/utils": { - "version": "0.7.10", - "resolved": "https://registry.npmjs.org/@antfu/utils/-/utils-0.7.10.tgz", - "integrity": "sha512-+562v9k4aI80m1+VuMHehNJWLOFjBnXn3tdOitzD0il5b7smkSBal4+a3oKiQTbrwMmN/TBUMDvbdoWDehgOww==", - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/@artmizu/nuxt-prometheus": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/@artmizu/nuxt-prometheus/-/nuxt-prometheus-2.4.0.tgz", - "integrity": "sha512-scLoSmOXN2SAGOkO/eFFN1MvfLUcj/FLN7cXCda5xQnHfHTKL3ac2BHgeyv4ylleirnOwYfWzco/KQXx2WixHQ==", - "dependencies": { - "@mswjs/interceptors": "^0.28.4", - "@nuxt/kit": "^3.11.2", - "consola": "^3.2.3", - "defu": "^6.1.2", - "h3": "^1.7.1", - "prom-client": "^14.2.0" - } - }, - "node_modules/@babel/code-frame": { - "version": "7.26.2", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz", - "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==", - "dependencies": { - "@babel/helper-validator-identifier": "^7.25.9", - "js-tokens": "^4.0.0", - "picocolors": "^1.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/compat-data": { - "version": "7.26.8", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.8.tgz", - "integrity": "sha512-oH5UPLMWR3L2wEFLnFJ1TZXqHufiTKAiLfqw5zkhS4dKXLJ10yVztfil/twG8EDTA4F/tvVNw9nOl4ZMslB8rQ==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/core": { - "version": "7.26.9", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.9.tgz", - "integrity": "sha512-lWBYIrF7qK5+GjY5Uy+/hEgp8OJWOD/rpy74GplYRhEauvbHDeFB8t5hPOZxCZ0Oxf4Cc36tK51/l3ymJysrKw==", - "dependencies": { - "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.26.2", - "@babel/generator": "^7.26.9", - "@babel/helper-compilation-targets": "^7.26.5", - "@babel/helper-module-transforms": "^7.26.0", - "@babel/helpers": "^7.26.9", - "@babel/parser": "^7.26.9", - "@babel/template": "^7.26.9", - "@babel/traverse": "^7.26.9", - "@babel/types": "^7.26.9", - "convert-source-map": "^2.0.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.3", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" - } - }, - "node_modules/@babel/core/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/generator": { - "version": "7.26.9", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.9.tgz", - "integrity": "sha512-kEWdzjOAUMW4hAyrzJ0ZaTOu9OmpyDIQicIh0zg0EEcEkYXZb2TjtBhnHi2ViX7PKwZqF4xwqfAm299/QMP3lg==", - "dependencies": { - "@babel/parser": "^7.26.9", - "@babel/types": "^7.26.9", - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.25", - "jsesc": "^3.0.2" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-annotate-as-pure": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.25.9.tgz", - "integrity": "sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g==", - "dependencies": { - "@babel/types": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-compilation-targets": { - "version": "7.26.5", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.26.5.tgz", - "integrity": "sha512-IXuyn5EkouFJscIDuFF5EsiSolseme1s0CZB+QxVugqJLYmKdxI1VfIBOst0SUu4rnk2Z7kqTwmoO1lp3HIfnA==", - "dependencies": { - "@babel/compat-data": "^7.26.5", - "@babel/helper-validator-option": "^7.25.9", - "browserslist": "^4.24.0", - "lru-cache": "^5.1.1", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-compilation-targets/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.26.9", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.26.9.tgz", - "integrity": "sha512-ubbUqCofvxPRurw5L8WTsCLSkQiVpov4Qx0WMA+jUN+nXBK8ADPlJO1grkFw5CWKC5+sZSOfuGMdX1aI1iT9Sg==", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.25.9", - "@babel/helper-member-expression-to-functions": "^7.25.9", - "@babel/helper-optimise-call-expression": "^7.25.9", - "@babel/helper-replace-supers": "^7.26.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9", - "@babel/traverse": "^7.26.9", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-create-class-features-plugin/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.25.9.tgz", - "integrity": "sha512-wbfdZ9w5vk0C0oyHqAJbc62+vet5prjj01jjJ8sKn3j9h3MQQlflEdXYvuqRWjHnM12coDEqiC1IRCi0U/EKwQ==", - "dependencies": { - "@babel/traverse": "^7.25.9", - "@babel/types": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-imports": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz", - "integrity": "sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==", - "dependencies": { - "@babel/traverse": "^7.25.9", - "@babel/types": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-transforms": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.26.0.tgz", - "integrity": "sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==", - "dependencies": { - "@babel/helper-module-imports": "^7.25.9", - "@babel/helper-validator-identifier": "^7.25.9", - "@babel/traverse": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-optimise-call-expression": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.25.9.tgz", - "integrity": "sha512-FIpuNaz5ow8VyrYcnXQTDRGvV6tTjkNtCK/RYNDXGSLlUD6cBuQTSw43CShGxjvfBTfcUA/r6UhUCbtYqkhcuQ==", - "dependencies": { - "@babel/types": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-plugin-utils": { - "version": "7.26.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.26.5.tgz", - "integrity": "sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-replace-supers": { - "version": "7.26.5", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.26.5.tgz", - "integrity": "sha512-bJ6iIVdYX1YooY2X7w1q6VITt+LnUILtNk7zT78ykuwStx8BauCzxvFqFaHjOpW1bVnSUM1PN1f0p5P21wHxvg==", - "dependencies": { - "@babel/helper-member-expression-to-functions": "^7.25.9", - "@babel/helper-optimise-call-expression": "^7.25.9", - "@babel/traverse": "^7.26.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.25.9.tgz", - "integrity": "sha512-K4Du3BFa3gvyhzgPcntrkDgZzQaq6uozzcpGbOO1OEJaI+EJdqWIMTLgFgQf6lrfiDFo5FU+BxKepI9RmZqahA==", - "dependencies": { - "@babel/traverse": "^7.25.9", - "@babel/types": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-string-parser": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz", - "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", - "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-option": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.25.9.tgz", - "integrity": "sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helpers": { - "version": "7.26.9", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.9.tgz", - "integrity": "sha512-Mz/4+y8udxBKdmzt/UjPACs4G3j5SshJJEFFKxlCGPydG4JAHXxjWjAwjd09tf6oINvl1VfMJo+nB7H2YKQ0dA==", - "dependencies": { - "@babel/template": "^7.26.9", - "@babel/types": "^7.26.9" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/parser": { - "version": "7.26.9", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.9.tgz", - "integrity": "sha512-81NWa1njQblgZbQHxWHpxxCzNsa3ZwvFqpUg7P+NNUU6f3UU2jBEg4OlF/J6rl8+PQGh1q6/zWScd001YwcA5A==", - "dependencies": { - "@babel/types": "^7.26.9" - }, - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/plugin-proposal-decorators": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.25.9.tgz", - "integrity": "sha512-smkNLL/O1ezy9Nhy4CNosc4Va+1wo5w4gzSZeLe6y6dM4mmHfYOCPolXQPHQxonZCF+ZyebxN9vqOolkYrSn5g==", - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9", - "@babel/plugin-syntax-decorators": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-decorators": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.25.9.tgz", - "integrity": "sha512-ryzI0McXUPJnRCvMo4lumIKZUzhYUO/ScI+Mz4YVaTLt04DHNSjEUjKVvbzQjZFLuod/cYEc07mJWhzl6v4DPg==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-import-attributes": { - "version": "7.26.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.26.0.tgz", - "integrity": "sha512-e2dttdsJ1ZTpi3B9UYGLw41hifAubg19AtCu/2I/F1QNVclOBr1dYpTdmdyZ84Xiz43BS/tCUkMAZNLv12Pi+A==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-import-meta": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", - "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-jsx": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.25.9.tgz", - "integrity": "sha512-ld6oezHQMZsZfp6pWtbjaNDF2tiiCYYDqQszHt5VV437lewP9aSi2Of99CK0D0XB21k7FLgnLcmQKyKzynfeAA==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-typescript": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.25.9.tgz", - "integrity": "sha512-hjMgRy5hb8uJJjUcdWunWVcoi9bGpJp8p5Ol1229PoN6aytsLwNMgmdftO23wnCLMfVmTwZDWMPNq/D1SY60JQ==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-typescript": { - "version": "7.26.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.26.8.tgz", - "integrity": "sha512-bME5J9AC8ChwA7aEPJ6zym3w7aObZULHhbNLU0bKUhKsAkylkzUdq+0kdymh9rzi8nlNFl2bmldFBCKNJBUpuw==", - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.25.9", - "@babel/helper-create-class-features-plugin": "^7.25.9", - "@babel/helper-plugin-utils": "^7.26.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9", - "@babel/plugin-syntax-typescript": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/standalone": { - "version": "7.26.9", - "resolved": "https://registry.npmjs.org/@babel/standalone/-/standalone-7.26.9.tgz", - "integrity": "sha512-UTeQKy0kzJwWRe55kT1uK4G9H6D0lS6G4207hCU/bDaOhA5t2aC0qHN6GmID0Axv3OFLNXm27NdqcWp+BXcGtA==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/template": { - "version": "7.26.9", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.26.9.tgz", - "integrity": "sha512-qyRplbeIpNZhmzOysF/wFMuP9sctmh2cFzRAZOn1YapxBsE1i9bJIY586R/WBLfLcmcBlM8ROBiQURnnNy+zfA==", - "dependencies": { - "@babel/code-frame": "^7.26.2", - "@babel/parser": "^7.26.9", - "@babel/types": "^7.26.9" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse": { - "version": "7.26.9", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.26.9.tgz", - "integrity": "sha512-ZYW7L+pL8ahU5fXmNbPF+iZFHCv5scFak7MZ9bwaRPLUhHh7QQEMjZUg0HevihoqCM5iSYHN61EyCoZvqC+bxg==", - "dependencies": { - "@babel/code-frame": "^7.26.2", - "@babel/generator": "^7.26.9", - "@babel/parser": "^7.26.9", - "@babel/template": "^7.26.9", - "@babel/types": "^7.26.9", - "debug": "^4.3.1", - "globals": "^11.1.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/types": { - "version": "7.26.9", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.9.tgz", - "integrity": "sha512-Y3IR1cRnOxOCDvMmNiym7XpXQ93iGDDPHx+Zj+NM+rg0fBaShfQLkg+hKPaZCEvg5N/LeCo4+Rj/i3FuJsIQaw==", - "dependencies": { - "@babel/helper-string-parser": "^7.25.9", - "@babel/helper-validator-identifier": "^7.25.9" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@cloudflare/kv-asset-handler": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/@cloudflare/kv-asset-handler/-/kv-asset-handler-0.3.4.tgz", - "integrity": "sha512-YLPHc8yASwjNkmcDMQMY35yiWjoKAKnhUbPRszBRS0YgH+IXtsMp61j+yTcnCE3oO2DgP0U3iejLC8FTtKDC8Q==", - "dependencies": { - "mime": "^3.0.0" - }, - "engines": { - "node": ">=16.13" - } - }, - "node_modules/@cloudflare/kv-asset-handler/node_modules/mime": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz", - "integrity": "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==", - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/@date-fns/utc": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@date-fns/utc/-/utc-2.1.0.tgz", - "integrity": "sha512-176grgAgU2U303rD2/vcOmNg0kGPbhzckuH1TEP2al7n0AQipZIy9P15usd2TKQCG1g+E1jX/ZVQSzs4sUDwgA==" - }, - "node_modules/@esbuild/aix-ppc64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.24.2.tgz", - "integrity": "sha512-thpVCb/rhxE/BnMLQ7GReQLLN8q9qbHmI55F4489/ByVg2aQaQ6kbcLb6FHkocZzQhxc4gx0sCk0tJkKBFzDhA==", - "cpu": [ - "ppc64" - ], - "optional": true, - "os": [ - "aix" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-arm": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.24.2.tgz", - "integrity": "sha512-tmwl4hJkCfNHwFB3nBa8z1Uy3ypZpxqxfTQOcHX+xRByyYgunVbZ9MzUUfb0RxaHIMnbHagwAxuTL+tnNM+1/Q==", - "cpu": [ - "arm" - ], - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-arm64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.24.2.tgz", - "integrity": "sha512-cNLgeqCqV8WxfcTIOeL4OAtSmL8JjcN6m09XIgro1Wi7cF4t/THaWEa7eL5CMoMBdjoHOTh/vwTO/o2TRXIyzg==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-x64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.24.2.tgz", - "integrity": "sha512-B6Q0YQDqMx9D7rvIcsXfmJfvUYLoP722bgfBlO5cGvNVb5V/+Y7nhBE3mHV9OpxBf4eAS2S68KZztiPaWq4XYw==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.24.2.tgz", - "integrity": "sha512-kj3AnYWc+CekmZnS5IPu9D+HWtUI49hbnyqk0FLEJDbzCIQt7hg7ucF1SQAilhtYpIujfaHr6O0UHlzzSPdOeA==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/darwin-x64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.24.2.tgz", - "integrity": "sha512-WeSrmwwHaPkNR5H3yYfowhZcbriGqooyu3zI/3GGpF8AyUdsrrP0X6KumITGA9WOyiJavnGZUwPGvxvwfWPHIA==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.24.2.tgz", - "integrity": "sha512-UN8HXjtJ0k/Mj6a9+5u6+2eZ2ERD7Edt1Q9IZiB5UZAIdPnVKDoG7mdTVGhHJIeEml60JteamR3qhsr1r8gXvg==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.24.2.tgz", - "integrity": "sha512-TvW7wE/89PYW+IevEJXZ5sF6gJRDY/14hyIGFXdIucxCsbRmLUcjseQu1SyTko+2idmCw94TgyaEZi9HUSOe3Q==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-arm": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.24.2.tgz", - "integrity": "sha512-n0WRM/gWIdU29J57hJyUdIsk0WarGd6To0s+Y+LwvlC55wt+GT/OgkwoXCXvIue1i1sSNWblHEig00GBWiJgfA==", - "cpu": [ - "arm" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-arm64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.24.2.tgz", - "integrity": "sha512-7HnAD6074BW43YvvUmE/35Id9/NB7BeX5EoNkK9obndmZBUk8xmJJeU7DwmUeN7tkysslb2eSl6CTrYz6oEMQg==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.24.2.tgz", - "integrity": "sha512-sfv0tGPQhcZOgTKO3oBE9xpHuUqguHvSo4jl+wjnKwFpapx+vUDcawbwPNuBIAYdRAvIDBfZVvXprIj3HA+Ugw==", - "cpu": [ - "ia32" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.24.2.tgz", - "integrity": "sha512-CN9AZr8kEndGooS35ntToZLTQLHEjtVB5n7dl8ZcTZMonJ7CCfStrYhrzF97eAecqVbVJ7APOEe18RPI4KLhwQ==", - "cpu": [ - "loong64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.24.2.tgz", - "integrity": "sha512-iMkk7qr/wl3exJATwkISxI7kTcmHKE+BlymIAbHO8xanq/TjHaaVThFF6ipWzPHryoFsesNQJPE/3wFJw4+huw==", - "cpu": [ - "mips64el" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.24.2.tgz", - "integrity": "sha512-shsVrgCZ57Vr2L8mm39kO5PPIb+843FStGt7sGGoqiiWYconSxwTiuswC1VJZLCjNiMLAMh34jg4VSEQb+iEbw==", - "cpu": [ - "ppc64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.24.2.tgz", - "integrity": "sha512-4eSFWnU9Hhd68fW16GD0TINewo1L6dRrB+oLNNbYyMUAeOD2yCK5KXGK1GH4qD/kT+bTEXjsyTCiJGHPZ3eM9Q==", - "cpu": [ - "riscv64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.24.2.tgz", - "integrity": "sha512-S0Bh0A53b0YHL2XEXC20bHLuGMOhFDO6GN4b3YjRLK//Ep3ql3erpNcPlEFed93hsQAjAQDNsvcK+hV90FubSw==", - "cpu": [ - "s390x" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-x64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.24.2.tgz", - "integrity": "sha512-8Qi4nQcCTbLnK9WoMjdC9NiTG6/E38RNICU6sUNqK0QFxCYgoARqVqxdFmWkdonVsvGqWhmm7MO0jyTqLqwj0Q==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/netbsd-arm64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.24.2.tgz", - "integrity": "sha512-wuLK/VztRRpMt9zyHSazyCVdCXlpHkKm34WUyinD2lzK07FAHTq0KQvZZlXikNWkDGoT6x3TD51jKQ7gMVpopw==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/netbsd-x64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.24.2.tgz", - "integrity": "sha512-VefFaQUc4FMmJuAxmIHgUmfNiLXY438XrL4GDNV1Y1H/RW3qow68xTwjZKfj/+Plp9NANmzbH5R40Meudu8mmw==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openbsd-arm64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.24.2.tgz", - "integrity": "sha512-YQbi46SBct6iKnszhSvdluqDmxCJA+Pu280Av9WICNwQmMxV7nLRHZfjQzwbPs3jeWnuAhE9Jy0NrnJ12Oz+0A==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openbsd-x64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.24.2.tgz", - "integrity": "sha512-+iDS6zpNM6EnJyWv0bMGLWSWeXGN/HTaF/LXHXHwejGsVi+ooqDfMCCTerNFxEkM3wYVcExkeGXNqshc9iMaOA==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/sunos-x64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.24.2.tgz", - "integrity": "sha512-hTdsW27jcktEvpwNHJU4ZwWFGkz2zRJUz8pvddmXPtXDzVKTTINmlmga3ZzwcuMpUvLw7JkLy9QLKyGpD2Yxig==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-arm64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.24.2.tgz", - "integrity": "sha512-LihEQ2BBKVFLOC9ZItT9iFprsE9tqjDjnbulhHoFxYQtQfai7qfluVODIYxt1PgdoyQkz23+01rzwNwYfutxUQ==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-ia32": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.24.2.tgz", - "integrity": "sha512-q+iGUwfs8tncmFC9pcnD5IvRHAzmbwQ3GPS5/ceCyHdjXubwQWI12MKWSNSMYLJMq23/IUCvJMS76PDqXe1fxA==", - "cpu": [ - "ia32" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-x64": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.24.2.tgz", - "integrity": "sha512-7VTgWzgMGvup6aSqDPLiW5zHaxYJGTO4OokMjIlrCtf+VpEL+cXKtCvg723iguPYI5oaUNdS+/V7OU2gvXVWEg==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@fontsource/open-sans": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/@fontsource/open-sans/-/open-sans-5.1.1.tgz", - "integrity": "sha512-Wfio5om0XH24ZUu6FfW4r50e4xLdoLzvd8midtqUFT2unniyWQj6GJ05RW1YQsHp4Sug3i+agFBIxEmYQzUHSg==" - }, - "node_modules/@iconify-json/carbon": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/@iconify-json/carbon/-/carbon-1.2.7.tgz", - "integrity": "sha512-nqEjicnNdb3CnY21MsTr9DfU8JBkP9C8hup1bCe4zvpLKjcU9YRmYChUbqZYBP4P+BL5NdrprTSN+B7qJg3H3Q==", - "dependencies": { - "@iconify/types": "*" - } - }, - "node_modules/@iconify-json/logos": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@iconify-json/logos/-/logos-1.2.4.tgz", - "integrity": "sha512-XC4If5D/hbaZvUkTV8iaZuGlQCyG6CNOlaAaJaGa13V5QMYwYjgtKk3vPP8wz3wtTVNVEVk3LRx1fOJz+YnSMw==", - "dependencies": { - "@iconify/types": "*" - } - }, - "node_modules/@iconify-json/ri": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/@iconify-json/ri/-/ri-1.2.5.tgz", - "integrity": "sha512-kWGimOXMZrlYusjBKKXYOWcKhbOHusFsmrmRGmjS7rH0BpML5A9/fy8KHZqFOwZfC4M6amObQYbh8BqO5cMC3w==", - "dependencies": { - "@iconify/types": "*" - } - }, - "node_modules/@iconify-json/tabler": { - "version": "1.2.16", - "resolved": "https://registry.npmjs.org/@iconify-json/tabler/-/tabler-1.2.16.tgz", - "integrity": "sha512-gjvKz38+aOxfZtRvycYrASYipCsHRbCZ/Df49T0tfPntT0ur+qsgJ7PxCM4JF/Xs6+n3JkaFdiUz/N4ZZxDKdQ==", - "dependencies": { - "@iconify/types": "*" - } - }, - "node_modules/@iconify/types": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@iconify/types/-/types-2.0.0.tgz", - "integrity": "sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==" - }, - "node_modules/@iconify/utils": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@iconify/utils/-/utils-2.3.0.tgz", - "integrity": "sha512-GmQ78prtwYW6EtzXRU1rY+KwOKfz32PD7iJh6Iyqw68GiKuoZ2A6pRtzWONz5VQJbp50mEjXh/7NkumtrAgRKA==", - "dependencies": { - "@antfu/install-pkg": "^1.0.0", - "@antfu/utils": "^8.1.0", - "@iconify/types": "^2.0.0", - "debug": "^4.4.0", - "globals": "^15.14.0", - "kolorist": "^1.8.0", - "local-pkg": "^1.0.0", - "mlly": "^1.7.4" - } - }, - "node_modules/@iconify/utils/node_modules/@antfu/utils": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/@antfu/utils/-/utils-8.1.1.tgz", - "integrity": "sha512-Mex9nXf9vR6AhcXmMrlz/HVgYYZpVGJ6YlPgwl7UnaFpnshXs6EK/oa5Gpf3CzENMjkvEx2tQtntGnb7UtSTOQ==", - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/@iconify/utils/node_modules/globals": { - "version": "15.15.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-15.15.0.tgz", - "integrity": "sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@iconify/utils/node_modules/local-pkg": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-1.0.0.tgz", - "integrity": "sha512-bbgPw/wmroJsil/GgL4qjDzs5YLTBMQ99weRsok1XCDccQeehbHA/I1oRvk2NPtr7KGZgT/Y5tPRnAtMqeG2Kg==", - "dependencies": { - "mlly": "^1.7.3", - "pkg-types": "^1.3.0" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/@intlify/bundle-utils": { - "version": "7.5.1", - "resolved": "https://registry.npmjs.org/@intlify/bundle-utils/-/bundle-utils-7.5.1.tgz", - "integrity": "sha512-UovJl10oBIlmYEcWw+VIHdKY5Uv5sdPG0b/b6bOYxGLln3UwB75+2dlc0F3Fsa0RhoznQ5Rp589/BZpABpE4Xw==", - "dev": true, - "dependencies": { - "@intlify/message-compiler": "^9.4.0", - "@intlify/shared": "^9.4.0", - "acorn": "^8.8.2", - "escodegen": "^2.1.0", - "estree-walker": "^2.0.2", - "jsonc-eslint-parser": "^2.3.0", - "magic-string": "^0.30.0", - "mlly": "^1.2.0", - "source-map-js": "^1.0.1", - "yaml-eslint-parser": "^1.2.2" - }, - "engines": { - "node": ">= 14.16" - }, - "peerDependenciesMeta": { - "petite-vue-i18n": { - "optional": true - }, - "vue-i18n": { - "optional": true - } - } - }, - "node_modules/@intlify/bundle-utils/node_modules/estree-walker": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", - "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", - "dev": true - }, - "node_modules/@intlify/core": { - "version": "9.14.2", - "resolved": "https://registry.npmjs.org/@intlify/core/-/core-9.14.2.tgz", - "integrity": "sha512-/YsYOtRdKn2RbIz9FjYdb4ZntcB7hJmlfHjMRrRXOH2rJE9T5kdYCTS+LS75xQkRCeHFdAmjGMADuoy4HYpHfA==", - "dev": true, - "dependencies": { - "@intlify/core-base": "9.14.2", - "@intlify/shared": "9.14.2" - }, - "engines": { - "node": ">= 16" - }, - "funding": { - "url": "https://github.com/sponsors/kazupon" - } - }, - "node_modules/@intlify/core-base": { - "version": "9.14.2", - "resolved": "https://registry.npmjs.org/@intlify/core-base/-/core-base-9.14.2.tgz", - "integrity": "sha512-DZyQ4Hk22sC81MP4qiCDuU+LdaYW91A6lCjq8AWPvY3+mGMzhGDfOCzvyR6YBQxtlPjFqMoFk9ylnNYRAQwXtQ==", - "dev": true, - "dependencies": { - "@intlify/message-compiler": "9.14.2", - "@intlify/shared": "9.14.2" - }, - "engines": { - "node": ">= 16" - }, - "funding": { - "url": "https://github.com/sponsors/kazupon" - } - }, - "node_modules/@intlify/h3": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/@intlify/h3/-/h3-0.5.0.tgz", - "integrity": "sha512-cgfrtD3qu3BPJ47gfZ35J2LJpI64Riic0K8NGgid5ilyPXRQTNY7mXlT/B+HZYQg1hmBxKa5G5HJXyAZ4R2H5A==", - "dev": true, - "dependencies": { - "@intlify/core": "^9.8.0", - "@intlify/utils": "^0.12.0" - }, - "engines": { - "node": ">= 18" - }, - "funding": { - "url": "https://github.com/sponsors/kazupon" - } - }, - "node_modules/@intlify/message-compiler": { - "version": "9.14.2", - "resolved": "https://registry.npmjs.org/@intlify/message-compiler/-/message-compiler-9.14.2.tgz", - "integrity": "sha512-YsKKuV4Qv4wrLNsvgWbTf0E40uRv+Qiw1BeLQ0LAxifQuhiMe+hfTIzOMdWj/ZpnTDj4RSZtkXjJM7JDiiB5LQ==", - "dev": true, - "dependencies": { - "@intlify/shared": "9.14.2", - "source-map-js": "^1.0.2" - }, - "engines": { - "node": ">= 16" - }, - "funding": { - "url": "https://github.com/sponsors/kazupon" - } - }, - "node_modules/@intlify/shared": { - "version": "9.14.2", - "resolved": "https://registry.npmjs.org/@intlify/shared/-/shared-9.14.2.tgz", - "integrity": "sha512-uRAHAxYPeF+G5DBIboKpPgC/Waecd4Jz8ihtkpJQD5ycb5PwXp0k/+hBGl5dAjwF7w+l74kz/PKA8r8OK//RUw==", - "dev": true, - "engines": { - "node": ">= 16" - }, - "funding": { - "url": "https://github.com/sponsors/kazupon" - } - }, - "node_modules/@intlify/unplugin-vue-i18n": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@intlify/unplugin-vue-i18n/-/unplugin-vue-i18n-3.0.1.tgz", - "integrity": "sha512-q1zJhA/WpoLBzAAuKA5/AEp0e+bMOM10ll/HxT4g1VAw/9JhC4TTobP9KobKH90JMZ4U2daLFlYQfKNd29lpqw==", - "dev": true, - "dependencies": { - "@intlify/bundle-utils": "^7.4.0", - "@intlify/shared": "^9.4.0", - "@rollup/pluginutils": "^5.1.0", - "@vue/compiler-sfc": "^3.2.47", - "debug": "^4.3.3", - "fast-glob": "^3.2.12", - "js-yaml": "^4.1.0", - "json5": "^2.2.3", - "pathe": "^1.0.0", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.2", - "unplugin": "^1.1.0" - }, - "engines": { - "node": ">= 14.16" - }, - "peerDependencies": { - "petite-vue-i18n": "*", - "vue-i18n": "*", - "vue-i18n-bridge": "*" - }, - "peerDependenciesMeta": { - "petite-vue-i18n": { - "optional": true - }, - "vue-i18n": { - "optional": true - }, - "vue-i18n-bridge": { - "optional": true - } - } - }, - "node_modules/@intlify/unplugin-vue-i18n/node_modules/pathe": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz", - "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==", - "dev": true - }, - "node_modules/@intlify/utils": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/@intlify/utils/-/utils-0.12.0.tgz", - "integrity": "sha512-yCBNcuZQ49iInqmWC2xfW0rgEQyNtCM8C8KcWKTXxyscgUE1+48gjLgZZqP75MjhlApxwph7ZMWLqyABkSgxQA==", - "dev": true, - "engines": { - "node": ">= 18" - }, - "funding": { - "url": "https://github.com/sponsors/kazupon" - } - }, - "node_modules/@ioredis/commands": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@ioredis/commands/-/commands-1.2.0.tgz", - "integrity": "sha512-Sx1pU8EM64o2BrqNpEO1CNLtKQwyhuXuqyfH7oGKCk+1a33d2r5saW8zNwm3j6BTExtjrv2BxTgzzkMwts6vGg==" - }, - "node_modules/@isaacs/cliui": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", - "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", - "dependencies": { - "string-width": "^5.1.2", - "string-width-cjs": "npm:string-width@^4.2.0", - "strip-ansi": "^7.0.1", - "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", - "wrap-ansi": "^8.1.0", - "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@isaacs/cliui/node_modules/ansi-regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/@isaacs/cliui/node_modules/ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@isaacs/cliui/node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" - }, - "node_modules/@isaacs/cliui/node_modules/string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@isaacs/cliui/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", - "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", - "dependencies": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/@isaacs/fs-minipass": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz", - "integrity": "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==", - "dependencies": { - "minipass": "^7.0.4" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@isaacs/fs-minipass/node_modules/minipass": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", - "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz", - "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==", - "dependencies": { - "@jridgewell/set-array": "^1.2.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.24" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/set-array": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", - "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/source-map": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz", - "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.25" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", - "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==" - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.25", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", - "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "node_modules/@kurkle/color": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/@kurkle/color/-/color-0.3.4.tgz", - "integrity": "sha512-M5UknZPHRu3DEDWoipU6sE8PdkZ6Z/S+v4dD+Ke8IaNlpdSQah50lz1KtcFBa2vsdOnwbbnxJwVM4wty6udA5w==" - }, - "node_modules/@kwsites/file-exists": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@kwsites/file-exists/-/file-exists-1.1.1.tgz", - "integrity": "sha512-m9/5YGR18lIwxSFDwfE3oA7bWuq9kdau6ugN4H2rJeyhFQZcG9AgSHkQtSD15a8WvTgfz9aikZMrKPHvbpqFiw==", - "dependencies": { - "debug": "^4.1.1" - } - }, - "node_modules/@kwsites/promise-deferred": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@kwsites/promise-deferred/-/promise-deferred-1.1.1.tgz", - "integrity": "sha512-GaHYm+c0O9MjZRu0ongGBRbinu8gVAMd2UZjji6jVmqKtZluZnptXGWhz1E8j8D2HJ3f/yMxKAUC0b+57wncIw==" - }, - "node_modules/@mapbox/node-pre-gyp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-2.0.0.tgz", - "integrity": "sha512-llMXd39jtP0HpQLVI37Bf1m2ADlEb35GYSh1SDSLsBhR+5iCxiNGlT31yqbNtVHygHAtMy6dWFERpU2JgufhPg==", - "dependencies": { - "consola": "^3.2.3", - "detect-libc": "^2.0.0", - "https-proxy-agent": "^7.0.5", - "node-fetch": "^2.6.7", - "nopt": "^8.0.0", - "semver": "^7.5.3", - "tar": "^7.4.0" - }, - "bin": { - "node-pre-gyp": "bin/node-pre-gyp" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@mapbox/node-pre-gyp/node_modules/chownr": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz", - "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==", - "engines": { - "node": ">=18" - } - }, - "node_modules/@mapbox/node-pre-gyp/node_modules/detect-libc": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz", - "integrity": "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==", - "engines": { - "node": ">=8" - } - }, - "node_modules/@mapbox/node-pre-gyp/node_modules/minipass": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", - "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/@mapbox/node-pre-gyp/node_modules/minizlib": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.0.1.tgz", - "integrity": "sha512-umcy022ILvb5/3Djuu8LWeqUa8D68JaBzlttKeMWen48SjabqS3iY5w/vzeMzMUNhLDifyhbOwKDSznB1vvrwg==", - "dependencies": { - "minipass": "^7.0.4", - "rimraf": "^5.0.5" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/@mapbox/node-pre-gyp/node_modules/mkdirp": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-3.0.1.tgz", - "integrity": "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==", - "bin": { - "mkdirp": "dist/cjs/src/bin.js" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@mapbox/node-pre-gyp/node_modules/tar": { - "version": "7.4.3", - "resolved": "https://registry.npmjs.org/tar/-/tar-7.4.3.tgz", - "integrity": "sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw==", - "dependencies": { - "@isaacs/fs-minipass": "^4.0.0", - "chownr": "^3.0.0", - "minipass": "^7.1.2", - "minizlib": "^3.0.1", - "mkdirp": "^3.0.1", - "yallist": "^5.0.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@mapbox/node-pre-gyp/node_modules/yallist": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz", - "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==", - "engines": { - "node": ">=18" - } - }, - "node_modules/@mdi/font": { - "version": "7.4.47", - "resolved": "https://registry.npmjs.org/@mdi/font/-/font-7.4.47.tgz", - "integrity": "sha512-43MtGpd585SNzHZPcYowu/84Vz2a2g31TvPMTm9uTiCSWzaheQySUcSyUH/46fPnuPQWof2yd0pGBtzee/IQWw==" - }, - "node_modules/@miyaneee/rollup-plugin-json5": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@miyaneee/rollup-plugin-json5/-/rollup-plugin-json5-1.2.0.tgz", - "integrity": "sha512-JjTIaXZp9WzhUHpElrqPnl1AzBi/rvRs065F71+aTmlqvTMVkdbjZ8vfFl4nRlgJy+TPBw69ZK4pwFdmOAt4aA==", - "dev": true, - "dependencies": { - "@rollup/pluginutils": "^5.1.0", - "json5": "^2.2.3" - }, - "peerDependencies": { - "rollup": "^1.20.0 || ^2.0.0 || ^3.0.0 || ^4.0.0" - } - }, - "node_modules/@mswjs/interceptors": { - "version": "0.28.4", - "resolved": "https://registry.npmjs.org/@mswjs/interceptors/-/interceptors-0.28.4.tgz", - "integrity": "sha512-xQpXZswUUG+V+7bD/L2hZUC5mvxW1BPba2yI5yhRq+IpEXFPEGYzUuJUuvJBELyG7RLCxgrOjmqzeE5hgqa0aQ==", - "dependencies": { - "@open-draft/deferred-promise": "^2.2.0", - "@open-draft/logger": "^0.3.0", - "@open-draft/until": "^2.0.0", - "is-node-process": "^1.2.0", - "outvariant": "^1.2.1", - "strict-event-emitter": "^0.5.1" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@netlify/functions": { - "version": "2.8.2", - "resolved": "https://registry.npmjs.org/@netlify/functions/-/functions-2.8.2.tgz", - "integrity": "sha512-DeoAQh8LuNPvBE4qsKlezjKj0PyXDryOFJfJKo3Z1qZLKzQ21sT314KQKPVjfvw6knqijj+IO+0kHXy/TJiqNA==", - "dependencies": { - "@netlify/serverless-functions-api": "1.26.1" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@netlify/node-cookies": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/@netlify/node-cookies/-/node-cookies-0.1.0.tgz", - "integrity": "sha512-OAs1xG+FfLX0LoRASpqzVntVV/RpYkgpI0VrUnw2u0Q1qiZUzcPffxRK8HF3gc4GjuhG5ahOEMJ9bswBiZPq0g==", - "engines": { - "node": "^14.16.0 || >=16.0.0" - } - }, - "node_modules/@netlify/serverless-functions-api": { - "version": "1.26.1", - "resolved": "https://registry.npmjs.org/@netlify/serverless-functions-api/-/serverless-functions-api-1.26.1.tgz", - "integrity": "sha512-q3L9i3HoNfz0SGpTIS4zTcKBbRkxzCRpd169eyiTuk3IwcPC3/85mzLHranlKo2b+HYT0gu37YxGB45aD8A3Tw==", - "dependencies": { - "@netlify/node-cookies": "^0.1.0", - "urlpattern-polyfill": "8.0.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nuxt/cli": { - "version": "3.22.2", - "resolved": "https://registry.npmjs.org/@nuxt/cli/-/cli-3.22.2.tgz", - "integrity": "sha512-Xtu3Loe3fVLvOE1/NC/SrE6Buu7Aj6qrnu3hewAfamUyZ7mVUBOsJ5ScUhofSK2L6muGPvS3R1PisuJMFbdexg==", - "dependencies": { - "c12": "^2.0.2", - "chokidar": "^4.0.3", - "citty": "^0.1.6", - "clipboardy": "^4.0.0", - "consola": "^3.4.0", - "defu": "^6.1.4", - "fuse.js": "^7.1.0", - "giget": "^1.2.4", - "h3": "^1.15.0", - "httpxy": "^0.1.7", - "jiti": "^2.4.2", - "listhen": "^1.9.0", - "nypm": "^0.5.2", - "ofetch": "^1.4.1", - "ohash": "^2.0.2", - "pathe": "^2.0.3", - "perfect-debounce": "^1.0.0", - "pkg-types": "^1.3.1", - "scule": "^1.3.0", - "semver": "^7.7.1", - "std-env": "^3.8.0", - "tinyexec": "^0.3.2", - "ufo": "^1.5.4" - }, - "bin": { - "nuxi": "bin/nuxi.mjs", - "nuxi-ng": "bin/nuxi.mjs", - "nuxt": "bin/nuxi.mjs", - "nuxt-cli": "bin/nuxi.mjs" - }, - "engines": { - "node": "^16.10.0 || >=18.0.0" - } - }, - "node_modules/@nuxt/cli/node_modules/ohash": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/ohash/-/ohash-2.0.4.tgz", - "integrity": "sha512-ac+SFwzhdHb0hp48/dbR7Jta39qfbuj7t3hApd9uyHS8bisHTfVzSEvjOVgV0L3zG7VR2/7JjkSGimP75D+hOQ==" - }, - "node_modules/@nuxt/devalue": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@nuxt/devalue/-/devalue-2.0.2.tgz", - "integrity": "sha512-GBzP8zOc7CGWyFQS6dv1lQz8VVpz5C2yRszbXufwG/9zhStTIH50EtD87NmWbTMwXDvZLNg8GIpb1UFdH93JCA==" - }, - "node_modules/@nuxt/devtools": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@nuxt/devtools/-/devtools-1.7.0.tgz", - "integrity": "sha512-uvnjt5Zowkz7tZmnks2cGreg1XZIiSyVzQ2MYiRXACodlXcwJ0dpUS3WTxu8BR562K+772oRdvKie9AQlyZUgg==", - "dependencies": { - "@antfu/utils": "^0.7.10", - "@nuxt/devtools-kit": "1.7.0", - "@nuxt/devtools-wizard": "1.7.0", - "@nuxt/kit": "^3.15.0", - "@vue/devtools-core": "7.6.8", - "@vue/devtools-kit": "7.6.8", - "birpc": "^0.2.19", - "consola": "^3.3.1", - "cronstrue": "^2.52.0", - "destr": "^2.0.3", - "error-stack-parser-es": "^0.1.5", - "execa": "^7.2.0", - "fast-npm-meta": "^0.2.2", - "flatted": "^3.3.2", - "get-port-please": "^3.1.2", - "hookable": "^5.5.3", - "image-meta": "^0.2.1", - "is-installed-globally": "^1.0.0", - "launch-editor": "^2.9.1", - "local-pkg": "^0.5.1", - "magicast": "^0.3.5", - "nypm": "^0.4.1", - "ohash": "^1.1.4", - "pathe": "^1.1.2", - "perfect-debounce": "^1.0.0", - "pkg-types": "^1.2.1", - "rc9": "^2.1.2", - "scule": "^1.3.0", - "semver": "^7.6.3", - "simple-git": "^3.27.0", - "sirv": "^3.0.0", - "tinyglobby": "^0.2.10", - "unimport": "^3.14.5", - "vite-plugin-inspect": "~0.8.9", - "vite-plugin-vue-inspector": "^5.3.1", - "which": "^3.0.1", - "ws": "^8.18.0" - }, - "bin": { - "devtools": "cli.mjs" - }, - "peerDependencies": { - "vite": "*" - } - }, - "node_modules/@nuxt/devtools-kit": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@nuxt/devtools-kit/-/devtools-kit-1.7.0.tgz", - "integrity": "sha512-+NgZ2uP5BuneqvQbe7EdOEaFEDy8762c99pLABtn7/Ur0ExEsQJMP7pYjjoTfKubhBqecr5Vo9yHkPBj1eHulQ==", - "dependencies": { - "@nuxt/kit": "^3.15.0", - "@nuxt/schema": "^3.15.0", - "execa": "^7.2.0" - }, - "peerDependencies": { - "vite": "*" - } - }, - "node_modules/@nuxt/devtools-ui-kit": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@nuxt/devtools-ui-kit/-/devtools-ui-kit-1.7.0.tgz", - "integrity": "sha512-pYjwCP3FHz/rrEoJpb8plMinnPHRh+fFc90O+MncMC0aIGydtu4SGwAE3fZsg//JXqkvlY+JyozxqtF9IRA7rA==", - "dependencies": { - "@iconify-json/carbon": "^1.2.5", - "@iconify-json/logos": "^1.2.4", - "@iconify-json/ri": "^1.2.5", - "@iconify-json/tabler": "^1.2.13", - "@nuxt/devtools-kit": "1.7.0", - "@nuxt/kit": "^3.15.0", - "@unocss/core": "^0.65.3", - "@unocss/nuxt": "^0.65.3", - "@unocss/preset-attributify": "^0.65.3", - "@unocss/preset-icons": "^0.65.3", - "@unocss/preset-mini": "^0.65.3", - "@unocss/reset": "^0.65.3", - "@vueuse/core": "^12.2.0", - "@vueuse/integrations": "^12.2.0", - "@vueuse/nuxt": "^12.2.0", - "defu": "^6.1.4", - "focus-trap": "^7.6.2", - "splitpanes": "^3.1.5", - "unocss": "^0.65.3", - "v-lazy-show": "^0.3.0" - }, - "peerDependencies": { - "@nuxt/devtools": "1.7.0" - } - }, - "node_modules/@nuxt/devtools-wizard": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@nuxt/devtools-wizard/-/devtools-wizard-1.7.0.tgz", - "integrity": "sha512-86Gd92uEw0Dh2ErIYT9TMIrMOISE96fCRN4rxeryTvyiowQOsyrbkCeMNYrEehoRL+lohoyK6iDmFajadPNwWQ==", - "dependencies": { - "consola": "^3.3.1", - "diff": "^7.0.0", - "execa": "^7.2.0", - "global-directory": "^4.0.1", - "magicast": "^0.3.5", - "pathe": "^1.1.2", - "pkg-types": "^1.2.1", - "prompts": "^2.4.2", - "rc9": "^2.1.2", - "semver": "^7.6.3" - }, - "bin": { - "devtools-wizard": "cli.mjs" - } - }, - "node_modules/@nuxt/devtools-wizard/node_modules/pathe": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz", - "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==" - }, - "node_modules/@nuxt/devtools/node_modules/js-tokens": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-9.0.1.tgz", - "integrity": "sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==" - }, - "node_modules/@nuxt/devtools/node_modules/nypm": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/nypm/-/nypm-0.4.1.tgz", - "integrity": "sha512-1b9mihliBh8UCcKtcGRu//G50iHpjxIQVUqkdhPT/SDVE7KdJKoHXLS0heuYTQCx95dFqiyUbXZB9r8ikn+93g==", - "dependencies": { - "citty": "^0.1.6", - "consola": "^3.2.3", - "pathe": "^1.1.2", - "pkg-types": "^1.2.1", - "tinyexec": "^0.3.1", - "ufo": "^1.5.4" - }, - "bin": { - "nypm": "dist/cli.mjs" - }, - "engines": { - "node": "^14.16.0 || >=16.10.0" - } - }, - "node_modules/@nuxt/devtools/node_modules/pathe": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz", - "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==" - }, - "node_modules/@nuxt/devtools/node_modules/sirv": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/sirv/-/sirv-3.0.1.tgz", - "integrity": "sha512-FoqMu0NCGBLCcAkS1qA+XJIQTR6/JHfQXl+uGteNCQ76T91DMUjPa9xfmeqMY3z80nLSg9yQmNjK0Px6RWsH/A==", - "dependencies": { - "@polka/url": "^1.0.0-next.24", - "mrmime": "^2.0.0", - "totalist": "^3.0.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@nuxt/devtools/node_modules/strip-literal": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-2.1.1.tgz", - "integrity": "sha512-631UJ6O00eNGfMiWG78ck80dfBab8X6IVFB51jZK5Icd7XAs60Z5y7QdSd/wGIklnWvRbUNloVzhOKKmutxQ6Q==", - "dependencies": { - "js-tokens": "^9.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/@nuxt/devtools/node_modules/unimport": { - "version": "3.14.6", - "resolved": "https://registry.npmjs.org/unimport/-/unimport-3.14.6.tgz", - "integrity": "sha512-CYvbDaTT04Rh8bmD8jz3WPmHYZRG/NnvYVzwD6V1YAlvvKROlAeNDUBhkBGzNav2RKaeuXvlWYaa1V4Lfi/O0g==", - "dependencies": { - "@rollup/pluginutils": "^5.1.4", - "acorn": "^8.14.0", - "escape-string-regexp": "^5.0.0", - "estree-walker": "^3.0.3", - "fast-glob": "^3.3.3", - "local-pkg": "^1.0.0", - "magic-string": "^0.30.17", - "mlly": "^1.7.4", - "pathe": "^2.0.1", - "picomatch": "^4.0.2", - "pkg-types": "^1.3.0", - "scule": "^1.3.0", - "strip-literal": "^2.1.1", - "unplugin": "^1.16.1" - } - }, - "node_modules/@nuxt/devtools/node_modules/unimport/node_modules/local-pkg": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-1.0.0.tgz", - "integrity": "sha512-bbgPw/wmroJsil/GgL4qjDzs5YLTBMQ99weRsok1XCDccQeehbHA/I1oRvk2NPtr7KGZgT/Y5tPRnAtMqeG2Kg==", - "dependencies": { - "mlly": "^1.7.3", - "pkg-types": "^1.3.0" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/@nuxt/devtools/node_modules/unimport/node_modules/pathe": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", - "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==" - }, - "node_modules/@nuxt/devtools/node_modules/which": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/which/-/which-3.0.1.tgz", - "integrity": "sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg==", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/which.js" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/@nuxt/kit": { - "version": "3.15.4", - "resolved": "https://registry.npmjs.org/@nuxt/kit/-/kit-3.15.4.tgz", - "integrity": "sha512-dr7I7eZOoRLl4uxdxeL2dQsH0OrbEiVPIyBHnBpA4co24CBnoJoF+JINuP9l3PAM3IhUzc5JIVq3/YY3lEc3Hw==", - "dependencies": { - "c12": "^2.0.1", - "consola": "^3.4.0", - "defu": "^6.1.4", - "destr": "^2.0.3", - "globby": "^14.0.2", - "ignore": "^7.0.3", - "jiti": "^2.4.2", - "klona": "^2.0.6", - "knitwork": "^1.2.0", - "mlly": "^1.7.4", - "ohash": "^1.1.4", - "pathe": "^2.0.2", - "pkg-types": "^1.3.1", - "scule": "^1.3.0", - "semver": "^7.6.3", - "std-env": "^3.8.0", - "ufo": "^1.5.4", - "unctx": "^2.4.1", - "unimport": "^4.0.0", - "untyped": "^1.5.2" - }, - "engines": { - "node": ">=18.12.0" - } - }, - "node_modules/@nuxt/schema": { - "version": "3.15.4", - "resolved": "https://registry.npmjs.org/@nuxt/schema/-/schema-3.15.4.tgz", - "integrity": "sha512-pAYZb/3ocSC/db1EFd5y+otmgHqUkvfxfhd9EknDB5DygnJuOIQNuGJ7LMJM6S2c0DYgBIHOdEelLxKHOjwbgQ==", - "dependencies": { - "consola": "^3.4.0", - "defu": "^6.1.4", - "pathe": "^2.0.2", - "std-env": "^3.8.0" - }, - "engines": { - "node": "^14.18.0 || >=16.10.0" - } - }, - "node_modules/@nuxt/telemetry": { - "version": "2.6.5", - "resolved": "https://registry.npmjs.org/@nuxt/telemetry/-/telemetry-2.6.5.tgz", - "integrity": "sha512-lwMp9OHML/m0mjh7P5iz9PxINnk5smGkGebh88Wh8PjvnRooY1TBsbyq7mlSrNibpwD1BkwqhV5IAZOXWHLxMQ==", - "dependencies": { - "@nuxt/kit": "^3.15.4", - "citty": "^0.1.6", - "consola": "^3.4.0", - "destr": "^2.0.3", - "dotenv": "^16.4.7", - "git-url-parse": "^16.0.0", - "is-docker": "^3.0.0", - "ofetch": "^1.4.1", - "package-manager-detector": "^0.2.9", - "parse-git-config": "^3.0.0", - "pathe": "^2.0.2", - "rc9": "^2.1.2", - "std-env": "^3.8.0" - }, - "bin": { - "nuxt-telemetry": "bin/nuxt-telemetry.mjs" - }, - "engines": { - "node": ">=18.12.0" - } - }, - "node_modules/@nuxt/vite-builder": { - "version": "3.15.4", - "resolved": "https://registry.npmjs.org/@nuxt/vite-builder/-/vite-builder-3.15.4.tgz", - "integrity": "sha512-yBK6tWT973+ExKC3ciTWymZpjJ+enToOtYz574kXCyGO0PbSnuXdoJKTvrwXw1lK97PajCKxExlmwI/3oLOmMQ==", - "dependencies": { - "@nuxt/kit": "3.15.4", - "@rollup/plugin-replace": "^6.0.2", - "@vitejs/plugin-vue": "^5.2.1", - "@vitejs/plugin-vue-jsx": "^4.1.1", - "autoprefixer": "^10.4.20", - "consola": "^3.4.0", - "cssnano": "^7.0.6", - "defu": "^6.1.4", - "esbuild": "^0.24.2", - "escape-string-regexp": "^5.0.0", - "externality": "^1.0.2", - "get-port-please": "^3.1.2", - "h3": "^1.14.0", - "jiti": "^2.4.2", - "knitwork": "^1.2.0", - "magic-string": "^0.30.17", - "mlly": "^1.7.4", - "ohash": "^1.1.4", - "pathe": "^2.0.2", - "perfect-debounce": "^1.0.0", - "pkg-types": "^1.3.1", - "postcss": "^8.5.1", - "rollup-plugin-visualizer": "^5.13.1", - "std-env": "^3.8.0", - "ufo": "^1.5.4", - "unenv": "^1.10.0", - "unplugin": "^2.1.2", - "vite": "^6.0.11", - "vite-node": "^3.0.4", - "vite-plugin-checker": "^0.8.0", - "vue-bundle-renderer": "^2.1.1" - }, - "engines": { - "node": "^18.12.0 || ^20.9.0 || >=22.0.0" - }, - "peerDependencies": { - "vue": "^3.3.4" - } - }, - "node_modules/@nuxt/vite-builder/node_modules/unplugin": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-2.2.0.tgz", - "integrity": "sha512-m1ekpSwuOT5hxkJeZGRxO7gXbXT3gF26NjQ7GdVHoLoF8/nopLcd/QfPigpCy7i51oFHiRJg/CyHhj4vs2+KGw==", - "dependencies": { - "acorn": "^8.14.0", - "webpack-virtual-modules": "^0.6.2" - }, - "engines": { - "node": ">=18.12.0" - } - }, - "node_modules/@nuxtjs/i18n": { - "version": "8.5.6", - "resolved": "https://registry.npmjs.org/@nuxtjs/i18n/-/i18n-8.5.6.tgz", - "integrity": "sha512-L+g+LygKNoaS/AXExk7tzS9wSNn9QdP1T9VdTjjEGYftpeFgv2U8AQsY0dQAhgPIbXXhIAkNYxTk4YcINj9CfA==", - "dev": true, - "dependencies": { - "@intlify/h3": "^0.5.0", - "@intlify/shared": "^9.14.1", - "@intlify/unplugin-vue-i18n": "^3.0.1", - "@intlify/utils": "^0.12.0", - "@miyaneee/rollup-plugin-json5": "^1.2.0", - "@nuxt/kit": "^3.13.1", - "@rollup/plugin-yaml": "^4.1.2", - "@vue/compiler-sfc": "^3.5.4", - "debug": "^4.3.5", - "defu": "^6.1.2", - "estree-walker": "^3.0.3", - "is-https": "^4.0.0", - "knitwork": "^1.1.0", - "magic-string": "^0.30.10", - "mlly": "^1.7.1", - "pathe": "^1.1.1", - "scule": "^1.1.1", - "sucrase": "^3.35.0", - "ufo": "^1.3.1", - "unplugin": "^1.10.1", - "vue-i18n": "^9.14.1", - "vue-router": "^4.4.4" - }, - "engines": { - "node": "^14.16.0 || >=16.11.0" - } - }, - "node_modules/@nuxtjs/i18n/node_modules/pathe": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz", - "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==", - "dev": true - }, - "node_modules/@nuxtjs/robots": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@nuxtjs/robots/-/robots-3.0.0.tgz", - "integrity": "sha512-qsHGW1KXBvV5Kq7u3huPnFCUTbHS4Fk8Za2mNPgmUXcwLgp3exvhPtdZfIdjrCF/aZk3A8OZONNmGghs6CecBA==", - "dependencies": { - "@nuxt/kit": "^3.0.0", - "h3": "^1.0.1" - } - }, - "node_modules/@nuxtjs/sitemap": { - "version": "5.3.5", - "resolved": "https://registry.npmjs.org/@nuxtjs/sitemap/-/sitemap-5.3.5.tgz", - "integrity": "sha512-TfhEImgVHEZaI/vphZdoCaWM2TRBJqprHZPhIQwWYJz+dpQWkfY6z8UpjhmUh6npvbj5kNY9ncLenkw0cDJp9g==", - "dependencies": { - "@nuxt/devtools-kit": "^1.3.9", - "@nuxt/kit": "^3.12.3", - "chalk": "^5.3.0", - "defu": "^6.1.4", - "h3-compression": "^0.3.2", - "nuxt-site-config": "^2.2.15", - "nuxt-site-config-kit": "^2.2.15", - "ofetch": "^1.3.4", - "pathe": "^1.1.2", - "pkg-types": "^1.1.3", - "radix3": "^1.1.2", - "semver": "^7.6.2", - "sirv": "^2.0.4", - "site-config-stack": "^2.2.15", - "ufo": "^1.5.3" - }, - "engines": { - "node": ">=18.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/harlan-zw" - } - }, - "node_modules/@nuxtjs/sitemap/node_modules/pathe": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz", - "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==" - }, - "node_modules/@open-draft/deferred-promise": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@open-draft/deferred-promise/-/deferred-promise-2.2.0.tgz", - "integrity": "sha512-CecwLWx3rhxVQF6V4bAgPS5t+So2sTbPgAzafKkVizyi7tlwpcFpdFqq+wqF2OwNBmqFuu6tOyouTuxgpMfzmA==" - }, - "node_modules/@open-draft/logger": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@open-draft/logger/-/logger-0.3.0.tgz", - "integrity": "sha512-X2g45fzhxH238HKO4xbSr7+wBS8Fvw6ixhTDuvLd5mqh6bJJCFAPwU9mPDxbcrRtfxv4u5IHCEH77BmxvXmmxQ==", - "dependencies": { - "is-node-process": "^1.2.0", - "outvariant": "^1.4.0" - } - }, - "node_modules/@open-draft/until": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@open-draft/until/-/until-2.1.0.tgz", - "integrity": "sha512-U69T3ItWHvLwGg5eJ0n3I62nWuE6ilHlmz7zM0npLBRvPRd7e6NYmg54vvRtP5mZG7kZqZCFVdsTWo7BPtBujg==" - }, - "node_modules/@parcel/watcher": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.5.1.tgz", - "integrity": "sha512-dfUnCxiN9H4ap84DvD2ubjw+3vUNpstxa0TneY/Paat8a3R4uQZDLSvWjmznAY/DoahqTHl9V46HF/Zs3F29pg==", - "hasInstallScript": true, - "dependencies": { - "detect-libc": "^1.0.3", - "is-glob": "^4.0.3", - "micromatch": "^4.0.5", - "node-addon-api": "^7.0.0" - }, - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - }, - "optionalDependencies": { - "@parcel/watcher-android-arm64": "2.5.1", - "@parcel/watcher-darwin-arm64": "2.5.1", - "@parcel/watcher-darwin-x64": "2.5.1", - "@parcel/watcher-freebsd-x64": "2.5.1", - "@parcel/watcher-linux-arm-glibc": "2.5.1", - "@parcel/watcher-linux-arm-musl": "2.5.1", - "@parcel/watcher-linux-arm64-glibc": "2.5.1", - "@parcel/watcher-linux-arm64-musl": "2.5.1", - "@parcel/watcher-linux-x64-glibc": "2.5.1", - "@parcel/watcher-linux-x64-musl": "2.5.1", - "@parcel/watcher-win32-arm64": "2.5.1", - "@parcel/watcher-win32-ia32": "2.5.1", - "@parcel/watcher-win32-x64": "2.5.1" - } - }, - "node_modules/@parcel/watcher-android-arm64": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.5.1.tgz", - "integrity": "sha512-KF8+j9nNbUN8vzOFDpRMsaKBHZ/mcjEjMToVMJOhTozkDonQFFrRcfdLWn6yWKCmJKmdVxSgHiYvTCef4/qcBA==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-darwin-arm64": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.5.1.tgz", - "integrity": "sha512-eAzPv5osDmZyBhou8PoF4i6RQXAfeKL9tjb3QzYuccXFMQU0ruIc/POh30ePnaOyD1UXdlKguHBmsTs53tVoPw==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-darwin-x64": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.5.1.tgz", - "integrity": "sha512-1ZXDthrnNmwv10A0/3AJNZ9JGlzrF82i3gNQcWOzd7nJ8aj+ILyW1MTxVk35Db0u91oD5Nlk9MBiujMlwmeXZg==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-freebsd-x64": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.5.1.tgz", - "integrity": "sha512-SI4eljM7Flp9yPuKi8W0ird8TI/JK6CSxju3NojVI6BjHsTyK7zxA9urjVjEKJ5MBYC+bLmMcbAWlZ+rFkLpJQ==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-linux-arm-glibc": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.5.1.tgz", - "integrity": "sha512-RCdZlEyTs8geyBkkcnPWvtXLY44BCeZKmGYRtSgtwwnHR4dxfHRG3gR99XdMEdQ7KeiDdasJwwvNSF5jKtDwdA==", - "cpu": [ - "arm" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-linux-arm-musl": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.5.1.tgz", - "integrity": "sha512-6E+m/Mm1t1yhB8X412stiKFG3XykmgdIOqhjWj+VL8oHkKABfu/gjFj8DvLrYVHSBNC+/u5PeNrujiSQ1zwd1Q==", - "cpu": [ - "arm" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-linux-arm64-glibc": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.5.1.tgz", - "integrity": "sha512-LrGp+f02yU3BN9A+DGuY3v3bmnFUggAITBGriZHUREfNEzZh/GO06FF5u2kx8x+GBEUYfyTGamol4j3m9ANe8w==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-linux-arm64-musl": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.5.1.tgz", - "integrity": "sha512-cFOjABi92pMYRXS7AcQv9/M1YuKRw8SZniCDw0ssQb/noPkRzA+HBDkwmyOJYp5wXcsTrhxO0zq1U11cK9jsFg==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-linux-x64-glibc": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.5.1.tgz", - "integrity": "sha512-GcESn8NZySmfwlTsIur+49yDqSny2IhPeZfXunQi48DMugKeZ7uy1FX83pO0X22sHntJ4Ub+9k34XQCX+oHt2A==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-linux-x64-musl": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.5.1.tgz", - "integrity": "sha512-n0E2EQbatQ3bXhcH2D1XIAANAcTZkQICBPVaxMeaCVBtOpBZpWJuf7LwyWPSBDITb7In8mqQgJ7gH8CILCURXg==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-wasm": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-wasm/-/watcher-wasm-2.5.1.tgz", - "integrity": "sha512-RJxlQQLkaMMIuWRozy+z2vEqbaQlCuaCgVZIUCzQLYggY22LZbP5Y1+ia+FD724Ids9e+XIyOLXLrLgQSHIthw==", - "bundleDependencies": [ - "napi-wasm" - ], - "dependencies": { - "is-glob": "^4.0.3", - "micromatch": "^4.0.5", - "napi-wasm": "^1.1.0" - }, - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-wasm/node_modules/napi-wasm": { - "version": "1.1.0", - "inBundle": true, - "license": "MIT" - }, - "node_modules/@parcel/watcher-win32-arm64": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.5.1.tgz", - "integrity": "sha512-RFzklRvmc3PkjKjry3hLF9wD7ppR4AKcWNzH7kXR7GUe0Igb3Nz8fyPwtZCSquGrhU5HhUNDr/mKBqj7tqA2Vw==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-win32-ia32": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.5.1.tgz", - "integrity": "sha512-c2KkcVN+NJmuA7CGlaGD1qJh1cLfDnQsHjE89E60vUEMlqduHGCdCLJCID5geFVM0dOtA3ZiIO8BoEQmzQVfpQ==", - "cpu": [ - "ia32" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-win32-x64": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.5.1.tgz", - "integrity": "sha512-9lHBdJITeNR++EvSQVUcaZoWupyHfXe1jZvGZ06O/5MflPcuPLtEphScIBL+AiCWBO46tDSHzWyD0uDmmZqsgA==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@pinia-plugin-persistedstate/nuxt": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@pinia-plugin-persistedstate/nuxt/-/nuxt-1.2.1.tgz", - "integrity": "sha512-q8s+4aQW/AjBMyeqLL48/qzBR5lcgnvvf1525ovNuKf6Wl9CsoLjPKh/5X8vNoKGwSow4gP7lVmdYPQRypgjgg==", - "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", - "dev": true, - "dependencies": { - "@nuxt/kit": "^3.12.2", - "defu": "^6.1.4", - "pinia-plugin-persistedstate": ">=3.2.1" - }, - "peerDependencies": { - "@pinia/nuxt": "^0.5.0" - } - }, - "node_modules/@pinia/nuxt": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/@pinia/nuxt/-/nuxt-0.5.5.tgz", - "integrity": "sha512-wjxS7YqIesh4OLK+qE3ZjhdOJ5pYZQ+VlEmZNtTwzQn1Kavei/khovx7mzXVXNA/mvSPXVhb9xBzhyS3XMURtw==", - "dependencies": { - "@nuxt/kit": "^3.9.0", - "pinia": "^2.2.3" - }, - "funding": { - "url": "https://github.com/sponsors/posva" - } - }, - "node_modules/@pkgjs/parseargs": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", - "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", - "optional": true, - "engines": { - "node": ">=14" - } - }, - "node_modules/@polka/url": { - "version": "1.0.0-next.28", - "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.28.tgz", - "integrity": "sha512-8LduaNlMZGwdZ6qWrKlfa+2M4gahzFkprZiAt2TF8uS0qQgBizKXpXURqvTJ4WtmupWxaLqjRb2UCTe72mu+Aw==" - }, - "node_modules/@redocly/ajv": { - "version": "8.11.2", - "resolved": "https://registry.npmjs.org/@redocly/ajv/-/ajv-8.11.2.tgz", - "integrity": "sha512-io1JpnwtIcvojV7QKDUSIuMN/ikdOUd1ReEnUnMKGfDVridQZ31J0MmIuqwuRjWDZfmvr+Q0MqCcfHM2gTivOg==", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js-replace": "^1.0.1" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/@redocly/config": { - "version": "0.20.3", - "resolved": "https://registry.npmjs.org/@redocly/config/-/config-0.20.3.tgz", - "integrity": "sha512-Nyyv1Bj7GgYwj/l46O0nkH1GTKWbO3Ixe7KFcn021aZipkZd+z8Vlu1BwkhqtVgivcKaClaExtWU/lDHkjBzag==" - }, - "node_modules/@redocly/openapi-core": { - "version": "1.30.0", - "resolved": "https://registry.npmjs.org/@redocly/openapi-core/-/openapi-core-1.30.0.tgz", - "integrity": "sha512-ZZc+FXKoQXJ9cOR7qRKHxOfKOsGCj2wSodklKdtM2FofzyjzvIwn1rksD5+9iJxvHuORPOPv3ppAHcM+iMr/Ag==", - "dependencies": { - "@redocly/ajv": "^8.11.2", - "@redocly/config": "^0.20.1", - "colorette": "^1.2.0", - "https-proxy-agent": "^7.0.5", - "js-levenshtein": "^1.1.6", - "js-yaml": "^4.1.0", - "minimatch": "^5.0.1", - "pluralize": "^8.0.0", - "yaml-ast-parser": "0.0.43" - }, - "engines": { - "node": ">=18.17.0", - "npm": ">=9.5.0" - } - }, - "node_modules/@redocly/openapi-core/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/@redocly/openapi-core/node_modules/colorette": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.4.0.tgz", - "integrity": "sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g==" - }, - "node_modules/@redocly/openapi-core/node_modules/minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@rollup/plugin-alias": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/@rollup/plugin-alias/-/plugin-alias-5.1.1.tgz", - "integrity": "sha512-PR9zDb+rOzkRb2VD+EuKB7UC41vU5DIwZ5qqCpk0KJudcWAyi8rvYOhS7+L5aZCspw1stTViLgN5v6FF1p5cgQ==", - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" - }, - "peerDependenciesMeta": { - "rollup": { - "optional": true - } - } - }, - "node_modules/@rollup/plugin-commonjs": { - "version": "28.0.2", - "resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-28.0.2.tgz", - "integrity": "sha512-BEFI2EDqzl+vA1rl97IDRZ61AIwGH093d9nz8+dThxJNH8oSoB7MjWvPCX3dkaK1/RCJ/1v/R1XB15FuSs0fQw==", - "dependencies": { - "@rollup/pluginutils": "^5.0.1", - "commondir": "^1.0.1", - "estree-walker": "^2.0.2", - "fdir": "^6.2.0", - "is-reference": "1.2.1", - "magic-string": "^0.30.3", - "picomatch": "^4.0.2" - }, - "engines": { - "node": ">=16.0.0 || 14 >= 14.17" - }, - "peerDependencies": { - "rollup": "^2.68.0||^3.0.0||^4.0.0" - }, - "peerDependenciesMeta": { - "rollup": { - "optional": true - } - } - }, - "node_modules/@rollup/plugin-commonjs/node_modules/estree-walker": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", - "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==" - }, - "node_modules/@rollup/plugin-inject": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/@rollup/plugin-inject/-/plugin-inject-5.0.5.tgz", - "integrity": "sha512-2+DEJbNBoPROPkgTDNe8/1YXWcqxbN5DTjASVIOx8HS+pITXushyNiBV56RB08zuptzz8gT3YfkqriTBVycepg==", - "dependencies": { - "@rollup/pluginutils": "^5.0.1", - "estree-walker": "^2.0.2", - "magic-string": "^0.30.3" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" - }, - "peerDependenciesMeta": { - "rollup": { - "optional": true - } - } - }, - "node_modules/@rollup/plugin-inject/node_modules/estree-walker": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", - "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==" - }, - "node_modules/@rollup/plugin-json": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/@rollup/plugin-json/-/plugin-json-6.1.0.tgz", - "integrity": "sha512-EGI2te5ENk1coGeADSIwZ7G2Q8CJS2sF120T7jLw4xFw9n7wIOXHo+kIYRAoVpJAN+kmqZSoO3Fp4JtoNF4ReA==", - "dependencies": { - "@rollup/pluginutils": "^5.1.0" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" - }, - "peerDependenciesMeta": { - "rollup": { - "optional": true - } - } - }, - "node_modules/@rollup/plugin-node-resolve": { - "version": "15.3.1", - "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-15.3.1.tgz", - "integrity": "sha512-tgg6b91pAybXHJQMAAwW9VuWBO6Thi+q7BCNARLwSqlmsHz0XYURtGvh/AuwSADXSI4h/2uHbs7s4FzlZDGSGA==", - "dependencies": { - "@rollup/pluginutils": "^5.0.1", - "@types/resolve": "1.20.2", - "deepmerge": "^4.2.2", - "is-module": "^1.0.0", - "resolve": "^1.22.1" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "rollup": "^2.78.0||^3.0.0||^4.0.0" - }, - "peerDependenciesMeta": { - "rollup": { - "optional": true - } - } - }, - "node_modules/@rollup/plugin-replace": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/@rollup/plugin-replace/-/plugin-replace-6.0.2.tgz", - "integrity": "sha512-7QaYCf8bqF04dOy7w/eHmJeNExxTYwvKAmlSAH/EaWWUzbT0h5sbF6bktFoX/0F/0qwng5/dWFMyf3gzaM8DsQ==", - "dependencies": { - "@rollup/pluginutils": "^5.0.1", - "magic-string": "^0.30.3" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" - }, - "peerDependenciesMeta": { - "rollup": { - "optional": true - } - } - }, - "node_modules/@rollup/plugin-terser": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/@rollup/plugin-terser/-/plugin-terser-0.4.4.tgz", - "integrity": "sha512-XHeJC5Bgvs8LfukDwWZp7yeqin6ns8RTl2B9avbejt6tZqsqvVoWI7ZTQrcNsfKEDWBTnTxM8nMDkO2IFFbd0A==", - "dependencies": { - "serialize-javascript": "^6.0.1", - "smob": "^1.0.0", - "terser": "^5.17.4" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "rollup": "^2.0.0||^3.0.0||^4.0.0" - }, - "peerDependenciesMeta": { - "rollup": { - "optional": true - } - } - }, - "node_modules/@rollup/plugin-yaml": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/@rollup/plugin-yaml/-/plugin-yaml-4.1.2.tgz", - "integrity": "sha512-RpupciIeZMUqhgFE97ba0s98mOFS7CWzN3EJNhJkqSv9XLlWYtwVdtE6cDw6ASOF/sZVFS7kRJXftaqM2Vakdw==", - "dev": true, - "dependencies": { - "@rollup/pluginutils": "^5.0.1", - "js-yaml": "^4.1.0", - "tosource": "^2.0.0-alpha.3" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" - }, - "peerDependenciesMeta": { - "rollup": { - "optional": true - } - } - }, - "node_modules/@rollup/pluginutils": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.1.4.tgz", - "integrity": "sha512-USm05zrsFxYLPdWWq+K3STlWiT/3ELn3RcV5hJMghpeAIhxfsUIg6mt12CBJBInWMV4VneoV7SfGv8xIwo2qNQ==", - "dependencies": { - "@types/estree": "^1.0.0", - "estree-walker": "^2.0.2", - "picomatch": "^4.0.2" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" - }, - "peerDependenciesMeta": { - "rollup": { - "optional": true - } - } - }, - "node_modules/@rollup/pluginutils/node_modules/estree-walker": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", - "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==" - }, - "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.34.8.tgz", - "integrity": "sha512-q217OSE8DTp8AFHuNHXo0Y86e1wtlfVrXiAlwkIvGRQv9zbc6mE3sjIVfwI8sYUyNxwOg0j/Vm1RKM04JcWLJw==", - "cpu": [ - "arm" - ], - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-android-arm64": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.34.8.tgz", - "integrity": "sha512-Gigjz7mNWaOL9wCggvoK3jEIUUbGul656opstjaUSGC3eT0BM7PofdAJaBfPFWWkXNVAXbaQtC99OCg4sJv70Q==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.34.8.tgz", - "integrity": "sha512-02rVdZ5tgdUNRxIUrFdcMBZQoaPMrxtwSb+/hOfBdqkatYHR3lZ2A2EGyHq2sGOd0Owk80oV3snlDASC24He3Q==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.34.8.tgz", - "integrity": "sha512-qIP/elwR/tq/dYRx3lgwK31jkZvMiD6qUtOycLhTzCvrjbZ3LjQnEM9rNhSGpbLXVJYQ3rq39A6Re0h9tU2ynw==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.34.8.tgz", - "integrity": "sha512-IQNVXL9iY6NniYbTaOKdrlVP3XIqazBgJOVkddzJlqnCpRi/yAeSOa8PLcECFSQochzqApIOE1GHNu3pCz+BDA==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "freebsd" - ] - }, - "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.34.8.tgz", - "integrity": "sha512-TYXcHghgnCqYFiE3FT5QwXtOZqDj5GmaFNTNt3jNC+vh22dc/ukG2cG+pi75QO4kACohZzidsq7yKTKwq/Jq7Q==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "freebsd" - ] - }, - "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.34.8.tgz", - "integrity": "sha512-A4iphFGNkWRd+5m3VIGuqHnG3MVnqKe7Al57u9mwgbyZ2/xF9Jio72MaY7xxh+Y87VAHmGQr73qoKL9HPbXj1g==", - "cpu": [ - "arm" - ], - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.34.8.tgz", - "integrity": "sha512-S0lqKLfTm5u+QTxlFiAnb2J/2dgQqRy/XvziPtDd1rKZFXHTyYLoVL58M/XFwDI01AQCDIevGLbQrMAtdyanpA==", - "cpu": [ - "arm" - ], - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.34.8.tgz", - "integrity": "sha512-jpz9YOuPiSkL4G4pqKrus0pn9aYwpImGkosRKwNi+sJSkz+WU3anZe6hi73StLOQdfXYXC7hUfsQlTnjMd3s1A==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.34.8.tgz", - "integrity": "sha512-KdSfaROOUJXgTVxJNAZ3KwkRc5nggDk+06P6lgi1HLv1hskgvxHUKZ4xtwHkVYJ1Rep4GNo+uEfycCRRxht7+Q==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-loongarch64-gnu": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.34.8.tgz", - "integrity": "sha512-NyF4gcxwkMFRjgXBM6g2lkT58OWztZvw5KkV2K0qqSnUEqCVcqdh2jN4gQrTn/YUpAcNKyFHfoOZEer9nwo6uQ==", - "cpu": [ - "loong64" - ], - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.34.8.tgz", - "integrity": "sha512-LMJc999GkhGvktHU85zNTDImZVUCJ1z/MbAJTnviiWmmjyckP5aQsHtcujMjpNdMZPT2rQEDBlJfubhs3jsMfw==", - "cpu": [ - "ppc64" - ], - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.34.8.tgz", - "integrity": "sha512-xAQCAHPj8nJq1PI3z8CIZzXuXCstquz7cIOL73HHdXiRcKk8Ywwqtx2wrIy23EcTn4aZ2fLJNBB8d0tQENPCmw==", - "cpu": [ - "riscv64" - ], - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.34.8.tgz", - "integrity": "sha512-DdePVk1NDEuc3fOe3dPPTb+rjMtuFw89gw6gVWxQFAuEqqSdDKnrwzZHrUYdac7A7dXl9Q2Vflxpme15gUWQFA==", - "cpu": [ - "s390x" - ], - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.34.8.tgz", - "integrity": "sha512-8y7ED8gjxITUltTUEJLQdgpbPh1sUQ0kMTmufRF/Ns5tI9TNMNlhWtmPKKHCU0SilX+3MJkZ0zERYYGIVBYHIA==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.34.8.tgz", - "integrity": "sha512-SCXcP0ZpGFIe7Ge+McxY5zKxiEI5ra+GT3QRxL0pMMtxPfpyLAKleZODi1zdRHkz5/BhueUrYtYVgubqe9JBNQ==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.34.8.tgz", - "integrity": "sha512-YHYsgzZgFJzTRbth4h7Or0m5O74Yda+hLin0irAIobkLQFRQd1qWmnoVfwmKm9TXIZVAD0nZ+GEb2ICicLyCnQ==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.34.8.tgz", - "integrity": "sha512-r3NRQrXkHr4uWy5TOjTpTYojR9XmF0j/RYgKCef+Ag46FWUTltm5ziticv8LdNsDMehjJ543x/+TJAek/xBA2w==", - "cpu": [ - "ia32" - ], - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.34.8.tgz", - "integrity": "sha512-U0FaE5O1BCpZSeE6gBl3c5ObhePQSfk9vDRToMmTkbhCOgW4jqvtS5LGyQ76L1fH8sM0keRp4uDTsbjiUyjk0g==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@sindresorhus/merge-streams": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/merge-streams/-/merge-streams-2.3.0.tgz", - "integrity": "sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg==", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@trysound/sax": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz", - "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==", - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/@types/eslint": { - "version": "9.6.1", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-9.6.1.tgz", - "integrity": "sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==", - "peer": true, - "dependencies": { - "@types/estree": "*", - "@types/json-schema": "*" - } - }, - "node_modules/@types/eslint-scope": { - "version": "3.7.7", - "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", - "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", - "peer": true, - "dependencies": { - "@types/eslint": "*", - "@types/estree": "*" - } - }, - "node_modules/@types/estree": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", - "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==" - }, - "node_modules/@types/http-proxy": { - "version": "1.17.16", - "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.16.tgz", - "integrity": "sha512-sdWoUajOB1cd0A8cRRQ1cfyWNbmFKLAqBB89Y8x5iYyG/mkJHc0YUH8pdWBy2omi9qtCpiIgGjuwO0dQST2l5w==", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/json-schema": { - "version": "7.0.15", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", - "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", - "peer": true - }, - "node_modules/@types/node": { - "version": "22.13.5", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.13.5.tgz", - "integrity": "sha512-+lTU0PxZXn0Dr1NBtC7Y8cR21AJr87dLLU953CWA6pMxxv/UDc7jYAY90upcrie1nRcD6XNG5HOYEDtgW5TxAg==", - "dependencies": { - "undici-types": "~6.20.0" - } - }, - "node_modules/@types/parse-path": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/@types/parse-path/-/parse-path-7.0.3.tgz", - "integrity": "sha512-LriObC2+KYZD3FzCrgWGv/qufdUy4eXrxcLgQMfYXgPbLIecKIsVBaQgUPmxSSLcjmYbDTQbMgr6qr6l/eb7Bg==" - }, - "node_modules/@types/qs": { - "version": "6.9.18", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.18.tgz", - "integrity": "sha512-kK7dgTYDyGqS+e2Q4aK9X3D7q234CIZ1Bv0q/7Z5IwRDoADNU81xXJK/YVyLbLTZCoIwUoDoffFeF+p/eIklAA==", - "dev": true - }, - "node_modules/@types/resolve": { - "version": "1.20.2", - "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.20.2.tgz", - "integrity": "sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==" - }, - "node_modules/@types/web-bluetooth": { - "version": "0.0.20", - "resolved": "https://registry.npmjs.org/@types/web-bluetooth/-/web-bluetooth-0.0.20.tgz", - "integrity": "sha512-g9gZnnXVq7gM7v3tJCWV/qw7w+KeOlSHAhgF9RytFyifW6AF61hdT2ucrYhPq9hLs5JIryeupHV3qGk95dH9ow==" - }, - "node_modules/@unhead/dom": { - "version": "1.11.19", - "resolved": "https://registry.npmjs.org/@unhead/dom/-/dom-1.11.19.tgz", - "integrity": "sha512-udkgITdIblEWH3hsoFQMKW+6QXNO2qFZlZ2FI37bVAplQSnK/PytTPt/5oA1GWkoVwT0DsQNGHbU6kOg/3SlNg==", - "dependencies": { - "@unhead/schema": "1.11.19", - "@unhead/shared": "1.11.19" - }, - "funding": { - "url": "https://github.com/sponsors/harlan-zw" - } - }, - "node_modules/@unhead/schema": { - "version": "1.11.19", - "resolved": "https://registry.npmjs.org/@unhead/schema/-/schema-1.11.19.tgz", - "integrity": "sha512-7VhYHWK7xHgljdv+C01MepCSYZO2v6OhgsfKWPxRQBDDGfUKCUaChox0XMq3tFvXP6u4zSp6yzcDw2yxCfVMwg==", - "dependencies": { - "hookable": "^5.5.3", - "zhead": "^2.2.4" - }, - "funding": { - "url": "https://github.com/sponsors/harlan-zw" - } - }, - "node_modules/@unhead/shared": { - "version": "1.11.19", - "resolved": "https://registry.npmjs.org/@unhead/shared/-/shared-1.11.19.tgz", - "integrity": "sha512-UYE9EIeQLJOhx8vC71bWGkAGY4Zzq/H8qYlihowUg4NiFOfL+KKMnj96datb74PRxSDvHac9V3OLktNcsX2NuA==", - "dependencies": { - "@unhead/schema": "1.11.19", - "packrup": "^0.1.2" - }, - "funding": { - "url": "https://github.com/sponsors/harlan-zw" - } - }, - "node_modules/@unhead/ssr": { - "version": "1.11.19", - "resolved": "https://registry.npmjs.org/@unhead/ssr/-/ssr-1.11.19.tgz", - "integrity": "sha512-OH+rj6xBTdYyLsSntk4lEQyR+z57aEUZIiR2UpPl1zWGtBZPIr5zs3GY5+EyJ8t8e0zLemPR/Pu7VembTJ8o1w==", - "dependencies": { - "@unhead/schema": "1.11.19", - "@unhead/shared": "1.11.19" - }, - "funding": { - "url": "https://github.com/sponsors/harlan-zw" - } - }, - "node_modules/@unhead/vue": { - "version": "1.11.19", - "resolved": "https://registry.npmjs.org/@unhead/vue/-/vue-1.11.19.tgz", - "integrity": "sha512-/XATTP8wVLs3+2Pkj2crvr/Z55nybVQyOwISh+sAlr/48/9n3jGNiCZHKpHgL4MpOnGT4krwzWzbfhBO/G2BSQ==", - "dependencies": { - "@unhead/schema": "1.11.19", - "@unhead/shared": "1.11.19", - "hookable": "^5.5.3", - "unhead": "1.11.19" - }, - "funding": { - "url": "https://github.com/sponsors/harlan-zw" - }, - "peerDependencies": { - "vue": ">=2.7 || >=3" - } - }, - "node_modules/@unocss/astro": { - "version": "0.65.4", - "resolved": "https://registry.npmjs.org/@unocss/astro/-/astro-0.65.4.tgz", - "integrity": "sha512-ex1CJOQ6yeftBEPcbA9/W47/YoV+mhQnrAoc8MA1VVrvvFKDitICFU62+nSt3NWRe53XL/fXnQbcbCb8AAgKlA==", - "dependencies": { - "@unocss/core": "0.65.4", - "@unocss/reset": "0.65.4", - "@unocss/vite": "0.65.4" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - }, - "peerDependencies": { - "vite": "^2.9.0 || ^3.0.0-0 || ^4.0.0 || ^5.0.0-0 || ^6.0.0-0" - }, - "peerDependenciesMeta": { - "vite": { - "optional": true - } - } - }, - "node_modules/@unocss/cli": { - "version": "0.65.4", - "resolved": "https://registry.npmjs.org/@unocss/cli/-/cli-0.65.4.tgz", - "integrity": "sha512-D/4hY5Hezh3QETscl4i+ojb+q8YU9Cl9AYJ8v3gsjc/GjTmEuIOD5V4x+/aN25vY5wjqgoApOgaIDGCV3b+2Ig==", - "dependencies": { - "@ampproject/remapping": "^2.3.0", - "@rollup/pluginutils": "^5.1.4", - "@unocss/config": "0.65.4", - "@unocss/core": "0.65.4", - "@unocss/preset-uno": "0.65.4", - "cac": "^6.7.14", - "chokidar": "^3.6.0", - "colorette": "^2.0.20", - "consola": "^3.3.1", - "magic-string": "^0.30.17", - "pathe": "^1.1.2", - "perfect-debounce": "^1.0.0", - "tinyglobby": "^0.2.10" - }, - "bin": { - "unocss": "bin/unocss.mjs" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/@unocss/cli/node_modules/chokidar": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", - "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/@unocss/cli/node_modules/pathe": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz", - "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==" - }, - "node_modules/@unocss/cli/node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/@unocss/cli/node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/@unocss/config": { - "version": "0.65.4", - "resolved": "https://registry.npmjs.org/@unocss/config/-/config-0.65.4.tgz", - "integrity": "sha512-/vCt4AXnJ4p4Ow6xqsYwdrelF9533yhZjzkg3SQmL3rKeSkicPayKpeq8nkYECdhDI03VTCVD+6oh5Y/26Hg7A==", - "dependencies": { - "@unocss/core": "0.65.4", - "unconfig": "~0.6.0" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/@unocss/core": { - "version": "0.65.4", - "resolved": "https://registry.npmjs.org/@unocss/core/-/core-0.65.4.tgz", - "integrity": "sha512-a2JOoFutrhqd5RgPhIR5FIXrDoHDU3gwCbPrpT6KYTjsqlSc/fv02yZ+JGOZFN3MCFhCmaPTs+idDFtwb3xU8g==", - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/@unocss/extractor-arbitrary-variants": { - "version": "0.65.4", - "resolved": "https://registry.npmjs.org/@unocss/extractor-arbitrary-variants/-/extractor-arbitrary-variants-0.65.4.tgz", - "integrity": "sha512-GbvTgsDaHplfWfsQtOY8RrvEZvptmvR9k9NwQ5NsZBNIG1JepYVel93CVQvsxT5KioKcoWngXxTYLNOGyxLs0g==", - "dependencies": { - "@unocss/core": "0.65.4" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/@unocss/inspector": { - "version": "0.65.4", - "resolved": "https://registry.npmjs.org/@unocss/inspector/-/inspector-0.65.4.tgz", - "integrity": "sha512-byg9x549Ul17U4Ety7ufDwC0UOygypoq4QnLEPzhlZ0KJG1f7WmXKYanOhupeg3h4qCj6Nc/xdZYMGbHl9QRIg==", - "dependencies": { - "@unocss/core": "0.65.4", - "@unocss/rule-utils": "0.65.4", - "colorette": "^2.0.20", - "gzip-size": "^6.0.0", - "sirv": "^3.0.0", - "vue-flow-layout": "^0.1.1" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/@unocss/inspector/node_modules/gzip-size": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-6.0.0.tgz", - "integrity": "sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==", - "dependencies": { - "duplexer": "^0.1.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@unocss/inspector/node_modules/sirv": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/sirv/-/sirv-3.0.1.tgz", - "integrity": "sha512-FoqMu0NCGBLCcAkS1qA+XJIQTR6/JHfQXl+uGteNCQ76T91DMUjPa9xfmeqMY3z80nLSg9yQmNjK0Px6RWsH/A==", - "dependencies": { - "@polka/url": "^1.0.0-next.24", - "mrmime": "^2.0.0", - "totalist": "^3.0.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@unocss/nuxt": { - "version": "0.65.4", - "resolved": "https://registry.npmjs.org/@unocss/nuxt/-/nuxt-0.65.4.tgz", - "integrity": "sha512-dEJdqgvrukgZJk1szxRW6MiIozUZDLeFyyxmnO+iW3loPlji9hu95j2KBVHaQWIzi39XqVSORi4lH5flvAz3Pg==", - "dependencies": { - "@nuxt/kit": "^3.15.0", - "@unocss/config": "0.65.4", - "@unocss/core": "0.65.4", - "@unocss/preset-attributify": "0.65.4", - "@unocss/preset-icons": "0.65.4", - "@unocss/preset-tagify": "0.65.4", - "@unocss/preset-typography": "0.65.4", - "@unocss/preset-uno": "0.65.4", - "@unocss/preset-web-fonts": "0.65.4", - "@unocss/preset-wind": "0.65.4", - "@unocss/reset": "0.65.4", - "@unocss/vite": "0.65.4", - "@unocss/webpack": "0.65.4", - "unocss": "0.65.4" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/@unocss/postcss": { - "version": "0.65.4", - "resolved": "https://registry.npmjs.org/@unocss/postcss/-/postcss-0.65.4.tgz", - "integrity": "sha512-8peDRo0+rNQsnKh/H2uZEVy67sV2cC16rAeSLpgbVJUMNfZlmF0rC2DNGsOV17uconUXSwz7+mGcHKNiv+8YlQ==", - "dependencies": { - "@unocss/config": "0.65.4", - "@unocss/core": "0.65.4", - "@unocss/rule-utils": "0.65.4", - "css-tree": "^3.1.0", - "postcss": "^8.4.49", - "tinyglobby": "^0.2.10" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - }, - "peerDependencies": { - "postcss": "^8.4.21" - } - }, - "node_modules/@unocss/postcss/node_modules/css-tree": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-3.1.0.tgz", - "integrity": "sha512-0eW44TGN5SQXU1mWSkKwFstI/22X2bG1nYzZTYMAWjylYURhse752YgbE4Cx46AC+bAvI+/dYTPRk1LqSUnu6w==", - "dependencies": { - "mdn-data": "2.12.2", - "source-map-js": "^1.0.1" - }, - "engines": { - "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" - } - }, - "node_modules/@unocss/postcss/node_modules/mdn-data": { - "version": "2.12.2", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.12.2.tgz", - "integrity": "sha512-IEn+pegP1aManZuckezWCO+XZQDplx1366JoVhTpMpBB1sPey/SbveZQUosKiKiGYjg1wH4pMlNgXbCiYgihQA==" - }, - "node_modules/@unocss/preset-attributify": { - "version": "0.65.4", - "resolved": "https://registry.npmjs.org/@unocss/preset-attributify/-/preset-attributify-0.65.4.tgz", - "integrity": "sha512-zxE9hJJ5b37phjdzDdZsxX559ZlmH9rFlY5LVEcQySTnsfY0znviHxPbD2iRpCBCRd+YC5HfFd2jb3XlnTKMJQ==", - "dependencies": { - "@unocss/core": "0.65.4" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/@unocss/preset-icons": { - "version": "0.65.4", - "resolved": "https://registry.npmjs.org/@unocss/preset-icons/-/preset-icons-0.65.4.tgz", - "integrity": "sha512-5sSzTN72X2Ag3VH48xY1pYudeWnql9jqdMiwgZuLJcmvETBNGelXy2wGxm7tsUUEx/l40Yr04Ck8XRPGT9jLBw==", - "dependencies": { - "@iconify/utils": "^2.2.1", - "@unocss/core": "0.65.4", - "ofetch": "^1.4.1" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/@unocss/preset-mini": { - "version": "0.65.4", - "resolved": "https://registry.npmjs.org/@unocss/preset-mini/-/preset-mini-0.65.4.tgz", - "integrity": "sha512-dcO2PzSl87qN1KdQWcfZDIKEhpdFeImWbYfiXtE7k6pi1393FJkdHEopgI/1ZciIQN1CkTvQJ5c7EpEVWftYRA==", - "dependencies": { - "@unocss/core": "0.65.4", - "@unocss/extractor-arbitrary-variants": "0.65.4", - "@unocss/rule-utils": "0.65.4" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/@unocss/preset-tagify": { - "version": "0.65.4", - "resolved": "https://registry.npmjs.org/@unocss/preset-tagify/-/preset-tagify-0.65.4.tgz", - "integrity": "sha512-qll6koqdFEkvmz594vKnxj9+3nfM3ugkJxYHrTkqtwx7DAnTgtM8fInFFGZelvjwUzR3o3+Zw6uMhFkLTVTfvg==", - "dependencies": { - "@unocss/core": "0.65.4" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/@unocss/preset-typography": { - "version": "0.65.4", - "resolved": "https://registry.npmjs.org/@unocss/preset-typography/-/preset-typography-0.65.4.tgz", - "integrity": "sha512-Dl940ATrviWD9Vh+4fcN0QZXb6wA7al+c7QkdVAzW7I+NtdN2ELvLcN0cY22KnLRpwztzmg52Qp2J/1QnqrLTw==", - "dependencies": { - "@unocss/core": "0.65.4", - "@unocss/preset-mini": "0.65.4" - } - }, - "node_modules/@unocss/preset-uno": { - "version": "0.65.4", - "resolved": "https://registry.npmjs.org/@unocss/preset-uno/-/preset-uno-0.65.4.tgz", - "integrity": "sha512-56bdBtf476i+soQCQmT36uGzcF2z+7DGCnG1hwWiw6XAbL6gmRMQsubwi1c8z8TcTQNBsOFUnOziFil0gbWufw==", - "dependencies": { - "@unocss/core": "0.65.4", - "@unocss/preset-mini": "0.65.4", - "@unocss/preset-wind": "0.65.4", - "@unocss/rule-utils": "0.65.4" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/@unocss/preset-web-fonts": { - "version": "0.65.4", - "resolved": "https://registry.npmjs.org/@unocss/preset-web-fonts/-/preset-web-fonts-0.65.4.tgz", - "integrity": "sha512-UB/MvXHUTqMNVH1bbiKZ/ZtZUI5tsYlTYAvBrnXPO1Cztuwr8hJKSi4RCfI9g+YYtKHX4uYuxUbW5bcN85gmBQ==", - "dependencies": { - "@unocss/core": "0.65.4", - "ofetch": "^1.4.1" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/@unocss/preset-wind": { - "version": "0.65.4", - "resolved": "https://registry.npmjs.org/@unocss/preset-wind/-/preset-wind-0.65.4.tgz", - "integrity": "sha512-0rbNbw5E8Lvh2yf4R1Mq+lxI/wL5Tm6+r+crE0uAAhCPe9kxPHW4k+x1cWKDIwq6Vudlm3cNX85N49wN5tYgdA==", - "dependencies": { - "@unocss/core": "0.65.4", - "@unocss/preset-mini": "0.65.4", - "@unocss/rule-utils": "0.65.4" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/@unocss/reset": { - "version": "0.65.4", - "resolved": "https://registry.npmjs.org/@unocss/reset/-/reset-0.65.4.tgz", - "integrity": "sha512-m685H0KFvVMz6R2i5GDIFv4RS9Z7y2G8hJK7xg2OWli+7w8l2ZMihYvXKofPsst4q/ms8EgKXpWc/qqUOTucvA==", - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/@unocss/rule-utils": { - "version": "0.65.4", - "resolved": "https://registry.npmjs.org/@unocss/rule-utils/-/rule-utils-0.65.4.tgz", - "integrity": "sha512-+EzdJEWcqGcO6HwbBTe7vEdBRpuKkBiz4MycQeLD6GEio04T45y6VHHO7/WTqxltbO4YwwW9/s2TKRMxKtoG8g==", - "dependencies": { - "@unocss/core": "^0.65.4", - "magic-string": "^0.30.17" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/@unocss/transformer-attributify-jsx": { - "version": "0.65.4", - "resolved": "https://registry.npmjs.org/@unocss/transformer-attributify-jsx/-/transformer-attributify-jsx-0.65.4.tgz", - "integrity": "sha512-n438EzWdTKlLCOlAUSpFjmH6FflctqzIReMzMZSJDkmkorymc+C5GpjN3Nty2cKRJXIl6Vwq0oxPuB59RT+FIw==", - "dependencies": { - "@unocss/core": "0.65.4" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/@unocss/transformer-compile-class": { - "version": "0.65.4", - "resolved": "https://registry.npmjs.org/@unocss/transformer-compile-class/-/transformer-compile-class-0.65.4.tgz", - "integrity": "sha512-n1yHDC/iIbcj/9fBUTXkSoASKfLBuRoCN7P1a0ecPc8Gu+uOGfoxafOhrlqC+tpD3hlQGoL+0h74BHSKh+L23Q==", - "dependencies": { - "@unocss/core": "0.65.4" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/@unocss/transformer-directives": { - "version": "0.65.4", - "resolved": "https://registry.npmjs.org/@unocss/transformer-directives/-/transformer-directives-0.65.4.tgz", - "integrity": "sha512-zkoDEwzPkgXi6ohW7P11gbArwfTRMZ9knYSUYoPEltQz+UZYzeRQ85exiAmdz5MsbCAuhQEr577Kd/CWfhjEuA==", - "dependencies": { - "@unocss/core": "0.65.4", - "@unocss/rule-utils": "0.65.4", - "css-tree": "^3.1.0" - } - }, - "node_modules/@unocss/transformer-directives/node_modules/css-tree": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-3.1.0.tgz", - "integrity": "sha512-0eW44TGN5SQXU1mWSkKwFstI/22X2bG1nYzZTYMAWjylYURhse752YgbE4Cx46AC+bAvI+/dYTPRk1LqSUnu6w==", - "dependencies": { - "mdn-data": "2.12.2", - "source-map-js": "^1.0.1" - }, - "engines": { - "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" - } - }, - "node_modules/@unocss/transformer-directives/node_modules/mdn-data": { - "version": "2.12.2", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.12.2.tgz", - "integrity": "sha512-IEn+pegP1aManZuckezWCO+XZQDplx1366JoVhTpMpBB1sPey/SbveZQUosKiKiGYjg1wH4pMlNgXbCiYgihQA==" - }, - "node_modules/@unocss/transformer-variant-group": { - "version": "0.65.4", - "resolved": "https://registry.npmjs.org/@unocss/transformer-variant-group/-/transformer-variant-group-0.65.4.tgz", - "integrity": "sha512-ggO6xMGeOeoD5GHS2xXBJrYFuzqyiZ25tM0zHAMJn9QU9GIu1NwWvcXluvLCF/MRIygBJGPpAE98aEICI6ifEA==", - "dependencies": { - "@unocss/core": "0.65.4" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/@unocss/vite": { - "version": "0.65.4", - "resolved": "https://registry.npmjs.org/@unocss/vite/-/vite-0.65.4.tgz", - "integrity": "sha512-02pRcVLfb5UUxMJwudnjS/0ZQdSlskjuXVHdpZpLBZCA8hhoru2uEOsPbUOBRNNMjDj6ld00pmgk/+im07M35Q==", - "dependencies": { - "@ampproject/remapping": "^2.3.0", - "@rollup/pluginutils": "^5.1.4", - "@unocss/config": "0.65.4", - "@unocss/core": "0.65.4", - "@unocss/inspector": "0.65.4", - "chokidar": "^3.6.0", - "magic-string": "^0.30.17", - "tinyglobby": "^0.2.10" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - }, - "peerDependencies": { - "vite": "^2.9.0 || ^3.0.0-0 || ^4.0.0 || ^5.0.0-0 || ^6.0.0-0" - } - }, - "node_modules/@unocss/vite/node_modules/chokidar": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", - "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/@unocss/vite/node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/@unocss/vite/node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/@unocss/webpack": { - "version": "0.65.4", - "resolved": "https://registry.npmjs.org/@unocss/webpack/-/webpack-0.65.4.tgz", - "integrity": "sha512-cnd0qnJdSxYlQ+zuF0Qad3xZk2X0/p70XLzlA4TaBZuKa2OPJOyulfJwJSqcrSc4PXYOd9B/B8nXJk8WQ1yBHQ==", - "dependencies": { - "@ampproject/remapping": "^2.3.0", - "@rollup/pluginutils": "^5.1.4", - "@unocss/config": "0.65.4", - "@unocss/core": "0.65.4", - "chokidar": "^3.6.0", - "magic-string": "^0.30.17", - "tinyglobby": "^0.2.10", - "unplugin": "^2.1.0", - "webpack-sources": "^3.2.3" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - }, - "peerDependencies": { - "webpack": "^4 || ^5" - } - }, - "node_modules/@unocss/webpack/node_modules/chokidar": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", - "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/@unocss/webpack/node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/@unocss/webpack/node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/@unocss/webpack/node_modules/unplugin": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-2.2.0.tgz", - "integrity": "sha512-m1ekpSwuOT5hxkJeZGRxO7gXbXT3gF26NjQ7GdVHoLoF8/nopLcd/QfPigpCy7i51oFHiRJg/CyHhj4vs2+KGw==", - "dependencies": { - "acorn": "^8.14.0", - "webpack-virtual-modules": "^0.6.2" - }, - "engines": { - "node": ">=18.12.0" - } - }, - "node_modules/@vercel/nft": { - "version": "0.27.10", - "resolved": "https://registry.npmjs.org/@vercel/nft/-/nft-0.27.10.tgz", - "integrity": "sha512-zbaF9Wp/NsZtKLE4uVmL3FyfFwlpDyuymQM1kPbeT0mVOHKDQQNjnnfslB3REg3oZprmNFJuh3pkHBk2qAaizg==", - "dependencies": { - "@mapbox/node-pre-gyp": "^2.0.0-rc.0", - "@rollup/pluginutils": "^5.1.3", - "acorn": "^8.6.0", - "acorn-import-attributes": "^1.9.5", - "async-sema": "^3.1.1", - "bindings": "^1.4.0", - "estree-walker": "2.0.2", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "node-gyp-build": "^4.2.2", - "picomatch": "^4.0.2", - "resolve-from": "^5.0.0" - }, - "bin": { - "nft": "out/cli.js" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/@vercel/nft/node_modules/estree-walker": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", - "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==" - }, - "node_modules/@vitejs/plugin-vue": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-5.2.1.tgz", - "integrity": "sha512-cxh314tzaWwOLqVes2gnnCtvBDcM1UMdn+iFR+UjAn411dPT3tOmqrJjbMd7koZpMAmBM/GqeV4n9ge7JSiJJQ==", - "engines": { - "node": "^18.0.0 || >=20.0.0" - }, - "peerDependencies": { - "vite": "^5.0.0 || ^6.0.0", - "vue": "^3.2.25" - } - }, - "node_modules/@vitejs/plugin-vue-jsx": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue-jsx/-/plugin-vue-jsx-4.1.1.tgz", - "integrity": "sha512-uMJqv/7u1zz/9NbWAD3XdjaY20tKTf17XVfQ9zq4wY1BjsB/PjpJPMe2xiG39QpP4ZdhYNhm4Hvo66uJrykNLA==", - "dependencies": { - "@babel/core": "^7.26.0", - "@babel/plugin-transform-typescript": "^7.25.9", - "@vue/babel-plugin-jsx": "^1.2.5" - }, - "engines": { - "node": "^18.0.0 || >=20.0.0" - }, - "peerDependencies": { - "vite": "^5.0.0 || ^6.0.0", - "vue": "^3.0.0" - } - }, - "node_modules/@vue-macros/common": { - "version": "1.16.1", - "resolved": "https://registry.npmjs.org/@vue-macros/common/-/common-1.16.1.tgz", - "integrity": "sha512-Pn/AWMTjoMYuquepLZP813BIcq8DTZiNCoaceuNlvaYuOTd8DqBZWc5u0uOMQZMInwME1mdSmmBAcTluiV9Jtg==", - "dependencies": { - "@vue/compiler-sfc": "^3.5.13", - "ast-kit": "^1.4.0", - "local-pkg": "^1.0.0", - "magic-string-ast": "^0.7.0", - "pathe": "^2.0.2", - "picomatch": "^4.0.2" - }, - "engines": { - "node": ">=16.14.0" - }, - "peerDependencies": { - "vue": "^2.7.0 || ^3.2.25" - }, - "peerDependenciesMeta": { - "vue": { - "optional": true - } - } - }, - "node_modules/@vue-macros/common/node_modules/local-pkg": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-1.0.0.tgz", - "integrity": "sha512-bbgPw/wmroJsil/GgL4qjDzs5YLTBMQ99weRsok1XCDccQeehbHA/I1oRvk2NPtr7KGZgT/Y5tPRnAtMqeG2Kg==", - "dependencies": { - "mlly": "^1.7.3", - "pkg-types": "^1.3.0" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/@vue/babel-helper-vue-transform-on": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/@vue/babel-helper-vue-transform-on/-/babel-helper-vue-transform-on-1.2.5.tgz", - "integrity": "sha512-lOz4t39ZdmU4DJAa2hwPYmKc8EsuGa2U0L9KaZaOJUt0UwQNjNA3AZTq6uEivhOKhhG1Wvy96SvYBoFmCg3uuw==" - }, - "node_modules/@vue/babel-plugin-jsx": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/@vue/babel-plugin-jsx/-/babel-plugin-jsx-1.2.5.tgz", - "integrity": "sha512-zTrNmOd4939H9KsRIGmmzn3q2zvv1mjxkYZHgqHZgDrXz5B1Q3WyGEjO2f+JrmKghvl1JIRcvo63LgM1kH5zFg==", - "dependencies": { - "@babel/helper-module-imports": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.8", - "@babel/plugin-syntax-jsx": "^7.24.7", - "@babel/template": "^7.25.0", - "@babel/traverse": "^7.25.6", - "@babel/types": "^7.25.6", - "@vue/babel-helper-vue-transform-on": "1.2.5", - "@vue/babel-plugin-resolve-type": "1.2.5", - "html-tags": "^3.3.1", - "svg-tags": "^1.0.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - }, - "peerDependenciesMeta": { - "@babel/core": { - "optional": true - } - } - }, - "node_modules/@vue/babel-plugin-resolve-type": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/@vue/babel-plugin-resolve-type/-/babel-plugin-resolve-type-1.2.5.tgz", - "integrity": "sha512-U/ibkQrf5sx0XXRnUZD1mo5F7PkpKyTbfXM3a3rC4YnUz6crHEz9Jg09jzzL6QYlXNto/9CePdOg/c87O4Nlfg==", - "dependencies": { - "@babel/code-frame": "^7.24.7", - "@babel/helper-module-imports": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.8", - "@babel/parser": "^7.25.6", - "@vue/compiler-sfc": "^3.5.3" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@vue/compiler-core": { - "version": "3.5.13", - "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.13.tgz", - "integrity": "sha512-oOdAkwqUfW1WqpwSYJce06wvt6HljgY3fGeM9NcVA1HaYOij3mZG9Rkysn0OHuyUAGMbEbARIpsG+LPVlBJ5/Q==", - "dependencies": { - "@babel/parser": "^7.25.3", - "@vue/shared": "3.5.13", - "entities": "^4.5.0", - "estree-walker": "^2.0.2", - "source-map-js": "^1.2.0" - } - }, - "node_modules/@vue/compiler-core/node_modules/estree-walker": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", - "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==" - }, - "node_modules/@vue/compiler-dom": { - "version": "3.5.13", - "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.13.tgz", - "integrity": "sha512-ZOJ46sMOKUjO3e94wPdCzQ6P1Lx/vhp2RSvfaab88Ajexs0AHeV0uasYhi99WPaogmBlRHNRuly8xV75cNTMDA==", - "dependencies": { - "@vue/compiler-core": "3.5.13", - "@vue/shared": "3.5.13" - } - }, - "node_modules/@vue/compiler-sfc": { - "version": "3.5.13", - "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.13.tgz", - "integrity": "sha512-6VdaljMpD82w6c2749Zhf5T9u5uLBWKnVue6XWxprDobftnletJ8+oel7sexFfM3qIxNmVE7LSFGTpv6obNyaQ==", - "dependencies": { - "@babel/parser": "^7.25.3", - "@vue/compiler-core": "3.5.13", - "@vue/compiler-dom": "3.5.13", - "@vue/compiler-ssr": "3.5.13", - "@vue/shared": "3.5.13", - "estree-walker": "^2.0.2", - "magic-string": "^0.30.11", - "postcss": "^8.4.48", - "source-map-js": "^1.2.0" - } - }, - "node_modules/@vue/compiler-sfc/node_modules/estree-walker": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", - "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==" - }, - "node_modules/@vue/compiler-ssr": { - "version": "3.5.13", - "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.13.tgz", - "integrity": "sha512-wMH6vrYHxQl/IybKJagqbquvxpWCuVYpoUJfCqFZwa/JY1GdATAQ+TgVtgrwwMZ0D07QhA99rs/EAAWfvG6KpA==", - "dependencies": { - "@vue/compiler-dom": "3.5.13", - "@vue/shared": "3.5.13" - } - }, - "node_modules/@vue/devtools-api": { - "version": "6.6.4", - "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.6.4.tgz", - "integrity": "sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g==" - }, - "node_modules/@vue/devtools-core": { - "version": "7.6.8", - "resolved": "https://registry.npmjs.org/@vue/devtools-core/-/devtools-core-7.6.8.tgz", - "integrity": "sha512-8X4roysTwzQ94o7IobjVcOd1aZF5iunikrMrHPI2uUdigZCi2kFTQc7ffYiFiTNaLElCpjOhCnM7bo7aK1yU7A==", - "dependencies": { - "@vue/devtools-kit": "^7.6.8", - "@vue/devtools-shared": "^7.6.8", - "mitt": "^3.0.1", - "nanoid": "^5.0.9", - "pathe": "^1.1.2", - "vite-hot-client": "^0.2.4" - }, - "peerDependencies": { - "vue": "^3.0.0" - } - }, - "node_modules/@vue/devtools-core/node_modules/pathe": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz", - "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==" - }, - "node_modules/@vue/devtools-kit": { - "version": "7.6.8", - "resolved": "https://registry.npmjs.org/@vue/devtools-kit/-/devtools-kit-7.6.8.tgz", - "integrity": "sha512-JhJ8M3sPU+v0P2iZBF2DkdmR9L0dnT5RXJabJqX6o8KtFs3tebdvfoXV2Dm3BFuqeECuMJIfF1aCzSt+WQ4wrw==", - "dependencies": { - "@vue/devtools-shared": "^7.6.8", - "birpc": "^0.2.19", - "hookable": "^5.5.3", - "mitt": "^3.0.1", - "perfect-debounce": "^1.0.0", - "speakingurl": "^14.0.1", - "superjson": "^2.2.1" - } - }, - "node_modules/@vue/devtools-shared": { - "version": "7.7.2", - "resolved": "https://registry.npmjs.org/@vue/devtools-shared/-/devtools-shared-7.7.2.tgz", - "integrity": "sha512-uBFxnp8gwW2vD6FrJB8JZLUzVb6PNRG0B0jBnHsOH8uKyva2qINY8PTF5Te4QlTbMDqU5K6qtJDr6cNsKWhbOA==", - "dependencies": { - "rfdc": "^1.4.1" - } - }, - "node_modules/@vue/reactivity": { - "version": "3.5.13", - "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.13.tgz", - "integrity": "sha512-NaCwtw8o48B9I6L1zl2p41OHo/2Z4wqYGGIK1Khu5T7yxrn+ATOixn/Udn2m+6kZKB/J7cuT9DbWWhRxqixACg==", - "dependencies": { - "@vue/shared": "3.5.13" - } - }, - "node_modules/@vue/runtime-core": { - "version": "3.5.13", - "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.13.tgz", - "integrity": "sha512-Fj4YRQ3Az0WTZw1sFe+QDb0aXCerigEpw418pw1HBUKFtnQHWzwojaukAs2X/c9DQz4MQ4bsXTGlcpGxU/RCIw==", - "dependencies": { - "@vue/reactivity": "3.5.13", - "@vue/shared": "3.5.13" - } - }, - "node_modules/@vue/runtime-dom": { - "version": "3.5.13", - "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.13.tgz", - "integrity": "sha512-dLaj94s93NYLqjLiyFzVs9X6dWhTdAlEAciC3Moq7gzAc13VJUdCnjjRurNM6uTLFATRHexHCTu/Xp3eW6yoog==", - "dependencies": { - "@vue/reactivity": "3.5.13", - "@vue/runtime-core": "3.5.13", - "@vue/shared": "3.5.13", - "csstype": "^3.1.3" - } - }, - "node_modules/@vue/server-renderer": { - "version": "3.5.13", - "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.13.tgz", - "integrity": "sha512-wAi4IRJV/2SAW3htkTlB+dHeRmpTiVIK1OGLWV1yeStVSebSQQOwGwIq0D3ZIoBj2C2qpgz5+vX9iEBkTdk5YA==", - "dependencies": { - "@vue/compiler-ssr": "3.5.13", - "@vue/shared": "3.5.13" - }, - "peerDependencies": { - "vue": "3.5.13" - } - }, - "node_modules/@vue/shared": { - "version": "3.5.13", - "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.13.tgz", - "integrity": "sha512-/hnE/qP5ZoGpol0a5mDi45bOd7t3tjYJBjsgCsivow7D48cJeV5l05RD82lPqi7gRiphZM37rnhW1l6ZoCNNnQ==" - }, - "node_modules/@vuetify/loader-shared": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@vuetify/loader-shared/-/loader-shared-2.1.0.tgz", - "integrity": "sha512-dNE6Ceym9ijFsmJKB7YGW0cxs7xbYV8+1LjU6jd4P14xOt/ji4Igtgzt0rJFbxu+ZhAzqz853lhB0z8V9Dy9cQ==", - "devOptional": true, - "dependencies": { - "upath": "^2.0.1" - }, - "peerDependencies": { - "vue": "^3.0.0", - "vuetify": "^3.0.0" - } - }, - "node_modules/@vueuse/core": { - "version": "12.7.0", - "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-12.7.0.tgz", - "integrity": "sha512-jtK5B7YjZXmkGNHjviyGO4s3ZtEhbzSgrbX+s5o+Lr8i2nYqNyHuPVOeTdM1/hZ5Tkxg/KktAuAVDDiHMraMVA==", - "dependencies": { - "@types/web-bluetooth": "^0.0.20", - "@vueuse/metadata": "12.7.0", - "@vueuse/shared": "12.7.0", - "vue": "^3.5.13" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/@vueuse/integrations": { - "version": "12.7.0", - "resolved": "https://registry.npmjs.org/@vueuse/integrations/-/integrations-12.7.0.tgz", - "integrity": "sha512-IEq7K4bCl7mn3uKJaWtNXnd1CAPaHLUMuyj5K1/k/pVcItt0VONZW8xiGxdIovJcQjkzOHjImhX5t6gija+0/g==", - "dependencies": { - "@vueuse/core": "12.7.0", - "@vueuse/shared": "12.7.0", - "vue": "^3.5.13" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - }, - "peerDependencies": { - "async-validator": "^4", - "axios": "^1", - "change-case": "^5", - "drauu": "^0.4", - "focus-trap": "^7", - "fuse.js": "^7", - "idb-keyval": "^6", - "jwt-decode": "^4", - "nprogress": "^0.2", - "qrcode": "^1.5", - "sortablejs": "^1", - "universal-cookie": "^7" - }, - "peerDependenciesMeta": { - "async-validator": { - "optional": true - }, - "axios": { - "optional": true - }, - "change-case": { - "optional": true - }, - "drauu": { - "optional": true - }, - "focus-trap": { - "optional": true - }, - "fuse.js": { - "optional": true - }, - "idb-keyval": { - "optional": true - }, - "jwt-decode": { - "optional": true - }, - "nprogress": { - "optional": true - }, - "qrcode": { - "optional": true - }, - "sortablejs": { - "optional": true - }, - "universal-cookie": { - "optional": true - } - } - }, - "node_modules/@vueuse/metadata": { - "version": "12.7.0", - "resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-12.7.0.tgz", - "integrity": "sha512-4VvTH9mrjXqFN5LYa5YfqHVRI6j7R00Vy4995Rw7PQxyCL3z0Lli86iN4UemWqixxEvYfRjG+hF9wL8oLOn+3g==", - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/@vueuse/nuxt": { - "version": "12.7.0", - "resolved": "https://registry.npmjs.org/@vueuse/nuxt/-/nuxt-12.7.0.tgz", - "integrity": "sha512-JG1yjJifcIZkFr+X1VmfNsdNZyHia/wXcpUHqVI2gwax5+bgmUlybqh9nStNGbX9NLUuPvPNNq043es5DlSJKg==", - "dependencies": { - "@nuxt/kit": "^3.15.4", - "@vueuse/core": "12.7.0", - "@vueuse/metadata": "12.7.0", - "local-pkg": "^1.0.0", - "vue": "^3.5.13" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - }, - "peerDependencies": { - "nuxt": "^3.0.0" - } - }, - "node_modules/@vueuse/nuxt/node_modules/local-pkg": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-1.0.0.tgz", - "integrity": "sha512-bbgPw/wmroJsil/GgL4qjDzs5YLTBMQ99weRsok1XCDccQeehbHA/I1oRvk2NPtr7KGZgT/Y5tPRnAtMqeG2Kg==", - "dependencies": { - "mlly": "^1.7.3", - "pkg-types": "^1.3.0" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/@vueuse/shared": { - "version": "12.7.0", - "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-12.7.0.tgz", - "integrity": "sha512-coLlUw2HHKsm7rPN6WqHJQr18WymN4wkA/3ThFaJ4v4gWGWAQQGK+MJxLuJTBs4mojQiazlVWAKNJNpUWGRkNw==", - "dependencies": { - "vue": "^3.5.13" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/@webassemblyjs/ast": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz", - "integrity": "sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==", - "peer": true, - "dependencies": { - "@webassemblyjs/helper-numbers": "1.13.2", - "@webassemblyjs/helper-wasm-bytecode": "1.13.2" - } - }, - "node_modules/@webassemblyjs/floating-point-hex-parser": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz", - "integrity": "sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==", - "peer": true - }, - "node_modules/@webassemblyjs/helper-api-error": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz", - "integrity": "sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==", - "peer": true - }, - "node_modules/@webassemblyjs/helper-buffer": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz", - "integrity": "sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==", - "peer": true - }, - "node_modules/@webassemblyjs/helper-numbers": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz", - "integrity": "sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==", - "peer": true, - "dependencies": { - "@webassemblyjs/floating-point-hex-parser": "1.13.2", - "@webassemblyjs/helper-api-error": "1.13.2", - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@webassemblyjs/helper-wasm-bytecode": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz", - "integrity": "sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==", - "peer": true - }, - "node_modules/@webassemblyjs/helper-wasm-section": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz", - "integrity": "sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==", - "peer": true, - "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@webassemblyjs/helper-buffer": "1.14.1", - "@webassemblyjs/helper-wasm-bytecode": "1.13.2", - "@webassemblyjs/wasm-gen": "1.14.1" - } - }, - "node_modules/@webassemblyjs/ieee754": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz", - "integrity": "sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==", - "peer": true, - "dependencies": { - "@xtuc/ieee754": "^1.2.0" - } - }, - "node_modules/@webassemblyjs/leb128": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.13.2.tgz", - "integrity": "sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==", - "peer": true, - "dependencies": { - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@webassemblyjs/utf8": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.13.2.tgz", - "integrity": "sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==", - "peer": true - }, - "node_modules/@webassemblyjs/wasm-edit": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz", - "integrity": "sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==", - "peer": true, - "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@webassemblyjs/helper-buffer": "1.14.1", - "@webassemblyjs/helper-wasm-bytecode": "1.13.2", - "@webassemblyjs/helper-wasm-section": "1.14.1", - "@webassemblyjs/wasm-gen": "1.14.1", - "@webassemblyjs/wasm-opt": "1.14.1", - "@webassemblyjs/wasm-parser": "1.14.1", - "@webassemblyjs/wast-printer": "1.14.1" - } - }, - "node_modules/@webassemblyjs/wasm-gen": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz", - "integrity": "sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==", - "peer": true, - "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@webassemblyjs/helper-wasm-bytecode": "1.13.2", - "@webassemblyjs/ieee754": "1.13.2", - "@webassemblyjs/leb128": "1.13.2", - "@webassemblyjs/utf8": "1.13.2" - } - }, - "node_modules/@webassemblyjs/wasm-opt": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz", - "integrity": "sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==", - "peer": true, - "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@webassemblyjs/helper-buffer": "1.14.1", - "@webassemblyjs/wasm-gen": "1.14.1", - "@webassemblyjs/wasm-parser": "1.14.1" - } - }, - "node_modules/@webassemblyjs/wasm-parser": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz", - "integrity": "sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==", - "peer": true, - "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@webassemblyjs/helper-api-error": "1.13.2", - "@webassemblyjs/helper-wasm-bytecode": "1.13.2", - "@webassemblyjs/ieee754": "1.13.2", - "@webassemblyjs/leb128": "1.13.2", - "@webassemblyjs/utf8": "1.13.2" - } - }, - "node_modules/@webassemblyjs/wast-printer": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz", - "integrity": "sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==", - "peer": true, - "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@xtuc/ieee754": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", - "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", - "peer": true - }, - "node_modules/@xtuc/long": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", - "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", - "peer": true - }, - "node_modules/abbrev": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-3.0.0.tgz", - "integrity": "sha512-+/kfrslGQ7TNV2ecmQwMJj/B65g5KVq1/L3SGVZ3tCYGqlzFuFCGBZJtMP99wH3NpEUyAjn0zPdPUg0D+DwrOA==", - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/abort-controller": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", - "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", - "dependencies": { - "event-target-shim": "^5.0.0" - }, - "engines": { - "node": ">=6.5" - } - }, - "node_modules/ace-builds": { - "version": "1.39.0", - "resolved": "https://registry.npmjs.org/ace-builds/-/ace-builds-1.39.0.tgz", - "integrity": "sha512-MqoZojv4gpc5QyTMor/dS6kmruDV9db9LVZbCiT4qYz6WsDiv4qyG5f7ZPc+wjUl6oLMqgCAsBjo1whdSVyMlQ==" - }, - "node_modules/acorn": { - "version": "8.14.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", - "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-import-attributes": { - "version": "1.9.5", - "resolved": "https://registry.npmjs.org/acorn-import-attributes/-/acorn-import-attributes-1.9.5.tgz", - "integrity": "sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==", - "peerDependencies": { - "acorn": "^8" - } - }, - "node_modules/acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/agent-base": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.3.tgz", - "integrity": "sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==", - "engines": { - "node": ">= 14" - } - }, - "node_modules/ajv": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", - "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", - "peer": true, - "dependencies": { - "fast-deep-equal": "^3.1.3", - "fast-uri": "^3.0.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ajv-formats": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", - "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", - "peer": true, - "dependencies": { - "ajv": "^8.0.0" - }, - "peerDependencies": { - "ajv": "^8.0.0" - }, - "peerDependenciesMeta": { - "ajv": { - "optional": true - } - } - }, - "node_modules/ajv-keywords": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", - "peer": true, - "dependencies": { - "fast-deep-equal": "^3.1.3" - }, - "peerDependencies": { - "ajv": "^8.8.2" - } - }, - "node_modules/ansi-colors": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", - "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", - "engines": { - "node": ">=6" - } - }, - "node_modules/ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", - "dependencies": { - "type-fest": "^0.21.3" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ansi-escapes/node_modules/type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/any-promise": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", - "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", - "dev": true - }, - "node_modules/anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/anymatch/node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/archiver": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/archiver/-/archiver-7.0.1.tgz", - "integrity": "sha512-ZcbTaIqJOfCc03QwD468Unz/5Ir8ATtvAHsK+FdXbDIbGfihqh9mrvdcYunQzqn4HrvWWaFyaxJhGZagaJJpPQ==", - "dependencies": { - "archiver-utils": "^5.0.2", - "async": "^3.2.4", - "buffer-crc32": "^1.0.0", - "readable-stream": "^4.0.0", - "readdir-glob": "^1.1.2", - "tar-stream": "^3.0.0", - "zip-stream": "^6.0.1" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/archiver-utils": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-5.0.2.tgz", - "integrity": "sha512-wuLJMmIBQYCsGZgYLTy5FIB2pF6Lfb6cXMSF8Qywwk3t20zWnAi7zLcQFdKQmIB8wyZpY5ER38x08GbwtR2cLA==", - "dependencies": { - "glob": "^10.0.0", - "graceful-fs": "^4.2.0", - "is-stream": "^2.0.1", - "lazystream": "^1.0.0", - "lodash": "^4.17.15", - "normalize-path": "^3.0.0", - "readable-stream": "^4.0.0" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/archiver-utils/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/archiver-utils/node_modules/glob": { - "version": "10.4.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", - "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^3.1.2", - "minimatch": "^9.0.4", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^1.11.1" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/archiver-utils/node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/archiver-utils/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/archiver-utils/node_modules/minipass": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", - "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" - }, - "node_modules/ast-kit": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/ast-kit/-/ast-kit-1.4.0.tgz", - "integrity": "sha512-BlGeOw73FDsX7z0eZE/wuuafxYoek2yzNJ6l6A1nsb4+z/p87TOPbHaWuN53kFKNuUXiCQa2M+xLF71IqQmRSw==", - "dependencies": { - "@babel/parser": "^7.26.5", - "pathe": "^2.0.2" - }, - "engines": { - "node": ">=16.14.0" - } - }, - "node_modules/ast-walker-scope": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/ast-walker-scope/-/ast-walker-scope-0.6.2.tgz", - "integrity": "sha512-1UWOyC50xI3QZkRuDj6PqDtpm1oHWtYs+NQGwqL/2R11eN3Q81PHAHPM0SWW3BNQm53UDwS//Jv8L4CCVLM1bQ==", - "dependencies": { - "@babel/parser": "^7.25.3", - "ast-kit": "^1.0.1" - }, - "engines": { - "node": ">=16.14.0" - } - }, - "node_modules/async": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", - "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==" - }, - "node_modules/async-sema": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/async-sema/-/async-sema-3.1.1.tgz", - "integrity": "sha512-tLRNUXati5MFePdAk8dw7Qt7DpxPB60ofAgn8WRhW6a2rcimZnYBP9oxHiv0OHy+Wz7kPMG+t4LGdt31+4EmGg==" - }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" - }, - "node_modules/autoprefixer": { - "version": "10.4.20", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.20.tgz", - "integrity": "sha512-XY25y5xSv/wEoqzDyXXME4AFfkZI0P23z6Fs3YgymDnKJkCGOnkL0iTxCa85UTqaSgfcqyf3UA6+c7wUvx/16g==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/autoprefixer" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "browserslist": "^4.23.3", - "caniuse-lite": "^1.0.30001646", - "fraction.js": "^4.3.7", - "normalize-range": "^0.1.2", - "picocolors": "^1.0.1", - "postcss-value-parser": "^4.2.0" - }, - "bin": { - "autoprefixer": "bin/autoprefixer" - }, - "engines": { - "node": "^10 || ^12 || >=14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/axios": { - "version": "1.7.9", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.9.tgz", - "integrity": "sha512-LhLcE7Hbiryz8oMDdDptSrWowmB4Bl6RCt6sIJKpRB4XtVf0iEgewX3au/pJqm+Py1kCASkb/FFKjxQaLtxJvw==", - "dependencies": { - "follow-redirects": "^1.15.6", - "form-data": "^4.0.0", - "proxy-from-env": "^1.1.0" - } - }, - "node_modules/b4a": { - "version": "1.6.7", - "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.6.7.tgz", - "integrity": "sha512-OnAYlL5b7LEkALw87fUVafQw5rVR9RjwGd4KUwNQ6DrrNmaVaUCgLipfVlzrPQ4tWOR9P0IXGNOx50jYCCdSJg==" - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" - }, - "node_modules/bare-events": { - "version": "2.5.4", - "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.5.4.tgz", - "integrity": "sha512-+gFfDkR8pj4/TrWCGUGWmJIkBwuxPS5F+a5yWjOHQt2hHvNZd5YLzadjmDUtFmMM4y429bnKLa8bYBMHcYdnQA==", - "optional": true - }, - "node_modules/base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/binary-extensions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", - "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/bindings": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", - "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", - "dependencies": { - "file-uri-to-path": "1.0.0" - } - }, - "node_modules/bintrees": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bintrees/-/bintrees-1.0.2.tgz", - "integrity": "sha512-VOMgTMwjAaUG580SXn3LacVgjurrbMme7ZZNYGSSV7mmtY6QQRh0Eg3pwIcntQ77DErK1L0NxkbetjcoXzVwKw==" - }, - "node_modules/birpc": { - "version": "0.2.19", - "resolved": "https://registry.npmjs.org/birpc/-/birpc-0.2.19.tgz", - "integrity": "sha512-5WeXXAvTmitV1RqJFppT5QtUiz2p1mRSYU000Jkft5ZUCLJIk4uQriYNO50HknxKwM6jd8utNc66K1qGIwwWBQ==", - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/boolbase": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==" - }, - "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/braces": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", - "dependencies": { - "fill-range": "^7.1.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/browserslist": { - "version": "4.24.4", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.4.tgz", - "integrity": "sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "caniuse-lite": "^1.0.30001688", - "electron-to-chromium": "^1.5.73", - "node-releases": "^2.0.19", - "update-browserslist-db": "^1.1.1" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "node_modules/buffer": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" - } - }, - "node_modules/buffer-crc32": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-1.0.0.tgz", - "integrity": "sha512-Db1SbgBS/fg/392AblrMJk97KggmvYhr4pB5ZIMTWtaivCPMWLkmb7m21cJvpvgK+J3nsU2CmmixNBZx4vFj/w==", - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" - }, - "node_modules/bundle-name": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-4.1.0.tgz", - "integrity": "sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==", - "dependencies": { - "run-applescript": "^7.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/bundle-require": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/bundle-require/-/bundle-require-5.1.0.tgz", - "integrity": "sha512-3WrrOuZiyaaZPWiEt4G3+IffISVC9HYlWueJEBWED4ZH4aIAC2PnkdnuRrR94M+w6yGWn4AglWtJtBI8YqvgoA==", - "dependencies": { - "load-tsconfig": "^0.2.3" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "peerDependencies": { - "esbuild": ">=0.18" - } - }, - "node_modules/c12": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/c12/-/c12-2.0.4.tgz", - "integrity": "sha512-3DbbhnFt0fKJHxU4tEUPmD1ahWE4PWPMomqfYsTJdrhpmEnRKJi3qSC4rO5U6E6zN1+pjBY7+z8fUmNRMaVKLw==", - "dependencies": { - "chokidar": "^4.0.3", - "confbox": "^0.1.8", - "defu": "^6.1.4", - "dotenv": "^16.4.7", - "giget": "^1.2.4", - "jiti": "^2.4.2", - "mlly": "^1.7.4", - "ohash": "^2.0.4", - "pathe": "^2.0.3", - "perfect-debounce": "^1.0.0", - "pkg-types": "^1.3.1", - "rc9": "^2.1.2" - }, - "peerDependencies": { - "magicast": "^0.3.5" - }, - "peerDependenciesMeta": { - "magicast": { - "optional": true - } - } - }, - "node_modules/c12/node_modules/ohash": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/ohash/-/ohash-2.0.4.tgz", - "integrity": "sha512-ac+SFwzhdHb0hp48/dbR7Jta39qfbuj7t3hApd9uyHS8bisHTfVzSEvjOVgV0L3zG7VR2/7JjkSGimP75D+hOQ==" - }, - "node_modules/cac": { - "version": "6.7.14", - "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", - "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/call-bind-apply-helpers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", - "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", - "dependencies": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/call-bound": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.3.tgz", - "integrity": "sha512-YTd+6wGlNlPxSuri7Y6X8tY2dmm12UMH66RpKMhiX6rsk5wXXnYgbUcOt8kiS31/AjfoTOvCsE+w8nZQLQnzHA==", - "dependencies": { - "call-bind-apply-helpers": "^1.0.1", - "get-intrinsic": "^1.2.6" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/caniuse-api": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", - "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", - "dependencies": { - "browserslist": "^4.0.0", - "caniuse-lite": "^1.0.0", - "lodash.memoize": "^4.1.2", - "lodash.uniq": "^4.5.0" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001700", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001700.tgz", - "integrity": "sha512-2S6XIXwaE7K7erT8dY+kLQcpa5ms63XlRkMkReXjle+kf6c5g38vyMl+Z5y8dSxOFDhcFe+nxnn261PLxBSQsQ==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ] - }, - "node_modules/chalk": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.4.1.tgz", - "integrity": "sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==", - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/change-case": { - "version": "5.4.4", - "resolved": "https://registry.npmjs.org/change-case/-/change-case-5.4.4.tgz", - "integrity": "sha512-HRQyTk2/YPEkt9TnUPbOpr64Uw3KOicFWPVBb+xiHvd6eBx/qPr9xqfBFDT8P2vWsvvz4jbEkfDe71W3VyNu2w==" - }, - "node_modules/chart.js": { - "version": "4.4.8", - "resolved": "https://registry.npmjs.org/chart.js/-/chart.js-4.4.8.tgz", - "integrity": "sha512-IkGZlVpXP+83QpMm4uxEiGqSI7jFizwVtF3+n5Pc3k7sMO+tkd0qxh2OzLhenM0K80xtmAONWGBn082EiBQSDA==", - "dependencies": { - "@kurkle/color": "^0.3.0" - }, - "engines": { - "pnpm": ">=8" - } - }, - "node_modules/chokidar": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", - "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", - "dependencies": { - "readdirp": "^4.0.1" - }, - "engines": { - "node": ">= 14.16.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/chownr": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", - "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", - "engines": { - "node": ">=10" - } - }, - "node_modules/chrome-trace-event": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz", - "integrity": "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==", - "peer": true, - "engines": { - "node": ">=6.0" - } - }, - "node_modules/citty": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/citty/-/citty-0.1.6.tgz", - "integrity": "sha512-tskPPKEs8D2KPafUypv2gxwJP8h/OaJmC82QQGGDQcHvXX43xF2VDACcJVmZ0EuSxkpO9Kc4MlrA3q0+FG58AQ==", - "dependencies": { - "consola": "^3.2.3" - } - }, - "node_modules/clipboardy": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/clipboardy/-/clipboardy-4.0.0.tgz", - "integrity": "sha512-5mOlNS0mhX0707P2I0aZ2V/cmHUEO/fL7VFLqszkhUsxt7RwnmrInf/eEQKlf5GzvYeHIjT+Ov1HRfNmymlG0w==", - "dependencies": { - "execa": "^8.0.1", - "is-wsl": "^3.1.0", - "is64bit": "^2.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/clipboardy/node_modules/execa": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz", - "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==", - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^8.0.1", - "human-signals": "^5.0.0", - "is-stream": "^3.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^5.1.0", - "onetime": "^6.0.0", - "signal-exit": "^4.1.0", - "strip-final-newline": "^3.0.0" - }, - "engines": { - "node": ">=16.17" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/clipboardy/node_modules/get-stream": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz", - "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==", - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/clipboardy/node_modules/human-signals": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz", - "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==", - "engines": { - "node": ">=16.17.0" - } - }, - "node_modules/clipboardy/node_modules/signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/cluster-key-slot": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/cluster-key-slot/-/cluster-key-slot-1.1.2.tgz", - "integrity": "sha512-RMr0FhtfXemyinomL4hrWcYJxmX6deFdCxpJzhDttxgO1+bcCnkk+9drydLVDmAMG7NE6aN/fl4F7ucU/90gAA==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" - }, - "node_modules/colord": { - "version": "2.9.3", - "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz", - "integrity": "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==" - }, - "node_modules/colorette": { - "version": "2.0.20", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", - "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==" - }, - "node_modules/combine-errors": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/combine-errors/-/combine-errors-3.0.3.tgz", - "integrity": "sha512-C8ikRNRMygCwaTx+Ek3Yr+OuZzgZjduCOfSQBjbM8V3MfgcjSTeto/GXP6PAwKvJz/v15b7GHZvx5rOlczFw/Q==", - "dependencies": { - "custom-error-instance": "2.1.1", - "lodash.uniqby": "4.5.0" - } - }, - "node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" - }, - "node_modules/commondir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==" - }, - "node_modules/compatx": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/compatx/-/compatx-0.1.8.tgz", - "integrity": "sha512-jcbsEAR81Bt5s1qOFymBufmCbXCXbk0Ql+K5ouj6gCyx2yHlu6AgmGIi9HxfKixpUDO5bCFJUHQ5uM6ecbTebw==" - }, - "node_modules/compress-commons": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-6.0.2.tgz", - "integrity": "sha512-6FqVXeETqWPoGcfzrXb37E50NP0LXT8kAMu5ooZayhWWdgEY4lBEEcbQNXtkuKQsGduxiIcI4gOTsxTmuq/bSg==", - "dependencies": { - "crc-32": "^1.2.0", - "crc32-stream": "^6.0.0", - "is-stream": "^2.0.1", - "normalize-path": "^3.0.0", - "readable-stream": "^4.0.0" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/compress-commons/node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" - }, - "node_modules/confbox": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.1.8.tgz", - "integrity": "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==" - }, - "node_modules/consola": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/consola/-/consola-3.4.0.tgz", - "integrity": "sha512-EiPU8G6dQG0GFHNR8ljnZFki/8a+cQwEQ+7wpxdChl02Q8HXlwEZWD5lqAF8vC2sEC3Tehr8hy7vErz88LHyUA==", - "engines": { - "node": "^14.18.0 || >=16.10.0" - } - }, - "node_modules/convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==" - }, - "node_modules/cookie-es": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/cookie-es/-/cookie-es-1.2.2.tgz", - "integrity": "sha512-+W7VmiVINB+ywl1HGXJXmrqkOhpKrIiVZV6tQuV54ZyQC7MMuBt81Vc336GMLoHBq5hV/F9eXgt5Mnx0Rha5Fg==" - }, - "node_modules/copy-anything": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/copy-anything/-/copy-anything-3.0.5.tgz", - "integrity": "sha512-yCEafptTtb4bk7GLEQoM8KVJpxAfdBJYaXyzQEgQQQgYrZiDp8SJmGKlYza6CYjEDNstAdNdKA3UuoULlEbS6w==", - "dependencies": { - "is-what": "^4.1.8" - }, - "engines": { - "node": ">=12.13" - }, - "funding": { - "url": "https://github.com/sponsors/mesqueeb" - } - }, - "node_modules/core-util-is": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" - }, - "node_modules/crc-32": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", - "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==", - "bin": { - "crc32": "bin/crc32.njs" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/crc32-stream": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-6.0.0.tgz", - "integrity": "sha512-piICUB6ei4IlTv1+653yq5+KoqfBYmj9bw6LqXoOneTMDXk5nM1qt12mFW1caG3LlJXEKW1Bp0WggEmIfQB34g==", - "dependencies": { - "crc-32": "^1.2.0", - "readable-stream": "^4.0.0" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/croner": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/croner/-/croner-9.0.0.tgz", - "integrity": "sha512-onMB0OkDjkXunhdW9htFjEhqrD54+M94i6ackoUkjHKbRnXdyEyKRelp4nJ1kAz32+s27jP1FsebpJCVl0BsvA==", - "engines": { - "node": ">=18.0" - } - }, - "node_modules/cronstrue": { - "version": "2.55.0", - "resolved": "https://registry.npmjs.org/cronstrue/-/cronstrue-2.55.0.tgz", - "integrity": "sha512-ZsBZNtQWb0Rk6CNGJlzpPBYqNE7t93Aez5ZCExLihGwmIpE5qThSTDQzDV8Z1Nw6ksmLkwI98nPKyciZ5sH7dw==", - "bin": { - "cronstrue": "bin/cli.js" - } - }, - "node_modules/cross-spawn": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", - "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/crossws": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/crossws/-/crossws-0.3.4.tgz", - "integrity": "sha512-uj0O1ETYX1Bh6uSgktfPvwDiPYGQ3aI4qVsaC/LWpkIzGj1nUYm5FK3K+t11oOlpN01lGbprFCH4wBlKdJjVgw==", - "dependencies": { - "uncrypto": "^0.1.3" - } - }, - "node_modules/css-declaration-sorter": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-7.2.0.tgz", - "integrity": "sha512-h70rUM+3PNFuaBDTLe8wF/cdWu+dOZmb7pJt8Z2sedYbAcQVQV/tEchueg3GWxwqS0cxtbxmaHEdkNACqcvsow==", - "engines": { - "node": "^14 || ^16 || >=18" - }, - "peerDependencies": { - "postcss": "^8.0.9" - } - }, - "node_modules/css-select": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", - "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", - "dependencies": { - "boolbase": "^1.0.0", - "css-what": "^6.1.0", - "domhandler": "^5.0.2", - "domutils": "^3.0.1", - "nth-check": "^2.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/css-tree": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.3.1.tgz", - "integrity": "sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==", - "dependencies": { - "mdn-data": "2.0.30", - "source-map-js": "^1.0.1" - }, - "engines": { - "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" - } - }, - "node_modules/css-what": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", - "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", - "engines": { - "node": ">= 6" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/cssesc": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", - "bin": { - "cssesc": "bin/cssesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/cssnano": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-7.0.6.tgz", - "integrity": "sha512-54woqx8SCbp8HwvNZYn68ZFAepuouZW4lTwiMVnBErM3VkO7/Sd4oTOt3Zz3bPx3kxQ36aISppyXj2Md4lg8bw==", - "dependencies": { - "cssnano-preset-default": "^7.0.6", - "lilconfig": "^3.1.2" - }, - "engines": { - "node": "^18.12.0 || ^20.9.0 || >=22.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/cssnano" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/cssnano-preset-default": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-7.0.6.tgz", - "integrity": "sha512-ZzrgYupYxEvdGGuqL+JKOY70s7+saoNlHSCK/OGn1vB2pQK8KSET8jvenzItcY+kA7NoWvfbb/YhlzuzNKjOhQ==", - "dependencies": { - "browserslist": "^4.23.3", - "css-declaration-sorter": "^7.2.0", - "cssnano-utils": "^5.0.0", - "postcss-calc": "^10.0.2", - "postcss-colormin": "^7.0.2", - "postcss-convert-values": "^7.0.4", - "postcss-discard-comments": "^7.0.3", - "postcss-discard-duplicates": "^7.0.1", - "postcss-discard-empty": "^7.0.0", - "postcss-discard-overridden": "^7.0.0", - "postcss-merge-longhand": "^7.0.4", - "postcss-merge-rules": "^7.0.4", - "postcss-minify-font-values": "^7.0.0", - "postcss-minify-gradients": "^7.0.0", - "postcss-minify-params": "^7.0.2", - "postcss-minify-selectors": "^7.0.4", - "postcss-normalize-charset": "^7.0.0", - "postcss-normalize-display-values": "^7.0.0", - "postcss-normalize-positions": "^7.0.0", - "postcss-normalize-repeat-style": "^7.0.0", - "postcss-normalize-string": "^7.0.0", - "postcss-normalize-timing-functions": "^7.0.0", - "postcss-normalize-unicode": "^7.0.2", - "postcss-normalize-url": "^7.0.0", - "postcss-normalize-whitespace": "^7.0.0", - "postcss-ordered-values": "^7.0.1", - "postcss-reduce-initial": "^7.0.2", - "postcss-reduce-transforms": "^7.0.0", - "postcss-svgo": "^7.0.1", - "postcss-unique-selectors": "^7.0.3" - }, - "engines": { - "node": "^18.12.0 || ^20.9.0 || >=22.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/cssnano-utils": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-5.0.0.tgz", - "integrity": "sha512-Uij0Xdxc24L6SirFr25MlwC2rCFX6scyUmuKpzI+JQ7cyqDEwD42fJ0xfB3yLfOnRDU5LKGgjQ9FA6LYh76GWQ==", - "engines": { - "node": "^18.12.0 || ^20.9.0 || >=22.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/csso": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/csso/-/csso-5.0.5.tgz", - "integrity": "sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==", - "dependencies": { - "css-tree": "~2.2.0" - }, - "engines": { - "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0", - "npm": ">=7.0.0" - } - }, - "node_modules/csso/node_modules/css-tree": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.2.1.tgz", - "integrity": "sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==", - "dependencies": { - "mdn-data": "2.0.28", - "source-map-js": "^1.0.1" - }, - "engines": { - "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0", - "npm": ">=7.0.0" - } - }, - "node_modules/csso/node_modules/mdn-data": { - "version": "2.0.28", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.28.tgz", - "integrity": "sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==" - }, - "node_modules/csstype": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", - "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==" - }, - "node_modules/custom-error-instance": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/custom-error-instance/-/custom-error-instance-2.1.1.tgz", - "integrity": "sha512-p6JFxJc3M4OTD2li2qaHkDCw9SfMw82Ldr6OC9Je1aXiGfhx2W8p3GaoeaGrPJTUN9NirTM/KTxHWMUdR1rsUg==" - }, - "node_modules/date-fns": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-3.6.0.tgz", - "integrity": "sha512-fRHTG8g/Gif+kSh50gaGEdToemgfj74aRX3swtiouboip5JDLAyDE9F11nHMIcvOaXeOC6D7SpNhi7uFyB7Uww==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/kossnocorp" - } - }, - "node_modules/db0": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/db0/-/db0-0.2.4.tgz", - "integrity": "sha512-hIzftLH1nMsF95zSLjDLYLbE9huOXnLYUTAQ5yKF5amp0FpeD+B15XJa8BvGYSOeSCH4gl2WahB/y1FcUByQSg==", - "peerDependencies": { - "@electric-sql/pglite": "*", - "@libsql/client": "*", - "better-sqlite3": "*", - "drizzle-orm": "*", - "mysql2": "*", - "sqlite3": "*" - }, - "peerDependenciesMeta": { - "@electric-sql/pglite": { - "optional": true - }, - "@libsql/client": { - "optional": true - }, - "better-sqlite3": { - "optional": true - }, - "drizzle-orm": { - "optional": true - }, - "mysql2": { - "optional": true - }, - "sqlite3": { - "optional": true - } - } - }, - "node_modules/debug": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", - "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/deep-pick-omit": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/deep-pick-omit/-/deep-pick-omit-1.2.1.tgz", - "integrity": "sha512-2J6Kc/m3irCeqVG42T+SaUMesaK7oGWaedGnQQK/+O0gYc+2SP5bKh/KKTE7d7SJ+GCA9UUE1GRzh6oDe0EnGw==", - "dev": true - }, - "node_modules/deepmerge": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", - "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/default-browser": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-5.2.1.tgz", - "integrity": "sha512-WY/3TUME0x3KPYdRRxEJJvXRHV4PyPoUsxtZa78lwItwRQRHhd2U9xOscaT/YTf8uCXIAjeJOFBVEh/7FtD8Xg==", - "dependencies": { - "bundle-name": "^4.1.0", - "default-browser-id": "^5.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/default-browser-id": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-5.0.0.tgz", - "integrity": "sha512-A6p/pu/6fyBcA1TRz/GqWYPViplrftcW2gZC9q79ngNCKAeR/X3gcEdXQHl4KNXV+3wgIJ1CPkJQ3IHM6lcsyA==", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/define-lazy-prop": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", - "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", - "engines": { - "node": ">=8" - } - }, - "node_modules/defu": { - "version": "6.1.4", - "resolved": "https://registry.npmjs.org/defu/-/defu-6.1.4.tgz", - "integrity": "sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==" - }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/denque": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/denque/-/denque-2.1.0.tgz", - "integrity": "sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==", - "engines": { - "node": ">=0.10" - } - }, - "node_modules/depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/destr": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/destr/-/destr-2.0.3.tgz", - "integrity": "sha512-2N3BOUU4gYMpTP24s5rF5iP7BDr7uNTCs4ozw3kf/eKfvWSIu93GEBi5m427YoyJoeOzQ5smuu4nNAPGb8idSQ==" - }, - "node_modules/destroy": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "node_modules/detect-libc": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", - "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==", - "bin": { - "detect-libc": "bin/detect-libc.js" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/devalue": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/devalue/-/devalue-5.1.1.tgz", - "integrity": "sha512-maua5KUiapvEwiEAe+XnlZ3Rh0GD+qI1J/nb9vrJc3muPXvcF/8gXYTWF76+5DAqHyDUtOIImEuo0YKE9mshVw==" - }, - "node_modules/diff": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-7.0.0.tgz", - "integrity": "sha512-PJWHUb1RFevKCwaFA9RlG5tCd+FO5iRh9A8HEtkmBH2Li03iJriB6m6JIN4rGz3K3JLawI7/veA1xzRKP6ISBw==", - "engines": { - "node": ">=0.3.1" - } - }, - "node_modules/discontinuous-range": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/discontinuous-range/-/discontinuous-range-1.0.0.tgz", - "integrity": "sha512-c68LpLbO+7kP/b1Hr1qs8/BJ09F5khZGTxqxZuhzxpmwJKOgRFHJWIb9/KmqnqHhLdO55aOxFH/EGBvUQbL/RQ==" - }, - "node_modules/dom-serializer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", - "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", - "dependencies": { - "domelementtype": "^2.3.0", - "domhandler": "^5.0.2", - "entities": "^4.2.0" - }, - "funding": { - "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" - } - }, - "node_modules/domelementtype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", - "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ] - }, - "node_modules/domhandler": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", - "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", - "dependencies": { - "domelementtype": "^2.3.0" - }, - "engines": { - "node": ">= 4" - }, - "funding": { - "url": "https://github.com/fb55/domhandler?sponsor=1" - } - }, - "node_modules/domutils": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz", - "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==", - "dependencies": { - "dom-serializer": "^2.0.0", - "domelementtype": "^2.3.0", - "domhandler": "^5.0.3" - }, - "funding": { - "url": "https://github.com/fb55/domutils?sponsor=1" - } - }, - "node_modules/dot-prop": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-9.0.0.tgz", - "integrity": "sha512-1gxPBJpI/pcjQhKgIU91II6Wkay+dLcN3M6rf2uwP8hRur3HtQXjVrdAK3sjC0piaEuxzMwjXChcETiJl47lAQ==", - "dependencies": { - "type-fest": "^4.18.2" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/dotenv": { - "version": "16.4.7", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.7.tgz", - "integrity": "sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://dotenvx.com" - } - }, - "node_modules/dunder-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", - "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", - "dependencies": { - "call-bind-apply-helpers": "^1.0.1", - "es-errors": "^1.3.0", - "gopd": "^1.2.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/duplexer": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", - "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==" - }, - "node_modules/eastasianwidth": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==" - }, - "node_modules/ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" - }, - "node_modules/electron-to-chromium": { - "version": "1.5.103", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.103.tgz", - "integrity": "sha512-P6+XzIkfndgsrjROJWfSvVEgNHtPgbhVyTkwLjUM2HU/h7pZRORgaTlHqfAikqxKmdJMLW8fftrdGWbd/Ds0FA==" - }, - "node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "node_modules/encodeurl": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", - "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/enhanced-resolve": { - "version": "5.18.1", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.1.tgz", - "integrity": "sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg==", - "dependencies": { - "graceful-fs": "^4.2.4", - "tapable": "^2.2.0" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/entities": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", - "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/error-stack-parser-es": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/error-stack-parser-es/-/error-stack-parser-es-0.1.5.tgz", - "integrity": "sha512-xHku1X40RO+fO8yJ8Wh2f2rZWVjqyhb1zgq1yZ8aZRQkv6OOKhKWRUaht3eSCUbAOBaKIgM+ykwFLE+QUxgGeg==", - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/errx": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/errx/-/errx-0.1.0.tgz", - "integrity": "sha512-fZmsRiDNv07K6s2KkKFTiD2aIvECa7++PKyD5NC32tpRw46qZA3sOz+aM+/V9V0GDHxVTKLziveV4JhzBHDp9Q==" - }, - "node_modules/es-define-property": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", - "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-errors": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-module-lexer": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.6.0.tgz", - "integrity": "sha512-qqnD1yMU6tk/jnaMosogGySTZP8YtUgAffA9nMN+E/rjxcfRQ6IEk7IiozUjgxKoFHBGjTLnrHB/YC45r/59EQ==" - }, - "node_modules/es-object-atoms": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", - "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", - "dependencies": { - "es-errors": "^1.3.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-set-tostringtag": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", - "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", - "dependencies": { - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.6", - "has-tostringtag": "^1.0.2", - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/esbuild": { - "version": "0.24.2", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.24.2.tgz", - "integrity": "sha512-+9egpBW8I3CD5XPe0n6BfT5fxLzxrlDzqydF3aviG+9ni1lDC/OvMHcxqEFV0+LANZG5R1bFMWfUrjVsdwxJvA==", - "hasInstallScript": true, - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=18" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.24.2", - "@esbuild/android-arm": "0.24.2", - "@esbuild/android-arm64": "0.24.2", - "@esbuild/android-x64": "0.24.2", - "@esbuild/darwin-arm64": "0.24.2", - "@esbuild/darwin-x64": "0.24.2", - "@esbuild/freebsd-arm64": "0.24.2", - "@esbuild/freebsd-x64": "0.24.2", - "@esbuild/linux-arm": "0.24.2", - "@esbuild/linux-arm64": "0.24.2", - "@esbuild/linux-ia32": "0.24.2", - "@esbuild/linux-loong64": "0.24.2", - "@esbuild/linux-mips64el": "0.24.2", - "@esbuild/linux-ppc64": "0.24.2", - "@esbuild/linux-riscv64": "0.24.2", - "@esbuild/linux-s390x": "0.24.2", - "@esbuild/linux-x64": "0.24.2", - "@esbuild/netbsd-arm64": "0.24.2", - "@esbuild/netbsd-x64": "0.24.2", - "@esbuild/openbsd-arm64": "0.24.2", - "@esbuild/openbsd-x64": "0.24.2", - "@esbuild/sunos-x64": "0.24.2", - "@esbuild/win32-arm64": "0.24.2", - "@esbuild/win32-ia32": "0.24.2", - "@esbuild/win32-x64": "0.24.2" - } - }, - "node_modules/escalade": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", - "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", - "engines": { - "node": ">=6" - } - }, - "node_modules/escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" - }, - "node_modules/escape-string-regexp": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", - "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/escodegen": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", - "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", - "dev": true, - "dependencies": { - "esprima": "^4.0.1", - "estraverse": "^5.2.0", - "esutils": "^2.0.2" - }, - "bin": { - "escodegen": "bin/escodegen.js", - "esgenerate": "bin/esgenerate.js" - }, - "engines": { - "node": ">=6.0" - }, - "optionalDependencies": { - "source-map": "~0.6.1" - } - }, - "node_modules/eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "peer": true, - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/eslint-scope/node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "peer": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/espree": { - "version": "9.6.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", - "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", - "dev": true, - "dependencies": { - "acorn": "^8.9.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.4.1" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true, - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "peer": true, - "dependencies": { - "estraverse": "^5.2.0" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estree-walker": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", - "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", - "dependencies": { - "@types/estree": "^1.0.0" - } - }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/event-target-shim": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", - "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", - "engines": { - "node": ">=6" - } - }, - "node_modules/events": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", - "engines": { - "node": ">=0.8.x" - } - }, - "node_modules/execa": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-7.2.0.tgz", - "integrity": "sha512-UduyVP7TLB5IcAQl+OzLyLcS/l32W/GLg+AhHJ+ow40FOk2U3SAllPwR44v4vmdFwIWqpdwxxpQbF1n5ta9seA==", - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.1", - "human-signals": "^4.3.0", - "is-stream": "^3.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^5.1.0", - "onetime": "^6.0.0", - "signal-exit": "^3.0.7", - "strip-final-newline": "^3.0.0" - }, - "engines": { - "node": "^14.18.0 || ^16.14.0 || >=18.0.0" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/externality": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/externality/-/externality-1.0.2.tgz", - "integrity": "sha512-LyExtJWKxtgVzmgtEHyQtLFpw1KFhQphF9nTG8TpAIVkiI/xQ3FJh75tRFLYl4hkn7BNIIdLJInuDAavX35pMw==", - "dependencies": { - "enhanced-resolve": "^5.14.1", - "mlly": "^1.3.0", - "pathe": "^1.1.1", - "ufo": "^1.1.2" - } - }, - "node_modules/externality/node_modules/pathe": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz", - "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==" - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" - }, - "node_modules/fast-fifo": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz", - "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==" - }, - "node_modules/fast-glob": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", - "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.8" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/fast-npm-meta": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/fast-npm-meta/-/fast-npm-meta-0.2.2.tgz", - "integrity": "sha512-E+fdxeaOQGo/CMWc9f4uHFfgUPJRAu7N3uB8GBvB3SDPAIWJK4GKyYhkAGFq+GYrcbKNfQIz5VVQyJnDuPPCrg==", - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/fast-uri": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.6.tgz", - "integrity": "sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fastify" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/fastify" - } - ], - "peer": true - }, - "node_modules/fastq": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.0.tgz", - "integrity": "sha512-7SFSRCNjBQIZH/xZR3iy5iQYR8aGBE0h3VG6/cwlbrpdciNYBMotQav8c1XI3HjHH+NikUpP53nPdlZSdWmFzA==", - "dependencies": { - "reusify": "^1.0.4" - } - }, - "node_modules/fdir": { - "version": "6.4.3", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.3.tgz", - "integrity": "sha512-PMXmW2y1hDDfTSRc9gaXIuCCRpuoz3Kaz8cUelp3smouvfT632ozg2vrT6lJsHKKOF59YLbOGfAWGUcKEfRMQw==", - "peerDependencies": { - "picomatch": "^3 || ^4" - }, - "peerDependenciesMeta": { - "picomatch": { - "optional": true - } - } - }, - "node_modules/file-uri-to-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", - "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==" - }, - "node_modules/fill-range": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/flatted": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", - "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==" - }, - "node_modules/focus-trap": { - "version": "7.6.4", - "resolved": "https://registry.npmjs.org/focus-trap/-/focus-trap-7.6.4.tgz", - "integrity": "sha512-xx560wGBk7seZ6y933idtjJQc1l+ck+pI3sKvhKozdBV1dRZoKhkW5xoCaFv9tQiX5RH1xfSxjuNu6g+lmN/gw==", - "dependencies": { - "tabbable": "^6.2.0" - } - }, - "node_modules/follow-redirects": { - "version": "1.15.9", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz", - "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==", - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], - "engines": { - "node": ">=4.0" - }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } - } - }, - "node_modules/foreground-child": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", - "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", - "dependencies": { - "cross-spawn": "^7.0.6", - "signal-exit": "^4.0.1" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/foreground-child/node_modules/signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/form-data": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.2.tgz", - "integrity": "sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w==", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "es-set-tostringtag": "^2.1.0", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/fraction.js": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", - "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==", - "engines": { - "node": "*" - }, - "funding": { - "type": "patreon", - "url": "https://github.com/sponsors/rawify" - } - }, - "node_modules/fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/fs-extra": { - "version": "11.3.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.0.tgz", - "integrity": "sha512-Z4XaCL6dUDHfP/jT25jJKMmtxvuwbkrD1vNSMFlo9lNLY2c5FHYSQgHPRZUjAB26TpDEoW9HCOgplrdbaPV/ew==", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=14.14" - } - }, - "node_modules/fs-minipass": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", - "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/fs-minipass/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/fs-minipass/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" - }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/fuse.js": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/fuse.js/-/fuse.js-7.1.0.tgz", - "integrity": "sha512-trLf4SzuuUxfusZADLINj+dE8clK1frKdmqiJNb1Es75fmI5oY6X2mxLVUciLLjxqw/xr72Dhy+lER6dGd02FQ==", - "engines": { - "node": ">=10" - } - }, - "node_modules/gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/get-intrinsic": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", - "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", - "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "es-define-property": "^1.0.1", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.1.1", - "function-bind": "^1.1.2", - "get-proto": "^1.0.1", - "gopd": "^1.2.0", - "has-symbols": "^1.1.0", - "hasown": "^2.0.2", - "math-intrinsics": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-port-please": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/get-port-please/-/get-port-please-3.1.2.tgz", - "integrity": "sha512-Gxc29eLs1fbn6LQ4jSU4vXjlwyZhF5HsGuMAa7gqBP4Rw4yxxltyDUuF5MBclFzDTXO+ACchGQoeela4DSfzdQ==" - }, - "node_modules/get-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", - "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", - "dependencies": { - "dunder-proto": "^1.0.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/get-stdin": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-8.0.0.tgz", - "integrity": "sha512-sY22aA6xchAzprjyqmSEQv4UbAAzRN0L2dQB0NlN5acTTK9Don6nhoc3eAbUnpZiCANAMfd/+40kVdKfFygohg==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/get-tsconfig": { - "version": "4.10.0", - "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.10.0.tgz", - "integrity": "sha512-kGzZ3LWWQcGIAmg6iWvXn0ei6WDtV26wzHRMwDSzmAbcXrTEXxHy6IehI6/4eT6VRKyMP1eF1VqwrVUmE/LR7A==", - "dependencies": { - "resolve-pkg-maps": "^1.0.0" - }, - "funding": { - "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" - } - }, - "node_modules/giget": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/giget/-/giget-1.2.5.tgz", - "integrity": "sha512-r1ekGw/Bgpi3HLV3h1MRBIlSAdHoIMklpaQ3OQLFcRw9PwAj2rqigvIbg+dBUI51OxVI2jsEtDywDBjSiuf7Ug==", - "dependencies": { - "citty": "^0.1.6", - "consola": "^3.4.0", - "defu": "^6.1.4", - "node-fetch-native": "^1.6.6", - "nypm": "^0.5.4", - "pathe": "^2.0.3", - "tar": "^6.2.1" - }, - "bin": { - "giget": "dist/cli.mjs" - } - }, - "node_modules/git-config-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/git-config-path/-/git-config-path-2.0.0.tgz", - "integrity": "sha512-qc8h1KIQbJpp+241id3GuAtkdyJ+IK+LIVtkiFTRKRrmddDzs3SI9CvP1QYmWBFvm1I/PWRwj//of8bgAc0ltA==", - "engines": { - "node": ">=4" - } - }, - "node_modules/git-up": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/git-up/-/git-up-8.0.1.tgz", - "integrity": "sha512-2XFu1uNZMSjkyetaF+8rqn6P0XqpMq/C+2ycjI6YwrIKcszZ5/WR4UubxjN0lILOKqLkLaHDaCr2B6fP1cke6g==", - "dependencies": { - "is-ssh": "^1.4.0", - "parse-url": "^9.2.0" - } - }, - "node_modules/git-url-parse": { - "version": "16.0.1", - "resolved": "https://registry.npmjs.org/git-url-parse/-/git-url-parse-16.0.1.tgz", - "integrity": "sha512-mcD36GrhAzX5JVOsIO52qNpgRyFzYWRbU1VSRFCvJt1IJvqfvH427wWw/CFqkWvjVPtdG5VTx4MKUeC5GeFPDQ==", - "dependencies": { - "git-up": "^8.0.0" - } - }, - "node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Glob versions prior to v9 are no longer supported", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/glob-to-regexp": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", - "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", - "peer": true - }, - "node_modules/global-directory": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/global-directory/-/global-directory-4.0.1.tgz", - "integrity": "sha512-wHTUcDUoZ1H5/0iVqEudYW4/kAlN5cZ3j/bXn0Dpbizl9iaUVeWSHqiOjsgk6OW2bkLclbBjzewBz6weQ1zA2Q==", - "dependencies": { - "ini": "4.1.1" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "engines": { - "node": ">=4" - } - }, - "node_modules/globby": { - "version": "14.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-14.1.0.tgz", - "integrity": "sha512-0Ia46fDOaT7k4og1PDW4YbodWWr3scS2vAr2lTbsplOt2WkKp0vQbkI9wKis/T5LV/dqPjO3bpS/z6GTJB82LA==", - "dependencies": { - "@sindresorhus/merge-streams": "^2.1.0", - "fast-glob": "^3.3.3", - "ignore": "^7.0.3", - "path-type": "^6.0.0", - "slash": "^5.1.0", - "unicorn-magic": "^0.3.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/gopd": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", - "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" - }, - "node_modules/gzip-size": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-7.0.0.tgz", - "integrity": "sha512-O1Ld7Dr+nqPnmGpdhzLmMTQ4vAsD+rHwMm1NLUmoUFFymBOMKxCCrtDxqdBRYXdeEPEi3SyoR4TizJLQrnKBNA==", - "dependencies": { - "duplexer": "^0.1.2" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/h3": { - "version": "1.15.1", - "resolved": "https://registry.npmjs.org/h3/-/h3-1.15.1.tgz", - "integrity": "sha512-+ORaOBttdUm1E2Uu/obAyCguiI7MbBvsLTndc3gyK3zU+SYLoZXlyCP9Xgy0gikkGufFLTZXCXD6+4BsufnmHA==", - "dependencies": { - "cookie-es": "^1.2.2", - "crossws": "^0.3.3", - "defu": "^6.1.4", - "destr": "^2.0.3", - "iron-webcrypto": "^1.2.1", - "node-mock-http": "^1.0.0", - "radix3": "^1.1.2", - "ufo": "^1.5.4", - "uncrypto": "^0.1.3" - } - }, - "node_modules/h3-compression": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/h3-compression/-/h3-compression-0.3.2.tgz", - "integrity": "sha512-B+yCKyDRnO0BXSfjAP4tCXJgJwmnKp3GyH5Yh66mY9KuOCrrGQSPk/gBFG2TgH7OyB/6mvqNZ1X0XNVuy0qRsw==", - "funding": { - "url": "https://github.com/sponsors/codedredd" - }, - "peerDependencies": { - "h3": "^1.6.0" - } - }, - "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/has-symbols": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", - "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-tostringtag": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", - "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", - "dependencies": { - "has-symbols": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", - "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/hookable": { - "version": "5.5.3", - "resolved": "https://registry.npmjs.org/hookable/-/hookable-5.5.3.tgz", - "integrity": "sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==" - }, - "node_modules/html-tags": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.3.1.tgz", - "integrity": "sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/http-errors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", - "dependencies": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/http-shutdown": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/http-shutdown/-/http-shutdown-1.2.2.tgz", - "integrity": "sha512-S9wWkJ/VSY9/k4qcjG318bqJNruzE4HySUhFYknwmu6LBP97KLLfwNf+n4V1BHurvFNkSKLFnK/RsuUnRTf9Vw==", - "engines": { - "iojs": ">= 1.0.0", - "node": ">= 0.12.0" - } - }, - "node_modules/http-status-codes": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/http-status-codes/-/http-status-codes-2.3.0.tgz", - "integrity": "sha512-RJ8XvFvpPM/Dmc5SV+dC4y5PCeOhT3x1Hq0NU3rjGeg5a/CqlhZ7uudknPwZFz4aeAXDcbAyaeP7GAo9lvngtA==" - }, - "node_modules/https-proxy-agent": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", - "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", - "dependencies": { - "agent-base": "^7.1.2", - "debug": "4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/httpxy": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/httpxy/-/httpxy-0.1.7.tgz", - "integrity": "sha512-pXNx8gnANKAndgga5ahefxc++tJvNL87CXoRwxn1cJE2ZkWEojF3tNfQIEhZX/vfpt+wzeAzpUI4qkediX1MLQ==" - }, - "node_modules/human-signals": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-4.3.1.tgz", - "integrity": "sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==", - "engines": { - "node": ">=14.18.0" - } - }, - "node_modules/ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/ignore": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.3.tgz", - "integrity": "sha512-bAH5jbK/F3T3Jls4I0SO1hmPR0dKU0a7+SY6n1yzRtG54FLO8d6w/nxLFX2Nb7dBu6cCWXPaAME6cYqFUMmuCA==", - "engines": { - "node": ">= 4" - } - }, - "node_modules/image-meta": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/image-meta/-/image-meta-0.2.1.tgz", - "integrity": "sha512-K6acvFaelNxx8wc2VjbIzXKDVB0Khs0QT35U6NkGfTdCmjLNcO2945m7RFNR9/RPVFm48hq7QPzK8uGH18HCGw==" - }, - "node_modules/immutable": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-5.0.3.tgz", - "integrity": "sha512-P8IdPQHq3lA1xVeBRi5VPqUm5HDgKnx0Ru51wZz5mjxHr5n3RWhjIpOFU7ybkUxfB+5IToy+OLaHYDBIWsv+uw==", - "devOptional": true - }, - "node_modules/importx": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/importx/-/importx-0.5.2.tgz", - "integrity": "sha512-YEwlK86Ml5WiTxN/ECUYC5U7jd1CisAVw7ya4i9ZppBoHfFkT2+hChhr3PE2fYxUKLkNyivxEQpa5Ruil1LJBQ==", - "dependencies": { - "bundle-require": "^5.1.0", - "debug": "^4.4.0", - "esbuild": "^0.20.2 || ^0.21.0 || ^0.22.0 || ^0.23.0 || ^0.24.0 || ^0.25.0", - "jiti": "^2.4.2", - "pathe": "^2.0.3", - "tsx": "^4.19.2" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/impound": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/impound/-/impound-0.2.0.tgz", - "integrity": "sha512-gXgeSyp9Hf7qG2/PLKmywHXyQf2xFrw+mJGpoj9DsAB9L7/MIKn+DeEx98UryWXdmbv8wUUPdcQof6qXnZoCGg==", - "dependencies": { - "@rollup/pluginutils": "^5.1.2", - "mlly": "^1.7.2", - "pathe": "^1.1.2", - "unenv": "^1.10.0", - "unplugin": "^1.14.1" - } - }, - "node_modules/impound/node_modules/pathe": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz", - "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==" - }, - "node_modules/index-to-position": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/index-to-position/-/index-to-position-0.1.2.tgz", - "integrity": "sha512-MWDKS3AS1bGCHLBA2VLImJz42f7bJh8wQsTGCzI3j519/CASStoDONUBVz2I/VID0MpiX3SGSnbOD2xUalbE5g==", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "node_modules/ini": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.1.tgz", - "integrity": "sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g==", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/ioredis": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/ioredis/-/ioredis-5.5.0.tgz", - "integrity": "sha512-7CutT89g23FfSa8MDoIFs2GYYa0PaNiW/OrT+nRyjRXHDZd17HmIgy+reOQ/yhh72NznNjGuS8kbCAcA4Ro4mw==", - "dependencies": { - "@ioredis/commands": "^1.1.1", - "cluster-key-slot": "^1.1.0", - "debug": "^4.3.4", - "denque": "^2.1.0", - "lodash.defaults": "^4.2.0", - "lodash.isarguments": "^3.1.0", - "redis-errors": "^1.2.0", - "redis-parser": "^3.0.0", - "standard-as-callback": "^2.1.0" - }, - "engines": { - "node": ">=12.22.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/ioredis" - } - }, - "node_modules/iron-webcrypto": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/iron-webcrypto/-/iron-webcrypto-1.2.1.tgz", - "integrity": "sha512-feOM6FaSr6rEABp/eDfVseKyTMDt+KGpeB35SkVn9Tyn0CqvVsY3EwI0v5i8nMHyJnzCIQf7nsy3p41TPkJZhg==", - "funding": { - "url": "https://github.com/sponsors/brc-dd" - } - }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-core-module": { - "version": "2.16.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", - "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", - "dependencies": { - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-docker": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", - "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", - "bin": { - "is-docker": "cli.js" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-https": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-https/-/is-https-4.0.0.tgz", - "integrity": "sha512-FeMLiqf8E5g6SdiVJsPcNZX8k4h2fBs1wp5Bb6uaNxn58ufK1axBqQZdmAQsqh0t9BuwFObybrdVJh6MKyPlyg==", - "dev": true - }, - "node_modules/is-inside-container": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", - "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", - "dependencies": { - "is-docker": "^3.0.0" - }, - "bin": { - "is-inside-container": "cli.js" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-installed-globally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-1.0.0.tgz", - "integrity": "sha512-K55T22lfpQ63N4KEN57jZUAaAYqYHEe8veb/TycJRk9DdSCLLcovXz/mL6mOnhQaZsQGwPhuFopdQIlqGSEjiQ==", - "dependencies": { - "global-directory": "^4.0.1", - "is-path-inside": "^4.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-module": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", - "integrity": "sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==" - }, - "node_modules/is-node-process": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/is-node-process/-/is-node-process-1.2.0.tgz", - "integrity": "sha512-Vg4o6/fqPxIjtxgUH5QLJhwZ7gW5diGCVlXpuUfELC62CuxM1iHcRe51f2W1FDy04Ai4KJkagKjx3XaqyfRKXw==" - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-path-inside": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-4.0.0.tgz", - "integrity": "sha512-lJJV/5dYS+RcL8uQdBDW9c9uWFLLBNRyFhnAKXw5tVqLlKZ4RMGZKv+YQ/IA3OhD+RpbJa1LLFM1FQPGyIXvOA==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-reference": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-1.2.1.tgz", - "integrity": "sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==", - "dependencies": { - "@types/estree": "*" - } - }, - "node_modules/is-ssh": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/is-ssh/-/is-ssh-1.4.1.tgz", - "integrity": "sha512-JNeu1wQsHjyHgn9NcWTaXq6zWSR6hqE0++zhfZlkFBbScNkyvxCdeV8sRkSBaeLKxmbpR21brail63ACNxJ0Tg==", - "dependencies": { - "protocols": "^2.0.1" - } - }, - "node_modules/is-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", - "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-what": { - "version": "4.1.16", - "resolved": "https://registry.npmjs.org/is-what/-/is-what-4.1.16.tgz", - "integrity": "sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A==", - "engines": { - "node": ">=12.13" - }, - "funding": { - "url": "https://github.com/sponsors/mesqueeb" - } - }, - "node_modules/is-wsl": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.0.tgz", - "integrity": "sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==", - "dependencies": { - "is-inside-container": "^1.0.0" - }, - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is64bit": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is64bit/-/is64bit-2.0.0.tgz", - "integrity": "sha512-jv+8jaWCl0g2lSBkNSVXdzfBA0npK1HGC2KtWM9FumFRoGS94g3NbCCLVnCYHLjp4GrW2KZeeSTMo5ddtznmGw==", - "dependencies": { - "system-architecture": "^0.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" - }, - "node_modules/jackspeak": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", - "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", - "dependencies": { - "@isaacs/cliui": "^8.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - }, - "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" - } - }, - "node_modules/jest-worker": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", - "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", - "peer": true, - "dependencies": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "engines": { - "node": ">= 10.13.0" - } - }, - "node_modules/jest-worker/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "peer": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/jiti": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.4.2.tgz", - "integrity": "sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==", - "bin": { - "jiti": "lib/jiti-cli.mjs" - } - }, - "node_modules/jose": { - "version": "5.10.0", - "resolved": "https://registry.npmjs.org/jose/-/jose-5.10.0.tgz", - "integrity": "sha512-s+3Al/p9g32Iq+oqXxkW//7jk2Vig6FF1CFqzVXoTUXt2qz89YWbL+OwS17NFYEvxC35n0FKeGO2LGYSxeM2Gg==", - "funding": { - "url": "https://github.com/sponsors/panva" - } - }, - "node_modules/js-base64": { - "version": "3.7.7", - "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-3.7.7.tgz", - "integrity": "sha512-7rCnleh0z2CkXhH67J8K1Ytz0b2Y+yxTPL+/KOJoa20hfnVQ/3/T6W/KflYI4bRHRagNeXeU2bkNGI3v1oS/lw==" - }, - "node_modules/js-levenshtein": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/js-levenshtein/-/js-levenshtein-1.1.6.tgz", - "integrity": "sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" - }, - "node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/jsesc": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", - "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "peer": true - }, - "node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" - }, - "node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/jsonc-eslint-parser": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/jsonc-eslint-parser/-/jsonc-eslint-parser-2.4.0.tgz", - "integrity": "sha512-WYDyuc/uFcGp6YtM2H0uKmUwieOuzeE/5YocFJLnLfclZ4inf3mRn8ZVy1s7Hxji7Jxm6Ss8gqpexD/GlKoGgg==", - "dev": true, - "dependencies": { - "acorn": "^8.5.0", - "eslint-visitor-keys": "^3.0.0", - "espree": "^9.0.0", - "semver": "^7.3.5" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ota-meshi" - } - }, - "node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/jwt-decode": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jwt-decode/-/jwt-decode-4.0.0.tgz", - "integrity": "sha512-+KJGIyHgkGuIq3IEBNftfhW/LfWhXUIY6OmyVWjliu5KH1y0fw7VQ8YndE2O4qZdMSd9SqbnC8GOcZEy0Om7sA==", - "engines": { - "node": ">=18" - } - }, - "node_modules/kleur": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", - "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", - "engines": { - "node": ">=6" - } - }, - "node_modules/klona": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.6.tgz", - "integrity": "sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==", - "engines": { - "node": ">= 8" - } - }, - "node_modules/knitwork": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/knitwork/-/knitwork-1.2.0.tgz", - "integrity": "sha512-xYSH7AvuQ6nXkq42x0v5S8/Iry+cfulBz/DJQzhIyESdLD7425jXsPy4vn5cCXU+HhRN2kVw51Vd1K6/By4BQg==" - }, - "node_modules/kolorist": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/kolorist/-/kolorist-1.8.0.tgz", - "integrity": "sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==" - }, - "node_modules/launch-editor": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.10.0.tgz", - "integrity": "sha512-D7dBRJo/qcGX9xlvt/6wUYzQxjh5G1RvZPgPv8vi4KRU99DVQL/oW7tnVOCCTm2HGeo3C5HvGE5Yrh6UBoZ0vA==", - "dependencies": { - "picocolors": "^1.0.0", - "shell-quote": "^1.8.1" - } - }, - "node_modules/lazystream": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.1.tgz", - "integrity": "sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==", - "dependencies": { - "readable-stream": "^2.0.5" - }, - "engines": { - "node": ">= 0.6.3" - } - }, - "node_modules/lazystream/node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/lazystream/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "node_modules/lazystream/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/lilconfig": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", - "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/antonk52" - } - }, - "node_modules/lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "dev": true - }, - "node_modules/listhen": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/listhen/-/listhen-1.9.0.tgz", - "integrity": "sha512-I8oW2+QL5KJo8zXNWX046M134WchxsXC7SawLPvRQpogCbkyQIaFxPE89A2HiwR7vAK2Dm2ERBAmyjTYGYEpBg==", - "dependencies": { - "@parcel/watcher": "^2.4.1", - "@parcel/watcher-wasm": "^2.4.1", - "citty": "^0.1.6", - "clipboardy": "^4.0.0", - "consola": "^3.2.3", - "crossws": ">=0.2.0 <0.4.0", - "defu": "^6.1.4", - "get-port-please": "^3.1.2", - "h3": "^1.12.0", - "http-shutdown": "^1.2.2", - "jiti": "^2.1.2", - "mlly": "^1.7.1", - "node-forge": "^1.3.1", - "pathe": "^1.1.2", - "std-env": "^3.7.0", - "ufo": "^1.5.4", - "untun": "^0.1.3", - "uqr": "^0.1.2" - }, - "bin": { - "listen": "bin/listhen.mjs", - "listhen": "bin/listhen.mjs" - } - }, - "node_modules/listhen/node_modules/pathe": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz", - "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==" - }, - "node_modules/load-tsconfig": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/load-tsconfig/-/load-tsconfig-0.2.5.tgz", - "integrity": "sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==", - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - } - }, - "node_modules/loader-runner": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", - "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", - "peer": true, - "engines": { - "node": ">=6.11.5" - } - }, - "node_modules/local-pkg": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-0.5.1.tgz", - "integrity": "sha512-9rrA30MRRP3gBD3HTGnC6cDFpaE1kVDWxWgqWJUN0RvDNAo+Nz/9GxB+nHOH0ifbVFy0hSA1V6vFDvnx54lTEQ==", - "dependencies": { - "mlly": "^1.7.3", - "pkg-types": "^1.2.1" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" - }, - "node_modules/lodash._baseiteratee": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/lodash._baseiteratee/-/lodash._baseiteratee-4.7.0.tgz", - "integrity": "sha512-nqB9M+wITz0BX/Q2xg6fQ8mLkyfF7MU7eE+MNBNjTHFKeKaZAPEzEg+E8LWxKWf1DQVflNEn9N49yAuqKh2mWQ==", - "dependencies": { - "lodash._stringtopath": "~4.8.0" - } - }, - "node_modules/lodash._basetostring": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/lodash._basetostring/-/lodash._basetostring-4.12.0.tgz", - "integrity": "sha512-SwcRIbyxnN6CFEEK4K1y+zuApvWdpQdBHM/swxP962s8HIxPO3alBH5t3m/dl+f4CMUug6sJb7Pww8d13/9WSw==" - }, - "node_modules/lodash._baseuniq": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/lodash._baseuniq/-/lodash._baseuniq-4.6.0.tgz", - "integrity": "sha512-Ja1YevpHZctlI5beLA7oc5KNDhGcPixFhcqSiORHNsp/1QTv7amAXzw+gu4YOvErqVlMVyIJGgtzeepCnnur0A==", - "dependencies": { - "lodash._createset": "~4.0.0", - "lodash._root": "~3.0.0" - } - }, - "node_modules/lodash._createset": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/lodash._createset/-/lodash._createset-4.0.3.tgz", - "integrity": "sha512-GTkC6YMprrJZCYU3zcqZj+jkXkrXzq3IPBcF/fIPpNEAB4hZEtXU8zp/RwKOvZl43NUmwDbyRk3+ZTbeRdEBXA==" - }, - "node_modules/lodash._root": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/lodash._root/-/lodash._root-3.0.1.tgz", - "integrity": "sha512-O0pWuFSK6x4EXhM1dhZ8gchNtG7JMqBtrHdoUFUWXD7dJnNSUze1GuyQr5sOs0aCvgGeI3o/OJW8f4ca7FDxmQ==" - }, - "node_modules/lodash._stringtopath": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/lodash._stringtopath/-/lodash._stringtopath-4.8.0.tgz", - "integrity": "sha512-SXL66C731p0xPDC5LZg4wI5H+dJo/EO4KTqOMwLYCH3+FmmfAKJEZCm6ohGpI+T1xwsDsJCfL4OnhorllvlTPQ==", - "dependencies": { - "lodash._basetostring": "~4.12.0" - } - }, - "node_modules/lodash.defaults": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", - "integrity": "sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==" - }, - "node_modules/lodash.isarguments": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", - "integrity": "sha512-chi4NHZlZqZD18a0imDHnZPrDeBbTtVN7GXMwuGdRH9qotxAjYs3aVLKc7zNOG9eddR5Ksd8rvFEBc9SsggPpg==" - }, - "node_modules/lodash.memoize": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", - "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==" - }, - "node_modules/lodash.throttle": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/lodash.throttle/-/lodash.throttle-4.1.1.tgz", - "integrity": "sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==" - }, - "node_modules/lodash.uniq": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", - "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==" - }, - "node_modules/lodash.uniqby": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.uniqby/-/lodash.uniqby-4.5.0.tgz", - "integrity": "sha512-IRt7cfTtHy6f1aRVA5n7kT8rgN3N1nH6MOWLcHfpWG2SH19E3JksLK38MktLxZDhlAjCP9jpIXkOnRXlu6oByQ==", - "dependencies": { - "lodash._baseiteratee": "~4.7.0", - "lodash._baseuniq": "~4.6.0" - } - }, - "node_modules/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dependencies": { - "yallist": "^3.0.2" - } - }, - "node_modules/magic-string": { - "version": "0.30.17", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz", - "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.0" - } - }, - "node_modules/magic-string-ast": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/magic-string-ast/-/magic-string-ast-0.7.0.tgz", - "integrity": "sha512-686fgAHaJY7wLTFEq7nnKqeQrhqmXB19d1HnqT35Ci7BN6hbAYLZUezTQ062uUHM7ggZEQlqJ94Ftls+KDXU8Q==", - "dependencies": { - "magic-string": "^0.30.17" - }, - "engines": { - "node": ">=16.14.0" - } - }, - "node_modules/magicast": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/magicast/-/magicast-0.3.5.tgz", - "integrity": "sha512-L0WhttDl+2BOsybvEOLK7fW3UA0OQ0IQ2d6Zl2x/a6vVRs3bAY0ECOSHHeL5jD+SbOpOCUEi0y1DgHEn9Qn1AQ==", - "dependencies": { - "@babel/parser": "^7.25.4", - "@babel/types": "^7.25.4", - "source-map-js": "^1.2.0" - } - }, - "node_modules/math-intrinsics": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", - "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/mdn-data": { - "version": "2.0.30", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.30.tgz", - "integrity": "sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==" - }, - "node_modules/merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" - }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "engines": { - "node": ">= 8" - } - }, - "node_modules/merkle-json": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/merkle-json/-/merkle-json-2.7.0.tgz", - "integrity": "sha512-yzOZPrvIydATWQMk0lLxKjudKQV7Deu4hh/EJT7+q6c4aYs7J02WVGG5Mv6B5QbLJGy78h+u2nE5f8eUpDFGEg==", - "dependencies": { - "merkle-json": "^2.1.0" - }, - "engines": { - "node": ">=6.11.0" - } - }, - "node_modules/micromatch": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", - "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", - "dependencies": { - "braces": "^3.0.3", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/micromatch/node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/mime": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/mime/-/mime-4.0.6.tgz", - "integrity": "sha512-4rGt7rvQHBbaSOF9POGkk1ocRP16Md1x36Xma8sz8h8/vfCUI2OtEIeCqe4Ofes853x4xDoPiFLIT47J5fI/7A==", - "funding": [ - "https://github.com/sponsors/broofa" - ], - "bin": { - "mime": "bin/cli.js" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mimic-fn": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", - "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/minipass": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", - "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", - "engines": { - "node": ">=8" - } - }, - "node_modules/minizlib": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", - "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", - "dependencies": { - "minipass": "^3.0.0", - "yallist": "^4.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/minizlib/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/minizlib/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - }, - "node_modules/mitt": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz", - "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==" - }, - "node_modules/mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "bin": { - "mkdirp": "bin/cmd.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/mlly": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.7.4.tgz", - "integrity": "sha512-qmdSIPC4bDJXgZTCR7XosJiNKySV7O215tsPtDN9iEO/7q/76b/ijtgRu/+epFXSJhijtTCCGp3DWS549P3xKw==", - "dependencies": { - "acorn": "^8.14.0", - "pathe": "^2.0.1", - "pkg-types": "^1.3.0", - "ufo": "^1.5.4" - } - }, - "node_modules/moment": { - "version": "2.30.1", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.30.1.tgz", - "integrity": "sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==", - "engines": { - "node": "*" - } - }, - "node_modules/moo": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/moo/-/moo-0.5.2.tgz", - "integrity": "sha512-iSAJLHYKnX41mKcJKjqvnAN9sf0LMDTXDEvFv+ffuRR9a1MIuXLjMNL6EsnDHSkKLTWNqQQ5uo61P4EbU4NU+Q==" - }, - "node_modules/mrmime": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.1.tgz", - "integrity": "sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==", - "engines": { - "node": ">=10" - } - }, - "node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" - }, - "node_modules/mz": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", - "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", - "dev": true, - "dependencies": { - "any-promise": "^1.0.0", - "object-assign": "^4.0.1", - "thenify-all": "^1.0.0" - } - }, - "node_modules/nanoid": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-5.1.2.tgz", - "integrity": "sha512-b+CiXQCNMUGe0Ri64S9SXFcP9hogjAJ2Rd6GdVxhPLRm7mhGaM7VgOvCAJ1ZshfHbqVDI3uqTI5C8/GaKuLI7g==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "bin": { - "nanoid": "bin/nanoid.js" - }, - "engines": { - "node": "^18 || >=20" - } - }, - "node_modules/nanotar": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/nanotar/-/nanotar-0.2.0.tgz", - "integrity": "sha512-9ca1h0Xjvo9bEkE4UOxgAzLV0jHKe6LMaxo37ND2DAhhAtd0j8pR1Wxz+/goMrZO8AEZTWCmyaOsFI/W5AdpCQ==" - }, - "node_modules/nearley": { - "version": "2.20.1", - "resolved": "https://registry.npmjs.org/nearley/-/nearley-2.20.1.tgz", - "integrity": "sha512-+Mc8UaAebFzgV+KpI5n7DasuuQCHA89dmwm7JXw3TV43ukfNQ9DnBH3Mdb2g/I4Fdxc26pwimBWvjIw0UAILSQ==", - "dependencies": { - "commander": "^2.19.0", - "moo": "^0.5.0", - "railroad-diagrams": "^1.0.0", - "randexp": "0.4.6" - }, - "bin": { - "nearley-railroad": "bin/nearley-railroad.js", - "nearley-test": "bin/nearley-test.js", - "nearley-unparse": "bin/nearley-unparse.js", - "nearleyc": "bin/nearleyc.js" - }, - "funding": { - "type": "individual", - "url": "https://nearley.js.org/#give-to-nearley" - } - }, - "node_modules/neo-async": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", - "peer": true - }, - "node_modules/nitropack": { - "version": "2.10.4", - "resolved": "https://registry.npmjs.org/nitropack/-/nitropack-2.10.4.tgz", - "integrity": "sha512-sJiG/MIQlZCVSw2cQrFG1H6mLeSqHlYfFerRjLKz69vUfdu0EL2l0WdOxlQbzJr3mMv/l4cOlCCLzVRzjzzF/g==", - "dependencies": { - "@cloudflare/kv-asset-handler": "^0.3.4", - "@netlify/functions": "^2.8.2", - "@rollup/plugin-alias": "^5.1.1", - "@rollup/plugin-commonjs": "^28.0.1", - "@rollup/plugin-inject": "^5.0.5", - "@rollup/plugin-json": "^6.1.0", - "@rollup/plugin-node-resolve": "^15.3.0", - "@rollup/plugin-replace": "^6.0.1", - "@rollup/plugin-terser": "^0.4.4", - "@rollup/pluginutils": "^5.1.3", - "@types/http-proxy": "^1.17.15", - "@vercel/nft": "^0.27.5", - "archiver": "^7.0.1", - "c12": "2.0.1", - "chokidar": "^3.6.0", - "citty": "^0.1.6", - "compatx": "^0.1.8", - "confbox": "^0.1.8", - "consola": "^3.2.3", - "cookie-es": "^1.2.2", - "croner": "^9.0.0", - "crossws": "^0.3.1", - "db0": "^0.2.1", - "defu": "^6.1.4", - "destr": "^2.0.3", - "dot-prop": "^9.0.0", - "esbuild": "^0.24.0", - "escape-string-regexp": "^5.0.0", - "etag": "^1.8.1", - "fs-extra": "^11.2.0", - "globby": "^14.0.2", - "gzip-size": "^7.0.0", - "h3": "^1.13.0", - "hookable": "^5.5.3", - "httpxy": "^0.1.5", - "ioredis": "^5.4.1", - "jiti": "^2.4.0", - "klona": "^2.0.6", - "knitwork": "^1.1.0", - "listhen": "^1.9.0", - "magic-string": "^0.30.12", - "magicast": "^0.3.5", - "mime": "^4.0.4", - "mlly": "^1.7.2", - "node-fetch-native": "^1.6.4", - "ofetch": "^1.4.1", - "ohash": "^1.1.4", - "openapi-typescript": "^7.4.2", - "pathe": "^1.1.2", - "perfect-debounce": "^1.0.0", - "pkg-types": "^1.2.1", - "pretty-bytes": "^6.1.1", - "radix3": "^1.1.2", - "rollup": "^4.24.3", - "rollup-plugin-visualizer": "^5.12.0", - "scule": "^1.3.0", - "semver": "^7.6.3", - "serve-placeholder": "^2.0.2", - "serve-static": "^1.16.2", - "std-env": "^3.7.0", - "ufo": "^1.5.4", - "uncrypto": "^0.1.3", - "unctx": "^2.3.1", - "unenv": "^1.10.0", - "unimport": "^3.13.1", - "unstorage": "^1.13.1", - "untyped": "^1.5.1", - "unwasm": "^0.3.9" - }, - "bin": { - "nitro": "dist/cli/index.mjs", - "nitropack": "dist/cli/index.mjs" - }, - "engines": { - "node": "^16.11.0 || >=17.0.0" - }, - "peerDependencies": { - "xml2js": "^0.6.2" - }, - "peerDependenciesMeta": { - "xml2js": { - "optional": true - } - } - }, - "node_modules/nitropack/node_modules/c12": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/c12/-/c12-2.0.1.tgz", - "integrity": "sha512-Z4JgsKXHG37C6PYUtIxCfLJZvo6FyhHJoClwwb9ftUkLpPSkuYqn6Tr+vnaN8hymm0kIbcg6Ey3kv/Q71k5w/A==", - "dependencies": { - "chokidar": "^4.0.1", - "confbox": "^0.1.7", - "defu": "^6.1.4", - "dotenv": "^16.4.5", - "giget": "^1.2.3", - "jiti": "^2.3.0", - "mlly": "^1.7.1", - "ohash": "^1.1.4", - "pathe": "^1.1.2", - "perfect-debounce": "^1.0.0", - "pkg-types": "^1.2.0", - "rc9": "^2.1.2" - }, - "peerDependencies": { - "magicast": "^0.3.5" - }, - "peerDependenciesMeta": { - "magicast": { - "optional": true - } - } - }, - "node_modules/nitropack/node_modules/c12/node_modules/chokidar": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", - "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", - "dependencies": { - "readdirp": "^4.0.1" - }, - "engines": { - "node": ">= 14.16.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/nitropack/node_modules/chokidar": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", - "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/nitropack/node_modules/chokidar/node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/nitropack/node_modules/chokidar/node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/nitropack/node_modules/js-tokens": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-9.0.1.tgz", - "integrity": "sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==" - }, - "node_modules/nitropack/node_modules/local-pkg": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-1.0.0.tgz", - "integrity": "sha512-bbgPw/wmroJsil/GgL4qjDzs5YLTBMQ99weRsok1XCDccQeehbHA/I1oRvk2NPtr7KGZgT/Y5tPRnAtMqeG2Kg==", - "dependencies": { - "mlly": "^1.7.3", - "pkg-types": "^1.3.0" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/nitropack/node_modules/pathe": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz", - "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==" - }, - "node_modules/nitropack/node_modules/strip-literal": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-2.1.1.tgz", - "integrity": "sha512-631UJ6O00eNGfMiWG78ck80dfBab8X6IVFB51jZK5Icd7XAs60Z5y7QdSd/wGIklnWvRbUNloVzhOKKmutxQ6Q==", - "dependencies": { - "js-tokens": "^9.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/nitropack/node_modules/unimport": { - "version": "3.14.6", - "resolved": "https://registry.npmjs.org/unimport/-/unimport-3.14.6.tgz", - "integrity": "sha512-CYvbDaTT04Rh8bmD8jz3WPmHYZRG/NnvYVzwD6V1YAlvvKROlAeNDUBhkBGzNav2RKaeuXvlWYaa1V4Lfi/O0g==", - "dependencies": { - "@rollup/pluginutils": "^5.1.4", - "acorn": "^8.14.0", - "escape-string-regexp": "^5.0.0", - "estree-walker": "^3.0.3", - "fast-glob": "^3.3.3", - "local-pkg": "^1.0.0", - "magic-string": "^0.30.17", - "mlly": "^1.7.4", - "pathe": "^2.0.1", - "picomatch": "^4.0.2", - "pkg-types": "^1.3.0", - "scule": "^1.3.0", - "strip-literal": "^2.1.1", - "unplugin": "^1.16.1" - } - }, - "node_modules/nitropack/node_modules/unimport/node_modules/pathe": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", - "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==" - }, - "node_modules/node-addon-api": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz", - "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==" - }, - "node_modules/node-fetch": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", - "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } - }, - "node_modules/node-fetch-native": { - "version": "1.6.6", - "resolved": "https://registry.npmjs.org/node-fetch-native/-/node-fetch-native-1.6.6.tgz", - "integrity": "sha512-8Mc2HhqPdlIfedsuZoc3yioPuzp6b+L5jRCRY1QzuWZh2EGJVQrGppC6V6cF0bLdbW0+O2YpqCA25aF/1lvipQ==" - }, - "node_modules/node-forge": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", - "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", - "engines": { - "node": ">= 6.13.0" - } - }, - "node_modules/node-gyp-build": { - "version": "4.8.4", - "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.4.tgz", - "integrity": "sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==", - "bin": { - "node-gyp-build": "bin.js", - "node-gyp-build-optional": "optional.js", - "node-gyp-build-test": "build-test.js" - } - }, - "node_modules/node-mock-http": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/node-mock-http/-/node-mock-http-1.0.0.tgz", - "integrity": "sha512-0uGYQ1WQL1M5kKvGRXWQ3uZCHtLTO8hln3oBjIusM75WoesZ909uQJs/Hb946i2SS+Gsrhkaa6iAO17jRIv6DQ==" - }, - "node_modules/node-releases": { - "version": "2.0.19", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", - "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==" - }, - "node_modules/nopt": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-8.1.0.tgz", - "integrity": "sha512-ieGu42u/Qsa4TFktmaKEwM6MQH0pOWnaB3htzh0JRtx84+Mebc0cbZYN5bC+6WTZ4+77xrL9Pn5m7CV6VIkV7A==", - "dependencies": { - "abbrev": "^3.0.0" - }, - "bin": { - "nopt": "bin/nopt.js" - }, - "engines": { - "node": "^18.17.0 || >=20.5.0" - } - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/normalize-range": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", - "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/npm-run-path": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz", - "integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==", - "dependencies": { - "path-key": "^4.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/npm-run-path/node_modules/path-key": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", - "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/nth-check": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", - "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", - "dependencies": { - "boolbase": "^1.0.0" - }, - "funding": { - "url": "https://github.com/fb55/nth-check?sponsor=1" - } - }, - "node_modules/nuxt": { - "version": "3.15.4", - "resolved": "https://registry.npmjs.org/nuxt/-/nuxt-3.15.4.tgz", - "integrity": "sha512-hSbZO4mR0uAMJtZPNTnCfiAtgleoOu28gvJcBNU7KQHgWnNXPjlWgwMczko2O4Tmnv9zIe/CQged+2HsPwl2ZA==", - "dependencies": { - "@nuxt/cli": "^3.21.1", - "@nuxt/devalue": "^2.0.2", - "@nuxt/devtools": "^1.7.0", - "@nuxt/kit": "3.15.4", - "@nuxt/schema": "3.15.4", - "@nuxt/telemetry": "^2.6.4", - "@nuxt/vite-builder": "3.15.4", - "@unhead/dom": "^1.11.18", - "@unhead/shared": "^1.11.18", - "@unhead/ssr": "^1.11.18", - "@unhead/vue": "^1.11.18", - "@vue/shared": "^3.5.13", - "acorn": "8.14.0", - "c12": "^2.0.1", - "chokidar": "^4.0.3", - "compatx": "^0.1.8", - "consola": "^3.4.0", - "cookie-es": "^1.2.2", - "defu": "^6.1.4", - "destr": "^2.0.3", - "devalue": "^5.1.1", - "errx": "^0.1.0", - "esbuild": "^0.24.2", - "escape-string-regexp": "^5.0.0", - "estree-walker": "^3.0.3", - "globby": "^14.0.2", - "h3": "^1.14.0", - "hookable": "^5.5.3", - "ignore": "^7.0.3", - "impound": "^0.2.0", - "jiti": "^2.4.2", - "klona": "^2.0.6", - "knitwork": "^1.2.0", - "magic-string": "^0.30.17", - "mlly": "^1.7.4", - "nanotar": "^0.2.0", - "nitropack": "^2.10.4", - "nypm": "^0.5.2", - "ofetch": "^1.4.1", - "ohash": "^1.1.4", - "pathe": "^2.0.2", - "perfect-debounce": "^1.0.0", - "pkg-types": "^1.3.1", - "radix3": "^1.1.2", - "scule": "^1.3.0", - "semver": "^7.6.3", - "std-env": "^3.8.0", - "strip-literal": "^3.0.0", - "tinyglobby": "0.2.10", - "ufo": "^1.5.4", - "ultrahtml": "^1.5.3", - "uncrypto": "^0.1.3", - "unctx": "^2.4.1", - "unenv": "^1.10.0", - "unhead": "^1.11.18", - "unimport": "^4.0.0", - "unplugin": "^2.1.2", - "unplugin-vue-router": "^0.11.2", - "unstorage": "^1.14.4", - "untyped": "^1.5.2", - "vue": "^3.5.13", - "vue-bundle-renderer": "^2.1.1", - "vue-devtools-stub": "^0.1.0", - "vue-router": "^4.5.0" - }, - "bin": { - "nuxi": "bin/nuxt.mjs", - "nuxt": "bin/nuxt.mjs" - }, - "engines": { - "node": "^18.20.5 || ^20.9.0 || >=22.0.0" - }, - "peerDependencies": { - "@parcel/watcher": "^2.1.0", - "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0" - }, - "peerDependenciesMeta": { - "@parcel/watcher": { - "optional": true - }, - "@types/node": { - "optional": true - } - } - }, - "node_modules/nuxt-oidc-auth": { - "version": "1.0.0-beta.5", - "resolved": "https://registry.npmjs.org/nuxt-oidc-auth/-/nuxt-oidc-auth-1.0.0-beta.5.tgz", - "integrity": "sha512-/bZ3yBfKmT40Kk66RZ9757SGMvqcZqLYRX6HK3l2o4N1dPvz1gW50t6cZ6UFJ63G7FWdHUuoRyo2INEpvbXe4g==", - "dependencies": { - "@nuxt/devtools-kit": "^1.7.0", - "@nuxt/devtools-ui-kit": "^1.7.0", - "consola": "^3.4.0", - "defu": "^6.1.4", - "h3": "^1.13.1", - "jose": "^5.9.6", - "ofetch": "^1.4.1", - "scule": "^1.3.0", - "sirv": "^3.0.0", - "ufo": "^1.5.4", - "uncrypto": "^0.1.3", - "undici": "^7.2.3", - "undio": "^0.2.0" - }, - "peerDependencies": { - "undici": "^7.2.1" - }, - "peerDependenciesMeta": { - "undici": { - "optional": true - } - } - }, - "node_modules/nuxt-oidc-auth/node_modules/sirv": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/sirv/-/sirv-3.0.1.tgz", - "integrity": "sha512-FoqMu0NCGBLCcAkS1qA+XJIQTR6/JHfQXl+uGteNCQ76T91DMUjPa9xfmeqMY3z80nLSg9yQmNjK0Px6RWsH/A==", - "dependencies": { - "@polka/url": "^1.0.0-next.24", - "mrmime": "^2.0.0", - "totalist": "^3.0.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/nuxt-site-config": { - "version": "2.2.21", - "resolved": "https://registry.npmjs.org/nuxt-site-config/-/nuxt-site-config-2.2.21.tgz", - "integrity": "sha512-VsHpR4socGrlRPjyg2F8JqbirBqH4yCkTQa60fj7saqKMPW1VcRROn21OJzfTHDpjeD+KayRdR3FB0Jxk9WFNA==", - "dependencies": { - "@nuxt/devtools-kit": "^1.6.0", - "@nuxt/kit": "^3.13.2", - "@nuxt/schema": "^3.13.2", - "nuxt-site-config-kit": "2.2.21", - "pathe": "^1.1.2", - "pkg-types": "^1.2.1", - "sirv": "^3.0.0", - "site-config-stack": "2.2.21", - "ufo": "^1.5.4" - }, - "funding": { - "url": "https://github.com/sponsors/harlan-zw" - } - }, - "node_modules/nuxt-site-config-kit": { - "version": "2.2.21", - "resolved": "https://registry.npmjs.org/nuxt-site-config-kit/-/nuxt-site-config-kit-2.2.21.tgz", - "integrity": "sha512-xO41Zf6bXlA9Zvj+fX7ftD+ITee4LfrkzHj85Gt4FpgwonFxzGO5pMBtAqIxXKJwuyT1z2wVAixHI+ov66wV0w==", - "dependencies": { - "@nuxt/kit": "^3.13.2", - "@nuxt/schema": "^3.13.2", - "pkg-types": "^1.2.1", - "site-config-stack": "2.2.21", - "std-env": "^3.7.0", - "ufo": "^1.5.4" - }, - "funding": { - "url": "https://github.com/sponsors/harlan-zw" - } - }, - "node_modules/nuxt-site-config/node_modules/pathe": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz", - "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==" - }, - "node_modules/nuxt-site-config/node_modules/sirv": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/sirv/-/sirv-3.0.1.tgz", - "integrity": "sha512-FoqMu0NCGBLCcAkS1qA+XJIQTR6/JHfQXl+uGteNCQ76T91DMUjPa9xfmeqMY3z80nLSg9yQmNjK0Px6RWsH/A==", - "dependencies": { - "@polka/url": "^1.0.0-next.24", - "mrmime": "^2.0.0", - "totalist": "^3.0.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/nuxt/node_modules/unplugin": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-2.2.0.tgz", - "integrity": "sha512-m1ekpSwuOT5hxkJeZGRxO7gXbXT3gF26NjQ7GdVHoLoF8/nopLcd/QfPigpCy7i51oFHiRJg/CyHhj4vs2+KGw==", - "dependencies": { - "acorn": "^8.14.0", - "webpack-virtual-modules": "^0.6.2" - }, - "engines": { - "node": ">=18.12.0" - } - }, - "node_modules/nypm": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/nypm/-/nypm-0.5.4.tgz", - "integrity": "sha512-X0SNNrZiGU8/e/zAB7sCTtdxWTMSIO73q+xuKgglm2Yvzwlo8UoC5FNySQFCvl84uPaeADkqHUZUkWy4aH4xOA==", - "dependencies": { - "citty": "^0.1.6", - "consola": "^3.4.0", - "pathe": "^2.0.3", - "pkg-types": "^1.3.1", - "tinyexec": "^0.3.2", - "ufo": "^1.5.4" - }, - "bin": { - "nypm": "dist/cli.mjs" - }, - "engines": { - "node": "^14.16.0 || >=16.10.0" - } - }, - "node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-inspect": { - "version": "1.13.4", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", - "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/ofetch": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/ofetch/-/ofetch-1.4.1.tgz", - "integrity": "sha512-QZj2DfGplQAr2oj9KzceK9Hwz6Whxazmn85yYeVuS3u9XTMOGMRx0kO95MQ+vLsj/S/NwBDMMLU5hpxvI6Tklw==", - "dependencies": { - "destr": "^2.0.3", - "node-fetch-native": "^1.6.4", - "ufo": "^1.5.4" - } - }, - "node_modules/ohash": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/ohash/-/ohash-1.1.4.tgz", - "integrity": "sha512-FlDryZAahJmEF3VR3w1KogSEdWX3WhA5GPakFx4J81kEAiHyLMpdLLElS8n8dfNadMgAne/MywcvmogzscVt4g==" - }, - "node_modules/on-finished": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/onetime": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", - "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", - "dependencies": { - "mimic-fn": "^4.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/open": { - "version": "8.4.2", - "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", - "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", - "dependencies": { - "define-lazy-prop": "^2.0.0", - "is-docker": "^2.1.1", - "is-wsl": "^2.2.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/open/node_modules/is-docker": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", - "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", - "bin": { - "is-docker": "cli.js" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/open/node_modules/is-wsl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", - "dependencies": { - "is-docker": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/openapi-typescript": { - "version": "7.6.1", - "resolved": "https://registry.npmjs.org/openapi-typescript/-/openapi-typescript-7.6.1.tgz", - "integrity": "sha512-F7RXEeo/heF3O9lOXo2bNjCOtfp7u+D6W3a3VNEH2xE6v+fxLtn5nq0uvUcA1F5aT+CMhNeC5Uqtg5tlXFX/ag==", - "dependencies": { - "@redocly/openapi-core": "^1.28.0", - "ansi-colors": "^4.1.3", - "change-case": "^5.4.4", - "parse-json": "^8.1.0", - "supports-color": "^9.4.0", - "yargs-parser": "^21.1.1" - }, - "bin": { - "openapi-typescript": "bin/cli.js" - }, - "peerDependencies": { - "typescript": "^5.x" - } - }, - "node_modules/outvariant": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/outvariant/-/outvariant-1.4.3.tgz", - "integrity": "sha512-+Sl2UErvtsoajRDKCE5/dBz4DIvHXQQnAxtQTF04OJxY0+DyZXSo5P5Bb7XYWOh81syohlYL24hbDwxedPUJCA==" - }, - "node_modules/package-json-from-dist": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", - "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==" - }, - "node_modules/package-manager-detector": { - "version": "0.2.9", - "resolved": "https://registry.npmjs.org/package-manager-detector/-/package-manager-detector-0.2.9.tgz", - "integrity": "sha512-+vYvA/Y31l8Zk8dwxHhL3JfTuHPm6tlxM2A3GeQyl7ovYnSp1+mzAxClxaOr0qO1TtPxbQxetI7v5XqKLJZk7Q==" - }, - "node_modules/packrup": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/packrup/-/packrup-0.1.2.tgz", - "integrity": "sha512-ZcKU7zrr5GlonoS9cxxrb5HVswGnyj6jQvwFBa6p5VFw7G71VAHcUKL5wyZSU/ECtPM/9gacWxy2KFQKt1gMNA==", - "funding": { - "url": "https://github.com/sponsors/harlan-zw" - } - }, - "node_modules/parse-git-config": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/parse-git-config/-/parse-git-config-3.0.0.tgz", - "integrity": "sha512-wXoQGL1D+2COYWCD35/xbiKma1Z15xvZL8cI25wvxzled58V51SJM04Urt/uznS900iQor7QO04SgdfT/XlbuA==", - "dependencies": { - "git-config-path": "^2.0.0", - "ini": "^1.3.5" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/parse-git-config/node_modules/ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" - }, - "node_modules/parse-json": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-8.1.0.tgz", - "integrity": "sha512-rum1bPifK5SSar35Z6EKZuYPJx85pkNaFrxBK3mwdfSJ1/WKbYrjoW/zTPSjRRamfmVX1ACBIdFAO0VRErW/EA==", - "dependencies": { - "@babel/code-frame": "^7.22.13", - "index-to-position": "^0.1.2", - "type-fest": "^4.7.1" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/parse-md": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/parse-md/-/parse-md-3.0.3.tgz", - "integrity": "sha512-2kpNrrW1GBgli5VT9X9/Y6n4PVsIFVdG49tguq1PHwzsRSK0Cu0yJPTUFOwWouFT85atYNWQ1T/rmqfj7kLd8g==", - "dependencies": { - "js-yaml": "^4.1.0" - } - }, - "node_modules/parse-path": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/parse-path/-/parse-path-7.0.1.tgz", - "integrity": "sha512-6ReLMptznuuOEzLoGEa+I1oWRSj2Zna5jLWC+l6zlfAI4dbbSaIES29ThzuPkbhNahT65dWzfoZEO6cfJw2Ksg==", - "dependencies": { - "protocols": "^2.0.0" - } - }, - "node_modules/parse-url": { - "version": "9.2.0", - "resolved": "https://registry.npmjs.org/parse-url/-/parse-url-9.2.0.tgz", - "integrity": "sha512-bCgsFI+GeGWPAvAiUv63ZorMeif3/U0zaXABGJbOWt5OH2KCaPHF6S+0ok4aqM9RuIPGyZdx9tR9l13PsW4AYQ==", - "dependencies": { - "@types/parse-path": "^7.0.0", - "parse-path": "^7.0.0" - }, - "engines": { - "node": ">=14.13.0" - } - }, - "node_modules/parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "engines": { - "node": ">=8" - } - }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" - }, - "node_modules/path-scurry": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", - "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", - "dependencies": { - "lru-cache": "^10.2.0", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" - }, - "engines": { - "node": ">=16 || 14 >=14.18" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/path-scurry/node_modules/lru-cache": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==" - }, - "node_modules/path-type": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-6.0.0.tgz", - "integrity": "sha512-Vj7sf++t5pBD637NSfkxpHSMfWaeig5+DKWLhcqIYx6mWQz5hdJTGDVMQiJcw1ZYkhs7AazKDGpRVji1LJCZUQ==", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/pathe": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", - "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==" - }, - "node_modules/perfect-debounce": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/perfect-debounce/-/perfect-debounce-1.0.0.tgz", - "integrity": "sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==" - }, - "node_modules/picocolors": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", - "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==" - }, - "node_modules/picomatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", - "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pinia": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/pinia/-/pinia-2.3.1.tgz", - "integrity": "sha512-khUlZSwt9xXCaTbbxFYBKDc/bWAGWJjOgvxETwkTN7KRm66EeT1ZdZj6i2ceh9sP2Pzqsbc704r2yngBrxBVug==", - "dependencies": { - "@vue/devtools-api": "^6.6.3", - "vue-demi": "^0.14.10" - }, - "funding": { - "url": "https://github.com/sponsors/posva" - }, - "peerDependencies": { - "typescript": ">=4.4.4", - "vue": "^2.7.0 || ^3.5.11" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/pinia-plugin-persistedstate": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pinia-plugin-persistedstate/-/pinia-plugin-persistedstate-4.2.0.tgz", - "integrity": "sha512-3buhA7ac+ssbOIx3VRCC8oHkoFwhDM9oHRCjo7nj+O8WUqnW+jRqh7eYT5eS/DNa3H28zp3dYf/nd/Vc8zj8eQ==", - "dev": true, - "dependencies": { - "@nuxt/kit": "^3.14.1592", - "deep-pick-omit": "^1.2.1", - "defu": "^6.1.4", - "destr": "^2.0.3" - }, - "peerDependencies": { - "@pinia/nuxt": ">=0.9.0", - "pinia": ">=2.3.0" - }, - "peerDependenciesMeta": { - "@pinia/nuxt": { - "optional": true - }, - "pinia": { - "optional": true - } - } - }, - "node_modules/pirates": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", - "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, - "node_modules/pkg-types": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.3.1.tgz", - "integrity": "sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==", - "dependencies": { - "confbox": "^0.1.8", - "mlly": "^1.7.4", - "pathe": "^2.0.1" - } - }, - "node_modules/pluralize": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz", - "integrity": "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==", - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss": { - "version": "8.5.3", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.3.tgz", - "integrity": "sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "nanoid": "^3.3.8", - "picocolors": "^1.1.1", - "source-map-js": "^1.2.1" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/postcss-calc": { - "version": "10.1.1", - "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-10.1.1.tgz", - "integrity": "sha512-NYEsLHh8DgG/PRH2+G9BTuUdtf9ViS+vdoQ0YA5OQdGsfN4ztiwtDWNtBl9EKeqNMFnIu8IKZ0cLxEQ5r5KVMw==", - "dependencies": { - "postcss-selector-parser": "^7.0.0", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^18.12 || ^20.9 || >=22.0" - }, - "peerDependencies": { - "postcss": "^8.4.38" - } - }, - "node_modules/postcss-colormin": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-7.0.2.tgz", - "integrity": "sha512-YntRXNngcvEvDbEjTdRWGU606eZvB5prmHG4BF0yLmVpamXbpsRJzevyy6MZVyuecgzI2AWAlvFi8DAeCqwpvA==", - "dependencies": { - "browserslist": "^4.23.3", - "caniuse-api": "^3.0.0", - "colord": "^2.9.3", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^18.12.0 || ^20.9.0 || >=22.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-convert-values": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-7.0.4.tgz", - "integrity": "sha512-e2LSXPqEHVW6aoGbjV9RsSSNDO3A0rZLCBxN24zvxF25WknMPpX8Dm9UxxThyEbaytzggRuZxaGXqaOhxQ514Q==", - "dependencies": { - "browserslist": "^4.23.3", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^18.12.0 || ^20.9.0 || >=22.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-discard-comments": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-7.0.3.tgz", - "integrity": "sha512-q6fjd4WU4afNhWOA2WltHgCbkRhZPgQe7cXF74fuVB/ge4QbM9HEaOIzGSiMvM+g/cOsNAUGdf2JDzqA2F8iLA==", - "dependencies": { - "postcss-selector-parser": "^6.1.2" - }, - "engines": { - "node": "^18.12.0 || ^20.9.0 || >=22.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-discard-comments/node_modules/postcss-selector-parser": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", - "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss-discard-duplicates": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-7.0.1.tgz", - "integrity": "sha512-oZA+v8Jkpu1ct/xbbrntHRsfLGuzoP+cpt0nJe5ED2FQF8n8bJtn7Bo28jSmBYwqgqnqkuSXJfSUEE7if4nClQ==", - "engines": { - "node": "^18.12.0 || ^20.9.0 || >=22.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-discard-empty": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-7.0.0.tgz", - "integrity": "sha512-e+QzoReTZ8IAwhnSdp/++7gBZ/F+nBq9y6PomfwORfP7q9nBpK5AMP64kOt0bA+lShBFbBDcgpJ3X4etHg4lzA==", - "engines": { - "node": "^18.12.0 || ^20.9.0 || >=22.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-discard-overridden": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-7.0.0.tgz", - "integrity": "sha512-GmNAzx88u3k2+sBTZrJSDauR0ccpE24omTQCVmaTTZFz1du6AasspjaUPMJ2ud4RslZpoFKyf+6MSPETLojc6w==", - "engines": { - "node": "^18.12.0 || ^20.9.0 || >=22.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-merge-longhand": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-7.0.4.tgz", - "integrity": "sha512-zer1KoZA54Q8RVHKOY5vMke0cCdNxMP3KBfDerjH/BYHh4nCIh+1Yy0t1pAEQF18ac/4z3OFclO+ZVH8azjR4A==", - "dependencies": { - "postcss-value-parser": "^4.2.0", - "stylehacks": "^7.0.4" - }, - "engines": { - "node": "^18.12.0 || ^20.9.0 || >=22.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-merge-rules": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-7.0.4.tgz", - "integrity": "sha512-ZsaamiMVu7uBYsIdGtKJ64PkcQt6Pcpep/uO90EpLS3dxJi6OXamIobTYcImyXGoW0Wpugh7DSD3XzxZS9JCPg==", - "dependencies": { - "browserslist": "^4.23.3", - "caniuse-api": "^3.0.0", - "cssnano-utils": "^5.0.0", - "postcss-selector-parser": "^6.1.2" - }, - "engines": { - "node": "^18.12.0 || ^20.9.0 || >=22.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-merge-rules/node_modules/postcss-selector-parser": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", - "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss-minify-font-values": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-7.0.0.tgz", - "integrity": "sha512-2ckkZtgT0zG8SMc5aoNwtm5234eUx1GGFJKf2b1bSp8UflqaeFzR50lid4PfqVI9NtGqJ2J4Y7fwvnP/u1cQog==", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^18.12.0 || ^20.9.0 || >=22.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-minify-gradients": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-7.0.0.tgz", - "integrity": "sha512-pdUIIdj/C93ryCHew0UgBnL2DtUS3hfFa5XtERrs4x+hmpMYGhbzo6l/Ir5de41O0GaKVpK1ZbDNXSY6GkXvtg==", - "dependencies": { - "colord": "^2.9.3", - "cssnano-utils": "^5.0.0", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^18.12.0 || ^20.9.0 || >=22.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-minify-params": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-7.0.2.tgz", - "integrity": "sha512-nyqVLu4MFl9df32zTsdcLqCFfE/z2+f8GE1KHPxWOAmegSo6lpV2GNy5XQvrzwbLmiU7d+fYay4cwto1oNdAaQ==", - "dependencies": { - "browserslist": "^4.23.3", - "cssnano-utils": "^5.0.0", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^18.12.0 || ^20.9.0 || >=22.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-minify-selectors": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-7.0.4.tgz", - "integrity": "sha512-JG55VADcNb4xFCf75hXkzc1rNeURhlo7ugf6JjiiKRfMsKlDzN9CXHZDyiG6x/zGchpjQS+UAgb1d4nqXqOpmA==", - "dependencies": { - "cssesc": "^3.0.0", - "postcss-selector-parser": "^6.1.2" - }, - "engines": { - "node": "^18.12.0 || ^20.9.0 || >=22.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-minify-selectors/node_modules/postcss-selector-parser": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", - "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss-normalize-charset": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-7.0.0.tgz", - "integrity": "sha512-ABisNUXMeZeDNzCQxPxBCkXexvBrUHV+p7/BXOY+ulxkcjUZO0cp8ekGBwvIh2LbCwnWbyMPNJVtBSdyhM2zYQ==", - "engines": { - "node": "^18.12.0 || ^20.9.0 || >=22.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-normalize-display-values": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-7.0.0.tgz", - "integrity": "sha512-lnFZzNPeDf5uGMPYgGOw7v0BfB45+irSRz9gHQStdkkhiM0gTfvWkWB5BMxpn0OqgOQuZG/mRlZyJxp0EImr2Q==", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^18.12.0 || ^20.9.0 || >=22.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-normalize-positions": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-7.0.0.tgz", - "integrity": "sha512-I0yt8wX529UKIGs2y/9Ybs2CelSvItfmvg/DBIjTnoUSrPxSV7Z0yZ8ShSVtKNaV/wAY+m7bgtyVQLhB00A1NQ==", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^18.12.0 || ^20.9.0 || >=22.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-normalize-repeat-style": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-7.0.0.tgz", - "integrity": "sha512-o3uSGYH+2q30ieM3ppu9GTjSXIzOrRdCUn8UOMGNw7Af61bmurHTWI87hRybrP6xDHvOe5WlAj3XzN6vEO8jLw==", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^18.12.0 || ^20.9.0 || >=22.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-normalize-string": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-7.0.0.tgz", - "integrity": "sha512-w/qzL212DFVOpMy3UGyxrND+Kb0fvCiBBujiaONIihq7VvtC7bswjWgKQU/w4VcRyDD8gpfqUiBQ4DUOwEJ6Qg==", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^18.12.0 || ^20.9.0 || >=22.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-normalize-timing-functions": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-7.0.0.tgz", - "integrity": "sha512-tNgw3YV0LYoRwg43N3lTe3AEWZ66W7Dh7lVEpJbHoKOuHc1sLrzMLMFjP8SNULHaykzsonUEDbKedv8C+7ej6g==", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^18.12.0 || ^20.9.0 || >=22.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-normalize-unicode": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-7.0.2.tgz", - "integrity": "sha512-ztisabK5C/+ZWBdYC+Y9JCkp3M9qBv/XFvDtSw0d/XwfT3UaKeW/YTm/MD/QrPNxuecia46vkfEhewjwcYFjkg==", - "dependencies": { - "browserslist": "^4.23.3", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^18.12.0 || ^20.9.0 || >=22.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-normalize-url": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-7.0.0.tgz", - "integrity": "sha512-+d7+PpE+jyPX1hDQZYG+NaFD+Nd2ris6r8fPTBAjE8z/U41n/bib3vze8x7rKs5H1uEw5ppe9IojewouHk0klQ==", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^18.12.0 || ^20.9.0 || >=22.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-normalize-whitespace": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-7.0.0.tgz", - "integrity": "sha512-37/toN4wwZErqohedXYqWgvcHUGlT8O/m2jVkAfAe9Bd4MzRqlBmXrJRePH0e9Wgnz2X7KymTgTOaaFizQe3AQ==", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^18.12.0 || ^20.9.0 || >=22.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-ordered-values": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-7.0.1.tgz", - "integrity": "sha512-irWScWRL6nRzYmBOXReIKch75RRhNS86UPUAxXdmW/l0FcAsg0lvAXQCby/1lymxn/o0gVa6Rv/0f03eJOwHxw==", - "dependencies": { - "cssnano-utils": "^5.0.0", - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^18.12.0 || ^20.9.0 || >=22.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-reduce-initial": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-7.0.2.tgz", - "integrity": "sha512-pOnu9zqQww7dEKf62Nuju6JgsW2V0KRNBHxeKohU+JkHd/GAH5uvoObqFLqkeB2n20mr6yrlWDvo5UBU5GnkfA==", - "dependencies": { - "browserslist": "^4.23.3", - "caniuse-api": "^3.0.0" - }, - "engines": { - "node": "^18.12.0 || ^20.9.0 || >=22.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-reduce-transforms": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-7.0.0.tgz", - "integrity": "sha512-pnt1HKKZ07/idH8cpATX/ujMbtOGhUfE+m8gbqwJE05aTaNw8gbo34a2e3if0xc0dlu75sUOiqvwCGY3fzOHew==", - "dependencies": { - "postcss-value-parser": "^4.2.0" - }, - "engines": { - "node": "^18.12.0 || ^20.9.0 || >=22.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-selector-parser": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", - "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss-svgo": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-7.0.1.tgz", - "integrity": "sha512-0WBUlSL4lhD9rA5k1e5D8EN5wCEyZD6HJk0jIvRxl+FDVOMlJ7DePHYWGGVc5QRqrJ3/06FTXM0bxjmJpmTPSA==", - "dependencies": { - "postcss-value-parser": "^4.2.0", - "svgo": "^3.3.2" - }, - "engines": { - "node": "^18.12.0 || ^20.9.0 || >= 18" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-unique-selectors": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-7.0.3.tgz", - "integrity": "sha512-J+58u5Ic5T1QjP/LDV9g3Cx4CNOgB5vz+kM6+OxHHhFACdcDeKhBXjQmB7fnIZM12YSTvsL0Opwco83DmacW2g==", - "dependencies": { - "postcss-selector-parser": "^6.1.2" - }, - "engines": { - "node": "^18.12.0 || ^20.9.0 || >=22.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/postcss-unique-selectors/node_modules/postcss-selector-parser": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", - "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss-value-parser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==" - }, - "node_modules/postcss/node_modules/nanoid": { - "version": "3.3.8", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.8.tgz", - "integrity": "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/pretty-bytes": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-6.1.1.tgz", - "integrity": "sha512-mQUvGU6aUFQ+rNvTIAcZuWGRT9a6f6Yrg9bHs4ImKF+HZCEK+plBvnAZYSIQztknZF2qnzNtr6F8s0+IuptdlQ==", - "engines": { - "node": "^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/process": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", - "engines": { - "node": ">= 0.6.0" - } - }, - "node_modules/process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" - }, - "node_modules/prom-client": { - "version": "14.2.0", - "resolved": "https://registry.npmjs.org/prom-client/-/prom-client-14.2.0.tgz", - "integrity": "sha512-sF308EhTenb/pDRPakm+WgiN+VdM/T1RaHj1x+MvAuT8UiQP8JmOEbxVqtkbfR4LrvOg5n7ic01kRBDGXjYikA==", - "dependencies": { - "tdigest": "^0.1.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/prompts": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", - "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", - "dependencies": { - "kleur": "^3.0.3", - "sisteransi": "^1.0.5" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/proper-lockfile": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/proper-lockfile/-/proper-lockfile-4.1.2.tgz", - "integrity": "sha512-TjNPblN4BwAWMXU8s9AEz4JmQxnD1NNL7bNOY/AKUzyamc379FWASUhc/K1pL2noVb+XmZKLL68cjzLsiOAMaA==", - "dependencies": { - "graceful-fs": "^4.2.4", - "retry": "^0.12.0", - "signal-exit": "^3.0.2" - } - }, - "node_modules/protocols": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/protocols/-/protocols-2.0.2.tgz", - "integrity": "sha512-hHVTzba3wboROl0/aWRRG9dMytgH6ow//STBZh43l/wQgmMhYhOFi0EHWAPtoCz9IAUymsyP0TSBHkhgMEGNnQ==" - }, - "node_modules/proxy-from-env": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" - }, - "node_modules/qs": { - "version": "6.14.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz", - "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==", - "dependencies": { - "side-channel": "^1.1.0" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/querystringify": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", - "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==" - }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/radix3": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/radix3/-/radix3-1.1.2.tgz", - "integrity": "sha512-b484I/7b8rDEdSDKckSSBA8knMpcdsXudlE/LNL639wFoHKwLbEkQFZHWEYwDC0wa0FKUcCY+GAF73Z7wxNVFA==" - }, - "node_modules/railroad-diagrams": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/railroad-diagrams/-/railroad-diagrams-1.0.0.tgz", - "integrity": "sha512-cz93DjNeLY0idrCNOH6PviZGRN9GJhsdm9hpn1YCS879fj4W+x5IFJhhkRZcwVgMmFF7R82UA/7Oh+R8lLZg6A==" - }, - "node_modules/randexp": { - "version": "0.4.6", - "resolved": "https://registry.npmjs.org/randexp/-/randexp-0.4.6.tgz", - "integrity": "sha512-80WNmd9DA0tmZrw9qQa62GPPWfuXJknrmVmLcxvq4uZBdYqb1wYoKTmnlGUchvVWe0XiLupYkBoXVOxz3C8DYQ==", - "dependencies": { - "discontinuous-range": "1.0.0", - "ret": "~0.1.10" - }, - "engines": { - "node": ">=0.12" - } - }, - "node_modules/randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dependencies": { - "safe-buffer": "^5.1.0" - } - }, - "node_modules/range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/rc9": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/rc9/-/rc9-2.1.2.tgz", - "integrity": "sha512-btXCnMmRIBINM2LDZoEmOogIZU7Qe7zn4BpomSKZ/ykbLObuBdvG+mFq11DL6fjH1DRwHhrlgtYWG96bJiC7Cg==", - "dependencies": { - "defu": "^6.1.4", - "destr": "^2.0.3" - } - }, - "node_modules/readable-stream": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.7.0.tgz", - "integrity": "sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==", - "dependencies": { - "abort-controller": "^3.0.0", - "buffer": "^6.0.3", - "events": "^3.3.0", - "process": "^0.11.10", - "string_decoder": "^1.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/readdir-glob": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/readdir-glob/-/readdir-glob-1.1.3.tgz", - "integrity": "sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA==", - "dependencies": { - "minimatch": "^5.1.0" - } - }, - "node_modules/readdir-glob/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/readdir-glob/node_modules/minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/readdirp": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", - "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", - "engines": { - "node": ">= 14.18.0" - }, - "funding": { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/redis-errors": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/redis-errors/-/redis-errors-1.2.0.tgz", - "integrity": "sha512-1qny3OExCf0UvUV/5wpYKf2YwPcOqXzkwKKSmKHiE6ZMQs5heeE/c8eXK+PNllPvmjgAbfnsbpkGZWy8cBpn9w==", - "engines": { - "node": ">=4" - } - }, - "node_modules/redis-parser": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/redis-parser/-/redis-parser-3.0.0.tgz", - "integrity": "sha512-DJnGAeenTdpMEH6uAJRK/uiyEIH9WVsUmoLwzudwGJUwZPp80PDBWPHXSAGNPwNvIXAbe7MSUB1zQFugFml66A==", - "dependencies": { - "redis-errors": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/requires-port": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==" - }, - "node_modules/resize-observer-polyfill": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz", - "integrity": "sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==" - }, - "node_modules/resolve": { - "version": "1.22.10", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", - "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", - "dependencies": { - "is-core-module": "^2.16.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "engines": { - "node": ">=8" - } - }, - "node_modules/resolve-pkg-maps": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", - "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", - "funding": { - "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" - } - }, - "node_modules/ret": { - "version": "0.1.15", - "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", - "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", - "engines": { - "node": ">=0.12" - } - }, - "node_modules/retry": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", - "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", - "engines": { - "node": ">= 4" - } - }, - "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, - "node_modules/rfdc": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", - "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==" - }, - "node_modules/rimraf": { - "version": "5.0.10", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-5.0.10.tgz", - "integrity": "sha512-l0OE8wL34P4nJH/H2ffoaniAokM2qSmrtXHmlpvYr5AVVX8msAyW0l8NVJFDxlSK4u3Uh/f41cQheDVdnYijwQ==", - "dependencies": { - "glob": "^10.3.7" - }, - "bin": { - "rimraf": "dist/esm/bin.mjs" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/rimraf/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/rimraf/node_modules/glob": { - "version": "10.4.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", - "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^3.1.2", - "minimatch": "^9.0.4", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^1.11.1" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/rimraf/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/rimraf/node_modules/minipass": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", - "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/rollup": { - "version": "4.34.8", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.34.8.tgz", - "integrity": "sha512-489gTVMzAYdiZHFVA/ig/iYFllCcWFHMvUHI1rpFmkoUtRlQxqh6/yiNqnYibjMZ2b/+FUQwldG+aLsEt6bglQ==", - "dependencies": { - "@types/estree": "1.0.6" - }, - "bin": { - "rollup": "dist/bin/rollup" - }, - "engines": { - "node": ">=18.0.0", - "npm": ">=8.0.0" - }, - "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.34.8", - "@rollup/rollup-android-arm64": "4.34.8", - "@rollup/rollup-darwin-arm64": "4.34.8", - "@rollup/rollup-darwin-x64": "4.34.8", - "@rollup/rollup-freebsd-arm64": "4.34.8", - "@rollup/rollup-freebsd-x64": "4.34.8", - "@rollup/rollup-linux-arm-gnueabihf": "4.34.8", - "@rollup/rollup-linux-arm-musleabihf": "4.34.8", - "@rollup/rollup-linux-arm64-gnu": "4.34.8", - "@rollup/rollup-linux-arm64-musl": "4.34.8", - "@rollup/rollup-linux-loongarch64-gnu": "4.34.8", - "@rollup/rollup-linux-powerpc64le-gnu": "4.34.8", - "@rollup/rollup-linux-riscv64-gnu": "4.34.8", - "@rollup/rollup-linux-s390x-gnu": "4.34.8", - "@rollup/rollup-linux-x64-gnu": "4.34.8", - "@rollup/rollup-linux-x64-musl": "4.34.8", - "@rollup/rollup-win32-arm64-msvc": "4.34.8", - "@rollup/rollup-win32-ia32-msvc": "4.34.8", - "@rollup/rollup-win32-x64-msvc": "4.34.8", - "fsevents": "~2.3.2" - } - }, - "node_modules/rollup-plugin-visualizer": { - "version": "5.14.0", - "resolved": "https://registry.npmjs.org/rollup-plugin-visualizer/-/rollup-plugin-visualizer-5.14.0.tgz", - "integrity": "sha512-VlDXneTDaKsHIw8yzJAFWtrzguoJ/LnQ+lMpoVfYJ3jJF4Ihe5oYLAqLklIK/35lgUY+1yEzCkHyZ1j4A5w5fA==", - "dependencies": { - "open": "^8.4.0", - "picomatch": "^4.0.2", - "source-map": "^0.7.4", - "yargs": "^17.5.1" - }, - "bin": { - "rollup-plugin-visualizer": "dist/bin/cli.js" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "rolldown": "1.x", - "rollup": "2.x || 3.x || 4.x" - }, - "peerDependenciesMeta": { - "rolldown": { - "optional": true - }, - "rollup": { - "optional": true - } - } - }, - "node_modules/rollup-plugin-visualizer/node_modules/source-map": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", - "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", - "engines": { - "node": ">= 8" - } - }, - "node_modules/run-applescript": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-7.0.0.tgz", - "integrity": "sha512-9by4Ij99JUr/MCFBUkDKLWK3G9HVXmabKz9U5MlIAIuvuzkiOicRYs8XJLxX+xahD+mLiiCYDqF9dKAgtzKP1A==", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/sass": { - "version": "1.85.0", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.85.0.tgz", - "integrity": "sha512-3ToiC1xZ1Y8aU7+CkgCI/tqyuPXEmYGJXO7H4uqp0xkLXUqp88rQQ4j1HmP37xSJLbCJPaIiv+cT1y+grssrww==", - "devOptional": true, - "dependencies": { - "chokidar": "^4.0.0", - "immutable": "^5.0.2", - "source-map-js": ">=0.6.2 <2.0.0" - }, - "bin": { - "sass": "sass.js" - }, - "engines": { - "node": ">=14.0.0" - }, - "optionalDependencies": { - "@parcel/watcher": "^2.4.1" - } - }, - "node_modules/schema-utils": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.0.tgz", - "integrity": "sha512-Gf9qqc58SpCA/xdziiHz35F4GNIWYWZrEshUc/G/r5BnLph6xpKuLeoJoQuj5WfBIx/eQLf+hmVPYHaxJu7V2g==", - "peer": true, - "dependencies": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.9.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.1.0" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/scule": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/scule/-/scule-1.3.0.tgz", - "integrity": "sha512-6FtHJEvt+pVMIB9IBY+IcCJ6Z5f1iQnytgyfKMhDKgmzYG+TeH/wx1y3l27rshSbLiSanrR9ffZDrEsmjlQF2g==" - }, - "node_modules/semver": { - "version": "7.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", - "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/send": { - "version": "0.19.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", - "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", - "dependencies": { - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "mime": "1.6.0", - "ms": "2.1.3", - "on-finished": "2.4.1", - "range-parser": "~1.2.1", - "statuses": "2.0.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/send/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/send/node_modules/debug/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, - "node_modules/send/node_modules/encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/send/node_modules/mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/serialize-javascript": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", - "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", - "dependencies": { - "randombytes": "^2.1.0" - } - }, - "node_modules/serve-placeholder": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/serve-placeholder/-/serve-placeholder-2.0.2.tgz", - "integrity": "sha512-/TMG8SboeiQbZJWRlfTCqMs2DD3SZgWp0kDQePz9yUuCnDfDh/92gf7/PxGhzXTKBIPASIHxFcZndoNbp6QOLQ==", - "dependencies": { - "defu": "^6.1.4" - } - }, - "node_modules/serve-static": { - "version": "1.16.2", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", - "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", - "dependencies": { - "encodeurl": "~2.0.0", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.19.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "engines": { - "node": ">=8" - } - }, - "node_modules/shell-quote": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.2.tgz", - "integrity": "sha512-AzqKpGKjrj7EM6rKVQEPpB288oCfnrEIuyoT9cyF4nmGa7V8Zk6f7RRqYisX8X9m+Q7bd632aZW4ky7EhbQztA==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", - "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", - "dependencies": { - "es-errors": "^1.3.0", - "object-inspect": "^1.13.3", - "side-channel-list": "^1.0.0", - "side-channel-map": "^1.0.1", - "side-channel-weakmap": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel-list": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", - "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", - "dependencies": { - "es-errors": "^1.3.0", - "object-inspect": "^1.13.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel-map": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", - "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.5", - "object-inspect": "^1.13.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel-weakmap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", - "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.5", - "object-inspect": "^1.13.3", - "side-channel-map": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" - }, - "node_modules/simple-git": { - "version": "3.27.0", - "resolved": "https://registry.npmjs.org/simple-git/-/simple-git-3.27.0.tgz", - "integrity": "sha512-ivHoFS9Yi9GY49ogc6/YAi3Fl9ROnF4VyubNylgCkA+RVqLaKWnDSzXOVzya8csELIaWaYNutsEuAhZrtOjozA==", - "dependencies": { - "@kwsites/file-exists": "^1.1.1", - "@kwsites/promise-deferred": "^1.1.1", - "debug": "^4.3.5" - }, - "funding": { - "type": "github", - "url": "https://github.com/steveukx/git-js?sponsor=1" - } - }, - "node_modules/sirv": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/sirv/-/sirv-2.0.4.tgz", - "integrity": "sha512-94Bdh3cC2PKrbgSOUqTiGPWVZeSiXfKOVZNJniWoqrWrRkB1CJzBU3NEbiTsPcYy1lDsANA/THzS+9WBiy5nfQ==", - "dependencies": { - "@polka/url": "^1.0.0-next.24", - "mrmime": "^2.0.0", - "totalist": "^3.0.0" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/sisteransi": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", - "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==" - }, - "node_modules/site-config-stack": { - "version": "2.2.21", - "resolved": "https://registry.npmjs.org/site-config-stack/-/site-config-stack-2.2.21.tgz", - "integrity": "sha512-HRIgIgZAEK8XFYYepL/KtygJgmcUPdgxBJl0ueSrA12lNo2tk5aMkSuA2Oz/k6chnTbEwd6ESMYCs6opgYKNHw==", - "dependencies": { - "ufo": "^1.5.4" - }, - "funding": { - "url": "https://github.com/sponsors/harlan-zw" - }, - "peerDependencies": { - "vue": "^3" - } - }, - "node_modules/slash": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-5.1.0.tgz", - "integrity": "sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==", - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/smob": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/smob/-/smob-1.5.0.tgz", - "integrity": "sha512-g6T+p7QO8npa+/hNx9ohv1E5pVCmWrVCUzUXJyLdMmftX6ER0oiWY/w9knEonLpnOp6b6FenKnMfR8gqwWdwig==" - }, - "node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-js": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", - "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/speakingurl": { - "version": "14.0.1", - "resolved": "https://registry.npmjs.org/speakingurl/-/speakingurl-14.0.1.tgz", - "integrity": "sha512-1POYv7uv2gXoyGFpBCmpDVSNV74IfsWlDW216UPjbWufNf+bSU6GdbDsxdcxtfwb4xlI3yxzOTKClUosxARYrQ==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/splitpanes": { - "version": "3.1.8", - "resolved": "https://registry.npmjs.org/splitpanes/-/splitpanes-3.1.8.tgz", - "integrity": "sha512-iYir0doakV9gYBfCuflGCxCD5Yhh09OGgT+epjfc6LZfTvGDdMXuD0Q4w6jI3hlkdRR1Ta3DlARcV3MOkybymg==", - "funding": { - "url": "https://github.com/sponsors/antoniandre" - }, - "peerDependencies": { - "vue": "^3.2.0" - } - }, - "node_modules/sql-formatter": { - "version": "15.4.11", - "resolved": "https://registry.npmjs.org/sql-formatter/-/sql-formatter-15.4.11.tgz", - "integrity": "sha512-AfIjH0mYxv0NVzs4mbcGIAcos2Si20LeF9GMk0VmVA4A3gs1PFIixVu3rtcz34ls7ghPAjrDb+XbRly/aF6HAg==", - "dependencies": { - "argparse": "^2.0.1", - "get-stdin": "=8.0.0", - "nearley": "^2.20.1" - }, - "bin": { - "sql-formatter": "bin/sql-formatter-cli.cjs" - } - }, - "node_modules/standard-as-callback": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/standard-as-callback/-/standard-as-callback-2.1.0.tgz", - "integrity": "sha512-qoRRSyROncaz1z0mvYqIE4lCd9p2R90i6GxW3uZv5ucSu8tU7B5HXUP1gG8pVZsYNVaXjk8ClXHPttLyxAL48A==" - }, - "node_modules/statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/std-env": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.8.0.tgz", - "integrity": "sha512-Bc3YwwCB+OzldMxOXJIIvC6cPRWr/LxOp48CdQTOkPyk/t4JWWJbrilwBd7RJzKV8QW7tJkcgAmeuLLJugl5/w==" - }, - "node_modules/streamx": { - "version": "2.22.0", - "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.22.0.tgz", - "integrity": "sha512-sLh1evHOzBy/iWRiR6d1zRcLao4gGZr3C1kzNz4fopCOKJb6xD9ub8Mpi9Mr1R6id5o43S+d93fI48UC5uM9aw==", - "dependencies": { - "fast-fifo": "^1.3.2", - "text-decoder": "^1.1.0" - }, - "optionalDependencies": { - "bare-events": "^2.2.0" - } - }, - "node_modules/strict-event-emitter": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/strict-event-emitter/-/strict-event-emitter-0.5.1.tgz", - "integrity": "sha512-vMgjE/GGEPEFnhFub6pa4FmJBRBVOLpIII2hvCZ8Kzb7K0hlHo7mQv6xYrBvCL2LtAIBwFUK8wvuJgTVSQ5MFQ==" - }, - "node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, - "node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/string-width-cjs": { - "name": "string-width", - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-ansi-cjs": { - "name": "strip-ansi", - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-final-newline": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", - "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/strip-literal": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-3.0.0.tgz", - "integrity": "sha512-TcccoMhJOM3OebGhSBEmp3UZ2SfDMZUEBdRA/9ynfLi8yYajyWX3JiXArcJt4Umh4vISpspkQIY8ZZoCqjbviA==", - "dependencies": { - "js-tokens": "^9.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/strip-literal/node_modules/js-tokens": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-9.0.1.tgz", - "integrity": "sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==" - }, - "node_modules/stylehacks": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-7.0.4.tgz", - "integrity": "sha512-i4zfNrGMt9SB4xRK9L83rlsFCgdGANfeDAYacO1pkqcE7cRHPdWHwnKZVz7WY17Veq/FvyYsRAU++Ga+qDFIww==", - "dependencies": { - "browserslist": "^4.23.3", - "postcss-selector-parser": "^6.1.2" - }, - "engines": { - "node": "^18.12.0 || ^20.9.0 || >=22.0" - }, - "peerDependencies": { - "postcss": "^8.4.31" - } - }, - "node_modules/stylehacks/node_modules/postcss-selector-parser": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", - "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/sucrase": { - "version": "3.35.0", - "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz", - "integrity": "sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==", - "dev": true, - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.2", - "commander": "^4.0.0", - "glob": "^10.3.10", - "lines-and-columns": "^1.1.6", - "mz": "^2.7.0", - "pirates": "^4.0.1", - "ts-interface-checker": "^0.1.9" - }, - "bin": { - "sucrase": "bin/sucrase", - "sucrase-node": "bin/sucrase-node" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/sucrase/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/sucrase/node_modules/commander": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", - "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, - "node_modules/sucrase/node_modules/glob": { - "version": "10.4.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", - "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", - "dev": true, - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^3.1.2", - "minimatch": "^9.0.4", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^1.11.1" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/sucrase/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/sucrase/node_modules/minipass": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", - "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", - "dev": true, - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/superjson": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/superjson/-/superjson-2.2.2.tgz", - "integrity": "sha512-5JRxVqC8I8NuOUjzBbvVJAKNM8qoVuH0O77h4WInc/qC2q5IreqKxYwgkga3PfA22OayK2ikceb/B26dztPl+Q==", - "dependencies": { - "copy-anything": "^3.0.2" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/supports-color": { - "version": "9.4.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-9.4.0.tgz", - "integrity": "sha512-VL+lNrEoIXww1coLPOmiEmK/0sGigko5COxI09KzHc2VJXJsQ37UaQ+8quuxjDeA7+KnLGTWRyOXSLLR2Wb4jw==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/svg-tags": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/svg-tags/-/svg-tags-1.0.0.tgz", - "integrity": "sha512-ovssysQTa+luh7A5Weu3Rta6FJlFBBbInjOh722LIt6klpU2/HtdUbszju/G4devcvk8PGt7FCLv5wftu3THUA==" - }, - "node_modules/svgo": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/svgo/-/svgo-3.3.2.tgz", - "integrity": "sha512-OoohrmuUlBs8B8o6MB2Aevn+pRIH9zDALSR+6hhqVfa6fRwG/Qw9VUMSMW9VNg2CFc/MTIfabtdOVl9ODIJjpw==", - "dependencies": { - "@trysound/sax": "0.2.0", - "commander": "^7.2.0", - "css-select": "^5.1.0", - "css-tree": "^2.3.1", - "css-what": "^6.1.0", - "csso": "^5.0.5", - "picocolors": "^1.0.0" - }, - "bin": { - "svgo": "bin/svgo" - }, - "engines": { - "node": ">=14.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/svgo" - } - }, - "node_modules/svgo/node_modules/commander": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", - "engines": { - "node": ">= 10" - } - }, - "node_modules/system-architecture": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/system-architecture/-/system-architecture-0.1.0.tgz", - "integrity": "sha512-ulAk51I9UVUyJgxlv9M6lFot2WP3e7t8Kz9+IS6D4rVba1tR9kON+Ey69f+1R4Q8cd45Lod6a4IcJIxnzGc/zA==", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/tabbable": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/tabbable/-/tabbable-6.2.0.tgz", - "integrity": "sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==" - }, - "node_modules/tapable": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", - "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", - "engines": { - "node": ">=6" - } - }, - "node_modules/tar": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz", - "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==", - "dependencies": { - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "minipass": "^5.0.0", - "minizlib": "^2.1.1", - "mkdirp": "^1.0.3", - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/tar-stream": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.7.tgz", - "integrity": "sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==", - "dependencies": { - "b4a": "^1.6.4", - "fast-fifo": "^1.2.0", - "streamx": "^2.15.0" - } - }, - "node_modules/tar/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - }, - "node_modules/tdigest": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/tdigest/-/tdigest-0.1.2.tgz", - "integrity": "sha512-+G0LLgjjo9BZX2MfdvPfH+MKLCrxlXSYec5DaPYP1fe6Iyhf0/fSmJ0bFiZ1F8BT6cGXl2LpltQptzjXKWEkKA==", - "dependencies": { - "bintrees": "1.0.2" - } - }, - "node_modules/terser": { - "version": "5.39.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.39.0.tgz", - "integrity": "sha512-LBAhFyLho16harJoWMg/nZsQYgTrg5jXOn2nCYjRUcZZEdE3qa2zb8QEDRUGVZBW4rlazf2fxkg8tztybTaqWw==", - "dependencies": { - "@jridgewell/source-map": "^0.3.3", - "acorn": "^8.8.2", - "commander": "^2.20.0", - "source-map-support": "~0.5.20" - }, - "bin": { - "terser": "bin/terser" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/terser-webpack-plugin": { - "version": "5.3.11", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.11.tgz", - "integrity": "sha512-RVCsMfuD0+cTt3EwX8hSl2Ks56EbFHWmhluwcqoPKtBnfjiT6olaq7PRIRfhyU8nnC2MrnDrBLfrD/RGE+cVXQ==", - "peer": true, - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.25", - "jest-worker": "^27.4.5", - "schema-utils": "^4.3.0", - "serialize-javascript": "^6.0.2", - "terser": "^5.31.1" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.1.0" - }, - "peerDependenciesMeta": { - "@swc/core": { - "optional": true - }, - "esbuild": { - "optional": true - }, - "uglify-js": { - "optional": true - } - } - }, - "node_modules/text-decoder": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/text-decoder/-/text-decoder-1.2.3.tgz", - "integrity": "sha512-3/o9z3X0X0fTupwsYvR03pJ/DjWuqqrfwBgTQzdWDiQSm9KitAyz/9WqsT2JQW7KV2m+bC2ol/zqpW37NHxLaA==", - "dependencies": { - "b4a": "^1.6.4" - } - }, - "node_modules/thenify": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", - "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", - "dev": true, - "dependencies": { - "any-promise": "^1.0.0" - } - }, - "node_modules/thenify-all": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", - "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", - "dev": true, - "dependencies": { - "thenify": ">= 3.1.0 < 4" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/tiny-invariant": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.3.tgz", - "integrity": "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==" - }, - "node_modules/tinyexec": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.2.tgz", - "integrity": "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==" - }, - "node_modules/tinyglobby": { - "version": "0.2.10", - "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.10.tgz", - "integrity": "sha512-Zc+8eJlFMvgatPZTl6A9L/yht8QqdmUNtURHaKZLmKBE12hNPSrqNkUp2cs3M/UKmNVVAMFQYSjYIVHDjW5zew==", - "dependencies": { - "fdir": "^6.4.2", - "picomatch": "^4.0.2" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/toidentifier": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", - "engines": { - "node": ">=0.6" - } - }, - "node_modules/tosource": { - "version": "2.0.0-alpha.3", - "resolved": "https://registry.npmjs.org/tosource/-/tosource-2.0.0-alpha.3.tgz", - "integrity": "sha512-KAB2lrSS48y91MzFPFuDg4hLbvDiyTjOVgaK7Erw+5AmZXNq4sFRVn8r6yxSLuNs15PaokrDRpS61ERY9uZOug==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/totalist": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.1.tgz", - "integrity": "sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==", - "engines": { - "node": ">=6" - } - }, - "node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" - }, - "node_modules/ts-interface-checker": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", - "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", - "dev": true - }, - "node_modules/tsx": { - "version": "4.19.3", - "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.19.3.tgz", - "integrity": "sha512-4H8vUNGNjQ4V2EOoGw005+c+dGuPSnhpPBPHBtsZdGZBk/iJb4kguGlPWaZTZ3q5nMtFOEsY0nRDlh9PJyd6SQ==", - "dependencies": { - "esbuild": "~0.25.0", - "get-tsconfig": "^4.7.5" - }, - "bin": { - "tsx": "dist/cli.mjs" - }, - "engines": { - "node": ">=18.0.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.3" - } - }, - "node_modules/tsx/node_modules/@esbuild/aix-ppc64": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.0.tgz", - "integrity": "sha512-O7vun9Sf8DFjH2UtqK8Ku3LkquL9SZL8OLY1T5NZkA34+wG3OQF7cl4Ql8vdNzM6fzBbYfLaiRLIOZ+2FOCgBQ==", - "cpu": [ - "ppc64" - ], - "optional": true, - "os": [ - "aix" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/@esbuild/android-arm": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.0.tgz", - "integrity": "sha512-PTyWCYYiU0+1eJKmw21lWtC+d08JDZPQ5g+kFyxP0V+es6VPPSUhM6zk8iImp2jbV6GwjX4pap0JFbUQN65X1g==", - "cpu": [ - "arm" - ], - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/@esbuild/android-arm64": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.0.tgz", - "integrity": "sha512-grvv8WncGjDSyUBjN9yHXNt+cq0snxXbDxy5pJtzMKGmmpPxeAmAhWxXI+01lU5rwZomDgD3kJwulEnhTRUd6g==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/@esbuild/android-x64": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.0.tgz", - "integrity": "sha512-m/ix7SfKG5buCnxasr52+LI78SQ+wgdENi9CqyCXwjVR2X4Jkz+BpC3le3AoBPYTC9NHklwngVXvbJ9/Akhrfg==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/@esbuild/darwin-arm64": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.0.tgz", - "integrity": "sha512-mVwdUb5SRkPayVadIOI78K7aAnPamoeFR2bT5nszFUZ9P8UpK4ratOdYbZZXYSqPKMHfS1wdHCJk1P1EZpRdvw==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/@esbuild/darwin-x64": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.0.tgz", - "integrity": "sha512-DgDaYsPWFTS4S3nWpFcMn/33ZZwAAeAFKNHNa1QN0rI4pUjgqf0f7ONmXf6d22tqTY+H9FNdgeaAa+YIFUn2Rg==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/@esbuild/freebsd-arm64": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.0.tgz", - "integrity": "sha512-VN4ocxy6dxefN1MepBx/iD1dH5K8qNtNe227I0mnTRjry8tj5MRk4zprLEdG8WPyAPb93/e4pSgi1SoHdgOa4w==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/@esbuild/freebsd-x64": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.0.tgz", - "integrity": "sha512-mrSgt7lCh07FY+hDD1TxiTyIHyttn6vnjesnPoVDNmDfOmggTLXRv8Id5fNZey1gl/V2dyVK1VXXqVsQIiAk+A==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/@esbuild/linux-arm": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.0.tgz", - "integrity": "sha512-vkB3IYj2IDo3g9xX7HqhPYxVkNQe8qTK55fraQyTzTX/fxaDtXiEnavv9geOsonh2Fd2RMB+i5cbhu2zMNWJwg==", - "cpu": [ - "arm" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/@esbuild/linux-arm64": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.0.tgz", - "integrity": "sha512-9QAQjTWNDM/Vk2bgBl17yWuZxZNQIF0OUUuPZRKoDtqF2k4EtYbpyiG5/Dk7nqeK6kIJWPYldkOcBqjXjrUlmg==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/@esbuild/linux-ia32": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.0.tgz", - "integrity": "sha512-43ET5bHbphBegyeqLb7I1eYn2P/JYGNmzzdidq/w0T8E2SsYL1U6un2NFROFRg1JZLTzdCoRomg8Rvf9M6W6Gg==", - "cpu": [ - "ia32" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/@esbuild/linux-loong64": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.0.tgz", - "integrity": "sha512-fC95c/xyNFueMhClxJmeRIj2yrSMdDfmqJnyOY4ZqsALkDrrKJfIg5NTMSzVBr5YW1jf+l7/cndBfP3MSDpoHw==", - "cpu": [ - "loong64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/@esbuild/linux-mips64el": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.0.tgz", - "integrity": "sha512-nkAMFju7KDW73T1DdH7glcyIptm95a7Le8irTQNO/qtkoyypZAnjchQgooFUDQhNAy4iu08N79W4T4pMBwhPwQ==", - "cpu": [ - "mips64el" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/@esbuild/linux-ppc64": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.0.tgz", - "integrity": "sha512-NhyOejdhRGS8Iwv+KKR2zTq2PpysF9XqY+Zk77vQHqNbo/PwZCzB5/h7VGuREZm1fixhs4Q/qWRSi5zmAiO4Fw==", - "cpu": [ - "ppc64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/@esbuild/linux-riscv64": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.0.tgz", - "integrity": "sha512-5S/rbP5OY+GHLC5qXp1y/Mx//e92L1YDqkiBbO9TQOvuFXM+iDqUNG5XopAnXoRH3FjIUDkeGcY1cgNvnXp/kA==", - "cpu": [ - "riscv64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/@esbuild/linux-s390x": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.0.tgz", - "integrity": "sha512-XM2BFsEBz0Fw37V0zU4CXfcfuACMrppsMFKdYY2WuTS3yi8O1nFOhil/xhKTmE1nPmVyvQJjJivgDT+xh8pXJA==", - "cpu": [ - "s390x" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/@esbuild/linux-x64": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.0.tgz", - "integrity": "sha512-9yl91rHw/cpwMCNytUDxwj2XjFpxML0y9HAOH9pNVQDpQrBxHy01Dx+vaMu0N1CKa/RzBD2hB4u//nfc+Sd3Cw==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/@esbuild/netbsd-arm64": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.0.tgz", - "integrity": "sha512-RuG4PSMPFfrkH6UwCAqBzauBWTygTvb1nxWasEJooGSJ/NwRw7b2HOwyRTQIU97Hq37l3npXoZGYMy3b3xYvPw==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/@esbuild/netbsd-x64": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.0.tgz", - "integrity": "sha512-jl+qisSB5jk01N5f7sPCsBENCOlPiS/xptD5yxOx2oqQfyourJwIKLRA2yqWdifj3owQZCL2sn6o08dBzZGQzA==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/@esbuild/openbsd-arm64": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.0.tgz", - "integrity": "sha512-21sUNbq2r84YE+SJDfaQRvdgznTD8Xc0oc3p3iW/a1EVWeNj/SdUCbm5U0itZPQYRuRTW20fPMWMpcrciH2EJw==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/@esbuild/openbsd-x64": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.0.tgz", - "integrity": "sha512-2gwwriSMPcCFRlPlKx3zLQhfN/2WjJ2NSlg5TKLQOJdV0mSxIcYNTMhk3H3ulL/cak+Xj0lY1Ym9ysDV1igceg==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/@esbuild/sunos-x64": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.0.tgz", - "integrity": "sha512-bxI7ThgLzPrPz484/S9jLlvUAHYMzy6I0XiU1ZMeAEOBcS0VePBFxh1JjTQt3Xiat5b6Oh4x7UC7IwKQKIJRIg==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/@esbuild/win32-arm64": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.0.tgz", - "integrity": "sha512-ZUAc2YK6JW89xTbXvftxdnYy3m4iHIkDtK3CLce8wg8M2L+YZhIvO1DKpxrd0Yr59AeNNkTiic9YLf6FTtXWMw==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/@esbuild/win32-ia32": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.0.tgz", - "integrity": "sha512-eSNxISBu8XweVEWG31/JzjkIGbGIJN/TrRoiSVZwZ6pkC6VX4Im/WV2cz559/TXLcYbcrDN8JtKgd9DJVIo8GA==", - "cpu": [ - "ia32" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/@esbuild/win32-x64": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.0.tgz", - "integrity": "sha512-ZENoHJBxA20C2zFzh6AI4fT6RraMzjYw4xKWemRTRmRVtN9c5DcH9r/f2ihEkMjOW5eGgrwCslG/+Y/3bL+DHQ==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/esbuild": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.0.tgz", - "integrity": "sha512-BXq5mqc8ltbaN34cDqWuYKyNhX8D/Z0J1xdtdQ8UcIIIyJyz+ZMKUt58tF3SrZ85jcfN/PZYhjR5uDQAYNVbuw==", - "hasInstallScript": true, - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=18" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.25.0", - "@esbuild/android-arm": "0.25.0", - "@esbuild/android-arm64": "0.25.0", - "@esbuild/android-x64": "0.25.0", - "@esbuild/darwin-arm64": "0.25.0", - "@esbuild/darwin-x64": "0.25.0", - "@esbuild/freebsd-arm64": "0.25.0", - "@esbuild/freebsd-x64": "0.25.0", - "@esbuild/linux-arm": "0.25.0", - "@esbuild/linux-arm64": "0.25.0", - "@esbuild/linux-ia32": "0.25.0", - "@esbuild/linux-loong64": "0.25.0", - "@esbuild/linux-mips64el": "0.25.0", - "@esbuild/linux-ppc64": "0.25.0", - "@esbuild/linux-riscv64": "0.25.0", - "@esbuild/linux-s390x": "0.25.0", - "@esbuild/linux-x64": "0.25.0", - "@esbuild/netbsd-arm64": "0.25.0", - "@esbuild/netbsd-x64": "0.25.0", - "@esbuild/openbsd-arm64": "0.25.0", - "@esbuild/openbsd-x64": "0.25.0", - "@esbuild/sunos-x64": "0.25.0", - "@esbuild/win32-arm64": "0.25.0", - "@esbuild/win32-ia32": "0.25.0", - "@esbuild/win32-x64": "0.25.0" - } - }, - "node_modules/tus-js-client": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/tus-js-client/-/tus-js-client-4.3.1.tgz", - "integrity": "sha512-ZLeYmjrkaU1fUsKbIi8JML52uAocjEZtBx4DKjRrqzrZa0O4MYwT6db+oqePlspV+FxXJAyFBc/L5gwUi2OFsg==", - "dependencies": { - "buffer-from": "^1.1.2", - "combine-errors": "^3.0.3", - "is-stream": "^2.0.0", - "js-base64": "^3.7.2", - "lodash.throttle": "^4.1.1", - "proper-lockfile": "^4.1.2", - "url-parse": "^1.5.7" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/tus-js-client/node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/type-fest": { - "version": "4.35.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.35.0.tgz", - "integrity": "sha512-2/AwEFQDFEy30iOLjrvHDIH7e4HEWH+f1Yl1bI5XMqzuoCUqwYCdxachgsgv0og/JdVZUhbfjcJAoHj5L1753A==", - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/typescript": { - "version": "5.7.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.3.tgz", - "integrity": "sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==", - "peer": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/ufo": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.5.4.tgz", - "integrity": "sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ==" - }, - "node_modules/ultrahtml": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/ultrahtml/-/ultrahtml-1.5.3.tgz", - "integrity": "sha512-GykOvZwgDWZlTQMtp5jrD4BVL+gNn2NVlVafjcFUJ7taY20tqYdwdoWBFy6GBJsNTZe1GkGPkSl5knQAjtgceg==" - }, - "node_modules/unconfig": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/unconfig/-/unconfig-0.6.1.tgz", - "integrity": "sha512-cVU+/sPloZqOyJEAfNwnQSFCzFrZm85vcVkryH7lnlB/PiTycUkAjt5Ds79cfIshGOZ+M5v3PBDnKgpmlE5DtA==", - "dependencies": { - "@antfu/utils": "^8.1.0", - "defu": "^6.1.4", - "importx": "^0.5.1" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/unconfig/node_modules/@antfu/utils": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/@antfu/utils/-/utils-8.1.1.tgz", - "integrity": "sha512-Mex9nXf9vR6AhcXmMrlz/HVgYYZpVGJ6YlPgwl7UnaFpnshXs6EK/oa5Gpf3CzENMjkvEx2tQtntGnb7UtSTOQ==", - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/uncrypto": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/uncrypto/-/uncrypto-0.1.3.tgz", - "integrity": "sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q==" - }, - "node_modules/unctx": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/unctx/-/unctx-2.4.1.tgz", - "integrity": "sha512-AbaYw0Nm4mK4qjhns67C+kgxR2YWiwlDBPzxrN8h8C6VtAdCgditAY5Dezu3IJy4XVqAnbrXt9oQJvsn3fyozg==", - "dependencies": { - "acorn": "^8.14.0", - "estree-walker": "^3.0.3", - "magic-string": "^0.30.17", - "unplugin": "^2.1.0" - } - }, - "node_modules/unctx/node_modules/unplugin": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-2.2.0.tgz", - "integrity": "sha512-m1ekpSwuOT5hxkJeZGRxO7gXbXT3gF26NjQ7GdVHoLoF8/nopLcd/QfPigpCy7i51oFHiRJg/CyHhj4vs2+KGw==", - "dependencies": { - "acorn": "^8.14.0", - "webpack-virtual-modules": "^0.6.2" - }, - "engines": { - "node": ">=18.12.0" - } - }, - "node_modules/undici": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/undici/-/undici-7.3.0.tgz", - "integrity": "sha512-Qy96NND4Dou5jKoSJ2gm8ax8AJM/Ey9o9mz7KN1bb9GP+G0l20Zw8afxTnY2f4b7hmhn/z8aC2kfArVQlAhFBw==", - "engines": { - "node": ">=20.18.1" - } - }, - "node_modules/undici-types": { - "version": "6.20.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.20.0.tgz", - "integrity": "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==" - }, - "node_modules/undio": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/undio/-/undio-0.2.0.tgz", - "integrity": "sha512-1LH824ipsUNqX1qsO6qpcusv0oGPlfFWVykwWq5jJB0Mq6x4kEHO/izSq2KLjGZvOosEd91+HXoxYUSoVI0zPg==" - }, - "node_modules/unenv": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/unenv/-/unenv-1.10.0.tgz", - "integrity": "sha512-wY5bskBQFL9n3Eca5XnhH6KbUo/tfvkwm9OpcdCvLaeA7piBNbavbOKJySEwQ1V0RH6HvNlSAFRTpvTqgKRQXQ==", - "dependencies": { - "consola": "^3.2.3", - "defu": "^6.1.4", - "mime": "^3.0.0", - "node-fetch-native": "^1.6.4", - "pathe": "^1.1.2" - } - }, - "node_modules/unenv/node_modules/mime": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz", - "integrity": "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==", - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/unenv/node_modules/pathe": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz", - "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==" - }, - "node_modules/unhead": { - "version": "1.11.19", - "resolved": "https://registry.npmjs.org/unhead/-/unhead-1.11.19.tgz", - "integrity": "sha512-O5AYb3+xUOzBlwDmPfC/DgGp9rDMoGkB4gFkhoaz8IonQqP8W8qqetxYf5ZyEdntvXnFsMWS8lZF//5176xo6Q==", - "dependencies": { - "@unhead/dom": "1.11.19", - "@unhead/schema": "1.11.19", - "@unhead/shared": "1.11.19", - "hookable": "^5.5.3" - }, - "funding": { - "url": "https://github.com/sponsors/harlan-zw" - } - }, - "node_modules/unicorn-magic": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.3.0.tgz", - "integrity": "sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/unimport": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/unimport/-/unimport-4.1.2.tgz", - "integrity": "sha512-oVUL7PSlyVV3QRhsdcyYEMaDX8HJyS/CnUonEJTYA3//bWO+o/4gG8F7auGWWWkrrxBQBYOO8DKe+C53ktpRXw==", - "dependencies": { - "acorn": "^8.14.0", - "escape-string-regexp": "^5.0.0", - "estree-walker": "^3.0.3", - "local-pkg": "^1.0.0", - "magic-string": "^0.30.17", - "mlly": "^1.7.4", - "pathe": "^2.0.3", - "picomatch": "^4.0.2", - "pkg-types": "^1.3.1", - "scule": "^1.3.0", - "strip-literal": "^3.0.0", - "tinyglobby": "^0.2.11", - "unplugin": "^2.2.0", - "unplugin-utils": "^0.2.4" - }, - "engines": { - "node": ">=18.12.0" - } - }, - "node_modules/unimport/node_modules/local-pkg": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-1.0.0.tgz", - "integrity": "sha512-bbgPw/wmroJsil/GgL4qjDzs5YLTBMQ99weRsok1XCDccQeehbHA/I1oRvk2NPtr7KGZgT/Y5tPRnAtMqeG2Kg==", - "dependencies": { - "mlly": "^1.7.3", - "pkg-types": "^1.3.0" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/unimport/node_modules/tinyglobby": { - "version": "0.2.12", - "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.12.tgz", - "integrity": "sha512-qkf4trmKSIiMTs/E63cxH+ojC2unam7rJ0WrauAzpT3ECNTxGRMlaXxVbfxMUC/w0LaYk6jQ4y/nGR9uBO3tww==", - "dependencies": { - "fdir": "^6.4.3", - "picomatch": "^4.0.2" - }, - "engines": { - "node": ">=12.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/SuperchupuDev" - } - }, - "node_modules/unimport/node_modules/unplugin": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-2.2.0.tgz", - "integrity": "sha512-m1ekpSwuOT5hxkJeZGRxO7gXbXT3gF26NjQ7GdVHoLoF8/nopLcd/QfPigpCy7i51oFHiRJg/CyHhj4vs2+KGw==", - "dependencies": { - "acorn": "^8.14.0", - "webpack-virtual-modules": "^0.6.2" - }, - "engines": { - "node": ">=18.12.0" - } - }, - "node_modules/universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/unocss": { - "version": "0.65.4", - "resolved": "https://registry.npmjs.org/unocss/-/unocss-0.65.4.tgz", - "integrity": "sha512-KUCW5OzI20Ik6j1zXkkrpWhxZ59TwSKl6+DvmYHEzMfaEcrHlBZaFSApAoSt2CYSvo6SluGiKyr+Im1UTkd4KA==", - "dependencies": { - "@unocss/astro": "0.65.4", - "@unocss/cli": "0.65.4", - "@unocss/core": "0.65.4", - "@unocss/postcss": "0.65.4", - "@unocss/preset-attributify": "0.65.4", - "@unocss/preset-icons": "0.65.4", - "@unocss/preset-mini": "0.65.4", - "@unocss/preset-tagify": "0.65.4", - "@unocss/preset-typography": "0.65.4", - "@unocss/preset-uno": "0.65.4", - "@unocss/preset-web-fonts": "0.65.4", - "@unocss/preset-wind": "0.65.4", - "@unocss/transformer-attributify-jsx": "0.65.4", - "@unocss/transformer-compile-class": "0.65.4", - "@unocss/transformer-directives": "0.65.4", - "@unocss/transformer-variant-group": "0.65.4", - "@unocss/vite": "0.65.4" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - }, - "peerDependencies": { - "@unocss/webpack": "0.65.4", - "vite": "^2.9.0 || ^3.0.0-0 || ^4.0.0 || ^5.0.0-0 || ^6.0.0-0" - }, - "peerDependenciesMeta": { - "@unocss/webpack": { - "optional": true - }, - "vite": { - "optional": true - } - } - }, - "node_modules/unplugin": { - "version": "1.16.1", - "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-1.16.1.tgz", - "integrity": "sha512-4/u/j4FrCKdi17jaxuJA0jClGxB1AvU2hw/IuayPc4ay1XGaJs/rbb4v5WKwAjNifjmXK9PIFyuPiaK8azyR9w==", - "dependencies": { - "acorn": "^8.14.0", - "webpack-virtual-modules": "^0.6.2" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/unplugin-utils": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/unplugin-utils/-/unplugin-utils-0.2.4.tgz", - "integrity": "sha512-8U/MtpkPkkk3Atewj1+RcKIjb5WBimZ/WSLhhR3w6SsIj8XJuKTacSP8g+2JhfSGw0Cb125Y+2zA/IzJZDVbhA==", - "dependencies": { - "pathe": "^2.0.2", - "picomatch": "^4.0.2" - }, - "engines": { - "node": ">=18.12.0" - }, - "funding": { - "url": "https://github.com/sponsors/sxzz" - } - }, - "node_modules/unplugin-vue-router": { - "version": "0.11.2", - "resolved": "https://registry.npmjs.org/unplugin-vue-router/-/unplugin-vue-router-0.11.2.tgz", - "integrity": "sha512-X8BbQ3BNnMqaCYeMj80jtz5jC4AB0jcpdmECIYey9qKm6jy/upaPZ/WzfuT+iTGRiQAY4WemHueXxuzH127oOg==", - "dependencies": { - "@babel/types": "^7.26.5", - "@rollup/pluginutils": "^5.1.4", - "@vue-macros/common": "^1.16.1", - "ast-walker-scope": "^0.6.2", - "chokidar": "^3.6.0", - "fast-glob": "^3.3.3", - "json5": "^2.2.3", - "local-pkg": "^1.0.0", - "magic-string": "^0.30.17", - "mlly": "^1.7.4", - "pathe": "^2.0.2", - "scule": "^1.3.0", - "unplugin": "2.1.2", - "yaml": "^2.7.0" - }, - "peerDependencies": { - "vue-router": "^4.4.0" - }, - "peerDependenciesMeta": { - "vue-router": { - "optional": true - } - } - }, - "node_modules/unplugin-vue-router/node_modules/chokidar": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", - "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/unplugin-vue-router/node_modules/local-pkg": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-1.0.0.tgz", - "integrity": "sha512-bbgPw/wmroJsil/GgL4qjDzs5YLTBMQ99weRsok1XCDccQeehbHA/I1oRvk2NPtr7KGZgT/Y5tPRnAtMqeG2Kg==", - "dependencies": { - "mlly": "^1.7.3", - "pkg-types": "^1.3.0" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/unplugin-vue-router/node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/unplugin-vue-router/node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/unplugin-vue-router/node_modules/unplugin": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-2.1.2.tgz", - "integrity": "sha512-Q3LU0e4zxKfRko1wMV2HmP8lB9KWislY7hxXpxd+lGx0PRInE4vhMBVEZwpdVYHvtqzhSrzuIfErsob6bQfCzw==", - "dependencies": { - "acorn": "^8.14.0", - "webpack-virtual-modules": "^0.6.2" - }, - "engines": { - "node": ">=18.12.0" - } - }, - "node_modules/unstorage": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/unstorage/-/unstorage-1.15.0.tgz", - "integrity": "sha512-m40eHdGY/gA6xAPqo8eaxqXgBuzQTlAKfmB1iF7oCKXE1HfwHwzDJBywK+qQGn52dta+bPlZluPF7++yR3p/bg==", - "dependencies": { - "anymatch": "^3.1.3", - "chokidar": "^4.0.3", - "destr": "^2.0.3", - "h3": "^1.15.0", - "lru-cache": "^10.4.3", - "node-fetch-native": "^1.6.6", - "ofetch": "^1.4.1", - "ufo": "^1.5.4" - }, - "peerDependencies": { - "@azure/app-configuration": "^1.8.0", - "@azure/cosmos": "^4.2.0", - "@azure/data-tables": "^13.3.0", - "@azure/identity": "^4.6.0", - "@azure/keyvault-secrets": "^4.9.0", - "@azure/storage-blob": "^12.26.0", - "@capacitor/preferences": "^6.0.3", - "@deno/kv": ">=0.9.0", - "@netlify/blobs": "^6.5.0 || ^7.0.0 || ^8.1.0", - "@planetscale/database": "^1.19.0", - "@upstash/redis": "^1.34.3", - "@vercel/blob": ">=0.27.1", - "@vercel/kv": "^1.0.1", - "aws4fetch": "^1.0.20", - "db0": ">=0.2.1", - "idb-keyval": "^6.2.1", - "ioredis": "^5.4.2", - "uploadthing": "^7.4.4" - }, - "peerDependenciesMeta": { - "@azure/app-configuration": { - "optional": true - }, - "@azure/cosmos": { - "optional": true - }, - "@azure/data-tables": { - "optional": true - }, - "@azure/identity": { - "optional": true - }, - "@azure/keyvault-secrets": { - "optional": true - }, - "@azure/storage-blob": { - "optional": true - }, - "@capacitor/preferences": { - "optional": true - }, - "@deno/kv": { - "optional": true - }, - "@netlify/blobs": { - "optional": true - }, - "@planetscale/database": { - "optional": true - }, - "@upstash/redis": { - "optional": true - }, - "@vercel/blob": { - "optional": true - }, - "@vercel/kv": { - "optional": true - }, - "aws4fetch": { - "optional": true - }, - "db0": { - "optional": true - }, - "idb-keyval": { - "optional": true - }, - "ioredis": { - "optional": true - }, - "uploadthing": { - "optional": true - } - } - }, - "node_modules/unstorage/node_modules/lru-cache": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==" - }, - "node_modules/untun": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/untun/-/untun-0.1.3.tgz", - "integrity": "sha512-4luGP9LMYszMRZwsvyUd9MrxgEGZdZuZgpVQHEEX0lCYFESasVRvZd0EYpCkOIbJKHMuv0LskpXc/8Un+MJzEQ==", - "dependencies": { - "citty": "^0.1.5", - "consola": "^3.2.3", - "pathe": "^1.1.1" - }, - "bin": { - "untun": "bin/untun.mjs" - } - }, - "node_modules/untun/node_modules/pathe": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz", - "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==" - }, - "node_modules/untyped": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/untyped/-/untyped-1.5.2.tgz", - "integrity": "sha512-eL/8PlhLcMmlMDtNPKhyyz9kEBDS3Uk4yMu/ewlkT2WFbtzScjHWPJLdQLmaGPUKjXzwe9MumOtOgc4Fro96Kg==", - "dependencies": { - "@babel/core": "^7.26.0", - "@babel/standalone": "^7.26.4", - "@babel/types": "^7.26.3", - "citty": "^0.1.6", - "defu": "^6.1.4", - "jiti": "^2.4.1", - "knitwork": "^1.2.0", - "scule": "^1.3.0" - }, - "bin": { - "untyped": "dist/cli.mjs" - } - }, - "node_modules/unwasm": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/unwasm/-/unwasm-0.3.9.tgz", - "integrity": "sha512-LDxTx/2DkFURUd+BU1vUsF/moj0JsoTvl+2tcg2AUOiEzVturhGGx17/IMgGvKUYdZwr33EJHtChCJuhu9Ouvg==", - "dependencies": { - "knitwork": "^1.0.0", - "magic-string": "^0.30.8", - "mlly": "^1.6.1", - "pathe": "^1.1.2", - "pkg-types": "^1.0.3", - "unplugin": "^1.10.0" - } - }, - "node_modules/unwasm/node_modules/pathe": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz", - "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==" - }, - "node_modules/upath": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/upath/-/upath-2.0.1.tgz", - "integrity": "sha512-1uEe95xksV1O0CYKXo8vQvN1JEbtJp7lb7C5U9HMsIp6IVwntkH/oNUzyVNQSd4S1sYk2FpSSW44FqMc8qee5w==", - "devOptional": true, - "engines": { - "node": ">=4", - "yarn": "*" - } - }, - "node_modules/update-browserslist-db": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.2.tgz", - "integrity": "sha512-PPypAm5qvlD7XMZC3BujecnaOxwhrtoFR+Dqkk5Aa/6DssiH0ibKoketaj9w8LP7Bont1rYeoV5plxD7RTEPRg==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "escalade": "^3.2.0", - "picocolors": "^1.1.1" - }, - "bin": { - "update-browserslist-db": "cli.js" - }, - "peerDependencies": { - "browserslist": ">= 4.21.0" - } - }, - "node_modules/uqr": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/uqr/-/uqr-0.1.2.tgz", - "integrity": "sha512-MJu7ypHq6QasgF5YRTjqscSzQp/W11zoUk6kvmlH+fmWEs63Y0Eib13hYFwAzagRJcVY8WVnlV+eBDUGMJ5IbA==" - }, - "node_modules/uri-js-replace": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/uri-js-replace/-/uri-js-replace-1.0.1.tgz", - "integrity": "sha512-W+C9NWNLFOoBI2QWDp4UT9pv65r2w5Cx+3sTYFvtMdDBxkKt1syCqsUdSFAChbEe1uK5TfS04wt/nGwmaeIQ0g==" - }, - "node_modules/url-parse": { - "version": "1.5.10", - "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", - "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", - "dependencies": { - "querystringify": "^2.1.1", - "requires-port": "^1.0.0" - } - }, - "node_modules/urlpattern-polyfill": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/urlpattern-polyfill/-/urlpattern-polyfill-8.0.2.tgz", - "integrity": "sha512-Qp95D4TPJl1kC9SKigDcqgyM2VDVO4RiJc2d4qe5GrYm+zbIQCWWKAFaJNQ4BhdFeDGwBmAxqJBwWSJDb9T3BQ==" - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" - }, - "node_modules/v-lazy-show": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/v-lazy-show/-/v-lazy-show-0.3.0.tgz", - "integrity": "sha512-xpVALnvzB+RoDkI/5gqzVC2bL/Mh0Mw5/cPpSWJTTS6K4yDwFE2hZr5OsgFS74c6IHV6/k0jzSkAFXJttnhufg==", - "funding": { - "url": "https://github.com/sponsors/antfu" - }, - "peerDependencies": { - "@vue/compiler-core": "^3.5" - } - }, - "node_modules/vite": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/vite/-/vite-6.1.1.tgz", - "integrity": "sha512-4GgM54XrwRfrOp297aIYspIti66k56v16ZnqHvrIM7mG+HjDlAwS7p+Srr7J6fGvEdOJ5JcQ/D9T7HhtdXDTzA==", - "dependencies": { - "esbuild": "^0.24.2", - "postcss": "^8.5.2", - "rollup": "^4.30.1" - }, - "bin": { - "vite": "bin/vite.js" - }, - "engines": { - "node": "^18.0.0 || ^20.0.0 || >=22.0.0" - }, - "funding": { - "url": "https://github.com/vitejs/vite?sponsor=1" - }, - "optionalDependencies": { - "fsevents": "~2.3.3" - }, - "peerDependencies": { - "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", - "jiti": ">=1.21.0", - "less": "*", - "lightningcss": "^1.21.0", - "sass": "*", - "sass-embedded": "*", - "stylus": "*", - "sugarss": "*", - "terser": "^5.16.0", - "tsx": "^4.8.1", - "yaml": "^2.4.2" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "jiti": { - "optional": true - }, - "less": { - "optional": true - }, - "lightningcss": { - "optional": true - }, - "sass": { - "optional": true - }, - "sass-embedded": { - "optional": true - }, - "stylus": { - "optional": true - }, - "sugarss": { - "optional": true - }, - "terser": { - "optional": true - }, - "tsx": { - "optional": true - }, - "yaml": { - "optional": true - } - } - }, - "node_modules/vite-hot-client": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/vite-hot-client/-/vite-hot-client-0.2.4.tgz", - "integrity": "sha512-a1nzURqO7DDmnXqabFOliz908FRmIppkBKsJthS8rbe8hBEXwEwe4C3Pp33Z1JoFCYfVL4kTOMLKk0ZZxREIeA==", - "funding": { - "url": "https://github.com/sponsors/antfu" - }, - "peerDependencies": { - "vite": "^2.6.0 || ^3.0.0 || ^4.0.0 || ^5.0.0-0 || ^6.0.0-0" - } - }, - "node_modules/vite-node": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-3.0.7.tgz", - "integrity": "sha512-2fX0QwX4GkkkpULXdT1Pf4q0tC1i1lFOyseKoonavXUNlQ77KpW2XqBGGNIm/J4Ows4KxgGJzDguYVPKwG/n5A==", - "dependencies": { - "cac": "^6.7.14", - "debug": "^4.4.0", - "es-module-lexer": "^1.6.0", - "pathe": "^2.0.3", - "vite": "^5.0.0 || ^6.0.0" - }, - "bin": { - "vite-node": "vite-node.mjs" - }, - "engines": { - "node": "^18.0.0 || ^20.0.0 || >=22.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/vite-plugin-checker": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/vite-plugin-checker/-/vite-plugin-checker-0.8.0.tgz", - "integrity": "sha512-UA5uzOGm97UvZRTdZHiQVYFnd86AVn8EVaD4L3PoVzxH+IZSfaAw14WGFwX9QS23UW3lV/5bVKZn6l0w+q9P0g==", - "dependencies": { - "@babel/code-frame": "^7.12.13", - "ansi-escapes": "^4.3.0", - "chalk": "^4.1.1", - "chokidar": "^3.5.1", - "commander": "^8.0.0", - "fast-glob": "^3.2.7", - "fs-extra": "^11.1.0", - "npm-run-path": "^4.0.1", - "strip-ansi": "^6.0.0", - "tiny-invariant": "^1.1.0", - "vscode-languageclient": "^7.0.0", - "vscode-languageserver": "^7.0.0", - "vscode-languageserver-textdocument": "^1.0.1", - "vscode-uri": "^3.0.2" - }, - "engines": { - "node": ">=14.16" - }, - "peerDependencies": { - "@biomejs/biome": ">=1.7", - "eslint": ">=7", - "meow": "^9.0.0", - "optionator": "^0.9.1", - "stylelint": ">=13", - "typescript": "*", - "vite": ">=2.0.0", - "vls": "*", - "vti": "*", - "vue-tsc": "~2.1.6" - }, - "peerDependenciesMeta": { - "@biomejs/biome": { - "optional": true - }, - "eslint": { - "optional": true - }, - "meow": { - "optional": true - }, - "optionator": { - "optional": true - }, - "stylelint": { - "optional": true - }, - "typescript": { - "optional": true - }, - "vls": { - "optional": true - }, - "vti": { - "optional": true - }, - "vue-tsc": { - "optional": true - } - } - }, - "node_modules/vite-plugin-checker/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/vite-plugin-checker/node_modules/chokidar": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", - "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/vite-plugin-checker/node_modules/commander": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", - "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", - "engines": { - "node": ">= 12" - } - }, - "node_modules/vite-plugin-checker/node_modules/npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "dependencies": { - "path-key": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/vite-plugin-checker/node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/vite-plugin-checker/node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/vite-plugin-checker/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/vite-plugin-inspect": { - "version": "0.8.9", - "resolved": "https://registry.npmjs.org/vite-plugin-inspect/-/vite-plugin-inspect-0.8.9.tgz", - "integrity": "sha512-22/8qn+LYonzibb1VeFZmISdVao5kC22jmEKm24vfFE8siEn47EpVcCLYMv6iKOYMJfjSvSJfueOwcFCkUnV3A==", - "dependencies": { - "@antfu/utils": "^0.7.10", - "@rollup/pluginutils": "^5.1.3", - "debug": "^4.3.7", - "error-stack-parser-es": "^0.1.5", - "fs-extra": "^11.2.0", - "open": "^10.1.0", - "perfect-debounce": "^1.0.0", - "picocolors": "^1.1.1", - "sirv": "^3.0.0" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - }, - "peerDependencies": { - "vite": "^3.1.0 || ^4.0.0 || ^5.0.0-0 || ^6.0.1" - }, - "peerDependenciesMeta": { - "@nuxt/kit": { - "optional": true - } - } - }, - "node_modules/vite-plugin-inspect/node_modules/define-lazy-prop": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", - "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/vite-plugin-inspect/node_modules/open": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/open/-/open-10.1.0.tgz", - "integrity": "sha512-mnkeQ1qP5Ue2wd+aivTD3NHd/lZ96Lu0jgf0pwktLPtx6cTZiH7tyeGRRHs0zX0rbrahXPnXlUnbeXyaBBuIaw==", - "dependencies": { - "default-browser": "^5.2.1", - "define-lazy-prop": "^3.0.0", - "is-inside-container": "^1.0.0", - "is-wsl": "^3.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/vite-plugin-inspect/node_modules/sirv": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/sirv/-/sirv-3.0.1.tgz", - "integrity": "sha512-FoqMu0NCGBLCcAkS1qA+XJIQTR6/JHfQXl+uGteNCQ76T91DMUjPa9xfmeqMY3z80nLSg9yQmNjK0Px6RWsH/A==", - "dependencies": { - "@polka/url": "^1.0.0-next.24", - "mrmime": "^2.0.0", - "totalist": "^3.0.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/vite-plugin-vue-inspector": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/vite-plugin-vue-inspector/-/vite-plugin-vue-inspector-5.3.1.tgz", - "integrity": "sha512-cBk172kZKTdvGpJuzCCLg8lJ909wopwsu3Ve9FsL1XsnLBiRT9U3MePcqrgGHgCX2ZgkqZmAGR8taxw+TV6s7A==", - "dependencies": { - "@babel/core": "^7.23.0", - "@babel/plugin-proposal-decorators": "^7.23.0", - "@babel/plugin-syntax-import-attributes": "^7.22.5", - "@babel/plugin-syntax-import-meta": "^7.10.4", - "@babel/plugin-transform-typescript": "^7.22.15", - "@vue/babel-plugin-jsx": "^1.1.5", - "@vue/compiler-dom": "^3.3.4", - "kolorist": "^1.8.0", - "magic-string": "^0.30.4" - }, - "peerDependencies": { - "vite": "^3.0.0-0 || ^4.0.0-0 || ^5.0.0-0 || ^6.0.0-0" - } - }, - "node_modules/vite-plugin-vuetify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/vite-plugin-vuetify/-/vite-plugin-vuetify-2.1.0.tgz", - "integrity": "sha512-4wEAQtZaigPpwbFcZbrKpYwutOsWwWdeXn22B9XHzDPQNxVsKT+K9lKcXZnI5JESO1Iaql48S9rOk8RZZEt+Mw==", - "devOptional": true, - "dependencies": { - "@vuetify/loader-shared": "^2.1.0", - "debug": "^4.3.3", - "upath": "^2.0.1" - }, - "engines": { - "node": "^18.0.0 || >=20.0.0" - }, - "peerDependencies": { - "vite": ">=5", - "vue": "^3.0.0", - "vuetify": "^3.0.0" - } - }, - "node_modules/vscode-jsonrpc": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-6.0.0.tgz", - "integrity": "sha512-wnJA4BnEjOSyFMvjZdpiOwhSq9uDoK8e/kpRJDTaMYzwlkrhG1fwDIZI94CLsLzlCK5cIbMMtFlJlfR57Lavmg==", - "engines": { - "node": ">=8.0.0 || >=10.0.0" - } - }, - "node_modules/vscode-languageclient": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/vscode-languageclient/-/vscode-languageclient-7.0.0.tgz", - "integrity": "sha512-P9AXdAPlsCgslpP9pRxYPqkNYV7Xq8300/aZDpO35j1fJm/ncize8iGswzYlcvFw5DQUx4eVk+KvfXdL0rehNg==", - "dependencies": { - "minimatch": "^3.0.4", - "semver": "^7.3.4", - "vscode-languageserver-protocol": "3.16.0" - }, - "engines": { - "vscode": "^1.52.0" - } - }, - "node_modules/vscode-languageserver": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/vscode-languageserver/-/vscode-languageserver-7.0.0.tgz", - "integrity": "sha512-60HTx5ID+fLRcgdHfmz0LDZAXYEV68fzwG0JWwEPBode9NuMYTIxuYXPg4ngO8i8+Ou0lM7y6GzaYWbiDL0drw==", - "dependencies": { - "vscode-languageserver-protocol": "3.16.0" - }, - "bin": { - "installServerIntoExtension": "bin/installServerIntoExtension" - } - }, - "node_modules/vscode-languageserver-protocol": { - "version": "3.16.0", - "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.16.0.tgz", - "integrity": "sha512-sdeUoAawceQdgIfTI+sdcwkiK2KU+2cbEYA0agzM2uqaUy2UpnnGHtWTHVEtS0ES4zHU0eMFRGN+oQgDxlD66A==", - "dependencies": { - "vscode-jsonrpc": "6.0.0", - "vscode-languageserver-types": "3.16.0" - } - }, - "node_modules/vscode-languageserver-textdocument": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.12.tgz", - "integrity": "sha512-cxWNPesCnQCcMPeenjKKsOCKQZ/L6Tv19DTRIGuLWe32lyzWhihGVJ/rcckZXJxfdKCFvRLS3fpBIsV/ZGX4zA==" - }, - "node_modules/vscode-languageserver-types": { - "version": "3.16.0", - "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.16.0.tgz", - "integrity": "sha512-k8luDIWJWyenLc5ToFQQMaSrqCHiLwyKPHKPQZ5zz21vM+vIVUSvsRpcbiECH4WR88K2XZqc4ScRcZ7nk/jbeA==" - }, - "node_modules/vscode-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.1.0.tgz", - "integrity": "sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ==" - }, - "node_modules/vue": { - "version": "3.5.13", - "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.13.tgz", - "integrity": "sha512-wmeiSMxkZCSc+PM2w2VRsOYAZC8GdipNFRTsLSfodVqI9mbejKeXEGr8SckuLnrQPGe3oJN5c3K0vpoU9q/wCQ==", - "dependencies": { - "@vue/compiler-dom": "3.5.13", - "@vue/compiler-sfc": "3.5.13", - "@vue/runtime-dom": "3.5.13", - "@vue/server-renderer": "3.5.13", - "@vue/shared": "3.5.13" - }, - "peerDependencies": { - "typescript": "*" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/vue-axios": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/vue-axios/-/vue-axios-3.5.2.tgz", - "integrity": "sha512-GP+dct7UlAWkl1qoP3ppw0z6jcSua5/IrMpjB5O8bh089iIiJ+hdxPYH2NPEpajlYgkW5EVMP95ttXWdas1O0g==", - "peerDependencies": { - "axios": "*", - "vue": "^3.0.0 || ^2.0.0" - } - }, - "node_modules/vue-bundle-renderer": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/vue-bundle-renderer/-/vue-bundle-renderer-2.1.1.tgz", - "integrity": "sha512-+qALLI5cQncuetYOXp4yScwYvqh8c6SMXee3B+M7oTZxOgtESP0l4j/fXdEJoZ+EdMxkGWIj+aSEyjXkOdmd7g==", - "dependencies": { - "ufo": "^1.5.4" - } - }, - "node_modules/vue-chartjs": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/vue-chartjs/-/vue-chartjs-5.3.2.tgz", - "integrity": "sha512-NrkbRRoYshbXbWqJkTN6InoDVwVb90C0R7eAVgMWcB9dPikbruaOoTFjFYHE/+tNPdIe6qdLCDjfjPHQ0fw4jw==", - "peerDependencies": { - "chart.js": "^4.1.1", - "vue": "^3.0.0-0 || ^2.7.0" - } - }, - "node_modules/vue-demi": { - "version": "0.14.10", - "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.10.tgz", - "integrity": "sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==", - "hasInstallScript": true, - "bin": { - "vue-demi-fix": "bin/vue-demi-fix.js", - "vue-demi-switch": "bin/vue-demi-switch.js" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - }, - "peerDependencies": { - "@vue/composition-api": "^1.0.0-rc.1", - "vue": "^3.0.0-0 || ^2.6.0" - }, - "peerDependenciesMeta": { - "@vue/composition-api": { - "optional": true - } - } - }, - "node_modules/vue-devtools-stub": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/vue-devtools-stub/-/vue-devtools-stub-0.1.0.tgz", - "integrity": "sha512-RutnB7X8c5hjq39NceArgXg28WZtZpGc3+J16ljMiYnFhKvd8hITxSWQSQ5bvldxMDU6gG5mkxl1MTQLXckVSQ==" - }, - "node_modules/vue-flow-layout": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/vue-flow-layout/-/vue-flow-layout-0.1.1.tgz", - "integrity": "sha512-JdgRRUVrN0Y2GosA0M68DEbKlXMqJ7FQgsK8CjQD2vxvNSqAU6PZEpi4cfcTVtfM2GVOMjHo7GKKLbXxOBqDqA==", - "peerDependencies": { - "vue": "^3.4.37" - } - }, - "node_modules/vue-i18n": { - "version": "9.14.2", - "resolved": "https://registry.npmjs.org/vue-i18n/-/vue-i18n-9.14.2.tgz", - "integrity": "sha512-JK9Pm80OqssGJU2Y6F7DcM8RFHqVG4WkuCqOZTVsXkEzZME7ABejAUqUdA931zEBedc4thBgSUWxeQh4uocJAQ==", - "dev": true, - "dependencies": { - "@intlify/core-base": "9.14.2", - "@intlify/shared": "9.14.2", - "@vue/devtools-api": "^6.5.0" - }, - "engines": { - "node": ">= 16" - }, - "funding": { - "url": "https://github.com/sponsors/kazupon" - }, - "peerDependencies": { - "vue": "^3.0.0" - } - }, - "node_modules/vue-meta": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/vue-meta/-/vue-meta-2.4.0.tgz", - "integrity": "sha512-XEeZUmlVeODclAjCNpWDnjgw+t3WA6gdzs6ENoIAgwO1J1d5p1tezDhtteLUFwcaQaTtayRrsx7GL6oXp/m2Jw==", - "dependencies": { - "deepmerge": "^4.2.2" - } - }, - "node_modules/vue-router": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.5.0.tgz", - "integrity": "sha512-HDuk+PuH5monfNuY+ct49mNmkCRK4xJAV9Ts4z9UFc4rzdDnxQLyCMGGc8pKhZhHTVzfanpNwB/lwqevcBwI4w==", - "dependencies": { - "@vue/devtools-api": "^6.6.4" - }, - "funding": { - "url": "https://github.com/sponsors/posva" - }, - "peerDependencies": { - "vue": "^3.2.0" - } - }, - "node_modules/vue-toast-notification": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/vue-toast-notification/-/vue-toast-notification-3.1.3.tgz", - "integrity": "sha512-XNyWqwLIGBFfX5G9sK+clq3N3IPlhDjzNdbZaXkEElcotPlWs0wWZailk1vqhdtLYT/93Y4FHAVuzyatLmPZRA==", - "engines": { - "node": ">=12.15.0" - }, - "peerDependencies": { - "vue": "^3.0" - } - }, - "node_modules/vue3-ace-editor": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/vue3-ace-editor/-/vue3-ace-editor-2.2.4.tgz", - "integrity": "sha512-FZkEyfpbH068BwjhMyNROxfEI8135Sc+x8ouxkMdCNkuj/Tuw83VP/gStFQqZHqljyX9/VfMTCdTqtOnJZGN8g==", - "dependencies": { - "resize-observer-polyfill": "^1.5.1" - }, - "peerDependencies": { - "ace-builds": "*", - "vue": "^3" - } - }, - "node_modules/vuetify": { - "version": "3.7.13", - "resolved": "https://registry.npmjs.org/vuetify/-/vuetify-3.7.13.tgz", - "integrity": "sha512-4+RuQU+zLtXhlN2eZUpKXums9ftzUzhMeiNEJvvJY4XdOzVwUCth2dTnEZkSF6EKdLHk3WhtRk0cIWXZxpBvcw==", - "engines": { - "node": "^12.20 || >=14.13" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/johnleider" - }, - "peerDependencies": { - "typescript": ">=4.7", - "vite-plugin-vuetify": ">=1.0.0", - "vue": "^3.3.0", - "webpack-plugin-vuetify": ">=2.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - }, - "vite-plugin-vuetify": { - "optional": true - }, - "webpack-plugin-vuetify": { - "optional": true - } - } - }, - "node_modules/watchpack": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.2.tgz", - "integrity": "sha512-TnbFSbcOCcDgjZ4piURLCbJ3nJhznVh9kw6F6iokjiFPl8ONxe9A6nMDVXDiNbrSfLILs6vB07F7wLBrwPYzJw==", - "peer": true, - "dependencies": { - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.1.2" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" - }, - "node_modules/webpack": { - "version": "5.98.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.98.0.tgz", - "integrity": "sha512-UFynvx+gM44Gv9qFgj0acCQK2VE1CtdfwFdimkapco3hlPCJ/zeq73n2yVKimVbtm+TnApIugGhLJnkU6gjYXA==", - "peer": true, - "dependencies": { - "@types/eslint-scope": "^3.7.7", - "@types/estree": "^1.0.6", - "@webassemblyjs/ast": "^1.14.1", - "@webassemblyjs/wasm-edit": "^1.14.1", - "@webassemblyjs/wasm-parser": "^1.14.1", - "acorn": "^8.14.0", - "browserslist": "^4.24.0", - "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.17.1", - "es-module-lexer": "^1.2.1", - "eslint-scope": "5.1.1", - "events": "^3.2.0", - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.2.11", - "json-parse-even-better-errors": "^2.3.1", - "loader-runner": "^4.2.0", - "mime-types": "^2.1.27", - "neo-async": "^2.6.2", - "schema-utils": "^4.3.0", - "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.3.11", - "watchpack": "^2.4.1", - "webpack-sources": "^3.2.3" - }, - "bin": { - "webpack": "bin/webpack.js" - }, - "engines": { - "node": ">=10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependenciesMeta": { - "webpack-cli": { - "optional": true - } - } - }, - "node_modules/webpack-sources": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", - "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/webpack-virtual-modules": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/webpack-virtual-modules/-/webpack-virtual-modules-0.6.2.tgz", - "integrity": "sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==" - }, - "node_modules/whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrap-ansi-cjs": { - "name": "wrap-ansi", - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" - }, - "node_modules/ws": { - "version": "8.18.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.1.tgz", - "integrity": "sha512-RKW2aJZMXeMxVpnZ6bck+RswznaxmzdULiBr6KY7XkTnW8uvt0iT9H5DkHUChXrc+uurzwa0rVI16n/Xzjdz1w==", - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "engines": { - "node": ">=10" - } - }, - "node_modules/yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" - }, - "node_modules/yaml": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.7.0.tgz", - "integrity": "sha512-+hSoy/QHluxmC9kCIJyL/uyFmLmc+e5CFR5Wa+bpIhIj85LVb9ZH2nVnqrHoSvKogwODv0ClqZkmiSSaIH5LTA==", - "bin": { - "yaml": "bin.mjs" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/yaml-ast-parser": { - "version": "0.0.43", - "resolved": "https://registry.npmjs.org/yaml-ast-parser/-/yaml-ast-parser-0.0.43.tgz", - "integrity": "sha512-2PTINUwsRqSd+s8XxKaJWQlUuEMHJQyEuh2edBbW8KNJz0SJPwUSD2zRWqezFEdN7IzAgeuYHFUCF7o8zRdZ0A==" - }, - "node_modules/yaml-eslint-parser": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/yaml-eslint-parser/-/yaml-eslint-parser-1.2.3.tgz", - "integrity": "sha512-4wZWvE398hCP7O8n3nXKu/vdq1HcH01ixYlCREaJL5NUMwQ0g3MaGFUBNSlmBtKmhbtVG/Cm6lyYmSVTEVil8A==", - "dev": true, - "dependencies": { - "eslint-visitor-keys": "^3.0.0", - "lodash": "^4.17.21", - "yaml": "^2.0.0" - }, - "engines": { - "node": "^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ota-meshi" - } - }, - "node_modules/yargs": { - "version": "17.7.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", - "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", - "dependencies": { - "cliui": "^8.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "engines": { - "node": ">=12" - } - }, - "node_modules/zhead": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/zhead/-/zhead-2.2.4.tgz", - "integrity": "sha512-8F0OI5dpWIA5IGG5NHUg9staDwz/ZPxZtvGVf01j7vHqSyZ0raHY+78atOVxRqb73AotX22uV1pXt3gYSstGag==", - "funding": { - "url": "https://github.com/sponsors/harlan-zw" - } - }, - "node_modules/zip-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-6.0.1.tgz", - "integrity": "sha512-zK7YHHz4ZXpW89AHXUPbQVGKI7uvkd3hzusTdotCg1UxyaVtg0zFJSTfW/Dq5f7OBBVnq6cZIaC8Ti4hb6dtCA==", - "dependencies": { - "archiver-utils": "^5.0.0", - "compress-commons": "^6.0.2", - "readable-stream": "^4.0.0" - }, - "engines": { - "node": ">= 14" - } - } - } -} diff --git a/dbrepo-ui/pages/database/[database_id]/table/create/dataset.vue b/dbrepo-ui/pages/database/[database_id]/table/create/dataset.vue index 088190ac5a2fe8a8c9deb5d943c2069b216d2725..54d539ed17154c4235d7db9121463d1aab5ebd5e 100644 --- a/dbrepo-ui/pages/database/[database_id]/table/create/dataset.vue +++ b/dbrepo-ui/pages/database/[database_id]/table/create/dataset.vue @@ -159,7 +159,7 @@ <TableSchema ref="schema" :back="false" - :disabled="step > 4" + :disabled="step !== 4" :loading="loading" :submit-text="$t('navigation.continue')" :columns="tableCreate.columns" diff --git a/docker-compose.yml b/docker-compose.yml index b5323e14d8e152661f242c5a22de36fed64e53e6..a6f3319aefa36ba168892f773b13769397376c1a 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,57 +1,3 @@ -x-resources-nano: &resources-nano - resources: - reservations: - cpus: '0.1' - memory: 128M - limits: - cpus: '0.15' - memory: 192M - -x-resources-micro: &resources-micro - resources: - reservations: - cpus: '0.25' - memory: 256M - limits: - cpus: '0.375' - memory: 384M - -x-resources-nano-hm: &resources-micro-hm - resources: - reservations: - cpus: '0.25' - memory: 256M - limits: - cpus: '0.375' - memory: 4096M - -x-resources-small: &resources-small - resources: - reservations: - cpus: '0.5' - memory: 512M - limits: - cpus: '0.75' - memory: 768M - -x-resources-medium: &resources-medium - resources: - reservations: - cpus: '0.5' - memory: 1024M - limits: - cpus: '0.75' - memory: 1536M - -x-resources-large: &resources-large - resources: - reservations: - cpus: '1' - memory: 2048M - limits: - cpus: '1.5' - memory: 3072M - x-healthcheck-params: &healthcheck-params interval: 30s timeout: 10s @@ -66,29 +12,49 @@ volumes: identity-service-data: metric-db-data: dashboard-ui-data: + dashboard-db-data: services: dbrepo-metadata-db: restart: "no" container_name: dbrepo-metadata-db hostname: metadata-db - image: docker.io/bitnami/mariadb:${MARIADB_VERSION} + image: docker.io/bitnami/mariadb-galera:${MARIADB_VERSION} volumes: - - metadata-db-data:/var/lib/mysql + - metadata-db-data:/bitnami/mariadb - ./dbrepo-metadata-db/1_setup-schema.sql:/docker-entrypoint-initdb.d/1_setup-schema.sql - ./dbrepo-metadata-db/2_setup-data.sql:/docker-entrypoint-initdb.d/2_setup-data.sql ports: - "3306:3306" environment: + MARIADB_GALERA_MARIABACKUP_PASSWORD: "${METADATA_DB_BACKUP_PASSWORD:-dbrepo}" MARIADB_DATABASE: "${METADATA_DB:-dbrepo}" - MARIADB_EXTRA_FLAGS: "${METADATA_DB_EXTRA_FLAGS:---max_connections=155 --max-statement-time=60}" + MARIADB_PASSWORD: "${READONLY_PASSWORD:-readonly}" MARIADB_ROOT_PASSWORD: "${METADATA_DB_PASSWORD:-dbrepo}" + MARIADB_SKIP_TEST_DB: "yes" + MARIADB_USER: "${READONLY_USERNAME:-readonly}" healthcheck: - test: /opt/bitnami/scripts/mariadb/healthcheck.sh --connect --innodb_initialized + test: /opt/bitnami/scripts/mariadb-galera/healthcheck.sh --connect --innodb_initialized <<: *healthcheck-params - deploy: - <<: *resources-micro-hm - platform: linux/amd64 + logging: + driver: json-file + + dbrepo-metadata-db-metrics: + restart: "no" + container_name: dbrepo-metadata-db-metrics + hostname: metadata-db-metrics + image: docker.io/bitnami/mysqld-exporter:${MYSQLD_EXPORTER_VERSION} + command: + - --mysqld.address=metadata-db:3306 + - --config.my-cnf=/.my.cnf + volumes: + - ./dbrepo-metadata-db/metrics.cnf:/.my.cnf + healthcheck: + test: -h + <<: *healthcheck-params + depends_on: + dbrepo-metadata-db: + condition: service_healthy logging: driver: json-file @@ -96,23 +62,40 @@ services: restart: "no" container_name: dbrepo-data-db hostname: data-db - image: docker.io/bitnami/mariadb:${MARIADB_VERSION} + image: docker.io/bitnami/mariadb-galera:${MARIADB_VERSION} volumes: - - data-db-data:/var/lib/mysql - - ./dbrepo-data-db/1_grant-user.sql:/docker-entrypoint-startdb.d/1_grant-user.sql + - data-db-data:/bitnami/mariadb + - ./dbrepo-data-db/1_grant-user.sql:/docker-entrypoint-initdb.d/1_grant-user.sql ports: - "3307:3306" environment: - MARIADB_EXTRA_FLAGS: "${DATA_DB_EXTRA_FLAGS:---max_connections=155 --max-statement-time=60}" + MARIADB_GALERA_MARIABACKUP_PASSWORD: "${DATA_DB_BACKUP_PASSWORD:-dbrepo}" MARIADB_PASSWORD: "${READONLY_PASSWORD:-readonly}" MARIADB_ROOT_PASSWORD: "${DATA_DB_PASSWORD:-dbrepo}" + MARIADB_SKIP_TEST_DB: "yes" MARIADB_USER: "${READONLY_USERNAME:-readonly}" healthcheck: - test: /opt/bitnami/scripts/mariadb/healthcheck.sh --connect --innodb_initialized + test: /opt/bitnami/scripts/mariadb-galera/healthcheck.sh --connect --innodb_initialized <<: *healthcheck-params - deploy: - <<: *resources-micro-hm - platform: linux/amd64 + logging: + driver: json-file + + dbrepo-data-db-metrics: + restart: "no" + container_name: dbrepo-data-db-metrics + hostname: data-db-metrics + image: docker.io/bitnami/mysqld-exporter:${MYSQLD_EXPORTER_VERSION} + command: + - --mysqld.address=data-db:3306 + - --config.my-cnf=/.my.cnf + volumes: + - ./dbrepo-data-db/metrics.cnf:/.my.cnf + healthcheck: + test: -h + <<: *healthcheck-params + depends_on: + dbrepo-data-db: + condition: service_healthy logging: driver: json-file @@ -123,8 +106,6 @@ services: image: docker.io/bitnami/postgresql:${POSTGRES_VERSION} volumes: - auth-db-data:/bitnami/postgresql - ports: - - "5432:5432" environment: POSTGRESQL_DATABASE: "${AUTH_DB_NAME:-keycloak}" POSTGRESQL_USERNAME: "${AUTH_DB_USERNAME:-keycloak}" @@ -133,9 +114,23 @@ services: healthcheck: test: "psql -U ${AUTH_DB_USERNAME:-keycloak} -h 127.0.0.1 -p 5432 -d ${AUTH_DB_NAME:-keycloak} -c 'select version();'" <<: *healthcheck-params - deploy: - <<: *resources-micro - platform: linux/amd64 + logging: + driver: json-file + + dbrepo-dashboard-db: + restart: "no" + container_name: dbrepo-dashboard-db + hostname: dashboard-db + image: docker.io/bitnami/postgresql:${POSTGRES_VERSION} + volumes: + - dashboard-db-data:/bitnami/postgresql + environment: + POSTGRESQL_DATABASE: "${DASHBOARD_DB_NAME:-grafana}" + POSTGRESQL_USERNAME: "${DASHBOARD_DB_USERNAME:-grafana}" + POSTGRESQL_PASSWORD: "${DASHBOARD_DB_PASSWORD:-dbrepo}" + healthcheck: + test: "psql -U ${DASHBOARD_DB_USERNAME:-grafana} -h 127.0.0.1 -p 5432 -d ${DASHBOARD_DB_NAME:-grafana} -c 'select version();'" + <<: *healthcheck-params logging: driver: json-file @@ -170,9 +165,6 @@ services: healthcheck: test: curl -fsS localhost:8080/realms/master <<: *healthcheck-params - deploy: - <<: *resources-medium - platform: linux/amd64 depends_on: dbrepo-identity-service: condition: service_healthy @@ -197,14 +189,11 @@ services: READONLY_USERNAME: "${READONLY_USERNAME:-readonly}" SYSTEM_USERNAME: "${SYSTEM_USERNAME:-admin}" SYSTEM_PASSWORD: ${SYSTEM_PASSWORD:-admin} - deploy: - <<: *resources-nano - platform: linux/amd64 depends_on: dbrepo-auth-service: condition: service_healthy dbrepo-gateway-service: - condition: service_healthy + condition: service_started dbrepo-metadata-db: condition: service_healthy logging: @@ -218,8 +207,6 @@ services: build: context: ./dbrepo-metadata-service network: host - ports: - - "9099:8080" environment: ADMIN_EMAIL: "${ADMIN_EMAIL:-noreply@localhost}" ANALYSE_SERVICE_ENDPOINT: "${ANALYSE_SERVICE_ENDPOINT:-http://analyse-service:8080}" @@ -261,9 +248,6 @@ services: healthcheck: test: curl -sSL localhost:8080/actuator/health/liveness | grep 'UP' || exit 1 <<: *healthcheck-params - deploy: - <<: *resources-small - platform: linux/amd64 depends_on: dbrepo-auth-service: condition: service_healthy @@ -288,8 +272,6 @@ services: build: context: ./dbrepo-analyse-service network: host - ports: - - "4050:8080" environment: AUTH_SERVICE_CLIENT: ${AUTH_SERVICE_CLIENT:-dbrepo-client} AUTH_SERVICE_CLIENT_SECRET: ${AUTH_SERVICE_CLIENT:-MUwRc7yfXSJwX8AdRMWaQC3Nep1VjwgG} @@ -306,9 +288,6 @@ services: healthcheck: test: curl -sSL localhost:8080/health | grep 'UP' || exit 1 <<: *healthcheck-params - deploy: - <<: *resources-micro - platform: linux/amd64 logging: driver: json-file @@ -335,9 +314,6 @@ services: healthcheck: test: rabbitmq-diagnostics -q is_running | grep 'is fully booted and running' <<: *healthcheck-params - deploy: - <<: *resources-micro - platform: linux/amd64 logging: driver: json-file @@ -353,9 +329,6 @@ services: healthcheck: test: curl -sSL 127.0.0.1:9200 <<: *healthcheck-params - deploy: - <<: *resources-medium - platform: linux/amd64 logging: driver: json-file @@ -367,8 +340,6 @@ services: build: context: ./dbrepo-search-service network: host - ports: - - "4060:8080" environment: AUTH_SERVICE_CLIENT: ${AUTH_SERVICE_CLIENT:-dbrepo-client} AUTH_SERVICE_CLIENT_SECRET: ${AUTH_SERVICE_CLIENT_SECRET:-MUwRc7yfXSJwX8AdRMWaQC3Nep1VjwgG} @@ -383,9 +354,6 @@ services: healthcheck: test: curl -sSL localhost:8080/health | grep 'UP' || exit 1 <<: *healthcheck-params - deploy: - <<: *resources-micro - platform: linux/amd64 logging: driver: json-file @@ -397,8 +365,8 @@ services: build: context: ./dbrepo-ui args: - APP_VERSION: ${APP_VERSION:-latest} - COMMIT: ${CI_COMMIT_SHA:-} + APP_VERSION: ${CI_COMMIT_TAG:-latest} + COMMIT: ${CI_COMMIT_SHORT_SHA:-} network: host environment: NUXT_PUBLIC_API_CLIENT: "${BASE_URL:-http://localhost}" @@ -416,9 +384,6 @@ services: healthcheck: test: curl -fsSL 127.0.0.1:3000 && curl -fsSL 127.0.0.1:3000/health <<: *healthcheck-params - deploy: - <<: *resources-micro - platform: linux/amd64 depends_on: dbrepo-search-service: condition: service_healthy @@ -431,17 +396,11 @@ services: restart: "no" container_name: dbrepo-gateway-service hostname: gateway-service - image: docker.io/nginx:${NGINX_VERSION} + image: docker.io/bitnami/nginx:${NGINX_VERSION} ports: - "80:8080" volumes: - - ./dbrepo-gateway-service/dbrepo.conf:/etc/nginx/conf.d/default.conf - healthcheck: - test: lsof -i TCP:80 || exit 1 - <<: *healthcheck-params - deploy: - <<: *resources-nano - platform: linux/amd64 + - ./dbrepo-gateway-service/dbrepo.conf:/opt/bitnami/nginx/conf/server_blocks/dbrepo.conf:ro depends_on: dbrepo-analyse-service: condition: service_healthy @@ -464,7 +423,7 @@ services: restart: "no" container_name: dbrepo-identity-service hostname: identity-service - image: bitnami/openldap:${OPENLDAP_VERSION} + image: docker.io/bitnami/openldap:${OPENLDAP_VERSION} ports: - '1389:1389' - '1636:1636' @@ -481,9 +440,6 @@ services: healthcheck: test: "ldapwhoami -H ldap://localhost:1389 -D ${IDENTITY_SERVICE_ADMIN_DN:-cn=admin,dc=dbrepo,dc=at} -w ${IDENTITY_SERVICE_ADMIN_PASSWORD:-admin} || exit 1" <<: *healthcheck-params - deploy: - <<: *resources-nano - platform: linux/amd64 logging: driver: json-file @@ -504,9 +460,6 @@ services: OPENSEARCH_PORT: ${OPENSEARCH_PORT:-9200} SYSTEM_USERNAME: "${SYSTEM_USERNAME:-admin}" SYSTEM_PASSWORD: "${SYSTEM_PASSWORD:-admin}" - deploy: - <<: *resources-nano - platform: linux/amd64 depends_on: dbrepo-search-db: condition: service_healthy @@ -531,9 +484,6 @@ services: METADATA_SERVICE_ENDPOINT: ${METADATA_SERVICE_ENDPOINT:-http://metadata-service:8080} SYSTEM_USERNAME: "${SYSTEM_USERNAME:-admin}" SYSTEM_PASSWORD: "${SYSTEM_PASSWORD:-admin}" - deploy: - <<: *resources-nano - platform: linux/amd64 depends_on: dbrepo-dashboard-ui: condition: service_healthy @@ -556,9 +506,6 @@ services: healthcheck: test: echo "cluster.check" | weed shell | grep "checking master.*ok" || exit 1 <<: *healthcheck-params - deploy: - <<: *resources-nano - platform: linux/amd64 logging: driver: json-file @@ -573,9 +520,6 @@ services: healthcheck: test: promtool check healthy <<: *healthcheck-params - deploy: - <<: *resources-nano - platform: linux/amd64 logging: driver: json-file @@ -593,9 +537,6 @@ services: S3_BUCKET: "${S3_BUCKET:-dbrepo}" S3_SECRET_ACCESS_KEY: ${S3_SECRET_ACCESS_KEY:-seaweedfsadmin} STORAGE_ENDPOINT: ${STORAGE_ENDPOINT:-http://storage-service:9000} - deploy: - <<: *resources-nano - platform: linux/amd64 depends_on: dbrepo-storage-service: condition: service_healthy @@ -610,8 +551,6 @@ services: build: context: ./dbrepo-data-service network: host - ports: - - "9093:8080" environment: AUTH_SERVICE_CLIENT: "${AUTH_SERVICE_CLIENT:-dbrepo-client}" AUTH_SERVICE_CLIENT_SECRET: "${AUTH_SERVICE_CLIENT:-MUwRc7yfXSJwX8AdRMWaQC3Nep1VjwgG}" @@ -646,9 +585,6 @@ services: healthcheck: test: curl -sSL localhost:8080/actuator/health/liveness | grep 'UP' || exit 1 <<: *healthcheck-params - deploy: - <<: *resources-large - platform: linux/amd64 depends_on: dbrepo-data-db: condition: service_healthy @@ -690,19 +626,25 @@ services: restart: "no" container_name: dbrepo-dashboard-ui hostname: dashboard-ui - image: dbrepo-dashboard-ui:latest - build: - context: ./dbrepo-dashboard-ui - network: host + image: docker.io/bitnami/grafana:${GRAFANA_VERSION} ports: - "3000:3000" volumes: - - dashboard-ui-data:/opt/bitnami/grafana/data + - ./dbrepo-dashboard-ui/dashboards:/app/dashboards + - ./dbrepo-dashboard-ui/grafana.ini:/opt/bitnami/grafana/conf/grafana.ini + - ./dbrepo-dashboard-ui/ldap.toml:/opt/bitnami/grafana/conf/ldap.toml + - ./dbrepo-dashboard-ui/provisioning/dashboards/provider.yaml:/opt/bitnami/grafana/conf/provisioning/dashboards/provider.yaml + - ./dbrepo-dashboard-ui/provisioning/datasources/infinity.yaml:/opt/bitnami/grafana/conf/provisioning/datasources/infinity.yaml + - ./dbrepo-dashboard-ui/provisioning/datasources/prometheus.yaml:/opt/bitnami/grafana/conf/provisioning/datasources/prometheus.yaml + - ./dbrepo-dashboard-ui/provisioning/datasources/opensearch.yaml:/opt/bitnami/grafana/conf/provisioning/datasources/opensearch.yaml environment: BASE_URL: "${BASE_URL:-http://localhost}" # do not attempt to set it in the grafana.ini, hours wasted here: 7 + DASHBOARD_DB_NAME: "${DASHBOARD_DB_NAME:-grafana}" + DASHBOARD_DB_USERNAME: "${DASHBOARD_DB_USERNAME:-grafana}" + DASHBOARD_DB_PASSWORD: "${DASHBOARD_DB_PASSWORD:-dbrepo}" GF_SERVER_ROOT_URL: http://dashboard-ui:3000/dashboard/ - GF_INSTALL_PLUGINS: "yesoreyeram-infinity-datasource" + GF_INSTALL_PLUGINS: "yesoreyeram-infinity-datasource,grafana-opensearch-datasource" GF_SECURITY_DISABLE_INITIAL_ADMIN_CREATION: "true" LDAP_ADMIN_USERNAME: "${IDENTITY_SERVICE_ADMIN_USERNAME:-admin}" LDAP_ADMIN_PASSWORD: "${IDENTITY_SERVICE_ADMIN_PASSWORD:-admin}" @@ -710,9 +652,6 @@ services: healthcheck: test: curl -fsSL --head 127.0.0.1:3000 <<: *healthcheck-params - deploy: - <<: *resources-nano - platform: linux/amd64 extra_hosts: - "localhost:host-gateway" logging: @@ -726,8 +665,6 @@ services: build: context: ./dbrepo-dashboard-service network: host - ports: - - "4070:8080" environment: AUTH_SERVICE_ENDPOINT: ${AUTH_SERVICE_ENDPOINT:-http://auth-service:8080} BASE_URL: "${BASE_URL:-http://localhost}" @@ -737,9 +674,6 @@ services: healthcheck: test: curl -fsSL --head 127.0.0.1:8080/health <<: *healthcheck-params - deploy: - <<: *resources-micro - platform: linux/amd64 depends_on: dbrepo-dashboard-ui: condition: service_healthy diff --git a/helm/dbrepo/Chart.lock b/helm/dbrepo/Chart.lock index e26b869016fcfee00e7f08f1a1f18a306429a6fa..43c2689e41816f86d8fac571c580e9966b900658 100644 --- a/helm/dbrepo/Chart.lock +++ b/helm/dbrepo/Chart.lock @@ -4,7 +4,10 @@ dependencies: version: 1.4.0 - name: keycloak repository: https://charts.bitnami.com/bitnami - version: 24.0.3 + version: 24.6.6 +- name: nginx + repository: https://charts.bitnami.com/bitnami + version: 20.0.2 - name: mariadb-galera repository: https://charts.bitnami.com/bitnami version: 13.2.7 @@ -16,15 +19,15 @@ dependencies: version: 14.0.0 - name: seaweedfs repository: file://../seaweedfs - version: 4.2.1 + version: 4.8.7 - name: grafana repository: https://charts.bitnami.com/bitnami version: 11.4.2 - name: prometheus repository: https://charts.bitnami.com/bitnami version: 1.3.22 -- name: nginx +- name: postgresql repository: https://charts.bitnami.com/bitnami - version: 18.3.1 -digest: sha256:acb36fe9078b39dd50381a03827c318897d401c1946aee453611b3b58c924a54 -generated: "2025-04-01T13:07:24.905667677+02:00" + version: 16.1.0 +digest: sha256:bbe97a5c50a63d3449e457cc6973b7c58e841a82552a8c137d07cd4d6b60fe78 +generated: "2025-05-14T15:39:57.551220972+02:00" diff --git a/helm/dbrepo/Chart.yaml b/helm/dbrepo/Chart.yaml index 30b33369f27a029f0a11efc8828466e68fb797e0..da537a39bb6ebd4ad8698ec44cd1d9a4c85f418f 100644 --- a/helm/dbrepo/Chart.yaml +++ b/helm/dbrepo/Chart.yaml @@ -7,14 +7,14 @@ description: Helm Chart for installing DBRepo sources: - https://gitlab.phaidra.org/fair-data-austria-db-repository/fda-services type: application -version: "1.8.1" -appVersion: "1.8.1" +version: "1.9.0" +appVersion: "1.9.0" keywords: - dbrepo maintainers: - name: Martin Weise email: martin.weise@tuwien.ac.at -home: https://www.ifs.tuwien.ac.at/infrastructures/dbrepo/1.8/ +home: https://www.ifs.tuwien.ac.at/infrastructures/dbrepo/1.9/ icon: https://gitlab.phaidra.org/fair-data-austria-db-repository/fda-services/-/raw/master/dbrepo-ui/public/favicon.png dependencies: - name: opensearch @@ -24,9 +24,14 @@ dependencies: condition: searchdb.enabled - name: keycloak alias: authservice - version: 24.0.3 # app version: 26.0.4 + version: 24.6.6 repository: https://charts.bitnami.com/bitnami condition: authservice.enabled + - name: nginx + alias: gatewayservice + version: 20.0.2 + repository: https://charts.bitnami.com/bitnami + condition: gatewayservice.enabled - name: mariadb-galera alias: datadb version: 13.2.7 @@ -44,7 +49,7 @@ dependencies: condition: brokerservice.enabled - name: seaweedfs alias: storageservice - version: 4.2.1 + version: 4.8.7 repository: file://../seaweedfs condition: storageservice.enabled - name: grafana @@ -57,8 +62,8 @@ dependencies: version: 1.3.22 repository: https://charts.bitnami.com/bitnami condition: metricdb.enabled - - name: nginx - alias: gatewayservice - version: 18.3.1 + - name: postgresql + alias: dashboarddb + version: 16.1.0 repository: https://charts.bitnami.com/bitnami - condition: gatewayservice.enabled \ No newline at end of file + condition: dashboarddb.enabled \ No newline at end of file diff --git a/helm/dbrepo/README.md b/helm/dbrepo/README.md index 6f6d34dec305dcb2b4ed20cda573f2cffe09a7d7..94c9e6807146650ca4c70dcc80b1169e933b1d45 100644 --- a/helm/dbrepo/README.md +++ b/helm/dbrepo/README.md @@ -11,7 +11,7 @@ sample [ for your deployment and update the variables, especially `hostname`. ```bash -helm install my-release "oci://registry.datalab.tuwien.ac.at/dbrepo/helm/dbrepo" --values ./values.yaml --version "1.8.1" +helm install my-release "oci://registry.datalab.tuwien.ac.at/dbrepo/helm/dbrepo" --values ./values.yaml --version "1.9.0" ``` ## Prerequisites @@ -34,7 +34,7 @@ variable when you increase the available Pod memory for performance. To install the chart with the release name `my-release`: ```bash -helm install my-release "oci://oci://registry.datalab.tuwien.ac.at/dbrepo/helm" --values ./values.yaml --version "1.8.1" +helm install my-release "oci://oci://registry.datalab.tuwien.ac.at/dbrepo/helm" --values ./values.yaml --version "1.9.0" ``` The command deploys DBRepo on the Kubernetes cluster in the default configuration. The Parameters section lists the @@ -54,10 +54,13 @@ The command removes all the Kubernetes components associated with the chart and ### Global parameters -| Name | Description | Value | -| ----------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------ | -| `global.compatibility.openshift.adaptSecurityContext` | Adapt the securityContext sections of the deployment to make them compatible with Openshift restricted-v2 SCC: remove runAsUser, runAsGroup and fsGroup and let the platform use their allowed default IDs. Possible values: auto (apply if the detected running cluster is Openshift), force (perform the adaptation always), disabled (do not perform adaptation) | `auto` | -| `global.storageClass` | Global StorageClass for Persistent Volume(s) | `""` | +| Name | Description | Value | +| ----------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------ | +| `global.compatibility.openshift.adaptSecurityContext` | Adapt the securityContext sections of the deployment to make them compatible with Openshift restricted-v2 SCC: remove runAsUser, runAsGroup and fsGroup and let the platform use their allowed default IDs. Possible values: auto (apply if the detected running cluster is Openshift), force (perform the adaptation always), disabled (do not perform adaptation) | `auto` | +| `global.storageClass` | Global StorageClass for Persistent Volume(s) | `""` | +| `global.loggingSidecar.enabled` | Enable the logging sidecars for the analyse-, dashboard-, data-, gateway-, metadata- and search service. | `true` | +| `global.loggingSidecar.image.name` | The logging sidecar image. | `docker.io/bitnami/fluent-bit:4.0.0` | +| `global.loggingSidecar.resourcesPreset` | The resource definitions for the logging sidecar. | `nano` | ### Common parameters @@ -72,7 +75,7 @@ The command removes all the Kubernetes components associated with the chart and | Name | Description | Value | | ---------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------- | -| `metadatadb.enabled` | Enable the Metadata datadb. | `true` | +| `metadatadb.enabled` | Enable the Metadata Database. | `true` | | `metadatadb.host` | The hostname for the microservices. | `metadata-db` | | `metadatadb.extraFlags` | Extra flags to ensure the query store works as intended, ref https://www.ifs.tuwien.ac.at/infrastructures/dbrepo/1.6/api/data-db/#data | `--character-set-server=utf8mb4 --collation-server=utf8mb4_general_ci` | | `metadatadb.rootUser.user` | The root username. | `root` | @@ -81,11 +84,20 @@ The command removes all the Kubernetes components associated with the chart and | `metadatadb.galera.mariabackup.user` | The database backup username. | `backup` | | `metadatadb.galera.mariabackup.password` | The database backup user password | `backup` | | `metadatadb.jdbcExtraArgs` | The extra arguments for JDBC connections in the microservices. | `""` | -| `metadatadb.configurationConfigMap` | The database configuration files. | `metadata-db-config` | | `metadatadb.extraInitDbScripts` | Additional init.db scripts that are executed on the first start. | `{}` | -| `metadatadb.replicaCount` | The number of cluster nodes, should be uneven i.e. 2n+1 | `3` | -| `metadatadb.resourcesPreset` | The container resource preset | `nano-hm` | +| `metadatadb.resourcesPreset` | The container resource preset | `xlarge` | | `metadatadb.persistence.enabled` | Enable persistent storage. | `true` | +| `metadatadb.replicaCount` | The number of cluster nodes, should be uneven i.e. 2n+1 | `1` | + +### Dashboard Database Enable the Dashboard Database. + +| Name | Description | Value | +| --------------------------- | ------------------------------------- | ------------------- | +| `dashboarddb.enabled` | | `true` | +| `dashboarddb.host` | The hostname for the microservices. | `dashboard-db:5432` | +| `dashboarddb.auth.database` | The dashboard database name. | `grafana` | +| `dashboarddb.auth.username` | The dashboard database username. | `grafana` | +| `dashboarddb.auth.password` | The dashboard database user password. | `dbrepo` | ### Auth Service @@ -110,14 +122,16 @@ The command removes all the Kubernetes components associated with the chart and | `datadb.extraFlags` | Extra flags to ensure the query store works as intended, ref https://www.ifs.tuwien.ac.at/infrastructures/dbrepo/1.6/api/data-db/#data | `--character-set-server=utf8mb4 --collation-server=utf8mb4_general_ci` | | `datadb.rootUser.user` | The root username. | `root` | | `datadb.rootUser.password` | The root user password. | `dbrepo` | +| `datadb.readonlyUser.user` | The readonly username. | `readonly` | +| `datadb.readonlyUser.password` | The readonly password. | `readonly` | | `datadb.db.name` | The database name. | `dbrepo` | | `datadb.db.user` | The database username for the dashboard service. | `user` | | `datadb.db.password` | The database user password for the dashboard service. | `user` | | `datadb.galera.mariabackup.user` | The database backup username. | `backup` | | `datadb.galera.mariabackup.password` | The database backup user password | `backup` | | `datadb.jdbcExtraArgs` | The extra arguments for JDBC connections in the microservices. | `""` | -| `datadb.replicaCount` | The number of cluster nodes, should be uneven i.e. 2n+1 | `3` | -| `datadb.resourcesPreset` | The container resource preset | `nano-hm` | +| `datadb.replicaCount` | The number of cluster nodes, should be uneven i.e. 2n+1 | `1` | +| `datadb.resourcesPreset` | The container resource preset | `xlarge` | | `datadb.initdbScriptsConfigMap` | The setup data to load into the database on first start. | `data-db-setup` | | `datadb.persistence.enabled` | Enable persistent storage. | `true` | @@ -140,39 +154,48 @@ The command removes all the Kubernetes components associated with the chart and ### Broker Service -| Name | Description | Value | -| ------------------------------------------------ | -------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------ | -| `brokerservice.enabled` | Enable the Broker Service. | `true` | -| `brokerservice.image.debug` | Set the logging level to `trace`. Otherwise, set to `info`. | `true` | -| `brokerservice.endpoint` | The management api endpoint for the microservices. | `http://broker-service:15672` | -| `brokerservice.host` | The hostname for the microservices. | `broker-service` | -| `brokerservice.port` | The port for the microservices. | `5672` | -| `brokerservice.virtualHost` | The default virtual host name. | `dbrepo` | -| `brokerservice.queueName` | The default queue name. | `dbrepo` | -| `brokerservice.exchangeName` | The default exchange name. | `dbrepo` | -| `brokerservice.routingKey` | The default routing key binding from the default queue to the default exchange. | `dbrepo.#` | -| `brokerservice.connectionTimeout` | The connection timeout in ms. | `60000` | -| `brokerservice.ldap.binddn` | The domain name the broker service should bind to. In many cases this is the admin user from `identityservice.global.adminUser`. | `cn=admin,dc=dbrepo,dc=at` | -| `brokerservice.ldap.bindpw` | The password to bind on the identity service. In many cases this value is equal to `identityservice.global.adminPassword`. | `admin` | -| `brokerservice.ldap.uidField` | The field containing the user id. | `uid` | -| `brokerservice.ldap.basedn` | The base domain name containing the users. | `dc=dbrepo,dc=at` | -| `brokerservice.ldap.userDnPattern` | The pattern to determine the user. | `${username}` | -| `brokerservice.auth.tls.enabled` | Enable TLS support | `false` | -| `brokerservice.auth.tls.existingSecretFullChain` | If set to `true` the service uses the full chain in the certificate `tls.crt`, otherwise it attempts to read from `ca.crt` | `false` | -| `brokerservice.auth.tls.existingSecret` | Existing secret with certificate content | `ingress-cert` | -| `brokerservice.extraPlugins` | The list of plugins to be activated. | `rabbitmq_prometheus rabbitmq_auth_backend_ldap rabbitmq_auth_mechanism_ssl rabbitmq_mqtt` | -| `brokerservice.persistence.enabled` | If set to true, a PVC will be created. | `false` | -| `brokerservice.extraConfiguration` | The extra configuration for MQTT | `mqtt.vhost = dbrepo +| Name | Description | Value | +| ------------------------------------------------ | -------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `brokerservice.enabled` | Enable the Broker Service. | `true` | +| `brokerservice.image.debug` | Set the logging level to `trace`. Otherwise, set to `info`. | `true` | +| `brokerservice.endpoint` | The management api endpoint for the microservices. | `http://broker-service:15672` | +| `brokerservice.host` | The hostname for the microservices. | `broker-service` | +| `brokerservice.port` | The port for the microservices. | `5672` | +| `brokerservice.virtualHost` | The default virtual host name. | `dbrepo` | +| `brokerservice.queueName` | The default queue name. | `dbrepo` | +| `brokerservice.exchangeName` | The default exchange name. | `dbrepo` | +| `brokerservice.routingKey` | The default routing key binding from the default queue to the default exchange. | `dbrepo.#` | +| `brokerservice.connectionTimeout` | The connection timeout in ms. | `60000` | +| `brokerservice.ldap.binddn` | The domain name the broker service should bind to. In many cases this is the admin user from `identityservice.global.adminUser`. | `cn=admin,dc=dbrepo,dc=at` | +| `brokerservice.ldap.bindpw` | The password to bind on the identity service. In many cases this value is equal to `identityservice.global.adminPassword`. | `admin` | +| `brokerservice.ldap.uidField` | The field containing the user id. | `uid` | +| `brokerservice.ldap.basedn` | The base domain name containing the users. | `dc=dbrepo,dc=at` | +| `brokerservice.ldap.userDnPattern` | The pattern to determine the user. | `${username}` | +| `brokerservice.auth.tls.enabled` | Enable TLS support | `false` | +| `brokerservice.auth.tls.existingSecretFullChain` | If set to `true` the service uses the full chain in the certificate `tls.crt`, otherwise it attempts to read from `ca.crt` | `false` | +| `brokerservice.auth.tls.existingSecret` | Existing secret with certificate content | `ingress-cert` | +| `brokerservice.extraPlugins` | The list of plugins to be activated. | `rabbitmq_prometheus rabbitmq_auth_backend_ldap rabbitmq_auth_mechanism_ssl rabbitmq_mqtt` | +| `brokerservice.extraConfiguration` | The extra configuration for MQTT | `# https://www.rabbitmq.com/docs/logging#log-message-categories +log.connection.level = warning +log.file = /opt/bitnami/rabbitmq/var/log/rabbitmq/app.log +log.file.formatter = json +log.file.level = info +# rotate when the file reaches 10 MiB +log.file.rotation.size = 10485760 +# keep up to 5 archived log files in addition to the current one +log.file.rotation.count = 5 +mqtt.vhost = dbrepo mqtt.exchange = dbrepo mqtt.prefetch = 10 -` | -| `brokerservice.replicaCount` | The number of replicas. | `1` | +` | +| `brokerservice.replicaCount` | The number of replicas. | `1` | ### Analyse Service | Name | Description | Value | | ------------------------------------------------------------------ | ----------------------------------------------------------------------------------------------------------------- | ------------------------- | | `analyseservice.enabled` | Enable the Broker Service. | `true` | +| `analyseservice.podAnnotations` | the pod annotations. Evaluated as a template | `{}` | | `analyseservice.podSecurityContext.enabled` | Enable pods' Security Context | `true` | | `analyseservice.podSecurityContext.fsGroupChangePolicy` | Set filesystem group change policy | `Always` | | `analyseservice.podSecurityContext.sysctls` | Set kernel settings using the sysctl interface | `[]` | @@ -199,6 +222,7 @@ mqtt.prefetch = 10 | Name | Description | Value | | ------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------- | -------------------------------- | | `metadataservice.enabled` | Enable the Broker Service. | `true` | +| `metadataservice.podAnnotations` | the pod annotations. Evaluated as a template | `{}` | | `metadataservice.podSecurityContext.enabled` | Enable pods' Security Context | `true` | | `metadataservice.podSecurityContext.fsGroupChangePolicy` | Set filesystem group change policy | `Always` | | `metadataservice.podSecurityContext.sysctls` | Set kernel settings using the sysctl interface | `[]` | @@ -239,6 +263,7 @@ mqtt.prefetch = 10 | --------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------ | --------------------------------------------------------------------------------------------------------------------------- | | `dataservice.enabled` | Enable the Broker Service. | `true` | | `dataservice.endpoint` | Absolute URL to the data service in the form of http://host:port | `http://data-service` | +| `dataservice.podAnnotations` | the pod annotations. Evaluated as a template | `{}` | | `dataservice.podSecurityContext.enabled` | Enable pods' Security Context | `true` | | `dataservice.podSecurityContext.fsGroupChangePolicy` | Set filesystem group change policy | `Always` | | `dataservice.podSecurityContext.sysctls` | Set kernel settings using the sysctl interface | `[]` | @@ -275,6 +300,7 @@ mqtt.prefetch = 10 | ----------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------- | ----------------------- | | `searchservice.enabled` | Enable the Broker Service. | `true` | | `searchservice.endpoint` | Absolute URL to the search service in the form of http://host:port | `http://search-service` | +| `searchservice.podAnnotations` | the pod annotations. Evaluated as a template | `{}` | | `searchservice.podSecurityContext.enabled` | Enable pods' Security Context | `true` | | `searchservice.podSecurityContext.fsGroupChangePolicy` | Set filesystem group change policy | `Always` | | `searchservice.podSecurityContext.sysctls` | Set kernel settings using the sysctl interface | `[]` | @@ -291,8 +317,9 @@ mqtt.prefetch = 10 | `searchservice.containerSecurityContext.seccompProfile.type` | Set container's Security Context seccomp profile | `RuntimeDefault` | | `searchservice.resourcesPreset` | The container resource preset | `micro` | | `searchservice.resources` | Set container requests and limits for different resources like CPU or memory (essential for production workloads) | `{}` | -| `searchservice.init.resourcesPreset` | The container resource preset | `nano` | -| `searchservice.init.resources` | Set container requests and limits for different resources like CPU or memory (essential for production workloads) | `{}` | +| `searchservice.setupJob.enabled` | Enable the setup job that syncs missing databases from the Metadata Database into the Search Database. | `true` | +| `searchservice.setupJob.resourcesPreset` | The container resource preset | `nano` | +| `searchservice.setupJob.resources` | Set container requests and limits for different resources like CPU or memory (essential for production workloads) | `{}` | | `searchservice.replicaCount` | The number of replicas. | `2` | ### Storage Service @@ -309,9 +336,10 @@ mqtt.prefetch = 10 | `storageservice.s3.auth.adminSecretAccessKey` | The S3 secret access key for the admin user. In some systems this is named `password`. | `seaweedfsadmin` | | `storageservice.s3.auth.readAccessKeyId` | The S3 access key id for the read only user. | `seaweedfsuser` | | `storageservice.s3.auth.readSecretAccessKey` | The S3 secret access key for the read only user. | `seaweedfsuser` | -| `storageservice.init.s3.endpoint` | The S3-capable endpoint the microservice connects to. | `http://storage-service-s3:8333` | -| `storageservice.init.resourcesPreset` | The container resource preset | `nano` | -| `storageservice.init.resources` | Set container requests and limits for different resources like CPU or memory (essential for production workloads) | `{}` | +| `storageservice.setupJob.enabled` | Enable the setup job that creates the bucket in the s3 endpoint. | `true` | +| `storageservice.setupJob.s3.endpoint` | The S3-capable endpoint the microservice connects to. | `http://storage-service-s3:8333` | +| `storageservice.setupJob.resourcesPreset` | The container resource preset | `nano` | +| `storageservice.setupJob.resources` | Set container requests and limits for different resources like CPU or memory (essential for production workloads) | `{}` | ### Identity Service @@ -321,6 +349,7 @@ mqtt.prefetch = 10 | `identityservice.global.ldapDomain` | The LDAP domain name in domain "dbrepo.at" form or explicit in "dc=dbrepo,dc=at" form. | `dc=dbrepo,dc=at` | | `identityservice.global.adminUser` | The admin username that is used to bind. | `admin` | | `identityservice.global.adminPassword` | The admin user password that is used to bind. | `admin` | +| `identityservice.podAnnotations` | the pod annotations. Evaluated as a template | `{}` | | `identityservice.podSecurityContext.enabled` | Enable pods' Security Context | `true` | | `identityservice.podSecurityContext.fsGroupChangePolicy` | Set filesystem group change policy | `Always` | | `identityservice.podSecurityContext.sysctls` | Set kernel settings using the sysctl interface | `[]` | @@ -351,6 +380,7 @@ mqtt.prefetch = 10 | `ui.oidc.authSessionSecret` | This should be a at least 48 characters random string. It is used to encrypt the user session. | `qJteD-fvcHNafjwDtJOT3pF7IrN1OEzQRcIyPO0xAT4gzct0` | | `ui.oidc.sessionSecret` | This should be a at least 48 characters random string. It is used to encrypt the user session. | `TjOH1lFnocixYmy5ol2I5cOdsYUdrd5_jZsGxo6aMVPNNDkh` | | `ui.oidc.tokenKey` | This needs to be a random cryptographic AES key in base64. Used to encrypt the server side token store. You can generate a key in JS with await subtle.exportKey('raw', await subtle.generateKey({ name: 'AES-GCM', length: 256, }, true, ['encrypt', 'decrypt'])). You just have to encode it to base64 afterwards. | `data:;base64,ntxOAfrF6yw22Ec1AFHK21iFz7L3PZmz9857Uqwyme0=` | +| `ui.podAnnotations` | the pod annotations. Evaluated as a template | `{}` | | `ui.podSecurityContext.enabled` | Enable pods' Security Context | `true` | | `ui.podSecurityContext.fsGroupChangePolicy` | Set filesystem group change policy | `Always` | | `ui.podSecurityContext.sysctls` | Set kernel settings using the sysctl interface | `[]` | @@ -367,9 +397,10 @@ mqtt.prefetch = 10 | `ui.containerSecurityContext.seccompProfile.type` | Set container's Security Context seccomp profile | `RuntimeDefault` | | `ui.resourcesPreset` | The container resource preset | `micro` | | `ui.resources` | Set container requests and limits for different resources like CPU or memory (essential for production workloads) | `{}` | -| `ui.public.api.client` | The endpoint for the client api. Defaults to the value of `gateway`. | `""` | -| `ui.public.api.server` | The endpoint for the server api. Defaults to the value of `gateway`. | `""` | -| `ui.public.upload.client` | The endpoint for the upload client. Defaults to the value of `gateway` and path `/api/upload/files`. | `""` | +| `ui.public.api.client` | The endpoint for the client api. Overrides to the value of `gateway`. | `""` | +| `ui.public.api.server` | The endpoint for the server api. Overrides to the value of `gateway`. | `""` | +| `ui.public.dashboard.url` | The url for the dashboard. Overrides to the value of `gateway` and path `/dashboard`. | `""` | +| `ui.public.upload.client` | The endpoint for the upload client. Overrides to the value of `gateway` and path `/api/upload/files`. | `""` | | `ui.public.title` | The user interface title. | `Database Repository` | | `ui.public.logo` | The user interface logo. | `/logo.svg` | | `ui.public.icon` | The user interface icon. | `/favicon.ico` | @@ -388,6 +419,7 @@ mqtt.prefetch = 10 | -------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------- | -------------------------- | | `dashboardservice.enabled` | Enable the Dashboard Service. | `true` | | `dashboardservice.endpoint` | The endpoint for the microservices. | `http://dashboard-service` | +| `dashboardservice.podAnnotations` | the pod annotations. Evaluated as a template | `{}` | | `dashboardservice.podSecurityContext.enabled` | Enable pods' Security Context | `true` | | `dashboardservice.podSecurityContext.fsGroupChangePolicy` | Set filesystem group change policy | `Always` | | `dashboardservice.podSecurityContext.sysctls` | Set kernel settings using the sysctl interface | `[]` | @@ -405,17 +437,19 @@ mqtt.prefetch = 10 | `dashboardservice.resourcesPreset` | The container resource preset | `micro` | | `dashboardservice.resources` | Set container requests and limits for different resources like CPU or memory (essential for production workloads) | `{}` | | `dashboardservice.replicaCount` | The number of replicas. | `2` | -| `dashboardservice.init.resourcesPreset` | The container resource preset | `nano` | -| `dashboardservice.init.resources` | Set container requests and limits for different resources like CPU or memory (essential for production workloads) | `{}` | +| `dashboardservice.setupJob.enabled` | Enable the setup job that creates dashboards for existing databases in the Dashboard UI. | `true` | +| `dashboardservice.setupJob.resourcesPreset` | The container resource preset | `nano` | +| `dashboardservice.setupJob.resources` | Set container requests and limits for different resources like CPU or memory (essential for production workloads) | `{}` | | `dashboardservice.replicaCount` | The number of replicas. | `2` | ### Dashboard UI -| Name | Description | Value | -| ----------------------------- | ----------------------------------- | --------------------- | -| `dashboardui.enabled` | Enable the Dashboard UI. | `true` | -| `dashboardui.metrics.enabled` | Enable the metrics sidecar. | `true` | -| `dashboardui.endpoint` | The endpoint for the microservices. | `http://dashboard-ui` | +| Name | Description | Value | +| ---------------------------------- | ----------------------------------- | -------------------------- | +| `dashboardui.enabled` | Enable the Dashboard UI. | `true` | +| `dashboardui.metrics.enabled` | Enable the metrics sidecar. | `true` | +| `dashboardui.endpoint` | The endpoint for the microservices. | `http://dashboard-ui:3000` | +| `dashboardui.grafana.replicaCount` | The number of replicas. | `2` | ### Metric Service diff --git a/helm/dbrepo/charts/keycloak-24.0.3.tgz b/helm/dbrepo/charts/keycloak-24.0.3.tgz deleted file mode 100644 index 29a964b44168bec6c04969e16cf51c94b75952fc..0000000000000000000000000000000000000000 Binary files a/helm/dbrepo/charts/keycloak-24.0.3.tgz and /dev/null differ diff --git a/helm/dbrepo/charts/keycloak-24.6.6.tgz b/helm/dbrepo/charts/keycloak-24.6.6.tgz new file mode 100644 index 0000000000000000000000000000000000000000..9b9fc4efafb111da60cae8ad4197eb2b733dc7fd Binary files /dev/null and b/helm/dbrepo/charts/keycloak-24.6.6.tgz differ diff --git a/helm/dbrepo/charts/nginx-18.3.1.tgz b/helm/dbrepo/charts/nginx-18.3.1.tgz deleted file mode 100644 index 66ed8e26a1578edede247ba67dc160133d3bc93f..0000000000000000000000000000000000000000 Binary files a/helm/dbrepo/charts/nginx-18.3.1.tgz and /dev/null differ diff --git a/helm/dbrepo/charts/nginx-20.0.2.tgz b/helm/dbrepo/charts/nginx-20.0.2.tgz new file mode 100644 index 0000000000000000000000000000000000000000..91f0c9d5f253e4e2cfc7dfa011954a8e981e6552 Binary files /dev/null and b/helm/dbrepo/charts/nginx-20.0.2.tgz differ diff --git a/helm/dbrepo/charts/postgresql-16.1.0.tgz b/helm/dbrepo/charts/postgresql-16.1.0.tgz new file mode 100644 index 0000000000000000000000000000000000000000..4b12fe544d307c4aaa91f3a94ef2711d39b213ff Binary files /dev/null and b/helm/dbrepo/charts/postgresql-16.1.0.tgz differ diff --git a/helm/dbrepo/charts/seaweedfs-4.2.1.tgz b/helm/dbrepo/charts/seaweedfs-4.2.1.tgz deleted file mode 100644 index 6e3703cd38fdbc2e37da1dd76fb4b1e805e0baa0..0000000000000000000000000000000000000000 Binary files a/helm/dbrepo/charts/seaweedfs-4.2.1.tgz and /dev/null differ diff --git a/helm/dbrepo/charts/seaweedfs-4.8.7.tgz b/helm/dbrepo/charts/seaweedfs-4.8.7.tgz new file mode 100644 index 0000000000000000000000000000000000000000..d66de2af15ba6ad18f5545f7565f1b8cc7e5bf77 Binary files /dev/null and b/helm/dbrepo/charts/seaweedfs-4.8.7.tgz differ diff --git a/helm/dbrepo/files/01-setup-schema.sql b/helm/dbrepo/files/01-setup-schema.sql index 4ba9d70b174dca5b3481d8042f47c332afc4cf2b..818439cf448d617684dee1b3a030f1f4ccf21e6b 100644 --- a/helm/dbrepo/files/01-setup-schema.sql +++ b/helm/dbrepo/files/01-setup-schema.sql @@ -374,11 +374,12 @@ CREATE TABLE IF NOT EXISTS `mdb_identifier_licenses` CREATE TABLE IF NOT EXISTS `mdb_identifier_titles` ( - id VARCHAR(36) NOT NULL DEFAULT UUID(), - pid VARCHAR(36) NOT NULL, - title TEXT NOT NULL, - title_type ENUM ('ALTERNATIVE_TITLE', 'SUBTITLE', 'TRANSLATED_TITLE', 'OTHER'), - language VARCHAR(2), + id VARCHAR(36) NOT NULL DEFAULT UUID(), + pid VARCHAR(36) NOT NULL, + title TEXT NOT NULL, + title_type ENUM ('ALTERNATIVE_TITLE', 'SUBTITLE', 'TRANSLATED_TITLE', 'OTHER'), + ordinal_position INT NOT NULL, + language VARCHAR(2), PRIMARY KEY (`id`), FOREIGN KEY (`pid`) REFERENCES mdb_identifiers (`id`) ) WITH SYSTEM VERSIONING; @@ -394,6 +395,7 @@ CREATE TABLE IF NOT EXISTS `mdb_identifier_funders` award_number VARCHAR(255), award_title TEXT, language VARCHAR(255), + ordinal_position INT NOT NULL, PRIMARY KEY (`id`), FOREIGN KEY (`pid`) REFERENCES mdb_identifiers (`id`) ) WITH SYSTEM VERSIONING; @@ -405,17 +407,19 @@ CREATE TABLE IF NOT EXISTS `mdb_identifier_descriptions` description TEXT NOT NULL, description_type ENUM ('ABSTRACT', 'METHODS', 'SERIES_INFORMATION', 'TABLE_OF_CONTENTS', 'TECHNICAL_INFO', 'OTHER'), language VARCHAR(2), + ordinal_position INT NOT NULL, PRIMARY KEY (`id`), FOREIGN KEY (`pid`) REFERENCES mdb_identifiers (`id`) ) WITH SYSTEM VERSIONING; CREATE TABLE IF NOT EXISTS `mdb_identifier_related` ( - id VARCHAR(36) NOT NULL DEFAULT UUID(), - pid VARCHAR(36) NOT NULL DEFAULT UUID(), - value VARCHAR(255) NOT NULL, - type ENUM ('DOI','URL','URN','ARK','ARXIV','BIBCODE','EAN13','EISSN','HANDLE','IGSN','ISBN','ISTC','LISSN','LSID','PMID','PURL','UPC','W3ID') NOT NULL, - relation ENUM ('IS_CITED_BY','CITES','IS_SUPPLEMENT_TO','IS_SUPPLEMENTED_BY','IS_CONTINUED_BY','CONTINUES','IS_DESCRIBED_BY','DESCRIBES','HAS_METADATA','IS_METADATA_FOR','HAS_VERSION','IS_VERSION_OF','IS_NEW_VERSION_OF','IS_PREVIOUS_VERSION_OF','IS_PART_OF','HAS_PART','IS_PUBLISHED_IN','IS_REFERENCED_BY','REFERENCES','IS_DOCUMENTED_BY','DOCUMENTS','IS_COMPILED_BY','COMPILES','IS_VARIANT_FORM_OF','IS_ORIGINAL_FORM_OF','IS_IDENTICAL_TO','IS_REVIEWED_BY','REVIEWS','IS_DERIVED_FROM','IS_SOURCE_OF','IS_REQUIRED_BY','REQUIRES','IS_OBSOLETED_BY','OBSOLETES') NOT NULL, + id VARCHAR(36) NOT NULL DEFAULT UUID(), + pid VARCHAR(36) NOT NULL DEFAULT UUID(), + value VARCHAR(255) NOT NULL, + type ENUM ('DOI','URL','URN','ARK','ARXIV','BIBCODE','EAN13','EISSN','HANDLE','IGSN','ISBN','ISTC','LISSN','LSID','PMID','PURL','UPC','W3ID') NOT NULL, + relation ENUM ('IS_CITED_BY','CITES','IS_SUPPLEMENT_TO','IS_SUPPLEMENTED_BY','IS_CONTINUED_BY','CONTINUES','IS_DESCRIBED_BY','DESCRIBES','HAS_METADATA','IS_METADATA_FOR','HAS_VERSION','IS_VERSION_OF','IS_NEW_VERSION_OF','IS_PREVIOUS_VERSION_OF','IS_PART_OF','HAS_PART','IS_PUBLISHED_IN','IS_REFERENCED_BY','REFERENCES','IS_DOCUMENTED_BY','DOCUMENTS','IS_COMPILED_BY','COMPILES','IS_VARIANT_FORM_OF','IS_ORIGINAL_FORM_OF','IS_IDENTICAL_TO','IS_REVIEWED_BY','REVIEWS','IS_DERIVED_FROM','IS_SOURCE_OF','IS_REQUIRED_BY','REQUIRES','IS_OBSOLETED_BY','OBSOLETES') NOT NULL, + ordinal_position INT NOT NULL, PRIMARY KEY (`id`), /* must be a single id from persistent identifier concept */ FOREIGN KEY (`pid`) REFERENCES mdb_identifiers (`id`), UNIQUE (pid, value) @@ -425,6 +429,7 @@ CREATE TABLE IF NOT EXISTS `mdb_identifier_creators` ( id VARCHAR(36) NOT NULL DEFAULT UUID(), pid VARCHAR(36) NOT NULL, + ordinal_position INT NOT NULL, given_names TEXT, family_name TEXT, creator_name VARCHAR(255) NOT NULL, diff --git a/helm/dbrepo/files/create-event-listener.jar b/helm/dbrepo/files/create-event-listener.jar index 069d52a2d4e0930349d1cce948e86fca1c5d280a..58ae18d12de1331078787969009290c78ef64c3b 100644 Binary files a/helm/dbrepo/files/create-event-listener.jar and b/helm/dbrepo/files/create-event-listener.jar differ diff --git a/helm/dbrepo/files/dbrepo.conf b/helm/dbrepo/files/dbrepo.conf new file mode 100644 index 0000000000000000000000000000000000000000..b98aca8b0c890cb5312a99246e912310933dd8a5 --- /dev/null +++ b/helm/dbrepo/files/dbrepo.conf @@ -0,0 +1,187 @@ +# This is required to proxy Grafana Live WebSocket connections. +map $http_upgrade $connection_upgrade { + default upgrade; + '' close; +} + +proxy_buffer_size 128k; +proxy_buffers 4 256k; +proxy_busy_buffers_size 256k; + +log_format structured '{"remote_addr": "$remote_addr", "remote_user": "$remote_user", "request": "$request", "status": $status, "body_bytes_sent": $body_bytes_sent, "http_referer": "$http_referer", "http_user_agent": "$http_user_agent"}'; + +server { + gzip on; + access_log /var/log/nginx/access.log structured; + + listen 8080 default_server; + server_name _; + + location /dashboard/ { + proxy_set_header Host $http_host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Host $host; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_pass http://dashboard-ui:3000/; + proxy_read_timeout 90; + } + + # Proxy Grafana Live WebSocket connections. + location /dashboard/api/live/ws { + rewrite ^/dashboard/(.*) /$1 break; + proxy_set_header Host $http_host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Host $host; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection $connection_upgrade; + proxy_http_version 1.1; + proxy_pass http://dashboard-ui:3000/; + proxy_read_timeout 90; + } + + # Proxy Keycloak OIDC connections, c.f. https://www.keycloak.org/server/reverseproxy#_exposed_path_recommendations + location /realms { + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Host $host; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_pass http://auth-service; + proxy_read_timeout 90; + } + + # Proxy Keycloak assets, c.f. https://www.keycloak.org/server/reverseproxy#_exposed_path_recommendations + location /resources { + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Host $host; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_pass http://auth-service; + proxy_read_timeout 90; + } + + location /api/search { + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Host $host; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_pass http://search-service; + proxy_read_timeout 90; + } + + location /api/datasource { + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Host $host; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_pass http://dashboard-service; + proxy_read_timeout 90; + } + + location /api/dashboard { + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Host $host; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_pass http://dashboard-service; + proxy_read_timeout 90; + } + + location /api/upload { + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Host $host; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_set_header X-Forwarded-Host $host; + proxy_pass http://data-service; + proxy_read_timeout 90; + # Disable request and response buffering + proxy_request_buffering off; + proxy_buffering off; + proxy_http_version 1.1; + } + + location /api/analyse { + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Host $host; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_pass http://analyse-service; + proxy_read_timeout 90; + } + + location ~ "/api/database/([0-9a-f]{8}-[0-9a-f]{4}-[4][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12})/table/([0-9a-f]{8}-[0-9a-f]{4}-[4][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12})/(data|statistic|history)" { + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Host $host; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_pass http://data-service; + proxy_read_timeout 90; + } + + location ~ "/api/database/([0-9a-f]{8}-[0-9a-f]{4}-[4][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12})/view/([0-9a-f]{8}-[0-9a-f]{4}-[4][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12})/(data|statistic)" { + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Host $host; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_pass http://data-service; + proxy_read_timeout 90; + } + + location ~ "/api/database/([0-9a-f]{8}-[0-9a-f]{4}-[4][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12})/view" { + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Host $host; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_pass http://metadata-service; + proxy_read_timeout 90; + } + + location ~ "/api/database/([0-9a-f]{8}-[0-9a-f]{4}-[4][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12})/subset" { + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Host $host; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_pass http://data-service; + proxy_read_timeout 600; + } + + location ~ "/api/(database|concept|container|identifier|image|message|license|oai|ontology|unit|user)" { + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Host $host; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_pass http://metadata-service; + proxy_read_timeout 90; + } + + location ~ "/api/identifier/([0-9a-f]{8}-[0-9a-f]{4}-[4][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12})" { + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Host $host; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_pass http://metadata-service; + proxy_read_timeout 90; + } + + location ~ "/pid/([0-9a-f]{8}-[0-9a-f]{4}-[4][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12})" { + rewrite /pid/(.*) /api/identifier/$1 break; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Host $host; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_pass http://metadata-service; + proxy_read_timeout 90; + } + + location / { + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Host $host; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_pass http://ui:3000; + proxy_read_timeout 90; + } +} diff --git a/helm/dbrepo/files/system.json b/helm/dbrepo/files/dbrepo.json similarity index 72% rename from helm/dbrepo/files/system.json rename to helm/dbrepo/files/dbrepo.json index edee464f623bde864422058dc1edf31d98631162..0d3f4956b04c666a30d35c26ab9b3076b5db59a1 100644 --- a/helm/dbrepo/files/system.json +++ b/helm/dbrepo/files/dbrepo.json @@ -18,6 +18,7 @@ "editable": true, "fiscalYearStartMonth": 0, "graphTooltip": 1, + "id": 5, "links": [ { "asDropdown": false, @@ -29,11 +30,12 @@ "title": "Docs", "tooltip": "", "type": "link", - "url": "https://www.ifs.tuwien.ac.at/infrastructures/dbrepo/1.4.6/" + "url": "https://www.ifs.tuwien.ac.at/infrastructures/dbrepo/1.9/" } ], "panels": [ { + "collapsed": false, "gridPos": { "h": 1, "w": 24, @@ -41,6 +43,7 @@ "y": 0 }, "id": 34, + "panels": [], "title": "tl;dr", "type": "row" }, @@ -48,7 +51,7 @@ "datasource": { "default": true, "type": "prometheus", - "uid": "P18F45E9DC7E75912" + "uid": "dbrepometrics0" }, "description": "Quality of Service", "fieldConfig": { @@ -109,16 +112,16 @@ "textMode": "auto", "wideLayout": true }, - "pluginVersion": "10.4.3", + "pluginVersion": "11.3.1", "targets": [ { "datasource": { "type": "prometheus", - "uid": "P18F45E9DC7E75912" + "uid": "dbrepometrics0" }, "disableTextWrap": false, "editorMode": "code", - "expr": "sum(up)*100/count(up)", + "expr": "sum(up{instance=~\".*-service.*|ui.*|.*-db-metrics.*\"})*100/count(up{instance=~\".*-service.*|ui.*|.*-db-metrics.*\"})", "fullMetaSearch": false, "includeNullMetadata": true, "instant": false, @@ -134,7 +137,7 @@ { "datasource": { "type": "prometheus", - "uid": "P18F45E9DC7E75912" + "uid": "dbrepometrics0" }, "description": "", "fieldConfig": { @@ -179,12 +182,12 @@ "textMode": "auto", "wideLayout": true }, - "pluginVersion": "10.4.3", + "pluginVersion": "11.3.1", "targets": [ { "datasource": { "type": "prometheus", - "uid": "P18F45E9DC7E75912" + "uid": "dbrepometrics0" }, "disableTextWrap": false, "editorMode": "code", @@ -205,7 +208,7 @@ "datasource": { "default": true, "type": "prometheus", - "uid": "P18F45E9DC7E75912" + "uid": "dbrepometrics0" }, "fieldConfig": { "defaults": { @@ -247,12 +250,12 @@ "textMode": "auto", "wideLayout": true }, - "pluginVersion": "10.4.3", + "pluginVersion": "11.3.1", "targets": [ { "datasource": { "type": "prometheus", - "uid": "P18F45E9DC7E75912" + "uid": "dbrepometrics0" }, "disableTextWrap": false, "editorMode": "builder", @@ -273,7 +276,7 @@ "datasource": { "default": true, "type": "prometheus", - "uid": "P18F45E9DC7E75912" + "uid": "dbrepometrics0" }, "fieldConfig": { "defaults": { @@ -315,12 +318,12 @@ "textMode": "auto", "wideLayout": true }, - "pluginVersion": "10.4.3", + "pluginVersion": "11.3.1", "targets": [ { "datasource": { "type": "prometheus", - "uid": "P18F45E9DC7E75912" + "uid": "dbrepometrics0" }, "disableTextWrap": false, "editorMode": "builder", @@ -336,7 +339,7 @@ { "datasource": { "type": "prometheus", - "uid": "P18F45E9DC7E75912" + "uid": "dbrepometrics0" }, "disableTextWrap": false, "editorMode": "builder", @@ -353,7 +356,7 @@ { "datasource": { "type": "prometheus", - "uid": "P18F45E9DC7E75912" + "uid": "dbrepometrics0" }, "disableTextWrap": false, "editorMode": "builder", @@ -388,7 +391,7 @@ "datasource": { "default": true, "type": "prometheus", - "uid": "P18F45E9DC7E75912" + "uid": "dbrepometrics0" }, "description": "", "fieldConfig": { @@ -431,12 +434,12 @@ "textMode": "auto", "wideLayout": true }, - "pluginVersion": "10.4.3", + "pluginVersion": "11.3.1", "targets": [ { "datasource": { "type": "prometheus", - "uid": "P18F45E9DC7E75912" + "uid": "dbrepometrics0" }, "disableTextWrap": false, "editorMode": "builder", @@ -453,13 +456,183 @@ "title": "Data Volume", "type": "stat" }, + { + "datasource": { + "type": "prometheus", + "uid": "dbrepometrics0" + }, + "description": "Top 10 by number of accesses", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + } + }, + "mappings": [] + }, + "overrides": [] + }, + "gridPos": { + "h": 7, + "w": 12, + "x": 0, + "y": 4 + }, + "id": 38, + "options": { + "displayLabels": [ + "percent" + ], + "legend": { + "calcs": [], + "displayMode": "hidden", + "placement": "right", + "showLegend": false, + "values": [] + }, + "pieType": "pie", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "tooltip": { + "hideZeros": false, + "mode": "single", + "sort": "none" + } + }, + "pluginVersion": "11.3.1", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "dbrepometrics0" + }, + "editorMode": "code", + "expr": "topk(10, dbrepo_datasource_data_get_total)", + "instant": false, + "legendFormat": "{{uri}}", + "range": true, + "refId": "A" + } + ], + "title": "Popular Data Sources", + "type": "piechart" + }, + { + "datasource": { + "type": "prometheus", + "uid": "dbrepometrics0" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "smooth", + "lineWidth": 2, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 7, + "w": 12, + "x": 12, + "y": 4 + }, + "id": 40, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "hideZeros": false, + "mode": "single", + "sort": "none" + } + }, + "pluginVersion": "11.3.1", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "dbrepometrics0" + }, + "disableTextWrap": false, + "editorMode": "builder", + "expr": "SeaweedFS_s3_request_total", + "fullMetaSearch": false, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "{{type}}", + "range": true, + "refId": "A", + "useBackend": false + } + ], + "title": "S3 Requests", + "type": "timeseries" + }, { "collapsed": false, "gridPos": { "h": 1, "w": 24, "x": 0, - "y": 4 + "y": 11 }, "id": 22, "panels": [], @@ -469,7 +642,7 @@ { "datasource": { "type": "prometheus", - "uid": "P18F45E9DC7E75912" + "uid": "dbrepometrics0" }, "description": "", "fieldConfig": { @@ -506,7 +679,7 @@ "h": 3, "w": 4, "x": 0, - "y": 5 + "y": 12 }, "id": 17, "options": { @@ -526,12 +699,12 @@ "textMode": "auto", "wideLayout": true }, - "pluginVersion": "10.4.3", + "pluginVersion": "11.3.1", "targets": [ { "datasource": { "type": "prometheus", - "uid": "P18F45E9DC7E75912" + "uid": "dbrepometrics0" }, "disableTextWrap": false, "editorMode": "code", @@ -551,7 +724,7 @@ { "datasource": { "type": "prometheus", - "uid": "P18F45E9DC7E75912" + "uid": "dbrepometrics0" }, "description": "", "fieldConfig": { @@ -588,7 +761,7 @@ "h": 3, "w": 4, "x": 4, - "y": 5 + "y": 12 }, "id": 24, "options": { @@ -608,12 +781,12 @@ "textMode": "auto", "wideLayout": true }, - "pluginVersion": "10.4.3", + "pluginVersion": "11.3.1", "targets": [ { "datasource": { "type": "prometheus", - "uid": "P18F45E9DC7E75912" + "uid": "dbrepometrics0" }, "disableTextWrap": false, "editorMode": "code", @@ -633,7 +806,7 @@ { "datasource": { "type": "prometheus", - "uid": "P18F45E9DC7E75912" + "uid": "dbrepometrics0" }, "description": "", "fieldConfig": { @@ -645,8 +818,16 @@ "mode": "absolute", "steps": [ { - "color": "blue", + "color": "red", "value": null + }, + { + "color": "yellow", + "value": 1 + }, + { + "color": "green", + "value": 2 } ] }, @@ -658,7 +839,7 @@ "h": 3, "w": 4, "x": 8, - "y": 5 + "y": 12 }, "id": 25, "options": { @@ -678,12 +859,12 @@ "textMode": "auto", "wideLayout": true }, - "pluginVersion": "10.4.3", + "pluginVersion": "11.3.1", "targets": [ { "datasource": { "type": "prometheus", - "uid": "P18F45E9DC7E75912" + "uid": "dbrepometrics0" }, "disableTextWrap": false, "editorMode": "code", @@ -703,7 +884,7 @@ { "datasource": { "type": "prometheus", - "uid": "P18F45E9DC7E75912" + "uid": "dbrepometrics0" }, "description": "", "fieldConfig": { @@ -715,8 +896,12 @@ "mode": "absolute", "steps": [ { - "color": "blue", + "color": "red", "value": null + }, + { + "color": "green", + "value": 1 } ] }, @@ -728,7 +913,7 @@ "h": 3, "w": 4, "x": 12, - "y": 5 + "y": 12 }, "id": 26, "options": { @@ -748,12 +933,12 @@ "textMode": "auto", "wideLayout": true }, - "pluginVersion": "10.4.3", + "pluginVersion": "11.3.1", "targets": [ { "datasource": { "type": "prometheus", - "uid": "P18F45E9DC7E75912" + "uid": "dbrepometrics0" }, "disableTextWrap": false, "editorMode": "code", @@ -773,7 +958,7 @@ { "datasource": { "type": "prometheus", - "uid": "P18F45E9DC7E75912" + "uid": "dbrepometrics0" }, "description": "", "fieldConfig": { @@ -787,7 +972,7 @@ "mode": "absolute", "steps": [ { - "color": "blue", + "color": "green", "value": null } ] @@ -800,7 +985,7 @@ "h": 3, "w": 4, "x": 16, - "y": 5 + "y": 12 }, "id": 27, "options": { @@ -808,6 +993,7 @@ "graphMode": "none", "justifyMode": "auto", "orientation": "auto", + "percentChangeColorMode": "standard", "reduceOptions": { "calcs": [ "lastNotNull" @@ -819,12 +1005,12 @@ "textMode": "auto", "wideLayout": true }, - "pluginVersion": "10.4.3", + "pluginVersion": "11.3.1", "targets": [ { "datasource": { "type": "prometheus", - "uid": "P18F45E9DC7E75912" + "uid": "dbrepometrics0" }, "disableTextWrap": false, "editorMode": "code", @@ -844,7 +1030,7 @@ { "datasource": { "type": "prometheus", - "uid": "P18F45E9DC7E75912" + "uid": "dbrepometrics0" }, "fieldConfig": { "defaults": { @@ -881,11 +1067,17 @@ "h": 7, "w": 12, "x": 0, - "y": 8 + "y": 15 }, "id": 20, "options": { "displayMode": "basic", + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": false + }, "maxVizHeight": 300, "minVizHeight": 16, "minVizWidth": 8, @@ -902,12 +1094,12 @@ "sizing": "auto", "valueMode": "color" }, - "pluginVersion": "10.4.3", + "pluginVersion": "11.3.1", "targets": [ { "datasource": { "type": "prometheus", - "uid": "P18F45E9DC7E75912" + "uid": "dbrepometrics0" }, "disableTextWrap": false, "editorMode": "builder", @@ -927,7 +1119,7 @@ { "datasource": { "type": "prometheus", - "uid": "P18F45E9DC7E75912" + "uid": "dbrepometrics0" }, "fieldConfig": { "defaults": { @@ -941,6 +1133,7 @@ "axisLabel": "", "axisPlacement": "auto", "barAlignment": 0, + "barWidthFactor": 0.6, "drawStyle": "line", "fillOpacity": 0, "gradientMode": "none", @@ -988,7 +1181,7 @@ "h": 7, "w": 12, "x": 12, - "y": 8 + "y": 15 }, "id": 21, "options": { @@ -999,15 +1192,17 @@ "showLegend": true }, "tooltip": { + "hideZeros": false, "mode": "multi", "sort": "none" } }, + "pluginVersion": "11.3.1", "targets": [ { "datasource": { "type": "prometheus", - "uid": "P18F45E9DC7E75912" + "uid": "dbrepometrics0" }, "disableTextWrap": false, "editorMode": "builder", @@ -1030,7 +1225,7 @@ "h": 1, "w": 24, "x": 0, - "y": 15 + "y": 22 }, "id": 31, "panels": [], @@ -1040,9 +1235,9 @@ { "datasource": { "type": "prometheus", - "uid": "P18F45E9DC7E75912" + "uid": "dbrepometrics0" }, - "description": "Quality of Service", + "description": "", "fieldConfig": { "defaults": { "mappings": [], @@ -1051,29 +1246,17 @@ "thresholds": { "mode": "absolute", "steps": [ - { - "color": "purple", - "value": null - }, { "color": "red", - "value": 0 - }, - { - "color": "orange", - "value": 60 - }, - { - "color": "#EAB839", - "value": 80 + "value": null }, { "color": "green", - "value": 100 + "value": 1 } ] }, - "unit": "percent" + "unit": "none" }, "overrides": [] }, @@ -1081,9 +1264,9 @@ "h": 3, "w": 4, "x": 0, - "y": 16 + "y": 23 }, - "id": 32, + "id": 29, "options": { "colorMode": "background", "graphMode": "none", @@ -1101,32 +1284,32 @@ "textMode": "auto", "wideLayout": true }, - "pluginVersion": "10.4.3", + "pluginVersion": "11.3.1", "targets": [ { "datasource": { "type": "prometheus", - "uid": "P18F45E9DC7E75912" + "uid": "dbrepometrics0" }, "disableTextWrap": false, "editorMode": "code", - "expr": "rabbitmq_channels*100/rabbitmq_channel_consumers", + "expr": "rabbitmq_connection_channels", "fullMetaSearch": false, "includeNullMetadata": true, "instant": false, - "legendFormat": "Services Running", + "legendFormat": "__auto", "range": true, "refId": "A", "useBackend": false } ], - "title": "Broker Service QoS", + "title": "Channels", "type": "stat" }, { "datasource": { "type": "prometheus", - "uid": "P18F45E9DC7E75912" + "uid": "dbrepometrics0" }, "description": "", "fieldConfig": { @@ -1138,8 +1321,12 @@ "mode": "absolute", "steps": [ { - "color": "blue", + "color": "red", "value": null + }, + { + "color": "green", + "value": 1 } ] }, @@ -1151,9 +1338,9 @@ "h": 3, "w": 4, "x": 4, - "y": 16 + "y": 23 }, - "id": 29, + "id": 30, "options": { "colorMode": "background", "graphMode": "none", @@ -1171,16 +1358,16 @@ "textMode": "auto", "wideLayout": true }, - "pluginVersion": "10.4.3", + "pluginVersion": "11.3.1", "targets": [ { "datasource": { "type": "prometheus", - "uid": "P18F45E9DC7E75912" + "uid": "dbrepometrics0" }, "disableTextWrap": false, "editorMode": "code", - "expr": "rabbitmq_connection_channels", + "expr": "rabbitmq_channel_consumers", "fullMetaSearch": false, "includeNullMetadata": true, "instant": false, @@ -1190,13 +1377,13 @@ "useBackend": false } ], - "title": "Channels", + "title": "Consumers", "type": "stat" }, { "datasource": { "type": "prometheus", - "uid": "P18F45E9DC7E75912" + "uid": "dbrepometrics0" }, "description": "", "fieldConfig": { @@ -1208,8 +1395,20 @@ "mode": "absolute", "steps": [ { - "color": "blue", + "color": "green", "value": null + }, + { + "color": "#EAB839", + "value": 10 + }, + { + "color": "orange", + "value": 100 + }, + { + "color": "red", + "value": 1000 } ] }, @@ -1221,9 +1420,9 @@ "h": 3, "w": 4, "x": 8, - "y": 16 + "y": 23 }, - "id": 30, + "id": 35, "options": { "colorMode": "background", "graphMode": "none", @@ -1241,16 +1440,16 @@ "textMode": "auto", "wideLayout": true }, - "pluginVersion": "10.4.3", + "pluginVersion": "11.3.1", "targets": [ { "datasource": { "type": "prometheus", - "uid": "P18F45E9DC7E75912" + "uid": "dbrepometrics0" }, "disableTextWrap": false, "editorMode": "code", - "expr": "rabbitmq_channel_consumers", + "expr": "rabbitmq_queue_messages_persistent", "fullMetaSearch": false, "includeNullMetadata": true, "instant": false, @@ -1260,15 +1459,15 @@ "useBackend": false } ], - "title": "Consumers", + "title": "Persistent Messages", "type": "stat" }, { "datasource": { "type": "prometheus", - "uid": "P18F45E9DC7E75912" + "uid": "dbrepometrics0" }, - "description": "", + "description": "Ready and unacknowledged messages stored in memory", "fieldConfig": { "defaults": { "mappings": [], @@ -1303,9 +1502,9 @@ "h": 3, "w": 4, "x": 12, - "y": 16 + "y": 23 }, - "id": 35, + "id": 36, "options": { "colorMode": "background", "graphMode": "none", @@ -1323,16 +1522,16 @@ "textMode": "auto", "wideLayout": true }, - "pluginVersion": "10.4.3", + "pluginVersion": "11.3.1", "targets": [ { "datasource": { "type": "prometheus", - "uid": "P18F45E9DC7E75912" + "uid": "dbrepometrics0" }, "disableTextWrap": false, "editorMode": "code", - "expr": "rabbitmq_queue_messages_persistent", + "expr": "rabbitmq_queue_messages_ram", "fullMetaSearch": false, "includeNullMetadata": true, "instant": false, @@ -1342,15 +1541,15 @@ "useBackend": false } ], - "title": "Persistent Messages", + "title": "Ready Messages", "type": "stat" }, { "datasource": { "type": "prometheus", - "uid": "P18F45E9DC7E75912" + "uid": "dbrepometrics0" }, - "description": "Ready and unacknowledged messages stored in memory", + "description": "Messages delivered to consumers but not yet acknowledged", "fieldConfig": { "defaults": { "mappings": [], @@ -1385,9 +1584,9 @@ "h": 3, "w": 4, "x": 16, - "y": 16 + "y": 23 }, - "id": 36, + "id": 37, "options": { "colorMode": "background", "graphMode": "none", @@ -1405,16 +1604,16 @@ "textMode": "auto", "wideLayout": true }, - "pluginVersion": "10.4.3", + "pluginVersion": "11.3.1", "targets": [ { "datasource": { "type": "prometheus", - "uid": "P18F45E9DC7E75912" + "uid": "dbrepometrics0" }, "disableTextWrap": false, "editorMode": "code", - "expr": "rabbitmq_queue_messages_ram", + "expr": "rabbitmq_queue_messages_unacked", "fullMetaSearch": false, "includeNullMetadata": true, "instant": false, @@ -1424,97 +1623,15 @@ "useBackend": false } ], - "title": "Ready Messages", + "title": "Unacked Messages", "type": "stat" }, { "datasource": { "type": "prometheus", - "uid": "P18F45E9DC7E75912" + "uid": "dbrepometrics0" }, - "description": "Messages delivered to consumers but not yet acknowledged", - "fieldConfig": { - "defaults": { - "mappings": [], - "max": 100, - "min": 0, - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - }, - { - "color": "#EAB839", - "value": 10 - }, - { - "color": "orange", - "value": 100 - }, - { - "color": "red", - "value": 1000 - } - ] - }, - "unit": "none" - }, - "overrides": [] - }, - "gridPos": { - "h": 3, - "w": 4, - "x": 20, - "y": 16 - }, - "id": 37, - "options": { - "colorMode": "background", - "graphMode": "none", - "justifyMode": "auto", - "orientation": "auto", - "percentChangeColorMode": "standard", - "reduceOptions": { - "calcs": [ - "lastNotNull" - ], - "fields": "", - "values": false - }, - "showPercentChange": false, - "textMode": "auto", - "wideLayout": true - }, - "pluginVersion": "10.4.3", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "P18F45E9DC7E75912" - }, - "disableTextWrap": false, - "editorMode": "code", - "expr": "rabbitmq_queue_messages_unacked", - "fullMetaSearch": false, - "includeNullMetadata": true, - "instant": false, - "legendFormat": "__auto", - "range": true, - "refId": "A", - "useBackend": false - } - ], - "title": "Unacked Messages", - "type": "stat" - }, - { - "datasource": { - "type": "prometheus", - "uid": "P18F45E9DC7E75912" - }, - "description": "Messages for received protocol messages", + "description": "Messages for received protocol messages", "fieldConfig": { "defaults": { "color": { @@ -1527,6 +1644,7 @@ "axisLabel": "", "axisPlacement": "auto", "barAlignment": 0, + "barWidthFactor": 0.6, "drawStyle": "line", "fillOpacity": 0, "gradientMode": "none", @@ -1601,7 +1719,7 @@ "h": 7, "w": 12, "x": 0, - "y": 19 + "y": 26 }, "id": 33, "options": { @@ -1612,16 +1730,17 @@ "showLegend": true }, "tooltip": { + "hideZeros": false, "mode": "single", "sort": "none" } }, - "pluginVersion": "10.4.3", + "pluginVersion": "11.3.1", "targets": [ { "datasource": { "type": "prometheus", - "uid": "P18F45E9DC7E75912" + "uid": "dbrepometrics0" }, "disableTextWrap": false, "editorMode": "code", @@ -1638,13 +1757,108 @@ "title": "Throughput", "type": "timeseries" }, + { + "datasource": { + "type": "prometheus", + "uid": "dbrepometrics0" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "mappings": [ + { + "options": { + "0": { + "index": 0, + "text": "DOWN" + }, + "1": { + "index": 1, + "text": "UP" + } + }, + "type": "value" + } + ], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "red", + "value": null + }, + { + "color": "green", + "value": 1 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 7, + "w": 12, + "x": 12, + "y": 26 + }, + "id": 16, + "options": { + "displayMode": "basic", + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": false + }, + "maxVizHeight": 300, + "minVizHeight": 16, + "minVizWidth": 8, + "namePlacement": "auto", + "orientation": "auto", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "showUnfilled": true, + "sizing": "auto", + "valueMode": "color" + }, + "pluginVersion": "11.3.1", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "dbrepometrics0" + }, + "disableTextWrap": false, + "editorMode": "builder", + "expr": "up{instance=~\".*-service.*|ui.*|.*-db-metrics.*\"}", + "fullMetaSearch": false, + "hide": false, + "includeNullMetadata": true, + "instant": false, + "legendFormat": "{{instance}}", + "range": true, + "refId": "A", + "useBackend": false + } + ], + "title": "Service QoS", + "type": "bargauge" + }, { "collapsed": false, "gridPos": { "h": 1, "w": 24, "x": 0, - "y": 26 + "y": 33 }, "id": 2, "panels": [], @@ -1654,7 +1868,7 @@ { "datasource": { "type": "prometheus", - "uid": "P18F45E9DC7E75912" + "uid": "dbrepometrics0" }, "description": "", "fieldConfig": { @@ -1669,6 +1883,7 @@ "axisLabel": "", "axisPlacement": "auto", "barAlignment": 0, + "barWidthFactor": 0.6, "drawStyle": "line", "fillOpacity": 0, "gradientMode": "none", @@ -1715,7 +1930,7 @@ "h": 7, "w": 12, "x": 0, - "y": 27 + "y": 34 }, "id": 23, "options": { @@ -1726,16 +1941,17 @@ "showLegend": true }, "tooltip": { + "hideZeros": false, "mode": "multi", "sort": "none" } }, - "pluginVersion": "10.4.9", + "pluginVersion": "11.3.1", "targets": [ { "datasource": { "type": "prometheus", - "uid": "P18F45E9DC7E75912" + "uid": "dbrepometrics0" }, "disableTextWrap": false, "editorMode": "code", @@ -1754,101 +1970,11 @@ }, { "datasource": { + "default": true, "type": "prometheus", - "uid": "P18F45E9DC7E75912" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "thresholds" - }, - "custom": { - "fillOpacity": 70, - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "lineWidth": 1 - }, - "mappings": [ - { - "options": { - "0": { - "index": 0, - "text": "DOWN" - }, - "1": { - "index": 1, - "text": "UP" - } - }, - "type": "value" - } - ], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "red", - "value": null - }, - { - "color": "green", - "value": 1 - } - ] - } - }, - "overrides": [] - }, - "gridPos": { - "h": 7, - "w": 12, - "x": 12, - "y": 27 - }, - "id": 16, - "options": { - "colWidth": 0.9, - "legend": { - "displayMode": "list", - "placement": "bottom", - "showLegend": false - }, - "rowHeight": 0.9, - "showValue": "auto", - "tooltip": { - "mode": "single", - "sort": "none" - } - }, - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "P18F45E9DC7E75912" - }, - "disableTextWrap": false, - "editorMode": "builder", - "expr": "up", - "fullMetaSearch": false, - "includeNullMetadata": true, - "instant": false, - "legendFormat": "{{instance}}", - "range": true, - "refId": "A", - "useBackend": false - } - ], - "title": "Service QoS", - "type": "status-history" - }, - { - "datasource": { - "type": "prometheus", - "uid": "P18F45E9DC7E75912" + "uid": "dbrepometrics0" }, + "description": "Heap and non-heap memory summed", "fieldConfig": { "defaults": { "color": { @@ -1861,6 +1987,7 @@ "axisLabel": "", "axisPlacement": "auto", "barAlignment": 0, + "barWidthFactor": 0.6, "drawStyle": "line", "fillOpacity": 25, "gradientMode": "none", @@ -1896,7 +2023,7 @@ } ] }, - "unit": "none" + "unit": "decbytes" }, "overrides": [ { @@ -1964,10 +2091,10 @@ "gridPos": { "h": 7, "w": 12, - "x": 0, + "x": 12, "y": 34 }, - "id": 6, + "id": 7, "options": { "legend": { "calcs": [], @@ -1976,40 +2103,39 @@ "showLegend": true }, "tooltip": { + "hideZeros": false, "mode": "multi", "sort": "none" } }, - "pluginVersion": "11.2.0", + "pluginVersion": "11.3.1", "targets": [ { "datasource": { "type": "prometheus", - "uid": "P18F45E9DC7E75912" + "uid": "dbrepometrics0" }, "disableTextWrap": false, "editorMode": "builder", - "expr": "process_cpu_usage", + "expr": "sum by(instance) (jvm_memory_used_bytes)", "fullMetaSearch": false, "hide": false, - "includeNullMetadata": true, + "includeNullMetadata": false, "instant": false, "legendFormat": "{{instance}}", "range": true, - "refId": "process_cpu_usage", + "refId": "A", "useBackend": false } ], - "title": "CPU Usage", + "title": "JVM Memory Usage", "type": "timeseries" }, { "datasource": { - "default": true, "type": "prometheus", - "uid": "P18F45E9DC7E75912" + "uid": "dbrepometrics0" }, - "description": "Heap and non-heap memory summed", "fieldConfig": { "defaults": { "color": { @@ -2022,6 +2148,7 @@ "axisLabel": "", "axisPlacement": "auto", "barAlignment": 0, + "barWidthFactor": 0.6, "drawStyle": "line", "fillOpacity": 25, "gradientMode": "none", @@ -2057,7 +2184,7 @@ } ] }, - "unit": "decbytes" + "unit": "none" }, "overrides": [ { @@ -2125,10 +2252,10 @@ "gridPos": { "h": 7, "w": 12, - "x": 12, - "y": 34 + "x": 0, + "y": 41 }, - "id": 7, + "id": 6, "options": { "legend": { "calcs": [], @@ -2137,37 +2264,38 @@ "showLegend": true }, "tooltip": { + "hideZeros": false, "mode": "multi", "sort": "none" } }, - "pluginVersion": "11.2.0", + "pluginVersion": "11.3.1", "targets": [ { "datasource": { "type": "prometheus", - "uid": "P18F45E9DC7E75912" + "uid": "dbrepometrics0" }, "disableTextWrap": false, "editorMode": "builder", - "expr": "sum by(instance) (jvm_memory_used_bytes)", + "expr": "process_cpu_usage", "fullMetaSearch": false, "hide": false, - "includeNullMetadata": false, + "includeNullMetadata": true, "instant": false, "legendFormat": "{{instance}}", "range": true, - "refId": "A", + "refId": "process_cpu_usage", "useBackend": false } ], - "title": "JVM Memory Usage", + "title": "CPU Usage", "type": "timeseries" }, { "datasource": { "type": "prometheus", - "uid": "P18F45E9DC7E75912" + "uid": "dbrepometrics0" }, "fieldConfig": { "defaults": { @@ -2181,6 +2309,7 @@ "axisLabel": "", "axisPlacement": "auto", "barAlignment": 0, + "barWidthFactor": 0.6, "drawStyle": "line", "fillOpacity": 25, "gradientMode": "none", @@ -2254,10 +2383,10 @@ "gridPos": { "h": 7, "w": 12, - "x": 0, + "x": 12, "y": 41 }, - "id": 18, + "id": 19, "options": { "legend": { "calcs": [], @@ -2266,65 +2395,56 @@ "showLegend": true }, "tooltip": { + "hideZeros": false, "mode": "multi", "sort": "none" } }, + "pluginVersion": "11.3.1", "targets": [ { "datasource": { "type": "prometheus", - "uid": "P18F45E9DC7E75912" + "uid": "dbrepometrics0" }, "editorMode": "code", - "expr": "rate(flask_http_request_duration_seconds_count{status=~\"200|201|202\",path!=\"/health\"}[$__rate_interval])", + "expr": "rate(flask_http_request_duration_seconds_count{status!~\"200|201|202\"}[$__rate_interval])", "instant": false, - "legendFormat": "{{method}} {{instance}} {{path}} ({{status}})", + "legendFormat": "{{method}} {{instance}} ({{status}})", "range": true, "refId": "A" } ], - "title": "Successful API Requests", + "title": "Failed API Requests", "type": "timeseries" }, { "datasource": { - "type": "prometheus", - "uid": "P18F45E9DC7E75912" + "type": "grafana-opensearch-datasource", + "uid": "dbrepoopensearch0" }, "fieldConfig": { "defaults": { "color": { - "mode": "palette-classic" + "mode": "fixed" }, "custom": { "axisBorderShow": false, "axisCenteredZero": false, "axisColorMode": "text", - "axisLabel": "", + "axisLabel": "Count", "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 25, + "fillOpacity": 80, "gradientMode": "none", "hideFrom": { "legend": false, "tooltip": false, "viz": false }, - "insertNulls": false, - "lineInterpolation": "smooth", - "lineWidth": 2, - "pointSize": 5, + "lineWidth": 1, "scaleDistribution": { "type": "linear" }, - "showPoints": "auto", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, "thresholdsStyle": { "mode": "off" } @@ -2338,14 +2458,51 @@ "value": null } ] - }, - "unit": "reqps" + } }, "overrides": [ { "matcher": { - "id": "byRegexp", - "options": "/.*search-service.*/" + "id": "byFrameRefID", + "options": "200" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "green", + "mode": "fixed" + } + }, + { + "id": "displayName", + "value": "200s" + } + ] + }, + { + "matcher": { + "id": "byFrameRefID", + "options": "300" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "purple", + "mode": "fixed" + } + }, + { + "id": "displayName", + "value": "300s" + } + ] + }, + { + "matcher": { + "id": "byFrameRefID", + "options": "400" }, "properties": [ { @@ -2354,34 +2511,368 @@ "fixedColor": "orange", "mode": "fixed" } + }, + { + "id": "displayName", + "value": "400s" } ] }, { "matcher": { - "id": "byRegexp", - "options": "/.*analyse-service.*/" + "id": "byFrameRefID", + "options": "500" }, "properties": [ { "id": "color", "value": { - "fixedColor": "super-light-orange", + "fixedColor": "red", "mode": "fixed" } + }, + { + "id": "displayName", + "value": "500s" } ] } ] }, "gridPos": { - "h": 7, + "h": 8, + "w": 12, + "x": 0, + "y": 48 + }, + "id": 43, + "options": { + "barRadius": 0, + "barWidth": 0.97, + "fullHighlight": false, + "groupWidth": 0.7, + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "right", + "showLegend": true + }, + "orientation": "auto", + "showValue": "auto", + "stacking": "normal", + "tooltip": { + "hideZeros": false, + "mode": "multi", + "sort": "none" + }, + "xTickLabelRotation": 0, + "xTickLabelSpacing": 100 + }, + "pluginVersion": "11.3.1", + "targets": [ + { + "alias": "", + "bucketAggs": [ + { + "id": "2", + "settings": { + "interval": "auto", + "min_doc_count": "0", + "trimEdges": "0" + }, + "type": "date_histogram" + } + ], + "datasource": { + "type": "grafana-opensearch-datasource", + "uid": "dbrepoopensearch0" + }, + "format": "table", + "hide": false, + "luceneQueryType": "Metric", + "metrics": [ + { + "id": "1", + "type": "count" + } + ], + "query": "status: (>=200 AND <300)", + "queryType": "lucene", + "refId": "200", + "timeField": "@timestamp" + }, + { + "alias": "", + "bucketAggs": [ + { + "id": "2", + "settings": { + "interval": "auto", + "min_doc_count": "0", + "trimEdges": "0" + }, + "type": "date_histogram" + } + ], + "datasource": { + "type": "grafana-opensearch-datasource", + "uid": "dbrepoopensearch0" + }, + "format": "table", + "hide": false, + "luceneQueryType": "Metric", + "metrics": [ + { + "id": "1", + "type": "count" + } + ], + "query": "status: (>=300 AND <400)", + "queryType": "lucene", + "refId": "300", + "timeField": "@timestamp" + }, + { + "alias": "", + "bucketAggs": [ + { + "id": "2", + "settings": { + "interval": "auto", + "min_doc_count": "0", + "trimEdges": "0" + }, + "type": "date_histogram" + } + ], + "datasource": { + "type": "grafana-opensearch-datasource", + "uid": "dbrepoopensearch0" + }, + "format": "table", + "hide": false, + "luceneQueryType": "Metric", + "metrics": [ + { + "id": "1", + "type": "count" + } + ], + "query": "status: (>=400 AND <500)", + "queryType": "lucene", + "refId": "400", + "timeField": "@timestamp" + }, + { + "alias": "", + "bucketAggs": [ + { + "id": "2", + "settings": { + "interval": "auto", + "min_doc_count": "0", + "trimEdges": "0" + }, + "type": "date_histogram" + } + ], + "datasource": { + "type": "grafana-opensearch-datasource", + "uid": "dbrepoopensearch0" + }, + "format": "table", + "hide": false, + "luceneQueryType": "Metric", + "metrics": [ + { + "id": "1", + "type": "count" + } + ], + "query": "status: >=500", + "queryType": "lucene", + "refId": "500", + "timeField": "@timestamp" + } + ], + "title": "HTTP Status Codes over Time", + "type": "barchart" + }, + { + "datasource": { + "type": "grafana-opensearch-datasource", + "uid": "dbrepoopensearch0" + }, + "fieldConfig": { + "defaults": {}, + "overrides": [ + { + "matcher": { + "id": "byFrameRefID", + "options": "200" + }, + "properties": [] + }, + { + "matcher": { + "id": "byFrameRefID", + "options": "300" + }, + "properties": [] + }, + { + "matcher": { + "id": "byFrameRefID", + "options": "400" + }, + "properties": [] + }, + { + "matcher": { + "id": "byFrameRefID", + "options": "500" + }, + "properties": [] + } + ] + }, + "gridPos": { + "h": 8, "w": 12, "x": 12, - "y": 41 + "y": 48 }, - "id": 19, + "id": 44, "options": { + "dedupStrategy": "none", + "enableLogDetails": true, + "prettifyLogMessage": false, + "showCommonLabels": false, + "showLabels": false, + "showTime": false, + "sortOrder": "Descending", + "wrapLogMessage": false + }, + "pluginVersion": "11.3.1", + "targets": [ + { + "alias": "", + "bucketAggs": [ + { + "id": "2", + "settings": { + "interval": "auto", + "min_doc_count": "0", + "trimEdges": "0" + }, + "type": "date_histogram" + } + ], + "datasource": { + "type": "grafana-opensearch-datasource", + "uid": "dbrepoopensearch0" + }, + "format": "table", + "hide": false, + "luceneQueryType": "Logs", + "metrics": [ + { + "id": "1", + "type": "logs" + } + ], + "query": "status: >=400", + "queryType": "lucene", + "refId": "ERROR", + "timeField": "@timestamp" + } + ], + "title": "REST API Errors", + "type": "logs" + }, + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 56 + }, + "id": 39, + "panels": [], + "title": "Storage", + "type": "row" + }, + { + "datasource": { + "type": "prometheus", + "uid": "dbrepometrics0" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 10, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "smooth", + "lineWidth": 2, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "short" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 57 + }, + "id": 41, + "options": { + "alertThreshold": true, "legend": { "calcs": [], "displayMode": "list", @@ -2389,45 +2880,176 @@ "showLegend": true }, "tooltip": { + "hideZeros": false, "mode": "multi", "sort": "none" } }, + "pluginVersion": "11.3.1", "targets": [ { "datasource": { "type": "prometheus", - "uid": "P18F45E9DC7E75912" + "uid": "dbrepometrics0" }, - "editorMode": "code", - "expr": "rate(flask_http_request_duration_seconds_count{status!~\"200|201|202\"}[$__rate_interval])", - "instant": false, - "legendFormat": "{{method}} {{instance}} ({{status}})", - "range": true, + "expr": "sum(SeaweedFS_volumeServer_volumes) by (collection, type)", + "format": "time_series", + "hide": false, + "intervalFactor": 2, + "legendFormat": "{{collection}} {{type}}", + "refId": "A" + }, + { + "datasource": { + "type": "prometheus", + "uid": "dbrepometrics0" + }, + "expr": "sum(SeaweedFS_volumeServer_max_volumes)", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "Total", + "refId": "B" + } + ], + "title": "Volume Count", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "dbrepometrics0" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "line", + "fillOpacity": 10, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "smooth", + "lineWidth": 2, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "bytes" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 57 + }, + "id": 42, + "options": { + "alertThreshold": true, + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "hideZeros": false, + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "11.3.1", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "dbrepometrics0" + }, + "expr": "sum(SeaweedFS_volumeServer_total_disk_size) by (collection, type)", + "format": "time_series", + "hide": false, + "intervalFactor": 2, + "legendFormat": "{{collection}} {{type}}", "refId": "A" + }, + { + "datasource": { + "type": "prometheus", + "uid": "dbrepometrics0" + }, + "expr": "sum(SeaweedFS_volumeServer_total_disk_size)", + "format": "time_series", + "intervalFactor": 2, + "legendFormat": "Total", + "refId": "B" } ], - "title": "Failed API Requests", + "title": "Used Disk Space by Collection and Type", "type": "timeseries" } ], - "refresh": "1m", - "schemaVersion": 39, + "preload": false, + "refresh": "5m", + "schemaVersion": 40, "tags": [ - "provisioned", - "dbrepo" + "ui", + "dashboard", + "metadata", + "data", + "gateway", + "analyse", + "metrics", + "auth" ], "templating": { "list": [] }, "time": { - "from": "now-30m", + "from": "now-3h", "to": "now" }, "timepicker": {}, "timezone": "browser", - "title": "DBRepo - Overview", + "title": "DBRepo", "uid": "bdz20owu8zn5se", - "version": 1, + "version": 2, "weekStart": "" } \ No newline at end of file diff --git a/helm/dbrepo/files/keycloak.json b/helm/dbrepo/files/keycloak.json new file mode 100644 index 0000000000000000000000000000000000000000..aa5e2a8c572b6a5273bb9c89c908b3adff857dfa --- /dev/null +++ b/helm/dbrepo/files/keycloak.json @@ -0,0 +1,2393 @@ +{ + "__inputs": [], + "__requires": [ + { + "type": "panel", + "id": "gauge", + "name": "Gauge", + "version": "" + }, + { + "type": "grafana", + "id": "grafana", + "name": "Grafana", + "version": "7.2.0" + }, + { + "type": "panel", + "id": "grafana-piechart-panel", + "name": "Pie Chart", + "version": "1.6.1" + }, + { + "type": "panel", + "id": "graph", + "name": "Graph", + "version": "" + }, + { + "type": "panel", + "id": "heatmap", + "name": "Heatmap", + "version": "" + }, + { + "type": "datasource", + "id": "prometheus", + "name": "Prometheus", + "version": "1.0.0" + } + ], + "annotations": { + "list": [ + { + "builtIn": 1, + "datasource": "-- Grafana --", + "enable": true, + "hide": true, + "iconColor": "rgba(0, 211, 255, 1)", + "name": "Annotations & Alerts", + "type": "dashboard" + }, + { + "datasource": "-- Grafana --", + "enable": true, + "iconColor": "rgba(0, 211, 255, 1)", + "iconSize": 0, + "lineColor": "", + "name": "Annotations & Alerts", + "query": "", + "showLine": false, + "tags": null, + "tagsField": "", + "textField": "", + "type": "dashboard" + } + ] + }, + "editable": true, + "gnetId": 10441, + "graphTooltip": 1, + "id": null, + "iteration": 1624395370240, + "links": [], + "panels": [ + { + "CustomPanel": { + "cacheTimeout": null, + "datasource": "dbrepometrics0", + "description": "Memory currently being used by Keycloak.", + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "custom": {}, + "mappings": [], + "max": 100, + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "#EAB839", + "value": 80 + }, + { + "color": "red", + "value": 90 + } + ] + }, + "unit": "percent" + }, + "overrides": [] + }, + "gridPos": { + "h": 7, + "w": 6, + "x": 0, + "y": 0 + }, + "hideTimeOverride": false, + "id": 5, + "links": [], + "options": { + "orientation": "auto", + "reduceOptions": { + "calcs": [ + "mean" + ], + "fields": "", + "values": false + }, + "showThresholdLabels": false, + "showThresholdMarkers": true + }, + "pluginVersion": "7.2.0", + "targets": [ + { + "expr": "sum(jvm_memory_bytes_used{area=\"heap\"})*100/sum(jvm_memory_bytes_max{area=\"heap\"})\n", + "format": "time_series", + "hide": false, + "instant": false, + "intervalFactor": 1, + "legendFormat": "", + "refId": "B" + } + ], + "timeFrom": null, + "timeShift": null, + "title": "Current Memory HEAP", + "type": "gauge" + }, + "datasource": { + "default": true, + "type": "prometheus", + "uid": "dbrepometrics0" + }, + "editable": false, + "error": false, + "fieldConfig": { + "defaults": { + "custom": {}, + "mappings": [], + "thresholds": { + "mode": "percentage", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "#EAB839", + "value": 80 + }, + { + "color": "red", + "value": 90 + } + ] + }, + "unit": "percent" + }, + "overrides": [] + }, + "gridPos": { + "h": 7, + "w": 6, + "x": 0, + "y": 0 + }, + "hideTimeOverride": false, + "id": 5, + "isNew": false, + "options": { + "reduceOptions": { + "calcs": [ + "mean" + ], + "fields": "", + "values": false + }, + "showThresholdLabels": false, + "showThresholdMarkers": true + }, + "pluginVersion": "7.2.0", + "span": 0, + "targets": [ + { + "expr": "sum(jvm_memory_bytes_used{area=\"heap\"})*100/sum(jvm_memory_bytes_max{area=\"heap\"})", + "interval": "", + "legendFormat": "", + "refId": "A" + } + ], + "title": "Current Memory HEAP", + "type": "gauge" + }, + { + "CustomPanel": { + "cacheTimeout": null, + "datasource": "dbrepometrics0", + "description": "Memory currently being used by Keycloak.", + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "custom": {}, + "mappings": [], + "max": 100, + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "#EAB839", + "value": 80 + }, + { + "color": "red", + "value": 90 + } + ] + }, + "unit": "percent" + }, + "overrides": [] + }, + "gridPos": { + "h": 7, + "w": 6, + "x": 6, + "y": 0 + }, + "hideTimeOverride": false, + "id": 23, + "links": [], + "options": { + "orientation": "auto", + "reduceOptions": { + "calcs": [ + "mean" + ], + "fields": "", + "values": false + }, + "showThresholdLabels": false, + "showThresholdMarkers": true + }, + "pluginVersion": "7.2.0", + "targets": [ + { + "expr": "sum(jvm_memory_bytes_used{area=\"nonheap\"})*100/sum(jvm_memory_bytes_max{area=\"nonheap\"})", + "format": "time_series", + "hide": false, + "instant": false, + "intervalFactor": 1, + "legendFormat": "", + "refId": "B" + } + ], + "timeFrom": null, + "title": "Current Memory nonHEAP", + "type": "gauge" + }, + "datasource": "dbrepometrics0", + "editable": false, + "error": false, + "fieldConfig": { + "defaults": { + "custom": {}, + "mappings": [], + "thresholds": { + "mode": "percentage", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "#EAB839", + "value": 80 + }, + { + "color": "red", + "value": 90 + } + ] + }, + "unit": "percent" + }, + "overrides": [] + }, + "gridPos": { + "h": 7, + "w": 6, + "x": 6, + "y": 0 + }, + "hideTimeOverride": false, + "id": 23, + "isNew": false, + "options": { + "reduceOptions": { + "calcs": [ + "mean" + ], + "fields": "", + "values": false + }, + "showThresholdLabels": false, + "showThresholdMarkers": true + }, + "pluginVersion": "7.2.0", + "span": 0, + "targets": [ + { + "expr": "sum(jvm_memory_bytes_used{area=\"nonheap\"})*100/sum(jvm_memory_bytes_max{area=\"nonheap\"})", + "interval": "", + "legendFormat": "", + "refId": "A" + } + ], + "title": "Current Memory nonHEAP", + "type": "gauge" + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "dbrepometrics0", + "editable": false, + "error": false, + "fieldConfig": { + "defaults": { + "custom": {} + }, + "overrides": [] + }, + "fill": 2, + "fillGradient": 0, + "gridPos": { + "h": 7, + "w": 12, + "x": 12, + "y": 0 + }, + "hiddenSeries": false, + "hideTimeOverride": false, + "id": 12, + "isNew": false, + "legend": { + "alignAsTable": false, + "avg": false, + "current": false, + "hideEmpty": false, + "hideZero": false, + "max": false, + "min": false, + "rightSide": true, + "show": true, + "sideWidth": 70, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "nullPointMode": "connected", + "options": { + "alertThreshold": true + }, + "percentage": false, + "pluginVersion": "7.2.0", + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "span": 0, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "sum(jvm_memory_bytes_max)", + "format": "time_series", + "interval": "", + "intervalFactor": 1, + "legendFormat": "Max", + "refId": "A" + }, + { + "expr": "sum(jvm_memory_bytes_committed)", + "format": "time_series", + "interval": "", + "intervalFactor": 1, + "legendFormat": "Comitted", + "refId": "C" + }, + { + "expr": "sum(jvm_memory_bytes_used)", + "format": "time_series", + "interval": "", + "intervalFactor": 1, + "legendFormat": "Used", + "refId": "B" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Memory Usage", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "format": "", + "logBase": 0, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "bytes", + "logBase": 1, + "min": 0, + "show": true + }, + { + "format": "short", + "logBase": 1, + "show": false + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "CustomPanel": { + "aliasColors": {}, + "breakPoint": "50%", + "cacheTimeout": null, + "combine": { + "label": "Others", + "threshold": 0 + }, + "datasource": "dbrepometrics0", + "fieldConfig": { + "defaults": { + "custom": {} + }, + "overrides": [] + }, + "fontSize": "80%", + "format": "none", + "gridPos": { + "h": 7, + "w": 6, + "x": 0, + "y": 7 + }, + "hideTimeOverride": true, + "id": 16, + "interval": null, + "legend": { + "percentage": true, + "percentageDecimals": 0, + "show": true, + "values": false + }, + "legendType": "Right side", + "links": [], + "maxDataPoints": 3, + "nullPointMode": "connected", + "pieType": "donut", + "strokeWidth": "", + "targets": [ + { + "expr": "sum(keycloak_logins) by (realm)", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "{{realm}}", + "refId": "B" + } + ], + "timeFrom": null, + "title": "Logins Per REALM", + "type": "grafana-piechart-panel", + "valueName": "current" + }, + "aliasColors": {}, + "breakPoint": "50%", + "cacheTimeout": null, + "combine": { + "label": "Others", + "threshold": 0 + }, + "datasource": "dbrepometrics0", + "editable": false, + "error": false, + "fieldConfig": { + "defaults": { + "custom": {} + }, + "overrides": [] + }, + "fontSize": "80%", + "format": "short", + "gridPos": { + "h": 7, + "w": 6, + "x": 0, + "y": 7 + }, + "hideTimeOverride": true, + "id": 16, + "interval": null, + "isNew": false, + "legend": { + "percentage": true, + "show": true, + "values": false + }, + "legendType": "Right side", + "links": [], + "nullPointMode": "connected", + "pieType": "pie", + "span": 0, + "strokeWidth": 1, + "targets": [ + { + "expr": "sum by (realm)(increase(keycloak_logins[24h]))", + "interval": "", + "legendFormat": "{{realm}}", + "refId": "A" + } + ], + "title": "Logins Per REALM for past 24h", + "type": "grafana-piechart-panel", + "valueName": "current" + }, + { + "aliasColors": {}, + "breakPoint": "50%", + "cacheTimeout": null, + "combine": { + "label": "Others", + "threshold": 0 + }, + "datasource": "dbrepometrics0", + "fieldConfig": { + "defaults": { + "custom": {} + }, + "overrides": [] + }, + "fontSize": "80%", + "format": "short", + "gridPos": { + "h": 7, + "w": 6, + "x": 6, + "y": 7 + }, + "id": 44, + "interval": null, + "legend": { + "percentage": true, + "show": true, + "values": false + }, + "legendType": "Right side", + "links": [], + "nullPointMode": "connected", + "pieType": "pie", + "pluginVersion": "7.2.0", + "strokeWidth": 1, + "targets": [ + { + "expr": "sum by (realm)(increase(keycloak_registrations[24h]))", + "interval": "", + "legendFormat": "{{realm}}", + "refId": "A" + } + ], + "timeFrom": null, + "timeShift": null, + "title": "Registrations Per REALM for past 24h", + "type": "grafana-piechart-panel", + "valueName": "current" + }, + { + "CustomPanel": { + "aliasColors": {}, + "breakPoint": "50%", + "cacheTimeout": null, + "combine": { + "label": "Others", + "threshold": 0 + }, + "datasource": "dbrepometrics0", + "fieldConfig": { + "defaults": { + "custom": {} + }, + "overrides": [] + }, + "fontSize": "80%", + "format": "none", + "gridPos": { + "h": 7, + "w": 12, + "x": 6, + "y": 7 + }, + "hideTimeOverride": true, + "id": 20, + "interval": null, + "legend": { + "percentage": true, + "percentageDecimals": 0, + "show": true, + "values": false + }, + "legendType": "Right side", + "links": [], + "maxDataPoints": 3, + "nullPointMode": "connected", + "pieType": "donut", + "strokeWidth": "", + "targets": [ + { + "expr": "sum(keycloak_logins) by (client_id)", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "{{client_id}}", + "refId": "B" + } + ], + "timeFrom": null, + "title": "Logins Per CLIENT", + "type": "grafana-piechart-panel", + "valueName": "current" + }, + "aliasColors": {}, + "breakPoint": "50%", + "cacheTimeout": null, + "combine": { + "label": "Others", + "threshold": 0 + }, + "datasource": "dbrepometrics0", + "editable": false, + "error": false, + "fieldConfig": { + "defaults": { + "custom": {} + }, + "overrides": [] + }, + "fontSize": "80%", + "format": "short", + "gridPos": { + "h": 7, + "w": 6, + "x": 12, + "y": 7 + }, + "hideTimeOverride": true, + "id": 20, + "interval": null, + "isNew": false, + "legend": { + "percentage": true, + "show": true, + "values": false + }, + "legendType": "Right side", + "links": [], + "nullPointMode": "connected", + "pieType": "pie", + "span": 0, + "strokeWidth": 1, + "targets": [ + { + "expr": "sum by (client_id)(increase(keycloak_logins[24h]))", + "interval": "", + "legendFormat": "{{client_id}}", + "refId": "A" + } + ], + "title": "Logins Per CLIENT for past 24h", + "type": "grafana-piechart-panel", + "valueName": "current" + }, + { + "CustomPanel": { + "aliasColors": {}, + "breakPoint": "50%", + "cacheTimeout": null, + "combine": { + "label": "Others", + "threshold": 0 + }, + "datasource": "dbrepometrics0", + "fieldConfig": { + "defaults": { + "custom": {} + }, + "overrides": [] + }, + "fontSize": "80%", + "format": "none", + "gridPos": { + "h": 7, + "w": 6, + "x": 18, + "y": 7 + }, + "hideTimeOverride": true, + "id": 17, + "interval": null, + "legend": { + "percentage": true, + "percentageDecimals": 0, + "show": true, + "values": false + }, + "legendType": "Under graph", + "links": [], + "maxDataPoints": 3, + "nullPointMode": "connected", + "pieType": "donut", + "strokeWidth": "", + "targets": [ + { + "expr": "sum(keycloak_registrations) by (client_id)", + "format": "time_series", + "hide": false, + "instant": false, + "intervalFactor": 1, + "legendFormat": "{{client_id}}", + "refId": "A" + } + ], + "timeFrom": null, + "title": "Registrations Per CLIENT", + "type": "grafana-piechart-panel", + "valueName": "current" + }, + "aliasColors": {}, + "breakPoint": "50%", + "cacheTimeout": null, + "combine": { + "label": "Others", + "threshold": 0 + }, + "datasource": "dbrepometrics0", + "editable": false, + "error": false, + "fieldConfig": { + "defaults": { + "custom": {} + }, + "overrides": [] + }, + "fontSize": "80%", + "format": "short", + "gridPos": { + "h": 7, + "w": 6, + "x": 18, + "y": 7 + }, + "hideTimeOverride": true, + "id": 17, + "interval": null, + "isNew": false, + "legend": { + "percentage": true, + "show": true, + "values": false + }, + "legendType": "Right side", + "links": [], + "nullPointMode": "connected", + "pieType": "pie", + "span": 0, + "strokeWidth": 1, + "targets": [ + { + "expr": "sum by (client_id)(increase(keycloak_registrations[24h]))", + "interval": "", + "legendFormat": "{{client_id}}", + "refId": "A" + } + ], + "title": "Registrations Per CLIENT for past 24h", + "type": "grafana-piechart-panel", + "valueName": "current" + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "dbrepometrics0", + "fieldConfig": { + "defaults": { + "custom": {} + }, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 8, + "w": 12, + "x": 6, + "y": 14 + }, + "hiddenSeries": false, + "id": 46, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "nullPointMode": "null", + "options": { + "alertThreshold": true + }, + "percentage": false, + "pluginVersion": "7.2.0", + "pointradius": 2, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "sum by (code)(increase(keycloak_response_errors_total[30m]))", + "interval": "", + "legendFormat": "{{code}}", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "4xx and 5xx Responses", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "$$hashKey": "object:98", + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "$$hashKey": "object:99", + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "dbrepometrics0", + "editable": false, + "error": false, + "fieldConfig": { + "defaults": { + "custom": {} + }, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 22 + }, + "hiddenSeries": false, + "hideTimeOverride": false, + "id": 1, + "isNew": false, + "legend": { + "alignAsTable": true, + "avg": false, + "current": false, + "hideEmpty": false, + "hideZero": false, + "max": false, + "min": false, + "rightSide": true, + "show": true, + "sideWidth": 100, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "nullPointMode": "connected", + "options": { + "alertThreshold": true + }, + "percentage": false, + "pluginVersion": "7.2.0", + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "span": 0, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "sum by (realm)(increase(keycloak_logins[30m]))", + "format": "time_series", + "interval": "", + "intervalFactor": 1, + "legendFormat": "{{realm}}", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Logins per REALM", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "format": "", + "logBase": 0, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "$$hashKey": "object:160", + "format": "none", + "logBase": 1, + "min": 0, + "show": true + }, + { + "$$hashKey": "object:161", + "format": "short", + "logBase": 1, + "show": false + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "dbrepometrics0", + "editable": false, + "error": false, + "fieldConfig": { + "defaults": { + "custom": {} + }, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 22 + }, + "hiddenSeries": false, + "hideTimeOverride": false, + "id": 7, + "isNew": false, + "legend": { + "alignAsTable": true, + "avg": false, + "current": true, + "hideEmpty": false, + "hideZero": true, + "max": false, + "min": false, + "rightSide": true, + "show": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "nullPointMode": "connected", + "options": { + "alertThreshold": true + }, + "percentage": false, + "pluginVersion": "7.2.0", + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "span": 0, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "sum by (error) (increase(keycloak_failed_login_attempts{provider=\"keycloak\",realm=\"dbrepo\"}[30m]))", + "format": "time_series", + "interval": "", + "intervalFactor": 1, + "legendFormat": "{{dbrepo }} {{error}}", + "refId": "A" + }, + { + "expr": "sum by (realm) (increase(keycloak_failed_login_attempts{provider=\"keycloak\",realm=\"dialog-test\"} [30m]))", + "interval": "", + "legendFormat": "{{sum by dbrepo}}", + "refId": "B" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Login Errors on realm dbrepo", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "format": "", + "logBase": 0, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "none", + "logBase": 1, + "min": 0, + "show": true + }, + { + "format": "short", + "logBase": 1, + "show": false + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "dbrepometrics0", + "editable": false, + "error": false, + "fieldConfig": { + "defaults": { + "custom": {} + }, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 30 + }, + "hiddenSeries": false, + "hideTimeOverride": false, + "id": 18, + "isNew": false, + "legend": { + "alignAsTable": true, + "avg": false, + "current": false, + "hideEmpty": false, + "hideZero": false, + "max": false, + "min": false, + "rightSide": true, + "show": true, + "sideWidth": 100, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "nullPointMode": "connected", + "options": { + "alertThreshold": true + }, + "percentage": false, + "pluginVersion": "7.2.0", + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "span": 0, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "sum by (client_id)(increase(keycloak_logins{realm=\"dbrepo\",provider=\"keycloak\"}[30m]))", + "format": "time_series", + "interval": "", + "intervalFactor": 2, + "legendFormat": "{{client_id}}", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Logins per CLIENT on realm dbrepo", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "format": "", + "logBase": 0, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "none", + "logBase": 1, + "min": 0, + "show": true + }, + { + "format": "short", + "logBase": 1, + "show": false + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "dbrepometrics0", + "editable": false, + "error": false, + "fieldConfig": { + "defaults": { + "custom": {} + }, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 30 + }, + "hiddenSeries": false, + "hideTimeOverride": false, + "id": 21, + "isNew": false, + "legend": { + "alignAsTable": true, + "avg": false, + "current": false, + "hideEmpty": false, + "hideZero": false, + "max": false, + "min": false, + "rightSide": true, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "nullPointMode": "null", + "options": { + "alertThreshold": false + }, + "percentage": false, + "pluginVersion": "7.2.0", + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "span": 0, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "sum by (realm) (increase(keycloak_registrations_errors{provider=\"keycloak\",realm=\"dbrepo\"} [30m]))", + "format": "time_series", + "interval": "", + "intervalFactor": 2, + "legendFormat": "Sum by {{realm}}", + "refId": "A" + }, + { + "expr": "sum by (error) (increase(keycloak_registrations_errors{provider=\"keycloak\",realm=\"dbrepo\"} [30m]))", + "interval": "", + "legendFormat": "{{error}}", + "refId": "B" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Registration Errors on realm dbrepo", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "format": "", + "logBase": 0, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "logBase": 1, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "dbrepometrics0", + "editable": false, + "error": false, + "fieldConfig": { + "defaults": { + "custom": {} + }, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 38 + }, + "hiddenSeries": false, + "hideTimeOverride": false, + "id": 33, + "isNew": false, + "legend": { + "alignAsTable": true, + "avg": false, + "current": false, + "hideEmpty": false, + "hideZero": false, + "max": false, + "min": false, + "rightSide": true, + "show": true, + "sideWidth": 100, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "nullPointMode": "null", + "options": { + "alertThreshold": false + }, + "percentage": false, + "pluginVersion": "7.2.0", + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "span": 0, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "sum by (realm)(increase(keycloak_registrations[30m]))", + "format": "time_series", + "interval": "", + "intervalFactor": 1, + "legendFormat": "{{realm}}", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Registrations per REALM", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "format": "", + "logBase": 0, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "short", + "label": "", + "logBase": 1, + "min": 0, + "show": true + }, + { + "format": "short", + "logBase": 1, + "show": false + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "dbrepometrics0", + "editable": false, + "error": false, + "fieldConfig": { + "defaults": { + "custom": {} + }, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 38 + }, + "hiddenSeries": false, + "hideTimeOverride": false, + "id": 19, + "isNew": false, + "legend": { + "alignAsTable": true, + "avg": false, + "current": true, + "hideEmpty": false, + "hideZero": false, + "max": false, + "min": false, + "rightSide": true, + "show": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "nullPointMode": "connected", + "options": { + "alertThreshold": true + }, + "percentage": false, + "pluginVersion": "7.2.0", + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "span": 0, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "sum by (error) (increase(keycloak_failed_login_attempts{provider=\"keycloak\",realm=\"dbrepo\",client_id=\"dbrepo-client\"}[30m]))", + "format": "time_series", + "interval": "", + "intervalFactor": 2, + "legendFormat": "{{error}}", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Login Errors for dbrepo-client", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "format": "", + "logBase": 0, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "none", + "logBase": 1, + "min": 0, + "show": true + }, + { + "format": "short", + "logBase": 1, + "show": false + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "dbrepometrics0", + "editable": false, + "error": false, + "fieldConfig": { + "defaults": { + "custom": {} + }, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 46 + }, + "hiddenSeries": false, + "hideTimeOverride": false, + "id": 22, + "isNew": false, + "legend": { + "alignAsTable": true, + "avg": false, + "current": false, + "hideEmpty": false, + "hideZero": false, + "max": false, + "min": false, + "rightSide": true, + "show": true, + "sideWidth": 100, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "nullPointMode": "connected", + "options": { + "alertThreshold": true + }, + "percentage": false, + "pluginVersion": "7.2.0", + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "span": 0, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "sum by (client_id)(increase(keycloak_registrations{realm=\"dbrepo\",provider=\"keycloak\"}[30m]))", + "format": "time_series", + "interval": "", + "intervalFactor": 2, + "legendFormat": "{{client_id}}", + "refId": "A" + }, + { + "expr": "sum by (realm)(increase(keycloak_registrations{provider=\"keycloak\",realm=\"dbrepo\"} [30m]))", + "interval": "", + "legendFormat": "Sum by {{realm}}", + "refId": "B" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Registrations per CLIENT on relm dbrepo", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "format": "", + "logBase": 0, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "none", + "logBase": 1, + "min": 0, + "show": true + }, + { + "format": "short", + "logBase": 1, + "show": false + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "dbrepometrics0", + "editable": false, + "error": false, + "fieldConfig": { + "defaults": { + "custom": {} + }, + "overrides": [] + }, + "fill": 1, + "fillGradient": 0, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 46 + }, + "hiddenSeries": false, + "hideTimeOverride": false, + "id": 34, + "isNew": false, + "legend": { + "alignAsTable": true, + "avg": false, + "current": true, + "hideEmpty": false, + "hideZero": false, + "max": false, + "min": false, + "rightSide": true, + "show": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "nullPointMode": "connected", + "options": { + "alertThreshold": true + }, + "percentage": false, + "pluginVersion": "7.2.0", + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "span": 0, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "sum by (error) (increase(keycloak_registrations_errors{provider=\"keycloak\",realm=\"dbrepo\",client_id=\"dbrepo-client\"}[30m]))", + "format": "time_series", + "interval": "", + "intervalFactor": 2, + "legendFormat": "{{error}}", + "refId": "A" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Registration Errors for dbrepo-client", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "format": "", + "logBase": 0, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "none", + "logBase": 1, + "min": 0, + "show": true + }, + { + "format": "short", + "logBase": 1, + "show": false + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, + { + "cards": { + "cardPadding": null, + "cardRound": null + }, + "color": { + "cardColor": "#73BF69", + "colorScale": "sqrt", + "colorScheme": "interpolateGreens", + "exponent": 0.4, + "min": null, + "mode": "opacity" + }, + "dataFormat": "tsbuckets", + "datasource": "dbrepometrics0", + "description": "", + "fieldConfig": { + "defaults": { + "custom": {} + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 54 + }, + "heatmap": {}, + "hideTimeOverride": false, + "hideZeroBuckets": true, + "highlightCards": true, + "id": 35, + "legend": { + "show": true + }, + "pluginVersion": "7.2.0", + "reverseYBuckets": false, + "targets": [ + { + "expr": "sum(increase(keycloak_request_duration_bucket{method=\"GET\"}[30m])) by (le)", + "format": "heatmap", + "interval": "", + "intervalFactor": 4, + "legendFormat": "{{ le }}", + "refId": "A" + } + ], + "timeFrom": null, + "timeShift": null, + "title": "Request duration method = \"GET\" Heatmap", + "tooltip": { + "show": true, + "showHistogram": false + }, + "type": "heatmap", + "xAxis": { + "show": true + }, + "xBucketNumber": null, + "xBucketSize": null, + "yAxis": { + "decimals": null, + "format": "ms", + "logBase": 1, + "max": null, + "min": null, + "show": true, + "splitFactor": null + }, + "yBucketBound": "auto", + "yBucketNumber": null, + "yBucketSize": null + }, + { + "datasource": "dbrepometrics0", + "description": "", + "fieldConfig": { + "defaults": { + "custom": {}, + "mappings": [], + "thresholds": { + "mode": "percentage", + "steps": [ + { + "color": "red", + "value": null + }, + { + "color": "red", + "value": 80 + }, + { + "color": "#EAB839", + "value": 90 + }, + { + "color": "green", + "value": 98 + } + ] + }, + "unit": "percent" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 54 + }, + "hideTimeOverride": false, + "id": 39, + "options": { + "reduceOptions": { + "calcs": [ + "mean" + ], + "fields": "", + "values": false + }, + "showThresholdLabels": false, + "showThresholdMarkers": true + }, + "pluginVersion": "7.2.0", + "targets": [ + { + "expr": "sum(rate(keycloak_request_duration_bucket{method=\"GET\", le=\"100.0\"}[30m])) / sum(rate(keycloak_request_duration_count{method=\"GET\"}[30m])) * 100", + "format": "time_series", + "interval": "", + "intervalFactor": 2, + "legendFormat": "", + "refId": "A" + } + ], + "timeFrom": null, + "timeShift": null, + "title": "Percentage of requests \"GET\" method was served in 100ms or below", + "type": "gauge" + }, + { + "cards": { + "cardPadding": null, + "cardRound": null + }, + "color": { + "cardColor": "#73BF69", + "colorScale": "sqrt", + "colorScheme": "interpolateGreens", + "exponent": 0.4, + "min": null, + "mode": "opacity" + }, + "dataFormat": "tsbuckets", + "datasource": "dbrepometrics0", + "description": "", + "fieldConfig": { + "defaults": { + "custom": {} + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 62 + }, + "heatmap": {}, + "hideTimeOverride": false, + "hideZeroBuckets": true, + "highlightCards": true, + "id": 36, + "legend": { + "show": true + }, + "pluginVersion": "7.2.0", + "reverseYBuckets": false, + "targets": [ + { + "expr": "sum(increase(keycloak_request_duration_bucket{method=\"POST\"}[30m])) by (le)", + "format": "heatmap", + "interval": "", + "intervalFactor": 4, + "legendFormat": "{{ le }}", + "refId": "A" + } + ], + "timeFrom": null, + "timeShift": null, + "title": "Request duration method = \"POST\" Heatmap", + "tooltip": { + "show": true, + "showHistogram": false + }, + "type": "heatmap", + "xAxis": { + "show": true + }, + "xBucketNumber": null, + "xBucketSize": null, + "yAxis": { + "decimals": null, + "format": "ms", + "logBase": 1, + "max": null, + "min": null, + "show": true, + "splitFactor": null + }, + "yBucketBound": "auto", + "yBucketNumber": null, + "yBucketSize": null + }, + { + "datasource": "dbrepometrics0", + "description": "", + "fieldConfig": { + "defaults": { + "custom": {}, + "mappings": [], + "thresholds": { + "mode": "percentage", + "steps": [ + { + "color": "red", + "value": null + }, + { + "color": "red", + "value": 80 + }, + { + "color": "#EAB839", + "value": 90 + }, + { + "color": "green", + "value": 98 + } + ] + }, + "unit": "percent" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 62 + }, + "hideTimeOverride": false, + "id": 40, + "options": { + "reduceOptions": { + "calcs": [ + "mean" + ], + "fields": "", + "values": false + }, + "showThresholdLabels": false, + "showThresholdMarkers": true + }, + "pluginVersion": "7.2.0", + "targets": [ + { + "expr": "sum(rate(keycloak_request_duration_bucket{method=\"POST\", le=\"100.0\"}[30m])) / sum(rate(keycloak_request_duration_count{method=\"POST\"}[30m])) * 100", + "format": "time_series", + "interval": "", + "intervalFactor": 2, + "legendFormat": "", + "refId": "A" + } + ], + "timeFrom": null, + "timeShift": null, + "title": "Percentage of requests \"POST\" method was served in 100ms or below", + "type": "gauge" + }, + { + "cards": { + "cardPadding": null, + "cardRound": null + }, + "color": { + "cardColor": "#73BF69", + "colorScale": "sqrt", + "colorScheme": "interpolateGreens", + "exponent": 0.4, + "min": null, + "mode": "opacity" + }, + "dataFormat": "tsbuckets", + "datasource": "dbrepometrics0", + "description": "", + "fieldConfig": { + "defaults": { + "custom": {} + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 70 + }, + "heatmap": {}, + "hideTimeOverride": false, + "hideZeroBuckets": true, + "highlightCards": true, + "id": 37, + "legend": { + "show": true + }, + "pluginVersion": "7.2.0", + "reverseYBuckets": false, + "targets": [ + { + "expr": "sum(increase(keycloak_request_duration_bucket{method=\"HEAD\"}[30m])) by (le)", + "format": "heatmap", + "interval": "", + "intervalFactor": 4, + "legendFormat": "{{ le }}", + "refId": "A" + } + ], + "timeFrom": null, + "timeShift": null, + "title": "Request duration method = \"HEAD\" Heatmap", + "tooltip": { + "show": true, + "showHistogram": false + }, + "type": "heatmap", + "xAxis": { + "show": true + }, + "xBucketNumber": null, + "xBucketSize": null, + "yAxis": { + "decimals": null, + "format": "ms", + "logBase": 1, + "max": null, + "min": null, + "show": true, + "splitFactor": null + }, + "yBucketBound": "auto", + "yBucketNumber": null, + "yBucketSize": null + }, + { + "datasource": "dbrepometrics0", + "description": "", + "fieldConfig": { + "defaults": { + "custom": {}, + "mappings": [], + "thresholds": { + "mode": "percentage", + "steps": [ + { + "color": "red", + "value": null + }, + { + "color": "red", + "value": 80 + }, + { + "color": "#EAB839", + "value": 90 + }, + { + "color": "green", + "value": 98 + } + ] + }, + "unit": "percent" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 70 + }, + "hideTimeOverride": false, + "id": 41, + "options": { + "reduceOptions": { + "calcs": [ + "mean" + ], + "fields": "", + "values": false + }, + "showThresholdLabels": false, + "showThresholdMarkers": true + }, + "pluginVersion": "7.2.0", + "targets": [ + { + "expr": "sum(rate(keycloak_request_duration_bucket{method=\"HEAD\", le=\"100.0\"}[30m])) / sum(rate(keycloak_request_duration_count{method=\"HEAD\"}[30m])) * 100", + "format": "time_series", + "interval": "", + "intervalFactor": 2, + "legendFormat": "", + "refId": "A" + } + ], + "timeFrom": null, + "timeShift": null, + "title": "Percentage of requests \"HEAD\" method was served in 100ms or below", + "type": "gauge" + }, + { + "cards": { + "cardPadding": null, + "cardRound": null + }, + "color": { + "cardColor": "#73BF69", + "colorScale": "sqrt", + "colorScheme": "interpolateGreens", + "exponent": 0.4, + "min": null, + "mode": "opacity" + }, + "dataFormat": "tsbuckets", + "datasource": "dbrepometrics0", + "description": "", + "fieldConfig": { + "defaults": { + "custom": {} + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 78 + }, + "heatmap": {}, + "hideTimeOverride": false, + "hideZeroBuckets": true, + "highlightCards": true, + "id": 38, + "legend": { + "show": true + }, + "pluginVersion": "7.2.0", + "reverseYBuckets": false, + "targets": [ + { + "expr": "sum(increase(keycloak_request_duration_bucket{method=\"PUT\"}[30m])) by (le)", + "format": "heatmap", + "interval": "", + "intervalFactor": 4, + "legendFormat": "{{ le }}", + "refId": "A" + } + ], + "timeFrom": null, + "timeShift": null, + "title": "Request duration method = \"PUT\" Heatmap", + "tooltip": { + "show": true, + "showHistogram": false + }, + "type": "heatmap", + "xAxis": { + "show": true + }, + "xBucketNumber": null, + "xBucketSize": null, + "yAxis": { + "decimals": null, + "format": "ms", + "logBase": 1, + "max": null, + "min": null, + "show": true, + "splitFactor": null + }, + "yBucketBound": "auto", + "yBucketNumber": null, + "yBucketSize": null + }, + { + "datasource": "dbrepometrics0", + "description": "", + "fieldConfig": { + "defaults": { + "custom": {}, + "mappings": [], + "thresholds": { + "mode": "percentage", + "steps": [ + { + "color": "red", + "value": null + }, + { + "color": "red", + "value": 80 + }, + { + "color": "#EAB839", + "value": 90 + }, + { + "color": "green", + "value": 98 + } + ] + }, + "unit": "percent" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 78 + }, + "hideTimeOverride": false, + "id": 42, + "options": { + "reduceOptions": { + "calcs": [ + "mean" + ], + "fields": "", + "values": false + }, + "showThresholdLabels": false, + "showThresholdMarkers": true + }, + "pluginVersion": "7.2.0", + "targets": [ + { + "expr": "sum(rate(keycloak_request_duration_bucket{method=\"PUT\", le=\"100.0\"}[30m])) / sum(rate(keycloak_request_duration_count{method=\"PUT\"}[30m])) * 100", + "format": "time_series", + "interval": "", + "intervalFactor": 2, + "legendFormat": "", + "refId": "A" + } + ], + "timeFrom": null, + "timeShift": null, + "title": "Percentage of requests \"PUT\" method was served in 100ms or below", + "type": "gauge" + } + ], + "refresh": "5m", + "schemaVersion": 26, + "style": "dark", + "tags": ["provisioned", "auth"], + "templating": { + "list": [ + { + "datasource": "prometheus", + "filters": [], + "hide": 0, + "label": "", + "name": "Filters", + "skipUrlSync": false, + "type": "adhoc" + } + ] + }, + "time": { + "from": "now-3h", + "to": "now" + }, + "timepicker": { + "refresh_intervals": [ + "5s", + "10s", + "30s", + "1m", + "5m", + "15m", + "30m", + "1h", + "2h", + "1d" + ], + "time_options": [ + "5m", + "15m", + "1h", + "6h", + "12h", + "24h", + "2d", + "7d", + "30d" + ] + }, + "timezone": "", + "title": "Keycloak - Overview", + "uid": "keycloak-dashboard", + "version": 6, + "description": "Dashboard of Keycloak metrics exported with Keycloak Metrics SPI\r\n\r\nhttps://github.com/aerogear/keycloak-metrics-spi" +} \ No newline at end of file diff --git a/helm/dbrepo/files/logging.json b/helm/dbrepo/files/logging.json new file mode 100644 index 0000000000000000000000000000000000000000..cafc736261bc902ef9477556e4cafadfba72a1c3 --- /dev/null +++ b/helm/dbrepo/files/logging.json @@ -0,0 +1,904 @@ +{ + "annotations": { + "list": [ + { + "builtIn": 1, + "datasource": { + "type": "grafana", + "uid": "-- Grafana --" + }, + "enable": true, + "hide": true, + "iconColor": "rgba(0, 211, 255, 1)", + "name": "Annotations & Alerts", + "type": "dashboard" + } + ] + }, + "editable": true, + "fiscalYearStartMonth": 0, + "graphTooltip": 1, + "id": 30, + "links": [], + "panels": [ + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 0 + }, + "id": 24, + "panels": [], + "repeat": "service", + "title": "$service", + "type": "row" + }, + { + "datasource": { + "type": "grafana-opensearch-datasource", + "uid": "dbrepoopensearch0" + }, + "fieldConfig": { + "defaults": { + "color": { + "fixedColor": "orange", + "mode": "fixed" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "bars", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "smooth", + "lineStyle": { + "fill": "solid" + }, + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "orange", + "value": null + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 4, + "w": 12, + "x": 0, + "y": 1 + }, + "id": 25, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": false + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "pluginVersion": "11.3.1", + "targets": [ + { + "alias": "WARN", + "bucketAggs": [ + { + "id": "2", + "settings": { + "interval": "auto", + "min_doc_count": "0", + "trimEdges": "0" + }, + "type": "date_histogram" + } + ], + "datasource": { + "type": "grafana-opensearch-datasource", + "uid": "dbrepoopensearch0" + }, + "format": "table", + "hide": false, + "luceneQueryType": "Logs", + "metrics": [ + { + "id": "1", + "type": "logs" + } + ], + "query": "log_level: WARN AND service_name: \"$service\"", + "queryType": "lucene", + "refId": "warn", + "timeField": "@timestamp" + } + ], + "title": "Warnings over time", + "type": "timeseries" + }, + { + "datasource": { + "type": "grafana-opensearch-datasource", + "uid": "dbrepoopensearch0" + }, + "fieldConfig": { + "defaults": { + "color": { + "fixedColor": "red", + "mode": "fixed" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "bars", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "smooth", + "lineStyle": { + "fill": "solid" + }, + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "red", + "value": null + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 4, + "w": 12, + "x": 12, + "y": 1 + }, + "id": 28, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": false + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "pluginVersion": "11.3.1", + "targets": [ + { + "alias": "ERROR", + "bucketAggs": [ + { + "id": "2", + "settings": { + "interval": "auto", + "min_doc_count": "0", + "trimEdges": "0" + }, + "type": "date_histogram" + } + ], + "datasource": { + "type": "grafana-opensearch-datasource", + "uid": "dbrepoopensearch0" + }, + "format": "table", + "hide": false, + "luceneQueryType": "Metric", + "metrics": [ + { + "hide": false, + "id": "1", + "type": "count" + } + ], + "query": "log_level: ERROR AND service_name: \"$service\"", + "queryType": "lucene", + "refId": "warn", + "timeField": "@timestamp" + } + ], + "title": "Errors over time", + "type": "timeseries" + }, + { + "datasource": { + "type": "grafana-opensearch-datasource", + "uid": "dbrepoopensearch0" + }, + "description": "", + "fieldConfig": { + "defaults": {}, + "overrides": [] + }, + "gridPos": { + "h": 10, + "w": 12, + "x": 0, + "y": 5 + }, + "id": 9, + "options": { + "dedupStrategy": "none", + "enableInfiniteScrolling": false, + "enableLogDetails": true, + "prettifyLogMessage": false, + "showCommonLabels": false, + "showLabels": false, + "showTime": true, + "sortOrder": "Descending", + "wrapLogMessage": false + }, + "pluginVersion": "11.3.1", + "targets": [ + { + "alias": "", + "bucketAggs": [ + { + "field": "@timestamp", + "id": "2", + "settings": { + "interval": "auto" + }, + "type": "date_histogram" + } + ], + "datasource": { + "type": "grafana-opensearch-datasource", + "uid": "dbrepoopensearch0" + }, + "format": "table", + "hide": false, + "luceneQueryType": "Logs", + "metrics": [ + { + "id": "1", + "type": "logs" + } + ], + "query": "log_level: WARN AND service_name: \"$service\"", + "queryType": "lucene", + "refId": "A", + "timeField": "@timestamp" + } + ], + "title": "Warnings", + "transformations": [ + { + "id": "filterFieldsByName", + "options": { + "include": { + "names": [ + "@timestamp", + "message", + "log_logger", + "process_pid", + "process_thread_name", + "service_name", + "service_version", + "log_level" + ] + } + } + } + ], + "type": "logs" + }, + { + "datasource": { + "type": "grafana-opensearch-datasource", + "uid": "dbrepoopensearch0" + }, + "description": "", + "fieldConfig": { + "defaults": {}, + "overrides": [] + }, + "gridPos": { + "h": 10, + "w": 12, + "x": 12, + "y": 5 + }, + "id": 29, + "options": { + "dedupStrategy": "none", + "enableInfiniteScrolling": false, + "enableLogDetails": true, + "prettifyLogMessage": false, + "showCommonLabels": false, + "showLabels": false, + "showTime": true, + "sortOrder": "Descending", + "wrapLogMessage": false + }, + "pluginVersion": "11.3.1", + "targets": [ + { + "alias": "", + "bucketAggs": [ + { + "field": "@timestamp", + "id": "2", + "settings": { + "interval": "auto" + }, + "type": "date_histogram" + } + ], + "datasource": { + "type": "grafana-opensearch-datasource", + "uid": "dbrepoopensearch0" + }, + "format": "table", + "hide": false, + "luceneQueryType": "Logs", + "metrics": [ + { + "id": "1", + "type": "logs" + } + ], + "query": "log_level: ERROR AND service_name: \"$service\"", + "queryType": "lucene", + "refId": "A", + "timeField": "@timestamp" + } + ], + "title": "Errors", + "transformations": [ + { + "id": "filterFieldsByName", + "options": { + "include": { + "names": [ + "@timestamp", + "message", + "log_logger", + "process_pid", + "process_thread_name", + "service_name", + "service_version", + "log_level" + ] + } + } + } + ], + "type": "logs" + }, + { + "datasource": { + "type": "grafana-opensearch-datasource", + "uid": "dbrepoopensearch0" + }, + "fieldConfig": { + "defaults": { + "color": { + "fixedColor": "#ffffff", + "mode": "fixed" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "bars", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "smooth", + "lineStyle": { + "fill": "solid" + }, + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "#ffffff", + "value": null + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 4, + "w": 12, + "x": 0, + "y": 15 + }, + "id": 30, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": false + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "pluginVersion": "11.3.1", + "targets": [ + { + "alias": "DEBUG", + "bucketAggs": [ + { + "id": "2", + "settings": { + "interval": "auto", + "min_doc_count": "0", + "trimEdges": "0" + }, + "type": "date_histogram" + } + ], + "datasource": { + "type": "grafana-opensearch-datasource", + "uid": "dbrepoopensearch0" + }, + "format": "table", + "hide": false, + "luceneQueryType": "Metric", + "metrics": [ + { + "hide": false, + "id": "1", + "type": "count" + } + ], + "query": "log_level: DEBUG AND service_name: \"$service\"", + "queryType": "lucene", + "refId": "warn", + "timeField": "@timestamp" + } + ], + "title": "Debugs over time", + "type": "timeseries" + }, + { + "datasource": { + "type": "grafana-opensearch-datasource", + "uid": "dbrepoopensearch0" + }, + "fieldConfig": { + "defaults": { + "color": { + "fixedColor": "blue", + "mode": "fixed" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "barWidthFactor": 0.6, + "drawStyle": "bars", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "smooth", + "lineStyle": { + "fill": "solid" + }, + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "blue", + "value": null + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 4, + "w": 12, + "x": 12, + "y": 15 + }, + "id": 21, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": false + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "pluginVersion": "11.3.1", + "targets": [ + { + "alias": "INFO", + "bucketAggs": [ + { + "id": "2", + "settings": { + "interval": "auto", + "min_doc_count": "0", + "trimEdges": "0" + }, + "type": "date_histogram" + } + ], + "datasource": { + "type": "grafana-opensearch-datasource", + "uid": "dbrepoopensearch0" + }, + "format": "table", + "hide": false, + "luceneQueryType": "Metric", + "metrics": [ + { + "hide": false, + "id": "1", + "type": "count" + } + ], + "query": "log_level: INFO AND service_name: \"$service\"", + "queryType": "lucene", + "refId": "warn", + "timeField": "@timestamp" + } + ], + "title": "Infos over time", + "type": "timeseries" + }, + { + "datasource": { + "type": "grafana-opensearch-datasource", + "uid": "dbrepoopensearch0" + }, + "description": "", + "fieldConfig": { + "defaults": {}, + "overrides": [] + }, + "gridPos": { + "h": 10, + "w": 12, + "x": 0, + "y": 19 + }, + "id": 23, + "options": { + "dedupStrategy": "none", + "enableInfiniteScrolling": false, + "enableLogDetails": true, + "prettifyLogMessage": false, + "showCommonLabels": false, + "showLabels": false, + "showTime": true, + "sortOrder": "Descending", + "wrapLogMessage": false + }, + "pluginVersion": "11.3.1", + "targets": [ + { + "alias": "", + "bucketAggs": [ + { + "field": "@timestamp", + "id": "2", + "settings": { + "interval": "auto" + }, + "type": "date_histogram" + } + ], + "datasource": { + "type": "grafana-opensearch-datasource", + "uid": "dbrepoopensearch0" + }, + "format": "table", + "hide": false, + "luceneQueryType": "Logs", + "metrics": [ + { + "id": "1", + "type": "logs" + } + ], + "query": "log_level: DEBUG AND service_name: $service", + "queryType": "lucene", + "refId": "A", + "timeField": "@timestamp" + } + ], + "title": "Debugs", + "transformations": [ + { + "id": "filterFieldsByName", + "options": { + "include": { + "names": [ + "@timestamp", + "message", + "log_logger", + "process_pid", + "process_thread_name", + "service_name", + "service_version", + "log_level" + ] + } + } + } + ], + "type": "logs" + }, + { + "datasource": { + "type": "grafana-opensearch-datasource", + "uid": "dbrepoopensearch0" + }, + "description": "", + "fieldConfig": { + "defaults": {}, + "overrides": [] + }, + "gridPos": { + "h": 10, + "w": 12, + "x": 12, + "y": 19 + }, + "id": 19, + "options": { + "dedupStrategy": "none", + "enableInfiniteScrolling": false, + "enableLogDetails": true, + "prettifyLogMessage": false, + "showCommonLabels": false, + "showLabels": false, + "showTime": true, + "sortOrder": "Descending", + "wrapLogMessage": false + }, + "pluginVersion": "11.3.1", + "targets": [ + { + "alias": "", + "bucketAggs": [ + { + "field": "@timestamp", + "id": "2", + "settings": { + "interval": "auto" + }, + "type": "date_histogram" + } + ], + "datasource": { + "type": "grafana-opensearch-datasource", + "uid": "dbrepoopensearch0" + }, + "format": "table", + "hide": false, + "luceneQueryType": "Logs", + "metrics": [ + { + "id": "1", + "type": "logs" + } + ], + "query": "log_level: ERROR AND service_name: \"$service\"", + "queryType": "lucene", + "refId": "A", + "timeField": "@timestamp" + } + ], + "title": "Errors", + "transformations": [ + { + "id": "filterFieldsByName", + "options": { + "include": { + "names": [ + "@timestamp", + "message", + "log_logger", + "process_pid", + "process_thread_name", + "service_name", + "service_version", + "log_level" + ] + } + } + } + ], + "type": "logs" + } + ], + "preload": false, + "refresh": "5m", + "schemaVersion": 40, + "tags": [ + "ui", + "dashboard", + "metadata", + "data", + "gateway", + "analyse", + "metrics", + "auth", + "search" + ], + "templating": { + "list": [ + { + "current": { + "text": "metadata-service", + "value": "metadata-service" + }, + "includeAll": true, + "label": "Service", + "name": "service", + "options": [ + { + "selected": false, + "text": "analyse-service", + "value": "analyse-service" + }, + { + "selected": false, + "text": "dashboard-service", + "value": "dashboard-service" + }, + { + "selected": false, + "text": "data-service", + "value": "data-service" + }, + { + "selected": true, + "text": "metadata-service", + "value": "metadata-service" + }, + { + "selected": false, + "text": "search-service", + "value": "search-service" + } + ], + "query": "analyse-service, dashboard-service, data-service, metadata-service, search-service", + "type": "custom" + } + ] + }, + "time": { + "from": "now-1h", + "to": "now" + }, + "timepicker": {}, + "timezone": "browser", + "title": "Logging - Overview", + "uid": "aejhojr0mrpj4c", + "version": 23, + "weekStart": "" +} \ No newline at end of file diff --git a/helm/dbrepo/files/mariadb.json b/helm/dbrepo/files/mariadb.json index f53fe024185f6627f4b7fc592cca8135a9e03cd5..b6297de19c2dcd0c179c49a8c616ab2f230caf6b 100644 --- a/helm/dbrepo/files/mariadb.json +++ b/helm/dbrepo/files/mariadb.json @@ -24,7 +24,7 @@ "datasource": { "default": true, "type": "prometheus", - "uid": "P18F45E9DC7E75912" + "uid": "dbrepometrics0" }, "fieldConfig": { "defaults": { @@ -141,7 +141,7 @@ "type": "table" }, { - "datasource": "P18F45E9DC7E75912", + "datasource": "dbrepometrics0", "fieldConfig": { "defaults": { "custom": { @@ -242,7 +242,7 @@ "type": "table" }, { - "datasource": "P18F45E9DC7E75912", + "datasource": "dbrepometrics0", "fieldConfig": { "defaults": { "custom": {}, @@ -312,7 +312,7 @@ "type": "gauge" }, { - "datasource": "P18F45E9DC7E75912", + "datasource": "dbrepometrics0", "fieldConfig": { "defaults": { "custom": { @@ -386,7 +386,7 @@ "bars": false, "dashLength": 10, "dashes": false, - "datasource": "P18F45E9DC7E75912", + "datasource": "dbrepometrics0", "fieldConfig": { "defaults": { "custom": {}, @@ -497,7 +497,7 @@ "bars": false, "dashLength": 10, "dashes": false, - "datasource": "P18F45E9DC7E75912", + "datasource": "dbrepometrics0", "fieldConfig": { "defaults": { "custom": {}, @@ -620,7 +620,7 @@ "bars": false, "dashLength": 10, "dashes": false, - "datasource": "P18F45E9DC7E75912", + "datasource": "dbrepometrics0", "fieldConfig": { "defaults": { "custom": {} @@ -733,7 +733,7 @@ "bars": false, "dashLength": 10, "dashes": false, - "datasource": "P18F45E9DC7E75912", + "datasource": "dbrepometrics0", "fieldConfig": { "defaults": { "custom": {} @@ -846,7 +846,7 @@ "bars": false, "dashLength": 10, "dashes": false, - "datasource": "P18F45E9DC7E75912", + "datasource": "dbrepometrics0", "fieldConfig": { "defaults": { "custom": {} @@ -942,7 +942,7 @@ "bars": false, "dashLength": 10, "dashes": false, - "datasource": "P18F45E9DC7E75912", + "datasource": "dbrepometrics0", "decimals": 2, "fieldConfig": { "defaults": { @@ -1039,7 +1039,7 @@ "bars": false, "dashLength": 10, "dashes": false, - "datasource": "P18F45E9DC7E75912", + "datasource": "dbrepometrics0", "decimals": 2, "fieldConfig": { "defaults": { @@ -1148,7 +1148,7 @@ "bars": false, "dashLength": 10, "dashes": false, - "datasource": "P18F45E9DC7E75912", + "datasource": "dbrepometrics0", "decimals": 1, "fieldConfig": { "defaults": { @@ -1248,7 +1248,7 @@ "bars": false, "dashLength": 10, "dashes": false, - "datasource": "P18F45E9DC7E75912", + "datasource": "dbrepometrics0", "fieldConfig": { "defaults": { "custom": {} @@ -1348,7 +1348,7 @@ } } ], - "refresh": "1m", + "refresh": "5m", "schemaVersion": 26, "style": "dark", "tags": ["provisioned", "galera", "mariadb"], @@ -1366,12 +1366,12 @@ ] }, "time": { - "from": "now-1h", + "from": "now-3h", "to": "now" }, "timepicker": {}, "timezone": "", - "title": "Galera/MariaDB - Overview", + "title": "MariaDB Galera - Overview", "uid": "pXgz0qFGk", "version": 2 } \ No newline at end of file diff --git a/helm/dbrepo/files/my.cnf b/helm/dbrepo/files/my.cnf deleted file mode 100644 index 2798f37644d8b2b2691335277c50e41dcd295def..0000000000000000000000000000000000000000 --- a/helm/dbrepo/files/my.cnf +++ /dev/null @@ -1,125 +0,0 @@ -[client] -port=3306 -socket=/opt/bitnami/mariadb/tmp/mysql.sock -plugin_dir=/opt/bitnami/mariadb/plugin - -[mysqld] -explicit_defaults_for_timestamp -default_storage_engine=InnoDB -basedir=/opt/bitnami/mariadb -datadir=/bitnami/mariadb/data -plugin_dir=/opt/bitnami/mariadb/plugin -tmpdir=/opt/bitnami/mariadb/tmp -socket=/opt/bitnami/mariadb/tmp/mysql.sock -pid_file=/opt/bitnami/mariadb/tmp/mysqld.pid -bind_address=0.0.0.0 - -## Character set -## -collation_server=utf8_unicode_ci -init_connect='SET NAMES utf8' -character_set_server=utf8 - -## MyISAM -## -key_buffer_size=32M -myisam_recover_options=FORCE,BACKUP - -## Safety -## -skip_host_cache -skip_name_resolve -max_allowed_packet=16M -max_connect_errors=1000000 -sql_mode=STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_AUTO_VALUE_ON_ZERO,NO_ENGINE_SUBSTITUTION,NO_ZERO_DATE,NO_ZERO_IN_DATE,ONLY_FULL_GROUP_BY -sysdate_is_now=1 - -## Binary Logging -## -log_bin=mysql-bin -expire_logs_days=14 -# Disabling for performance per http://severalnines.com/blog/9-tips-going-production-galera-cluster-mysql -sync_binlog=0 -# Required for Galera -binlog_format=row - -## Caches and Limits -## -tmp_table_size=32M -max_heap_table_size=32M -# Re-enabling as now works with Maria 10.1.2 -query_cache_type=1 -query_cache_limit=4M -query_cache_size=256M -max_connections=500 -thread_cache_size=50 -open_files_limit=65535 -table_definition_cache=4096 -table_open_cache=4096 - -## InnoDB -## -innodb=FORCE -innodb_strict_mode=1 -# Mandatory per https://github.com/codership/documentation/issues/25 -innodb_autoinc_lock_mode=2 -# Per https://www.percona.com/blog/2006/08/04/innodb-double-write/ -innodb_doublewrite=1 -innodb_flush_method=O_DIRECT -innodb_log_files_in_group=2 -innodb_log_file_size=128M -innodb_flush_log_at_trx_commit=1 -innodb_file_per_table=1 -# 80% Memory is default reco. -# Need to re-evaluate when DB size grows -innodb_buffer_pool_size=1430M -innodb_file_format=Barracuda - -## Logging -## -log_error=/opt/bitnami/mariadb/logs/mysqld.log -slow_query_log_file=/opt/bitnami/mariadb/logs/mysqld.log -log_queries_not_using_indexes=1 -slow_query_log=1 - -## SSL -## Use extraVolumes and extraVolumeMounts to mount /certs filesystem -# ssl_ca=/certs/ca.pem -# ssl_cert=/certs/server-cert.pem -# ssl_key=/certs/server-key.pem - -[galera] -wsrep_on=ON -wsrep_provider=/opt/bitnami/mariadb/lib/libgalera_smm.so -wsrep_sst_method=mariabackup -wsrep_slave_threads=4 -wsrep_cluster_address=gcomm:// -wsrep_cluster_name=galera -wsrep_sst_auth="root:" -# Enabled for performance per https://mariadb.com/kb/en/innodb-system-variables/#innodb_flush_log_at_trx_commit -innodb_flush_log_at_trx_commit=2 -# MYISAM REPLICATION SUPPORT # -wsrep_mode=REPLICATE_MYISAM - -[mariadb] -plugin_load_add=auth_pam - -## Data-at-Rest Encryption -## Use extraVolumes and extraVolumeMounts to mount /encryption filesystem -# plugin_load_add=file_key_management -# file_key_management_filename=/encryption/keyfile.enc -# file_key_management_filekey=FILE:/encryption/keyfile.key -# file_key_management_encryption_algorithm=AES_CTR -# encrypt_binlog=ON -# encrypt_tmp_files=ON - -## InnoDB/XtraDB Encryption -# innodb_encrypt_tables=ON -# innodb_encrypt_temporary_tables=ON -# innodb_encrypt_log=ON -# innodb_encryption_threads=4 -# innodb_encryption_rotate_key_age=1 - -## Aria Encryption -# aria_encrypt_tables=ON -# encrypt_tmp_disk_tables=ON \ No newline at end of file diff --git a/helm/dbrepo/files/rabbitmq.json b/helm/dbrepo/files/rabbitmq.json index a8db65695f2dfef0484ebd91fcb7401f31f9f70d..fbaaf04ba0f7b32f7da9a10ac3edbafab23f273a 100644 --- a/helm/dbrepo/files/rabbitmq.json +++ b/helm/dbrepo/files/rabbitmq.json @@ -41,7 +41,7 @@ "datasource": { "default": true, "type": "prometheus", - "uid": "P18F45E9DC7E75912" + "uid": "dbrepometrics0" }, "description": "", "fieldConfig": { @@ -8053,7 +8053,7 @@ "type": "timeseries" } ], - "refresh": "15s", + "refresh": "24h", "schemaVersion": 34, "style": "dark", "tags": ["provisioned", "rabbitmq"], @@ -8133,7 +8133,7 @@ ] }, "time": { - "from": "now-15m", + "from": "now-3h", "to": "now" }, "timepicker": { diff --git a/helm/dbrepo/hack/add-hosts.sh b/helm/dbrepo/hack/add-hosts.sh deleted file mode 100755 index 93d1bbcb52c80ce3d3c173b4d458fd76489fde21..0000000000000000000000000000000000000000 --- a/helm/dbrepo/hack/add-hosts.sh +++ /dev/null @@ -1,5 +0,0 @@ -#!/bin/bash -cat /etc/hosts | grep "dbrepo.local" -if [ "$?" -ne 0 ]; then - echo "$(minikube ip) dbrepo.local" | sudo tee -a /etc/hosts -fi \ No newline at end of file diff --git a/helm/dbrepo/hack/generate-rabbitmq-pw.sh b/helm/dbrepo/hack/generate-rabbitmq-pw.sh deleted file mode 100755 index 4bccc93d7b0b9dc8a9e8b4116bcd6826f83f3f71..0000000000000000000000000000000000000000 --- a/helm/dbrepo/hack/generate-rabbitmq-pw.sh +++ /dev/null @@ -1,14 +0,0 @@ -#!/bin/bash -# https://stackoverflow.com/a/53175209/2634294 -# THIS SCRIPT REQUIRES xxd TO BE INSTALLED: -# DEBIAN: apt install xxd -# MACOS: brew install coreutils -function encode_password() -{ - SALT=$(od -A n -t x -N 4 /dev/urandom) - PASS=$SALT$(echo -n $1 | xxd -ps | tr -d '\n' | tr -d ' ') - PASS=$(echo -n $PASS | xxd -r -p | sha256sum | head -c 128) - PASS=$(echo -n $SALT$PASS | xxd -r -p | base64 | tr -d '\n') - echo $PASS -} -encode_password $1 \ No newline at end of file diff --git a/helm/dbrepo/hack/generate-tls-cert.sh b/helm/dbrepo/hack/generate-tls-cert.sh deleted file mode 100755 index cfe69dfdb0e59f7c2b0895b63f4bf039e074c9e4..0000000000000000000000000000000000000000 --- a/helm/dbrepo/hack/generate-tls-cert.sh +++ /dev/null @@ -1,8 +0,0 @@ -#!/bin/bash -HOSTNAME="dbrepo.local" - -openssl genrsa -out ./tls/ca.key 2048 -openssl req -new -x509 -days 365 -key ./tls/ca.key -subj "/C=AT/O=Acme, Inc./CN=Acme Root CA" -out ./tls/ca.crt -openssl req -newkey rsa:2048 -nodes -keyout ./tls/tls.key -subj "/C=AT/O=DBRepo/CN=${HOSTNAME}" -out ./tls/tls.csr -openssl x509 -req -extfile <(printf "subjectAltName=DNS:${HOSTNAME},DNS:www.${HOSTNAME}") -days 365 -in ./tls/tls.csr \ - -CA ./tls/ca.crt -CAkey ./tls/ca.key -CAcreateserial -out ./tls/tls.crt \ No newline at end of file diff --git a/helm/dbrepo/hack/install-cert-manager.sh b/helm/dbrepo/hack/install-cert-manager.sh deleted file mode 100755 index 8b0569b733164132d0932e3e645e1fb025a3d84f..0000000000000000000000000000000000000000 --- a/helm/dbrepo/hack/install-cert-manager.sh +++ /dev/null @@ -1,15 +0,0 @@ -#!/bin/bash -kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v${CERT_MANAGER_VERSION}/cert-manager.yaml -if [ $? -ne 0 ]; then - echo "ERROR: Failed to install cert-manager" > /dev/stderr -else - echo "SUCCESS: Installed cert-manager" -fi -cat <<EOF | kubectl apply -f - -apiVersion: cert-manager.io/v1 -kind: ClusterIssuer -metadata: - name: selfsigned-cluster-issuer -spec: - selfSigned: {} -EOF diff --git a/helm/dbrepo/hack/install-seaweedfs.sh b/helm/dbrepo/hack/install-seaweedfs.sh deleted file mode 100755 index 5842de8eafcb47bb163645b6a51a14e5ab140fd7..0000000000000000000000000000000000000000 --- a/helm/dbrepo/hack/install-seaweedfs.sh +++ /dev/null @@ -1,3 +0,0 @@ -#!/bin/bash -helm upgrade -n seaweedfs seaweedfs https://seaweedfs.github.io/seaweedfs-csi-driver/helm/seaweedfs-csi-driver-0.1.3.tgz \ - --install --create-namespace \ No newline at end of file diff --git a/helm/dbrepo/hack/tls/.gitkeep b/helm/dbrepo/hack/tls/.gitkeep deleted file mode 100644 index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000 diff --git a/helm/dbrepo/templates/_helpers.tpl b/helm/dbrepo/templates/_helpers.tpl index b58ad0e517c2d1e9ff34a89e3700c0505eafe3b0..b9b6534de6ebab17707d0f19124698fda0e524fd 100644 --- a/helm/dbrepo/templates/_helpers.tpl +++ b/helm/dbrepo/templates/_helpers.tpl @@ -61,6 +61,57 @@ Create the name of the service account to use {{- end }} {{- end }} +{{/* +Service configuration for the sidecar metrics +*/}} +{{- define "dbrepo.logging.sidecarOpensearchService" -}} +[SERVICE] + Flush 5 + Daemon Off + Log_Level debug + Parsers_File /opt/bitnami/fluent-bit/conf/parsers.conf +{{- end -}} + +{{/* +Input configuration for the sidecar metrics +*/}} +{{- define "dbrepo.logging.sidecarOpensearchInput" -}} +[INPUT] + Name tail + Tag * + Path /var/log/app/service/*/*.log + Parser docker + Mem_Buf_Limit 5MB + Buffer_Chunk_size 32k + Buffer_Max_size 32k +{{- end -}} + +{{/* +Output configuration for the sidecar metrics +*/}} +{{- define "dbrepo.logging.sidecarOpensearchOutput" -}} +[OUTPUT] + Name opensearch + Match * + Host search-db + Port 9200 + Index logging + Replace_Dots On + Suppress_Type_Name On + Trace_Error On +{{- end -}} + +{{/* +Output configuration for the sidecar metrics +*/}} +{{- define "dbrepo.logging.sidecarMetricsOutput" -}} +[OUTPUT] + name prometheus_exporter + match internal_metrics + host 0.0.0.0 + port 2021 +{{- end -}} + {{/* Broker connections */}} diff --git a/helm/dbrepo/templates/_resources.tpl b/helm/dbrepo/templates/_resources.tpl index be31108c93f7f5bbbcf9d5a9c13313190da554db..d4368b7164e634430db9a322e7a5fc9e095ab736 100644 --- a/helm/dbrepo/templates/_resources.tpl +++ b/helm/dbrepo/templates/_resources.tpl @@ -38,8 +38,8 @@ These presets are for basic testing and not meant to be used in production "limits" (dict "cpu" "1.5" "memory" "3072Mi" "ephemeral-storage" "2Gi") ) "xlarge" (dict - "requests" (dict "cpu" "1.0" "memory" "3072Mi" "ephemeral-storage" "50Mi") - "limits" (dict "cpu" "3.0" "memory" "6144Mi" "ephemeral-storage" "2Gi") + "requests" (dict "cpu" "1.5" "memory" "4096Mi" "ephemeral-storage" "50Mi") + "limits" (dict "cpu" "2.0" "memory" "6144Mi" "ephemeral-storage" "2Gi") ) "2xlarge" (dict "requests" (dict "cpu" "1.0" "memory" "3072Mi" "ephemeral-storage" "50Mi") diff --git a/helm/dbrepo/templates/analyse-configmap.yaml b/helm/dbrepo/templates/analyse-configmap.yaml new file mode 100644 index 0000000000000000000000000000000000000000..45d4cb32219d114b9bec6e50e56a7f165ce93097 --- /dev/null +++ b/helm/dbrepo/templates/analyse-configmap.yaml @@ -0,0 +1,15 @@ +{{- if .Values.analyseservice.enabled }} +{{- if .Values.global.loggingSidecar.enabled }} +apiVersion: v1 +kind: ConfigMap +metadata: + name: analyse-service-config + namespace: {{ include "common.names.namespace" . | quote }} +data: + fluent-bit.conf: |- + {{- include "dbrepo.logging.sidecarOpensearchService" . | nindent 4 }} + {{- include "dbrepo.logging.sidecarOpensearchInput" . | nindent 4 }} + {{- include "dbrepo.logging.sidecarOpensearchOutput" . | nindent 4 }} + {{- include "dbrepo.logging.sidecarMetricsOutput" . | nindent 4 }} +{{- end }} +{{- end }} \ No newline at end of file diff --git a/helm/dbrepo/templates/analyse-deployment.yaml b/helm/dbrepo/templates/analyse-deployment.yaml index d3e6b699c0b66e1100bdae7aab6a560380a6f19e..07f02ce9192b2ebcbaf1477378ee2435e1630546 100644 --- a/helm/dbrepo/templates/analyse-deployment.yaml +++ b/helm/dbrepo/templates/analyse-deployment.yaml @@ -18,6 +18,10 @@ spec: service: analyse-service template: metadata: + annotations: + {{- if .Values.analyseservice.podAnnotations }} + {{- include "common.tplvalues.render" (dict "value" .Values.analyseservice.podAnnotations "context" $) | nindent 8 }} + {{- end }} labels: app: analyse-service service: analyse-service @@ -35,6 +39,9 @@ spec: ports: - containerPort: 8080 protocol: TCP + volumeMounts: + - name: empty-dir + mountPath: /var/log/app/service/analyse envFrom: - secretRef: name: analyse-service-secret @@ -59,4 +66,37 @@ spec: {{- else if ne .Values.analyseservice.resourcesPreset "none" }} resources: {{- include "common.resources.preset" (dict "type" .Values.analyseservice.resourcesPreset) | nindent 12 }} {{- end }} + {{- if .Values.global.loggingSidecar.enabled }} + - name: logging-agent + image: {{ .Values.global.loggingSidecar.image.name }} + imagePullPolicy: {{ .Values.analyseservice.image.pullPolicy | default "IfNotPresent" }} + {{- if .Values.analyseservice.containerSecurityContext.enabled }} + securityContext: {{- include "common.compatibility.renderSecurityContext" (dict "secContext" .Values.analyseservice.containerSecurityContext "context" $) | nindent 12 }} + {{- end }} + volumeMounts: + - name: logging-config + mountPath: /opt/bitnami/fluent-bit/conf/fluent-bit.conf + subPath: fluent-bit.conf + - name: empty-dir + mountPath: /var/log/app/service/analyse + livenessProbe: + httpGet: + port: 2021 + initialDelaySeconds: 150 + periodSeconds: 10 + readinessProbe: + httpGet: + port: 2021 + initialDelaySeconds: 30 + periodSeconds: 10 + resources: {{- include "common.resources.preset" (dict "type" .Values.global.loggingSidecar.resourcesPreset) | nindent 12 }} + {{- end }} + volumes: + {{- if .Values.global.loggingSidecar.enabled }} + - name: logging-config + configMap: + name: analyse-service-config + {{- end }} + - name: empty-dir + emptyDir: {} {{- end }} diff --git a/helm/dbrepo/templates/auth-configmap.yaml b/helm/dbrepo/templates/auth-configmap.yaml index 8d8340bd9bb3db42e8a1385cdf4a0e631963f525..4e95365743d17062227c2095d745e92b8a04207f 100644 --- a/helm/dbrepo/templates/auth-configmap.yaml +++ b/helm/dbrepo/templates/auth-configmap.yaml @@ -8,19 +8,6 @@ binaryData: create-event-listener.jar: |- {{ .Files.Get "files/create-event-listener.jar" | b64enc }} data: - AUTH_SERVICE_ADMIN: "{{ .Values.authservice.auth.adminUser }}" - AUTH_SERVICE_ADMIN_PASSWORD: "{{ .Values.authservice.auth.adminPassword }}" - AUTH_SERVICE_ENDPOINT: "{{ .Values.authservice.endpoint }}" - KEYCLOAK_HOSTNAME: "{{ .Values.gateway }}" - LDAP_ROOT: "{{ .Values.identityservice.global.ldapDomain }}" - LDAP_ADMIN_DN: "cn={{ .Values.identityservice.global.adminUser }},{{ .Values.identityservice.global.ldapDomain }}" - LDAP_ADMIN_PASSWORD: "{{ .Values.identityservice.global.adminPassword }}" - METADATA_DB: "{{ .Values.metadatadb.db.name }}" - METADATA_DB_PASSWORD: "{{ .Values.metadatadb.rootUser.password }}" - METADATA_SERVICE_ENDPOINT: "{{ .Values.metadataservice.endpoint }}" - METADATA_USERNAME: "{{ .Values.metadatadb.rootUser.user }}" - SYSTEM_USERNAME: "{{ .Values.identityservice.users }}" - SYSTEM_PASSWORD: "{{ .Values.identityservice.userPasswords }}" {{ (.Files.Glob "files/dbrepo-realm.json").AsConfig | nindent 2 }} {{ (.Files.Glob "files/master-realm.json").AsConfig | nindent 2 }} {{- end }} \ No newline at end of file diff --git a/helm/dbrepo/templates/auth-secret.yaml b/helm/dbrepo/templates/auth-secret.yaml new file mode 100644 index 0000000000000000000000000000000000000000..da47194ddfd93d225242ed84df35802d42501ecf --- /dev/null +++ b/helm/dbrepo/templates/auth-secret.yaml @@ -0,0 +1,26 @@ +{{- if .Values.authservice.enabled }} +--- +apiVersion: v1 +kind: Secret +metadata: + name: auth-service-secret + namespace: {{ include "common.names.namespace" . | quote }} +stringData: + AUTH_SERVICE_ADMIN: "{{ .Values.authservice.auth.adminUser }}" + AUTH_SERVICE_ADMIN_PASSWORD: "{{ .Values.authservice.auth.adminPassword }}" + AUTH_SERVICE_ENDPOINT: "{{ .Values.authservice.endpoint }}" + KC_LOG: "console,file" + KC_LOG_FILE_JSON_FORMAT: "ecs" + KC_LOG_FILE_LEVEL: "debug" + KC_LOG_FILE_OUTPUT: "json" + KEYCLOAK_HOSTNAME: "{{ .Values.gateway }}" + LDAP_ROOT: "{{ .Values.identityservice.global.ldapDomain }}" + LDAP_ADMIN_DN: "cn={{ .Values.identityservice.global.adminUser }},{{ .Values.identityservice.global.ldapDomain }}" + LDAP_ADMIN_PASSWORD: "{{ .Values.identityservice.global.adminPassword }}" + METADATA_DB: "{{ .Values.metadatadb.db.name }}" + METADATA_DB_PASSWORD: "{{ .Values.metadatadb.rootUser.password }}" + METADATA_SERVICE_ENDPOINT: "{{ .Values.metadataservice.endpoint }}" + METADATA_USERNAME: "{{ .Values.metadatadb.rootUser.user }}" + SYSTEM_USERNAME: "{{ .Values.identityservice.users }}" + SYSTEM_PASSWORD: "{{ .Values.identityservice.userPasswords }}" +{{- end }} diff --git a/helm/dbrepo/templates/auth-job.yaml b/helm/dbrepo/templates/auth-setup-job.yaml similarity index 80% rename from helm/dbrepo/templates/auth-job.yaml rename to helm/dbrepo/templates/auth-setup-job.yaml index ca58e6a287cb97365b62fa4bec597ae8cb0ebab9..9b83684bf501402d5387b295eeab7b83869b2293 100644 --- a/helm/dbrepo/templates/auth-job.yaml +++ b/helm/dbrepo/templates/auth-setup-job.yaml @@ -16,6 +16,9 @@ spec: - name: init image: {{ .Values.authservice.setupJob.image.name }} imagePullPolicy: {{ .Values.authservice.setupJob.image.pullPolicy | default "IfNotPresent" }} + {{- if .Values.authservice.containerSecurityContext.enabled }} + securityContext: {{- include "common.compatibility.renderSecurityContext" (dict "secContext" .Values.authservice.containerSecurityContext "context" $) | nindent 12 }} + {{- end }} env: - name: POD_IP valueFrom: @@ -30,8 +33,8 @@ spec: fieldRef: fieldPath: metadata.namespace envFrom: - - configMapRef: - name: auth-service-config + - secretRef: + name: auth-service-secret {{- if .Values.authservice.setupJob.resources }} resources: {{- toYaml .Values.authservice.setupJob.resources | nindent 12 }} {{- else if ne .Values.authservice.setupJob.resourcesPreset "none" }} diff --git a/helm/dbrepo/templates/broker-configmap.yaml b/helm/dbrepo/templates/broker-configmap.yaml new file mode 100644 index 0000000000000000000000000000000000000000..e39e2cebd1c5fa6b830ed31303774318f343dfb6 --- /dev/null +++ b/helm/dbrepo/templates/broker-configmap.yaml @@ -0,0 +1,41 @@ +{{- if .Values.brokerservice.enabled }} +{{- if .Values.global.loggingSidecar.enabled }} +apiVersion: v1 +kind: ConfigMap +metadata: + name: broker-service-config + namespace: {{ include "common.names.namespace" . | quote }} +data: + fluent-bit.conf: |- + [SERVICE] + Flush 5 + Daemon Off + Log_Level debug + Parsers_File /opt/bitnami/fluent-bit/conf/parsers.conf + [INPUT] + Name tail + Tag * + Path /opt/bitnami/rabbitmq/var/log/rabbitmq/*.log + Parser rabbitmq + Mem_Buf_Limit 5MB + Buffer_Chunk_size 32k + Buffer_Max_size 32k + [FILTER] + Name modify + Match * + Rename time @timestamp + Rename level log.level + Rename pid process.pid + Rename msg message + Add service.name broker-service + {{- include "dbrepo.logging.sidecarOpensearchOutput" . | nindent 4 }} + {{- include "dbrepo.logging.sidecarMetricsOutput" . | nindent 4 }} + parsers.conf: |- + [PARSER] + Name rabbitmq + Format json + Time_Key time + Time_Format %Y-%m-%d %H:%M:%S.%L + Time_Keep On +{{- end }} +{{- end }} \ No newline at end of file diff --git a/helm/dbrepo/templates/dashboard-configmap.yaml b/helm/dbrepo/templates/dashboard-configmap.yaml new file mode 100644 index 0000000000000000000000000000000000000000..567878c48e500d7e432963e4cbbd1c3d8a7dfb23 --- /dev/null +++ b/helm/dbrepo/templates/dashboard-configmap.yaml @@ -0,0 +1,15 @@ +{{- if .Values.dashboardservice.enabled }} +{{- if .Values.global.loggingSidecar.enabled }} +apiVersion: v1 +kind: ConfigMap +metadata: + name: dashboard-service-config + namespace: {{ include "common.names.namespace" . | quote }} +data: + fluent-bit.conf: |- + {{- include "dbrepo.logging.sidecarOpensearchService" . | nindent 4 }} + {{- include "dbrepo.logging.sidecarOpensearchInput" . | nindent 4 }} + {{- include "dbrepo.logging.sidecarOpensearchOutput" . | nindent 4 }} + {{- include "dbrepo.logging.sidecarMetricsOutput" . | nindent 4 }} +{{- end }} +{{- end }} \ No newline at end of file diff --git a/helm/dbrepo/templates/dashboard-deployment.yaml b/helm/dbrepo/templates/dashboard-deployment.yaml index f2c1a6fff16b55ada432db13abca7fb40f5d45e8..9671d4ddd5aaecc54fd867c164802c37c310f998 100644 --- a/helm/dbrepo/templates/dashboard-deployment.yaml +++ b/helm/dbrepo/templates/dashboard-deployment.yaml @@ -18,6 +18,10 @@ spec: service: dashboard-service template: metadata: + annotations: + {{- if .Values.dashboardservice.podAnnotations }} + {{- include "common.tplvalues.render" (dict "value" .Values.dashboardservice.podAnnotations "context" $) | nindent 8 }} + {{- end }} labels: app: dashboard-service service: dashboard-service @@ -25,21 +29,6 @@ spec: {{- if .Values.dashboardservice.podSecurityContext.enabled }} securityContext: {{- include "common.compatibility.renderSecurityContext" (dict "secContext" .Values.dashboardservice.podSecurityContext "context" $) | nindent 8 }} {{- end }} - initContainers: - - name: init - image: {{ .Values.dashboardservice.init.image.name }} - imagePullPolicy: {{ .Values.dashboardservice.init.image.pullPolicy | default "IfNotPresent" }} - {{- if .Values.dashboardservice.containerSecurityContext.enabled }} - securityContext: {{- include "common.compatibility.renderSecurityContext" (dict "secContext" .Values.dashboardservice.containerSecurityContext "context" $) | nindent 12 }} - {{- end }} - envFrom: - - secretRef: - name: dashboard-service-secret - {{- if .Values.dashboardservice.init.resources }} - resources: {{- toYaml .Values.dashboardservice.init.resources | nindent 12 }} - {{- else if ne .Values.dashboardservice.init.resourcesPreset "none" }} - resources: {{- include "common.resources.preset" (dict "type" .Values.dashboardservice.init.resourcesPreset) | nindent 12 }} - {{- end }} containers: - name: dashboard-service image: {{ .Values.dashboardservice.image.name }} @@ -50,6 +39,9 @@ spec: ports: - containerPort: 8080 protocol: TCP + volumeMounts: + - name: empty-dir + mountPath: /var/log/app/service/dashboard envFrom: - secretRef: name: dashboard-service-secret @@ -74,4 +66,37 @@ spec: {{- else if ne .Values.dashboardservice.resourcesPreset "none" }} resources: {{- include "common.resources.preset" (dict "type" .Values.dashboardservice.resourcesPreset) | nindent 12 }} {{- end }} + {{- if .Values.global.loggingSidecar.enabled }} + - name: logging-agent + image: {{ .Values.global.loggingSidecar.image.name }} + imagePullPolicy: {{ .Values.dashboardservice.image.pullPolicy | default "IfNotPresent" }} + {{- if .Values.dashboardservice.containerSecurityContext.enabled }} + securityContext: {{- include "common.compatibility.renderSecurityContext" (dict "secContext" .Values.dashboardservice.containerSecurityContext "context" $) | nindent 12 }} + {{- end }} + volumeMounts: + - name: logging-config + mountPath: /opt/bitnami/fluent-bit/conf/fluent-bit.conf + subPath: fluent-bit.conf + - name: empty-dir + mountPath: /var/log/app/service/dashboard + livenessProbe: + httpGet: + port: 2021 + initialDelaySeconds: 150 + periodSeconds: 10 + readinessProbe: + httpGet: + port: 2021 + initialDelaySeconds: 30 + periodSeconds: 10 + resources: {{- include "common.resources.preset" (dict "type" .Values.global.loggingSidecar.resourcesPreset) | nindent 12 }} + {{- end }} + volumes: + {{- if .Values.global.loggingSidecar.enabled }} + - name: logging-config + configMap: + name: dashboard-service-config + {{- end }} + - name: empty-dir + emptyDir: { } {{- end }} diff --git a/helm/dbrepo/templates/dashboard-setup-job.yaml b/helm/dbrepo/templates/dashboard-setup-job.yaml new file mode 100644 index 0000000000000000000000000000000000000000..a12228661b6af4b1d0c3cb8700c017b0e5573399 --- /dev/null +++ b/helm/dbrepo/templates/dashboard-setup-job.yaml @@ -0,0 +1,49 @@ +{{- if .Values.dashboardservice.enabled }} +--- +apiVersion: batch/v1 +kind: Job +metadata: + name: dashboard-service-setup-job + namespace: {{ include "common.names.namespace" . | quote }} +spec: + backoffLimit: {{ .Values.dashboardservice.setupJob.backoffLimit | default "10" }} + template: + metadata: + name: auth-service-setup-job + spec: + restartPolicy: OnFailure + containers: + - name: init + image: {{ .Values.dashboardservice.setupJob.image.name }} + imagePullPolicy: {{ .Values.dashboardservice.setupJob.image.pullPolicy | default "IfNotPresent" }} + {{- if .Values.dashboardservice.containerSecurityContext.enabled }} + securityContext: {{- include "common.compatibility.renderSecurityContext" (dict "secContext" .Values.dashboardservice.containerSecurityContext "context" $) | nindent 12 }} + {{- end }} + env: + - name: POD_IP + valueFrom: + fieldRef: + fieldPath: status.podIP + - name: POD_NAME + valueFrom: + fieldRef: + fieldPath: metadata.name + - name: NAMESPACE + valueFrom: + fieldRef: + fieldPath: metadata.namespace + envFrom: + - secretRef: + name: dashboard-service-secret + volumeMounts: + - name: empty-dir + mountPath: /var/log/app/service/dashboard + {{- if .Values.dashboardservice.setupJob.resources }} + resources: {{- toYaml .Values.dashboardservice.setupJob.resources | nindent 12 }} + {{- else if ne .Values.dashboardservice.setupJob.resourcesPreset "none" }} + resources: {{- include "common.resources.preset" (dict "type" .Values.dashboardservice.setupJob.resourcesPreset) | nindent 12 }} + {{- end }} + volumes: + - name: empty-dir + emptyDir: { } +{{- end }} diff --git a/helm/dbrepo/templates/dashboard-ui-configmap.yaml b/helm/dbrepo/templates/dashboard-ui-configmap.yaml new file mode 100644 index 0000000000000000000000000000000000000000..9fe92bc9e2aca14e59805388e4a723d85593d5fd --- /dev/null +++ b/helm/dbrepo/templates/dashboard-ui-configmap.yaml @@ -0,0 +1,14 @@ +{{- if .Values.dashboardui.enabled }} +--- +apiVersion: v1 +kind: ConfigMap +metadata: + name: dashboard-ui-config + namespace: {{ include "common.names.namespace" . | quote }} +data: + {{ (.Files.Glob "files/dbrepo.json").AsConfig | nindent 2 }} + {{ (.Files.Glob "files/keycloak.json").AsConfig | nindent 2 }} + {{ (.Files.Glob "files/logging.json").AsConfig | nindent 2 }} + {{ (.Files.Glob "files/mariadb.json").AsConfig | nindent 2 }} + {{ (.Files.Glob "files/rabbitmq.json").AsConfig | nindent 2 }} +{{- end }} diff --git a/helm/dbrepo/templates/dashboard-ui-datasources-secret.yaml b/helm/dbrepo/templates/dashboard-ui-datasources-secret.yaml new file mode 100644 index 0000000000000000000000000000000000000000..8a21a20db8dd41dad8f36174cf23ca5420562a60 --- /dev/null +++ b/helm/dbrepo/templates/dashboard-ui-datasources-secret.yaml @@ -0,0 +1,47 @@ +{{- if .Values.dashboardui.enabled }} +--- +apiVersion: v1 +kind: Secret +metadata: + name: dashboard-ui-datasources-secret + namespace: {{ include "common.names.namespace" . | quote }} +stringData: + infinity.yaml: |- + apiVersion: 1 + datasources: + - name: dbrepo-json + uid: dbrepojson0 + type: yesoreyeram-infinity-datasource + basicAuth: true + basicAuthUser: user + url: $BASE_URL + jsonData: + auth_method: 'basicAuth' + httpHeaderName1: Accept + allowedHosts: + - '$BASE_URL' + secureJsonData: + basicAuthPassword: user + httpHeaderValue1: application/json + prometheus.yaml: |- + apiVersion: 1 + datasources: + - name: dbrepo-metrics + type: prometheus + uid: dbrepometrics0 + url: http://metric-db-server + opensearch.yaml: |- + apiVersion: 1 + datasources: + - name: dbrepo-opensearch + uid: dbrepoopensearch0 + type: grafana-opensearch-datasource + basicAuth: false + url: http://search-db:9200 + jsonData: + flavor: "opensearch" + logLevelField: "level" + logMessageField: "message" + timeField: "@timestamp" + version: "2.19.0" +{{- end }} diff --git a/helm/dbrepo/templates/dashboard-ui-secret.yaml b/helm/dbrepo/templates/dashboard-ui-secret.yaml index 0816c696377d28c3c3e9ab1358e5bce69e4e36b2..b8b88a1dc1f721e09ac39f68e104617db51a0eec 100644 --- a/helm/dbrepo/templates/dashboard-ui-secret.yaml +++ b/helm/dbrepo/templates/dashboard-ui-secret.yaml @@ -6,12 +6,16 @@ metadata: name: dashboard-ui-secret namespace: {{ include "common.names.namespace" . | quote }} stringData: - GF_SERVER_PROTOCOL: "http" - GF_SERVER_DOMAIN: "{{ .Values.hostname }}" - GF_SERVER_ROOT_URL: "https://%(domain)s/dashboard/" + BASE_URL: "{{ .Values.gateway }}" GF_AUTH_ANONYMOUS_ENABLED: "true" GF_AUTH_ANONYMOUS_ORG_ROLE: "Viewer" - GF_SERVER_SERVE_FROM_SUB_PATH: "true" + GF_DATABASE_TYPE: "postgres" + GF_DATABASE_HOST: "{{ .Values.dashboarddb.host }}" + GF_DATABASE_NAME: "{{ .Values.dashboarddb.auth.database }}" + GF_DATABASE_USER: "{{ .Values.dashboarddb.auth.username }}" + GF_DATABASE_PASSWORD: "{{ .Values.dashboarddb.auth.password }}" + GF_INSTALL_PLUGINS: "yesoreyeram-infinity-datasource,grafana-opensearch-datasource" + GF_SERVER_ROOT_URL: "http://dashboard-ui:3000/dashboard/" GF_SECURITY_DISABLE_INITIAL_ADMIN_CREATION: "true" LDAP_ADMIN_USERNAME: "{{ .Values.identityservice.global.adminUser }}" LDAP_ADMIN_PASSWORD: "{{ .Values.identityservice.global.adminPassword }}" @@ -19,7 +23,7 @@ stringData: ldap.toml: | [[servers]] host = "identity-service" - port = 389 + port = 1389 use_ssl = false # Search user bind dn diff --git a/helm/dbrepo/templates/data-configmap.yaml b/helm/dbrepo/templates/data-configmap.yaml new file mode 100644 index 0000000000000000000000000000000000000000..8d9d4b6334a90101e8c348afe6c1c8243697bdcf --- /dev/null +++ b/helm/dbrepo/templates/data-configmap.yaml @@ -0,0 +1,15 @@ +{{- if .Values.dataservice.enabled }} +{{- if .Values.global.loggingSidecar.enabled }} +apiVersion: v1 +kind: ConfigMap +metadata: + name: data-service-config + namespace: {{ include "common.names.namespace" . | quote }} +data: + fluent-bit.conf: |- + {{- include "dbrepo.logging.sidecarOpensearchService" . | nindent 4 }} + {{- include "dbrepo.logging.sidecarOpensearchInput" . | nindent 4 }} + {{- include "dbrepo.logging.sidecarOpensearchOutput" . | nindent 4 }} + {{- include "dbrepo.logging.sidecarMetricsOutput" . | nindent 4 }} +{{- end }} +{{- end }} \ No newline at end of file diff --git a/helm/dbrepo/templates/data-db-configmap.yaml b/helm/dbrepo/templates/data-db-configmap.yaml index 31fdb84aee6198ca30eeb22edc72909057fcab1b..cf80439a72b46eda575ae8e9626849caa0dbf6ee 100644 --- a/helm/dbrepo/templates/data-db-configmap.yaml +++ b/helm/dbrepo/templates/data-db-configmap.yaml @@ -1,4 +1,5 @@ {{- if .Values.datadb.enabled }} +--- apiVersion: v1 kind: ConfigMap metadata: diff --git a/helm/dbrepo/templates/data-deployment.yaml b/helm/dbrepo/templates/data-deployment.yaml index 7e77d2020e39a877b6d0165452adcf25f2b34eba..6a2a1be15eff868a283fb973856a58cc7f3d3b01 100644 --- a/helm/dbrepo/templates/data-deployment.yaml +++ b/helm/dbrepo/templates/data-deployment.yaml @@ -18,6 +18,10 @@ spec: service: data-service template: metadata: + annotations: + {{- if .Values.dataservice.podAnnotations }} + {{- include "common.tplvalues.render" (dict "value" .Values.dataservice.podAnnotations "context" $) | nindent 8 }} + {{- end }} labels: app: data-service service: data-service @@ -35,6 +39,9 @@ spec: ports: - containerPort: 8080 protocol: TCP + volumeMounts: + - name: empty-dir + mountPath: /var/log/app/service/data envFrom: - secretRef: name: data-service-secret @@ -59,4 +66,37 @@ spec: {{- else if ne .Values.dataservice.resourcesPreset "none" }} resources: {{- include "common.resources.preset" (dict "type" .Values.dataservice.resourcesPreset) | nindent 12 }} {{- end }} + {{- if .Values.global.loggingSidecar.enabled }} + - name: logging-agent + image: {{ .Values.global.loggingSidecar.image.name }} + imagePullPolicy: {{ .Values.metadataservice.image.pullPolicy | default "IfNotPresent" }} + {{- if .Values.metadataservice.containerSecurityContext.enabled }} + securityContext: {{- include "common.compatibility.renderSecurityContext" (dict "secContext" .Values.metadataservice.containerSecurityContext "context" $) | nindent 12 }} + {{- end }} + volumeMounts: + - name: logging-config + mountPath: /opt/bitnami/fluent-bit/conf/fluent-bit.conf + subPath: fluent-bit.conf + - name: empty-dir + mountPath: /var/log/app/service/data + livenessProbe: + httpGet: + port: 2021 + initialDelaySeconds: 150 + periodSeconds: 10 + readinessProbe: + httpGet: + port: 2021 + initialDelaySeconds: 30 + periodSeconds: 10 + resources: {{- include "common.resources.preset" (dict "type" .Values.global.loggingSidecar.resourcesPreset) | nindent 12 }} + {{- end }} + volumes: + {{- if .Values.global.loggingSidecar.enabled }} + - name: logging-config + configMap: + name: data-service-config + {{- end }} + - name: empty-dir + emptyDir: { } {{- end }} diff --git a/helm/dbrepo/templates/gateway-configmap.yaml b/helm/dbrepo/templates/gateway-configmap.yaml index 37863f85c45ae39134f5293687ca2f1bdb5e8223..e92ccaab9a23b78c21c65a0e63419cb1bf34c281 100644 --- a/helm/dbrepo/templates/gateway-configmap.yaml +++ b/helm/dbrepo/templates/gateway-configmap.yaml @@ -1,201 +1,22 @@ {{- if .Values.gatewayservice.enabled }} +{{- if .Values.global.loggingSidecar.enabled }} apiVersion: v1 kind: ConfigMap metadata: - name: gateway-service-setup + name: gateway-service-config namespace: {{ include "common.names.namespace" . | quote }} data: - dbrepo.conf: | - # This is required to proxy Grafana Live WebSocket connections. - map $http_upgrade $connection_upgrade { - default upgrade; - '' close; - } - - proxy_buffer_size 128k; - proxy_buffers 4 256k; - proxy_busy_buffers_size 256k; - - server { - listen 8080 default_server; - server_name _; - - location /assets/ { - root /app/assets; - expires max; - access_log off; - autoindex on; - autoindex_exact_size off; - autoindex_format html; - autoindex_localtime on; - } - - location /dashboard/ { - proxy_set_header Host $http_host; - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Host $host; - proxy_set_header X-Forwarded-Proto $scheme; - proxy_pass http://dashboard-ui:3000/; - proxy_read_timeout 90; - } - - # Proxy Grafana Live WebSocket connections. - location /dashboard/api/live/ws { - rewrite ^/dashboard/(.*) /$1 break; - proxy_set_header Host $http_host; - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Host $host; - proxy_set_header X-Forwarded-Proto $scheme; - proxy_set_header Upgrade $http_upgrade; - proxy_set_header Connection $connection_upgrade; - proxy_http_version 1.1; - proxy_pass http://dashboard-ui:3000/; - proxy_read_timeout 90; - } - - # Proxy Keycloak OIDC connections, c.f. https://www.keycloak.org/server/reverseproxy#_exposed_path_recommendations - location /realms { - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Host $host; - proxy_set_header X-Forwarded-Proto $scheme; - proxy_pass http://auth-service; - proxy_read_timeout 90; - } - - # Proxy Keycloak assets, c.f. https://www.keycloak.org/server/reverseproxy#_exposed_path_recommendations - location /resources { - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Host $host; - proxy_set_header X-Forwarded-Proto $scheme; - proxy_pass http://auth-service; - proxy_read_timeout 90; - } - - location /api/search { - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Host $host; - proxy_set_header X-Forwarded-Proto $scheme; - proxy_pass http://search-service; - proxy_read_timeout 90; - } - - location /api/datasource { - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Host $host; - proxy_set_header X-Forwarded-Proto $scheme; - proxy_pass http://dashboard-service; - proxy_read_timeout 90; - } - - location /api/dashboard { - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Host $host; - proxy_set_header X-Forwarded-Proto $scheme; - proxy_pass http://dashboard-service; - proxy_read_timeout 90; - } - - location /api/upload { - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Host $host; - proxy_set_header X-Forwarded-Proto $scheme; - proxy_set_header X-Forwarded-Host $host; - proxy_pass http://data-service; - proxy_read_timeout 90; - # Disable request and response buffering - proxy_request_buffering off; - proxy_buffering off; - proxy_http_version 1.1; - } - - location /api/analyse { - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Host $host; - proxy_set_header X-Forwarded-Proto $scheme; - proxy_pass http://analyse-service; - proxy_read_timeout 90; - } - - location ~ "/api/database/([0-9a-f]{8}-[0-9a-f]{4}-[4][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12})/table/([0-9a-f]{8}-[0-9a-f]{4}-[4][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12})/(data|statistic|history)" { - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Host $host; - proxy_set_header X-Forwarded-Proto $scheme; - proxy_pass http://data-service; - proxy_read_timeout 90; - } - - location ~ "/api/database/([0-9a-f]{8}-[0-9a-f]{4}-[4][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12})/view/([0-9a-f]{8}-[0-9a-f]{4}-[4][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12})/(data|statistic)" { - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Host $host; - proxy_set_header X-Forwarded-Proto $scheme; - proxy_pass http://data-service; - proxy_read_timeout 90; - } - - location ~ "/api/database/([0-9a-f]{8}-[0-9a-f]{4}-[4][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12})/view" { - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Host $host; - proxy_set_header X-Forwarded-Proto $scheme; - proxy_pass http://metadata-service; - proxy_read_timeout 90; - } - - location ~ "/api/database/([0-9a-f]{8}-[0-9a-f]{4}-[4][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12})/subset" { - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Host $host; - proxy_set_header X-Forwarded-Proto $scheme; - proxy_pass http://data-service; - proxy_read_timeout 600; - } - - location ~ "/api/(database|concept|container|identifier|image|message|license|oai|ontology|unit|user)" { - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Host $host; - proxy_set_header X-Forwarded-Proto $scheme; - proxy_pass http://metadata-service; - proxy_read_timeout 90; - } - - location ~ "/api/identifier/([0-9a-f]{8}-[0-9a-f]{4}-[4][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12})" { - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Host $host; - proxy_set_header X-Forwarded-Proto $scheme; - proxy_pass http://metadata-service; - proxy_read_timeout 90; - } - - location ~ "/pid/([0-9a-f]{8}-[0-9a-f]{4}-[4][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12})" { - rewrite /pid/(.*) /api/identifier/$1 break; - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Host $host; - proxy_set_header X-Forwarded-Proto $scheme; - proxy_pass http://metadata-service; - proxy_read_timeout 90; - } - - location / { - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Host $host; - proxy_set_header X-Forwarded-Proto $scheme; - proxy_pass http://ui; - proxy_read_timeout 90; - } - } + fluent-bit.conf: |- + {{- include "dbrepo.logging.sidecarOpensearchService" . | nindent 4 }} + [INPUT] + Name tail + Tag * + Path /var/log/nginx/*.log + Parser docker + Mem_Buf_Limit 5MB + Buffer_Chunk_size 32k + Buffer_Max_size 32k + {{- include "dbrepo.logging.sidecarOpensearchOutput" . | nindent 4 }} + {{- include "dbrepo.logging.sidecarMetricsOutput" . | nindent 4 }} +{{- end }} {{- end }} \ No newline at end of file diff --git a/helm/dbrepo/templates/gateway-serverblock-configmap.yaml b/helm/dbrepo/templates/gateway-serverblock-configmap.yaml new file mode 100644 index 0000000000000000000000000000000000000000..2a50958d9d7edf6c78322fd0299e41b14df43e53 --- /dev/null +++ b/helm/dbrepo/templates/gateway-serverblock-configmap.yaml @@ -0,0 +1,9 @@ +{{- if .Values.gatewayservice.enabled }} +apiVersion: v1 +kind: ConfigMap +metadata: + name: gateway-service-setup + namespace: {{ include "common.names.namespace" . | quote }} +data: + {{ (.Files.Glob "files/dbrepo.conf").AsConfig | nindent 2 }} +{{- end }} \ No newline at end of file diff --git a/helm/dbrepo/templates/identity-statefulset.yaml b/helm/dbrepo/templates/identity-statefulset.yaml index f65a547e669b1346f6bb58a2bdce7745cd5f430f..4c1d9b3f29a66e55af1738fd1050ebf56b3a1510 100644 --- a/helm/dbrepo/templates/identity-statefulset.yaml +++ b/helm/dbrepo/templates/identity-statefulset.yaml @@ -16,6 +16,10 @@ spec: service: identity-service template: metadata: + annotations: + {{- if .Values.identityservice.podAnnotations }} + {{- include "common.tplvalues.render" (dict "value" .Values.identityservice.podAnnotations "context" $) | nindent 8 }} + {{- end }} labels: app: identity-service service: identity-service @@ -40,7 +44,7 @@ spec: name: identity-service-secret {{- if .Values.identityservice.persistence.enabled }} volumeMounts: - - name: openldap-data + - name: data mountPath: /bitnami/openldap {{- end }} livenessProbe: @@ -67,7 +71,7 @@ spec: {{- if .Values.identityservice.persistence.enabled }} volumeClaimTemplates: - metadata: - name: openldap-data + name: data spec: accessModes: [ "ReadWriteOnce" ] {{- if .Values.global.storageClass }} diff --git a/helm/dbrepo/templates/metadata-configmap.yaml b/helm/dbrepo/templates/metadata-configmap.yaml index e837c8072ada18d0bb9a364456834bfaecc3e697..4d4960aa62bad21dcccdbc26039e4b8f6bfa4e5d 100644 --- a/helm/dbrepo/templates/metadata-configmap.yaml +++ b/helm/dbrepo/templates/metadata-configmap.yaml @@ -1,24 +1,15 @@ -{{- if .Values.metadatadb.enabled }} ---- +{{- if .Values.metadataservice.enabled }} +{{- if .Values.global.loggingSidecar.enabled }} apiVersion: v1 kind: ConfigMap metadata: - name: metadata-db-config + name: metadata-service-config namespace: {{ include "common.names.namespace" . | quote }} data: - {{- with .Values.metadatadb.extraInitDbScripts }} - {{ toYaml . | nindent 2 }} - {{- end }} - {{ (.Files.Glob "files/01-setup-schema.sql").AsConfig | nindent 2 }} - 02-setup-data.sql: |- - BEGIN; - INSERT INTO `mdb_containers` (id, name, internal_name, image_id, host, port, ui_host, ui_port, privileged_username, - privileged_password, readonly_username, readonly_password) - VALUES ('6cfb3b8e-1792-4e46-871a-f3d103527203', 'mariadb:11.1.3-debian-11-r6', 'mariadb_11_1_3', - 'd79cb089-363c-488b-9717-649e44d8fcc5', 'data-db', {{ .Values.datadb.containerPorts.mysql }}, - '{{ .Values.hostname }}', {{ .Values.datadb.containerPorts.mysql }}, '{{ .Values.datadb.rootUser.user }}', - '{{ .Values.datadb.rootUser.password }}', '{{ .Values.datadb.db.user }}', - '{{ .Values.datadb.db.password }}'); - COMMIT; - {{ (.Files.Glob "files/my.cnf").AsConfig | nindent 2 }} + fluent-bit.conf: |- + {{- include "dbrepo.logging.sidecarOpensearchService" . | nindent 4 }} + {{- include "dbrepo.logging.sidecarOpensearchInput" . | nindent 4 }} + {{- include "dbrepo.logging.sidecarOpensearchOutput" . | nindent 4 }} + {{- include "dbrepo.logging.sidecarMetricsOutput" . | nindent 4 }} {{- end }} +{{- end }} \ No newline at end of file diff --git a/helm/dbrepo/templates/metadata-db-configmap.yaml b/helm/dbrepo/templates/metadata-db-configmap.yaml new file mode 100644 index 0000000000000000000000000000000000000000..09fa8a566157890d788d661228fe45620eb83436 --- /dev/null +++ b/helm/dbrepo/templates/metadata-db-configmap.yaml @@ -0,0 +1,23 @@ +{{- if .Values.metadatadb.enabled }} +--- +apiVersion: v1 +kind: ConfigMap +metadata: + name: metadata-db-config + namespace: {{ include "common.names.namespace" . | quote }} +data: + {{- with .Values.metadatadb.extraInitDbScripts }} + {{ toYaml . | nindent 2 }} + {{- end }} + {{ (.Files.Glob "files/01-setup-schema.sql").AsConfig | nindent 2 }} + 02-setup-data.sql: |- + BEGIN; + INSERT INTO `mdb_containers` (id, name, internal_name, image_id, host, port, ui_host, ui_port, privileged_username, + privileged_password, readonly_username, readonly_password) + VALUES ('6cfb3b8e-1792-4e46-871a-f3d103527203', 'mariadb:11.1.3-debian-11-r6', 'mariadb_11_1_3', + 'd79cb089-363c-488b-9717-649e44d8fcc5', 'data-db', {{ .Values.datadb.containerPorts.mysql }}, + '{{ .Values.hostname }}', {{ .Values.datadb.containerPorts.mysql }}, '{{ .Values.datadb.rootUser.user }}', + '{{ .Values.datadb.rootUser.password }}', '{{ .Values.datadb.db.user }}', + '{{ .Values.datadb.db.password }}'); + COMMIT; +{{- end }} diff --git a/helm/dbrepo/templates/metadata-deployment.yaml b/helm/dbrepo/templates/metadata-deployment.yaml index f5f27378e1d88c2ee59743a5d2dbbcbe110e0235..c175341703aff14dd07b76b6e9753442d42d2409 100644 --- a/helm/dbrepo/templates/metadata-deployment.yaml +++ b/helm/dbrepo/templates/metadata-deployment.yaml @@ -18,6 +18,10 @@ spec: service: metadata-service template: metadata: + annotations: + {{- if .Values.metadataservice.podAnnotations }} + {{- include "common.tplvalues.render" (dict "value" .Values.metadataservice.podAnnotations "context" $) | nindent 8 }} + {{- end }} labels: app: metadata-service service: metadata-service @@ -35,6 +39,9 @@ spec: ports: - containerPort: 8080 protocol: TCP + volumeMounts: + - name: empty-dir + mountPath: /var/log/app/service/metadata envFrom: - secretRef: name: metadata-service-secret @@ -59,4 +66,37 @@ spec: {{- else if ne .Values.metadataservice.resourcesPreset "none" }} resources: {{- include "common.resources.preset" (dict "type" .Values.metadataservice.resourcesPreset) | nindent 12 }} {{- end }} + {{- if .Values.global.loggingSidecar.enabled }} + - name: logging-agent + image: {{ .Values.global.loggingSidecar.image.name }} + imagePullPolicy: {{ .Values.metadataservice.image.pullPolicy | default "IfNotPresent" }} + {{- if .Values.metadataservice.containerSecurityContext.enabled }} + securityContext: {{- include "common.compatibility.renderSecurityContext" (dict "secContext" .Values.metadataservice.containerSecurityContext "context" $) | nindent 12 }} + {{- end }} + volumeMounts: + - name: logging-config + mountPath: /opt/bitnami/fluent-bit/conf/fluent-bit.conf + subPath: fluent-bit.conf + - name: empty-dir + mountPath: /var/log/app/service/metadata + livenessProbe: + httpGet: + port: 2021 + initialDelaySeconds: 150 + periodSeconds: 10 + readinessProbe: + httpGet: + port: 2021 + initialDelaySeconds: 30 + periodSeconds: 10 + resources: {{- include "common.resources.preset" (dict "type" .Values.global.loggingSidecar.resourcesPreset) | nindent 12 }} + {{- end }} + volumes: + {{- if .Values.global.loggingSidecar.enabled }} + - name: logging-config + configMap: + name: metadata-service-config + {{- end }} + - name: empty-dir + emptyDir: { } {{- end }} diff --git a/helm/dbrepo/templates/metadata-setup-configmap.yaml b/helm/dbrepo/templates/metadata-setup-configmap.yaml deleted file mode 100644 index 608f1d13e162665464faeaf3eaa789834f6a8429..0000000000000000000000000000000000000000 --- a/helm/dbrepo/templates/metadata-setup-configmap.yaml +++ /dev/null @@ -1,19 +0,0 @@ -{{- if .Values.metadatadb.enabled }} ---- -apiVersion: v1 -kind: ConfigMap -metadata: - name: metadata-db-setup - namespace: {{ include "common.names.namespace" . | quote }} -data: - {{- with .Values.metadatadb.extraInitDbScripts }} - {{ toYaml . | nindent 2 }} - {{- end }} - {{ (.Files.Glob "files/01-setup-schema.sql").AsConfig | nindent 2 }} - 02-setup-data.sql: | - BEGIN; - INSERT INTO `mdb_containers` (name, internal_name, image_id, host, port, privileged_username, privileged_password) - VALUES ('mariadb-galera:11.3.2-debian-12-r9', 'mariadb-galera:11.3.2-debian-12-r9', 1, 'data-db', 3306, '{{ .Values.datadb.rootUser.user }}', '{{ .Values.datadb.rootUser.password }}'); - COMMIT; - {{ (.Files.Glob "files/my.cnf").AsConfig | nindent 2 }} -{{- end }} diff --git a/helm/dbrepo/templates/search-configmap.yaml b/helm/dbrepo/templates/search-configmap.yaml new file mode 100644 index 0000000000000000000000000000000000000000..407d7ee90ec6a297b0be728eaba6a68ec22b9b1a --- /dev/null +++ b/helm/dbrepo/templates/search-configmap.yaml @@ -0,0 +1,15 @@ +{{- if .Values.searchservice.enabled }} +{{- if .Values.global.loggingSidecar.enabled }} +apiVersion: v1 +kind: ConfigMap +metadata: + name: search-service-config + namespace: {{ include "common.names.namespace" . | quote }} +data: + fluent-bit.conf: |- + {{- include "dbrepo.logging.sidecarOpensearchService" . | nindent 4 }} + {{- include "dbrepo.logging.sidecarOpensearchInput" . | nindent 4 }} + {{- include "dbrepo.logging.sidecarOpensearchOutput" . | nindent 4 }} + {{- include "dbrepo.logging.sidecarMetricsOutput" . | nindent 4 }} +{{- end }} +{{- end }} \ No newline at end of file diff --git a/helm/dbrepo/templates/search-deployment.yaml b/helm/dbrepo/templates/search-deployment.yaml index 98908f0c4202f31fdbf9e0915a1eeaea866193ad..cdaddbafe0283cdeaf7c12df929c5b9bdf915f81 100644 --- a/helm/dbrepo/templates/search-deployment.yaml +++ b/helm/dbrepo/templates/search-deployment.yaml @@ -18,6 +18,10 @@ spec: service: search-service template: metadata: + annotations: + {{- if .Values.searchservice.podAnnotations }} + {{- include "common.tplvalues.render" (dict "value" .Values.searchservice.podAnnotations "context" $) | nindent 8 }} + {{- end }} labels: app: search-service service: search-service @@ -25,21 +29,6 @@ spec: {{- if .Values.searchservice.podSecurityContext.enabled }} securityContext: {{- include "common.compatibility.renderSecurityContext" (dict "secContext" .Values.searchservice.podSecurityContext "context" $) | nindent 8 }} {{- end }} - initContainers: - - name: init - image: {{ .Values.searchservice.init.image.name }} - imagePullPolicy: {{ .Values.searchservice.init.image.pullPolicy | default "IfNotPresent" }} - {{- if .Values.searchservice.containerSecurityContext.enabled }} - securityContext: {{- include "common.compatibility.renderSecurityContext" (dict "secContext" .Values.searchservice.containerSecurityContext "context" $) | nindent 12 }} - {{- end }} - envFrom: - - secretRef: - name: search-service-secret - {{- if .Values.searchservice.init.resources }} - resources: {{- toYaml .Values.searchservice.init.resources | nindent 12 }} - {{- else if ne .Values.searchservice.init.resourcesPreset "none" }} - resources: {{- include "common.resources.preset" (dict "type" .Values.searchservice.init.resourcesPreset) | nindent 12 }} - {{- end }} containers: - name: search-service image: {{ .Values.searchservice.image.name }} @@ -54,8 +43,10 @@ spec: - secretRef: name: search-service-secret volumeMounts: - - mountPath: /tmp - name: cache + - name: empty-dir + mountPath: /tmp + - name: empty-dir + mountPath: /var/log/app/service/search livenessProbe: exec: command: @@ -77,8 +68,37 @@ spec: {{- else if ne .Values.searchservice.resourcesPreset "none" }} resources: {{- include "common.resources.preset" (dict "type" .Values.searchservice.resourcesPreset) | nindent 12 }} {{- end }} + {{- if .Values.global.loggingSidecar.enabled }} + - name: logging-agent + image: {{ .Values.global.loggingSidecar.image.name }} + imagePullPolicy: {{ .Values.searchservice.image.pullPolicy | default "IfNotPresent" }} + {{- if .Values.searchservice.containerSecurityContext.enabled }} + securityContext: {{- include "common.compatibility.renderSecurityContext" (dict "secContext" .Values.searchservice.containerSecurityContext "context" $) | nindent 12 }} + {{- end }} + volumeMounts: + - name: logging-config + mountPath: /opt/bitnami/fluent-bit/conf/fluent-bit.conf + subPath: fluent-bit.conf + - name: empty-dir + mountPath: /var/log/app/service/search + livenessProbe: + httpGet: + port: 2021 + initialDelaySeconds: 150 + periodSeconds: 10 + readinessProbe: + httpGet: + port: 2021 + initialDelaySeconds: 30 + periodSeconds: 10 + resources: {{- include "common.resources.preset" (dict "type" .Values.global.loggingSidecar.resourcesPreset) | nindent 12 }} + {{- end }} volumes: - - name: cache - emptyDir: - sizeLimit: 100Mi + {{- if .Values.global.loggingSidecar.enabled }} + - name: logging-config + configMap: + name: search-service-config + {{- end }} + - name: empty-dir + emptyDir: { } {{- end }} diff --git a/helm/dbrepo/templates/search-setup-job.yaml b/helm/dbrepo/templates/search-setup-job.yaml new file mode 100644 index 0000000000000000000000000000000000000000..4c01e19e0f54378f699be94627d63d96a10fd632 --- /dev/null +++ b/helm/dbrepo/templates/search-setup-job.yaml @@ -0,0 +1,49 @@ +{{- if .Values.searchservice.enabled }} +--- +apiVersion: batch/v1 +kind: Job +metadata: + name: search-service-setup-job + namespace: {{ include "common.names.namespace" . | quote }} +spec: + backoffLimit: {{ .Values.searchservice.setupJob.backoffLimit | default "10" }} + template: + metadata: + name: search-service-setup-job + spec: + restartPolicy: OnFailure + containers: + - name: init + image: {{ .Values.searchservice.setupJob.image.name }} + imagePullPolicy: {{ .Values.searchservice.setupJob.image.pullPolicy | default "IfNotPresent" }} + {{- if .Values.searchservice.containerSecurityContext.enabled }} + securityContext: {{- include "common.compatibility.renderSecurityContext" (dict "secContext" .Values.searchservice.containerSecurityContext "context" $) | nindent 12 }} + {{- end }} + env: + - name: POD_IP + valueFrom: + fieldRef: + fieldPath: status.podIP + - name: POD_NAME + valueFrom: + fieldRef: + fieldPath: metadata.name + - name: NAMESPACE + valueFrom: + fieldRef: + fieldPath: metadata.namespace + envFrom: + - secretRef: + name: search-service-secret + volumeMounts: + - name: empty-dir + mountPath: /var/log/app/service/search + {{- if .Values.searchservice.setupJob.resources }} + resources: {{- toYaml .Values.searchservice.setupJob.resources | nindent 12 }} + {{- else if ne .Values.searchservice.setupJob.resourcesPreset "none" }} + resources: {{- include "common.resources.preset" (dict "type" .Values.searchservice.setupJob.resourcesPreset) | nindent 12 }} + {{- end }} + volumes: + - name: empty-dir + emptyDir: { } +{{- end }} diff --git a/helm/dbrepo/templates/storage-configmap.yaml b/helm/dbrepo/templates/storage-configmap.yaml new file mode 100644 index 0000000000000000000000000000000000000000..c3d2469e069e029ec4f1efef8fa3cce190d466c0 --- /dev/null +++ b/helm/dbrepo/templates/storage-configmap.yaml @@ -0,0 +1,26 @@ +{{- if .Values.storageservice.setupJob.enabled }} +{{- if .Values.global.loggingSidecar.enabled }} +apiVersion: v1 +kind: ConfigMap +metadata: + name: storage-service-config + namespace: {{ include "common.names.namespace" . | quote }} +data: + fluent-bit.conf: |- + [SERVICE] + Flush 5 + Daemon Off + Log_Level debug + Parsers_File /opt/bitnami/fluent-bit/conf/parsers.conf + [INPUT] + Name tail + Tag * + Path /var/log/app/service/*/*.log + Parser docker + Mem_Buf_Limit 5MB + Buffer_Chunk_size 32k + Buffer_Max_size 32k + {{- include "dbrepo.logging.sidecarOpensearchOutput" . | nindent 4 }} + {{- include "dbrepo.logging.sidecarMetricsOutput" . | nindent 4 }} +{{- end }} +{{- end }} \ No newline at end of file diff --git a/helm/dbrepo/templates/storage-secret.yaml b/helm/dbrepo/templates/storage-secret.yaml index 452baecbf9480295e86fcc3975ab62996431f52c..7df792fc4bd371571ec168250f64e5dce749c690 100644 --- a/helm/dbrepo/templates/storage-secret.yaml +++ b/helm/dbrepo/templates/storage-secret.yaml @@ -7,7 +7,7 @@ metadata: namespace: {{ include "common.names.namespace" . | quote }} stringData: S3_BUCKET: "{{ .Values.storageservice.s3.bucket }}" - STORAGE_ENDPOINT: "{{ .Values.storageservice.init.s3.endpoint }}" + STORAGE_ENDPOINT: "{{ .Values.storageservice.setupJob.s3.endpoint }}" admin_access_key_id: "{{ .Values.storageservice.s3.auth.adminAccessKeyId }}" admin_secret_access_key: "{{ .Values.storageservice.s3.auth.adminSecretAccessKey }}" read_access_key_id: "{{ .Values.storageservice.s3.auth.readAccessKeyId }}" diff --git a/helm/dbrepo/templates/storage-job.yaml b/helm/dbrepo/templates/storage-setup-job.yaml similarity index 71% rename from helm/dbrepo/templates/storage-job.yaml rename to helm/dbrepo/templates/storage-setup-job.yaml index ebc26f22125a10e94d910e0b385729b10b0c3c19..69845b1846deed121c66587413d611ba834b6d9d 100644 --- a/helm/dbrepo/templates/storage-job.yaml +++ b/helm/dbrepo/templates/storage-setup-job.yaml @@ -6,7 +6,7 @@ metadata: name: storage-service-setup-job namespace: {{ include "common.names.namespace" . | quote }} spec: - backoffLimit: {{ .Values.storageservice.init.backoffLimit | default "10" }} + backoffLimit: {{ .Values.storageservice.setupJob.backoffLimit | default "10" }} template: metadata: name: storage-service-setup-job @@ -14,8 +14,8 @@ spec: restartPolicy: OnFailure containers: - name: init - image: {{ .Values.storageservice.init.image.name }} - imagePullPolicy: {{ .Values.storageservice.init.image.pullPolicy | default "IfNotPresent" }} + image: {{ .Values.storageservice.setupJob.image.name }} + imagePullPolicy: {{ .Values.storageservice.setupJob.image.pullPolicy | default "IfNotPresent" }} env: - name: POD_IP valueFrom: @@ -50,14 +50,14 @@ spec: name: storage-service-secret key: STORAGE_ENDPOINT volumeMounts: - - name: app-cache + - name: empty-dir mountPath: /app/config - {{- if .Values.storageservice.init.resources }} - resources: {{- toYaml .Values.storageservice.init.resources | nindent 12 }} - {{- else if ne .Values.storageservice.init.resourcesPreset "none" }} - resources: {{- include "common.resources.preset" (dict "type" .Values.storageservice.init.resourcesPreset) | nindent 12 }} + {{- if .Values.storageservice.setupJob.resources }} + resources: {{- toYaml .Values.storageservice.setupJob.resources | nindent 12 }} + {{- else if ne .Values.storageservice.setupJob.resourcesPreset "none" }} + resources: {{- include "common.resources.preset" (dict "type" .Values.storageservice.setupJob.resourcesPreset) | nindent 12 }} {{- end }} volumes: - - name: app-cache - emptyDir: {} + - name: empty-dir + emptyDir: { } {{- end }} diff --git a/helm/dbrepo/templates/ui-deployment.yaml b/helm/dbrepo/templates/ui-deployment.yaml index 512b3f403f8f18a4949de2c6b8d835f894da46a9..32e2f5905ff9e955a2ca93fafb7824b83b49d969 100644 --- a/helm/dbrepo/templates/ui-deployment.yaml +++ b/helm/dbrepo/templates/ui-deployment.yaml @@ -18,6 +18,10 @@ spec: service: ui template: metadata: + annotations: + {{- if .Values.ui.podAnnotations }} + {{- include "common.tplvalues.render" (dict "value" .Values.ui.podAnnotations "context" $) | nindent 8 }} + {{- end }} labels: app: ui service: ui diff --git a/helm/dbrepo/templates/ui-secret.yaml b/helm/dbrepo/templates/ui-secret.yaml index 54340220811040bad5eb5a4db79d5eb7d18541e7..bf972bca56ec28b6b29827f133974efe41895e67 100644 --- a/helm/dbrepo/templates/ui-secret.yaml +++ b/helm/dbrepo/templates/ui-secret.yaml @@ -1,5 +1,6 @@ {{- if .Values.ui.enabled }} {{ $uploadEndpoint := printf "%s/api/upload/files" .Values.gateway }} +{{ $dashboardEndpoint := printf "%s/dashboard" .Values.gateway }} --- apiVersion: v1 kind: Secret @@ -16,6 +17,7 @@ stringData: NUXT_PUBLIC_BROKER_HOST: "{{ .Values.ui.public.broker.host }}" NUXT_PUBLIC_BROKER_PORT: {{ .Values.ui.public.broker.port | toJson | quote }} NUXT_PUBLIC_BROKER_EXTRA: "{{ .Values.ui.public.broker.extra }}" + NUXT_PUBLIC_DASHBOARD_URL: "{{ .Values.ui.public.dashboard.url | default $dashboardEndpoint }}" NUXT_PUBLIC_DATABASE_EXTRA: "{{ .Values.ui.public.database.extra }}" NUXT_PUBLIC_DOI_ENABLED: "{{ .Values.ui.public.doi.enabled }}" NUXT_PUBLIC_DOI_ENDPOINT: "{{ .Values.ui.public.doi.endpoint }}" diff --git a/helm/dbrepo/templates/ui-service.yaml b/helm/dbrepo/templates/ui-service.yaml index 1ec140db603c075948b18cf933e2f5f322ac6aae..1f4fc63a133f0b3a2cab0241062e07d558270548 100644 --- a/helm/dbrepo/templates/ui-service.yaml +++ b/helm/dbrepo/templates/ui-service.yaml @@ -11,7 +11,7 @@ spec: type: ClusterIP ports: - name: "" - port: 80 + port: 3000 targetPort: 3000 protocol: TCP selector: diff --git a/helm/dbrepo/values.schema.json b/helm/dbrepo/values.schema.json index 804354f21deb634c5055f9c4cc2a310cef0f5db9..141dd1b385a6c05c1b94006223093b92eb8d15be 100644 --- a/helm/dbrepo/values.schema.json +++ b/helm/dbrepo/values.schema.json @@ -63,6 +63,10 @@ }, "type": "object" }, + "podAnnotations": { + "properties": {}, + "type": "object" + }, "podSecurityContext": { "properties": { "enabled": { @@ -126,7 +130,7 @@ "endpoint": { "type": "string" }, - "extraEnvVarsCM": { + "extraEnvVarsSecret": { "type": "string" }, "extraVolumeMounts": { @@ -157,14 +161,6 @@ }, "type": "object" }, - "emptyDir": { - "properties": { - "sizeLimit": { - "type": "string" - } - }, - "type": "object" - }, "name": { "type": "string" } @@ -301,6 +297,39 @@ "extraPlugins": { "type": "string" }, + "extraVolumeMounts": { + "items": { + "properties": { + "mountPath": { + "type": "string" + }, + "name": { + "type": "string" + } + }, + "type": "object" + }, + "type": "array" + }, + "extraVolumes": { + "items": { + "properties": { + "configMap": { + "properties": { + "name": { + "type": "string" + } + }, + "type": "object" + }, + "name": { + "type": "string" + } + }, + "type": "object" + }, + "type": "array" + }, "fullnameOverride": { "type": "string" }, @@ -361,15 +390,10 @@ }, "type": "object" }, - "metrics": { - "properties": { - "enabled": { - "type": "boolean" - } - }, - "type": "object" + "logs": { + "type": "string" }, - "persistence": { + "metrics": { "properties": { "enabled": { "type": "boolean" @@ -415,16 +439,158 @@ "type": "object" }, "type": "array" - }, - "managerPortEnabled": { - "type": "boolean" - }, - "type": { - "type": "string" } }, "type": "object" }, + "sidecars": { + "items": { + "properties": { + "image": { + "type": "string" + }, + "imagePullPolicy": { + "type": "string" + }, + "livenessProbe": { + "properties": { + "httpGet": { + "properties": { + "port": { + "type": "integer" + } + }, + "type": "object" + }, + "initialDelaySeconds": { + "type": "integer" + }, + "periodSeconds": { + "type": "integer" + } + }, + "type": "object" + }, + "name": { + "type": "string" + }, + "readinessProbe": { + "properties": { + "httpGet": { + "properties": { + "port": { + "type": "integer" + } + }, + "type": "object" + }, + "initialDelaySeconds": { + "type": "integer" + }, + "periodSeconds": { + "type": "integer" + } + }, + "type": "object" + }, + "resources": { + "properties": { + "limits": { + "properties": { + "cpu": { + "type": "string" + }, + "ephemeral-storage": { + "type": "string" + }, + "memory": { + "type": "string" + } + }, + "type": "object" + }, + "requests": { + "properties": { + "cpu": { + "type": "string" + }, + "ephemeral-storage": { + "type": "string" + }, + "memory": { + "type": "string" + } + }, + "type": "object" + } + }, + "type": "object" + }, + "securityContext": { + "properties": { + "allowPrivilegeEscalation": { + "type": "boolean" + }, + "capabilities": { + "properties": { + "drop": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "type": "object" + }, + "readOnlyRootFilesystem": { + "type": "boolean" + }, + "runAsGroup": { + "type": "integer" + }, + "runAsNonRoot": { + "type": "boolean" + }, + "runAsUser": { + "type": "integer" + }, + "seLinuxOptions": { + "properties": {}, + "type": "object" + }, + "seccompProfile": { + "properties": { + "type": { + "type": "string" + } + }, + "type": "object" + } + }, + "type": "object" + }, + "volumeMounts": { + "items": { + "properties": { + "mountPath": { + "type": "string" + }, + "name": { + "type": "string" + }, + "subPath": { + "type": "string" + } + }, + "type": "object" + }, + "type": "array" + } + }, + "type": "object" + }, + "type": "array" + }, "virtualHost": { "type": "string" } @@ -442,6 +608,42 @@ }, "type": "object" }, + "dashboarddb": { + "properties": { + "auth": { + "properties": { + "database": { + "type": "string" + }, + "password": { + "type": "string" + }, + "username": { + "type": "string" + } + }, + "type": "object" + }, + "enabled": { + "type": "boolean" + }, + "fullnameOverride": { + "type": "string" + }, + "host": { + "type": "string" + }, + "metrics": { + "properties": { + "enabled": { + "type": "boolean" + } + }, + "type": "object" + } + }, + "type": "object" + }, "dashboardservice": { "properties": { "containerSecurityContext": { @@ -504,24 +706,8 @@ }, "type": "object" }, - "init": { - "properties": { - "image": { - "properties": { - "name": { - "type": "string" - } - }, - "type": "object" - }, - "resources": { - "properties": {}, - "type": "object" - }, - "resourcesPreset": { - "type": "string" - } - }, + "podAnnotations": { + "properties": {}, "type": "object" }, "podSecurityContext": { @@ -553,12 +739,51 @@ }, "resourcesPreset": { "type": "string" + }, + "setupJob": { + "properties": { + "enabled": { + "type": "boolean" + }, + "image": { + "properties": { + "name": { + "type": "string" + } + }, + "type": "object" + }, + "resources": { + "properties": {}, + "type": "object" + }, + "resourcesPreset": { + "type": "string" + } + }, + "type": "object" } }, "type": "object" }, "dashboardui": { "properties": { + "dashboardsProvider": { + "properties": { + "enabled": { + "type": "boolean" + } + }, + "type": "object" + }, + "datasources": { + "properties": { + "secretName": { + "type": "string" + } + }, + "type": "object" + }, "enabled": { "type": "boolean" }, @@ -570,9 +795,26 @@ }, "grafana": { "properties": { + "extraConfigmaps": { + "items": { + "properties": { + "mountPath": { + "type": "string" + }, + "name": { + "type": "string" + } + }, + "type": "object" + }, + "type": "array" + }, "extraEnvVarsSecret": { "type": "string" }, + "replicaCount": { + "type": "integer" + }, "updateStrategy": { "properties": { "type": { @@ -605,6 +847,14 @@ } }, "type": "object" + }, + "persistence": { + "properties": { + "enabled": { + "type": "boolean" + } + }, + "type": "object" } }, "type": "object" @@ -675,6 +925,17 @@ }, "type": "object" }, + "readonlyUser": { + "properties": { + "password": { + "type": "string" + }, + "user": { + "type": "string" + } + }, + "type": "object" + }, "replicaCount": { "type": "integer" }, @@ -768,6 +1029,10 @@ }, "type": "object" }, + "podAnnotations": { + "properties": {}, + "type": "object" + }, "podSecurityContext": { "properties": { "enabled": { @@ -862,6 +1127,39 @@ "existingServerBlockConfigmap": { "type": "string" }, + "extraVolumeMounts": { + "items": { + "properties": { + "mountPath": { + "type": "string" + }, + "name": { + "type": "string" + } + }, + "type": "object" + }, + "type": "array" + }, + "extraVolumes": { + "items": { + "properties": { + "configMap": { + "properties": { + "name": { + "type": "string" + } + }, + "type": "object" + }, + "name": { + "type": "string" + } + }, + "type": "object" + }, + "type": "array" + }, "fullnameOverride": { "type": "string" }, @@ -883,6 +1181,154 @@ } }, "type": "object" + }, + "sidecars": { + "items": { + "properties": { + "image": { + "type": "string" + }, + "imagePullPolicy": { + "type": "string" + }, + "livenessProbe": { + "properties": { + "httpGet": { + "properties": { + "port": { + "type": "integer" + } + }, + "type": "object" + }, + "initialDelaySeconds": { + "type": "integer" + }, + "periodSeconds": { + "type": "integer" + } + }, + "type": "object" + }, + "name": { + "type": "string" + }, + "readinessProbe": { + "properties": { + "httpGet": { + "properties": { + "port": { + "type": "integer" + } + }, + "type": "object" + }, + "initialDelaySeconds": { + "type": "integer" + }, + "periodSeconds": { + "type": "integer" + } + }, + "type": "object" + }, + "resources": { + "properties": { + "limits": { + "properties": { + "cpu": { + "type": "string" + }, + "ephemeral-storage": { + "type": "string" + }, + "memory": { + "type": "string" + } + }, + "type": "object" + }, + "requests": { + "properties": { + "cpu": { + "type": "string" + }, + "ephemeral-storage": { + "type": "string" + }, + "memory": { + "type": "string" + } + }, + "type": "object" + } + }, + "type": "object" + }, + "securityContext": { + "properties": { + "allowPrivilegeEscalation": { + "type": "boolean" + }, + "capabilities": { + "properties": { + "drop": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "type": "object" + }, + "readOnlyRootFilesystem": { + "type": "boolean" + }, + "runAsGroup": { + "type": "integer" + }, + "runAsNonRoot": { + "type": "boolean" + }, + "runAsUser": { + "type": "integer" + }, + "seLinuxOptions": { + "properties": {}, + "type": "object" + }, + "seccompProfile": { + "properties": { + "type": { + "type": "string" + } + }, + "type": "object" + } + }, + "type": "object" + }, + "volumeMounts": { + "items": { + "properties": { + "mountPath": { + "type": "string" + }, + "name": { + "type": "string" + }, + "subPath": { + "type": "string" + } + }, + "type": "object" + }, + "type": "array" + } + }, + "type": "object" + }, + "type": "array" } }, "type": "object" @@ -902,6 +1348,25 @@ }, "type": "object" }, + "loggingSidecar": { + "properties": { + "enabled": { + "type": "boolean" + }, + "image": { + "properties": { + "name": { + "type": "string" + } + }, + "type": "object" + }, + "resourcesPreset": { + "type": "string" + } + }, + "type": "object" + }, "storageClass": { "type": "string" } @@ -1012,6 +1477,10 @@ }, "type": "object" }, + "podAnnotations": { + "properties": {}, + "type": "object" + }, "podSecurityContext": { "properties": { "enabled": { @@ -1076,9 +1545,6 @@ }, "metadatadb": { "properties": { - "configurationConfigMap": { - "type": "string" - }, "db": { "properties": { "name": { @@ -1265,6 +1731,10 @@ }, "type": "object" }, + "podAnnotations": { + "properties": {}, + "type": "object" + }, "podSecurityContext": { "properties": { "enabled": { @@ -1345,14 +1815,6 @@ "properties": { "enabled": { "type": "boolean" - }, - "service": { - "properties": { - "type": { - "type": "string" - } - }, - "type": "object" } }, "type": "object" @@ -1419,6 +1881,14 @@ } }, "type": "object" + }, + "updateStrategy": { + "properties": { + "type": { + "type": "string" + } + }, + "type": "object" } }, "type": "object" @@ -1566,24 +2036,8 @@ }, "type": "object" }, - "init": { - "properties": { - "image": { - "properties": { - "name": { - "type": "string" - } - }, - "type": "object" - }, - "resources": { - "properties": {}, - "type": "object" - }, - "resourcesPreset": { - "type": "string" - } - }, + "podAnnotations": { + "properties": {}, "type": "object" }, "podSecurityContext": { @@ -1615,28 +2069,12 @@ }, "resourcesPreset": { "type": "string" - } - }, - "type": "object" - }, - "storageservice": { - "properties": { - "enabled": { - "type": "boolean" }, - "filer": { + "setupJob": { "properties": { "enabled": { "type": "boolean" - } - }, - "type": "object" - }, - "fullnameOverride": { - "type": "string" - }, - "init": { - "properties": { + }, "image": { "properties": { "name": { @@ -1651,17 +2089,28 @@ }, "resourcesPreset": { "type": "string" - }, - "s3": { - "properties": { - "endpoint": { - "type": "string" - } - }, - "type": "object" } }, "type": "object" + } + }, + "type": "object" + }, + "storageservice": { + "properties": { + "enabled": { + "type": "boolean" + }, + "filer": { + "properties": { + "enabled": { + "type": "boolean" + } + }, + "type": "object" + }, + "fullnameOverride": { + "type": "string" }, "mariadb": { "properties": { @@ -1734,6 +2183,37 @@ }, "type": "object" }, + "setupJob": { + "properties": { + "enabled": { + "type": "boolean" + }, + "image": { + "properties": { + "name": { + "type": "string" + } + }, + "type": "object" + }, + "resources": { + "properties": {}, + "type": "object" + }, + "resourcesPreset": { + "type": "string" + }, + "s3": { + "properties": { + "endpoint": { + "type": "string" + } + }, + "type": "object" + } + }, + "type": "object" + }, "volume": { "properties": { "enabled": { @@ -1827,6 +2307,10 @@ }, "type": "object" }, + "podAnnotations": { + "properties": {}, + "type": "object" + }, "podSecurityContext": { "properties": { "enabled": { @@ -1888,6 +2372,14 @@ }, "type": "object" }, + "dashboard": { + "properties": { + "url": { + "type": "string" + } + }, + "type": "object" + }, "database": { "properties": { "extra": { diff --git a/helm/dbrepo/values.yaml b/helm/dbrepo/values.yaml index 62ce16d3de3933c1be25c7a5602ff55be9c5cbbe..23b6b000a934ece14d99c72ea2b9fdb2bcf18bbb 100644 --- a/helm/dbrepo/values.yaml +++ b/helm/dbrepo/values.yaml @@ -12,6 +12,14 @@ global: adaptSecurityContext: auto ## @param global.storageClass Global StorageClass for Persistent Volume(s) storageClass: "" + loggingSidecar: + ## @param global.loggingSidecar.enabled Enable the logging sidecars for the analyse-, dashboard-, data-, gateway-, metadata- and search service. + enabled: true + image: + ## @param global.loggingSidecar.image.name The logging sidecar image. + name: docker.io/bitnami/fluent-bit:4.0.0 + ## @param global.loggingSidecar.resourcesPreset The resource definitions for the logging sidecar. + resourcesPreset: nano ## @section Common parameters @@ -27,7 +35,7 @@ clusterDomain: cluster.local ## @section Metadata Database metadatadb: - ## @param metadatadb.enabled Enable the Metadata datadb. + ## @param metadatadb.enabled Enable the Metadata Database. enabled: true ## @skip metadatadb.fullnameOverride fullnameOverride: metadata-db @@ -56,8 +64,6 @@ metadatadb: enabled: true ## @skip metadatadb.initdbScriptsConfigMap The initial database scripts. initdbScriptsConfigMap: metadata-db-config - ## @param metadatadb.configurationConfigMap The database configuration files. - configurationConfigMap: metadata-db-config ## @param metadatadb.extraInitDbScripts Additional init.db scripts that are executed on the first start. extraInitDbScripts: { } # 03-additional-data.sql: | @@ -65,13 +71,33 @@ metadatadb: # INSERT INTO `mdb_containers` (name, internal_name, image_id, host, port, sidecar_host, sidecar_port, privileged_username, privileged_password) # VALUES ('MariaDB Galera TEST', 'mariadb_11_1_3', 1, 'data-db', 3306, 'data-db', 80, 'root', 'dbrepo'); # COMMIT; - ## @param metadatadb.replicaCount The number of cluster nodes, should be uneven i.e. 2n+1 - replicaCount: 3 ## @param metadatadb.resourcesPreset The container resource preset - resourcesPreset: "nano-hm" + resourcesPreset: "xlarge" persistence: ## @param metadatadb.persistence.enabled Enable persistent storage. enabled: true + ## @param metadatadb.replicaCount The number of cluster nodes, should be uneven i.e. 2n+1 + replicaCount: 1 + +## @section Dashboard Database Enable the Dashboard Database. + +dashboarddb: + ## @param dashboarddb.enabled + enabled: true + ## @skip dashboarddb.fullnameOverride + fullnameOverride: dashboard-db + ## @param dashboarddb.host The hostname for the microservices. + host: dashboard-db:5432 + metrics: + ## @skip dashboarddb.metrics.enabled + enabled: true + auth: + ## @param dashboarddb.auth.database The dashboard database name. + database: grafana + ## @param dashboarddb.auth.username The dashboard database username. + username: grafana + ## @param dashboarddb.auth.password The dashboard database user password. + password: dbrepo ## @section Auth Service @@ -115,7 +141,7 @@ authservice: setupJob: image: ## @skip authservice.setupJob.image.name - name: registry.datalab.tuwien.ac.at/dbrepo/auth-service-init:1.8.1 + name: registry.datalab.tuwien.ac.at/dbrepo/auth-service-init:1.9.0 ## @param authservice.setupJob.resourcesPreset The container resource preset resourcesPreset: "nano" ## @param authservice.setupJob.resources Set container requests and limits for different resources like CPU or memory (essential for production workloads) @@ -126,29 +152,24 @@ authservice: ## limits: ## cpu: 500m ## memory: 1024Mi - ## @skip authservice.extraEnvVarsCM - extraEnvVarsCM: auth-service-config + ## @skip authservice.extraEnvVarsSecret + extraEnvVarsSecret: auth-service-secret ## @skip authservice.extraVolumes extraVolumes: - - name: config-map + - name: config configMap: name: auth-service-config - - name: cache - emptyDir: - sizeLimit: 100Mi ## @skip authservice.extraVolumeMounts extraVolumeMounts: - - name: config-map + - name: config mountPath: /opt/keycloak/data/import/dbrepo-realm.json subPath: dbrepo-realm.json - - name: config-map + - name: config mountPath: /opt/keycloak/data/import/master-realm.json subPath: master-realm.json - - name: config-map + - name: config mountPath: /opt/bitnami/keycloak/providers/create-event-listener.jar subPath: create-event-listener.jar - - name: cache - mountPath: /bitnami/keycloak/ ## @skip authservice.replicaCount The number of replicas. replicaCount: 2 @@ -168,6 +189,11 @@ datadb: user: root ## @param datadb.rootUser.password The root user password. password: dbrepo + readonlyUser: + ## @param datadb.readonlyUser.user The readonly username. + user: readonly + ## @param datadb.readonlyUser.password The readonly password. + password: readonly db: ## @param datadb.db.name The database name. name: dbrepo @@ -187,9 +213,9 @@ datadb: ## @skip datadb.metrics.enabled The Prometheus settings. enabled: true ## @param datadb.replicaCount The number of cluster nodes, should be uneven i.e. 2n+1 - replicaCount: 3 + replicaCount: 1 ## @param datadb.resourcesPreset The container resource preset - resourcesPreset: "nano-hm" + resourcesPreset: "xlarge" ## @param datadb.initdbScriptsConfigMap The setup data to load into the database on first start. initdbScriptsConfigMap: "data-db-setup" persistence: @@ -275,7 +301,7 @@ brokerservice: servers: - identity-service ## @skip brokerservice.ldap.port - port: 389 + port: 1389 ## @param brokerservice.ldap.binddn The domain name the broker service should bind to. In many cases this is the admin user from `identityservice.global.adminUser`. binddn: cn=admin,dc=dbrepo,dc=at ## @param brokerservice.ldap.bindpw The password to bind on the identity service. In many cases this value is equal to `identityservice.global.adminPassword`. @@ -305,23 +331,84 @@ brokerservice: existingSecret: broker-service-secret ## @param brokerservice.extraPlugins The list of plugins to be activated. extraPlugins: rabbitmq_prometheus rabbitmq_auth_backend_ldap rabbitmq_auth_mechanism_ssl rabbitmq_mqtt - persistence: - ## @param brokerservice.persistence.enabled If set to true, a PVC will be created. - enabled: false - ## @skip brokerservice.service service: - type: ClusterIP - managerPortEnabled: true + ## @skip brokerservice.service.extraPorts extraPorts: - name: mqtt port: 1883 targetPort: 1883 # loadBalancerIP: + ## @skip brokerservice.logs + logs: "" ## @param brokerservice.extraConfiguration The extra configuration for MQTT extraConfiguration: | + # https://www.rabbitmq.com/docs/logging#log-message-categories + log.connection.level = warning + log.file = /opt/bitnami/rabbitmq/var/log/rabbitmq/app.log + log.file.formatter = json + log.file.level = info + # rotate when the file reaches 10 MiB + log.file.rotation.size = 10485760 + # keep up to 5 archived log files in addition to the current one + log.file.rotation.count = 5 mqtt.vhost = dbrepo mqtt.exchange = dbrepo mqtt.prefetch = 10 + ## @skip brokerservice.sidecars + sidecars: + - name: logging-agent + image: docker.io/bitnami/fluent-bit:4.0.0 + imagePullPolicy: IfNotPresent + securityContext: + allowPrivilegeEscalation: false + capabilities: + drop: + - ALL + readOnlyRootFilesystem: false + runAsGroup: 1001 + runAsNonRoot: true + runAsUser: 1001 + seLinuxOptions: { } + seccompProfile: + type: RuntimeDefault + volumeMounts: + - name: logging-config + mountPath: /opt/bitnami/fluent-bit/conf/fluent-bit.conf + subPath: fluent-bit.conf + - name: logging-config + mountPath: /opt/bitnami/fluent-bit/conf/parsers.conf + subPath: parsers.conf + - name: empty-dir + mountPath: /opt/bitnami/rabbitmq/var/log/rabbitmq + subPath: app-logs-dir + livenessProbe: + httpGet: + port: 2021 + initialDelaySeconds: 150 + periodSeconds: 10 + readinessProbe: + httpGet: + port: 2021 + initialDelaySeconds: 30 + periodSeconds: 10 + resources: + requests: + cpu: 100m + memory: 128Mi + ephemeral-storage: 50Mi + limits: + cpu: 150m + memory: 192Mi + ephemeral-storage: 2Gi + ## @skip brokerservice.extraVolumes + extraVolumes: + - name: logging-config + configMap: + name: broker-service-config + ## @skip brokerservice.extraVolumeMounts + extraVolumeMounts: + - name: logging-config + mountPath: /tmp/rabbitmq # irrelevant but needed from bitnami chart ## @param brokerservice.replicaCount The number of replicas. replicaCount: 1 @@ -332,7 +419,10 @@ analyseservice: enabled: true image: ## @skip analyseservice.image.name - name: registry.datalab.tuwien.ac.at/dbrepo/analyse-service:1.8.1 + name: registry.datalab.tuwien.ac.at/dbrepo/analyse-service:1.9.0 + ## @param analyseservice.podAnnotations the pod annotations. Evaluated as a template + ## ref: https://kubernetes.io/docs/concepts/overview/working-with-objects/annotations/ + podAnnotations: { } ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/#set-the-security-context-for-a-pod podSecurityContext: ## @param analyseservice.podSecurityContext.enabled Enable pods' Security Context @@ -393,7 +483,10 @@ metadataservice: enabled: true image: ## @skip metadataservice.image.name - name: registry.datalab.tuwien.ac.at/dbrepo/metadata-service:1.8.1 + name: registry.datalab.tuwien.ac.at/dbrepo/metadata-service:1.9.0 + ## @param metadataservice.podAnnotations the pod annotations. Evaluated as a template + ## ref: https://kubernetes.io/docs/concepts/overview/working-with-objects/annotations/ + podAnnotations: { } ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/#set-the-security-context-for-a-pod podSecurityContext: ## @param metadataservice.podSecurityContext.enabled Enable pods' Security Context @@ -490,7 +583,10 @@ dataservice: endpoint: http://data-service image: ## @skip dataservice.image.name - name: registry.datalab.tuwien.ac.at/dbrepo/data-service:1.8.1 + name: registry.datalab.tuwien.ac.at/dbrepo/data-service:1.9.0 + ## @param dataservice.podAnnotations the pod annotations. Evaluated as a template + ## ref: https://kubernetes.io/docs/concepts/overview/working-with-objects/annotations/ + podAnnotations: { } ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/#set-the-security-context-for-a-pod podSecurityContext: ## @param dataservice.podSecurityContext.enabled Enable pods' Security Context @@ -576,7 +672,10 @@ searchservice: endpoint: http://search-service image: ## @skip searchservice.image.name - name: registry.datalab.tuwien.ac.at/dbrepo/search-service:1.8.1 + name: registry.datalab.tuwien.ac.at/dbrepo/search-service:1.9.0 + ## @param searchservice.podAnnotations the pod annotations. Evaluated as a template + ## ref: https://kubernetes.io/docs/concepts/overview/working-with-objects/annotations/ + podAnnotations: { } ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/#set-the-security-context-for-a-pod podSecurityContext: ## @param searchservice.podSecurityContext.enabled Enable pods' Security Context @@ -620,13 +719,15 @@ searchservice: ## limits: ## cpu: 500m ## memory: 1024Mi - init: + setupJob: + ## @param searchservice.setupJob.enabled Enable the setup job that syncs missing databases from the Metadata Database into the Search Database. + enabled: true image: - ## @skip searchservice.init.image.name - name: registry.datalab.tuwien.ac.at/dbrepo/search-service-init:1.8.1 - ## @param searchservice.init.resourcesPreset The container resource preset + ## @skip searchservice.setupJob.image.name + name: registry.datalab.tuwien.ac.at/dbrepo/search-service-init:1.9.0 + ## @param searchservice.setupJob.resourcesPreset The container resource preset resourcesPreset: "nano" - ## @param searchservice.init.resources Set container requests and limits for different resources like CPU or memory (essential for production workloads) + ## @param searchservice.setupJob.resources Set container requests and limits for different resources like CPU or memory (essential for production workloads) resources: { } ## requests: ## cpu: 250m @@ -681,16 +782,18 @@ storageservice: readAccessKeyId: seaweedfsuser ## @param storageservice.s3.auth.readSecretAccessKey The S3 secret access key for the read only user. readSecretAccessKey: seaweedfsuser - init: + setupJob: + ## @param storageservice.setupJob.enabled Enable the setup job that creates the bucket in the s3 endpoint. + enabled: true image: - ## @skip storageservice.init.image.name - name: registry.datalab.tuwien.ac.at/dbrepo/storage-service-init:1.8.1 + ## @skip storageservice.setupJob.image.name + name: registry.datalab.tuwien.ac.at/dbrepo/storage-service-init:1.9.0 s3: - ## @param storageservice.init.s3.endpoint The S3-capable endpoint the microservice connects to. + ## @param storageservice.setupJob.s3.endpoint The S3-capable endpoint the microservice connects to. endpoint: http://storage-service-s3:8333 - ## @param storageservice.init.resourcesPreset The container resource preset + ## @param storageservice.setupJob.resourcesPreset The container resource preset resourcesPreset: "nano" - ## @param storageservice.init.resources Set container requests and limits for different resources like CPU or memory (essential for production workloads) + ## @param storageservice.setupJob.resources Set container requests and limits for different resources like CPU or memory (essential for production workloads) resources: { } ## requests: ## cpu: 250m @@ -716,6 +819,9 @@ identityservice: adminPassword: admin ## @skip identityservice.global.configUserEnabled configUserEnabled: false + ## @param identityservice.podAnnotations the pod annotations. Evaluated as a template + ## ref: https://kubernetes.io/docs/concepts/overview/working-with-objects/annotations/ + podAnnotations: { } ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/#set-the-security-context-for-a-pod podSecurityContext: ## @param identityservice.podSecurityContext.enabled Enable pods' Security Context @@ -793,7 +899,7 @@ ui: enabled: true image: ## @skip ui.image.name - name: registry.datalab.tuwien.ac.at/dbrepo/ui:1.8.1 + name: registry.datalab.tuwien.ac.at/dbrepo/ui:1.9.0 ## https://stackblitz.com/edit/nuxt-oidc-auth-keygen?file=index.js oidc: ## @param ui.oidc.authSessionSecret This should be a at least 48 characters random string. It is used to encrypt the user session. @@ -802,6 +908,9 @@ ui: sessionSecret: TjOH1lFnocixYmy5ol2I5cOdsYUdrd5_jZsGxo6aMVPNNDkh ## @param ui.oidc.tokenKey This needs to be a random cryptographic AES key in base64. Used to encrypt the server side token store. You can generate a key in JS with await subtle.exportKey('raw', await subtle.generateKey({ name: 'AES-GCM', length: 256, }, true, ['encrypt', 'decrypt'])). You just have to encode it to base64 afterwards. tokenKey: data:;base64,ntxOAfrF6yw22Ec1AFHK21iFz7L3PZmz9857Uqwyme0= + ## @param ui.podAnnotations the pod annotations. Evaluated as a template + ## ref: https://kubernetes.io/docs/concepts/overview/working-with-objects/annotations/ + podAnnotations: { } ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/#set-the-security-context-for-a-pod podSecurityContext: ## @param ui.podSecurityContext.enabled Enable pods' Security Context @@ -848,12 +957,15 @@ ui: ## @skip ui.resources public: api: - ## @param ui.public.api.client The endpoint for the client api. Defaults to the value of `gateway`. + ## @param ui.public.api.client The endpoint for the client api. Overrides to the value of `gateway`. client: "" - ## @param ui.public.api.server The endpoint for the server api. Defaults to the value of `gateway`. + ## @param ui.public.api.server The endpoint for the server api. Overrides to the value of `gateway`. server: "" + dashboard: + ## @param ui.public.dashboard.url The url for the dashboard. Overrides to the value of `gateway` and path `/dashboard`. + url: "" upload: - ## @param ui.public.upload.client The endpoint for the upload client. Defaults to the value of `gateway` and path `/api/upload/files`. + ## @param ui.public.upload.client The endpoint for the upload client. Overrides to the value of `gateway` and path `/api/upload/files`. client: "" ## @param ui.public.title The user interface title. title: "Database Repository" @@ -908,9 +1020,12 @@ dashboardservice: enabled: true image: ## @skip dashboardservice.image.name - name: registry.datalab.tuwien.ac.at/dbrepo/dashboard-service:1.8.1 + name: registry.datalab.tuwien.ac.at/dbrepo/dashboard-service:1.9.0 ## @param dashboardservice.endpoint The endpoint for the microservices. endpoint: http://dashboard-service + ## @param dashboardservice.podAnnotations the pod annotations. Evaluated as a template + ## ref: https://kubernetes.io/docs/concepts/overview/working-with-objects/annotations/ + podAnnotations: { } ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/#set-the-security-context-for-a-pod podSecurityContext: ## @param dashboardservice.podSecurityContext.enabled Enable pods' Security Context @@ -955,13 +1070,15 @@ dashboardservice: ## cpu: 500m ## memory: 1024Mi ## @param dashboardservice.replicaCount The number of replicas. - init: + setupJob: + ## @param dashboardservice.setupJob.enabled Enable the setup job that creates dashboards for existing databases in the Dashboard UI. + enabled: true image: - ## @skip dashboardservice.init.image.name - name: registry.datalab.tuwien.ac.at/dbrepo/dashboard-service-init:1.8.1 - ## @param dashboardservice.init.resourcesPreset The container resource preset + ## @skip dashboardservice.setupJob.image.name + name: registry.datalab.tuwien.ac.at/dbrepo/dashboard-service-init:1.9.0 + ## @param dashboardservice.setupJob.resourcesPreset The container resource preset resourcesPreset: "nano" - ## @param dashboardservice.init.resources Set container requests and limits for different resources like CPU or memory (essential for production workloads) + ## @param dashboardservice.setupJob.resources Set container requests and limits for different resources like CPU or memory (essential for production workloads) resources: { } ## requests: ## cpu: 250m @@ -983,7 +1100,13 @@ dashboardui: ## @param dashboardui.metrics.enabled Enable the metrics sidecar. enabled: true ## @param dashboardui.endpoint The endpoint for the microservices. - endpoint: http://dashboard-ui + endpoint: http://dashboard-ui:3000 + datasources: + ## @skip dashboardui.datasources.secretName + secretName: dashboard-ui-datasources-secret + dashboardsProvider: + ## @skip dashboardui.dashboardsProvider.enabled + enabled: true ldap: ## @skip dashboardui.ldap.enabled enabled: true @@ -997,6 +1120,15 @@ dashboardui: type: Recreate ## @skip dashboardui.grafana.extraEnvVarsSecret extraEnvVarsSecret: dashboard-ui-secret + ## @skip dashboardui.grafana.extraConfigmaps + extraConfigmaps: + - name: dashboard-ui-config + mountPath: /opt/bitnami/grafana/dashboards + ## @param dashboardui.grafana.replicaCount The number of replicas. + replicaCount: 2 + persistence: + ## @skip dashboardui.persistence.enabled + enabled: false ## @section Metric Service @@ -1010,13 +1142,13 @@ metricdb: alertmanager: ## @skip metricdb.alertmanager.enabled enabled: false - service: - ## @skip metricdb.alertmanager.service.type - type: ClusterIP server: rbac: ## @skip metricdb.server.rbac.create create: false + updateStrategy: + ## @skip metricdb.server.updateStrategy.type + type: Recreate service: ## @skip metricdb.server.service.type type: ClusterIP @@ -1028,15 +1160,28 @@ metricdb: - job_name: 'actuator scrape' metrics_path: '/actuator/prometheus' static_configs: - - targets: [ 'data-service:80', 'metadata-service:80' ] + - targets: + - data-service + - metadata-service - job_name: 'metrics scrape' metrics_path: '/metrics' static_configs: - - targets: [ 'ui:80', 'auth-service-metrics:8080', 'analyse-service:80', 'search-service:80', 'data-db-metrics:9104', 'broker-service:9419', 'metadata-db-metrics:9104', 'storage-service-master-metrics:9327', 'upload-service:80' ] - - job_name: 'dashboard scrape' - metrics_path: '/dashboard/metrics' + - targets: + - analyse-service + - auth-service-metrics:9000 + - broker-service:9419 + - dashboard-db-metrics:9187 + - dashboard-service + - data-db-metrics:9104 + - metadata-db-metrics:9104 + - search-service + - storage-service-master-metrics:9327 + - ui:3000 + - job_name: 'realm scrape' + metrics_path: '/realms/dbrepo/metrics' static_configs: - - targets: [ 'dashboard-service' ] + - targets: + - auth-service-metrics:8080 ## @section Gateway Service @@ -1053,6 +1198,59 @@ gatewayservice: enabled: false ## @param gatewayservice.existingServerBlockConfigmap The extra configuration for the reverse proxy existingServerBlockConfigmap: gateway-service-setup + ## @skip gatewayservice.sidecars + sidecars: + - name: logging-agent + image: docker.io/bitnami/fluent-bit:4.0.0 + imagePullPolicy: IfNotPresent + securityContext: + allowPrivilegeEscalation: false + capabilities: + drop: + - ALL + readOnlyRootFilesystem: false + runAsGroup: 1001 + runAsNonRoot: true + runAsUser: 1001 + seLinuxOptions: { } + seccompProfile: + type: RuntimeDefault + volumeMounts: + - name: logging-config + mountPath: /opt/bitnami/fluent-bit/conf/fluent-bit.conf + subPath: fluent-bit.conf + - name: empty-dir + mountPath: /var/log/nginx/ + livenessProbe: + httpGet: + port: 2021 + initialDelaySeconds: 150 + periodSeconds: 10 + readinessProbe: + httpGet: + port: 2021 + initialDelaySeconds: 30 + periodSeconds: 10 + resources: + requests: + cpu: 100m + memory: 128Mi + ephemeral-storage: 50Mi + limits: + cpu: 150m + memory: 192Mi + ephemeral-storage: 2Gi + ## @skip gatewayservice.extraVolumes + extraVolumes: + - name: logging-config + configMap: + name: gateway-service-config + ## @skip gatewayservice.extraVolumeMounts + extraVolumeMounts: + - name: empty-dir + mountPath: /var/log/nginx + - name: logging-config + mountPath: /app # irrelevant but needed from bitnami chart ## @param gatewayservice.replicaCount The number of replicas. replicaCount: 3 @@ -1062,6 +1260,7 @@ computeservice: ## @param computeservice.endpoint Configure the number of parallel workers with local[n] endpoint: local[2] + ## @section Ingress ingress: diff --git a/helm/seaweedfs/CHANGELOG.md b/helm/seaweedfs/CHANGELOG.md index e880917876b0c345b35c2706b379a006bc41de99..ac474a8e78abe8978ad2659e5267ecdccb43b6bb 100644 --- a/helm/seaweedfs/CHANGELOG.md +++ b/helm/seaweedfs/CHANGELOG.md @@ -1,8 +1,102 @@ # Changelog +## 4.8.7 (2025-05-07) + +* [bitnami/seaweedfs] Release 4.8.7 ([#33539](https://github.com/bitnami/charts/pull/33539)) + +## <small>4.8.6 (2025-05-06)</small> + +* [bitnami/seaweedfs] chore: :recycle: :arrow_up: Update common and remove k8s < 1.23 references (#334 ([3789e42](https://github.com/bitnami/charts/commit/3789e42484b6f398325c81a52f273d9218129b89)), closes [#33434](https://github.com/bitnami/charts/issues/33434) + +## <small>4.8.5 (2025-05-05)</small> + +* [bitnami/seaweedfs] Release 4.8.5 (#33315) ([af40402](https://github.com/bitnami/charts/commit/af40402b56235183cc899c55777c0267e0c50312)), closes [#33315](https://github.com/bitnami/charts/issues/33315) + +## <small>4.8.4 (2025-05-02)</small> + +* [bitnami/seaweedfs] Release 4.8.4 (#33300) ([6078309](https://github.com/bitnami/charts/commit/60783099201f5864d286b6da2f272c5c9bdfa1db)), closes [#33300](https://github.com/bitnami/charts/issues/33300) + +## <small>4.8.3 (2025-04-02)</small> + +* [bitnami/*] Add tanzuCategory annotation (#32409) ([a8fba5c](https://github.com/bitnami/charts/commit/a8fba5cb01f6f4464ca7f69c50b0fbe97d837a95)), closes [#32409](https://github.com/bitnami/charts/issues/32409) +* [bitnami/seaweedfs] Release 4.8.3 (#32763) ([e6f401a](https://github.com/bitnami/charts/commit/e6f401a180a1ba2452c52072192119442b72c8a5)), closes [#32763](https://github.com/bitnami/charts/issues/32763) + +## <small>4.8.2 (2025-03-10)</small> + +* [bitnami/seaweedfs]: fix README for loglevel (#31735) ([b537041](https://github.com/bitnami/charts/commit/b53704137dc1722164ee6cd3c60968bc7154abb3)), closes [#31735](https://github.com/bitnami/charts/issues/31735) + +## <small>4.8.1 (2025-03-05)</small> + +* [bitnami/seaweedfs] Release 4.8.1 (#32317) ([f248247](https://github.com/bitnami/charts/commit/f248247c983ac0c353a3ddc214dba911883b11a2)), closes [#32317](https://github.com/bitnami/charts/issues/32317) + +## 4.8.0 (2025-03-03) + +* [bitnami/seaweedfs] Add support for `s3.allowEmptyFolder` (#32234) ([ce208fa](https://github.com/bitnami/charts/commit/ce208faae53c07ca52f4f239604f37af7ae1786a)), closes [#32234](https://github.com/bitnami/charts/issues/32234) + +## 4.7.0 (2025-02-24) + +* [bitnami/seaweedfs] Set `usePasswordFiles=true` by default (#32119) ([dbc5cb6](https://github.com/bitnami/charts/commit/dbc5cb6ebacef3036f8bbb32ae1d761f171b8bdd)), closes [#32119](https://github.com/bitnami/charts/issues/32119) + +## <small>4.6.2 (2025-02-20)</small> + +* [bitnami/seaweedfs] Release 4.6.2 (#32035) ([efa99db](https://github.com/bitnami/charts/commit/efa99db7094cc5f19ec968634b5a87850c40cb73)), closes [#32035](https://github.com/bitnami/charts/issues/32035) + +## <small>4.6.1 (2025-02-12)</small> + +* [bitnami/*] Use CDN url for the Bitnami Application Icons (#31881) ([d9bb11a](https://github.com/bitnami/charts/commit/d9bb11a9076b9bfdcc70ea022c25ef50e9713657)), closes [#31881](https://github.com/bitnami/charts/issues/31881) +* [bitnami/seaweedfs] Release 4.6.1 (#31902) ([f15c5ed](https://github.com/bitnami/charts/commit/f15c5ed37c1829961a0ba4391809c524237382fb)), closes [#31902](https://github.com/bitnami/charts/issues/31902) +* [bitnami/seaweedfs]: correct typo in README (#31867) ([bb5c61b](https://github.com/bitnami/charts/commit/bb5c61b6fe4c89ac0b115b63ebed43b312f31809)), closes [#31867](https://github.com/bitnami/charts/issues/31867) + +## 4.6.0 (2025-02-05) + +* [bitnami/seaweedfs] Add support for log persistence (#31793) ([2561c2a](https://github.com/bitnami/charts/commit/2561c2aaba3b08507f1c10bdae3b933d74f01427)), closes [#31793](https://github.com/bitnami/charts/issues/31793) + +## <small>4.5.5 (2025-02-05)</small> + +* [bitnami/seaweedfs] Release 4.5.5 (#31779) ([db2813f](https://github.com/bitnami/charts/commit/db2813f08e07f03142c8acd5b587c47bf66a0057)), closes [#31779](https://github.com/bitnami/charts/issues/31779) + +## <small>4.5.4 (2025-02-03)</small> + +* [bitnami/seaweedfs] Release 4.5.4 (#31718) ([b4de2a7](https://github.com/bitnami/charts/commit/b4de2a7edbae2d1bba926a18ffc1415c39a5ca9d)), closes [#31718](https://github.com/bitnami/charts/issues/31718) + +## <small>4.5.3 (2025-02-03)</small> + +* [bitnami/seaweedfs] Release 4.5.3 (#31700) ([6752afa](https://github.com/bitnami/charts/commit/6752afab2f7805c38dfca3ab7e75afffcb0db3e7)), closes [#31700](https://github.com/bitnami/charts/issues/31700) +* Update copyright year (#31682) ([e9f02f5](https://github.com/bitnami/charts/commit/e9f02f5007068751f7eb2270fece811e685c99b6)), closes [#31682](https://github.com/bitnami/charts/issues/31682) + +## <small>4.5.2 (2025-01-24)</small> + +* [bitnami/seaweedfs] Release 4.5.2 (#31583) ([fd84724](https://github.com/bitnami/charts/commit/fd8472445476e56d22e2f54014e90d54fef780db)), closes [#31583](https://github.com/bitnami/charts/issues/31583) + +## <small>4.5.1 (2025-01-21)</small> + +* [bitnami/seaweedfs] Release 4.5.1 (#31490) ([97dae84](https://github.com/bitnami/charts/commit/97dae844ebf47a25522c0b7752595849ca3b711a)), closes [#31490](https://github.com/bitnami/charts/issues/31490) + +## 4.5.0 (2025-01-20) + +* [bitnami/seaweedfs]: add pod for `weed iam` (#31334) ([5f5a702](https://github.com/bitnami/charts/commit/5f5a70213129a814f4a0d4be92409b9fec9686a5)), closes [#31334](https://github.com/bitnami/charts/issues/31334) + +## <small>4.3.2 (2025-01-17)</small> + +* [bitnami/seaweedfs] Release 4.3.2 (#31443) ([942718e](https://github.com/bitnami/charts/commit/942718e8ec1eef14fcd63ebc11e2f2ce7a180c17)), closes [#31443](https://github.com/bitnami/charts/issues/31443) + +## <small>4.3.1 (2025-01-13)</small> + +* [bitnami/seaweedfs]: correct typo in values.yaml regarding s3.auth.existingSecret (#31339) ([31d0532](https://github.com/bitnami/charts/commit/31d0532a517bd0669b445e6974c2c5aace41697d)), closes [#31339](https://github.com/bitnami/charts/issues/31339) + +## 4.3.0 (2025-01-10) + +* [bitnami/seaweedfs] Make database check on start optional (#31277) ([ddb8a97](https://github.com/bitnami/charts/commit/ddb8a97d80c5bc87f2c33be751fbc35797f5f1be)), closes [#31277](https://github.com/bitnami/charts/issues/31277) + +## <small>4.2.1 (2025-01-07)</small> + +* [bitnami/*] Fix typo in README (#31052) ([b41a51d](https://github.com/bitnami/charts/commit/b41a51d1bd04841fc108b78d3b8357a5292771c8)), closes [#31052](https://github.com/bitnami/charts/issues/31052) +* [bitnami/seaweedfs] Release 4.2.1 (#31244) ([75fba5d](https://github.com/bitnami/charts/commit/75fba5d61dbf307dabd130d1ff3f621bb85320cc)), closes [#31244](https://github.com/bitnami/charts/issues/31244) + ## 4.2.0 (2024-12-10) -* [bitnami/seaweedfs] Detect non-standard images ([#30967](https://github.com/bitnami/charts/pull/30967)) +* [bitnami/*] Add Bitnami Premium to NOTES.txt (#30854) ([3dfc003](https://github.com/bitnami/charts/commit/3dfc00376df6631f0ce54b8d440d477f6caa6186)), closes [#30854](https://github.com/bitnami/charts/issues/30854) +* [bitnami/seaweedfs] Detect non-standard images (#30967) ([a4d9265](https://github.com/bitnami/charts/commit/a4d9265e61197d5ed5e6c4a0f85ce7460abd4a66)), closes [#30967](https://github.com/bitnami/charts/issues/30967) ## <small>4.1.2 (2024-12-04)</small> diff --git a/helm/seaweedfs/Chart.lock b/helm/seaweedfs/Chart.lock index dfa3620f167709b52e2c54a4c5b55ef8dc6eb09b..039c66b559f25f3801a766a9bb074a20eb722fda 100644 --- a/helm/seaweedfs/Chart.lock +++ b/helm/seaweedfs/Chart.lock @@ -1,12 +1,12 @@ dependencies: - name: mariadb repository: oci://registry-1.docker.io/bitnamicharts - version: 20.4.2 + version: 20.5.5 - name: postgresql repository: oci://registry-1.docker.io/bitnamicharts - version: 16.6.3 + version: 16.7.2 - name: common repository: oci://registry-1.docker.io/bitnamicharts - version: 2.30.0 -digest: sha256:a1969ecd9ac27255060569f5e0e3f4ad93f999b8968e3f9c5e97d1536996ebd2 -generated: "2025-04-10T10:05:59.79430147+02:00" + version: 2.31.1 +digest: sha256:07ea3df0034b01d47e5e8b3764de78232d8b0e23c3c2fce27a6d4e8bd71837ba +generated: "2025-05-11T13:55:38.808367927+02:00" diff --git a/helm/seaweedfs/Chart.yaml b/helm/seaweedfs/Chart.yaml index 0c7bf3c684c6c3bcee0ebe2d521a9794c4634c59..d3531a424a17629fb197eb52706f9bd12120352c 100644 --- a/helm/seaweedfs/Chart.yaml +++ b/helm/seaweedfs/Chart.yaml @@ -3,18 +3,19 @@ annotations: category: Infrastructure - licenses: Apache-2.0 images: | - name: mariadb - image: docker.io/bitnami/mariadb:11.4.4-debian-12-r1 + image: docker.io/bitnami/mariadb:11.4.5-debian-12-r12 - name: os-shell - image: docker.io/bitnami/os-shell:12-debian-12-r33 + image: docker.io/bitnami/os-shell:12-debian-12-r43 - name: postgresql - image: docker.io/bitnami/postgresql:17.2.0-debian-12-r2 + image: docker.io/bitnami/postgresql:17.4.0-debian-12-r19 - name: seaweedfs - image: docker.io/bitnami/seaweedfs:3.80.0-debian-12-r1 + image: docker.io/bitnami/seaweedfs:3.87.0-debian-12-r1 + licenses: Apache-2.0 + tanzuCategory: clusterUtility apiVersion: v2 -appVersion: 3.80.0 +appVersion: 3.87.0 dependencies: - condition: mariadb.enabled name: mariadb @@ -35,7 +36,7 @@ dependencies: version: 2.x.x description: SeaweedFS is a simple and highly scalable distributed file system. home: https://bitnami.com -icon: https://bitnami.com/assets/stacks/seaweedfs/img/seaweedfs-stack-220x234.png +icon: https://dyltqmyl993wv.cloudfront.net/assets/stacks/seaweedfs/img/seaweedfs-stack-220x234.png keywords: - seaweedfs - storage @@ -50,4 +51,4 @@ name: seaweedfs sources: - https://github.com/bitnami/charts/tree/main/bitnami/seawwedfs - https://github.com/bitnami/containers/tree/main/bitnami/seaweedfs -version: 4.2.1 +version: 4.8.7 diff --git a/helm/seaweedfs/README.md b/helm/seaweedfs/README.md index 7506718dc1087f1ede7d95d9ebb28f40632a0b86..cd0c7e1cc30c7c56e4357523b12b3abbb6bbe8f8 100644 --- a/helm/seaweedfs/README.md +++ b/helm/seaweedfs/README.md @@ -22,8 +22,6 @@ Bitnami charts for Helm are carefully engineered, actively maintained and are th This chart bootstraps a [SeaweedFS](https://github.com/seaweedfs/seaweedfs) deployment in a [Kubernetes](https://kubernetes.io) cluster using the [Helm](https://helm.sh) package manager. -Bitnami charts can be used with [Kubeapps](https://kubeapps.dev/) for deployment and management of Helm Charts in clusters. - ## Prerequisites - Kubernetes 1.23+ @@ -166,7 +164,7 @@ You can manually create the required TLS certificates for each SeaweedFS compone #### S3 Authentication Authentication can be enabled in the SeaweedFS S3 API by setting the `s3.auth.enabled` parameter to `true`. -You can provide your custom authentication configuration creating a secret with the configuration and setting the `s3.auth.cexistingSecret` parameter with the name of the secret. +You can provide your custom authentication configuration creating a secret with the configuration and setting the `s3.auth.existingSecret` parameter with the name of the secret. Alternatively, you can rely on the chart to create a basic configuration with two main users: `admin` and `read-only`. You can provide the admin user credentials using the `s3.auth.adminAccessKeyId` and `s3.auth.adminSecretAccessKey` parameters, and the read-only user credentials using the `s3.auth.readAccessKeyId` and `s3.auth.readSecretAccessKey` parameters. ### Additional environment variables @@ -349,7 +347,7 @@ If you encounter errors when working with persistent volumes, refer to our [trou | `master.containerSecurityContext.allowPrivilegeEscalation` | Set allowPrivilegeEscalation in Master Server container' Security Context | `false` | | `master.containerSecurityContext.capabilities.drop` | List of capabilities to be dropped in Master Server container | `["ALL"]` | | `master.containerSecurityContext.seccompProfile.type` | Set seccomp profile in Master Server container | `RuntimeDefault` | -| `master.logLevel` | Master Server log level [0|1|2|3|4] | `1` | +| `master.logLevel` | Master Server log level (0, 1, 2, 3, or 4) | `1` | | `master.bindAddress` | Master Server bind address | `0.0.0.0` | | `master.volumeSizeLimitMB` | Limit (in MB) to stop directing writes to oversized volumes | `1000` | | `master.config` | Master Server configuration | `""` | @@ -436,16 +434,26 @@ If you encounter errors when working with persistent volumes, refer to our [trou | Name | Description | Value | | --------------------------------------------------------- | ------------------------------------------------------------------------------------------------------- | ------------------- | -| `master.persistence.enabled` | Enable persistence on Master Server using Persistent Volume Claims | `true` | +| `master.persistence.enabled` | Enable data persistence on Master Server using Persistent Volume Claims | `true` | | `master.persistence.mountPath` | Path to mount the volume at. | `/data` | | `master.persistence.subPath` | The subdirectory of the volume to mount to, useful in dev environments and one PV for multiple services | `""` | | `master.persistence.storageClass` | Storage class of backing PVC | `""` | | `master.persistence.annotations` | Persistent Volume Claim annotations | `{}` | | `master.persistence.accessModes` | Persistent Volume Access Modes | `["ReadWriteOnce"]` | | `master.persistence.size` | Size of data volume | `8Gi` | -| `master.persistence.existingClaim` | The name of an existing PVC to use for persistence | `""` | +| `master.persistence.existingClaim` | The name of an existing PVC to use for data persistence | `""` | | `master.persistence.selector` | Selector to match an existing Persistent Volume for data PVC | `{}` | | `master.persistence.dataSource` | Custom PVC data source | `{}` | +| `master.logPersistence.enabled` | Enable logs persistence on Master Server using Persistent Volume Claims | `false` | +| `master.logPersistence.mountPath` | Path to mount the volume at. | `/logs` | +| `master.logPersistence.subPath` | The subdirectory of the volume to mount to, useful in dev environments and one PV for multiple services | `""` | +| `master.logPersistence.storageClass` | Storage class of backing PVC | `""` | +| `master.logPersistence.annotations` | Persistent Volume Claim annotations | `{}` | +| `master.logPersistence.accessModes` | Persistent Volume Access Modes | `["ReadWriteOnce"]` | +| `master.logPersistence.size` | Size of logs volume | `8Gi` | +| `master.logPersistence.existingClaim` | The name of an existing PVC to use for logs persistence | `""` | +| `master.logPersistence.selector` | Selector to match an existing Persistent Volume for logs PVC | `{}` | +| `master.logPersistence.dataSource` | Custom PVC data source | `{}` | | `master.persistentVolumeClaimRetentionPolicy.enabled` | Controls if and how PVCs are deleted during the lifecycle of the Master Server StatefulSet | `false` | | `master.persistentVolumeClaimRetentionPolicy.whenScaled` | Volume retention behavior when the replica count of the StatefulSet is reduced | `Retain` | | `master.persistentVolumeClaimRetentionPolicy.whenDeleted` | Volume retention behavior that applies when the StatefulSet is deleted | `Retain` | @@ -516,7 +524,7 @@ If you encounter errors when working with persistent volumes, refer to our [trou | `volume.containerSecurityContext.allowPrivilegeEscalation` | Set allowPrivilegeEscalation in Volume Server container' Security Context | `false` | | `volume.containerSecurityContext.capabilities.drop` | List of capabilities to be dropped in Volume Server container | `["ALL"]` | | `volume.containerSecurityContext.seccompProfile.type` | Set seccomp profile in Volume Server container | `RuntimeDefault` | -| `volume.logLevel` | Volume Server log level [0|1|2|3|4] | `1` | +| `volume.logLevel` | Volume Server log level (0, 1, 2, 3, or 4) | `1` | | `volume.bindAddress` | Volume Server bind address | `0.0.0.0` | | `volume.publicUrl` | Volume Server public URL | `""` | | `volume.config` | Volume Server configuration | `""` | @@ -615,6 +623,16 @@ If you encounter errors when working with persistent volumes, refer to our [trou | `volume.dataVolumes[0].persistence.existingClaim` | The name of an existing PVC to use for persistence | `""` | | `volume.dataVolumes[0].persistence.selector` | Selector to match an existing Persistent Volume for data PVC | `{}` | | `volume.dataVolumes[0].persistence.dataSource` | Custom PVC data source | `{}` | +| `volume.logPersistence.enabled` | Enable logs persistence on Volume Server using Persistent Volume Claims | `false` | +| `volume.logPersistence.mountPath` | Path to mount the volume at. | `/logs` | +| `volume.logPersistence.subPath` | The subdirectory of the volume to mount to, useful in dev environments and one PV for multiple services | `""` | +| `volume.logPersistence.storageClass` | Storage class of backing PVC | `""` | +| `volume.logPersistence.annotations` | Persistent Volume Claim annotations | `{}` | +| `volume.logPersistence.accessModes` | Persistent Volume Access Modes | `["ReadWriteOnce"]` | +| `volume.logPersistence.size` | Size of logs volume | `8Gi` | +| `volume.logPersistence.existingClaim` | The name of an existing PVC to use for logs persistence | `""` | +| `volume.logPersistence.selector` | Selector to match an existing Persistent Volume for logs PVC | `{}` | +| `volume.logPersistence.dataSource` | Custom PVC data source | `{}` | | `volume.persistentVolumeClaimRetentionPolicy.enabled` | Controls if and how PVCs are deleted during the lifecycle of the Volume Server StatefulSet | `false` | | `volume.persistentVolumeClaimRetentionPolicy.whenScaled` | Volume retention behavior when the replica count of the StatefulSet is reduced | `Retain` | | `volume.persistentVolumeClaimRetentionPolicy.whenDeleted` | Volume retention behavior that applies when the StatefulSet is deleted | `Retain` | @@ -686,12 +704,14 @@ If you encounter errors when working with persistent volumes, refer to our [trou | `filer.containerSecurityContext.allowPrivilegeEscalation` | Set allowPrivilegeEscalation in Filer Server container' Security Context | `false` | | `filer.containerSecurityContext.capabilities.drop` | List of capabilities to be dropped in Filer Server container | `["ALL"]` | | `filer.containerSecurityContext.seccompProfile.type` | Set seccomp profile in Filer Server container | `RuntimeDefault` | -| `filer.logLevel` | Filer Server log level [0|1|2|3|4] | `1` | +| `filer.logLevel` | Filer Server log level (0, 1, 2, 3, or 4) | `1` | | `filer.bindAddress` | Filer Server bind address | `0.0.0.0` | | `filer.config` | Filer Server configuration | `[leveldb2] enabled = false ` | | `filer.existingConfigmap` | The name of an existing ConfigMap with your custom configuration for Filer Server | `""` | +| `filer.notificationConfig` | Filer Server notification configuration | `""` | +| `filer.existingNotificationConfigmap` | The name of an existing ConfigMap with your custom notification configuration for Filer Server | `""` | | `filer.command` | Override default Filer Server container command (useful when using custom images) | `[]` | | `filer.args` | Override default Filer Server container args (useful when using custom images) | `[]` | | `filer.automountServiceAccountToken` | Mount Service Account token in Filer Server pods | `false` | @@ -770,6 +790,24 @@ enabled = false | `filer.ingress.secrets` | Custom TLS certificates as secrets | `[]` | | `filer.ingress.extraRules` | Additional rules to be covered with this ingress record | `[]` | +### Filer Server Persistence Parameters + +| Name | Description | Value | +| -------------------------------------------------------- | ------------------------------------------------------------------------------------------------------- | ------------------- | +| `filer.logPersistence.enabled` | Enable logs persistence on Filer Server using Persistent Volume Claims | `false` | +| `filer.logPersistence.mountPath` | Path to mount the volume at. | `/logs` | +| `filer.logPersistence.subPath` | The subdirectory of the volume to mount to, useful in dev environments and one PV for multiple services | `""` | +| `filer.logPersistence.storageClass` | Storage class of backing PVC | `""` | +| `filer.logPersistence.annotations` | Persistent Volume Claim annotations | `{}` | +| `filer.logPersistence.accessModes` | Persistent Volume Access Modes | `["ReadWriteOnce"]` | +| `filer.logPersistence.size` | Size of logs volume | `8Gi` | +| `filer.logPersistence.existingClaim` | The name of an existing PVC to use for logs persistence | `""` | +| `filer.logPersistence.selector` | Selector to match an existing Persistent Volume for logs PVC | `{}` | +| `filer.logPersistence.dataSource` | Custom PVC data source | `{}` | +| `filer.persistentVolumeClaimRetentionPolicy.enabled` | Controls if and how PVCs are deleted during the lifecycle of the Master Server StatefulSet | `false` | +| `filer.persistentVolumeClaimRetentionPolicy.whenScaled` | Volume retention behavior when the replica count of the StatefulSet is reduced | `Retain` | +| `filer.persistentVolumeClaimRetentionPolicy.whenDeleted` | Volume retention behavior that applies when the StatefulSet is deleted | `Retain` | + ### Filer Server Metrics Parameters | Name | Description | Value | @@ -837,15 +875,16 @@ enabled = false | `s3.containerSecurityContext.allowPrivilegeEscalation` | Set allowPrivilegeEscalation in Amazon S3 API container' Security Context | `false` | | `s3.containerSecurityContext.capabilities.drop` | List of capabilities to be dropped in Amazon S3 API container | `["ALL"]` | | `s3.containerSecurityContext.seccompProfile.type` | Set seccomp profile in Amazon S3 API container | `RuntimeDefault` | -| `s3.logLevel` | Amazon S3 API log level [0|1|2|3|4] | `1` | +| `s3.logLevel` | Amazon S3 API log level (0, 1, 2, 3, or 4) | `1` | | `s3.bindAddress` | Amazon S3 API bind address | `0.0.0.0` | +| `s3.allowEmptyFolder` | Allow empty folders in Amazon S3 API | `true` | | `s3.auth.enabled` | Enable Amazon S3 API authentication | `false` | | `s3.auth.existingSecret` | Existing secret with Amazon S3 API authentication configuration | `""` | | `s3.auth.existingSecretConfigKey` | Key of the above existing secret with S3 API authentication configuration, defaults to `config.json` | `""` | -| `s3.auth.adminAccessKeyId` | Amazon S3 API access key with admin privileges. Ignored if `security.mTLS.volume.existingSecret` is set | `""` | -| `s3.auth.adminSecretAccessKey` | Amazon S3 API secret key with admin privileges. Ignored if `security.mTLS.volume.existingSecret` is set | `""` | -| `s3.auth.readAccessKeyId` | Amazon S3 API read access key with read-only privileges. Ignored if `security.mTLS.volume.existingSecret` is set | `""` | -| `s3.auth.readSecretAccessKey` | Amazon S3 API read secret key with read-only privileges. Ignored if `security.mTLS.volume.existingSecret` is set | `""` | +| `s3.auth.adminAccessKeyId` | Amazon S3 API access key with admin privileges. Ignored if `s3.auth.existingSecret` is set | `""` | +| `s3.auth.adminSecretAccessKey` | Amazon S3 API secret key with admin privileges. Ignored if `s3.auth.existingSecret` is set | `""` | +| `s3.auth.readAccessKeyId` | Amazon S3 API read access key with read-only privileges. Ignored if `s3.auth.existingSecret` is set | `""` | +| `s3.auth.readSecretAccessKey` | Amazon S3 API read secret key with read-only privileges. Ignored if `s3.auth.existingSecret` is set | `""` | | `s3.command` | Override default Amazon S3 API container command (useful when using custom images) | `[]` | | `s3.args` | Override default Amazon S3 API container args (useful when using custom images) | `[]` | | `s3.automountServiceAccountToken` | Mount Service Account token in Amazon S3 API pods | `false` | @@ -988,7 +1027,7 @@ enabled = false | `webdav.containerSecurityContext.allowPrivilegeEscalation` | Set allowPrivilegeEscalation in WebDAV container' Security Context | `false` | | `webdav.containerSecurityContext.capabilities.drop` | List of capabilities to be dropped in WebDAV container | `["ALL"]` | | `webdav.containerSecurityContext.seccompProfile.type` | Set seccomp profile in WebDAV container | `RuntimeDefault` | -| `webdav.logLevel` | WebDAV log level [0|1|2|3|4] | `1` | +| `webdav.logLevel` | WebDAV log level (0, 1, 2, 3, or 4) | `1` | | `webdav.tls.enabled` | Enable TLS transport for WebDAV | `false` | | `webdav.tls.autoGenerated.enabled` | Enable automatic generation of certificates for TLS | `false` | | `webdav.tls.autoGenerated.engine` | Mechanism to generate the certificates (allowed values: helm, cert-manager) | `helm` | @@ -1076,6 +1115,97 @@ enabled = false | `webdav.ingress.secrets` | Custom TLS certificates as secrets | `[]` | | `webdav.ingress.extraRules` | Additional rules to be covered with this ingress record | `[]` | +### IAM Parameters + +| Name | Description | Value | +| ------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------- | +| `iam.enabled` | Enable IAM deployment | `false` | +| `iam.replicaCount` | Number of IAM replicas to deploy | `1` | +| `iam.containerPorts.http` | IAM HTTP container port | `8111` | +| `iam.livenessProbe.enabled` | Enable livenessProbe on IAM containers | `true` | +| `iam.livenessProbe.initialDelaySeconds` | Initial delay seconds for livenessProbe | `30` | +| `iam.livenessProbe.periodSeconds` | Period seconds for livenessProbe | `10` | +| `iam.livenessProbe.timeoutSeconds` | Timeout seconds for livenessProbe | `30` | +| `iam.livenessProbe.failureThreshold` | Failure threshold for livenessProbe | `6` | +| `iam.livenessProbe.successThreshold` | Success threshold for livenessProbe | `1` | +| `iam.readinessProbe.enabled` | Enable readinessProbe on IAM containers | `true` | +| `iam.readinessProbe.initialDelaySeconds` | Initial delay seconds for readinessProbe | `30` | +| `iam.readinessProbe.periodSeconds` | Period seconds for readinessProbe | `10` | +| `iam.readinessProbe.timeoutSeconds` | Timeout seconds for readinessProbe | `30` | +| `iam.readinessProbe.failureThreshold` | Failure threshold for readinessProbe | `6` | +| `iam.readinessProbe.successThreshold` | Success threshold for readinessProbe | `1` | +| `iam.startupProbe.enabled` | Enable startupProbe on IAM containers | `false` | +| `iam.startupProbe.initialDelaySeconds` | Initial delay seconds for startupProbe | `5` | +| `iam.startupProbe.periodSeconds` | Period seconds for startupProbe | `5` | +| `iam.startupProbe.timeoutSeconds` | Timeout seconds for startupProbe | `1` | +| `iam.startupProbe.failureThreshold` | Failure threshold for startupProbe | `15` | +| `iam.startupProbe.successThreshold` | Success threshold for startupProbe | `1` | +| `iam.resourcesPreset` | Set IAM container resources according to one common preset (allowed values: none, nano, small, medium, large, xlarge, 2xlarge). This is ignored if webdav.resources is set (webdav.resources is recommended for production). | `nano` | +| `iam.resources` | Set IAM container requests and limits for different resources like CPU or memory (essential for production workloads) | `{}` | +| `iam.podSecurityContext.enabled` | Enable IAM pods' Security Context | `true` | +| `iam.podSecurityContext.fsGroupChangePolicy` | Set filesystem group change policy for IAM pods | `Always` | +| `iam.podSecurityContext.sysctls` | Set kernel settings using the sysctl interface for IAM pods | `[]` | +| `iam.podSecurityContext.supplementalGroups` | Set filesystem extra groups for IAM pods | `[]` | +| `iam.podSecurityContext.fsGroup` | Set fsGroup in IAM pods' Security Context | `1001` | +| `iam.containerSecurityContext.enabled` | Enabled IAM container' Security Context | `true` | +| `iam.containerSecurityContext.seLinuxOptions` | Set SELinux options in IAM container | `{}` | +| `iam.containerSecurityContext.runAsUser` | Set runAsUser in IAM container' Security Context | `1001` | +| `iam.containerSecurityContext.runAsGroup` | Set runAsGroup in IAM container' Security Context | `1001` | +| `iam.containerSecurityContext.runAsNonRoot` | Set runAsNonRoot in IAM container' Security Context | `true` | +| `iam.containerSecurityContext.readOnlyRootFilesystem` | Set readOnlyRootFilesystem in IAM container' Security Context | `true` | +| `iam.containerSecurityContext.privileged` | Set privileged in IAM container' Security Context | `false` | +| `iam.containerSecurityContext.allowPrivilegeEscalation` | Set allowPrivilegeEscalation in IAM container' Security Context | `false` | +| `iam.containerSecurityContext.capabilities.drop` | List of capabilities to be dropped in IAM container | `["ALL"]` | +| `iam.containerSecurityContext.seccompProfile.type` | Set seccomp profile in IAM container | `RuntimeDefault` | +| `iam.logLevel` | IAM log level (0, 1, 2, 3, or 4) | `1` | +| `iam.command` | Override default IAM container command (useful when using custom images) | `[]` | +| `iam.args` | Override default IAM container args (useful when using custom images) | `[]` | +| `iam.automountServiceAccountToken` | Mount Service Account token in IAM pods | `false` | +| `iam.hostAliases` | IAM pods host aliases | `[]` | +| `iam.statefulsetAnnotations` | Annotations for IAM statefulset | `{}` | +| `iam.podLabels` | Extra labels for IAM pods | `{}` | +| `iam.podAnnotations` | Annotations for IAM pods | `{}` | +| `iam.podAffinityPreset` | Pod affinity preset. Ignored if `iam.affinity` is set. Allowed values: `soft` or `hard` | `""` | +| `iam.podAntiAffinityPreset` | Pod anti-affinity preset. Ignored if `iam.affinity` is set. Allowed values: `soft` or `hard` | `soft` | +| `iam.nodeAffinityPreset.type` | Node affinity preset type. Ignored if `iam.affinity` is set. Allowed values: `soft` or `hard` | `""` | +| `iam.nodeAffinityPreset.key` | Node label key to match. Ignored if `iam.affinity` is set | `""` | +| `iam.nodeAffinityPreset.values` | Node label values to match. Ignored if `iam.affinity` is set | `[]` | +| `iam.affinity` | Affinity for IAM pods assignment | `{}` | +| `iam.nodeSelector` | Node labels for IAM pods assignment | `{}` | +| `iam.tolerations` | Tolerations for IAM pods assignment | `[]` | +| `iam.updateStrategy.type` | IAM deployment strategy type | `RollingUpdate` | +| `iam.priorityClassName` | IAM pods' priorityClassName | `""` | +| `iam.topologySpreadConstraints` | Topology Spread Constraints for IAM pod assignment spread across your cluster among failure-domains | `[]` | +| `iam.schedulerName` | Name of the k8s scheduler (other than default) for IAM pods | `""` | +| `iam.terminationGracePeriodSeconds` | Seconds IAM pods need to terminate gracefully | `""` | +| `iam.lifecycleHooks` | for IAM containers to automate configuration before or after startup | `{}` | +| `iam.extraEnvVars` | Array with extra environment variables to add to IAM containers | `[]` | +| `iam.extraEnvVarsCM` | Name of existing ConfigMap containing extra env vars for IAM containers | `""` | +| `iam.extraEnvVarsSecret` | Name of existing Secret containing extra env vars for IAM containers | `""` | +| `iam.extraVolumes` | Optionally specify extra list of additional volumes for the IAM pods | `[]` | +| `iam.extraVolumeMounts` | Optionally specify extra list of additional volumeMounts for the IAM containers | `[]` | +| `iam.sidecars` | Add additional sidecar containers to the IAM pods | `[]` | +| `iam.initContainers` | Add additional init containers to the IAM pods | `[]` | +| `iam.pdb.create` | Enable/disable a Pod Disruption Budget creation | `true` | +| `iam.pdb.minAvailable` | Minimum number/percentage of pods that should remain scheduled | `""` | +| `iam.pdb.maxUnavailable` | Maximum number/percentage of pods that may be made unavailable. Defaults to `1` if both `iam.pdb.minAvailable` and `iam.pdb.maxUnavailable` are empty. | `""` | + +### IAM Traffic Exposure Parameters + +| Name | Description | Value | +| -------------------------------------- | ------------------------------------------------------------------------------ | ----------- | +| `iam.service.type` | IAM service type | `ClusterIP` | +| `iam.service.ports.http` | IAM service HTTP port (HTTPS if `iam.tls.enabled` is `true`) | `8111` | +| `iam.service.nodePorts.http` | Node port for HTTP (HTTPS if `iam.tls.enabled` is `true`) | `""` | +| `iam.service.clusterIP` | IAM service Cluster IP | `""` | +| `iam.service.loadBalancerIP` | IAM service Load Balancer IP | `""` | +| `iam.service.loadBalancerSourceRanges` | IAM service Load Balancer sources | `[]` | +| `iam.service.externalTrafficPolicy` | IAM service external traffic policy | `Cluster` | +| `iam.service.annotations` | Additional custom annotations for IAM service | `{}` | +| `iam.service.extraPorts` | Extra ports to expose in IAM service (normally used with the `sidecars` value) | `[]` | +| `iam.service.sessionAffinity` | Control where client requests go, to the same pod or round-robin | `None` | +| `iam.service.sessionAffinityConfig` | Additional settings for the sessionAffinity | `{}` | + ### Init Container Parameters | Name | Description | Value | @@ -1115,7 +1245,6 @@ enabled = false | `mariadb.auth.database` | MariaDB custom database | `bitnami_seaweedfs` | | `mariadb.auth.username` | MariaDB custom user name | `bn_seaweedfs` | | `mariadb.auth.password` | MariaDB custom user password | `""` | -| `mariadb.auth.usePasswordFiles` | Mount credentials as a file instead of using an environment variable | `false` | | `mariadb.initdbScripts` | Specify dictionary of scripts to be run at first boot | `{}` | | `mariadb.primary.persistence.enabled` | Enable persistence on MariaDB using PVC(s) | `true` | | `mariadb.primary.persistence.storageClass` | Persistent Volume storage class | `""` | @@ -1151,6 +1280,7 @@ enabled = false | `externalDatabase.password` | External Database user password | `""` | | `externalDatabase.database` | External Database database name | `bitnami_seaweedfs` | | `externalDatabase.existingSecret` | The name of an existing secret with database credentials. Evaluated as a template | `""` | +| `externalDatabase.waitForDatabaseEnabled` | Whether to check for external database before starting seaweedfs containers | `true` | | `externalDatabase.initDatabaseJob.enabled` | Enable the init external database job | `false` | | `externalDatabase.initDatabaseJob.labels` | Extra labels for the init external database job | `{}` | | `externalDatabase.initDatabaseJob.annotations` | Extra annotations for the init external database job | `{}` | @@ -1232,7 +1362,7 @@ Find more information about how to deal with common errors related to Bitnami's ## License -Copyright © 2024 Broadcom. The term "Broadcom" refers to Broadcom Inc. and/or its subsidiaries. +Copyright © 2025 Broadcom. The term "Broadcom" refers to Broadcom Inc. and/or its subsidiaries. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/helm/seaweedfs/charts/common-2.30.0.tgz b/helm/seaweedfs/charts/common-2.30.0.tgz deleted file mode 100644 index ef7b68044a9ee31a9ba735054c13e41814b79a16..0000000000000000000000000000000000000000 Binary files a/helm/seaweedfs/charts/common-2.30.0.tgz and /dev/null differ diff --git a/helm/seaweedfs/charts/common-2.30.2.tgz b/helm/seaweedfs/charts/common-2.30.2.tgz new file mode 100644 index 0000000000000000000000000000000000000000..f35ca37f859944b5081011965987ff76bf3d75fc Binary files /dev/null and b/helm/seaweedfs/charts/common-2.30.2.tgz differ diff --git a/helm/seaweedfs/charts/common-2.31.1.tgz b/helm/seaweedfs/charts/common-2.31.1.tgz new file mode 100644 index 0000000000000000000000000000000000000000..cf6cff738dbd2e462d1a295a45ebab5d32bd5c7b Binary files /dev/null and b/helm/seaweedfs/charts/common-2.31.1.tgz differ diff --git a/helm/seaweedfs/charts/mariadb-20.4.2.tgz b/helm/seaweedfs/charts/mariadb-20.4.2.tgz deleted file mode 100644 index 5d58a0a1104ab1c9d8312d3117d5d2ece8b1d5a9..0000000000000000000000000000000000000000 Binary files a/helm/seaweedfs/charts/mariadb-20.4.2.tgz and /dev/null differ diff --git a/helm/seaweedfs/charts/mariadb-20.5.3.tgz b/helm/seaweedfs/charts/mariadb-20.5.3.tgz new file mode 100644 index 0000000000000000000000000000000000000000..26e91fd8cfba97218673197133afa7dbbb7db995 Binary files /dev/null and b/helm/seaweedfs/charts/mariadb-20.5.3.tgz differ diff --git a/helm/seaweedfs/charts/mariadb-20.5.5.tgz b/helm/seaweedfs/charts/mariadb-20.5.5.tgz new file mode 100644 index 0000000000000000000000000000000000000000..3e573f1be539f7cde21b4dc6e5e22e93907613d7 Binary files /dev/null and b/helm/seaweedfs/charts/mariadb-20.5.5.tgz differ diff --git a/helm/seaweedfs/charts/postgresql-16.6.3.tgz b/helm/seaweedfs/charts/postgresql-16.6.3.tgz deleted file mode 100644 index 36ca74dcb79a5d83a780bff787c379a488ef1875..0000000000000000000000000000000000000000 Binary files a/helm/seaweedfs/charts/postgresql-16.6.3.tgz and /dev/null differ diff --git a/helm/seaweedfs/charts/postgresql-16.6.6.tgz b/helm/seaweedfs/charts/postgresql-16.6.6.tgz new file mode 100644 index 0000000000000000000000000000000000000000..eea64cae7283ea48f6dd6977b6d7ba2af21cd948 Binary files /dev/null and b/helm/seaweedfs/charts/postgresql-16.6.6.tgz differ diff --git a/helm/seaweedfs/charts/postgresql-16.7.2.tgz b/helm/seaweedfs/charts/postgresql-16.7.2.tgz new file mode 100644 index 0000000000000000000000000000000000000000..8e301c65cb1ce405a17995e3462a81e4f052f917 Binary files /dev/null and b/helm/seaweedfs/charts/postgresql-16.7.2.tgz differ diff --git a/helm/seaweedfs/templates/_helpers.tpl b/helm/seaweedfs/templates/_helpers.tpl index 9f76dc6966ce3d40ec3337b4822f67a55702f52e..85cb277cc617c9ae37e51fe4a02c6c44bfb1876b 100644 --- a/helm/seaweedfs/templates/_helpers.tpl +++ b/helm/seaweedfs/templates/_helpers.tpl @@ -24,6 +24,13 @@ Return the proper SeaweedFS Filer Server fullname {{- printf "%s-filer" (include "common.names.fullname" .) | trunc 63 | trimSuffix "-" -}} {{- end -}} +{{/* +Return the proper SeaweedFS IAM Server fullname +*/}} +{{- define "seaweedfs.iam.fullname" -}} +{{- printf "%s-iam" (include "common.names.fullname" .) | trunc 63 | trimSuffix "-" -}} +{{- end -}} + {{/* Return the proper SeaweedFS Amazon S3 API fullname */}} @@ -77,6 +84,17 @@ Return the proper init external database job image name {{- end -}} {{- end -}} +{{/* +Returns whether wait for external database is enabled +*/}} +{{- define "seaweedfs.waitForDatabase.enabled" -}} +{{- if or .Values.mariadb.enabled .Values.postgresql.enabled (and .Values.externalDatabase.enabled (eq .Values.externalDatabase.waitForDatabaseEnabled true) ) }} + {{- print "true" -}} + {{- else }} + {{- print "false" -}} +{{- end -}} +{{- end -}} + {{/* Return the proper Docker Image Registry Secret Names */}} @@ -128,6 +146,17 @@ Return the Filer Server configuration configmap. {{- end -}} {{- end -}} +{{/* +Return the Filer Server notification configuration configmap. +*/}} +{{- define "seaweedfs.filer.notificationConfigmapName" -}} +{{- if .Values.filer.existingNotificationConfigmap -}} + {{- print (tpl .Values.filer.existingNotificationConfigmap .) -}} +{{- else -}} + {{- printf "%s-notification" (include "seaweedfs.filer.fullname" .) -}} +{{- end -}} +{{- end -}} + {{/* Return the Master Server peers */}} @@ -339,6 +368,7 @@ Return the database secret key name Returns an init-container that waits for the database to be ready */}} {{- define "seaweedfs.filer.waitForDBInitContainer" -}} +{{ if eq "true" ( include "seaweedfs.waitForDatabase.enabled" . ) }} - name: wait-for-db image: {{ include "seaweedfs.initDatabaseJob.image" . }} {{- if or .Values.mariadb.enabled (and .Values.externalDatabase.enabled (eq .Values.externalDatabase.store "mariadb") ) }} @@ -415,6 +445,7 @@ Returns an init-container that waits for the database to be ready - name: db-credentials mountPath: /secrets {{- end -}} +{{- end -}} {{/* Returns an init-container that generates auth configuration for the Amazon S3 API @@ -431,7 +462,12 @@ Returns an init-container that generates auth configuration for the Amazon S3 AP args: - -ec - | - #!/bin/bash + {{- if .Values.usePasswordFiles }} + export ADMIN_ACCESS_KEY_ID="$(< $ADMIN_ACCESS_KEY_ID_FILE)" + export ADMIN_SECRET_ACCESS_KEY="$(< $ADMIN_SECRET_ACCESS_KEY_FILE)" + export READ_ACCESS_KEY_ID="$(< $READ_ACCESS_KEY_ID_FILE)" + export READ_SECRET_ACCESS_KEY="$(< $READ_SECRET_ACCESS_KEY_FILE)" + {{- end }} cat > "/auth/config.json" <<EOF { @@ -468,6 +504,16 @@ Returns an init-container that generates auth configuration for the Amazon S3 AP } EOF env: + {{- if .Values.usePasswordFiles }} + - name: ADMIN_ACCESS_KEY_ID_FILE + value: "/opt/bitnami/seaweed/secrets/admin_access_key_id" + - name: ADMIN_SECRET_ACCESS_KEY_FILE + value: "/opt/bitnami/seaweed/secrets/admin_secret_access_key" + - name: READ_ACCESS_KEY_ID_FILE + value: "/opt/bitnami/seaweed/secrets/read_access_key_id" + - name: READ_SECRET_ACCESS_KEY_FILE + value: "/opt/bitnami/seaweed/secrets/read_secret_access_key" + {{- else }} - name: ADMIN_ACCESS_KEY_ID valueFrom: secretKeyRef: @@ -488,6 +534,7 @@ Returns an init-container that generates auth configuration for the Amazon S3 AP secretKeyRef: name: {{ printf "%s-auth" (include "seaweedfs.s3.fullname" .) }} key: read_secret_access_key + {{- end }} {{- if .Values.s3.resources }} resources: {{- toYaml .Values.s3.resources | nindent 12 }} {{- else if ne .Values.s3.resourcesPreset "none" }} @@ -497,6 +544,10 @@ Returns an init-container that generates auth configuration for the Amazon S3 AP - name: empty-dir mountPath: /auth subPath: auth-dir + {{- if .Values.usePasswordFiles }} + - name: seaweed-secrets + mountPath: /opt/bitnami/seaweed/secrets + {{- end}} {{- end -}} {{/* @@ -518,6 +569,7 @@ Compile all warnings into a single message. {{- $messages := list -}} {{- $messages := append $messages (include "seaweedfs.validateValues.security.mTLS" .) -}} {{- $messages := append $messages (include "seaweedfs.validateValues.master.replicaCount" .) -}} +{{- $messages := append $messages (include "seaweedfs.validateValues.filer.replicaCount" .) -}} {{- $messages := append $messages (include "seaweedfs.validateValues.volume.replicaCount" .) -}} {{- $messages := append $messages (include "seaweedfs.validateValues.volume.dataVolumes" .) -}} {{- $messages := append $messages (include "seaweedfs.validateValues.filer.database" .) -}} @@ -562,12 +614,27 @@ Validate values of SeaweedFS - number of Master server replicas */}} {{- define "seaweedfs.validateValues.master.replicaCount" -}} {{- $masterReplicaCount := int .Values.master.replicaCount }} -{{- if and .Values.master.persistence.enabled .Values.master.persistence.existingClaim (gt $masterReplicaCount 1) -}} +{{- if and (or (and .Values.master.persistence.enabled .Values.master.persistence.existingClaim) (and .Values.master.logPersistence.enabled .Values.master.logPersistence.existingClaim)) (gt $masterReplicaCount 1) -}} master.replicaCount A single existing PVC cannot be shared between multiple Master Server replicas. Please set a valid number of replicas (--set master.replicaCount=1), disable persistence - (--set master.persistence.enabled=false) or rely on dynamic provisioning via Persitent - Volume Claims (--set master.persistence.existingClaim=""). + (--set master.persistence.enabled=false,master.logPersistence.enabled=false) or + rely on dynamic provisioning via Persistent Volume Claims + (--set master.persistence.existingClaim="",master.logPersistence.existingClaim=""). +{{- end -}} +{{- end -}} + +{{/* +Validate values of SeaweedFS - number of Filer server replicas +*/}} +{{- define "seaweedfs.validateValues.filer.replicaCount" -}} +{{- $filerReplicaCount := int .Values.filer.replicaCount }} +{{- if and .Values.filer.enabled .Values.filer.logPersistence.enabled .Values.filer.logPersistence.existingClaim (gt $filerReplicaCount 1) -}} +filer.replicaCount + A single existing PVC cannot be shared between multiple Filer Server replicas. + Please set a valid number of replicas (--set filer.replicaCount=1), disable persistence + (--set filer.logPersistence.enabled=false) or rely on dynamic provisioning via + Persistent Volume Claims (--set filer.logPersistence.existingClaim=""). {{- end -}} {{- end -}} @@ -585,6 +652,13 @@ volume.replicaCount Volume Claims (--set volume.dataVolumes[].persistence.existingClaim=""). {{- end -}} {{- end -}} +{{- if and .Values.volume.logPersistence.enabled .Values.volume.logPersistence.existingClaim (gt $volumeReplicaCount 1) -}} +volume.replicaCount + A single existing PVC cannot be shared between multiple Volume Server replicas. + Please set a valid number of replicas (--set volume.replicaCount=1), disable persistence + (--set volume.logPersistence.enabled=false) or rely on dynamic provisioning via Persistent Volume Claims + (--set volume.logPersistence.existingClaim=""). +{{- end -}} {{- end -}} {{/* diff --git a/helm/seaweedfs/templates/filer/hpa.yaml b/helm/seaweedfs/templates/filer/hpa.yaml index c2c967235f6345af184794f7d689745738348b23..725158c21281674a09c86c8e6849ec44b95f143f 100644 --- a/helm/seaweedfs/templates/filer/hpa.yaml +++ b/helm/seaweedfs/templates/filer/hpa.yaml @@ -26,24 +26,16 @@ spec: - type: Resource resource: name: memory - {{- if semverCompare "<1.23-0" (include "common.capabilities.kubeVersion" .) }} - targetAverageUtilization: {{ .Values.filer.autoscaling.targetMemory }} - {{- else }} target: type: Utilization averageUtilization: {{ .Values.filer.autoscaling.targetMemory }} - {{- end }} {{- end }} {{- if .Values.filer.autoscaling.targetCPU }} - type: Resource resource: name: cpu - {{- if semverCompare "<1.23-0" (include "common.capabilities.kubeVersion" .) }} - targetAverageUtilization: {{ .Values.filer.autoscaling.targetCPU }} - {{- else }} target: type: Utilization averageUtilization: {{ .Values.filer.autoscaling.targetCPU }} - {{- end }} {{- end }} {{- end }} diff --git a/helm/seaweedfs/templates/filer/ingress.yaml b/helm/seaweedfs/templates/filer/ingress.yaml index 5ebfed11f95cfdb173470d453d00d229e283caa0..c92a9314563052700129e5a322cd5d213623f7c4 100644 --- a/helm/seaweedfs/templates/filer/ingress.yaml +++ b/helm/seaweedfs/templates/filer/ingress.yaml @@ -16,7 +16,7 @@ metadata: annotations: {{- include "common.tplvalues.render" ( dict "value" $annotations "context" $ ) | nindent 4 }} {{- end }} spec: - {{- if and .Values.filer.ingress.ingressClassName (eq "true" (include "common.ingress.supportsIngressClassname" .)) }} + {{- if .Values.filer.ingress.ingressClassName }} ingressClassName: {{ .Values.filer.ingress.ingressClassName | quote }} {{- end }} rules: @@ -27,9 +27,7 @@ spec: {{- toYaml .Values.filer.ingress.extraPaths | nindent 10 }} {{- end }} - path: {{ .Values.filer.ingress.path }} - {{- if eq "true" (include "common.ingress.supportsPathType" .) }} pathType: {{ .Values.filer.ingress.pathType }} - {{- end }} backend: {{- include "common.ingress.backend" (dict "serviceName" (include "seaweedfs.filer.fullname" .) "servicePort" "http" "context" $) | nindent 14 }} {{- if not (empty .Values.filer.ingress.hostname )}} host: {{ .Values.filer.ingress.hostname }} @@ -40,9 +38,7 @@ spec: http: paths: - path: {{ default "/" .path }} - {{- if eq "true" (include "common.ingress.supportsPathType" $) }} pathType: {{ default "ImplementationSpecific" .pathType }} - {{- end }} backend: {{- include "common.ingress.backend" (dict "serviceName" (include "seaweedfs.filer.fullname" $) "servicePort" "http" "context" $) | nindent 14 }} {{- end }} {{- if .Values.filer.ingress.extraRules }} diff --git a/helm/seaweedfs/templates/filer/notification-configmap.yaml b/helm/seaweedfs/templates/filer/notification-configmap.yaml new file mode 100644 index 0000000000000000000000000000000000000000..367e1bf9452d6a85dec31246a89a077f70ef672e --- /dev/null +++ b/helm/seaweedfs/templates/filer/notification-configmap.yaml @@ -0,0 +1,20 @@ +{{- /* +Copyright Broadcom, Inc. All Rights Reserved. +SPDX-License-Identifier: APACHE-2.0 +*/}} + +{{- if and .Values.filer.enabled .Values.filer.notificationConfig (empty .Values.filer.existingNotificationConfigmap) }} +apiVersion: v1 +kind: ConfigMap +metadata: + name: {{ printf "%s-notification" (include "seaweedfs.filer.fullname" .) }} + namespace: {{ include "common.names.namespace" . | quote }} + labels: {{- include "common.labels.standard" ( dict "customLabels" .Values.commonLabels "context" $ ) | nindent 4 }} + app.kubernetes.io/component: filer + {{- if .Values.commonAnnotations }} + annotations: {{- include "common.tplvalues.render" ( dict "value" .Values.commonAnnotations "context" $ ) | nindent 4 }} + {{- end }} +data: + notification.toml: |- +{{ include "common.tplvalues.render" ( dict "value" .Values.filer.notificationConfig "context" $ ) | indent 4 }} +{{- end }} diff --git a/helm/seaweedfs/templates/filer/statefulset.yaml b/helm/seaweedfs/templates/filer/statefulset.yaml index 8a9c8b442a0dc5b4a2a5f400669d02469d92a7f9..42037cec106d7aefe8f941ae03ca0510915284d7 100644 --- a/helm/seaweedfs/templates/filer/statefulset.yaml +++ b/helm/seaweedfs/templates/filer/statefulset.yaml @@ -34,6 +34,9 @@ spec: {{- if and .Values.filer.config (empty .Values.filer.existingConfigmap) }} checksum/config: {{ include (print $.Template.BasePath "/filer/configmap.yaml") . | sha256sum }} {{- end }} + {{- if and .Values.filer.notificationConfig (empty .Values.filer.existingNotificationConfigmap) }} + checksum/notification-config: {{ include (print $.Template.BasePath "/filer/notification-configmap.yaml") . | sha256sum }} + {{- end }} checksum/security-config: {{ include (print $.Template.BasePath "/security-configmap.yaml") . | sha256sum }} {{- if .Values.filer.podAnnotations }} {{- include "common.tplvalues.render" (dict "value" .Values.filer.podAnnotations "context" $) | nindent 8 }} @@ -105,7 +108,11 @@ spec: args: {{- include "common.tplvalues.render" (dict "value" .Values.filer.args "context" $) | nindent 12 }} {{- else }} args: + {{- if .Values.filer.logPersistence.enabled }} + - -logdir={{ .Values.filer.logPersistence.mountPath }} + {{- else }} - -logtostderr=true + {{- end }} - -v={{ .Values.filer.logLevel }} - -config_dir=/etc/seaweedfs - filer @@ -235,6 +242,13 @@ spec: lifecycle: {{- include "common.tplvalues.render" (dict "value" .Values.filer.lifecycleHooks "context" $) | nindent 12 }} {{- end }} volumeMounts: + {{- if .Values.filer.logPersistence.enabled }} + - name: logs + mountPath: {{ .Values.filer.logPersistence.mountPath }} + {{- if .Values.filer.logPersistence.subPath }} + subPath: {{ .Values.filer.logPersistence.subPath }} + {{- end }} + {{- end }} - name: empty-dir mountPath: /tmp subPath: tmp-dir @@ -244,6 +258,12 @@ spec: subPath: filer.toml readOnly: true {{- end }} + {{- if or .Values.filer.notificationConfig .Values.filer.existingNotificationConfigmap }} + - name: notification-config + mountPath: /etc/seaweedfs/notification.toml + subPath: notification.toml + readOnly: true + {{- end }} - name: security-config mountPath: /etc/seaweedfs/security.toml subPath: security.toml @@ -285,6 +305,11 @@ spec: configMap: name: {{ template "seaweedfs.filer.configmapName" . }} {{- end }} + {{- if or .Values.filer.notificationConfig .Values.filer.existingNotificationConfigmap }} + - name: notification-config + configMap: + name: {{ template "seaweedfs.filer.notificationConfigmapName" . }} + {{- end }} - name: security-config configMap: name: {{ printf "%s-security" (include "common.names.fullname" .) }} @@ -311,4 +336,42 @@ spec: {{- if .Values.filer.extraVolumes }} {{- include "common.tplvalues.render" (dict "value" .Values.filer.extraVolumes "context" $) | nindent 8 }} {{- end }} + {{- if and .Values.filer.logPersistence.enabled .Values.filer.logPersistence.existingClaim }} + - name: logs + persistentVolumeClaim: + claimName: {{ tpl .Values.filer.logPersistence.existingClaim . }} + {{- else if .Values.filer.logPersistence.enabled }} + {{- if .Values.filer.persistentVolumeClaimRetentionPolicy.enabled }} + persistentVolumeClaimRetentionPolicy: + whenDeleted: {{ .Values.filer.persistentVolumeClaimRetentionPolicy.whenDeleted }} + whenScaled: {{ .Values.filer.persistentVolumeClaimRetentionPolicy.whenScaled }} + {{- end }} + volumeClaimTemplates: + - apiVersion: v1 + kind: PersistentVolumeClaim + metadata: + name: logs + {{- if or .Values.filer.logPersistence.annotations .Values.commonAnnotations }} + {{- $claimAnnotations := include "common.tplvalues.merge" (dict "values" .Values.filer.logPersistence.annotations .Values.commonAnnotations "context" .) | fromYaml }} + annotations: {{- include "common.tplvalues.render" ( dict "value" $claimAnnotations "context" $ ) | nindent 10 }} + {{- end }} + {{- if .Values.commonLabels }} + labels: {{- include "common.labels.matchLabels" ( dict "customLabels" .Values.commonLabels "context" $ ) | nindent 10 }} + {{- end }} + spec: + {{- if .Values.filer.logPersistence.dataSource }} + dataSource: {{- include "common.tplvalues.render" (dict "value" .Values.filer.logPersistence.dataSource "context" $) | nindent 10 }} + {{- end }} + accessModes: + {{- range .Values.filer.logPersistence.accessModes }} + - {{ . | quote }} + {{- end }} + resources: + requests: + storage: {{ .Values.filer.logPersistence.size | quote }} + {{- if .Values.filer.logPersistence.selector }} + selector: {{- include "common.tplvalues.render" (dict "value" .Values.filer.logPersistence.selector "context" $) | nindent 10 }} + {{- end }} + {{- include "common.storage.class" (dict "persistence" .Values.filer.logPersistence "global" .Values.global) | nindent 8 }} + {{- end }} {{- end }} diff --git a/helm/seaweedfs/templates/iam/deployment.yaml b/helm/seaweedfs/templates/iam/deployment.yaml new file mode 100644 index 0000000000000000000000000000000000000000..9386f2bd67705ffca6ac9d2c0f3f1b19a362a43b --- /dev/null +++ b/helm/seaweedfs/templates/iam/deployment.yaml @@ -0,0 +1,226 @@ +{{- /* +Copyright Broadcom, Inc. All Rights Reserved. +SPDX-License-Identifier: APACHE-2.0 +*/}} + +{{- if and .Values.filer.enabled .Values.iam.enabled }} +apiVersion: {{ include "common.capabilities.deployment.apiVersion" . }} +kind: Deployment +metadata: + name: {{ template "seaweedfs.iam.fullname" . }} + namespace: {{ include "common.names.namespace" . | quote }} + labels: {{- include "common.labels.standard" ( dict "customLabels" .Values.commonLabels "context" $ ) | nindent 4 }} + app.kubernetes.io/component: iam + {{- if or .Values.iam.statefulsetAnnotations .Values.commonAnnotations }} + {{- $annotations := include "common.tplvalues.merge" (dict "values" (list .Values.iam.statefulsetAnnotations .Values.commonAnnotations) "context" .) }} + annotations: {{- include "common.tplvalues.render" ( dict "value" $annotations "context" $ ) | nindent 4 }} + {{- end }} +spec: + replicas: {{ .Values.iam.replicaCount }} + {{- $podLabels := include "common.tplvalues.merge" (dict "values" (list .Values.iam.podLabels .Values.commonLabels) "context" .) }} + selector: + matchLabels: {{- include "common.labels.matchLabels" ( dict "customLabels" $podLabels "context" $ ) | nindent 6 }} + app.kubernetes.io/component: iam + {{- if .Values.iam.updateStrategy }} + strategy: {{- toYaml .Values.iam.updateStrategy | nindent 4 }} + {{- end }} + template: + metadata: + annotations: + checksum/security-config: {{ include (print $.Template.BasePath "/security-configmap.yaml") . | sha256sum }} + {{- if .Values.iam.podAnnotations }} + {{- include "common.tplvalues.render" (dict "value" .Values.iam.podAnnotations "context" $) | nindent 8 }} + {{- end }} + labels: {{- include "common.labels.standard" ( dict "customLabels" $podLabels "context" $ ) | nindent 8 }} + app.kubernetes.io/component: iam + spec: + {{- include "seaweedfs.imagePullSecrets" . | nindent 6 }} + serviceAccountName: {{ template "seaweedfs.serviceAccountName" . }} + automountServiceAccountToken: {{ .Values.iam.automountServiceAccountToken }} + {{- if .Values.iam.hostAliases }} + hostAliases: {{- include "common.tplvalues.render" (dict "value" .Values.iam.hostAliases "context" $) | nindent 8 }} + {{- end }} + {{- if .Values.iam.affinity }} + affinity: {{- include "common.tplvalues.render" ( dict "value" .Values.iam.affinity "context" $) | nindent 8 }} + {{- else }} + affinity: + {{- if not (empty .Values.iam.podAffinityPreset) }} + podAffinity: {{- include "common.affinities.pods" (dict "type" .Values.iam.podAffinityPreset "component" "iam" "customLabels" $podLabels "context" $) | nindent 10 }} + {{- end }} + {{- if not (empty .Values.iam.podAntiAffinityPreset) }} + podAntiAffinity: {{- include "common.affinities.pods" (dict "type" .Values.iam.podAntiAffinityPreset "component" "iam" "customLabels" $podLabels "context" $) | nindent 10 }} + {{- end }} + {{- if not (empty .Values.iam.nodeAffinityPreset.type) }} + nodeAffinity: {{- include "common.affinities.nodes" (dict "type" .Values.iam.nodeAffinityPreset.type "key" .Values.iam.nodeAffinityPreset.key "values" .Values.iam.nodeAffinityPreset.values) | nindent 10 }} + {{- end }} + {{- end }} + {{- if .Values.iam.nodeSelector }} + nodeSelector: {{- include "common.tplvalues.render" ( dict "value" .Values.iam.nodeSelector "context" $) | nindent 8 }} + {{- end }} + {{- if .Values.iam.tolerations }} + tolerations: {{- include "common.tplvalues.render" (dict "value" .Values.iam.tolerations "context" .) | nindent 8 }} + {{- end }} + {{- if .Values.iam.priorityClassName }} + priorityClassName: {{ .Values.iam.priorityClassName | quote }} + {{- end }} + {{- if .Values.iam.schedulerName }} + schedulerName: {{ .Values.iam.schedulerName | quote }} + {{- end }} + {{- if .Values.iam.topologySpreadConstraints }} + topologySpreadConstraints: {{- include "common.tplvalues.render" (dict "value" .Values.iam.topologySpreadConstraints "context" .) | nindent 8 }} + {{- end }} + {{- if .Values.iam.podSecurityContext.enabled }} + securityContext: {{- include "common.compatibility.renderSecurityContext" (dict "secContext" .Values.iam.podSecurityContext "context" $) | nindent 8 }} + {{- end }} + {{- if .Values.iam.terminationGracePeriodSeconds }} + terminationGracePeriodSeconds: {{ .Values.iam.terminationGracePeriodSeconds }} + {{- end }} + initContainers: + {{- if .Values.iam.initContainers }} + {{- include "common.tplvalues.render" (dict "value" .Values.iam.initContainers "context" $) | nindent 8 }} + {{- end }} + containers: + - name: seaweedfs + image: {{ template "seaweedfs.image" . }} + imagePullPolicy: {{ .Values.image.pullPolicy }} + {{- if .Values.iam.containerSecurityContext.enabled }} + securityContext: {{- include "common.compatibility.renderSecurityContext" (dict "secContext" .Values.iam.containerSecurityContext "context" $) | nindent 12 }} + {{- end }} + {{- if .Values.diagnosticMode.enabled }} + command: {{- include "common.tplvalues.render" (dict "value" .Values.diagnosticMode.command "context" $) | nindent 12 }} + {{- else if .Values.iam.command }} + command: {{- include "common.tplvalues.render" (dict "value" .Values.iam.command "context" $) | nindent 12 }} + {{- end }} + {{- if .Values.diagnosticMode.enabled }} + args: {{- include "common.tplvalues.render" (dict "value" .Values.diagnosticMode.args "context" $) | nindent 12 }} + {{- else if .Values.iam.args }} + args: {{- include "common.tplvalues.render" (dict "value" .Values.iam.args "context" $) | nindent 12 }} + {{- else }} + args: + - -logtostderr=true + - -v={{ .Values.iam.logLevel }} + - iam + - -port={{ .Values.iam.containerPorts.http }} + - -filer={{ printf "%s:%d" (include "seaweedfs.filer.fullname" .) (int .Values.filer.service.ports.http) }} + - -master={{ printf "%s:%d" (include "seaweedfs.master.fullname" .) (int .Values.master.service.ports.http) }} + {{- end }} + env: + - name: BITNAMI_DEBUG + value: {{ ternary "true" "false" (or .Values.image.debug .Values.diagnosticMode.enabled) | quote }} + - name: WEED_CLUSTER_DEFAULT + value: {{ .Values.clusterDefault | quote }} + {{- if .Values.iam.extraEnvVars }} + {{- include "common.tplvalues.render" (dict "value" .Values.iam.extraEnvVars "context" $) | nindent 12 }} + {{- end }} + {{- if or .Values.iam.extraEnvVarsCM .Values.iam.extraEnvVarsSecret }} + envFrom: + {{- if .Values.iam.extraEnvVarsCM }} + - configMapRef: + name: {{ include "common.tplvalues.render" (dict "value" .Values.iam.extraEnvVarsCM "context" $) }} + {{- end }} + {{- if .Values.iam.extraEnvVarsSecret }} + - secretRef: + name: {{ include "common.tplvalues.render" (dict "value" .Values.iam.extraEnvVarsSecret "context" $) }} + {{- end }} + {{- end }} + {{- if .Values.iam.resources }} + resources: {{- toYaml .Values.iam.resources | nindent 12 }} + {{- else if ne .Values.iam.resourcesPreset "none" }} + resources: {{- include "common.resources.preset" (dict "type" .Values.iam.resourcesPreset) | nindent 12 }} + {{- end }} + ports: + - name: "http" + containerPort: {{ .Values.iam.containerPorts.http }} + {{- if .Values.iam.extraContainerPorts }} + {{- include "common.tplvalues.render" (dict "value" .Values.iam.extraContainerPorts "context" $) | nindent 12 }} + {{- end }} + {{- if not .Values.diagnosticMode.enabled }} + {{- if .Values.iam.customLivenessProbe }} + livenessProbe: {{- include "common.tplvalues.render" (dict "value" .Values.iam.customLivenessProbe "context" $) | nindent 12 }} + {{- else if .Values.iam.livenessProbe.enabled }} + livenessProbe: {{- include "common.tplvalues.render" (dict "value" (omit .Values.iam.livenessProbe "enabled") "context" $) | nindent 12 }} + exec: + command: + - pgrep + - -f + - iam + {{- end }} + {{- if .Values.iam.customReadinessProbe }} + readinessProbe: {{- include "common.tplvalues.render" (dict "value" .Values.iam.customReadinessProbe "context" $) | nindent 12 }} + {{- else if .Values.iam.readinessProbe.enabled }} + readinessProbe: {{- include "common.tplvalues.render" (dict "value" (omit .Values.iam.readinessProbe "enabled") "context" $) | nindent 12 }} + tcpSocket: + port: "http" + {{- end }} + {{- if .Values.iam.customStartupProbe }} + startupProbe: {{- include "common.tplvalues.render" (dict "value" .Values.iam.customStartupProbe "context" $) | nindent 12 }} + {{- else if .Values.iam.startupProbe.enabled }} + startupProbe: {{- include "common.tplvalues.render" (dict "value" (omit .Values.iam.startupProbe "enabled") "context" $) | nindent 12 }} + tcpSocket: + port: "http" + {{- end }} + {{- end }} + {{- if .Values.iam.lifecycleHooks }} + lifecycle: {{- include "common.tplvalues.render" (dict "value" .Values.iam.lifecycleHooks "context" $) | nindent 12 }} + {{- end }} + volumeMounts: + - name: empty-dir + mountPath: /tmp + subPath: tmp-dir + - name: security-config + mountPath: /etc/seaweedfs/security.toml + subPath: security.toml + readOnly: true + {{- if .Values.security.mTLS.enabled }} + - name: ca-cert + readOnly: true + mountPath: /certs/ca + - name: master-cert + readOnly: true + mountPath: /certs/master + - name: filer-cert + readOnly: true + mountPath: /certs/filer + - name: volume-cert + readOnly: true + mountPath: /certs/volume + - name: client-cert + readOnly: true + mountPath: /certs/client + {{- end }} + {{- if .Values.iam.extraVolumeMounts }} + {{- include "common.tplvalues.render" (dict "value" .Values.iam.extraVolumeMounts "context" $) | nindent 12 }} + {{- end }} + {{- if .Values.iam.sidecars }} + {{- include "common.tplvalues.render" ( dict "value" .Values.iam.sidecars "context" $) | nindent 8 }} + {{- end }} + volumes: + - name: empty-dir + emptyDir: {} + - name: security-config + configMap: + name: {{ printf "%s-security" (include "common.names.fullname" .) }} + {{- if .Values.security.mTLS.enabled }} + - name: ca-cert + secret: + secretName: {{ template "seaweedfs.security.mTLS.caSecretName" . }} + items: + - key: tls.crt + path: tls.crt + - name: master-cert + secret: + secretName: {{ template "seaweedfs.security.mTLS.master.secretName" . }} + - name: filer-cert + secret: + secretName: {{ template "seaweedfs.security.mTLS.filer.secretName" . }} + - name: volume-cert + secret: + secretName: {{ template "seaweedfs.security.mTLS.volume.secretName" . }} + - name: client-cert + secret: + secretName: {{ template "seaweedfs.security.mTLS.client.secretName" . }} + {{- end }} + {{- if .Values.iam.extraVolumes }} + {{- include "common.tplvalues.render" (dict "value" .Values.iam.extraVolumes "context" $) | nindent 8 }} + {{- end }} +{{- end }} diff --git a/helm/seaweedfs/templates/iam/pdb.yaml b/helm/seaweedfs/templates/iam/pdb.yaml new file mode 100644 index 0000000000000000000000000000000000000000..6c00475fa5037297f12a3620d660bc25c500bf68 --- /dev/null +++ b/helm/seaweedfs/templates/iam/pdb.yaml @@ -0,0 +1,28 @@ +{{- /* +Copyright Broadcom, Inc. All Rights Reserved. +SPDX-License-Identifier: APACHE-2.0 +*/}} + +{{- if and .Values.filer.enabled .Values.iam.enabled .Values.iam.pdb.create }} +apiVersion: {{ include "common.capabilities.policy.apiVersion" . }} +kind: PodDisruptionBudget +metadata: + name: {{ template "seaweedfs.iam.fullname" . }} + namespace: {{ include "common.names.namespace" . | quote }} + labels: {{- include "common.labels.standard" ( dict "customLabels" .Values.commonLabels "context" $ ) | nindent 4 }} + app.kubernetes.io/component: iam + {{- if .Values.commonAnnotations }} + annotations: {{- include "common.tplvalues.render" ( dict "value" .Values.commonAnnotations "context" $ ) | nindent 4 }} + {{- end }} +spec: + {{- if .Values.iam.pdb.minAvailable }} + minAvailable: {{ .Values.iam.pdb.minAvailable }} + {{- end }} + {{- if or .Values.iam.pdb.maxUnavailable (not .Values.iam.pdb.minAvailable) }} + maxUnavailable: {{ .Values.iam.pdb.maxUnavailable | default 1 }} + {{- end }} + {{- $podLabels := include "common.tplvalues.merge" (dict "values" (list .Values.iam.podLabels .Values.commonLabels) "context" .) }} + selector: + matchLabels: {{- include "common.labels.matchLabels" ( dict "customLabels" $podLabels "context" $ ) | nindent 6 }} + app.kubernetes.io/component: iam +{{- end }} diff --git a/helm/seaweedfs/templates/iam/service.yaml b/helm/seaweedfs/templates/iam/service.yaml new file mode 100644 index 0000000000000000000000000000000000000000..1589697cea5a2372c1f63d967511bcb049923873 --- /dev/null +++ b/helm/seaweedfs/templates/iam/service.yaml @@ -0,0 +1,54 @@ +{{- /* +Copyright Broadcom, Inc. All Rights Reserved. +SPDX-License-Identifier: APACHE-2.0 +*/}} + +{{- if and .Values.filer.enabled .Values.iam.enabled }} +apiVersion: v1 +kind: Service +metadata: + name: {{ template "seaweedfs.iam.fullname" . }} + namespace: {{ include "common.names.namespace" . | quote }} + labels: {{- include "common.labels.standard" ( dict "customLabels" .Values.commonLabels "context" $ ) | nindent 4 }} + app.kubernetes.io/component: iam + {{- if or .Values.iam.service.annotations .Values.commonAnnotations }} + {{- $annotations := include "common.tplvalues.merge" (dict "values" (list .Values.iam.service.annotations .Values.commonAnnotations) "context" .) }} + annotations: {{- include "common.tplvalues.render" ( dict "value" $annotations "context" $ ) | nindent 4 }} + {{- end }} +spec: + type: {{ .Values.iam.service.type }} + {{- if and .Values.iam.service.clusterIP (eq .Values.iam.service.type "ClusterIP") }} + clusterIP: {{ .Values.iam.service.clusterIP }} + {{- end }} + {{- if .Values.iam.service.sessionAffinity }} + sessionAffinity: {{ .Values.iam.service.sessionAffinity }} + {{- end }} + {{- if .Values.iam.service.sessionAffinityConfig }} + sessionAffinityConfig: {{- include "common.tplvalues.render" (dict "value" .Values.iam.service.sessionAffinityConfig "context" $) | nindent 4 }} + {{- end }} + {{- if or (eq .Values.iam.service.type "LoadBalancer") (eq .Values.iam.service.type "NodePort") }} + externalTrafficPolicy: {{ .Values.iam.service.externalTrafficPolicy | quote }} + {{- end }} + {{- if and (eq .Values.iam.service.type "LoadBalancer") (not (empty .Values.iam.service.loadBalancerSourceRanges)) }} + loadBalancerSourceRanges: {{ .Values.iam.service.loadBalancerSourceRanges }} + {{- end }} + {{- if and (eq .Values.iam.service.type "LoadBalancer") (not (empty .Values.iam.service.loadBalancerIP)) }} + loadBalancerIP: {{ .Values.iam.service.loadBalancerIP }} + {{- end }} + ports: + - name: "http" + port: {{ .Values.iam.service.ports.http }} + targetPort: "http" + protocol: TCP + {{- if and (or (eq .Values.iam.service.type "NodePort") (eq .Values.iam.service.type "LoadBalancer")) (not (empty .Values.iam.service.nodePorts.http)) }} + nodePort: {{ .Values.iam.service.nodePorts.http }} + {{- else if eq .Values.iam.service.type "ClusterIP" }} + nodePort: null + {{- end }} + {{- if .Values.iam.service.extraPorts }} + {{- include "common.tplvalues.render" (dict "value" .Values.iam.service.extraPorts "context" $) | nindent 4 }} + {{- end }} + {{- $podLabels := include "common.tplvalues.merge" (dict "values" (list .Values.iam.podLabels .Values.commonLabels) "context" .) | fromYaml }} + selector: {{- include "common.labels.matchLabels" ( dict "customLabels" $podLabels "context" $ ) | nindent 4 }} + app.kubernetes.io/component: iam +{{- end }} diff --git a/helm/seaweedfs/templates/master/hpa.yaml b/helm/seaweedfs/templates/master/hpa.yaml index b807e0be86a1b85e88f32dad997ae250f34d05b4..bc7441d4be87f66d466824691c567e28069c3a35 100644 --- a/helm/seaweedfs/templates/master/hpa.yaml +++ b/helm/seaweedfs/templates/master/hpa.yaml @@ -26,24 +26,16 @@ spec: - type: Resource resource: name: memory - {{- if semverCompare "<1.23-0" (include "common.capabilities.kubeVersion" .) }} - targetAverageUtilization: {{ .Values.master.autoscaling.targetMemory }} - {{- else }} target: type: Utilization averageUtilization: {{ .Values.master.autoscaling.targetMemory }} - {{- end }} {{- end }} {{- if .Values.master.autoscaling.targetCPU }} - type: Resource resource: name: cpu - {{- if semverCompare "<1.23-0" (include "common.capabilities.kubeVersion" .) }} - targetAverageUtilization: {{ .Values.master.autoscaling.targetCPU }} - {{- else }} target: type: Utilization averageUtilization: {{ .Values.master.autoscaling.targetCPU }} - {{- end }} {{- end }} {{- end }} diff --git a/helm/seaweedfs/templates/master/ingress.yaml b/helm/seaweedfs/templates/master/ingress.yaml index c22d1f143bf4de3a4f1136f92f14e2dae38ea478..d76ee7d231d73534b76816088a54f5661ae5d373 100644 --- a/helm/seaweedfs/templates/master/ingress.yaml +++ b/helm/seaweedfs/templates/master/ingress.yaml @@ -16,7 +16,7 @@ metadata: annotations: {{- include "common.tplvalues.render" ( dict "value" $annotations "context" $ ) | nindent 4 }} {{- end }} spec: - {{- if and .Values.master.ingress.ingressClassName (eq "true" (include "common.ingress.supportsIngressClassname" .)) }} + {{- if .Values.master.ingress.ingressClassName }} ingressClassName: {{ .Values.master.ingress.ingressClassName | quote }} {{- end }} rules: @@ -27,9 +27,7 @@ spec: {{- toYaml .Values.master.ingress.extraPaths | nindent 10 }} {{- end }} - path: {{ .Values.master.ingress.path }} - {{- if eq "true" (include "common.ingress.supportsPathType" .) }} pathType: {{ .Values.master.ingress.pathType }} - {{- end }} backend: {{- include "common.ingress.backend" (dict "serviceName" (include "seaweedfs.master.fullname" .) "servicePort" "http" "context" $) | nindent 14 }} {{- if not (empty .Values.master.ingress.hostname )}} host: {{ .Values.master.ingress.hostname }} @@ -40,9 +38,7 @@ spec: http: paths: - path: {{ default "/" .path }} - {{- if eq "true" (include "common.ingress.supportsPathType" $) }} pathType: {{ default "ImplementationSpecific" .pathType }} - {{- end }} backend: {{- include "common.ingress.backend" (dict "serviceName" (include "seaweedfs.master.fullname" $) "servicePort" "http" "context" $) | nindent 14 }} {{- end }} {{- if .Values.master.ingress.extraRules }} diff --git a/helm/seaweedfs/templates/master/statefulset.yaml b/helm/seaweedfs/templates/master/statefulset.yaml index 22aa1180e8a0757bb55c4a63c52dfcb8f00e4284..67e09277dfe60ade5b2ab4bb890583a1de0839ba 100644 --- a/helm/seaweedfs/templates/master/statefulset.yaml +++ b/helm/seaweedfs/templates/master/statefulset.yaml @@ -130,7 +130,11 @@ spec: args: {{- include "common.tplvalues.render" (dict "value" .Values.master.args "context" $) | nindent 12 }} {{- else }} args: + {{- if .Values.master.logPersistence.enabled }} + - -logdir={{ .Values.master.logPersistence.mountPath }} + {{- else }} - -logtostderr=true + {{- end }} - -v={{ .Values.master.logLevel }} - -config_dir=/etc/seaweedfs - master @@ -223,6 +227,13 @@ spec: {{- if .Values.master.persistence.subPath }} subPath: {{ .Values.master.persistence.subPath }} {{- end }} + {{- if .Values.master.logPersistence.enabled }} + - name: logs + mountPath: {{ .Values.master.logPersistence.mountPath }} + {{- if .Values.master.logPersistence.subPath }} + subPath: {{ .Values.master.logPersistence.subPath }} + {{- end }} + {{- end }} - name: empty-dir mountPath: /tmp subPath: tmp-dir @@ -297,20 +308,27 @@ spec: {{- if .Values.master.extraVolumes }} {{- include "common.tplvalues.render" (dict "value" .Values.master.extraVolumes "context" $) | nindent 8 }} {{- end }} - {{- if not .Values.master.persistence.enabled }} + {{- if not .Values.master.persistence.enabled }} - name: data emptyDir: {} - {{- else if .Values.master.persistence.existingClaim }} + {{- else if .Values.master.persistence.existingClaim }} - name: data persistentVolumeClaim: - claimName: {{ .Values.master.persistence.existingClaim }} - {{- else }} + claimName: {{ tpl .Values.master.persistence.existingClaim . }} + {{- end }} + {{- if and .Values.master.logPersistence.enabled .Values.master.logPersistence.existingClaim }} + - name: logs + persistentVolumeClaim: + claimName: {{ tpl .Values.master.logPersistence.existingClaim . }} + {{- end }} + {{- if or (and .Values.master.persistence.enabled (not .Values.master.persistence.existingClaim)) (and .Values.master.logPersistence.enabled (not .Values.master.logPersistence.existingClaim)) }} {{- if .Values.master.persistentVolumeClaimRetentionPolicy.enabled }} persistentVolumeClaimRetentionPolicy: whenDeleted: {{ .Values.master.persistentVolumeClaimRetentionPolicy.whenDeleted }} whenScaled: {{ .Values.master.persistentVolumeClaimRetentionPolicy.whenScaled }} {{- end }} volumeClaimTemplates: + {{- if and .Values.master.persistence.enabled (not .Values.master.persistence.existingClaim) }} - apiVersion: v1 kind: PersistentVolumeClaim metadata: @@ -337,4 +355,33 @@ spec: selector: {{- include "common.tplvalues.render" (dict "value" .Values.master.persistence.selector "context" $) | nindent 10 }} {{- end }} {{- include "common.storage.class" (dict "persistence" .Values.master.persistence "global" .Values.global) | nindent 8 }} + {{- end }} + {{- if and .Values.master.logPersistence.enabled (not .Values.master.logPersistence.existingClaim) }} + - apiVersion: v1 + kind: PersistentVolumeClaim + metadata: + name: logs + {{- if or .Values.master.logPersistence.annotations .Values.commonAnnotations }} + {{- $claimAnnotations := include "common.tplvalues.merge" (dict "values" .Values.master.logPersistence.annotations .Values.commonAnnotations "context" .) | fromYaml }} + annotations: {{- include "common.tplvalues.render" ( dict "value" $claimAnnotations "context" $ ) | nindent 10 }} + {{- end }} + {{- if .Values.commonLabels }} + labels: {{- include "common.labels.matchLabels" ( dict "customLabels" .Values.commonLabels "context" $ ) | nindent 10 }} + {{- end }} + spec: + {{- if .Values.master.logPersistence.dataSource }} + dataSource: {{- include "common.tplvalues.render" (dict "value" .Values.master.logPersistence.dataSource "context" $) | nindent 10 }} + {{- end }} + accessModes: + {{- range .Values.master.logPersistence.accessModes }} + - {{ . | quote }} + {{- end }} + resources: + requests: + storage: {{ .Values.master.logPersistence.size | quote }} + {{- if .Values.master.logPersistence.selector }} + selector: {{- include "common.tplvalues.render" (dict "value" .Values.master.logPersistence.selector "context" $) | nindent 10 }} + {{- end }} + {{- include "common.storage.class" (dict "persistence" .Values.master.logPersistence "global" .Values.global) | nindent 8 }} + {{- end }} {{- end }} diff --git a/helm/seaweedfs/templates/s3/deployment.yaml b/helm/seaweedfs/templates/s3/deployment.yaml index 94bdbe54fab4adc521c59352652da45eb1f35e00..2866f56b36afe958cb7768b969e812a3e29cfc69 100644 --- a/helm/seaweedfs/templates/s3/deployment.yaml +++ b/helm/seaweedfs/templates/s3/deployment.yaml @@ -40,7 +40,7 @@ spec: app.kubernetes.io/component: s3 spec: {{- include "seaweedfs.imagePullSecrets" . | nindent 6 }} - serviceAccountName: {{ template "seaweedfs.serviceAccountName" . }} + serviceAccountName: {{ template "seaweedfs.serviceAccountName" . }} automountServiceAccountToken: {{ .Values.s3.automountServiceAccountToken }} {{- if .Values.s3.hostAliases }} hostAliases: {{- include "common.tplvalues.render" (dict "value" .Values.s3.hostAliases "context" $) | nindent 8 }} @@ -118,6 +118,7 @@ spec: - -metricsPort={{ .Values.s3.containerPorts.metrics }} {{- end }} - -filer={{ printf "%s:%d" (include "seaweedfs.filer.fullname" .) (int .Values.filer.service.ports.http) }} + - -allowEmptyFolder={{ .Values.s3.allowEmptyFolder }} {{- end }} env: - name: BITNAMI_DEBUG @@ -230,6 +231,11 @@ spec: volumes: - name: empty-dir emptyDir: {} + {{- if .Values.usePasswordFiles }} + - name: seaweed-secrets + secret: + secretName: {{ printf "%s-auth" (include "seaweedfs.s3.fullname" .) }} + {{- end }} {{- if and .Values.s3.auth.enabled .Values.s3.auth.existingSecret }} - name: auth secret: diff --git a/helm/seaweedfs/templates/s3/hpa.yaml b/helm/seaweedfs/templates/s3/hpa.yaml index 26aae790f7799e5593cef4365b7759449100794b..4af087ad1f36a7f95d0b53d6c7948bca2f988273 100644 --- a/helm/seaweedfs/templates/s3/hpa.yaml +++ b/helm/seaweedfs/templates/s3/hpa.yaml @@ -26,24 +26,16 @@ spec: - type: Resource resource: name: memory - {{- if semverCompare "<1.23-0" (include "common.capabilities.kubeVersion" .) }} - targetAverageUtilization: {{ .Values.s3.autoscaling.targetMemory }} - {{- else }} target: type: Utilization averageUtilization: {{ .Values.s3.autoscaling.targetMemory }} - {{- end }} {{- end }} {{- if .Values.s3.autoscaling.targetCPU }} - type: Resource resource: name: cpu - {{- if semverCompare "<1.23-0" (include "common.capabilities.kubeVersion" .) }} - targetAverageUtilization: {{ .Values.s3.autoscaling.targetCPU }} - {{- else }} target: type: Utilization averageUtilization: {{ .Values.s3.autoscaling.targetCPU }} - {{- end }} {{- end }} {{- end }} diff --git a/helm/seaweedfs/templates/s3/ingress.yaml b/helm/seaweedfs/templates/s3/ingress.yaml index 9f55b3aae6ee63d91bdf637448fe9963cc84e2dc..51cfa640d848bbc7da25e6944d0033e8701fe3f5 100644 --- a/helm/seaweedfs/templates/s3/ingress.yaml +++ b/helm/seaweedfs/templates/s3/ingress.yaml @@ -16,7 +16,7 @@ metadata: annotations: {{- include "common.tplvalues.render" ( dict "value" $annotations "context" $ ) | nindent 4 }} {{- end }} spec: - {{- if and .Values.s3.ingress.ingressClassName (eq "true" (include "common.ingress.supportsIngressClassname" .)) }} + {{- if .Values.s3.ingress.ingressClassName }} ingressClassName: {{ .Values.s3.ingress.ingressClassName | quote }} {{- end }} rules: @@ -27,9 +27,7 @@ spec: {{- toYaml .Values.s3.ingress.extraPaths | nindent 10 }} {{- end }} - path: {{ .Values.s3.ingress.path }} - {{- if eq "true" (include "common.ingress.supportsPathType" .) }} pathType: {{ .Values.s3.ingress.pathType }} - {{- end }} backend: {{- include "common.ingress.backend" (dict "serviceName" (include "seaweedfs.s3.fullname" .) "servicePort" "http" "context" $) | nindent 14 }} {{- if not (empty .Values.s3.ingress.hostname )}} host: {{ .Values.s3.ingress.hostname }} @@ -40,9 +38,7 @@ spec: http: paths: - path: {{ default "/" .path }} - {{- if eq "true" (include "common.ingress.supportsPathType" $) }} pathType: {{ default "ImplementationSpecific" .pathType }} - {{- end }} backend: {{- include "common.ingress.backend" (dict "serviceName" (include "seaweedfs.s3.fullname" $) "servicePort" "http" "context" $) | nindent 14 }} {{- end }} {{- if .Values.s3.ingress.extraRules }} diff --git a/helm/seaweedfs/templates/volume/hpa.yaml b/helm/seaweedfs/templates/volume/hpa.yaml index 5c458873f6537b80a67795bd83be138aca17be46..5d7992beb1ac7a4baae71f481a1be77180d0a794 100644 --- a/helm/seaweedfs/templates/volume/hpa.yaml +++ b/helm/seaweedfs/templates/volume/hpa.yaml @@ -26,24 +26,16 @@ spec: - type: Resource resource: name: memory - {{- if semverCompare "<1.23-0" (include "common.capabilities.kubeVersion" .) }} - targetAverageUtilization: {{ .Values.volume.autoscaling.targetMemory }} - {{- else }} target: type: Utilization averageUtilization: {{ .Values.volume.autoscaling.targetMemory }} - {{- end }} {{- end }} {{- if .Values.volume.autoscaling.targetCPU }} - type: Resource resource: name: cpu - {{- if semverCompare "<1.23-0" (include "common.capabilities.kubeVersion" .) }} - targetAverageUtilization: {{ .Values.volume.autoscaling.targetCPU }} - {{- else }} target: type: Utilization averageUtilization: {{ .Values.volume.autoscaling.targetCPU }} - {{- end }} {{- end }} {{- end }} diff --git a/helm/seaweedfs/templates/volume/ingress.yaml b/helm/seaweedfs/templates/volume/ingress.yaml index 6c3680b94faaf01ec5048705519e8299d3bfdb41..18544f670e071c1eae4ec495327ee4715edd17f8 100644 --- a/helm/seaweedfs/templates/volume/ingress.yaml +++ b/helm/seaweedfs/templates/volume/ingress.yaml @@ -16,7 +16,7 @@ metadata: annotations: {{- include "common.tplvalues.render" ( dict "value" $annotations "context" $ ) | nindent 4 }} {{- end }} spec: - {{- if and .Values.volume.ingress.ingressClassName (eq "true" (include "common.ingress.supportsIngressClassname" .)) }} + {{- if .Values.volume.ingress.ingressClassName }} ingressClassName: {{ .Values.volume.ingress.ingressClassName | quote }} {{- end }} rules: @@ -27,9 +27,7 @@ spec: {{- toYaml .Values.volume.ingress.extraPaths | nindent 10 }} {{- end }} - path: {{ .Values.volume.ingress.path }} - {{- if eq "true" (include "common.ingress.supportsPathType" .) }} pathType: {{ .Values.volume.ingress.pathType }} - {{- end }} backend: {{- include "common.ingress.backend" (dict "serviceName" (include "seaweedfs.volume.fullname" .) "servicePort" "http" "context" $) | nindent 14 }} {{- if not (empty .Values.volume.ingress.hostname )}} host: {{ .Values.volume.ingress.hostname }} @@ -40,9 +38,7 @@ spec: http: paths: - path: {{ default "/" .path }} - {{- if eq "true" (include "common.ingress.supportsPathType" $) }} pathType: {{ default "ImplementationSpecific" .pathType }} - {{- end }} backend: {{- include "common.ingress.backend" (dict "serviceName" (include "seaweedfs.volume.fullname" $) "servicePort" "http" "context" $) | nindent 14 }} {{- end }} {{- if .Values.volume.ingress.extraRules }} diff --git a/helm/seaweedfs/templates/volume/statefulset.yaml b/helm/seaweedfs/templates/volume/statefulset.yaml index 3ba977a7724c8c8c460f7dee623a906b72bf5695..c02cae0d84478ca8403066e1a868b7ac090cc49e 100644 --- a/helm/seaweedfs/templates/volume/statefulset.yaml +++ b/helm/seaweedfs/templates/volume/statefulset.yaml @@ -135,7 +135,11 @@ spec: args: {{- include "common.tplvalues.render" (dict "value" .Values.volume.args "context" $) | nindent 12 }} {{- else }} args: + {{- if .Values.volume.logPersistence.enabled }} + - -logdir={{ .Values.volume.logPersistence.mountPath }} + {{- else }} - -logtostderr=true + {{- end }} - -v={{ .Values.volume.logLevel }} - -config_dir=/etc/seaweedfs - volume @@ -219,7 +223,7 @@ spec: {{- else if .Values.volume.readinessProbe.enabled }} readinessProbe: {{- include "common.tplvalues.render" (dict "value" (omit .Values.volume.readinessProbe "enabled") "context" $) | nindent 12 }} httpGet: - path: /status + path: /healthz port: http {{- end }} {{- if .Values.volume.customStartupProbe }} @@ -242,6 +246,13 @@ spec: subPath: {{ .subPath }} {{- end }} {{- end }} + {{- if .Values.volume.logPersistence.enabled }} + - name: logs + mountPath: {{ .Values.volume.logPersistence.mountPath }} + {{- if .Values.volume.logPersistence.subPath }} + subPath: {{ .Values.volume.logPersistence.subPath }} + {{- end }} + {{- end }} - name: empty-dir mountPath: /tmp subPath: tmp-dir @@ -326,14 +337,19 @@ spec: claimName: {{ .persistence.existingClaim }} {{- end }} {{- end }} + {{- if and .Values.volume.logPersistence.enabled .Values.volume.logPersistence.existingClaim }} + - name: logs + persistentVolumeClaim: + claimName: {{ tpl .Values.volume.logPersistence.existingClaim . }} + {{- end }} {{- if .Values.volume.persistentVolumeClaimRetentionPolicy.enabled }} persistentVolumeClaimRetentionPolicy: whenDeleted: {{ .Values.volume.persistentVolumeClaimRetentionPolicy.whenDeleted }} whenScaled: {{ .Values.volume.persistentVolumeClaimRetentionPolicy.whenScaled }} {{- end }} volumeClaimTemplates: - {{- range .Values.volume.dataVolumes }} - {{- if and .persistence.enabled (not .persistence.existingClaim) }} + {{- range .Values.volume.dataVolumes }} + {{- if and .persistence.enabled (not .persistence.existingClaim) }} - apiVersion: v1 kind: PersistentVolumeClaim metadata: @@ -360,5 +376,33 @@ spec: selector: {{- include "common.tplvalues.render" (dict "value" .persistence.selector "context" $) | nindent 10 }} {{- end }} {{- include "common.storage.class" (dict "persistence" .persistence "global" $.Values.global) | nindent 8 }} - {{- end }} - {{- end }} + {{- end }} + {{- end }} + {{- if and .Values.volume.logPersistence.enabled (not .Values.volume.logPersistence.existingClaim) }} + - apiVersion: v1 + kind: PersistentVolumeClaim + metadata: + name: logs + {{- if or .Values.volume.logPersistence.annotations .Values.commonAnnotations }} + {{- $claimAnnotations := include "common.tplvalues.merge" (dict "values" .Values.volume.logPersistence.annotations .Values.commonAnnotations "context" .) | fromYaml }} + annotations: {{- include "common.tplvalues.render" ( dict "value" $claimAnnotations "context" $ ) | nindent 10 }} + {{- end }} + {{- if .Values.commonLabels }} + labels: {{- include "common.labels.matchLabels" ( dict "customLabels" .Values.commonLabels "context" $ ) | nindent 10 }} + {{- end }} + spec: + {{- if .Values.volume.logPersistence.dataSource }} + dataSource: {{- include "common.tplvalues.render" (dict "value" .Values.volume.logPersistence.dataSource "context" $) | nindent 10 }} + {{- end }} + accessModes: + {{- range .Values.volume.logPersistence.accessModes }} + - {{ . | quote }} + {{- end }} + resources: + requests: + storage: {{ .Values.volume.logPersistence.size | quote }} + {{- if .Values.volume.logPersistence.selector }} + selector: {{- include "common.tplvalues.render" (dict "value" .Values.volume.logPersistence.selector "context" $) | nindent 10 }} + {{- end }} + {{- include "common.storage.class" (dict "persistence" .Values.volume.logPersistence "global" .Values.global) | nindent 8 }} + {{- end }} diff --git a/helm/seaweedfs/templates/webadv/hpa.yaml b/helm/seaweedfs/templates/webadv/hpa.yaml index e6434c258b6694736744052686dbda514797bc42..9c2208c369b6e3de2bd84ba1ff86c6d1c78d8324 100644 --- a/helm/seaweedfs/templates/webadv/hpa.yaml +++ b/helm/seaweedfs/templates/webadv/hpa.yaml @@ -26,24 +26,16 @@ spec: - type: Resource resource: name: memory - {{- if semverCompare "<1.23-0" (include "common.capabilities.kubeVersion" .) }} - targetAverageUtilization: {{ .Values.webdav.autoscaling.targetMemory }} - {{- else }} target: type: Utilization averageUtilization: {{ .Values.webdav.autoscaling.targetMemory }} - {{- end }} {{- end }} {{- if .Values.webdav.autoscaling.targetCPU }} - type: Resource resource: name: cpu - {{- if semverCompare "<1.23-0" (include "common.capabilities.kubeVersion" .) }} - targetAverageUtilization: {{ .Values.webdav.autoscaling.targetCPU }} - {{- else }} target: type: Utilization averageUtilization: {{ .Values.webdav.autoscaling.targetCPU }} - {{- end }} {{- end }} {{- end }} diff --git a/helm/seaweedfs/templates/webadv/ingress.yaml b/helm/seaweedfs/templates/webadv/ingress.yaml index a42d6e9e3491709a4d69bdafd6eabe8ecbd2609b..821216f34d5011acb6473216253bf61f8aecb533 100644 --- a/helm/seaweedfs/templates/webadv/ingress.yaml +++ b/helm/seaweedfs/templates/webadv/ingress.yaml @@ -16,7 +16,7 @@ metadata: annotations: {{- include "common.tplvalues.render" ( dict "value" $annotations "context" $ ) | nindent 4 }} {{- end }} spec: - {{- if and .Values.webdav.ingress.ingressClassName (eq "true" (include "common.ingress.supportsIngressClassname" .)) }} + {{- if .Values.webdav.ingress.ingressClassName }} ingressClassName: {{ .Values.webdav.ingress.ingressClassName | quote }} {{- end }} rules: @@ -27,9 +27,7 @@ spec: {{- toYaml .Values.webdav.ingress.extraPaths | nindent 10 }} {{- end }} - path: {{ .Values.webdav.ingress.path }} - {{- if eq "true" (include "common.ingress.supportsPathType" .) }} pathType: {{ .Values.webdav.ingress.pathType }} - {{- end }} backend: {{- include "common.ingress.backend" (dict "serviceName" (include "seaweedfs.webdav.fullname" .) "servicePort" (ternary "https" "http" .Values.webdav.tls.enabled) "context" $) | nindent 14 }} {{- if not (empty .Values.webdav.ingress.hostname )}} host: {{ .Values.webdav.ingress.hostname }} @@ -40,9 +38,7 @@ spec: http: paths: - path: {{ default "/" .path }} - {{- if eq "true" (include "common.ingress.supportsPathType" $) }} pathType: {{ default "ImplementationSpecific" .pathType }} - {{- end }} backend: {{- include "common.ingress.backend" (dict "serviceName" (include "seaweedfs.webdav.fullname" $) "servicePort" ("https" "http" .Values.webdav.tls.enabled) "context" $) | nindent 14 }} {{- end }} {{- if .Values.webdav.ingress.extraRules }} diff --git a/helm/seaweedfs/values.yaml b/helm/seaweedfs/values.yaml index cbe833459d19a54b31f90cbfe31fc1e7569f695e..40321455a2a7e891b626ddca370a7512afa2de42 100644 --- a/helm/seaweedfs/values.yaml +++ b/helm/seaweedfs/values.yaml @@ -85,7 +85,7 @@ diagnosticMode: image: registry: docker.io repository: bitnami/seaweedfs - tag: 3.80.0-debian-12-r1 + tag: 3.87.0-debian-12-r1 digest: "" ## Specify a imagePullPolicy ## ref: https://kubernetes.io/docs/concepts/containers/images/#pre-pulled-images @@ -314,7 +314,7 @@ master: drop: ["ALL"] seccompProfile: type: "RuntimeDefault" - ## @param master.logLevel Master Server log level [0|1|2|3|4] + ## @param master.logLevel Master Server log level (0, 1, 2, 3, or 4) ## logLevel: 1 ## @param master.bindAddress Master Server bind address @@ -324,7 +324,7 @@ master: ## volumeSizeLimitMB: 1000 ## @param master.config Master Server configuration - ## Specify content for master.yml + ## Specify content for master.toml ## config: "" ## @param master.existingConfigmap The name of an existing ConfigMap with your custom configuration for Master Server @@ -716,11 +716,11 @@ master: ## @section Master Server Persistence Parameters ## - ## Enable persistence using Persistent Volume Claims + ## Enable Master data persistence using Persistent Volume Claims ## ref: https://kubernetes.io/docs/concepts/storage/persistent-volumes/ ## persistence: - ## @param master.persistence.enabled Enable persistence on Master Server using Persistent Volume Claims + ## @param master.persistence.enabled Enable data persistence on Master Server using Persistent Volume Claims ## enabled: true ## @param master.persistence.mountPath Path to mount the volume at. @@ -747,7 +747,7 @@ master: ## @param master.persistence.size Size of data volume ## size: 8Gi - ## @param master.persistence.existingClaim The name of an existing PVC to use for persistence + ## @param master.persistence.existingClaim The name of an existing PVC to use for data persistence ## existingClaim: "" ## @param master.persistence.selector Selector to match an existing Persistent Volume for data PVC @@ -761,6 +761,51 @@ master: ## @param master.persistence.dataSource Custom PVC data source ## dataSource: {} + ## Enable Master logs persistence using Persistent Volume Claims + ## ref: https://kubernetes.io/docs/concepts/storage/persistent-volumes/ + ## + logPersistence: + ## @param master.logPersistence.enabled Enable logs persistence on Master Server using Persistent Volume Claims + ## + enabled: false + ## @param master.logPersistence.mountPath Path to mount the volume at. + ## + mountPath: /logs + ## @param master.logPersistence.subPath The subdirectory of the volume to mount to, useful in dev environments and one PV for multiple services + ## + subPath: "" + ## @param master.logPersistence.storageClass Storage class of backing PVC + ## If defined, storageClassName: <storageClass> + ## If set to "-", storageClassName: "", which disables dynamic provisioning + ## If undefined (the default) or set to null, no storageClassName spec is + ## set, choosing the default provisioner. (gp2 on AWS, standard on + ## GKE, AWS & OpenStack) + ## + storageClass: "" + ## @param master.logPersistence.annotations Persistent Volume Claim annotations + ## + annotations: {} + ## @param master.logPersistence.accessModes Persistent Volume Access Modes + ## + accessModes: + - ReadWriteOnce + ## @param master.logPersistence.size Size of logs volume + ## + size: 8Gi + ## @param master.logPersistence.existingClaim The name of an existing PVC to use for logs persistence + ## + existingClaim: "" + ## @param master.logPersistence.selector Selector to match an existing Persistent Volume for logs PVC + ## If set, the PVC can't have a PV dynamically provisioned for it + ## E.g. + ## selector: + ## matchLabels: + ## app: my-app + ## + selector: {} + ## @param master.logPersistence.dataSource Custom PVC data source + ## + dataSource: {} ## persistentVolumeClaimRetentionPolicy ## ref: https://kubernetes.io/docs/concepts/workloads/controllers/statefulset/#persistentvolumeclaim-retention ## @param master.persistentVolumeClaimRetentionPolicy.enabled Controls if and how PVCs are deleted during the lifecycle of the Master Server StatefulSet @@ -964,7 +1009,7 @@ volume: drop: ["ALL"] seccompProfile: type: "RuntimeDefault" - ## @param volume.logLevel Volume Server log level [0|1|2|3|4] + ## @param volume.logLevel Volume Server log level (0, 1, 2, 3, or 4) ## logLevel: 1 ## @param volume.bindAddress Volume Server bind address @@ -974,7 +1019,7 @@ volume: ## publicUrl: "" ## @param volume.config Volume Server configuration - ## Specify content for volume.yml + ## Specify content for volume.toml ## config: "" ## @param volume.existingConfigmap The name of an existing ConfigMap with your custom configuration for Volume Server @@ -1421,6 +1466,51 @@ volume: ## @param volume.dataVolumes[0].persistence.dataSource Custom PVC data source ## dataSource: {} + ## Enable Volume logs persistence using Persistent Volume Claims + ## ref: https://kubernetes.io/docs/concepts/storage/persistent-volumes/ + ## + logPersistence: + ## @param volume.logPersistence.enabled Enable logs persistence on Volume Server using Persistent Volume Claims + ## + enabled: false + ## @param volume.logPersistence.mountPath Path to mount the volume at. + ## + mountPath: /logs + ## @param volume.logPersistence.subPath The subdirectory of the volume to mount to, useful in dev environments and one PV for multiple services + ## + subPath: "" + ## @param volume.logPersistence.storageClass Storage class of backing PVC + ## If defined, storageClassName: <storageClass> + ## If set to "-", storageClassName: "", which disables dynamic provisioning + ## If undefined (the default) or set to null, no storageClassName spec is + ## set, choosing the default provisioner. (gp2 on AWS, standard on + ## GKE, AWS & OpenStack) + ## + storageClass: "" + ## @param volume.logPersistence.annotations Persistent Volume Claim annotations + ## + annotations: {} + ## @param volume.logPersistence.accessModes Persistent Volume Access Modes + ## + accessModes: + - ReadWriteOnce + ## @param volume.logPersistence.size Size of logs volume + ## + size: 8Gi + ## @param volume.logPersistence.existingClaim The name of an existing PVC to use for logs persistence + ## + existingClaim: "" + ## @param volume.logPersistence.selector Selector to match an existing Persistent Volume for logs PVC + ## If set, the PVC can't have a PV dynamically provisioned for it + ## E.g. + ## selector: + ## matchLabels: + ## app: my-app + ## + selector: {} + ## @param volume.logPersistence.dataSource Custom PVC data source + ## + dataSource: {} ## persistentVolumeClaimRetentionPolicy ## ref: https://kubernetes.io/docs/concepts/workloads/controllers/statefulset/#persistentvolumeclaim-retention ## @param volume.persistentVolumeClaimRetentionPolicy.enabled Controls if and how PVCs are deleted during the lifecycle of the Volume Server StatefulSet @@ -1627,14 +1717,14 @@ filer: drop: ["ALL"] seccompProfile: type: "RuntimeDefault" - ## @param filer.logLevel Filer Server log level [0|1|2|3|4] + ## @param filer.logLevel Filer Server log level (0, 1, 2, 3, or 4) ## logLevel: 1 ## @param filer.bindAddress Filer Server bind address ## bindAddress: 0.0.0.0 ## @param filer.config Filer Server configuration - ## Specify content for filer.yml + ## Specify content for filer.toml ## config: | [leveldb2] @@ -1642,6 +1732,13 @@ filer: ## @param filer.existingConfigmap The name of an existing ConfigMap with your custom configuration for Filer Server ## existingConfigmap: "" + ## @param filer.notificationConfig Filer Server notification configuration + ## Specify content for custom notification.toml + ## + notificationConfig: "" + ## @param filer.existingNotificationConfigmap The name of an existing ConfigMap with your custom notification configuration for Filer Server + ## + existingNotificationConfigmap: "" ## @param filer.command Override default Filer Server container command (useful when using custom images) ## command: [] @@ -2025,6 +2122,65 @@ filer: ## extraRules: [] + ## @section Filer Server Persistence Parameters + ## + + ## Enable Filer logs persistence using Persistent Volume Claims + ## ref: https://kubernetes.io/docs/concepts/storage/persistent-volumes/ + ## + logPersistence: + ## @param filer.logPersistence.enabled Enable logs persistence on Filer Server using Persistent Volume Claims + ## + enabled: false + ## @param filer.logPersistence.mountPath Path to mount the volume at. + ## + mountPath: /logs + ## @param filer.logPersistence.subPath The subdirectory of the volume to mount to, useful in dev environments and one PV for multiple services + ## + subPath: "" + ## @param filer.logPersistence.storageClass Storage class of backing PVC + ## If defined, storageClassName: <storageClass> + ## If set to "-", storageClassName: "", which disables dynamic provisioning + ## If undefined (the default) or set to null, no storageClassName spec is + ## set, choosing the default provisioner. (gp2 on AWS, standard on + ## GKE, AWS & OpenStack) + ## + storageClass: "" + ## @param filer.logPersistence.annotations Persistent Volume Claim annotations + ## + annotations: {} + ## @param filer.logPersistence.accessModes Persistent Volume Access Modes + ## + accessModes: + - ReadWriteOnce + ## @param filer.logPersistence.size Size of logs volume + ## + size: 8Gi + ## @param filer.logPersistence.existingClaim The name of an existing PVC to use for logs persistence + ## + existingClaim: "" + ## @param filer.logPersistence.selector Selector to match an existing Persistent Volume for logs PVC + ## If set, the PVC can't have a PV dynamically provisioned for it + ## E.g. + ## selector: + ## matchLabels: + ## app: my-app + ## + selector: {} + ## @param filer.logPersistence.dataSource Custom PVC data source + ## + dataSource: {} + ## persistentVolumeClaimRetentionPolicy + ## ref: https://kubernetes.io/docs/concepts/workloads/controllers/statefulset/#persistentvolumeclaim-retention + ## @param filer.persistentVolumeClaimRetentionPolicy.enabled Controls if and how PVCs are deleted during the lifecycle of the Master Server StatefulSet + ## @param filer.persistentVolumeClaimRetentionPolicy.whenScaled Volume retention behavior when the replica count of the StatefulSet is reduced + ## @param filer.persistentVolumeClaimRetentionPolicy.whenDeleted Volume retention behavior that applies when the StatefulSet is deleted + ## + persistentVolumeClaimRetentionPolicy: + enabled: false + whenScaled: Retain + whenDeleted: Retain + ## @section Filer Server Metrics Parameters ## metrics: @@ -2220,21 +2376,23 @@ s3: drop: ["ALL"] seccompProfile: type: "RuntimeDefault" - ## @param s3.logLevel Amazon S3 API log level [0|1|2|3|4] + ## @param s3.logLevel Amazon S3 API log level (0, 1, 2, 3, or 4) ## logLevel: 1 ## @param s3.bindAddress Amazon S3 API bind address ## bindAddress: 0.0.0.0 + ## @param s3.allowEmptyFolder Allow empty folders in Amazon S3 API + allowEmptyFolder: true ## S3 Authentication ## ref: https://github.com/seaweedfs/seaweedfs/wiki/Amazon-S3-API#s3-authentication ## @param s3.auth.enabled Enable Amazon S3 API authentication ## @param s3.auth.existingSecret Existing secret with Amazon S3 API authentication configuration ## @param s3.auth.existingSecretConfigKey Key of the above existing secret with S3 API authentication configuration, defaults to `config.json` - ## @param s3.auth.adminAccessKeyId Amazon S3 API access key with admin privileges. Ignored if `security.mTLS.volume.existingSecret` is set - ## @param s3.auth.adminSecretAccessKey Amazon S3 API secret key with admin privileges. Ignored if `security.mTLS.volume.existingSecret` is set - ## @param s3.auth.readAccessKeyId Amazon S3 API read access key with read-only privileges. Ignored if `security.mTLS.volume.existingSecret` is set - ## @param s3.auth.readSecretAccessKey Amazon S3 API read secret key with read-only privileges. Ignored if `security.mTLS.volume.existingSecret` is set + ## @param s3.auth.adminAccessKeyId Amazon S3 API access key with admin privileges. Ignored if `s3.auth.existingSecret` is set + ## @param s3.auth.adminSecretAccessKey Amazon S3 API secret key with admin privileges. Ignored if `s3.auth.existingSecret` is set + ## @param s3.auth.readAccessKeyId Amazon S3 API read access key with read-only privileges. Ignored if `s3.auth.existingSecret` is set + ## @param s3.auth.readSecretAccessKey Amazon S3 API read secret key with read-only privileges. Ignored if `s3.auth.existingSecret` is set ## auth: enabled: false @@ -2814,7 +2972,7 @@ webdav: drop: ["ALL"] seccompProfile: type: "RuntimeDefault" - ## @param webdav.logLevel WebDAV log level [0|1|2|3|4] + ## @param webdav.logLevel WebDAV log level (0, 1, 2, 3, or 4) ## logLevel: 1 ## TLS configuration for WebDAV @@ -3223,6 +3381,326 @@ webdav: ## extraRules: [] +## @section IAM Parameters +## +iam: + ## @param iam.enabled Enable IAM deployment + ## + enabled: false + ## @param iam.replicaCount Number of IAM replicas to deploy + ## + replicaCount: 1 + ## @param iam.containerPorts.http IAM HTTP container port + ## + containerPorts: + http: 8111 + ## Configure extra options for IAM containers' liveness and readiness probes + ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-probes/#configure-probes + ## @param iam.livenessProbe.enabled Enable livenessProbe on IAM containers + ## @param iam.livenessProbe.initialDelaySeconds Initial delay seconds for livenessProbe + ## @param iam.livenessProbe.periodSeconds Period seconds for livenessProbe + ## @param iam.livenessProbe.timeoutSeconds Timeout seconds for livenessProbe + ## @param iam.livenessProbe.failureThreshold Failure threshold for livenessProbe + ## @param iam.livenessProbe.successThreshold Success threshold for livenessProbe + ## + livenessProbe: + enabled: true + initialDelaySeconds: 30 + timeoutSeconds: 30 + periodSeconds: 10 + successThreshold: 1 + failureThreshold: 6 + ## @param iam.readinessProbe.enabled Enable readinessProbe on IAM containers + ## @param iam.readinessProbe.initialDelaySeconds Initial delay seconds for readinessProbe + ## @param iam.readinessProbe.periodSeconds Period seconds for readinessProbe + ## @param iam.readinessProbe.timeoutSeconds Timeout seconds for readinessProbe + ## @param iam.readinessProbe.failureThreshold Failure threshold for readinessProbe + ## @param iam.readinessProbe.successThreshold Success threshold for readinessProbe + ## + readinessProbe: + enabled: true + initialDelaySeconds: 30 + timeoutSeconds: 30 + periodSeconds: 10 + successThreshold: 1 + failureThreshold: 6 + ## @param iam.startupProbe.enabled Enable startupProbe on IAM containers + ## @param iam.startupProbe.initialDelaySeconds Initial delay seconds for startupProbe + ## @param iam.startupProbe.periodSeconds Period seconds for startupProbe + ## @param iam.startupProbe.timeoutSeconds Timeout seconds for startupProbe + ## @param iam.startupProbe.failureThreshold Failure threshold for startupProbe + ## @param iam.startupProbe.successThreshold Success threshold for startupProbe + ## + startupProbe: + enabled: false + initialDelaySeconds: 5 + periodSeconds: 5 + timeoutSeconds: 1 + failureThreshold: 15 + successThreshold: 1 + + ## IAM resource requests and limits + ## ref: http://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/ + ## @param iam.resourcesPreset Set IAM container resources according to one common preset (allowed values: none, nano, small, medium, large, xlarge, 2xlarge). This is ignored if webdav.resources is set (webdav.resources is recommended for production). + ## More information: https://github.com/bitnami/charts/blob/main/bitnami/common/templates/_resources.tpl#L15 + ## + resourcesPreset: "nano" + ## @param iam.resources Set IAM container requests and limits for different resources like CPU or memory (essential for production workloads) + ## Example: + ## resources: + ## requests: + ## cpu: 2 + ## memory: 512Mi + ## limits: + ## cpu: 3 + ## memory: 1024Mi + ## + resources: {} + ## Configure Pods Security Context + ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/#set-the-security-context-for-a-pod + ## @param iam.podSecurityContext.enabled Enable IAM pods' Security Context + ## @param iam.podSecurityContext.fsGroupChangePolicy Set filesystem group change policy for IAM pods + ## @param iam.podSecurityContext.sysctls Set kernel settings using the sysctl interface for IAM pods + ## @param iam.podSecurityContext.supplementalGroups Set filesystem extra groups for IAM pods + ## @param iam.podSecurityContext.fsGroup Set fsGroup in IAM pods' Security Context + ## + podSecurityContext: + enabled: true + fsGroupChangePolicy: Always + sysctls: [] + supplementalGroups: [] + fsGroup: 1001 + ## Configure Container Security Context + ## ref: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/#set-the-security-context-for-a-container + ## @param iam.containerSecurityContext.enabled Enabled IAM container' Security Context + ## @param iam.containerSecurityContext.seLinuxOptions [object,nullable] Set SELinux options in IAM container + ## @param iam.containerSecurityContext.runAsUser Set runAsUser in IAM container' Security Context + ## @param iam.containerSecurityContext.runAsGroup Set runAsGroup in IAM container' Security Context + ## @param iam.containerSecurityContext.runAsNonRoot Set runAsNonRoot in IAM container' Security Context + ## @param iam.containerSecurityContext.readOnlyRootFilesystem Set readOnlyRootFilesystem in IAM container' Security Context + ## @param iam.containerSecurityContext.privileged Set privileged in IAM container' Security Context + ## @param iam.containerSecurityContext.allowPrivilegeEscalation Set allowPrivilegeEscalation in IAM container' Security Context + ## @param iam.containerSecurityContext.capabilities.drop List of capabilities to be dropped in IAM container + ## @param iam.containerSecurityContext.seccompProfile.type Set seccomp profile in IAM container + ## + containerSecurityContext: + enabled: true + seLinuxOptions: {} + runAsUser: 1001 + runAsGroup: 1001 + runAsNonRoot: true + readOnlyRootFilesystem: true + privileged: false + allowPrivilegeEscalation: false + capabilities: + drop: ["ALL"] + seccompProfile: + type: "RuntimeDefault" + ## @param iam.logLevel IAM log level (0, 1, 2, 3, or 4) + ## + logLevel: 1 + ## @param iam.command Override default IAM container command (useful when using custom images) + ## + command: [] + ## @param iam.args Override default IAM container args (useful when using custom images) + ## + args: [] + ## @param iam.automountServiceAccountToken Mount Service Account token in IAM pods + ## + automountServiceAccountToken: false + ## @param iam.hostAliases IAM pods host aliases + ## https://kubernetes.io/docs/concepts/services-networking/add-entries-to-pod-etc-hosts-with-host-aliases/ + ## + hostAliases: [] + ## @param iam.statefulsetAnnotations Annotations for IAM statefulset + ## ref: https://kubernetes.io/docs/concepts/overview/working-with-objects/annotations/ + ## + statefulsetAnnotations: {} + ## @param iam.podLabels Extra labels for IAM pods + ## ref: https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/ + ## + podLabels: {} + ## @param iam.podAnnotations Annotations for IAM pods + ## ref: https://kubernetes.io/docs/concepts/overview/working-with-objects/annotations/ + ## + podAnnotations: {} + ## @param iam.podAffinityPreset Pod affinity preset. Ignored if `iam.affinity` is set. Allowed values: `soft` or `hard` + ## ref: https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#inter-pod-affinity-and-anti-affinity + ## + podAffinityPreset: "" + ## @param iam.podAntiAffinityPreset Pod anti-affinity preset. Ignored if `iam.affinity` is set. Allowed values: `soft` or `hard` + ## ref: https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#inter-pod-affinity-and-anti-affinity + ## + podAntiAffinityPreset: soft + ## Node iam.affinity preset + ## ref: https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#node-affinity + ## + nodeAffinityPreset: + ## @param iam.nodeAffinityPreset.type Node affinity preset type. Ignored if `iam.affinity` is set. Allowed values: `soft` or `hard` + ## + type: "" + ## @param iam.nodeAffinityPreset.key Node label key to match. Ignored if `iam.affinity` is set + ## + key: "" + ## @param iam.nodeAffinityPreset.values Node label values to match. Ignored if `iam.affinity` is set + ## E.g. + ## values: + ## - e2e-az1 + ## - e2e-az2 + ## + values: [] + ## @param iam.affinity Affinity for IAM pods assignment + ## ref: https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#affinity-and-anti-affinity + ## NOTE: `iam.podAffinityPreset`, `iam.podAntiAffinityPreset`, and `iam.nodeAffinityPreset` will be ignored when it's set + ## + affinity: {} + ## @param iam.nodeSelector Node labels for IAM pods assignment + ## ref: https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/ + ## + nodeSelector: {} + ## @param iam.tolerations Tolerations for IAM pods assignment + ## ref: https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/ + ## + tolerations: [] + ## @param iam.updateStrategy.type IAM deployment strategy type + ## ref: https://kubernetes.io/docs/concepts/workloads/controllers/statefulset/#update-strategies + ## + updateStrategy: + ## Can be set to RollingUpdate or Recreate + ## + type: RollingUpdate + ## @param iam.priorityClassName IAM pods' priorityClassName + ## + priorityClassName: "" + ## @param iam.topologySpreadConstraints Topology Spread Constraints for IAM pod assignment spread across your cluster among failure-domains + ## Ref: https://kubernetes.io/docs/concepts/workloads/pods/pod-topology-spread-constraints/#spread-constraints-for-pods + ## + topologySpreadConstraints: [] + ## @param iam.schedulerName Name of the k8s scheduler (other than default) for IAM pods + ## ref: https://kubernetes.io/docs/tasks/administer-cluster/configure-multiple-schedulers/ + ## + schedulerName: "" + ## @param iam.terminationGracePeriodSeconds Seconds IAM pods need to terminate gracefully + ## ref: https://kubernetes.io/docs/concepts/workloads/pods/pod/#termination-of-pods + ## + terminationGracePeriodSeconds: "" + ## @param iam.lifecycleHooks for IAM containers to automate configuration before or after startup + ## + lifecycleHooks: {} + ## @param iam.extraEnvVars Array with extra environment variables to add to IAM containers + ## e.g: + ## extraEnvVars: + ## - name: FOO + ## value: "bar" + ## + extraEnvVars: [] + ## @param iam.extraEnvVarsCM Name of existing ConfigMap containing extra env vars for IAM containers + ## + extraEnvVarsCM: "" + ## @param iam.extraEnvVarsSecret Name of existing Secret containing extra env vars for IAM containers + ## + extraEnvVarsSecret: "" + ## @param iam.extraVolumes Optionally specify extra list of additional volumes for the IAM pods + ## + extraVolumes: [] + ## @param iam.extraVolumeMounts Optionally specify extra list of additional volumeMounts for the IAM containers + ## + extraVolumeMounts: [] + ## @param iam.sidecars Add additional sidecar containers to the IAM pods + ## e.g: + ## sidecars: + ## - name: your-image-name + ## image: your-image + ## imagePullPolicy: Always + ## ports: + ## - name: portname + ## containerPort: 1234 + ## + sidecars: [] + ## @param iam.initContainers Add additional init containers to the IAM pods + ## ref: https://kubernetes.io/docs/concepts/workloads/pods/init-containers/ + ## e.g: + ## initContainers: + ## - name: your-image-name + ## image: your-image + ## imagePullPolicy: Always + ## command: ['sh', '-c', 'echo "hello world"'] + ## + initContainers: [] + ## Pod Disruption Budget configuration + ## ref: https://kubernetes.io/docs/tasks/run-application/configure-pdb + ## @param iam.pdb.create Enable/disable a Pod Disruption Budget creation + ## @param iam.pdb.minAvailable Minimum number/percentage of pods that should remain scheduled + ## @param iam.pdb.maxUnavailable Maximum number/percentage of pods that may be made unavailable. Defaults to `1` if both `iam.pdb.minAvailable` and `iam.pdb.maxUnavailable` are empty. + ## + pdb: + create: true + minAvailable: "" + maxUnavailable: "" + + + ## @section IAM Traffic Exposure Parameters + ## + + ## IAM service parameters + ## + service: + ## @param iam.service.type IAM service type + ## + type: ClusterIP + ## @param iam.service.ports.http IAM service HTTP port (HTTPS if `iam.tls.enabled` is `true`) + ## + ports: + http: 8111 + ## Node ports to expose + ## @param iam.service.nodePorts.http Node port for HTTP (HTTPS if `iam.tls.enabled` is `true`) + ## NOTE: choose port between <30000-32767> + ## + nodePorts: + http: "" + ## @param iam.service.clusterIP IAM service Cluster IP + ## e.g.: + ## clusterIP: None + ## + clusterIP: "" + ## @param iam.service.loadBalancerIP IAM service Load Balancer IP + ## ref: https://kubernetes.io/docs/concepts/services-networking/service/#type-loadbalancer + ## + loadBalancerIP: "" + ## @param iam.service.loadBalancerSourceRanges IAM service Load Balancer sources + ## ref: https://kubernetes.io/docs/tasks/access-application-cluster/configure-cloud-provider-firewall/#restrict-access-for-loadbalancer-service + ## e.g: + ## loadBalancerSourceRanges: + ## - 10.10.10.0/24 + ## + loadBalancerSourceRanges: [] + ## @param iam.service.externalTrafficPolicy IAM service external traffic policy + ## ref http://kubernetes.io/docs/tasks/access-application-cluster/create-external-load-balancer/#preserving-the-client-source-ip + ## + externalTrafficPolicy: Cluster + ## @param iam.service.annotations Additional custom annotations for IAM service + ## + annotations: {} + ## @param iam.service.extraPorts Extra ports to expose in IAM service (normally used with the `sidecars` value) + ## + extraPorts: [] + ## @param iam.service.sessionAffinity Control where client requests go, to the same pod or round-robin + ## Values: ClientIP or None + ## ref: https://kubernetes.io/docs/concepts/services-networking/service/ + ## + sessionAffinity: None + ## @param iam.service.sessionAffinityConfig Additional settings for the sessionAffinity + ## sessionAffinityConfig: + ## clientIP: + ## timeoutSeconds: 300 + ## + sessionAffinityConfig: {} + ## Headless service properties + ## + ## Network Policies for IAM + ## Ref: https://kubernetes.io/docs/concepts/services-networking/network-policies/ + ## + ## @section Init Container Parameters ## @@ -3245,7 +3723,7 @@ volumePermissions: image: registry: docker.io repository: bitnami/os-shell - tag: 12-debian-12-r33 + tag: 12-debian-12-r43 pullPolicy: IfNotPresent ## Optionally specify an array of imagePullSecrets. ## Secrets must be manually created in the namespace. @@ -3329,7 +3807,7 @@ mariadb: image: registry: docker.io repository: bitnami/mariadb - tag: 11.4.4-debian-12-r1 + tag: 11.4.5-debian-12-r12 digest: "" ## Specify a imagePullPolicy ## ref: https://kubernetes.io/docs/concepts/containers/images/#pre-pulled-images @@ -3350,7 +3828,6 @@ mariadb: ## @param mariadb.auth.database MariaDB custom database ## @param mariadb.auth.username MariaDB custom user name ## @param mariadb.auth.password MariaDB custom user password - ## @param mariadb.auth.usePasswordFiles Mount credentials as a file instead of using an environment variable ## ref: https://github.com/bitnami/containers/tree/main/bitnami/mariadb#setting-the-root-password-on-first-run ## https://github.com/bitnami/containers/blob/main/bitnami/mariadb/README.md#creating-a-database-on-first-run ## https://github.com/bitnami/containers/blob/main/bitnami/mariadb/README.md#creating-a-database-user-on-first-run @@ -3360,7 +3837,6 @@ mariadb: database: bitnami_seaweedfs username: bn_seaweedfs password: "" - usePasswordFiles: false ## @param mariadb.initdbScripts [object] Specify dictionary of scripts to be run at first boot ## initdbScripts: @@ -3430,7 +3906,7 @@ postgresql: image: registry: docker.io repository: bitnami/postgresql - tag: 17.2.0-debian-12-r2 + tag: 17.4.0-debian-12-r19 digest: "" ## Specify a imagePullPolicy ## ref: https://kubernetes.io/docs/concepts/containers/images/#pre-pulled-images @@ -3538,6 +4014,10 @@ externalDatabase: ## NOTE: When it's set, the `externalDatabase.password` parameter is ignored ## existingSecret: "" + ## @param externalDatabase.waitForDatabaseEnabled Whether to check for external database before starting seaweedfs containers + ## + waitForDatabaseEnabled: true + ## ## Init external database job ## initDatabaseJob: diff --git a/install.sh b/install.sh index 4cf8abc2ac8c062a42283042a63e582d5009acf0..66c27fbfc732f75ad068de83eec340fd471f4cd0 100644 --- a/install.sh +++ b/install.sh @@ -1,10 +1,8 @@ #!/bin/bash # preset -VERSION="1.8.1" MIN_CPU=8 -MIN_RAM=4 -MIN_MAP_COUNT=262144 +MIN_RAM=10 SKIP_CHECKS=${SKIP_CHECKS:-0} DOWNLOAD_ONLY=${DOWNLOAD_ONLY:-0} @@ -35,36 +33,19 @@ if [[ $SKIP_CHECKS -eq 0 ]] && [[ $DOWNLOAD_ONLY -ne 1 ]]; then if [[ $RAM -lt $MIN_RAM ]]; then echo "You do not have enough RAM free resources:" echo "" - echo " - we found ${RAM}GB RAM (free) instead of necessary ${RAM}GB" + echo " - we found ${RAM}GB RAM (free) instead of necessary ${MIN_RAM}GB" echo " - if you believe this is a mistake, skip startup checks with the SKIP_CHECKS=1 flag" exit 4 else echo "RAM ${RAM}GB OK" fi - MAX_MAP_COUNT=$(cat /proc/sys/vm/max_map_count) - if [[ $MAX_MAP_COUNT -lt $MIN_MAP_COUNT ]]; then - echo "You do not have enough max. map counts: found ${MAX_MAP_COUNT} instead of minimum ${MIN_MAP_COUNT}" - if [ $(id -u) -eq 0 ]; then - echo " - attempt to update the /etc/sysctl.conf file and add the line 'vm.max_map_count=${MIN_MAP_COUNT}' at the end" - echo "vm.max_map_count=${MIN_MAP_COUNT}" >> /etc/sysctl.conf - sysctl -p - if [[ $MAX_MAP_COUNT -lt $MIN_MAP_COUNT ]]; then - exit 4 - fi - else - echo " - you need to re-run the install.sh script as root to fix this" - exit 4 - fi - else - echo "MAP COUNT ${MAX_MAP_COUNT} OK" - fi else echo "[✨] Skipping checks ..." fi # environment -echo "[🚀] Gathering environment for version ${VERSION} ..." -curl -ksSL -o ./dist.tar.gz "https://www.ifs.tuwien.ac.at/infrastructures/dbrepo/${VERSION}/dist.tar.gz" +echo "[🚀] Gathering environment for version ${APP_VERSION} ..." +curl -ksSL -o ./dist.tar.gz "https://www.ifs.tuwien.ac.at/infrastructures/dbrepo/${APP_VERSION}/dist.tar.gz" tar xzfv ./dist.tar.gz if [[ $DOWNLOAD_ONLY -eq 1 ]]; then @@ -72,7 +53,7 @@ if [[ $DOWNLOAD_ONLY -eq 1 ]]; then exit 0 fi -echo "[📦] Pulling images for version ${VERSION} ..." +echo "[📦] Pulling images for version ${APP_VERSION} ..." docker compose pull echo "[🎉] Success!" @@ -86,4 +67,4 @@ echo "Then start the local deployment with:" echo "" echo " docker compose up -d" echo "" -echo "Read about next steps online: https://www.ifs.tuwien.ac.at/infrastructures/dbrepo/${VERSION}/installation/#next-steps" +echo "Read about next steps online: https://www.ifs.tuwien.ac.at/infrastructures/dbrepo/${APP_VERSION}/installation/#next-steps" diff --git a/lib/java/dbrepo-core/pom.xml b/lib/java/dbrepo-core/pom.xml index c18cf6a51d69b6a804c67ef87b3c29b0a78c9579..d193c09e1265da2dab05e3350903021dd31963c4 100644 --- a/lib/java/dbrepo-core/pom.xml +++ b/lib/java/dbrepo-core/pom.xml @@ -7,7 +7,7 @@ <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> - <version>3.3.5</version> + <version>3.4.0</version> </parent> <organization> @@ -18,11 +18,11 @@ <groupId>at.ac.tuwien.ifs.dbrepo</groupId> <artifactId>dbrepo-core</artifactId> <name>dbrepo-core</name> - <version>1.8.1</version> + <version>${env.APP_VERSION}</version> <description>Core library for DBRepo</description> - <url>https://www.ifs.tuwien.ac.at/infrastructures/dbrepo/1.8/</url> + <url>https://www.ifs.tuwien.ac.at/infrastructures/dbrepo/1.9/</url> <developers> <developer> <name>Martin Weise</name> @@ -37,7 +37,7 @@ <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <keycloak.version>26.0.4</keycloak.version> <mapstruct.version>1.6.3</mapstruct.version> - <spring-cloud.version>4.1.4</spring-cloud.version> + <spring-cloud.version>4.2.1</spring-cloud.version> <jackson-datatype.version>2.15.0</jackson-datatype.version> <springdoc-openapi.version>2.8.5</springdoc-openapi.version> </properties> diff --git a/lib/java/dbrepo-core/src/main/java/at/ac/tuwien/ifs/dbrepo/core/entity/database/Database.java b/lib/java/dbrepo-core/src/main/java/at/ac/tuwien/ifs/dbrepo/core/entity/database/Database.java index 2aefc232a30908654572a89b8a894abbc00d8c96..b6c466992898d76ec2a697b7293f8cdb74dbd1a9 100644 --- a/lib/java/dbrepo-core/src/main/java/at/ac/tuwien/ifs/dbrepo/core/entity/database/Database.java +++ b/lib/java/dbrepo-core/src/main/java/at/ac/tuwien/ifs/dbrepo/core/entity/database/Database.java @@ -91,19 +91,19 @@ public class Database implements Serializable { @OneToMany(fetch = FetchType.LAZY, cascade = {CascadeType.MERGE}, mappedBy = "database") @Where(clause = "identifier_type='DATABASE'") - @OrderBy("id DESC") + @OrderBy("created DESC") private List<Identifier> identifiers; @OneToMany(fetch = FetchType.LAZY, cascade = {CascadeType.MERGE}, mappedBy = "database") @Where(clause = "identifier_type='SUBSET'") - @OrderBy("id DESC") + @OrderBy("created DESC") private List<Identifier> subsets; - @OrderBy("id DESC") + @OrderBy("created DESC") @OneToMany(fetch = FetchType.LAZY, cascade = {CascadeType.ALL, CascadeType.PERSIST}, mappedBy = "database", orphanRemoval = true) private List<at.ac.tuwien.ifs.dbrepo.core.entity.database.table.Table> tables; - @OrderBy("id DESC") + @OrderBy("created DESC") @OneToMany(fetch = FetchType.LAZY, cascade = {CascadeType.ALL, CascadeType.PERSIST}, mappedBy = "database", orphanRemoval = true) private List<View> views; diff --git a/lib/java/dbrepo-core/src/main/java/at/ac/tuwien/ifs/dbrepo/core/entity/database/View.java b/lib/java/dbrepo-core/src/main/java/at/ac/tuwien/ifs/dbrepo/core/entity/database/View.java index d84b75530b1b5dd2b27a896461f6d86671588ea1..38680c01db39d2e66e5cc8866e4689a0f5b13e0b 100644 --- a/lib/java/dbrepo-core/src/main/java/at/ac/tuwien/ifs/dbrepo/core/entity/database/View.java +++ b/lib/java/dbrepo-core/src/main/java/at/ac/tuwien/ifs/dbrepo/core/entity/database/View.java @@ -81,7 +81,7 @@ public class View { @JoinColumn(name = "dbid", referencedColumnName = "vdbid", insertable = false, updatable = false) }) @Where(clause = "identifier_type='VIEW'") - @OrderBy("id DESC") + @OrderBy("created DESC") private List<Identifier> identifiers; @ToString.Exclude diff --git a/lib/java/dbrepo-core/src/main/java/at/ac/tuwien/ifs/dbrepo/core/entity/database/table/Table.java b/lib/java/dbrepo-core/src/main/java/at/ac/tuwien/ifs/dbrepo/core/entity/database/table/Table.java index 42faf301ca49b73bfc4bcded087b9c005a5c764a..41a5c950a34bf5dbad6e30b762798256e5837600 100644 --- a/lib/java/dbrepo-core/src/main/java/at/ac/tuwien/ifs/dbrepo/core/entity/database/table/Table.java +++ b/lib/java/dbrepo-core/src/main/java/at/ac/tuwien/ifs/dbrepo/core/entity/database/table/Table.java @@ -83,7 +83,7 @@ public class Table { @JoinColumn(name = "dbid", referencedColumnName = "tdbid", insertable = false, updatable = false) }) @Where(clause = "identifier_type='TABLE'") - @OrderBy("id DESC") + @OrderBy("created DESC") private List<Identifier> identifiers; @Embedded diff --git a/lib/java/dbrepo-core/src/main/java/at/ac/tuwien/ifs/dbrepo/core/entity/identifier/Creator.java b/lib/java/dbrepo-core/src/main/java/at/ac/tuwien/ifs/dbrepo/core/entity/identifier/Creator.java index 8a2bcf25e2e0a7bfc4add70406bc84503cb959d2..428d70d719cb3ca2751d29935787608cc7ab0678 100644 --- a/lib/java/dbrepo-core/src/main/java/at/ac/tuwien/ifs/dbrepo/core/entity/identifier/Creator.java +++ b/lib/java/dbrepo-core/src/main/java/at/ac/tuwien/ifs/dbrepo/core/entity/identifier/Creator.java @@ -23,6 +23,9 @@ public class Creator { @Column(columnDefinition = "VARCHAR(36)") private UUID id; + @Column + private Integer ordinalPosition; + @Column(name = "given_names") private String firstname; diff --git a/lib/java/dbrepo-core/src/main/java/at/ac/tuwien/ifs/dbrepo/core/entity/identifier/Identifier.java b/lib/java/dbrepo-core/src/main/java/at/ac/tuwien/ifs/dbrepo/core/entity/identifier/Identifier.java index 04471509c6cd711b745f1a9060227d869f2dcb33..b54651ac5811ae17c2b4c96cfe36569d547ff30d 100644 --- a/lib/java/dbrepo-core/src/main/java/at/ac/tuwien/ifs/dbrepo/core/entity/identifier/Identifier.java +++ b/lib/java/dbrepo-core/src/main/java/at/ac/tuwien/ifs/dbrepo/core/entity/identifier/Identifier.java @@ -33,6 +33,7 @@ import java.util.UUID; @NamedQuery(name = "Identifier.findSubsetIdentifier", query = "select i from Identifier i where i.database.id = ?1 and i.queryId = ?2 and i.type = 'SUBSET' ORDER BY i.id DESC"), @NamedQuery(name = "Identifier.findViewIdentifier", query = "select i from Identifier i where i.database.id = ?1 and i.viewId = ?2 and i.type = 'VIEW' ORDER BY i.id DESC"), @NamedQuery(name = "Identifier.findEarliest", query = "select i from Identifier i ORDER BY i.created ASC limit 1"), + @NamedQuery(name = "Identifier.findAll", query = "select i from Identifier i ORDER BY i.created DESC"), }) public class Identifier implements Serializable { @@ -54,7 +55,7 @@ public class Identifier implements Serializable { * Creators are created/updated/deleted by the Identifier entity. */ @OneToMany(fetch = FetchType.LAZY, cascade = {CascadeType.ALL, CascadeType.PERSIST}, mappedBy = "identifier") - @OrderBy("id") + @OrderBy("ordinalPosition ASC") private List<Creator> creators; @Column(nullable = false) @@ -72,21 +73,21 @@ public class Identifier implements Serializable { * Titles are created/updated/deleted by the Identifier entity. */ @OneToMany(fetch = FetchType.LAZY, cascade = {CascadeType.ALL, CascadeType.PERSIST}, mappedBy = "identifier") - @OrderBy("id") + @OrderBy("ordinalPosition ASC") private List<IdentifierTitle> titles; /** * Descriptions are created/updated/deleted by the Identifier entity. */ @OneToMany(fetch = FetchType.LAZY, cascade = {CascadeType.ALL, CascadeType.PERSIST}, mappedBy = "identifier") - @OrderBy("id") + @OrderBy("ordinalPosition ASC") private List<IdentifierDescription> descriptions; /** * Funders are created/updated/deleted by the Identifier entity. */ @OneToMany(fetch = FetchType.LAZY, cascade = {CascadeType.ALL, CascadeType.PERSIST}, mappedBy = "identifier") - @OrderBy("id") + @OrderBy("ordinalPosition ASC") private List<IdentifierFunder> funders; /** @@ -144,7 +145,7 @@ public class Identifier implements Serializable { private Database database; @OneToMany(fetch = FetchType.LAZY, cascade = {CascadeType.ALL, CascadeType.PERSIST}, mappedBy = "identifier") - @OrderBy("id") + @OrderBy("ordinalPosition ASC") private List<RelatedIdentifier> relatedIdentifiers; @Column diff --git a/lib/java/dbrepo-core/src/main/java/at/ac/tuwien/ifs/dbrepo/core/entity/identifier/IdentifierDescription.java b/lib/java/dbrepo-core/src/main/java/at/ac/tuwien/ifs/dbrepo/core/entity/identifier/IdentifierDescription.java index ab73de406ee607253f14a182a4c9af9f748666dc..72c531c82b4e7d081a1112513a633040c3cc4e6c 100644 --- a/lib/java/dbrepo-core/src/main/java/at/ac/tuwien/ifs/dbrepo/core/entity/identifier/IdentifierDescription.java +++ b/lib/java/dbrepo-core/src/main/java/at/ac/tuwien/ifs/dbrepo/core/entity/identifier/IdentifierDescription.java @@ -25,6 +25,9 @@ public class IdentifierDescription implements Serializable { @Column(columnDefinition = "VARCHAR(36)") private UUID id; + @Column + private Integer ordinalPosition; + @Column(nullable = false, columnDefinition = "TEXT") private String description; diff --git a/lib/java/dbrepo-core/src/main/java/at/ac/tuwien/ifs/dbrepo/core/entity/identifier/IdentifierFunder.java b/lib/java/dbrepo-core/src/main/java/at/ac/tuwien/ifs/dbrepo/core/entity/identifier/IdentifierFunder.java index eb3c21e61794726e53cabfcfe8e32e58072789d9..252957f8e43e6915a7b6361a3d9d92e8c707a234 100644 --- a/lib/java/dbrepo-core/src/main/java/at/ac/tuwien/ifs/dbrepo/core/entity/identifier/IdentifierFunder.java +++ b/lib/java/dbrepo-core/src/main/java/at/ac/tuwien/ifs/dbrepo/core/entity/identifier/IdentifierFunder.java @@ -24,6 +24,9 @@ public class IdentifierFunder implements Serializable { @Column(columnDefinition = "VARCHAR(36)") private UUID id; + @Column + private Integer ordinalPosition; + @Column(nullable = false) private String funderName; diff --git a/lib/java/dbrepo-core/src/main/java/at/ac/tuwien/ifs/dbrepo/core/entity/identifier/IdentifierTitle.java b/lib/java/dbrepo-core/src/main/java/at/ac/tuwien/ifs/dbrepo/core/entity/identifier/IdentifierTitle.java index 8dbbdac0a9dd7804f61315892201c5df53857403..c19a02e9873ccf0654d81d6ca384c3d0ee748dd1 100644 --- a/lib/java/dbrepo-core/src/main/java/at/ac/tuwien/ifs/dbrepo/core/entity/identifier/IdentifierTitle.java +++ b/lib/java/dbrepo-core/src/main/java/at/ac/tuwien/ifs/dbrepo/core/entity/identifier/IdentifierTitle.java @@ -25,6 +25,9 @@ public class IdentifierTitle implements Serializable { @Column(columnDefinition = "VARCHAR(36)") private UUID id; + @Column + private Integer ordinalPosition; + @Column(nullable = false, columnDefinition = "TEXT") private String title; diff --git a/lib/java/dbrepo-core/src/main/java/at/ac/tuwien/ifs/dbrepo/core/entity/identifier/RelatedIdentifier.java b/lib/java/dbrepo-core/src/main/java/at/ac/tuwien/ifs/dbrepo/core/entity/identifier/RelatedIdentifier.java index e0eb28d11b7c68753c2f99564d28bb59be7fbf17..29fcf641599b08ca15d14fc7a360eb8e1a934973 100644 --- a/lib/java/dbrepo-core/src/main/java/at/ac/tuwien/ifs/dbrepo/core/entity/identifier/RelatedIdentifier.java +++ b/lib/java/dbrepo-core/src/main/java/at/ac/tuwien/ifs/dbrepo/core/entity/identifier/RelatedIdentifier.java @@ -25,6 +25,9 @@ public class RelatedIdentifier { @Column(columnDefinition = "VARCHAR(36)") private UUID id; + @Column + private Integer ordinalPosition; + @Column(nullable = false) private String value; diff --git a/lib/java/dbrepo-core/src/main/java/at/ac/tuwien/ifs/dbrepo/core/test/BaseTest.java b/lib/java/dbrepo-core/src/main/java/at/ac/tuwien/ifs/dbrepo/core/test/BaseTest.java index 78269ab3086009ca047d71a841ecbad57b5b8969..e5437b5cd9af0f025b3d8e192160f567cf78f633 100644 --- a/lib/java/dbrepo-core/src/main/java/at/ac/tuwien/ifs/dbrepo/core/test/BaseTest.java +++ b/lib/java/dbrepo-core/src/main/java/at/ac/tuwien/ifs/dbrepo/core/test/BaseTest.java @@ -262,6 +262,7 @@ public class BaseTest { .type(AccessTypeDto.WRITE_ALL) .build(); + @SuppressWarnings("java:S6418") public final static String TOKEN_ACCESS_TOKEN = "eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJ0Mk9DZUNoZUo5dXdvQmJOUWpHX25ONldLaUxjY2VUSUFabWlUYkdPREZNIn0.eyJleHAiOjE3NDQxMTI1MzksImlhdCI6MTc0NDExMTYzOSwiYXV0aF90aW1lIjoxNzQ0MDkzNTMwLCJqdGkiOiI2MWNlODZjNi1kOTYzLTQxOTUtODE2NS00MTdiNDBkZjNhMmUiLCJpc3MiOiJodHRwczovL2RicmVwbzEuZWMudHV3aWVuLmFjLmF0L3JlYWxtcy9kYnJlcG8iLCJhdWQiOiJhY2NvdW50Iiwic3ViIjoiN2JkMWE2MDEtZjYyOS00MjA3LWEyMDEtNTY3MDRiYzI5ZTVlIiwidHlwIjoiQmVhcmVyIiwiYXpwIjoiZGJyZXBvLWNsaWVudCIsInNpZCI6ImQ5Y2FjN2NiLTc2OTctNGM3OS1iODRhLWViN2ViYzgzNDFhZCIsInJlYWxtX2FjY2VzcyI6eyJyb2xlcyI6WyJkZWxldGUtZGF0YWJhc2UtdmlldyIsImV4cG9ydC1xdWVyeS1kYXRhIiwiZXhlY3V0ZS1xdWVyeSIsImRlZmF1bHQtdXNlci1oYW5kbGluZyIsImRlbGV0ZS10YWJsZS1kYXRhIiwiZmluZC1xdWVyeSIsImxpc3QtZGF0YWJhc2Utdmlld3MiLCJwZXJzaXN0LXF1ZXJ5IiwiZGVsZXRlLWRhdGFiYXNlLWFjY2VzcyIsInZpZXctdGFibGUtaGlzdG9yeSIsIm1vZGlmeS11c2VyLXRoZW1lIiwibW9kaWZ5LXZpZXctdmlzaWJpbGl0eSIsImNyZWF0ZS1zZW1hbnRpYy1jb25jZXB0IiwiZGVmYXVsdC1jb250YWluZXItaGFuZGxpbmciLCJjcmVhdGUtdGFibGUiLCJkZWZhdWx0LWJyb2tlci1oYW5kbGluZyIsImV4ZWN1dGUtc2VtYW50aWMtcXVlcnkiLCJ0YWJsZS1zZW1hbnRpYy1hbmFseXNlIiwiY2hlY2stZGF0YWJhc2UtYWNjZXNzIiwiZGVmYXVsdC12aWV3LWhhbmRsaW5nIiwiZGVsZXRlLWlkZW50aWZpZXIiLCJtb2RpZnktZGF0YWJhc2Utb3duZXIiLCJsaXN0LXRhYmxlcyIsImV4cG9ydC10YWJsZS1kYXRhIiwiY3JlYXRlLWRhdGFiYXNlLWFjY2VzcyIsInJlLWV4ZWN1dGUtcXVlcnkiLCJjcmVhdGUtc2VtYW50aWMtdW5pdCIsInVwZGF0ZS10YWJsZS1zdGF0aXN0aWMiLCJkZWZhdWx0LWRhdGFiYXNlLWhhbmRsaW5nIiwiZmluZC1kYXRhYmFzZSIsImZpbmQtZGF0YWJhc2UtdmlldyIsImltcG9ydC1kYXRhYmFzZS1kYXRhIiwicHVibGlzaC1pZGVudGlmaWVyIiwidXBkYXRlLWRhdGFiYXNlLXZpZXciLCJkZWZhdWx0LXJvbGVzLWRicmVwbyIsImNyZWF0ZS1kYXRhYmFzZSIsImRlZmF1bHQtcmVzZWFyY2hlci1yb2xlcyIsImRlZmF1bHQtaWRlbnRpZmllci1oYW5kbGluZyIsIm1vZGlmeS11c2VyLWluZm9ybWF0aW9uIiwiY3JlYXRlLWRhdGFiYXNlLXZpZXciLCJmaW5kLWNvbnRhaW5lciIsImluc2VydC10YWJsZS1kYXRhIiwidXBkYXRlLXRhYmxlIiwibW9kaWZ5LWRhdGFiYXNlLWltYWdlIiwibW9kaWZ5LXRhYmxlLWNvbHVtbi1zZW1hbnRpY3MiLCJkZWZhdWx0LXNlbWFudGljcy1oYW5kbGluZyIsInVwZGF0ZS1kYXRhYmFzZS1hY2Nlc3MiLCJkZWZhdWx0LXF1ZXJ5LWhhbmRsaW5nIiwiZmluZC10YWJsZSIsImxpc3QtcXVlcmllcyIsImNyZWF0ZS1pZGVudGlmaWVyIiwiZmluZC1pZGVudGlmaWVyIiwidmlldy10YWJsZS1kYXRhIiwiZGVmYXVsdC1zdG9yYWdlLXJvbGVzIiwiZGVmYXVsdC10YWJsZS1oYW5kbGluZyIsImxpc3QtaWRlbnRpZmllcnMiLCJsaXN0LWRhdGFiYXNlcyIsIm1vZGlmeS1kYXRhYmFzZS12aXNpYmlsaXR5IiwidXBsb2FkLWZpbGUiLCJkZWxldGUtdGFibGUiXX0sInNjb3BlIjoib3BlbmlkIiwidWlkIjoiNmY1YTc0MzQtYTQwOS0xMDNmLTk2NmItMTFiNjU4OGRkOTEzIiwiaWRlbnRpdHlfcHJvdmlkZXIiOiJzYW1sIiwicHJlZmVycmVkX3VzZXJuYW1lIjoiMjg3NzIyIiwiZ2l2ZW5fbmFtZSI6Ik1hcnRpbiIsImZhbWlseV9uYW1lIjoiV2Vpc2UifQ.Nfp0MIKuqjrEZqQXjPNRU2MuYyIJXhQVjdg7XY5_oqkYIngCoQ0y3ioBhMGT2XHd8kufk7FEP6Kme9Ihvm1Qx6rAejcSLaA6xnhQDrX6SGGQ9Kfm_9Ewv6IHoX--Yt3aKLu_YQ4eiDdxxEP4jbl-H6hM4_vwaJYe7vcfSE1lkewno_yYrhW6btPRfrbLy4_57vBK6MLN1h8A-ePx1037KnIXIRDOu0hZwidz4mVZjQ6x3arBYT9iFQmIkgucLMriuRPF_PoEHkUajJ06Y9xQuSa9MNtr_ALkUEbGnzBCAeNwIChavxdz7Be_x1qRTeOsdVD0mHJf_ePeXjmDUtV45w"; public final static String TOKEN_ACCESS_SCOPE = "openid"; diff --git a/lib/python/dbrepo/api/test.py b/lib/python/dbrepo/api/test.py new file mode 100644 index 0000000000000000000000000000000000000000..4a5b85e001ffaec74554dc3dbdf6f843fadbcc10 --- /dev/null +++ b/lib/python/dbrepo/api/test.py @@ -0,0 +1,8 @@ +class MockResponse: + def __init__(self, status_code, headers=None, json_data=None): + self.status_code = status_code + self.headers = headers or {"Content-Type": "application/json"} + self.json_data = json_data + + def json(self): + return self.json_data diff --git a/lib/python/dbrepo/core/client/dashboard.py b/lib/python/dbrepo/core/client/dashboard.py index b609da692bba7fc38ab45a507b1e7b52193b1ac4..f65c569d6db9d7e59f502053f3eacee97758f432 100644 --- a/lib/python/dbrepo/core/client/dashboard.py +++ b/lib/python/dbrepo/core/client/dashboard.py @@ -7,7 +7,6 @@ from requests import Response from dbrepo.api.dto import Database, ColumnType, ViewColumn, View from dbrepo.core.api.dto import Permission -from dbrepo.core.api.exceptions import DashboardNotFound statistics_row_title = 'Generated Dashboard' auto_generated_description = 'Auto-generated' @@ -34,6 +33,15 @@ def map_link(title: str, url: str, icon: str = 'info', open_new_window: bool = T url=url) +def _get_managed_offset_y(dashboard: dict) -> int | None: + idx = [panel['title'] for panel in dashboard['panels']].index(statistics_row_title) + if idx == -1: + return None + offset_y = dashboard['panels'][idx]['gridPos']['y'] + logging.debug(f'managed panel y-offset: {offset_y}') + return offset_y + + def _get_start_index(dashboard: dict) -> int | None: return [panel['title'] for panel in dashboard['panels']].index(statistics_row_title) @@ -71,7 +79,7 @@ def map_row(title: str, x: int = 0, y: int = 0) -> dict: y=y)) -def map_preview_image_panel(database_id: str, w: int = 4, h: int = 4, x: int = 20, y: int = 1) -> dict: +def map_preview_image_panel(database_id: str, w: int = 4, h: int = 4, x: int = 20, y: int = 0) -> dict: return dict(title='Preview Image', type='text', description=auto_generated_description, @@ -148,7 +156,8 @@ class DashboardServiceClient: def update(self, database: Database) -> None: dashboard = self.find(database.dashboard_uid) if dashboard is None: - raise DashboardNotFound(f'Dashboard {database.dashboard_uid} not found') + self.create(database.internal_name, database.dashboard_uid) + dashboard = self.find(database.dashboard_uid) dashboard = dashboard['dashboard'] # update metadata if not database.is_dashboard_enabled and 'managed' in dashboard['tags']: @@ -437,7 +446,7 @@ class DashboardServiceClient: y: int = 8) -> dict: return self._map_timeseries_panel(database_id, view, 'histogram', h, w, x, y) - def map_data_sources_panel(self, database_id: str, x: int = 0, y: int = 1) -> dict: + def map_data_sources_panel(self, database_id: str, x: int = 0, y: int = 0) -> dict: datasource = dict(uid=self.datasource_uid, type='yesoreyeram-infinity-datasource') return dict(title='Datasources', @@ -487,26 +496,32 @@ class DashboardServiceClient: def get_panels(self, dashboard: dict, database: Database) -> [dict]: panels = dashboard['panels'] + managed_offset = 1 try: + managed_offset = _get_managed_offset_y(dashboard) end_index = _get_start_index(dashboard) logging.debug(f'splicing managed panels after index: {end_index}') panels = panels[:end_index] except ValueError: logging.warning(f'No managed panels found') original_panels_size = len(panels) - panels.append(map_row(statistics_row_title, 0, 0)) - panels.append(self.map_data_sources_panel(database.id)) + panels.append(map_row(statistics_row_title, 0, managed_offset + 0)) + panels.append(self.map_data_sources_panel(database.id, y=managed_offset)) if database.preview_image is not None: - panels.append(map_preview_image_panel(database.id)) + panels.append(map_preview_image_panel(database.id, y=managed_offset)) for i, view in enumerate(database.views): # section - panels.append(map_row(view.name, 0, i * section_height + 4)) - panels.append(self.map_overview_panel(database.id, view.id, 0, i * section_height + 8)) - panels.append(self.map_rows_panel(database.id, view.id, 18, i * section_height + 4)) - panels.append(self.map_columns_panel(database.id, view.id, 18, i * section_height + 8)) - panels.append(self.map_statistics_panel(database.id, view.id, h=8, w=12, x=0, y=i * section_height + 12)) - panels.append(self.map_histogram_panel(database.id, view, h=8, w=12, x=12, y=i * section_height + 12)) - panels.append(self.map_timeseries_panel(database.id, view, h=8, w=8, x=0, y=i * section_height + 20)) - panels.append(self.map_pie_panel(database.id, view, h=8, w=8, x=8, y=i * section_height + 20)) + panels.append(map_row(view.name, 0, y=i * section_height + managed_offset + 4)) + panels.append(self.map_overview_panel(database.id, view.id, 0, y=i * section_height + managed_offset + 8)) + panels.append(self.map_rows_panel(database.id, view.id, 18, y=i * section_height + managed_offset + 4)) + panels.append(self.map_columns_panel(database.id, view.id, 18, y=i * section_height + managed_offset + 8)) + panels.append(self.map_statistics_panel(database.id, view.id, h=8, w=12, x=0, + y=i * section_height + managed_offset + 12)) + panels.append(self.map_histogram_panel(database.id, view, h=8, w=12, x=12, + y=i * section_height + managed_offset + 12)) + panels.append(self.map_timeseries_panel(database.id, view, h=8, w=8, x=0, + y=i * section_height + managed_offset + 20)) + panels.append(self.map_pie_panel(database.id, view, h=8, w=8, x=8, + y=i * section_height + managed_offset + 20)) logging.info(f'Added {len(panels) - original_panels_size} managed panel(s)') return panels diff --git a/lib/python/docs/index.rst b/lib/python/docs/index.rst index b7b6bf88e0d7401360df5b7c8b15409e8c3c1fb1..5f4e4c633ac60016fa72dbe7f6fcbf7007d3f203 100644 --- a/lib/python/docs/index.rst +++ b/lib/python/docs/index.rst @@ -6,7 +6,7 @@ Pandas `DataFrame <https://pandas.pydata.org/docs/reference/api/pandas.DataFrame provides an object-oriented API as well as low-level access to DBRepo services. .. note:: - The SDK has been implemented and documented for DBRepo version 1.8.0, earlier versions may be supported but are not tested for compatibility. + The SDK has been implemented and documented for DBRepo version 1.9.0, earlier versions may be supported but are not tested for compatibility. Quickstart ---------- diff --git a/lib/python/pyproject.toml b/lib/python/pyproject.toml index 6775ad3981ea0749688004ae75379fd3402a0aa4..50ee92410fbf74ed73f9a298c30c649023aca3e1 100644 --- a/lib/python/pyproject.toml +++ b/lib/python/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "dbrepo" -version = "1.8.1" +version = "1.9.0" description = "DBRepo Python Library" keywords = [ "DBRepo", @@ -23,7 +23,6 @@ dependencies = [ "requests >= 2.31", "pika", "pydantic", - "tuspy", "pandas" ] @@ -34,7 +33,7 @@ requires = [ build-backend = "setuptools.build_meta" [project.urls] -Homepage = "https://www.ifs.tuwien.ac.at/infrastructures/dbrepo/1.8/" -Documentation = "https://www.ifs.tuwien.ac.at/infrastructures/dbrepo/1.6/python/" +Homepage = "https://www.ifs.tuwien.ac.at/infrastructures/dbrepo/1.9/" +Documentation = "https://www.ifs.tuwien.ac.at/infrastructures/dbrepo/1.9/python/" Issues = "https://gitlab.phaidra.org/fair-data-austria-db-repository/fda-services/-/issues" Source = "https://gitlab.phaidra.org/fair-data-austria-db-repository/fda-services/" \ No newline at end of file diff --git a/lib/python/setup.py b/lib/python/setup.py index 20e321aef0883cba8075e8126a979d09ad636a9a..1c6a1013ba228b0b9dce10bb12eb7dbbf4c7dc9f 100644 --- a/lib/python/setup.py +++ b/lib/python/setup.py @@ -2,9 +2,9 @@ from distutils.core import setup setup(name="dbrepo", - version="1.8.1", + version="1.9.0", description="A library for communicating with DBRepo", - url="https://www.ifs.tuwien.ac.at/infrastructures/dbrepo/1.8/", + url="https://www.ifs.tuwien.ac.at/infrastructures/dbrepo/1.9/", author="Martin Weise", license="Apache-2.0", author_email="martin.weise@tuwien.ac.at", diff --git a/make/build.mk b/make/build.mk index ba831dc7c6d56dbd5c8ec9f70a47c0fd31e6a6ee..78c36e23b17d109215bed545cb2721f1fb009805 100644 --- a/make/build.mk +++ b/make/build.mk @@ -6,14 +6,15 @@ build-images: build-java-lib ## Build Docker images. .PHONY: build-java-lib build-java-lib: ## Build the Java Library. - mvn -f ./lib/java/dbrepo-core/pom.xml -q clean package install -DskipTests + APP_VERSION=$(APP_VERSION) mvn -f ./lib/java/dbrepo-core/pom.xml -q clean package install -DskipTests mvn deploy:deploy-file -q -Dfile=./lib/java/dbrepo-core/target/dbrepo-core-$(APP_VERSION).jar -DgroupId=at.ac.tuwien.ifs.dbrepo -DartifactId=dbrepo-core -Dversion=$(APP_VERSION) -Dpackaging=jar -Durl=file:./dbrepo-data-service/lib/ -DrepositoryId=maven-repository -DupdateReleaseInfo=true mvn deploy:deploy-file -q -Dfile=./lib/java/dbrepo-core/target/dbrepo-core-$(APP_VERSION).jar -DgroupId=at.ac.tuwien.ifs.dbrepo -DartifactId=dbrepo-core -Dversion=$(APP_VERSION) -Dpackaging=jar -Durl=file:./dbrepo-metadata-service/lib/ -DrepositoryId=maven-repository -DupdateReleaseInfo=true .PHONY: build-auth-event-listener build-auth-event-listener: ## Build the Auth Service Event Listener. mvn -f ./dbrepo-auth-service/listeners/pom.xml -q clean package -DskipTests - cp ./dbrepo-auth-service/listeners/target/create-event-listener.jar ./helm/dbrepo/files/create-event-listener.jar + cp ./dbrepo-auth-service/listeners/target/create-event-listener.jar ./dbrepo-auth-service/listeners/create-event-listener.jar + cp ./dbrepo-auth-service/listeners/create-event-listener.jar ./helm/dbrepo/files/create-event-listener.jar .PHONY: build-ui build-ui: ## Build the UI. @@ -21,21 +22,18 @@ build-ui: ## Build the UI. .PHONY: build-python-lib build-python-lib: ## Build the Python Library. - rm -rf ./dbrepo-analyse-service/venv/ ./dbrepo-analyse-service/Pipfile.lock ./dbrepo-analyse-service/lib/* - rm -rf ./dbrepo-search-service/venv/ ./dbrepo-search-service/Pipfile.lock ./dbrepo-search-service/lib/* - rm -rf ./dbrepo-dashboard-service/venv/ ./dbrepo-dashboard-service/Pipfile.lock ./dbrepo-dashboard-service/lib/* + rm -rf ./dbrepo-analyse-service/lib/* ./dbrepo-search-service/lib/* ./dbrepo-dashboard-service/lib/* python3 -m build --sdist ./lib/python python3 -m build --wheel ./lib/python cp -r ./lib/python/dist/dbrepo-${APP_VERSION}* ./dbrepo-analyse-service/lib - (cd ./dbrepo-analyse-service && python3 -m venv venv && PIPENV_IGNORE_VIRTUALENVS=1 pipenv install --dev) + PIPENV_PIPFILE=./dbrepo-analyse-service/Pipfile pipenv lock cp -r ./lib/python/dist/dbrepo-${APP_VERSION}* ./dbrepo-search-service/lib - (cd ./dbrepo-search-service && python3 -m venv venv && PIPENV_IGNORE_VIRTUALENVS=1 pipenv install --dev) + PIPENV_PIPFILE=./dbrepo-search-service/Pipfile pipenv lock cp -r ./lib/python/dist/dbrepo-${APP_VERSION}* ./dbrepo-dashboard-service/lib - (cd ./dbrepo-dashboard-service && python3 -m venv venv && PIPENV_IGNORE_VIRTUALENVS=1 pipenv install --dev) + PIPENV_PIPFILE=./dbrepo-dashboard-service/Pipfile pipenv lock .PHONY: build-helm build-helm: ## Build the DBRepo and DBRepo MariaDB Galera Helm Charts. - helm dependency update ./helm/seaweedfs helm package ./helm/seaweedfs --destination ./build helm dependency update ./helm/dbrepo helm package ./helm/dbrepo --destination ./build diff --git a/make/dev.mk b/make/dev.mk index e865e2d9dd1116ff801a549811c087ff31056019..ac5e0e400135d49f30c3ebdb06d8eb07f9363928 100644 --- a/make/dev.mk +++ b/make/dev.mk @@ -12,21 +12,26 @@ stop-dev: ## Stop the development deployment and remove all data. .PHONY: package-config package-config: ## Package the config files - mkdir -p ./.docker/config/{dashboards,provisioning} + mkdir -p ./.docker/config cp ./dbrepo-auth-service/dbrepo-realm.json ./.docker/config cp ./dbrepo-auth-service/import-realms.sh ./.docker/config cp ./dbrepo-auth-service/master-realm.json ./.docker/config cp ./dbrepo-data-db/1_grant-user.sql ./.docker/config cp ./dbrepo-metadata-db/1_setup-schema.sql ./.docker/config cp ./dbrepo-metadata-db/2_setup-data.sql ./.docker/config + cp ./dbrepo-metadata-db/metrics.cnf ./.docker/config cp ./dbrepo-broker-service/rabbitmq.conf ./.docker/config cp ./dbrepo-broker-service/enabled_plugins ./.docker/config cp ./dbrepo-broker-service/definitions.json ./.docker/config cp ./dbrepo-broker-service/advanced.config ./.docker/config cp ./dbrepo-gateway-service/dbrepo.conf ./.docker/config + cp -r ./dbrepo-dashboard-ui/dashboards ./.docker/config + cp -r ./dbrepo-dashboard-ui/provisioning ./.docker/config + cp ./dbrepo-dashboard-ui/grafana.ini ./.docker/config/grafana.ini + cp ./dbrepo-dashboard-ui/ldap.toml ./.docker/config/ldap.toml cp ./dbrepo-metric-db/prometheus.yml ./.docker/config cp ./dbrepo-storage-service/s3_config.json ./.docker/config - cp ./dbrepo-auth-service/listeners/target/create-event-listener.jar ./.docker/config + cp ./dbrepo-auth-service/listeners/create-event-listener.jar ./.docker/config cd ./.docker && tar czf ./dist.tar.gz ./docker-compose.yml ./.env ./config .PHONY: install-staging diff --git a/make/rel.mk b/make/rel.mk index ee9326b7989612dda72d86f3eacb9b68db4f6ae4..dfc114233e486ea85bdd756f9cd45a722fca74e3 100644 --- a/make/rel.mk +++ b/make/rel.mk @@ -6,7 +6,6 @@ tag-images: build-images ## Tag the docker images. docker tag dbrepo-auth-service-init:latest "${REPOSITORY_URL}/auth-service-init:${APP_VERSION}${BUILD_VERSION}" docker tag dbrepo-dashboard-service:latest "${REPOSITORY_URL}/dashboard-service:${APP_VERSION}${BUILD_VERSION}" docker tag dbrepo-dashboard-service-init:latest "${REPOSITORY_URL}/dashboard-service-init:${APP_VERSION}${BUILD_VERSION}" - docker tag dbrepo-dashboard-ui:latest "${REPOSITORY_URL}/dashboard-ui:${APP_VERSION}${BUILD_VERSION}" docker tag dbrepo-data-service:latest "${REPOSITORY_URL}/data-service:${APP_VERSION}${BUILD_VERSION}" docker tag dbrepo-metadata-service:latest "${REPOSITORY_URL}/metadata-service:${APP_VERSION}${BUILD_VERSION}" docker tag dbrepo-search-service:latest "${REPOSITORY_URL}/search-service:${APP_VERSION}${BUILD_VERSION}" @@ -20,7 +19,6 @@ release-images: tag-images ## Release the docker images. docker push "${REPOSITORY_URL}/auth-service-init:${APP_VERSION}${BUILD_VERSION}" docker push "${REPOSITORY_URL}/dashboard-service:${APP_VERSION}${BUILD_VERSION}" docker push "${REPOSITORY_URL}/dashboard-service-init:${APP_VERSION}${BUILD_VERSION}" - docker push "${REPOSITORY_URL}/dashboard-ui:${APP_VERSION}${BUILD_VERSION}" docker push "${REPOSITORY_URL}/data-service:${APP_VERSION}${BUILD_VERSION}" docker push "${REPOSITORY_URL}/metadata-service:${APP_VERSION}${BUILD_VERSION}" docker push "${REPOSITORY_URL}/search-service:${APP_VERSION}${BUILD_VERSION}" diff --git a/mkdocs.yml b/mkdocs.yml index 7060289640e3f0034d0e20405526d9b512aa26ed..204f83473447bee20e8563d9896f5491dde5e5e7 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -20,6 +20,7 @@ nav: - Data Versioning: concepts/data-versioning.md - Dashboards: concepts/dashboards.md - Data Visibility: concepts/data-visibility.md + - Logging: concepts/logging.md - Messaging: concepts/messaging.md - Monitoring: concepts/monitoring.md - Persistent Identifier: concepts/pid.md @@ -119,9 +120,9 @@ markdown_extensions: custom_icons: - .docs/overrides/.icons extra: - homepage: https://www.ifs.tuwien.ac.at/infrastructures/dbrepo/1.8/ + homepage: https://www.ifs.tuwien.ac.at/infrastructures/dbrepo/1.9/ version: - default: 1.8 + default: 1.9 provider: mike social: - icon: simple/artifacthub diff --git a/sonar-project.properties b/sonar-project.properties index 52013fb417ef062f4d8e32e0bf77766bae2229f0..627e560efa132c24d49bebfd850daf6772a86a4e 100644 --- a/sonar-project.properties +++ b/sonar-project.properties @@ -1,15 +1,17 @@ # sonarqube sonar.projectKey=fair-data-austria-db-repository_fda-services_a57fa043-ab99-4cdd-a721-162d9a916d77 -sonar.host.url=https://s39.datalab.tuwien.ac.at +sonar.host.url=https://s39.datalab.tuwien.ac.at/sonarqube/ # project -sonar.projectVersion=1.8.1 +sonar.projectVersion=1.9.0 # general sonar.qualitygate.wait=true sonar.projectCreation.mainBranchName=master # java services -sonar.sources=./lib/java/dbrepo-core/src/main,./dbrepo-metadata-service/services/src/main,./dbrepo-metadata-service/repositories/src/main,./dbrepo-metadata-service/rest-service/src/main,./dbrepo-metadata-service/api/src/main,./dbrepo-metadata-service/oai/src/main,./dbrepo-data-service/services/src/main,./dbrepo-data-service/rest-service/src/main,./dbrepo-data-service/querystore/src/main -sonar.java.binaries=./lib/java/dbrepo-core/target/classes,./dbrepo-metadata-service/services/target/classes,./dbrepo-metadata-service/repositories/target/classes,./dbrepo-metadata-service/rest-service/target/classes,./dbrepo-metadata-service/api/target/classes,./dbrepo-metadata-service/oai/target/classes,./dbrepo-data-service/services/target/classes,./dbrepo-data-service/rest-service/target/classes,./dbrepo-data-service/querystore/target/classes +sonar.coverage.jacoco.xmlReportPaths=./dbrepo-data-service/report/target/site/jacoco-aggregate/jacoco.xml,./dbrepo-metadata-service/report/target/site/jacoco-aggregate/jacoco.xml +sonar.tests=./dbrepo-metadata-service/rest-service/src/test,./dbrepo-data-service/rest-service/src/test +sonar.sources=./lib/java/dbrepo-core/src/main,./dbrepo-metadata-service/services/src/main,./dbrepo-metadata-service/repositories/src/main,./dbrepo-metadata-service/rest-service/src/main,./dbrepo-metadata-service/oai/src/main,./dbrepo-data-service/services/src/main,./dbrepo-data-service/rest-service/src/main,./dbrepo-data-service/querystore/src/main +sonar.java.binaries=./lib/java/dbrepo-core/target/classes,./dbrepo-metadata-service/services/target/classes,./dbrepo-metadata-service/repositories/target/classes,./dbrepo-metadata-service/rest-service/target/classes,./dbrepo-metadata-service/oai/target/classes,./dbrepo-data-service/services/target/classes,./dbrepo-data-service/rest-service/target/classes,./dbrepo-data-service/querystore/target/classes sonar.junit.reportPaths=./dbrepo-metadata-service/rest-service/target/surefire-reports,./dbrepo-data-service/rest-service/target/surefire-reports -sonar.coverage.jacoco.xmlReportPaths=./dbrepo-metadata-service/report/target/site/jacoco-aggregate/jacoco.xml,./dbrepo-data-service/report/target/site/jacoco-aggregate/jacoco.xml # python services -sonar.python.version=3.11 +sonar.python.coverage.reportPaths=./dbrepo-analyse-service/coverage.xml,./dbrepo-dashboard-service/coverage.xml,./dbrepo-search-service/coverage.xml +sonar.python.version=3.11 \ No newline at end of file diff --git a/versions.json b/versions.json index f2244538ba971ec76911ffacec64c9bf23e5207b..7a8c81bf0a5f84b6b4ac694af51797254a91907e 100644 --- a/versions.json +++ b/versions.json @@ -1,8 +1,13 @@ [ + { + "version": "1.9", + "title": "1.9", + "aliases": ["latest"] + }, { "version": "1.8", "title": "1.8", - "aliases": ["latest"] + "aliases": [] }, { "version": "1.7",