From cd816d2c82b29f5850e6cb90faf0b39ed8947d57 Mon Sep 17 00:00:00 2001 From: Gauthier POGAM--LE MONTAGNER Date: Thu, 20 Mar 2025 14:47:48 +0100 Subject: [PATCH 0001/1232] feat: add signoz template --- public/svgs/signoz.png | Bin 0 -> 173112 bytes templates/compose/signoz.yaml | 1743 +++++++++++++++++++++++++++++++++ 2 files changed, 1743 insertions(+) create mode 100644 public/svgs/signoz.png create mode 100644 templates/compose/signoz.yaml diff --git a/public/svgs/signoz.png b/public/svgs/signoz.png new file mode 100644 index 0000000000000000000000000000000000000000..a681188c7e6f71f779058786f9f153dd1d015d79 GIT binary patch literal 173112 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 uR>*j_t+{YD)grye+ik0uoL;nZT+%RAO literal 0 HcmV?d00001 diff --git a/templates/compose/signoz.yaml b/templates/compose/signoz.yaml new file mode 100644 index 000000000..d491ce662 --- /dev/null +++ b/templates/compose/signoz.yaml @@ -0,0 +1,1743 @@ +# documentation: https://github.com/SigNoz/signoz +# slogan: An observability platform native to OpenTelemetry with logs, traces and metrics. +# tags: telemetry, server, applications, interface, logs, monitoring, traces, metrics +# logo: svgs/signoz.png +# port: 8080 + +services: + init-clickhouse: + image: clickhouse/clickhouse-server:24.1.2-alpine + container_name: signoz-init-clickhouse + command: + - bash + - -c + - | + version="v0.0.1" + node_os=$$(uname -s | tr '[:upper:]' '[:lower:]') + node_arch=$$(uname -m | sed s/aarch64/arm64/ | sed s/x86_64/amd64/) + echo "Fetching histogram-binary for $${node_os}/$${node_arch}" + cd /tmp + wget -O histogram-quantile.tar.gz "https://github.com/SigNoz/signoz/releases/download/histogram-quantile%2F$${version}/histogram-quantile_$${node_os}_$${node_arch}.tar.gz" + tar -xvzf histogram-quantile.tar.gz + mkdir -p /var/lib/clickhouse/user_scripts/histogramQuantile + mv histogram-quantile /var/lib/clickhouse/user_scripts/histogramQuantile + restart: on-failure + networks: + - signoz-net + logging: + options: + max-size: 50m + max-file: "3" + + zookeeper-1: + image: bitnami/zookeeper:3.7.1 + container_name: signoz-zookeeper-1 + user: root + healthcheck: + test: + - CMD-SHELL + - curl -s -m 2 http://localhost:8080/commands/ruok | grep error | grep null + interval: 30s + timeout: 5s + retries: 3 + networks: + - signoz-net + restart: unless-stopped + logging: + options: + max-size: 50m + max-file: "3" + + # ports: + # - "2181:2181" + # - "2888:2888" + # - "3888:3888" + volumes: + - zookeeper-1:/bitnami/zookeeper + environment: + - ZOO_SERVER_ID=1 + - ALLOW_ANONYMOUS_LOGIN=yes + - ZOO_AUTOPURGE_INTERVAL=1 + - ZOO_ENABLE_PROMETHEUS_METRICS=yes + - ZOO_PROMETHEUS_METRICS_PORT_NUMBER=9141 + + clickhouse: + # addding non LTS version due to this fix https://github.com/ClickHouse/ClickHouse/commit/32caf8716352f45c1b617274c7508c86b7d1afab + image: clickhouse/clickhouse-server:24.1.2-alpine + container_name: signoz-clickhouse + tty: true + depends_on: + init-clickhouse: + condition: service_completed_successfully + zookeeper-1: + condition: service_healthy + healthcheck: + test: + - CMD + - wget + - --spider + - -q + - 0.0.0.0:8123/ping + interval: 30s + timeout: 5s + retries: 3 + ulimits: + nproc: 65535 + nofile: + soft: 262144 + hard: 262144 + networks: + - signoz-net + restart: unless-stopped + logging: + options: + max-size: 50m + max-file: "3" + # ports: + # - "9000:9000" + # - "8123:8123" + # - "9181:9181" + volumes: + - type: bind + source: ./clickhouse/config.xml + target: /etc/clickhouse-server/config.xml + content: | + + + + + + information + + json + + /var/log/clickhouse-server/clickhouse-server.log + /var/log/clickhouse-server/clickhouse-server.err.log + + 1000M + 10 + + + + + + + + + + + + + + + + + + 8123 + + + 9000 + + + 9004 + + + 9005 + + + + + + + + + + + + 9009 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 4096 + + + 3 + + + + + false + + + /path/to/ssl_cert_file + /path/to/ssl_key_file + + + false + + + /path/to/ssl_ca_cert_file + + + none + + + 0 + + + -1 + -1 + + + false + + + + + + + + + + + none + true + true + sslv2,sslv3 + true + + + + true + true + sslv2,sslv3 + true + + + + RejectCertificateHandler + + + + + + + + + 100 + + + 0 + + + + 10000 + + + + + + 0.9 + + + 4194304 + + + 0 + + + + + + 8589934592 + + + 5368709120 + + + + 1000 + + + 134217728 + + + 10000 + + + /var/lib/clickhouse/ + + + /var/lib/clickhouse/tmp/ + + + + ` + + + + + + /var/lib/clickhouse/user_files/ + + + + + + + + + + + + + users.xml + + + + /var/lib/clickhouse/access/ + + + + + + + default + + + + + + + + + + + + default + + + + + + + + + true + + + false + + ' | sed -e 's|.*>\(.*\)<.*|\1|') + wget https://github.com/ClickHouse/clickhouse-jdbc-bridge/releases/download/v$PKG_VER/clickhouse-jdbc-bridge_$PKG_VER-1_all.deb + apt install --no-install-recommends -f ./clickhouse-jdbc-bridge_$PKG_VER-1_all.deb + clickhouse-jdbc-bridge & + + * [CentOS/RHEL] + export MVN_URL=https://repo1.maven.org/maven2/ru/yandex/clickhouse/clickhouse-jdbc-bridge + export PKG_VER=$(curl -sL $MVN_URL/maven-metadata.xml | grep '' | sed -e 's|.*>\(.*\)<.*|\1|') + wget https://github.com/ClickHouse/clickhouse-jdbc-bridge/releases/download/v$PKG_VER/clickhouse-jdbc-bridge-$PKG_VER-1.noarch.rpm + yum localinstall -y clickhouse-jdbc-bridge-$PKG_VER-1.noarch.rpm + clickhouse-jdbc-bridge & + + Please refer to https://github.com/ClickHouse/clickhouse-jdbc-bridge#usage for more information. + ]]> + + + + + + + + + + + + + + + 01 + example01-01-1 + + + + + + 3600 + + + + 3600 + + + 60 + + + + + + + + + + /metrics + 9363 + + true + true + true + true + + + + + + system + query_log
+ + toYYYYMM(event_date) + + + + + + 7500 +
+ + + + system + trace_log
+ + toYYYYMM(event_date) + 7500 +
+ + + + system + query_thread_log
+ toYYYYMM(event_date) + 7500 +
+ + + + system + query_views_log
+ toYYYYMM(event_date) + 7500 +
+ + + + system + part_log
+ toYYYYMM(event_date) + 7500 +
+ + + + + + system + metric_log
+ 7500 + 1000 +
+ + + + system + asynchronous_metric_log
+ + 7000 +
+ + + + + + engine MergeTree + partition by toYYYYMM(finish_date) + order by (finish_date, finish_time_us, trace_id) + + system + opentelemetry_span_log
+ 7500 +
+ + + + + system + crash_log
+ + + 1000 +
+ + + + + + + system + processors_profile_log
+ + toYYYYMM(event_date) + 7500 +
+ + + + + + + + + *_dictionary.xml + + + *function.xml + /var/lib/clickhouse/user_scripts/ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + /clickhouse/task_queue/ddl + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + click_cost + any + + 0 + 3600 + + + 86400 + 60 + + + + max + + 0 + 60 + + + 3600 + 300 + + + 86400 + 3600 + + + + + + /var/lib/clickhouse/format_schemas/ + + + + + hide encrypt/decrypt arguments + ((?:aes_)?(?:encrypt|decrypt)(?:_mysql)?)\s*\(\s*(?:'(?:\\'|.)+'|.*?)\s*\) + + \1(???) + + + + + + + + + + false + + false + + + https://6f33034cfe684dd7a3ab9875e57b1c8d@o388870.ingest.sentry.io/5226277 + + + + + + + + + + + 268435456 + true + +
+ - type: bind + source: ./clickhouse/users.xml + target: /etc/clickhouse-server/users.xml + content: | + + + + + + + + + + 10000000000 + + + random + + + + + 1 + + + + + + + + + + + + + ::/0 + + + + default + + + default + + + + + + + + + + + + + + 3600 + + + 0 + 0 + 0 + 0 + 0 + + + + + - type: bind + source: ./clickhouse/custom-function.xml + target: /etc/clickhouse-server/custom-function.xml + content: | + + + executable + histogramQuantile + Float64 + + Array(Float64) + buckets + + + Array(Float64) + counts + + + Float64 + quantile + + CSV + ./histogramQuantile + + + - type: bind + source: ./clickhouse/cluster.xml + target: /etc/clickhouse-server/config.d/cluster.xml + content: | + + + + + + zookeeper-1 + 2181 + + + + + + + + + + + + + + + + clickhouse + 9000 + + + + + + + + + - type: volume + source: clickhouse + target: /var/lib/clickhouse/ + + signoz: + image: signoz/signoz:${DOCKER_TAG:-v0.76.2} + container_name: signoz + depends_on: + clickhouse: + condition: service_healthy + schema-migrator-sync: + condition: service_completed_successfully + networks: + - signoz-net + restart: unless-stopped + logging: + options: + max-size: 50m + max-file: "3" + command: + - --config=/root/config/prometheus.yml + - --use-logs-new-schema=true + - --use-trace-new-schema=true + volumes: + - type: bind + source: ./prometheus.yml + target: /root/config/prometheus.yml + content: | + # my global config + global: + scrape_interval: 5s # Set the scrape interval to every 15 seconds. Default is every 1 minute. + evaluation_interval: 15s # Evaluate rules every 15 seconds. The default is every 1 minute. + # scrape_timeout is set to the global default (10s). + + # Alertmanager configuration + alerting: + alertmanagers: + - static_configs: + - targets: + - alertmanager:9093 + + # Load rules once and periodically evaluate them according to the global 'evaluation_interval'. + rule_files: [] + # - "first_rules.yml" + # - "second_rules.yml" + # - 'alerts.yml' + + # A scrape configuration containing exactly one endpoint to scrape: + # Here it's Prometheus itself. + scrape_configs: [] + + remote_read: + - url: tcp://clickhouse:9000/signoz_metrics + - type: volume + source: sqlite + target: /var/lib/signoz/ + environment: + - SERVICE_FQDN_SIGNOZ_8080 + - SIGNOZ_ALERTMANAGER_PROVIDER=signoz + - SIGNOZ_TELEMETRYSTORE_CLICKHOUSE_DSN=tcp://clickhouse:9000 + - SIGNOZ_SQLSTORE_SQLITE_PATH=/var/lib/signoz/signoz.db + - DASHBOARDS_PATH=/root/config/dashboards + - STORAGE=clickhouse + - GODEBUG=netdns=go + - TELEMETRY_ENABLED=true + - DEPLOYMENT_TYPE=docker-standalone-amd + healthcheck: + test: + - CMD + - wget + - --spider + - -q + - localhost:8080/api/v1/health + interval: 30s + timeout: 5s + retries: 3 + + otel-collector: + image: signoz/signoz-otel-collector:${OTELCOL_TAG:-v0.111.34} + container_name: signoz-otel-collector + depends_on: + clickhouse: + condition: service_healthy + schema-migrator-sync: + condition: service_completed_successfully + signoz: + condition: service_healthy + networks: + - signoz-net + restart: unless-stopped + logging: + options: + max-size: 50m + max-file: "3" + ports: + - "4317:4317" # OTLP gRPC receiver + - "4318:4318" # OTLP HTTP receiver + command: + - --config=/etc/otel-collector-config.yaml + - --manager-config=/etc/manager-config.yaml + - --copy-path=/var/tmp/collector-config.yaml + - --feature-gates=-pkg.translator.prometheus.NormalizeName + volumes: + - type: bind + source: ./otel-collector-config.yaml + target: /etc/otel-collector-config.yaml + content: | + receivers: + otlp: + protocols: + grpc: + endpoint: 0.0.0.0:4317 + http: + endpoint: 0.0.0.0:4318 + prometheus: + config: + global: + scrape_interval: 60s + scrape_configs: + - job_name: otel-collector + static_configs: + - targets: + - localhost:8888 + labels: + job_name: otel-collector + processors: + batch: + send_batch_size: 10000 + send_batch_max_size: 11000 + timeout: 10s + resourcedetection: + # Using OTEL_RESOURCE_ATTRIBUTES envvar, env detector adds custom labels. + detectors: [env, system] + timeout: 2s + signozspanmetrics/delta: + metrics_exporter: clickhousemetricswrite + metrics_flush_interval: 60s + latency_histogram_buckets: [100us, 1ms, 2ms, 6ms, 10ms, 50ms, 100ms, 250ms, 500ms, 1000ms, 1400ms, 2000ms, 5s, 10s, 20s, 40s, 60s ] + dimensions_cache_size: 100000 + aggregation_temporality: AGGREGATION_TEMPORALITY_DELTA + enable_exp_histogram: true + dimensions: + - name: service.namespace + default: default + - name: deployment.environment + default: default + # This is added to ensure the uniqueness of the timeseries + # Otherwise, identical timeseries produced by multiple replicas of + # collectors result in incorrect APM metrics + - name: signoz.collector.id + - name: service.version + - name: browser.platform + - name: browser.mobile + - name: k8s.cluster.name + - name: k8s.node.name + - name: k8s.namespace.name + - name: host.name + - name: host.type + - name: container.name + extensions: + health_check: + endpoint: 0.0.0.0:13133 + pprof: + endpoint: 0.0.0.0:1777 + exporters: + clickhousetraces: + datasource: tcp://clickhouse:9000/signoz_traces + low_cardinal_exception_grouping: ${env:LOW_CARDINAL_EXCEPTION_GROUPING} + use_new_schema: true + clickhousemetricswrite: + endpoint: tcp://clickhouse:9000/signoz_metrics + resource_to_telemetry_conversion: + enabled: true + clickhousemetricswrite/prometheus: + endpoint: tcp://clickhouse:9000/signoz_metrics + signozclickhousemetrics: + dsn: tcp://clickhouse:9000/signoz_metrics + clickhouselogsexporter: + dsn: tcp://clickhouse:9000/signoz_logs + timeout: 10s + use_new_schema: true + # debug: {} + service: + telemetry: + logs: + encoding: json + metrics: + address: 0.0.0.0:8888 + extensions: + - health_check + - pprof + pipelines: + traces: + receivers: [otlp] + processors: [signozspanmetrics/delta, batch] + exporters: [clickhousetraces] + metrics: + receivers: [otlp] + processors: [batch] + exporters: [clickhousemetricswrite, signozclickhousemetrics] + metrics/prometheus: + receivers: [prometheus] + processors: [batch] + exporters: [clickhousemetricswrite/prometheus, signozclickhousemetrics] + logs: + receivers: [otlp] + processors: [batch] + exporters: [clickhouselogsexporter] + - type: bind + source: ./otel-collector-opamp-config.yaml + target: /etc/manager-config.yaml + content: | + server_endpoint: ws://signoz:4320/v1/opamp + environment: + - OTEL_RESOURCE_ATTRIBUTES=host.name=signoz-host,os.type=linux + - LOW_CARDINAL_EXCEPTION_GROUPING=false + + schema-migrator-sync: + image: signoz/signoz-schema-migrator:${OTELCOL_TAG:-v0.111.34} + container_name: schema-migrator-sync + command: + - sync + - --dsn=tcp://clickhouse:9000 + - --up= + depends_on: + clickhouse: + condition: service_healthy + restart: on-failure + networks: + - signoz-net + logging: + options: + max-size: 50m + max-file: "3" + + schema-migrator-async: + image: signoz/signoz-schema-migrator:${OTELCOL_TAG:-v0.111.34} + container_name: schema-migrator-async + depends_on: + clickhouse: + condition: service_healthy + schema-migrator-sync: + condition: service_completed_successfully + networks: + - signoz-net + logging: + options: + max-size: 50m + max-file: "3" + command: + - async + - --dsn=tcp://clickhouse:9000 + - --up= + restart: on-failure + +networks: + signoz-net: + name: signoz-net + +volumes: + clickhouse: + name: signoz-clickhouse + sqlite: + name: signoz-sqlite + zookeeper-1: + name: signoz-zookeeper-1 \ No newline at end of file From 508d0a06e4d62ba9acab0ae46f6424a915b8297d Mon Sep 17 00:00:00 2001 From: Gauthier POGAM--LE MONTAGNER Date: Thu, 20 Mar 2025 15:27:44 +0100 Subject: [PATCH 0002/1232] feat(signoz): replace png icon by svg icon --- public/svgs/signoz.png | Bin 173112 -> 0 bytes public/svgs/signoz.svg | 30 ++++++++++++++++++++++++++++++ 2 files changed, 30 insertions(+) delete mode 100644 public/svgs/signoz.png create mode 100644 public/svgs/signoz.svg diff --git a/public/svgs/signoz.png b/public/svgs/signoz.png deleted file mode 100644 index a681188c7e6f71f779058786f9f153dd1d015d79..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 173112 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 uR>*j_t+{YD)grye+ik0uoL;nZT+%RAO diff --git a/public/svgs/signoz.svg b/public/svgs/signoz.svg new file mode 100644 index 000000000..ac47e1c93 --- /dev/null +++ b/public/svgs/signoz.svg @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From fe489faa39c04f1452d3c2d4d4ab053d32ed5487 Mon Sep 17 00:00:00 2001 From: Gauthier POGAM--LE MONTAGNER Date: Thu, 20 Mar 2025 15:28:24 +0100 Subject: [PATCH 0003/1232] feat(signoz): remove explicit 'networks' setting --- templates/compose/signoz.yaml | 20 +------------------- 1 file changed, 1 insertion(+), 19 deletions(-) diff --git a/templates/compose/signoz.yaml b/templates/compose/signoz.yaml index d491ce662..fdcc7cfcb 100644 --- a/templates/compose/signoz.yaml +++ b/templates/compose/signoz.yaml @@ -1,7 +1,7 @@ # documentation: https://github.com/SigNoz/signoz # slogan: An observability platform native to OpenTelemetry with logs, traces and metrics. # tags: telemetry, server, applications, interface, logs, monitoring, traces, metrics -# logo: svgs/signoz.png +# logo: svgs/signoz.svg # port: 8080 services: @@ -22,8 +22,6 @@ services: mkdir -p /var/lib/clickhouse/user_scripts/histogramQuantile mv histogram-quantile /var/lib/clickhouse/user_scripts/histogramQuantile restart: on-failure - networks: - - signoz-net logging: options: max-size: 50m @@ -40,8 +38,6 @@ services: interval: 30s timeout: 5s retries: 3 - networks: - - signoz-net restart: unless-stopped logging: options: @@ -86,8 +82,6 @@ services: nofile: soft: 262144 hard: 262144 - networks: - - signoz-net restart: unless-stopped logging: options: @@ -1487,8 +1481,6 @@ services: condition: service_healthy schema-migrator-sync: condition: service_completed_successfully - networks: - - signoz-net restart: unless-stopped logging: options: @@ -1562,8 +1554,6 @@ services: condition: service_completed_successfully signoz: condition: service_healthy - networks: - - signoz-net restart: unless-stopped logging: options: @@ -1703,8 +1693,6 @@ services: clickhouse: condition: service_healthy restart: on-failure - networks: - - signoz-net logging: options: max-size: 50m @@ -1718,8 +1706,6 @@ services: condition: service_healthy schema-migrator-sync: condition: service_completed_successfully - networks: - - signoz-net logging: options: max-size: 50m @@ -1730,10 +1716,6 @@ services: - --up= restart: on-failure -networks: - signoz-net: - name: signoz-net - volumes: clickhouse: name: signoz-clickhouse From fa61a80a528ceab9e74d457f3dcb3153f8c0315e Mon Sep 17 00:00:00 2001 From: Gauthier POGAM--LE MONTAGNER Date: Fri, 21 Mar 2025 10:29:36 +0100 Subject: [PATCH 0004/1232] chore(signoz): remove unused ports --- templates/compose/signoz.yaml | 9 --------- 1 file changed, 9 deletions(-) diff --git a/templates/compose/signoz.yaml b/templates/compose/signoz.yaml index fdcc7cfcb..1d9a134ef 100644 --- a/templates/compose/signoz.yaml +++ b/templates/compose/signoz.yaml @@ -43,11 +43,6 @@ services: options: max-size: 50m max-file: "3" - - # ports: - # - "2181:2181" - # - "2888:2888" - # - "3888:3888" volumes: - zookeeper-1:/bitnami/zookeeper environment: @@ -87,10 +82,6 @@ services: options: max-size: 50m max-file: "3" - # ports: - # - "9000:9000" - # - "8123:8123" - # - "9181:9181" volumes: - type: bind source: ./clickhouse/config.xml From 5d60eabff937f6492433c1274613d3867f05e98f Mon Sep 17 00:00:00 2001 From: Gauthier POGAM--LE MONTAGNER Date: Fri, 21 Mar 2025 10:31:02 +0100 Subject: [PATCH 0005/1232] feat(signoz): add predefined environment variables to configure Telemetry, SMTP and email sending for Alert Manager --- templates/compose/signoz.yaml | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/templates/compose/signoz.yaml b/templates/compose/signoz.yaml index 1d9a134ef..f4cb79ce9 100644 --- a/templates/compose/signoz.yaml +++ b/templates/compose/signoz.yaml @@ -26,7 +26,7 @@ services: options: max-size: 50m max-file: "3" - + zookeeper-1: image: bitnami/zookeeper:3.7.1 container_name: signoz-zookeeper-1 @@ -51,7 +51,7 @@ services: - ZOO_AUTOPURGE_INTERVAL=1 - ZOO_ENABLE_PROMETHEUS_METRICS=yes - ZOO_PROMETHEUS_METRICS_PORT_NUMBER=9141 - + clickhouse: # addding non LTS version due to this fix https://github.com/ClickHouse/ClickHouse/commit/32caf8716352f45c1b617274c7508c86b7d1afab image: clickhouse/clickhouse-server:24.1.2-alpine @@ -1229,7 +1229,7 @@ services: true - - type: bind + - type: bind source: ./clickhouse/users.xml target: /etc/clickhouse-server/users.xml content: | @@ -1522,8 +1522,18 @@ services: - DASHBOARDS_PATH=/root/config/dashboards - STORAGE=clickhouse - GODEBUG=netdns=go - - TELEMETRY_ENABLED=true - DEPLOYMENT_TYPE=docker-standalone-amd + - TELEMETRY_ENABLED=${TELEMETRY_ENABLED:-true} + - SMTP_ENABLED=${SMTP_ENABLED:-false} + - SMTP_FROM=${SMTP_FROM} + - SMTP_HOST=${SMTP_HOST} + - SMTP_PORT=${SMTP_PORT} + - SMTP_USERNAME=${SMTP_USERNAME} + - SMTP_PASSWORD=${SMTP_PASSWORD} + - SIGNOZ_ALERTMANAGER_SIGNOZ_GLOBAL_SMTP__AUTH__PASSWORD=${SIGNOZ_ALERTMANAGER_SIGNOZ_GLOBAL_SMTP__AUTH__PASSWORD} + - SIGNOZ_ALERTMANAGER_SIGNOZ_GLOBAL_SMTP__AUTH__USERNAME=${SIGNOZ_ALERTMANAGER_SIGNOZ_GLOBAL_SMTP__AUTH__USERNAME} + - SIGNOZ_ALERTMANAGER_SIGNOZ_GLOBAL_SMTP__FROM=${SIGNOZ_ALERTMANAGER_SIGNOZ_GLOBAL_SMTP__FROM} + - SIGNOZ_ALERTMANAGER_SIGNOZ_GLOBAL_SMTP__SMARTHOST=${SIGNOZ_ALERTMANAGER_SIGNOZ_GLOBAL_SMTP__SMARTHOST} healthcheck: test: - CMD @@ -1713,4 +1723,4 @@ volumes: sqlite: name: signoz-sqlite zookeeper-1: - name: signoz-zookeeper-1 \ No newline at end of file + name: signoz-zookeeper-1 From 043e32bb8bb21570042ee7676751076b35edce1f Mon Sep 17 00:00:00 2001 From: Gauthier POGAM--LE MONTAGNER Date: Fri, 21 Mar 2025 10:32:05 +0100 Subject: [PATCH 0006/1232] feat(signoz): generate URLs for `otel-collector` service --- templates/compose/signoz.yaml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/templates/compose/signoz.yaml b/templates/compose/signoz.yaml index f4cb79ce9..9c3dc9260 100644 --- a/templates/compose/signoz.yaml +++ b/templates/compose/signoz.yaml @@ -1680,6 +1680,8 @@ services: content: | server_endpoint: ws://signoz:4320/v1/opamp environment: + - SERVICE_FQDN_OTELCOLLECTORGRPC_4317 + - SERVICE_FQDN_OTELCOLLECTORHTTP_4318 - OTEL_RESOURCE_ATTRIBUTES=host.name=signoz-host,os.type=linux - LOW_CARDINAL_EXCEPTION_GROUPING=false From fa967abbc12f4d43b08eebadb5a7b41b2dafb092 Mon Sep 17 00:00:00 2001 From: Gauthier POGAM--LE MONTAGNER Date: Fri, 21 Mar 2025 11:27:24 +0100 Subject: [PATCH 0007/1232] feat(signoz): update documentation link --- templates/compose/signoz.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/templates/compose/signoz.yaml b/templates/compose/signoz.yaml index 9c3dc9260..77657bdd6 100644 --- a/templates/compose/signoz.yaml +++ b/templates/compose/signoz.yaml @@ -1,4 +1,4 @@ -# documentation: https://github.com/SigNoz/signoz +# documentation: https://signoz.io/docs/introduction/ # slogan: An observability platform native to OpenTelemetry with logs, traces and metrics. # tags: telemetry, server, applications, interface, logs, monitoring, traces, metrics # logo: svgs/signoz.svg From d39e6ecc07625b757c50f7460f9d7f18f19c39bd Mon Sep 17 00:00:00 2001 From: Gauthier POGAM--LE MONTAGNER Date: Fri, 21 Mar 2025 18:08:40 +0100 Subject: [PATCH 0008/1232] feat(signoz): add healthcheck to otel-collector service --- templates/compose/signoz.yaml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/templates/compose/signoz.yaml b/templates/compose/signoz.yaml index 77657bdd6..6d18fe242 100644 --- a/templates/compose/signoz.yaml +++ b/templates/compose/signoz.yaml @@ -1684,6 +1684,11 @@ services: - SERVICE_FQDN_OTELCOLLECTORHTTP_4318 - OTEL_RESOURCE_ATTRIBUTES=host.name=signoz-host,os.type=linux - LOW_CARDINAL_EXCEPTION_GROUPING=false + healthcheck: + test: bash -c "exec 6<> /dev/tcp/localhost/13133" + interval: 30s + timeout: 5s + retries: 3 schema-migrator-sync: image: signoz/signoz-schema-migrator:${OTELCOL_TAG:-v0.111.34} From 7e271dfcdb5984848283605abf457c196953e944 Mon Sep 17 00:00:00 2001 From: Gauthier POGAM--LE MONTAGNER Date: Mon, 24 Mar 2025 10:15:16 +0100 Subject: [PATCH 0009/1232] fix(signoz): remove example secrets to avoid triggering GitGuardian --- templates/compose/signoz.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/templates/compose/signoz.yaml b/templates/compose/signoz.yaml index 6d18fe242..9f74e8a16 100644 --- a/templates/compose/signoz.yaml +++ b/templates/compose/signoz.yaml @@ -1274,11 +1274,11 @@ services: Password could be empty. If you want to specify SHA256, place it in 'password_sha256_hex' element. - Example: 65e84be33532fb784c48129675f9eff3a682b27168c0ea744b2cf58ee02337c5 + Example: **PASSWORD HASHED WITH SHA256** Restrictions of SHA256: impossibility to connect to ClickHouse using MySQL JS client (as of July 2019). If you want to specify double SHA1, place it in 'password_double_sha1_hex' element. - Example: e395796d6546b1b65db9d665cd43f0e858dd4303 + Example: **PASSWORD HASHED WITH SHA1** If you want to specify a previously defined LDAP server (see 'ldap_servers' in the main config) for authentication, place its name in 'server' element inside 'ldap' element. From 55765908f6976821973dfe45b3696c571fe97a8e Mon Sep 17 00:00:00 2001 From: Gauthier POGAM--LE MONTAGNER Date: Mon, 7 Apr 2025 14:39:05 +0200 Subject: [PATCH 0010/1232] chore(signoz): bump version to 0.77.0 --- templates/compose/signoz.yaml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/templates/compose/signoz.yaml b/templates/compose/signoz.yaml index 9f74e8a16..1d9719396 100644 --- a/templates/compose/signoz.yaml +++ b/templates/compose/signoz.yaml @@ -1465,7 +1465,7 @@ services: target: /var/lib/clickhouse/ signoz: - image: signoz/signoz:${DOCKER_TAG:-v0.76.2} + image: signoz/signoz:${VERSION:-v0.77.0} container_name: signoz depends_on: clickhouse: @@ -1546,7 +1546,7 @@ services: retries: 3 otel-collector: - image: signoz/signoz-otel-collector:${OTELCOL_TAG:-v0.111.34} + image: signoz/signoz-otel-collector:${OTELCOL_TAG:-v0.111.37} container_name: signoz-otel-collector depends_on: clickhouse: @@ -1691,7 +1691,7 @@ services: retries: 3 schema-migrator-sync: - image: signoz/signoz-schema-migrator:${OTELCOL_TAG:-v0.111.34} + image: signoz/signoz-schema-migrator:${OTELCOL_TAG:-v0.111.37} container_name: schema-migrator-sync command: - sync @@ -1707,7 +1707,7 @@ services: max-file: "3" schema-migrator-async: - image: signoz/signoz-schema-migrator:${OTELCOL_TAG:-v0.111.34} + image: signoz/signoz-schema-migrator:${OTELCOL_TAG:-v0.111.37} container_name: schema-migrator-async depends_on: clickhouse: From 4db6a523b4a5e2c978d90eb0183bc6adcab35ad6 Mon Sep 17 00:00:00 2001 From: Gauthier POGAM--LE MONTAGNER Date: Tue, 15 Apr 2025 10:03:42 +0200 Subject: [PATCH 0011/1232] chore(signoz): bump version to 0.78.1 --- templates/compose/signoz.yaml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/templates/compose/signoz.yaml b/templates/compose/signoz.yaml index 1d9719396..288f67cb8 100644 --- a/templates/compose/signoz.yaml +++ b/templates/compose/signoz.yaml @@ -1465,7 +1465,7 @@ services: target: /var/lib/clickhouse/ signoz: - image: signoz/signoz:${VERSION:-v0.77.0} + image: signoz/signoz:${VERSION:-v0.78.1} container_name: signoz depends_on: clickhouse: @@ -1546,7 +1546,7 @@ services: retries: 3 otel-collector: - image: signoz/signoz-otel-collector:${OTELCOL_TAG:-v0.111.37} + image: signoz/signoz-otel-collector:${OTELCOL_TAG:-v0.111.38} container_name: signoz-otel-collector depends_on: clickhouse: @@ -1691,7 +1691,7 @@ services: retries: 3 schema-migrator-sync: - image: signoz/signoz-schema-migrator:${OTELCOL_TAG:-v0.111.37} + image: signoz/signoz-schema-migrator:${OTELCOL_TAG:-v0.111.38} container_name: schema-migrator-sync command: - sync @@ -1707,7 +1707,7 @@ services: max-file: "3" schema-migrator-async: - image: signoz/signoz-schema-migrator:${OTELCOL_TAG:-v0.111.37} + image: signoz/signoz-schema-migrator:${OTELCOL_TAG:-v0.111.38} container_name: schema-migrator-async depends_on: clickhouse: From 2e0d4328867e312e70e3c204fe112b640b60838e Mon Sep 17 00:00:00 2001 From: DanielHemmati Date: Wed, 23 Apr 2025 15:56:34 +0200 Subject: [PATCH 0012/1232] add backup config info to --- app/Http/Controllers/Api/DatabasesController.php | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/app/Http/Controllers/Api/DatabasesController.php b/app/Http/Controllers/Api/DatabasesController.php index 504665f6a..452e24837 100644 --- a/app/Http/Controllers/Api/DatabasesController.php +++ b/app/Http/Controllers/Api/DatabasesController.php @@ -11,6 +11,7 @@ use App\Http\Controllers\Controller; use App\Jobs\DeleteResourceJob; use App\Models\Project; +use App\Models\ScheduledDatabaseBackup; use App\Models\Server; use Illuminate\Http\Request; use OpenApi\Attributes as OA; @@ -78,7 +79,17 @@ public function databases(Request $request) foreach ($projects as $project) { $databases = $databases->merge($project->databases()); } - $databases = $databases->map(function ($database) { + + $backupConfig = ScheduledDatabaseBackup::with('latest_log')->get(); + $databases = $databases->map(function ($database) use ($backupConfig) { + $databaseBackupConfig = $backupConfig->where('database_id', $database->id)->first(); + + if ($databaseBackupConfig) { + $database->backup_configs = $databaseBackupConfig; + } else { + $database->backup_configs = null; + } + return $this->removeSensitiveData($database); }); From da487f609acfd8966ff8393e3c77dba64f358858 Mon Sep 17 00:00:00 2001 From: DanielHemmati Date: Wed, 23 Apr 2025 20:59:20 +0200 Subject: [PATCH 0013/1232] implmenet `Get /database/:uuid/backups` api --- .../Controllers/Api/DatabasesController.php | 63 +++++++++++++++++++ routes/api.php | 5 ++ 2 files changed, 68 insertions(+) diff --git a/app/Http/Controllers/Api/DatabasesController.php b/app/Http/Controllers/Api/DatabasesController.php index 452e24837..de8daa43e 100644 --- a/app/Http/Controllers/Api/DatabasesController.php +++ b/app/Http/Controllers/Api/DatabasesController.php @@ -96,6 +96,69 @@ public function databases(Request $request) return response()->json($databases); } + #[OA\Get( + summary: 'Get', + description: 'Get database by UUID.', + path: '/databases/{uuid}/backups', + operationId: 'get-database-backups-by-uuid', + security: [ + ['bearerAuth' => []], + ], + tags: ['Databases'], + parameters: [ + new OA\Parameter( + name: 'uuid', + in: 'path', + description: 'UUID of the database.', + required: true, + schema: new OA\Schema( + type: 'string', + format: 'uuid', + ) + ), + ], + responses: [ + new OA\Response( + response: 200, + description: 'Get all backups for a database', + content: new OA\JsonContent( + type: 'string', + example: 'Content is very complex. Will be implemented later.', + ), + ), + new OA\Response( + response: 401, + ref: '#/components/responses/401', + ), + new OA\Response( + response: 400, + ref: '#/components/responses/400', + ), + new OA\Response( + response: 404, + ref: '#/components/responses/404', + ), + ] + )] + public function database_backup_details_uuid(Request $request) + { + $teamId = getTeamIdFromToken(); + if (is_null($teamId)) { + return invalidTokenResponse(); + } + if (! $request->uuid) { + return response()->json(['message' => 'UUID is required.'], 404); + } + $database = queryDatabaseByUuidWithinTeam($request->uuid, $teamId); + if (! $database) { + return response()->json(['message' => 'Database not found.'], 404); + } + + $backupConfig = ScheduledDatabaseBackup::with('executions')->where('database_id', $database->id)->first(); + + return response()->json($this->removeSensitiveData($backupConfig)); + } + #[OA\Get( summary: 'Get', description: 'Get database by UUID.', diff --git a/routes/api.php b/routes/api.php index 8ac8aef14..409dd393f 100644 --- a/routes/api.php +++ b/routes/api.php @@ -23,6 +23,10 @@ }); Route::post('/feedback', [OtherController::class, 'feedback']); +Route::get('/test', function () { + return response()->json(['message' => 'test']); +}); + Route::group([ 'middleware' => ['auth:sanctum', 'api.ability:write'], 'prefix' => 'v1', @@ -110,6 +114,7 @@ Route::post('/databases/keydb', [DatabasesController::class, 'create_database_keydb'])->middleware(['api.ability:write']); Route::get('/databases/{uuid}', [DatabasesController::class, 'database_by_uuid'])->middleware(['api.ability:read']); + Route::get('/databases/{uuid}/backups', [DatabasesController::class, 'database_backup_details_uuid'])->middleware(['api.ability:read']); Route::patch('/databases/{uuid}', [DatabasesController::class, 'update_by_uuid'])->middleware(['api.ability:write']); Route::delete('/databases/{uuid}', [DatabasesController::class, 'delete_by_uuid'])->middleware(['api.ability:write']); From 5dff22d3455146c7a46901da823d6c8a8c3c8d06 Mon Sep 17 00:00:00 2001 From: DanielHemmati Date: Thu, 24 Apr 2025 16:48:08 +0200 Subject: [PATCH 0014/1232] implement backup config via api --- .../Controllers/Api/DatabasesController.php | 61 ++++++++++++++++++- routes/api.php | 3 - 2 files changed, 59 insertions(+), 5 deletions(-) diff --git a/app/Http/Controllers/Api/DatabasesController.php b/app/Http/Controllers/Api/DatabasesController.php index de8daa43e..ab0191581 100644 --- a/app/Http/Controllers/Api/DatabasesController.php +++ b/app/Http/Controllers/Api/DatabasesController.php @@ -288,6 +288,19 @@ public function database_by_uuid(Request $request) 'mysql_user' => ['type' => 'string', 'description' => 'MySQL user'], 'mysql_database' => ['type' => 'string', 'description' => 'MySQL database'], 'mysql_conf' => ['type' => 'string', 'description' => 'MySQL conf'], + // WIP + 'save_s3' => ['type' => 'boolean', 'description' => 'Weather data is saved in s3 or not'], + 's3_storage_id' => ['type' => 'integer', 'description' => 'S3 storage id'], + 'enabled' => ['type' => 'boolean', 'description' => 'Weather the backup is enabled or not'], + 'databases_to_backup' => ['type' => 'string', 'description' => 'Comma separated list of databases to backup'], + 'dump_all' => ['type' => 'boolean', 'description' => 'Weather all databases are dumped or not'], + 'frequency' => ['type' => 'string', 'description' => 'Frequency of the backup'], + 'database_backup_retention_amount_locally' => ['type' => 'integer', 'description' => 'Retention amount of the backup locally'], + 'database_backup_retention_days_locally' => ['type' => 'integer', 'description' => 'Retention days of the backup locally'], + 'database_backup_retention_max_storage_locally' => ['type' => 'integer', 'description' => 'Max storage of the backup locally'], + 'database_backup_retention_amount_s3' => ['type' => 'integer', 'description' => 'Retention amount of the backup in s3'], + 'database_backup_retention_days_s3' => ['type' => 'integer', 'description' => 'Retention days of the backup in s3'], + 'database_backup_retention_max_storage_s3' => ['type' => 'integer', 'description' => 'Max storage of the backup locally'], ], ), ) @@ -313,12 +326,14 @@ public function database_by_uuid(Request $request) )] public function update_by_uuid(Request $request) { + $allowedBackupConfigsFields = ['save_s3', 'enabled', 'dump_all', 'frequency', 'databases_to_backup', 'database_backup_retention_amount_locally', 'database_backup_retention_days_locally', 'database_backup_retention_max_storage_locally', 'database_backup_retention_amount_s3', 'database_backup_retention_days_s3', 'database_backup_retention_max_storage_s3', 's3_storage_id']; $allowedFields = ['name', 'description', 'image', 'public_port', 'is_public', 'instant_deploy', 'limits_memory', 'limits_memory_swap', 'limits_memory_swappiness', 'limits_memory_reservation', 'limits_cpus', 'limits_cpuset', 'limits_cpu_shares', 'postgres_user', 'postgres_password', 'postgres_db', 'postgres_initdb_args', 'postgres_host_auth_method', 'postgres_conf', 'clickhouse_admin_user', 'clickhouse_admin_password', 'dragonfly_password', 'redis_password', 'redis_conf', 'keydb_password', 'keydb_conf', 'mariadb_conf', 'mariadb_root_password', 'mariadb_user', 'mariadb_password', 'mariadb_database', 'mongo_conf', 'mongo_initdb_root_username', 'mongo_initdb_root_password', 'mongo_initdb_database', 'mysql_root_password', 'mysql_password', 'mysql_user', 'mysql_database', 'mysql_conf']; $teamId = getTeamIdFromToken(); if (is_null($teamId)) { return invalidTokenResponse(); } + // this check if the request is a valid json $return = validateIncomingRequest($request); if ($return instanceof \Illuminate\Http\JsonResponse) { return $return; @@ -336,6 +351,18 @@ public function update_by_uuid(Request $request) 'limits_cpus' => 'string', 'limits_cpuset' => 'string|nullable', 'limits_cpu_shares' => 'numeric', + 'save_s3' => 'boolean', + 'enabled' => 'boolean', + 'dump_all' => 'boolean', + 's3_storage_id' => 'integer|min:1|exists:s3_storages,id|nullable', + 'databases_to_backup' => 'string', + 'frequency' => 'string|in:every_minute,hourly,daily,weekly,monthly,yearly', + 'database_backup_retention_amount_locally' => 'integer|min:0', + 'database_backup_retention_days_locally' => 'integer|min:0', + 'database_backup_retention_max_storage_locally' => 'integer|min:0', + 'database_backup_retention_amount_s3' => 'integer|min:0', + 'database_backup_retention_days_s3' => 'integer|min:0', + 'database_backup_retention_max_storage_s3' => 'integer|min:0', ]); if ($validator->fails()) { @@ -347,6 +374,7 @@ public function update_by_uuid(Request $request) $uuid = $request->uuid; removeUnnecessaryFieldsFromRequest($request); $database = queryDatabaseByUuidWithinTeam($uuid, $teamId); + $backupConfig = ScheduledDatabaseBackup::where('database_id', $database->id)->first(); if (! $database) { return response()->json(['message' => 'Database not found.'], 404); } @@ -545,7 +573,7 @@ public function update_by_uuid(Request $request) } break; } - $extraFields = array_diff(array_keys($request->all()), $allowedFields); + $extraFields = array_diff(array_keys($request->all()), $allowedFields, $allowedBackupConfigsFields); if ($validator->fails() || ! empty($extraFields)) { $errors = $validator->errors(); if (! empty($extraFields)) { @@ -567,7 +595,36 @@ public function update_by_uuid(Request $request) $whatToDoWithDatabaseProxy = 'start'; } - $database->update($request->all()); + $backupPayload = $request->only($allowedBackupConfigsFields); + $databasePayload = $request->only($allowedFields); + + if ($databasePayload) { + $database->update($databasePayload); + } + + if ($backupPayload && ! $backupConfig) { + if ($database->type() === 'standalone-postgresql') { + $backupPayload['databases_to_backup'] = $database->postgres_db; + } elseif ($database->type() === 'standalone-mysql') { + $backupPayload['databases_to_backup'] = $database->mysql_database; + } elseif ($database->type() === 'standalone-mariadb') { + $backupPayload['databases_to_backup'] = $database->mariadb_database; + } elseif ($database->type() === 'standalone-mongodbs') { + $backupPayload['databases_to_backup'] = $database->mongo_initdb_database; + } + + $backupConfig = ScheduledDatabaseBackup::create([ + 'database_id' => $database->id, + 'database_type' => $database->getMorphClass(), + 'team_id' => $teamId, + 's3_storage_id' => $backupPayload['s3_storage_id'] ?? 1, + ...$backupPayload, + ]); + } + + if ($backupPayload && $backupConfig) { + $backupConfig->update($backupPayload); + } if ($whatToDoWithDatabaseProxy === 'start') { StartDatabaseProxy::dispatch($database); diff --git a/routes/api.php b/routes/api.php index 409dd393f..326399f30 100644 --- a/routes/api.php +++ b/routes/api.php @@ -23,9 +23,6 @@ }); Route::post('/feedback', [OtherController::class, 'feedback']); -Route::get('/test', function () { - return response()->json(['message' => 'test']); -}); Route::group([ 'middleware' => ['auth:sanctum', 'api.ability:write'], From 2a06a392d5174f278f20cf9533644d1e7fd2c747 Mon Sep 17 00:00:00 2001 From: DanielHemmati Date: Fri, 25 Apr 2025 11:46:02 +0200 Subject: [PATCH 0015/1232] Implement backup delete --- .../Controllers/Api/DatabasesController.php | 95 +++++++++++++++++++ routes/api.php | 1 + 2 files changed, 96 insertions(+) diff --git a/app/Http/Controllers/Api/DatabasesController.php b/app/Http/Controllers/Api/DatabasesController.php index ab0191581..a25b07bf2 100644 --- a/app/Http/Controllers/Api/DatabasesController.php +++ b/app/Http/Controllers/Api/DatabasesController.php @@ -1750,6 +1750,101 @@ public function delete_by_uuid(Request $request) ]); } + #[OA\Delete( + summary: 'Delete backup', + description: 'Deletes a backup by its database UUID and backup ID.', + path: '/databases/{uuid}/backups/{backup_id}', + operationId: 'delete-backup-by-uuid', + security: [ + ['bearerAuth' => []], + ], + tags: ['backups'], + parameters: [ + new OA\Parameter( + name: 'uuid', + in: 'path', + required: true, + description: 'UUID of the database to delete', + schema: new OA\Schema(type: 'string') + ), + new OA\Parameter( + name: 'backup_id', + in: 'path', + required: true, + description: 'ID of the backup to delete', + schema: new OA\Schema(type: 'string') + ), + new OA\Parameter( + name: 'delete_s3', + in: 'query', + required: false, + description: 'Whether to delete the backup from S3', + schema: new OA\Schema(type: 'boolean', default: false) + ), + ], + responses: [ + new OA\Response( + response: 200, + description: 'Backup deleted.', + content: new OA\JsonContent( + type: 'object', + properties: [ + 'message' => new OA\Schema(type: 'string', example: 'Backup deleted.'), + ] + ) + ), + new OA\Response( + response: 404, + description: 'Backup not found.', + content: new OA\JsonContent( + type: 'object', + properties: [ + 'message' => new OA\Schema(type: 'string', example: 'Backup not found.'), + ] + ) + ), + ] + )] + public function delete_backup_by_uuid(Request $request) + { + $teamId = getTeamIdFromToken(); + if (is_null($teamId)) { + return invalidTokenResponse(); + } + $database = queryDatabaseByUuidWithinTeam($request->uuid, $teamId); + if (! $database) { + return response()->json(['message' => 'Database not found.'], 404); + } + $backup = ScheduledDatabaseBackup::where('database_id', $database->id)->first(); + if (! $backup) { + return response()->json(['message' => 'Backup not found.'], 404); + } + $execution = $backup->executions()->where('id', $request->backup_id)->first(); + if (! $execution) { + return response()->json(['message' => 'Execution not found.'], 404); + } + + $deleteS3 = filter_var($request->query->get('delete_s3', false), FILTER_VALIDATE_BOOLEAN); + + try { + if ($execution->filename) { + deleteBackupsLocally($execution->filename, $database->destination->server); + + if ($deleteS3 && $backup->s3) { + deleteBackupsS3($execution->filename, $backup->s3); + } + } + + $execution->delete(); + + return response()->json([ + 'message' => 'Backup deleted.', + ]); + } catch (\Exception $e) { + return response()->json(['message' => 'Failed to delete backup: '.$e->getMessage()], 500); + } + } + #[OA\Get( summary: 'Start', description: 'Start database. `Post` request is also accepted.', diff --git a/routes/api.php b/routes/api.php index 326399f30..1a1990513 100644 --- a/routes/api.php +++ b/routes/api.php @@ -114,6 +114,7 @@ Route::get('/databases/{uuid}/backups', [DatabasesController::class, 'database_backup_details_uuid'])->middleware(['api.ability:read']); Route::patch('/databases/{uuid}', [DatabasesController::class, 'update_by_uuid'])->middleware(['api.ability:write']); Route::delete('/databases/{uuid}', [DatabasesController::class, 'delete_by_uuid'])->middleware(['api.ability:write']); + Route::delete('/databases/{uuid}/backups/{backup_id}', [DatabasesController::class, 'delete_backup_by_uuid'])->middleware(['api.ability:write']); Route::match(['get', 'post'], '/databases/{uuid}/start', [DatabasesController::class, 'action_deploy'])->middleware(['api.ability:write']); Route::match(['get', 'post'], '/databases/{uuid}/restart', [DatabasesController::class, 'action_restart'])->middleware(['api.ability:write']); From 81180af27d4f5870bd7e4253c7fd3804eeac2afb Mon Sep 17 00:00:00 2001 From: DanielHemmati Date: Fri, 25 Apr 2025 15:49:14 +0200 Subject: [PATCH 0016/1232] add ability to get backup now and get all schedule backup --- .../Controllers/Api/DatabasesController.php | 26 +++++++++++++------ 1 file changed, 18 insertions(+), 8 deletions(-) diff --git a/app/Http/Controllers/Api/DatabasesController.php b/app/Http/Controllers/Api/DatabasesController.php index a25b07bf2..9d007939d 100644 --- a/app/Http/Controllers/Api/DatabasesController.php +++ b/app/Http/Controllers/Api/DatabasesController.php @@ -9,6 +9,7 @@ use App\Actions\Database\StopDatabaseProxy; use App\Enums\NewDatabaseTypes; use App\Http\Controllers\Controller; +use App\Jobs\DatabaseBackupJob; use App\Jobs\DeleteResourceJob; use App\Models\Project; use App\Models\ScheduledDatabaseBackup; @@ -80,12 +81,11 @@ public function databases(Request $request) $databases = $databases->merge($project->databases()); } - $backupConfig = ScheduledDatabaseBackup::with('latest_log')->get(); - $databases = $databases->map(function ($database) use ($backupConfig) { - $databaseBackupConfig = $backupConfig->where('database_id', $database->id)->first(); + $databases = $databases->map(function ($database) { + $backupConfig = ScheduledDatabaseBackup::with('latest_log')->where('database_id', $database->id)->get(); - if ($databaseBackupConfig) { - $database->backup_configs = $databaseBackupConfig; + if ($backupConfig) { + $database->backup_configs = $backupConfig; } else { $database->backup_configs = null; } @@ -98,7 +98,7 @@ public function databases(Request $request) #[OA\Get( summary: 'Get', - description: 'Get database by UUID.', + description: 'Get backups details by database UUID.', path: '/databases/{uuid}/backups', operationId: 'get-database-backups-by-uuid', security: [ @@ -291,6 +291,7 @@ public function database_by_uuid(Request $request) // WIP 'save_s3' => ['type' => 'boolean', 'description' => 'Weather data is saved in s3 or not'], 's3_storage_id' => ['type' => 'integer', 'description' => 'S3 storage id'], + 'backup_now' => ['type' => 'boolean', 'description' => 'Weather to take a backup now or not'], 'enabled' => ['type' => 'boolean', 'description' => 'Weather the backup is enabled or not'], 'databases_to_backup' => ['type' => 'string', 'description' => 'Comma separated list of databases to backup'], 'dump_all' => ['type' => 'boolean', 'description' => 'Weather all databases are dumped or not'], @@ -326,7 +327,7 @@ public function database_by_uuid(Request $request) )] public function update_by_uuid(Request $request) { - $allowedBackupConfigsFields = ['save_s3', 'enabled', 'dump_all', 'frequency', 'databases_to_backup', 'database_backup_retention_amount_locally', 'database_backup_retention_days_locally', 'database_backup_retention_max_storage_locally', 'database_backup_retention_amount_s3', 'database_backup_retention_days_s3', 'database_backup_retention_max_storage_s3', 's3_storage_id']; + $allowedBackupConfigsFields = ['save_s3', 'enabled', 'dump_all', 'frequency', 'databases_to_backup', 'database_backup_retention_amount_locally', 'database_backup_retention_days_locally', 'database_backup_retention_max_storage_locally', 'database_backup_retention_amount_s3', 'database_backup_retention_days_s3', 'database_backup_retention_max_storage_s3', 's3_storage_id']; $allowedFields = ['name', 'description', 'image', 'public_port', 'is_public', 'instant_deploy', 'limits_memory', 'limits_memory_swap', 'limits_memory_swappiness', 'limits_memory_reservation', 'limits_cpus', 'limits_cpuset', 'limits_cpu_shares', 'postgres_user', 'postgres_password', 'postgres_db', 'postgres_initdb_args', 'postgres_host_auth_method', 'postgres_conf', 'clickhouse_admin_user', 'clickhouse_admin_password', 'dragonfly_password', 'redis_password', 'redis_conf', 'keydb_password', 'keydb_conf', 'mariadb_conf', 'mariadb_root_password', 'mariadb_user', 'mariadb_password', 'mariadb_database', 'mongo_conf', 'mongo_initdb_root_username', 'mongo_initdb_root_password', 'mongo_initdb_database', 'mysql_root_password', 'mysql_password', 'mysql_user', 'mysql_database', 'mysql_conf']; $teamId = getTeamIdFromToken(); if (is_null($teamId)) { @@ -352,6 +353,7 @@ public function update_by_uuid(Request $request) 'limits_cpuset' => 'string|nullable', 'limits_cpu_shares' => 'numeric', 'save_s3' => 'boolean', + 'backup_now' => 'boolean|nullable', 'enabled' => 'boolean', 'dump_all' => 'boolean', 's3_storage_id' => 'integer|min:1|exists:s3_storages,id|nullable', @@ -573,7 +575,7 @@ public function update_by_uuid(Request $request) } break; } - $extraFields = array_diff(array_keys($request->all()), $allowedFields, $allowedBackupConfigsFields); + $extraFields = array_diff(array_keys($request->all()), $allowedFields, $allowedBackupConfigsFields, ['backup_now']); if ($validator->fails() || ! empty($extraFields)) { $errors = $validator->errors(); if (! empty($extraFields)) { @@ -620,10 +622,18 @@ public function update_by_uuid(Request $request) 's3_storage_id' => $backupPayload['s3_storage_id'] ?? 1, ...$backupPayload, ]); + + if ($request->backup_now) { + DatabaseBackupJob::dispatch($backupConfig); + } } if ($backupPayload && $backupConfig) { $backupConfig->update($backupPayload); + + if ($request->backup_now) { + DatabaseBackupJob::dispatch($backupConfig); + } } if ($whatToDoWithDatabaseProxy === 'start') { From 71ff19e746e59619ed2975877ea0754ada07b5cb Mon Sep 17 00:00:00 2001 From: DanielHemmati Date: Fri, 25 Apr 2025 15:53:23 +0200 Subject: [PATCH 0017/1232] get all of the backups --- app/Http/Controllers/Api/DatabasesController.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/Http/Controllers/Api/DatabasesController.php b/app/Http/Controllers/Api/DatabasesController.php index 9d007939d..9c04d1d42 100644 --- a/app/Http/Controllers/Api/DatabasesController.php +++ b/app/Http/Controllers/Api/DatabasesController.php @@ -154,7 +154,7 @@ public function database_backup_details_uuid(Request $request) return response()->json(['message' => 'Database not found.'], 404); } - $backupConfig = ScheduledDatabaseBackup::with('executions')->where('database_id', $database->id)->first(); + $backupConfig = ScheduledDatabaseBackup::with('executions')->where('database_id', $database->id)->get(); return response()->json($this->removeSensitiveData($backupConfig)); } From b4119fe012052f5d083c0d849d2f2942eca02f40 Mon Sep 17 00:00:00 2001 From: DanielHemmati Date: Fri, 25 Apr 2025 16:43:05 +0200 Subject: [PATCH 0018/1232] change the order of update --- .../Controllers/Api/DatabasesController.php | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/app/Http/Controllers/Api/DatabasesController.php b/app/Http/Controllers/Api/DatabasesController.php index 9c04d1d42..389983920 100644 --- a/app/Http/Controllers/Api/DatabasesController.php +++ b/app/Http/Controllers/Api/DatabasesController.php @@ -604,6 +604,15 @@ public function update_by_uuid(Request $request) $database->update($databasePayload); } + if ($backupPayload && $backupConfig) { + $backupConfig->update($backupPayload); + + if ($request->backup_now) { + dd('test'); + DatabaseBackupJob::dispatch($backupConfig); + } + } + if ($backupPayload && ! $backupConfig) { if ($database->type() === 'standalone-postgresql') { $backupPayload['databases_to_backup'] = $database->postgres_db; @@ -628,14 +637,6 @@ public function update_by_uuid(Request $request) } } - if ($backupPayload && $backupConfig) { - $backupConfig->update($backupPayload); - - if ($request->backup_now) { - DatabaseBackupJob::dispatch($backupConfig); - } - } - if ($whatToDoWithDatabaseProxy === 'start') { StartDatabaseProxy::dispatch($database); } elseif ($whatToDoWithDatabaseProxy === 'stop') { From 166e5ad2271479b8ea6d8d7ea1a849fed85d0aad Mon Sep 17 00:00:00 2001 From: DanielHemmati Date: Fri, 25 Apr 2025 17:20:48 +0200 Subject: [PATCH 0019/1232] remove dd --- app/Http/Controllers/Api/DatabasesController.php | 1 - 1 file changed, 1 deletion(-) diff --git a/app/Http/Controllers/Api/DatabasesController.php b/app/Http/Controllers/Api/DatabasesController.php index 389983920..4f62da8bf 100644 --- a/app/Http/Controllers/Api/DatabasesController.php +++ b/app/Http/Controllers/Api/DatabasesController.php @@ -608,7 +608,6 @@ public function update_by_uuid(Request $request) $backupConfig->update($backupPayload); if ($request->backup_now) { - dd('test'); DatabaseBackupJob::dispatch($backupConfig); } } From be104cd612cdf3e13523c0077bb4273cb95687a5 Mon Sep 17 00:00:00 2001 From: DanielHemmati Date: Thu, 22 May 2025 14:36:14 +0200 Subject: [PATCH 0020/1232] feat(api): add endpoint to update backup configuration by UUID and backup ID; modify response to include backup id --- .../Controllers/Api/DatabasesController.php | 153 +++++++++++++++++- routes/api.php | 1 + 2 files changed, 152 insertions(+), 2 deletions(-) diff --git a/app/Http/Controllers/Api/DatabasesController.php b/app/Http/Controllers/Api/DatabasesController.php index 4f62da8bf..7172e5aae 100644 --- a/app/Http/Controllers/Api/DatabasesController.php +++ b/app/Http/Controllers/Api/DatabasesController.php @@ -156,7 +156,7 @@ public function database_backup_details_uuid(Request $request) $backupConfig = ScheduledDatabaseBackup::with('executions')->where('database_id', $database->id)->get(); - return response()->json($this->removeSensitiveData($backupConfig)); + return response()->json($backupConfig); } #[OA\Get( @@ -288,7 +288,6 @@ public function database_by_uuid(Request $request) 'mysql_user' => ['type' => 'string', 'description' => 'MySQL user'], 'mysql_database' => ['type' => 'string', 'description' => 'MySQL database'], 'mysql_conf' => ['type' => 'string', 'description' => 'MySQL conf'], - // WIP 'save_s3' => ['type' => 'boolean', 'description' => 'Weather data is saved in s3 or not'], 's3_storage_id' => ['type' => 'integer', 'description' => 'S3 storage id'], 'backup_now' => ['type' => 'boolean', 'description' => 'Weather to take a backup now or not'], @@ -647,6 +646,156 @@ public function update_by_uuid(Request $request) ]); } + #[OA\Patch( + summary: 'Update', + description: 'Update a specific backup configuration for a given database, identified by its UUID and the backup ID', + path: '/databases/{uuid}/backups/{backup_id}', + operationId: 'update-database-backup-config-by-uuid-and-backup-id', + security: [ + ['bearerAuth' => []], + ], + tags: ['Databases'], + parameters: [ + new OA\Parameter( + name: 'uuid', + in: 'path', + description: 'UUID of the database.', + required: true, + schema: new OA\Schema( + type: 'string', + format: 'uuid', + ) + ), + new OA\Parameter( + name: 'backup_id', + in: 'path', + description: 'ID of the backup configuration.', + required: true, + schema: new OA\Schema( + type: 'integer', + ) + ), + ], + requestBody: new OA\RequestBody( + description: 'Database backup configuration data', + required: true, + content: new OA\MediaType( + mediaType: 'application/json', + schema: new OA\Schema( + type: 'object', + properties: [ + 'save_s3' => ['type' => 'boolean', 'description' => 'Weather data is saved in s3 or not'], + 's3_storage_id' => ['type' => 'integer', 'description' => 'S3 storage id'], + 'backup_now' => ['type' => 'boolean', 'description' => 'Weather to take a backup now or not'], + 'enabled' => ['type' => 'boolean', 'description' => 'Weather the backup is enabled or not'], + 'databases_to_backup' => ['type' => 'string', 'description' => 'Comma separated list of databases to backup'], + 'dump_all' => ['type' => 'boolean', 'description' => 'Weather all databases are dumped or not'], + 'frequency' => ['type' => 'string', 'description' => 'Frequency of the backup'], + 'database_backup_retention_amount_locally' => ['type' => 'integer', 'description' => 'Retention amount of the backup locally'], + 'database_backup_retention_days_locally' => ['type' => 'integer', 'description' => 'Retention days of the backup locally'], + 'database_backup_retention_max_storage_locally' => ['type' => 'integer', 'description' => 'Max storage of the backup locally'], + 'database_backup_retention_amount_s3' => ['type' => 'integer', 'description' => 'Retention amount of the backup in s3'], + 'database_backup_retention_days_s3' => ['type' => 'integer', 'description' => 'Retention days of the backup in s3'], + 'database_backup_retention_max_storage_s3' => ['type' => 'integer', 'description' => 'Max storage of the backup locally'], + ], + ), + ) + ), + responses: [ + new OA\Response( + response: 200, + description: 'Database backup configuration updated', + ), + new OA\Response( + response: 401, + ref: '#/components/responses/401', + ), + new OA\Response( + response: 400, + ref: '#/components/responses/400', + ), + new OA\Response( + response: 404, + ref: '#/components/responses/404', + ), + ] + )] + public function update_backup_config_by_uuid_and_backup_id(Request $request) + { + $backupConfigFields = ['save_s3', 'enabled', 'dump_all', 'frequency', 'databases_to_backup', 'database_backup_retention_amount_locally', 'database_backup_retention_days_locally', 'database_backup_retention_max_storage_locally', 'database_backup_retention_amount_s3', 'database_backup_retention_days_s3', 'database_backup_retention_max_storage_s3', 's3_storage_id']; + + $teamId = getTeamIdFromToken(); + if (is_null($teamId)) { + return invalidTokenResponse(); + } + // this check if the request is a valid json + $return = validateIncomingRequest($request); + if ($return instanceof \Illuminate\Http\JsonResponse) { + return $return; + } + $validator = customApiValidator($request->all(), [ + 'save_s3' => 'boolean', + 'backup_now' => 'boolean|nullable', + 'enabled' => 'boolean', + 'dump_all' => 'boolean', + 's3_storage_id' => 'integer|min:1|exists:s3_storages,id|nullable', + 'databases_to_backup' => 'string', + 'frequency' => 'string|in:every_minute,hourly,daily,weekly,monthly,yearly', + 'database_backup_retention_amount_locally' => 'integer|min:0', + 'database_backup_retention_days_locally' => 'integer|min:0', + 'database_backup_retention_max_storage_locally' => 'integer|min:0', + 'database_backup_retention_amount_s3' => 'integer|min:0', + 'database_backup_retention_days_s3' => 'integer|min:0', + 'database_backup_retention_max_storage_s3' => 'integer|min:0', + ]); + if ($validator->fails()) { + return response()->json([ + 'message' => 'Validation failed.', + 'errors' => $validator->errors(), + ], 422); + } + + if (! $request->uuid) { + return response()->json(['message' => 'UUID is required.'], 404); + } + $uuid = $request->uuid; + removeUnnecessaryFieldsFromRequest($request); + $database = queryDatabaseByUuidWithinTeam($uuid, $teamId); + if (! $database) { + return response()->json(['message' => 'Database not found.'], 404); + } + + $backupConfig = ScheduledDatabaseBackup::where('database_id', $database->id) + ->where('id', $request->backup_id) + ->first(); + if (! $backupConfig) { + return response()->json(['message' => 'Backup config not found.'], 404); + } + + $extraFields = array_diff(array_keys($request->all()), $backupConfigFields, ['backup_now']); + if (! empty($extraFields)) { + $errors = $validator->errors(); + foreach ($extraFields as $field) { + $errors->add($field, 'This field is not allowed.'); + } + + return response()->json([ + 'message' => 'Validation failed.', + 'errors' => $errors, + ], 422); + } + + $backupConfig->update($request->only($backupConfigFields)); + + if ($request->backup_now) { + DatabaseBackupJob::dispatch($backupConfig); + } + + return response()->json([ + 'message' => 'Database backup configuration updated', + ]); + } + #[OA\Post( summary: 'Create (PostgreSQL)', description: 'Create a new PostgreSQL database.', diff --git a/routes/api.php b/routes/api.php index 1a1990513..a5abe4b98 100644 --- a/routes/api.php +++ b/routes/api.php @@ -113,6 +113,7 @@ Route::get('/databases/{uuid}', [DatabasesController::class, 'database_by_uuid'])->middleware(['api.ability:read']); Route::get('/databases/{uuid}/backups', [DatabasesController::class, 'database_backup_details_uuid'])->middleware(['api.ability:read']); Route::patch('/databases/{uuid}', [DatabasesController::class, 'update_by_uuid'])->middleware(['api.ability:write']); + Route::patch('/databases/{uuid}/backups/{backup_id}', [DatabasesController::class, 'update_backup_config_by_uuid_and_backup_id'])->middleware(['api.ability:write']); Route::delete('/databases/{uuid}', [DatabasesController::class, 'delete_by_uuid'])->middleware(['api.ability:write']); Route::delete('/databases/{uuid}/backups/{backup_id}', [DatabasesController::class, 'delete_backup_by_uuid'])->middleware(['api.ability:write']); From 2bf6a9cb2c324715b19d87e88babfba1ebc7ca30 Mon Sep 17 00:00:00 2001 From: DanielHemmati Date: Thu, 22 May 2025 14:39:36 +0200 Subject: [PATCH 0021/1232] undo changes to update_by_uuid method --- .../Controllers/Api/DatabasesController.php | 56 +------------------ 1 file changed, 2 insertions(+), 54 deletions(-) diff --git a/app/Http/Controllers/Api/DatabasesController.php b/app/Http/Controllers/Api/DatabasesController.php index 7172e5aae..4fa42c37d 100644 --- a/app/Http/Controllers/Api/DatabasesController.php +++ b/app/Http/Controllers/Api/DatabasesController.php @@ -326,7 +326,6 @@ public function database_by_uuid(Request $request) )] public function update_by_uuid(Request $request) { - $allowedBackupConfigsFields = ['save_s3', 'enabled', 'dump_all', 'frequency', 'databases_to_backup', 'database_backup_retention_amount_locally', 'database_backup_retention_days_locally', 'database_backup_retention_max_storage_locally', 'database_backup_retention_amount_s3', 'database_backup_retention_days_s3', 'database_backup_retention_max_storage_s3', 's3_storage_id']; $allowedFields = ['name', 'description', 'image', 'public_port', 'is_public', 'instant_deploy', 'limits_memory', 'limits_memory_swap', 'limits_memory_swappiness', 'limits_memory_reservation', 'limits_cpus', 'limits_cpuset', 'limits_cpu_shares', 'postgres_user', 'postgres_password', 'postgres_db', 'postgres_initdb_args', 'postgres_host_auth_method', 'postgres_conf', 'clickhouse_admin_user', 'clickhouse_admin_password', 'dragonfly_password', 'redis_password', 'redis_conf', 'keydb_password', 'keydb_conf', 'mariadb_conf', 'mariadb_root_password', 'mariadb_user', 'mariadb_password', 'mariadb_database', 'mongo_conf', 'mongo_initdb_root_username', 'mongo_initdb_root_password', 'mongo_initdb_database', 'mysql_root_password', 'mysql_password', 'mysql_user', 'mysql_database', 'mysql_conf']; $teamId = getTeamIdFromToken(); if (is_null($teamId)) { @@ -351,19 +350,6 @@ public function update_by_uuid(Request $request) 'limits_cpus' => 'string', 'limits_cpuset' => 'string|nullable', 'limits_cpu_shares' => 'numeric', - 'save_s3' => 'boolean', - 'backup_now' => 'boolean|nullable', - 'enabled' => 'boolean', - 'dump_all' => 'boolean', - 's3_storage_id' => 'integer|min:1|exists:s3_storages,id|nullable', - 'databases_to_backup' => 'string', - 'frequency' => 'string|in:every_minute,hourly,daily,weekly,monthly,yearly', - 'database_backup_retention_amount_locally' => 'integer|min:0', - 'database_backup_retention_days_locally' => 'integer|min:0', - 'database_backup_retention_max_storage_locally' => 'integer|min:0', - 'database_backup_retention_amount_s3' => 'integer|min:0', - 'database_backup_retention_days_s3' => 'integer|min:0', - 'database_backup_retention_max_storage_s3' => 'integer|min:0', ]); if ($validator->fails()) { @@ -375,7 +361,6 @@ public function update_by_uuid(Request $request) $uuid = $request->uuid; removeUnnecessaryFieldsFromRequest($request); $database = queryDatabaseByUuidWithinTeam($uuid, $teamId); - $backupConfig = ScheduledDatabaseBackup::where('database_id', $database->id)->first(); if (! $database) { return response()->json(['message' => 'Database not found.'], 404); } @@ -574,7 +559,7 @@ public function update_by_uuid(Request $request) } break; } - $extraFields = array_diff(array_keys($request->all()), $allowedFields, $allowedBackupConfigsFields, ['backup_now']); + $extraFields = array_diff(array_keys($request->all()), $allowedFields); if ($validator->fails() || ! empty($extraFields)) { $errors = $validator->errors(); if (! empty($extraFields)) { @@ -596,44 +581,7 @@ public function update_by_uuid(Request $request) $whatToDoWithDatabaseProxy = 'start'; } - $backupPayload = $request->only($allowedBackupConfigsFields); - $databasePayload = $request->only($allowedFields); - - if ($databasePayload) { - $database->update($databasePayload); - } - - if ($backupPayload && $backupConfig) { - $backupConfig->update($backupPayload); - - if ($request->backup_now) { - DatabaseBackupJob::dispatch($backupConfig); - } - } - - if ($backupPayload && ! $backupConfig) { - if ($database->type() === 'standalone-postgresql') { - $backupPayload['databases_to_backup'] = $database->postgres_db; - } elseif ($database->type() === 'standalone-mysql') { - $backupPayload['databases_to_backup'] = $database->mysql_database; - } elseif ($database->type() === 'standalone-mariadb') { - $backupPayload['databases_to_backup'] = $database->mariadb_database; - } elseif ($database->type() === 'standalone-mongodbs') { - $backupPayload['databases_to_backup'] = $database->mongo_initdb_database; - } - - $backupConfig = ScheduledDatabaseBackup::create([ - 'database_id' => $database->id, - 'database_type' => $database->getMorphClass(), - 'team_id' => $teamId, - 's3_storage_id' => $backupPayload['s3_storage_id'] ?? 1, - ...$backupPayload, - ]); - - if ($request->backup_now) { - DatabaseBackupJob::dispatch($backupConfig); - } - } + $database->update($request->all()); if ($whatToDoWithDatabaseProxy === 'start') { StartDatabaseProxy::dispatch($database); From 2152263981905140ad5f371822eec5b37866a6a9 Mon Sep 17 00:00:00 2001 From: peaklabs-dev <122374094+peaklabs-dev@users.noreply.github.com> Date: Fri, 23 May 2025 16:55:13 +0200 Subject: [PATCH 0022/1232] refactore(service): improve Seafile - autogenerate normal DB user - fix MariaDB healthcheck - remove MariaDB auto upgrade - order compose file, rename containers & formatting --- templates/compose/seafile.yaml | 95 ++++++++++++++++------------------ 1 file changed, 44 insertions(+), 51 deletions(-) diff --git a/templates/compose/seafile.yaml b/templates/compose/seafile.yaml index 131618d5e..654769ad1 100644 --- a/templates/compose/seafile.yaml +++ b/templates/compose/seafile.yaml @@ -5,30 +5,57 @@ # port: 80 services: - seafile-db: - image: mariadb:10.11 - environment: - - MYSQL_ROOT_PASSWORD=${SERVICE_PASSWORD_64_MYSQLDBROOT} - - MYSQL_LOG_CONSOLE=true - - MARIADB_AUTO_UPGRADE=1 + seafile: + image: seafileltd/seafile-mc:12.0-latest volumes: - - seafile-mysql-db:/var/lib/mysql" + - seafile-data:/shared + environment: + - SERVICE_FQDN_SEAFILE_80 + - SEAFILE_SERVER_HOSTNAME=${SERVICE_URL_SEAFILE_80} + - DB_HOST=mariadb + - DB_PORT=3306 + - DB_ROOT_PASSWD=${SERVICE_PASSWORD_MYSQLROOT} + - DB_USER=${SERVICE_USER_MYSQL} + - DB_PASSWORD=${SERVICE_PASSWORD_MYSQL} + - SEAFILE_MYSQL_DB_CCNET_DB_NAME=${SEAFILE_MYSQL_DB_CCNET_DB_NAME:-ccnet_db} + - SEAFILE_MYSQL_DB_SEAFILE_DB_NAME=${SEAFILE_MYSQL_DB_SEAFILE_DB_NAME:-seafile_db} + - SEAFILE_MYSQL_DB_SEAHUB_DB_NAME=${SEAFILE_MYSQL_DB_SEAHUB_DB_NAME:-seahub_db} + - TIME_ZONE=${TIME_ZONE:-UTC} + - INIT_SEAFILE_ADMIN_EMAIL=${INIT_SEAFILE_ADMIN_EMAIL:-test@example.com} + - INIT_SEAFILE_ADMIN_PASSWORD=${SERVICE_PASSWORD_ADMIN} + - SEAFILE_SERVER_PROTOCOL=${SEAFILE_SERVER_PROTOCOL:-http} + - SITE_ROOT=${SITE_ROOT:-/} + - NON_ROOT=${NON_ROOT:-false} + - JWT_PRIVATE_KEY=${SERVICE_PASSWORD_64_JWT} + - SEAFILE_LOG_TO_STDOUT=${SEAFILE_LOG_TO_STDOUT:-true} + depends_on: + mariadb: + condition: service_healthy + memcached: + condition: service_started healthcheck: - test: - [ - "CMD", - "/usr/local/bin/healthcheck.sh", - "--connect", - "--mariadbupgrade", - "--innodb_initialized", - ] + test: ["CMD", "curl", "-f", "http://127.0.0.1:80/api2/ping"] interval: 20s - start_period: 30s timeout: 5s retries: 10 + mariadb: + image: mariadb:11 + volumes: + - seafile_mariadb_data:/var/lib/mysql + environment: + - MYSQL_ROOT_PASSWORD=${SERVICE_PASSWORD_MYSQLROOT} + - MYSQL_USER=${SERVICE_USER_MYSQL} + - MYSQL_PASSWORD=${SERVICE_PASSWORD_MYSQL} + - MYSQL_DATABASE=${MYSQL_DATABASE:-seafile-db} + healthcheck: + test: ["CMD", "healthcheck.sh", "--connect", "--innodb_initialized"] + interval: 5s + timeout: 20s + retries: 10 + memcached: - image: memcached:1.6.29 + image: memcached:latest entrypoint: memcached -m 256 healthcheck: test: @@ -39,37 +66,3 @@ services: interval: 20s timeout: 5s retries: 10 - - seafile: - image: seafileltd/seafile-mc:12.0-latest - volumes: - - seafile-data:/shared - environment: - - SERVICE_FQDN_SEAFILE_80 - - DB_HOST=${SEAFILE_MYSQL_DB_HOST:-seafile-db} - - DB_PORT=${SEAFILE_MYSQL_DB_PORT:-3306} - - DB_ROOT_PASSWD=${SERVICE_PASSWORD_64_MYSQLDBROOT} - - DB_USER=${SEAFILE_MYSQL_DB_USER:-seafile} - - DB_PASSWORD=${SERVICE_PASSWORD_64_MYSQLDBUSER} - - SEAFILE_MYSQL_DB_CCNET_DB_NAME=${SEAFILE_MYSQL_DB_CCNET_DB_NAME:-ccnet_db} - - SEAFILE_MYSQL_DB_SEAFILE_DB_NAME=${SEAFILE_MYSQL_DB_SEAFILE_DB_NAME:-seafile_db} - - SEAFILE_MYSQL_DB_SEAHUB_DB_NAME=${SEAFILE_MYSQL_DB_SEAHUB_DB_NAME:-seahub_db} - - TIME_ZONE=${TIME_ZONE:-Etc/UTC} - - INIT_SEAFILE_ADMIN_EMAIL=${INIT_SEAFILE_ADMIN_EMAIL:-me@example.com} - - INIT_SEAFILE_ADMIN_PASSWORD=${SERVICE_PASSWORD_ADMIN} - - SEAFILE_SERVER_HOSTNAME=${SERVICE_URL_SEAFILE_80} - - SEAFILE_SERVER_PROTOCOL=${SEAFILE_SERVER_PROTOCOL:-https} - - SITE_ROOT=${SITE_ROOT:-/} - - NON_ROOT=${NON_ROOT:-false} - - JWT_PRIVATE_KEY=${SERVICE_PASSWORD_64_JWT} - - SEAFILE_LOG_TO_STDOUT=${SEAFILE_LOG_TO_STDOUT:-true} - depends_on: - seafile-db: - condition: service_healthy - memcached: - condition: service_started - healthcheck: - test: ["CMD", "curl", "-f", "http://127.0.0.1:80/api2/ping"] - interval: 20s - timeout: 5s - retries: 10 From 16a299043e9d52392a9a83d87f16412ea93dd17c Mon Sep 17 00:00:00 2001 From: Gabriel Peralta Date: Fri, 23 May 2025 11:59:17 -0300 Subject: [PATCH 0023/1232] feat(service): add Netbird-Client service (#5873) --- public/svgs/netbird.png | Bin 0 -> 15277 bytes templates/compose/netbird-client.yaml | 26 ++++++++++++++++++++++++++ 2 files changed, 26 insertions(+) create mode 100644 public/svgs/netbird.png create mode 100644 templates/compose/netbird-client.yaml diff --git a/public/svgs/netbird.png b/public/svgs/netbird.png new file mode 100644 index 0000000000000000000000000000000000000000..1b2405c07e06ec4e2599fc6f205ba962c6697316 GIT binary patch literal 15277 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 Date: Fri, 23 May 2025 12:16:39 -0500 Subject: [PATCH 0024/1232] feat(service): add OrangeHRM and Grist services (#5212) --- public/svgs/grist.svg | 18 +++++++ public/svgs/orangehrm.svg | 1 + templates/compose/grist.yaml | 90 ++++++++++++++++++++++++++++++++ templates/compose/orangehrm.yaml | 49 +++++++++++++++++ 4 files changed, 158 insertions(+) create mode 100644 public/svgs/grist.svg create mode 100644 public/svgs/orangehrm.svg create mode 100644 templates/compose/grist.yaml create mode 100644 templates/compose/orangehrm.yaml diff --git a/public/svgs/grist.svg b/public/svgs/grist.svg new file mode 100644 index 000000000..82975b768 --- /dev/null +++ b/public/svgs/grist.svg @@ -0,0 +1,18 @@ + + + + grist-logo-icon-transparent + Created with Sketch. + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/svgs/orangehrm.svg b/public/svgs/orangehrm.svg new file mode 100644 index 000000000..b976d57ec --- /dev/null +++ b/public/svgs/orangehrm.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/templates/compose/grist.yaml b/templates/compose/grist.yaml new file mode 100644 index 000000000..272b4fb5d --- /dev/null +++ b/templates/compose/grist.yaml @@ -0,0 +1,90 @@ +# documentation: https://support.getgrist.com/ +# slogan: Grist is a modern relational spreadsheet. It combines the flexibility of a spreadsheet with the robustness of a database. * Requires an OIDC provider set up. +# tags: lowcode, nocode, spreadsheet, database, relational +# logo: svgs/grist.svg +# port: 443 + +services: + grist: + image: gristlabs/grist + environment: + - TZ=${TZ:-UTC} + - GRIST_SUPPORT_ANON=${SUPPORT_ANON:-false} + - GRIST_FORCE_LOGIN=${FORCE_LOGIN:-true} + - COOKIE_MAX_AGE=${COOKIE_MAX_AGE:-86400000} + - GRIST_PAGE_TITLE_SUFFIX=${PAGE_TITLE_SUFFIX:- - Suffix} + - GRIST_HIDE_UI_ELEMENTS=${HIDE_UI_ELEMENTS:-billing,sendToDrive,supportGrist,multiAccounts,tutorials} + - GRIST_UI_FEATURES=${UI_FEATURES:-helpCenter,billing,templates,createSite,multiSite,sendToDrive,tutorials,supportGrist} + - SERVICE_FQDN_GRIST=${SERVICE_FQDN_GRIST} + - GRIST_DOMAIN=${DOMAIN:-domain.com} + - APP_HOME_URL=${SERVICE_FQDN_GRIST} + - APP_DOC_URL=${SERVICE_FQDN_GRIST} + - GRIST_DEFAULT_EMAIL=${DEFAULT_EMAIL:-super.user@email.com} + - GRIST_ORG_IN_PATH=${ORG_IN_PATH:-true} + - GRIST_OIDC_SP_HOST=${SERVICE_FQDN_GRIST} + - GRIST_OIDC_IDP_SCOPES=${OIDC_IDP_SCOPES:-openid profile email} + - GRIST_OIDC_IDP_SKIP_END_SESSION_ENDPOINT=${OIDC_IDP_SKIP_END_SESSION_ENDPOINT:-false} + - GRIST_OIDC_IDP_ISSUER=${OIDC_IDP_ISSUER:-https://auth.domain.com/application/o/grist/} + - GRIST_OIDC_IDP_CLIENT_ID=${OIDC_IDP_CLIENT_ID:-your-client-id} + - GRIST_OIDC_IDP_CLIENT_SECRET=${OIDC_IDP_CLIENT_SECRET:-your-client-secret} + - GRIST_SESSION_SECRET=${SESSION_SECRET:-$SERVICE_REALBASE64_128} + - GRIST_HOME_INCLUDE_STATIC=${HOME_INCLUDE_STATIC:-true} + - GRIST_SANDBOX_FLAVOR=${SANDBOX_FLAVOR:-gvisor} + - ALLOWED_WEBHOOK_DOMAINS=${ALLOWED_WEBHOOK_DOMAINS:-n8n.domain.com} + - COMMENTS=${COMMENTS:-true} + - TYPEORM_TYPE=${TYPEORM_TYPE:-postgres} + - TYPEORM_DATABASE=${POSTGRES_DATABASE:-postgres} + - TYPEORM_USERNAME=${POSTGRES_USERNAME:-postgres} + - TYPEORM_PASSWORD=${POSTGRES_PASSWORD:-$SERVICE_PASSWORD_POSTGRES} + - TYPEORM_HOST=${TYPEORM_HOST:-postgres} + - TYPEORM_PORT=${TYPEORM_PORT:-5432} + - TYPEORM_LOGGING=${TYPEORM_LOGGING:-false} + - REDIS_URL=${REDIS_URL:-redis://redis:6379} + - GRIST_HELP_CENTER=${HELP_CENTER:-$SERVICE_FQDN_GRIST/help} + - GRIST_TERMS_OF_SERVICE_URL=${TERMS_OF_SERVICE_URL:-$SERVICE_FQDN_GRIST/terms} + - FREE_COACHING_CALL_URL=${FREE_COACHING_CALL_URL:-super.user@email.com} + - GRIST_CONTACT_SUPPORT_URL=${CONTACT_SUPPORT_URL:-super.user@email.com} + volumes: + - 'grist-data:/persist' + depends_on: + postgres: + condition: service_healthy + redis: + condition: service_healthy + healthcheck: + test: + - CMD + - node + - '-e' + - "require('http').get('http://localhost:8484/status', res => process.exit(res.statusCode === 200 ? 0 : 1))" + - '> /dev/null 2>&1' + interval: 5s + timeout: 20s + retries: 10 + postgres: + image: 'postgres:16' + environment: + - POSTGRES_DB=${POSTGRES_DATABASE:-postgres} + - POSTGRES_USER=${POSTGRES_USERNAME:-postgres} + - POSTGRES_PASSWORD=${POSTGRES_PASSWORD:-$SERVICE_PASSWORD_POSTGRES} + volumes: + - 'postgres-data:/var/lib/postgresql/data' + healthcheck: + test: + - CMD-SHELL + - 'pg_isready -U $${POSTGRES_USER} -d $${POSTGRES_DB}' + interval: 5s + timeout: 10s + retries: 20 + redis: + image: 'redis:7' + volumes: + - 'redis-data:/data' + healthcheck: + test: + - CMD + - redis-cli + - PING + interval: 5s + timeout: 10s + retries: 20 diff --git a/templates/compose/orangehrm.yaml b/templates/compose/orangehrm.yaml new file mode 100644 index 000000000..f93f229d1 --- /dev/null +++ b/templates/compose/orangehrm.yaml @@ -0,0 +1,49 @@ +# documentation: https://starterhelp.orangehrm.com/hc/en-us +# slogan: Host OrangeHRM on your own infrastructure. This deployment option provides the greatest level of flexibility and control. +# tags: HR, HRIS, HRMS, human resource management, OrangeHRM, HR management +# logo: svgs/orangehrm.svg +# port: 80 + +services: + orangehrm: + image: 'orangehrm/orangehrm:latest' + platform: linux/amd64 + environment: + - SERVICE_FQDN_ORANGEHRM_80 + - ORANGEHRM_DATABASE_HOST=mariadb + - ORANGEHRM_DATABASE_USER=${SERVICE_USER_ORANGEHRM} + - ORANGEHRM_DATABASE_PASSWORD=${SERVICE_PASSWORD_ORANGEHRM} + - ORANGEHRM_DATABASE_NAME=${MARIADB_DATABASE:-orangehrm} + volumes: + - 'orangehrm-data:/orangehrm' + depends_on: + - mariadb + links: + - 'mariadb:mariadb' + healthcheck: + test: + - CMD + - curl + - '-f' + - 'http://127.0.0.1' + interval: 2s + timeout: 10s + retries: 10 + mariadb: + image: 'mariadb:10.11' + volumes: + - 'mariadb-data:/var/lib/mysql' + environment: + - MARIADB_ROOT_PASSWORD=${SERVICE_PASSWORD_ROOT} + - MARIADB_DATABASE=${MARIADB_DATABASE:-orangehrm} + - MARIADB_USER=${SERVICE_USER_ORANGEHRM} + - MARIADB_PASSWORD=${SERVICE_PASSWORD_ORANGEHRM} + healthcheck: + test: + - CMD + - healthcheck.sh + - '--connect' + - '--innodb_initialized' + interval: 5s + timeout: 20s + retries: 10 From fa63013aafc104daedfee4a838e24dcf3808cfb0 Mon Sep 17 00:00:00 2001 From: peaklabs-dev <122374094+peaklabs-dev@users.noreply.github.com> Date: Fri, 23 May 2025 19:27:13 +0200 Subject: [PATCH 0025/1232] refactor(service): improve orangehrm - fix ENVs for MariaDB - formatting and naming changes --- templates/compose/orangehrm.yaml | 38 ++++++++++++++++---------------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/templates/compose/orangehrm.yaml b/templates/compose/orangehrm.yaml index f93f229d1..6e47c4e15 100644 --- a/templates/compose/orangehrm.yaml +++ b/templates/compose/orangehrm.yaml @@ -1,49 +1,49 @@ # documentation: https://starterhelp.orangehrm.com/hc/en-us -# slogan: Host OrangeHRM on your own infrastructure. This deployment option provides the greatest level of flexibility and control. +# slogan: OrangeHRM open source HR management software. # tags: HR, HRIS, HRMS, human resource management, OrangeHRM, HR management # logo: svgs/orangehrm.svg # port: 80 services: orangehrm: - image: 'orangehrm/orangehrm:latest' + image: orangehrm/orangehrm:latest platform: linux/amd64 environment: - SERVICE_FQDN_ORANGEHRM_80 - ORANGEHRM_DATABASE_HOST=mariadb - - ORANGEHRM_DATABASE_USER=${SERVICE_USER_ORANGEHRM} - - ORANGEHRM_DATABASE_PASSWORD=${SERVICE_PASSWORD_ORANGEHRM} - - ORANGEHRM_DATABASE_NAME=${MARIADB_DATABASE:-orangehrm} + - ORANGEHRM_DATABASE_USER=${SERVICE_USER_MYSQL} + - ORANGEHRM_DATABASE_PASSWORD=${SERVICE_PASSWORD_MYSQL} + - ORANGEHRM_DATABASE_NAME=${MYSQL_DATABASE:-orangehrm-db} volumes: - - 'orangehrm-data:/orangehrm' + - orangehrm-data:/orangehrm depends_on: - - mariadb - links: - - 'mariadb:mariadb' + mariadb: + condition: service_healthy healthcheck: test: - CMD - curl - - '-f' - - 'http://127.0.0.1' + - "-f" + - "http://127.0.0.1" interval: 2s timeout: 10s retries: 10 + mariadb: - image: 'mariadb:10.11' + image: mariadb:11 volumes: - - 'mariadb-data:/var/lib/mysql' + - orangehrm_mariadb_data:/var/lib/mysql environment: - - MARIADB_ROOT_PASSWORD=${SERVICE_PASSWORD_ROOT} - - MARIADB_DATABASE=${MARIADB_DATABASE:-orangehrm} - - MARIADB_USER=${SERVICE_USER_ORANGEHRM} - - MARIADB_PASSWORD=${SERVICE_PASSWORD_ORANGEHRM} + - MYSQL_ROOT_PASSWORD=${SERVICE_PASSWORD_MYSQLROOT} + - MYSQL_DATABASE=${MYSQL_DATABASE:-orangehrm-db} + - MYSQL_USER=${SERVICE_USER_MYSQL} + - MYSQL_PASSWORD=${SERVICE_PASSWORD_MYSQL} healthcheck: test: - CMD - healthcheck.sh - - '--connect' - - '--innodb_initialized' + - "--connect" + - "--innodb_initialized" interval: 5s timeout: 20s retries: 10 From dc52bd3dc6cf6f7f0b32347ccb05f90566b0d844 Mon Sep 17 00:00:00 2001 From: peaklabs-dev <122374094+peaklabs-dev@users.noreply.github.com> Date: Fri, 23 May 2025 19:29:04 +0200 Subject: [PATCH 0026/1232] refactor(service): improve grist - make OIDC ENVs required - autogenerate Postgres user - formating and naming --- templates/compose/grist.yaml | 64 +++++++++++++++++++----------------- 1 file changed, 33 insertions(+), 31 deletions(-) diff --git a/templates/compose/grist.yaml b/templates/compose/grist.yaml index 272b4fb5d..ab7cc26e0 100644 --- a/templates/compose/grist.yaml +++ b/templates/compose/grist.yaml @@ -1,13 +1,17 @@ # documentation: https://support.getgrist.com/ -# slogan: Grist is a modern relational spreadsheet. It combines the flexibility of a spreadsheet with the robustness of a database. * Requires an OIDC provider set up. +# slogan: Grist is a modern relational spreadsheet. It combines the flexibility of a spreadsheet with the robustness of a database. # tags: lowcode, nocode, spreadsheet, database, relational # logo: svgs/grist.svg # port: 443 services: grist: - image: gristlabs/grist + image: gristlabs/grist:latest environment: + - SERVICE_FQDN_GRIST_443 + - APP_HOME_URL=${SERVICE_FQDN_GRIST} + - APP_DOC_URL=${SERVICE_FQDN_GRIST} + - GRIST_DOMAIN=${SERVICE_URL_GRIST} - TZ=${TZ:-UTC} - GRIST_SUPPORT_ANON=${SUPPORT_ANON:-false} - GRIST_FORCE_LOGIN=${FORCE_LOGIN:-true} @@ -15,37 +19,33 @@ services: - GRIST_PAGE_TITLE_SUFFIX=${PAGE_TITLE_SUFFIX:- - Suffix} - GRIST_HIDE_UI_ELEMENTS=${HIDE_UI_ELEMENTS:-billing,sendToDrive,supportGrist,multiAccounts,tutorials} - GRIST_UI_FEATURES=${UI_FEATURES:-helpCenter,billing,templates,createSite,multiSite,sendToDrive,tutorials,supportGrist} - - SERVICE_FQDN_GRIST=${SERVICE_FQDN_GRIST} - - GRIST_DOMAIN=${DOMAIN:-domain.com} - - APP_HOME_URL=${SERVICE_FQDN_GRIST} - - APP_DOC_URL=${SERVICE_FQDN_GRIST} - - GRIST_DEFAULT_EMAIL=${DEFAULT_EMAIL:-super.user@email.com} + - GRIST_DEFAULT_EMAIL=${DEFAULT_EMAIL:-test@example.com} - GRIST_ORG_IN_PATH=${ORG_IN_PATH:-true} - GRIST_OIDC_SP_HOST=${SERVICE_FQDN_GRIST} - GRIST_OIDC_IDP_SCOPES=${OIDC_IDP_SCOPES:-openid profile email} - GRIST_OIDC_IDP_SKIP_END_SESSION_ENDPOINT=${OIDC_IDP_SKIP_END_SESSION_ENDPOINT:-false} - - GRIST_OIDC_IDP_ISSUER=${OIDC_IDP_ISSUER:-https://auth.domain.com/application/o/grist/} - - GRIST_OIDC_IDP_CLIENT_ID=${OIDC_IDP_CLIENT_ID:-your-client-id} - - GRIST_OIDC_IDP_CLIENT_SECRET=${OIDC_IDP_CLIENT_SECRET:-your-client-secret} - - GRIST_SESSION_SECRET=${SESSION_SECRET:-$SERVICE_REALBASE64_128} + - GRIST_OIDC_IDP_ISSUER=${OIDC_IDP_ISSUER:?} + - GRIST_OIDC_IDP_CLIENT_ID=${OIDC_IDP_CLIENT_ID:?} + - GRIST_OIDC_IDP_CLIENT_SECRET=${OIDC_IDP_CLIENT_SECRET:?} + - GRIST_SESSION_SECRET=${SERVICE_REALBASE64_128} - GRIST_HOME_INCLUDE_STATIC=${HOME_INCLUDE_STATIC:-true} - GRIST_SANDBOX_FLAVOR=${SANDBOX_FLAVOR:-gvisor} - - ALLOWED_WEBHOOK_DOMAINS=${ALLOWED_WEBHOOK_DOMAINS:-n8n.domain.com} + - ALLOWED_WEBHOOK_DOMAINS=${ALLOWED_WEBHOOK_DOMAINS} - COMMENTS=${COMMENTS:-true} - TYPEORM_TYPE=${TYPEORM_TYPE:-postgres} - - TYPEORM_DATABASE=${POSTGRES_DATABASE:-postgres} - - TYPEORM_USERNAME=${POSTGRES_USERNAME:-postgres} - - TYPEORM_PASSWORD=${POSTGRES_PASSWORD:-$SERVICE_PASSWORD_POSTGRES} - - TYPEORM_HOST=${TYPEORM_HOST:-postgres} + - TYPEORM_DATABASE=${POSTGRES_DATABASE:-grist-db} + - TYPEORM_USERNAME=${SERVICE_USER_POSTGRES} + - TYPEORM_PASSWORD=${SERVICE_PASSWORD_POSTGRES} + - TYPEORM_HOST=${TYPEORM_HOST} - TYPEORM_PORT=${TYPEORM_PORT:-5432} - TYPEORM_LOGGING=${TYPEORM_LOGGING:-false} - REDIS_URL=${REDIS_URL:-redis://redis:6379} - - GRIST_HELP_CENTER=${HELP_CENTER:-$SERVICE_FQDN_GRIST/help} - - GRIST_TERMS_OF_SERVICE_URL=${TERMS_OF_SERVICE_URL:-$SERVICE_FQDN_GRIST/terms} - - FREE_COACHING_CALL_URL=${FREE_COACHING_CALL_URL:-super.user@email.com} - - GRIST_CONTACT_SUPPORT_URL=${CONTACT_SUPPORT_URL:-super.user@email.com} + - GRIST_HELP_CENTER=${SERVICE_FQDN_GRIST}/help + - GRIST_TERMS_OF_SERVICE_URL=${SERVICE_FQDN_GRIST}/terms + - FREE_COACHING_CALL_URL=${FREE_COACHING_CALL_URL} + - GRIST_CONTACT_SUPPORT_URL=${CONTACT_SUPPORT_URL} volumes: - - 'grist-data:/persist' + - grist-data:/persist depends_on: postgres: condition: service_healthy @@ -55,31 +55,33 @@ services: test: - CMD - node - - '-e' + - "-e" - "require('http').get('http://localhost:8484/status', res => process.exit(res.statusCode === 200 ? 0 : 1))" - - '> /dev/null 2>&1' + - "> /dev/null 2>&1" interval: 5s timeout: 20s retries: 10 + postgres: - image: 'postgres:16' + image: postgres:16 environment: - - POSTGRES_DB=${POSTGRES_DATABASE:-postgres} - - POSTGRES_USER=${POSTGRES_USERNAME:-postgres} - - POSTGRES_PASSWORD=${POSTGRES_PASSWORD:-$SERVICE_PASSWORD_POSTGRES} + - POSTGRES_DB=${POSTGRES_DATABASE:-grist-db} + - POSTGRES_USER=${SERVICE_USER_POSTGRES} + - POSTGRES_PASSWORD=${SERVICE_PASSWORD_POSTGRES} volumes: - - 'postgres-data:/var/lib/postgresql/data' + - grist_postgres_data:/var/lib/postgresql/data healthcheck: test: - CMD-SHELL - - 'pg_isready -U $${POSTGRES_USER} -d $${POSTGRES_DB}' + - "pg_isready -U $${POSTGRES_USER} -d $${POSTGRES_DB}" interval: 5s timeout: 10s retries: 20 + redis: - image: 'redis:7' + image: redis:7 volumes: - - 'redis-data:/data' + - grist_redis_data:/data healthcheck: test: - CMD From a44b73f8eb2eee38a085f2a44dbebcbd06fd8516 Mon Sep 17 00:00:00 2001 From: peaklabs-dev <122374094+peaklabs-dev@users.noreply.github.com> Date: Fri, 23 May 2025 20:15:43 +0200 Subject: [PATCH 0027/1232] Update service-templates.json --- templates/service-templates.json | 94 +++++++++++++++++++++++++++++++- 1 file changed, 91 insertions(+), 3 deletions(-) diff --git a/templates/service-templates.json b/templates/service-templates.json index 73faee6e7..fa3eb3bc7 100644 --- a/templates/service-templates.json +++ b/templates/service-templates.json @@ -1347,6 +1347,21 @@ "minversion": "0.0.0", "port": "3000" }, + "grist": { + "documentation": "https://support.getgrist.com/?utm_source=coolify.io", + "slogan": "Grist is a modern relational spreadsheet. It combines the flexibility of a spreadsheet with the robustness of a database.", + "compose": "c2VydmljZXM6CiAgZ3Jpc3Q6CiAgICBpbWFnZTogJ2dyaXN0bGFicy9ncmlzdDpsYXRlc3QnCiAgICBlbnZpcm9ubWVudDoKICAgICAgLSBTRVJWSUNFX0ZRRE5fR1JJU1RfNDQzCiAgICAgIC0gJ0FQUF9IT01FX1VSTD0ke1NFUlZJQ0VfRlFETl9HUklTVH0nCiAgICAgIC0gJ0FQUF9ET0NfVVJMPSR7U0VSVklDRV9GUUROX0dSSVNUfScKICAgICAgLSAnR1JJU1RfRE9NQUlOPSR7U0VSVklDRV9VUkxfR1JJU1R9JwogICAgICAtICdUWj0ke1RaOi1VVEN9JwogICAgICAtICdHUklTVF9TVVBQT1JUX0FOT049JHtTVVBQT1JUX0FOT046LWZhbHNlfScKICAgICAgLSAnR1JJU1RfRk9SQ0VfTE9HSU49JHtGT1JDRV9MT0dJTjotdHJ1ZX0nCiAgICAgIC0gJ0NPT0tJRV9NQVhfQUdFPSR7Q09PS0lFX01BWF9BR0U6LTg2NDAwMDAwfScKICAgICAgLSAnR1JJU1RfUEFHRV9USVRMRV9TVUZGSVg9JHtQQUdFX1RJVExFX1NVRkZJWDotIC0gU3VmZml4fScKICAgICAgLSAnR1JJU1RfSElERV9VSV9FTEVNRU5UUz0ke0hJREVfVUlfRUxFTUVOVFM6LWJpbGxpbmcsc2VuZFRvRHJpdmUsc3VwcG9ydEdyaXN0LG11bHRpQWNjb3VudHMsdHV0b3JpYWxzfScKICAgICAgLSAnR1JJU1RfVUlfRkVBVFVSRVM9JHtVSV9GRUFUVVJFUzotaGVscENlbnRlcixiaWxsaW5nLHRlbXBsYXRlcyxjcmVhdGVTaXRlLG11bHRpU2l0ZSxzZW5kVG9Ecml2ZSx0dXRvcmlhbHMsc3VwcG9ydEdyaXN0fScKICAgICAgLSAnR1JJU1RfREVGQVVMVF9FTUFJTD0ke0RFRkFVTFRfRU1BSUw6LXRlc3RAZXhhbXBsZS5jb219JwogICAgICAtICdHUklTVF9PUkdfSU5fUEFUSD0ke09SR19JTl9QQVRIOi10cnVlfScKICAgICAgLSAnR1JJU1RfT0lEQ19TUF9IT1NUPSR7U0VSVklDRV9GUUROX0dSSVNUfScKICAgICAgLSAnR1JJU1RfT0lEQ19JRFBfU0NPUEVTPSR7T0lEQ19JRFBfU0NPUEVTOi1vcGVuaWQgcHJvZmlsZSBlbWFpbH0nCiAgICAgIC0gJ0dSSVNUX09JRENfSURQX1NLSVBfRU5EX1NFU1NJT05fRU5EUE9JTlQ9JHtPSURDX0lEUF9TS0lQX0VORF9TRVNTSU9OX0VORFBPSU5UOi1mYWxzZX0nCiAgICAgIC0gJ0dSSVNUX09JRENfSURQX0lTU1VFUj0ke09JRENfSURQX0lTU1VFUjo/fScKICAgICAgLSAnR1JJU1RfT0lEQ19JRFBfQ0xJRU5UX0lEPSR7T0lEQ19JRFBfQ0xJRU5UX0lEOj99JwogICAgICAtICdHUklTVF9PSURDX0lEUF9DTElFTlRfU0VDUkVUPSR7T0lEQ19JRFBfQ0xJRU5UX1NFQ1JFVDo/fScKICAgICAgLSAnR1JJU1RfU0VTU0lPTl9TRUNSRVQ9JHtTRVJWSUNFX1JFQUxCQVNFNjRfMTI4fScKICAgICAgLSAnR1JJU1RfSE9NRV9JTkNMVURFX1NUQVRJQz0ke0hPTUVfSU5DTFVERV9TVEFUSUM6LXRydWV9JwogICAgICAtICdHUklTVF9TQU5EQk9YX0ZMQVZPUj0ke1NBTkRCT1hfRkxBVk9SOi1ndmlzb3J9JwogICAgICAtICdBTExPV0VEX1dFQkhPT0tfRE9NQUlOUz0ke0FMTE9XRURfV0VCSE9PS19ET01BSU5TfScKICAgICAgLSAnQ09NTUVOVFM9JHtDT01NRU5UUzotdHJ1ZX0nCiAgICAgIC0gJ1RZUEVPUk1fVFlQRT0ke1RZUEVPUk1fVFlQRTotcG9zdGdyZXN9JwogICAgICAtICdUWVBFT1JNX0RBVEFCQVNFPSR7UE9TVEdSRVNfREFUQUJBU0U6LWdyaXN0LWRifScKICAgICAgLSAnVFlQRU9STV9VU0VSTkFNRT0ke1NFUlZJQ0VfVVNFUl9QT1NUR1JFU30nCiAgICAgIC0gJ1RZUEVPUk1fUEFTU1dPUkQ9JHtTRVJWSUNFX1BBU1NXT1JEX1BPU1RHUkVTfScKICAgICAgLSAnVFlQRU9STV9IT1NUPSR7VFlQRU9STV9IT1NUfScKICAgICAgLSAnVFlQRU9STV9QT1JUPSR7VFlQRU9STV9QT1JUOi01NDMyfScKICAgICAgLSAnVFlQRU9STV9MT0dHSU5HPSR7VFlQRU9STV9MT0dHSU5HOi1mYWxzZX0nCiAgICAgIC0gJ1JFRElTX1VSTD0ke1JFRElTX1VSTDotcmVkaXM6Ly9yZWRpczo2Mzc5fScKICAgICAgLSAnR1JJU1RfSEVMUF9DRU5URVI9JHtTRVJWSUNFX0ZRRE5fR1JJU1R9L2hlbHAnCiAgICAgIC0gJ0dSSVNUX1RFUk1TX09GX1NFUlZJQ0VfVVJMPSR7U0VSVklDRV9GUUROX0dSSVNUfS90ZXJtcycKICAgICAgLSAnRlJFRV9DT0FDSElOR19DQUxMX1VSTD0ke0ZSRUVfQ09BQ0hJTkdfQ0FMTF9VUkx9JwogICAgICAtICdHUklTVF9DT05UQUNUX1NVUFBPUlRfVVJMPSR7Q09OVEFDVF9TVVBQT1JUX1VSTH0nCiAgICB2b2x1bWVzOgogICAgICAtICdncmlzdC1kYXRhOi9wZXJzaXN0JwogICAgZGVwZW5kc19vbjoKICAgICAgcG9zdGdyZXM6CiAgICAgICAgY29uZGl0aW9uOiBzZXJ2aWNlX2hlYWx0aHkKICAgICAgcmVkaXM6CiAgICAgICAgY29uZGl0aW9uOiBzZXJ2aWNlX2hlYWx0aHkKICAgIGhlYWx0aGNoZWNrOgogICAgICB0ZXN0OgogICAgICAgIC0gQ01ECiAgICAgICAgLSBub2RlCiAgICAgICAgLSAnLWUnCiAgICAgICAgLSAicmVxdWlyZSgnaHR0cCcpLmdldCgnaHR0cDovL2xvY2FsaG9zdDo4NDg0L3N0YXR1cycsIHJlcyA9PiBwcm9jZXNzLmV4aXQocmVzLnN0YXR1c0NvZGUgPT09IDIwMCA/IDAgOiAxKSkiCiAgICAgICAgLSAnPiAvZGV2L251bGwgMj4mMScKICAgICAgaW50ZXJ2YWw6IDVzCiAgICAgIHRpbWVvdXQ6IDIwcwogICAgICByZXRyaWVzOiAxMAogIHBvc3RncmVzOgogICAgaW1hZ2U6ICdwb3N0Z3JlczoxNicKICAgIGVudmlyb25tZW50OgogICAgICAtICdQT1NUR1JFU19EQj0ke1BPU1RHUkVTX0RBVEFCQVNFOi1ncmlzdC1kYn0nCiAgICAgIC0gJ1BPU1RHUkVTX1VTRVI9JHtTRVJWSUNFX1VTRVJfUE9TVEdSRVN9JwogICAgICAtICdQT1NUR1JFU19QQVNTV09SRD0ke1NFUlZJQ0VfUEFTU1dPUkRfUE9TVEdSRVN9JwogICAgdm9sdW1lczoKICAgICAgLSAnZ3Jpc3RfcG9zdGdyZXNfZGF0YTovdmFyL2xpYi9wb3N0Z3Jlc3FsL2RhdGEnCiAgICBoZWFsdGhjaGVjazoKICAgICAgdGVzdDoKICAgICAgICAtIENNRC1TSEVMTAogICAgICAgIC0gJ3BnX2lzcmVhZHkgLVUgJCR7UE9TVEdSRVNfVVNFUn0gLWQgJCR7UE9TVEdSRVNfREJ9JwogICAgICBpbnRlcnZhbDogNXMKICAgICAgdGltZW91dDogMTBzCiAgICAgIHJldHJpZXM6IDIwCiAgcmVkaXM6CiAgICBpbWFnZTogJ3JlZGlzOjcnCiAgICB2b2x1bWVzOgogICAgICAtICdncmlzdF9yZWRpc19kYXRhOi9kYXRhJwogICAgaGVhbHRoY2hlY2s6CiAgICAgIHRlc3Q6CiAgICAgICAgLSBDTUQKICAgICAgICAtIHJlZGlzLWNsaQogICAgICAgIC0gUElORwogICAgICBpbnRlcnZhbDogNXMKICAgICAgdGltZW91dDogMTBzCiAgICAgIHJldHJpZXM6IDIwCg==", + "tags": [ + "lowcode", + "nocode", + "spreadsheet", + "database", + "relational" + ], + "logo": "svgs/grist.svg", + "minversion": "0.0.0", + "port": "443" + }, "grocy": { "documentation": "https://github.com/grocy/grocy?utm_source=coolify.io", "slogan": "Grocy is a web-based household management and grocery list application.", @@ -1923,8 +1938,8 @@ }, "maybe": { "documentation": "https://github.com/maybe-finance/maybe?utm_source=coolify.io", - "slogan": "Maybe: The OS for your personal finances.", - "compose": "c2VydmljZXM6CiAgbWF5YmU6CiAgICBpbWFnZTogJ2doY3IuaW8vbWF5YmUtZmluYW5jZS9tYXliZTpsYXRlc3QnCiAgICB2b2x1bWVzOgogICAgICAtICdhcHBfc3RvcmFnZTovcmFpbHMvc3RvcmFnZScKICAgIGVudmlyb25tZW50OgogICAgICAtIFNFUlZJQ0VfRlFETl9NQVlCRQogICAgICAtIFNFTEZfSE9TVEVEPXRydWUKICAgICAgLSAnUkFJTFNfRk9SQ0VfU1NMPSR7UkFJTFNfRk9SQ0VfU1NMOi1mYWxzZX0nCiAgICAgIC0gJ1JBSUxTX0FTU1VNRV9TU0w9JHtSQUlMU19BU1NVTUVfU1NMOi1mYWxzZX0nCiAgICAgIC0gJ0dPT0RfSk9CX0VYRUNVVElPTl9NT0RFPSR7R09PRF9KT0JfRVhFQ1VUSU9OX01PREU6LWFzeW5jfScKICAgICAgLSAnU0VDUkVUX0tFWV9CQVNFPSR7U0VSVklDRV9CQVNFNjRfNjRfU0VDUkVUS0VZQkFTRX0nCiAgICAgIC0gREJfSE9TVD1wb3N0Z3JlcwogICAgICAtICdQT1NUR1JFU19EQj0ke1BPU1RHUkVTX0RCOi1tYXliZV9kYn0nCiAgICAgIC0gJ1BPU1RHUkVTX1VTRVI9JHtTRVJWSUNFX1VTRVJfUE9TVEdSRVN9JwogICAgICAtICdQT1NUR1JFU19QQVNTV09SRD0ke1NFUlZJQ0VfUEFTU1dPUkRfUE9TVEdSRVN9JwogICAgZGVwZW5kc19vbjoKICAgICAgcG9zdGdyZXM6CiAgICAgICAgY29uZGl0aW9uOiBzZXJ2aWNlX2hlYWx0aHkKICAgIGhlYWx0aGNoZWNrOgogICAgICB0ZXN0OgogICAgICAgIC0gQ01ECiAgICAgICAgLSBjdXJsCiAgICAgICAgLSAnLWYnCiAgICAgICAgLSAnaHR0cDovL2xvY2FsaG9zdDozMDAwJwogIHBvc3RncmVzOgogICAgaW1hZ2U6ICdwb3N0Z3JlczoxNicKICAgIHZvbHVtZXM6CiAgICAgIC0gJ21heWJlX3Bvc3RncmVzX2RhdGE6L3Zhci9saWIvcG9zdGdyZXNxbC9kYXRhJwogICAgZW52aXJvbm1lbnQ6CiAgICAgIC0gJ1BPU1RHUkVTX1VTRVI9JHtTRVJWSUNFX1VTRVJfUE9TVEdSRVN9JwogICAgICAtICdQT1NUR1JFU19EQj0ke1BPU1RHUkVTX0RCOi1tYXliZV9kYn0nCiAgICAgIC0gJ1BPU1RHUkVTX1BBU1NXT1JEPSR7U0VSVklDRV9QQVNTV09SRF9QT1NUR1JFU30nCiAgICBoZWFsdGhjaGVjazoKICAgICAgdGVzdDoKICAgICAgICAtIENNRC1TSEVMTAogICAgICAgIC0gJ3BnX2lzcmVhZHkgLVUgJCR7UE9TVEdSRVNfVVNFUn0gLWQgJCR7UE9TVEdSRVNfREJ9JwogICAgICBpbnRlcnZhbDogNXMKICAgICAgdGltZW91dDogMjBzCiAgICAgIHJldHJpZXM6IDEwCg==", + "slogan": "Maybe, the OS for your personal finances.", + "compose": "c2VydmljZXM6CiAgbWF5YmU6CiAgICBpbWFnZTogJ2doY3IuaW8vbWF5YmUtZmluYW5jZS9tYXliZTpsYXRlc3QnCiAgICB2b2x1bWVzOgogICAgICAtICdhcHBfc3RvcmFnZTovcmFpbHMvc3RvcmFnZScKICAgIGVudmlyb25tZW50OgogICAgICAtIFNFUlZJQ0VfRlFETl9NQVlCRQogICAgICAtIFNFTEZfSE9TVEVEPXRydWUKICAgICAgLSAnUkFJTFNfRk9SQ0VfU1NMPSR7UkFJTFNfRk9SQ0VfU1NMOi1mYWxzZX0nCiAgICAgIC0gJ1JBSUxTX0FTU1VNRV9TU0w9JHtSQUlMU19BU1NVTUVfU1NMOi1mYWxzZX0nCiAgICAgIC0gJ0dPT0RfSk9CX0VYRUNVVElPTl9NT0RFPSR7R09PRF9KT0JfRVhFQ1VUSU9OX01PREU6LWFzeW5jfScKICAgICAgLSAnU0VDUkVUX0tFWV9CQVNFPSR7U0VSVklDRV9CQVNFNjRfNjRfU0VDUkVUS0VZQkFTRX0nCiAgICAgIC0gREJfSE9TVD1wb3N0Z3JlcwogICAgICAtICdQT1NUR1JFU19EQj0ke1BPU1RHUkVTX0RCOi1tYXliZS1kYn0nCiAgICAgIC0gJ1BPU1RHUkVTX1VTRVI9JHtTRVJWSUNFX1VTRVJfUE9TVEdSRVN9JwogICAgICAtICdQT1NUR1JFU19QQVNTV09SRD0ke1NFUlZJQ0VfUEFTU1dPUkRfUE9TVEdSRVN9JwogICAgICAtIERCX1BPUlQ9NTQzMgogICAgICAtICdSRURJU19VUkw9cmVkaXM6Ly9kZWZhdWx0OiR7U0VSVklDRV9QQVNTV09SRF9SRURJU31AcmVkaXM6NjM3OS8xJwogICAgICAtICdPUEVOQUlfQUNDRVNTX1RPS0VOPSR7T1BFTkFJX0FDQ0VTU19UT0tFTn0nCiAgICBkZXBlbmRzX29uOgogICAgICBwb3N0Z3JlczoKICAgICAgICBjb25kaXRpb246IHNlcnZpY2VfaGVhbHRoeQogICAgICByZWRpczoKICAgICAgICBjb25kaXRpb246IHNlcnZpY2VfaGVhbHRoeQogICAgaGVhbHRoY2hlY2s6CiAgICAgIHRlc3Q6CiAgICAgICAgLSBDTUQKICAgICAgICAtIGN1cmwKICAgICAgICAtICctZicKICAgICAgICAtICdodHRwOi8vbG9jYWxob3N0OjMwMDAnCiAgICAgIGludGVydmFsOiAxMHMKICAgICAgdGltZW91dDogMTBzCiAgICAgIHJldHJpZXM6IDUKICB3b3JrZXI6CiAgICBpbWFnZTogJ2doY3IuaW8vbWF5YmUtZmluYW5jZS9tYXliZTpsYXRlc3QnCiAgICBjb21tYW5kOiAnYnVuZGxlIGV4ZWMgc2lkZWtpcScKICAgIGVudmlyb25tZW50OgogICAgICAtICdQT1NUR1JFU19VU0VSPSR7U0VSVklDRV9VU0VSX1BPU1RHUkVTfScKICAgICAgLSAnUE9TVEdSRVNfUEFTU1dPUkQ9JHtTRVJWSUNFX1BBU1NXT1JEX1BPU1RHUkVTfScKICAgICAgLSAnUE9TVEdSRVNfREI9JHtQT1NUR1JFU19EQjotbWF5YmUtZGJ9JwogICAgICAtICdTRUNSRVRfS0VZX0JBU0U9JHtTRVJWSUNFX0JBU0U2NF82NF9TRUNSRVRLRVlCQVNFfScKICAgICAgLSBTRUxGX0hPU1RFRD10cnVlCiAgICAgIC0gJ1JBSUxTX0ZPUkNFX1NTTD0ke1JBSUxTX0ZPUkNFX1NTTDotZmFsc2V9JwogICAgICAtICdSQUlMU19BU1NVTUVfU1NMPSR7UkFJTFNfQVNTVU1FX1NTTDotZmFsc2V9JwogICAgICAtICdHT09EX0pPQl9FWEVDVVRJT05fTU9ERT0ke0dPT0RfSk9CX0VYRUNVVElPTl9NT0RFOi1hc3luY30nCiAgICAgIC0gREJfSE9TVD1wb3N0Z3JlcwogICAgICAtIERCX1BPUlQ9NTQzMgogICAgICAtICdSRURJU19VUkw9cmVkaXM6Ly9kZWZhdWx0OiR7U0VSVklDRV9QQVNTV09SRF9SRURJU31AcmVkaXM6NjM3OS8xJwogICAgICAtICdPUEVOQUlfQUNDRVNTX1RPS0VOPSR7T1BFTkFJX0FDQ0VTU19UT0tFTn0nCiAgICBkZXBlbmRzX29uOgogICAgICBwb3N0Z3JlczoKICAgICAgICBjb25kaXRpb246IHNlcnZpY2VfaGVhbHRoeQogICAgICByZWRpczoKICAgICAgICBjb25kaXRpb246IHNlcnZpY2VfaGVhbHRoeQogICAgZXhjbHVkZV9mcm9tX2hjOiB0cnVlCiAgcG9zdGdyZXM6CiAgICBpbWFnZTogJ3Bvc3RncmVzOjE2LWFscGluZScKICAgIHZvbHVtZXM6CiAgICAgIC0gJ21heWJlX3Bvc3RncmVzX2RhdGE6L3Zhci9saWIvcG9zdGdyZXNxbC9kYXRhJwogICAgZW52aXJvbm1lbnQ6CiAgICAgIC0gJ1BPU1RHUkVTX1VTRVI9JHtTRVJWSUNFX1VTRVJfUE9TVEdSRVN9JwogICAgICAtICdQT1NUR1JFU19QQVNTV09SRD0ke1NFUlZJQ0VfUEFTU1dPUkRfUE9TVEdSRVN9JwogICAgICAtICdQT1NUR1JFU19EQj0ke1BPU1RHUkVTX0RCOi1tYXliZS1kYn0nCiAgICBoZWFsdGhjaGVjazoKICAgICAgdGVzdDoKICAgICAgICAtIENNRC1TSEVMTAogICAgICAgIC0gJ3BnX2lzcmVhZHkgLVUgJCR7UE9TVEdSRVNfVVNFUn0gLWQgJCR7UE9TVEdSRVNfREJ9JwogICAgICBpbnRlcnZhbDogNXMKICAgICAgdGltZW91dDogMjBzCiAgICAgIHJldHJpZXM6IDEwCiAgcmVkaXM6CiAgICBpbWFnZTogJ3JlZGlzOjgtYWxwaW5lJwogICAgY29tbWFuZDogJ3JlZGlzLXNlcnZlciAtLWFwcGVuZG9ubHkgeWVzIC0tcmVxdWlyZXBhc3MgJHtTRVJWSUNFX1BBU1NXT1JEX1JFRElTfScKICAgIHZvbHVtZXM6CiAgICAgIC0gJ3JlZGlzX2RhdGE6L2RhdGEnCiAgICBlbnZpcm9ubWVudDoKICAgICAgLSAnUkVESVNfUEFTU1dPUkQ9JHtTRVJWSUNFX1BBU1NXT1JEX1JFRElTfScKICAgICAgLSBSRURJU19QT1JUPTYzNzkKICAgICAgLSBSRURJU19EQj0xCiAgICBoZWFsdGhjaGVjazoKICAgICAgdGVzdDoKICAgICAgICAtIENNRAogICAgICAgIC0gcmVkaXMtY2xpCiAgICAgICAgLSAnLS1wYXNzJwogICAgICAgIC0gJyR7U0VSVklDRV9QQVNTV09SRF9SRURJU30nCiAgICAgICAgLSBwaW5nCiAgICAgIGludGVydmFsOiAxMHMKICAgICAgdGltZW91dDogM3MKICAgICAgcmV0cmllczogMwo=", "tags": [ "finances", "wallets", @@ -2171,6 +2186,20 @@ "minversion": "0.0.0", "port": "80, 2112" }, + "netbird-client": { + "documentation": "https://docs.netbird.io/how-to/examples#net-bird-client-in-docker?utm_source=coolify.io", + "slogan": "Connect your devices into a secure WireGuard\u00ae-based overlay network with SSO, MFA and granular access controls.", + "compose": "c2VydmljZXM6CiAgbmV0YmlyZC1jbGllbnQ6CiAgICBpbWFnZTogJ25ldGJpcmRpby9uZXRiaXJkOmxhdGVzdCcKICAgIGVudmlyb25tZW50OgogICAgICAtICdOQl9TRVRVUF9LRVk9JHtOQl9TRVRVUF9LRVl9JwogICAgICAtICdOQl9FTkFCTEVfUk9TRU5QQVNTPSR7TkJfRU5BQkxFX1JPU0VOUEFTUzotZmFsc2V9JwogICAgICAtICdOQl9FTkFCTEVfRVhQRVJJTUVOVEFMX0xBWllfQ09OTj0ke05CX0VOQUJMRV9FWFBFUklNRU5UQUxfTEFaWV9DT05OOi1mYWxzZX0nCiAgICB2b2x1bWVzOgogICAgICAtICduZXRiaXJkLWNsaWVudDovZXRjL25ldGJpcmQnCiAgICBjYXBfYWRkOgogICAgICAtIE5FVF9BRE1JTgogICAgICAtIFNZU19BRE1JTgogICAgICAtIFNZU19SRVNPVVJDRQogICAgaGVhbHRoY2hlY2s6CiAgICAgIHRlc3Q6CiAgICAgICAgLSBDTUQKICAgICAgICAtIG5ldGJpcmQKICAgICAgICAtIHZlcnNpb24KICAgICAgaW50ZXJ2YWw6IDVzCiAgICAgIHRpbWVvdXQ6IDIwcwogICAgICByZXRyaWVzOiAxMAo=", + "tags": [ + "wireguard", + "mesh-networks", + "vpn", + "zero-trust-network-access", + "open source" + ], + "logo": "svgs/netbird.png", + "minversion": "0.0.0" + }, "next-image-transformation": { "documentation": "https://github.com/coollabsio/next-image-transformation?utm_source=coolify.io", "slogan": "Drop-in replacement for Vercel's Nextjs image optimization service.", @@ -2425,6 +2454,20 @@ "minversion": "0.0.0", "port": "6610" }, + "onetimesecret": { + "documentation": "https://docs.onetimesecret.com?utm_source=coolify.io", + "slogan": "Share sensitive information securely with self-destructing links that are only viewable once.", + "compose": "c2VydmljZXM6CiAgb25ldGltZXNlY3JldDoKICAgIGltYWdlOiAnb25ldGltZXNlY3JldC9vbmV0aW1lc2VjcmV0OmxhdGVzdCcKICAgIGVudmlyb25tZW50OgogICAgICAtIFNFUlZJQ0VfRlFETl9PTkVUSU1FU0VDUkVUXzMwMDAKICAgICAgLSAnQVVUSF9BVVRPVkVSSUZZPSR7QVVUSF9BVVRPVkVSSUZZOi10cnVlfScKICAgICAgLSAnQVVUSF9TSUdOVVA9JHtBVVRIX1NJR05VUDotdHJ1ZX0nCiAgICAgIC0gJ0NPTE9ORUw9JHtDT0xPTkVMOi1hZG1pbkBleGFtcGxlLmNvbX0nCiAgICAgIC0gJ0hPU1Q9JHtIT1NUOi1sb2NhbGhvc3R9JwogICAgICAtICdSRURJU19VUkw9cmVkaXM6Ly86JHtTRVJWSUNFX1BBU1NXT1JEX1JFRElTfUByZWRpczo2Mzc5LzAnCiAgICAgIC0gJ1NFQ1JFVD0ke1NFUlZJQ0VfUEFTU1dPUkRfT05FVElNRVNFQ1JFVH0nCiAgICAgIC0gJ1NTTD0ke1NTTDotZmFsc2V9JwogICAgICAtIFJBQ0tfRU5WPXByb2R1Y3Rpb24KICAgIGRlcGVuZHNfb246CiAgICAgIHJlZGlzOgogICAgICAgIGNvbmRpdGlvbjogc2VydmljZV9oZWFsdGh5CiAgICBoZWFsdGhjaGVjazoKICAgICAgdGVzdDoKICAgICAgICAtIENNRAogICAgICAgIC0gcnVieQogICAgICAgIC0gJy1ybmV0L2h0dHAnCiAgICAgICAgLSAnLWUnCiAgICAgICAgLSAiZXhpdChOZXQ6OkhUVFAuZ2V0X3Jlc3BvbnNlKFVSSSgnaHR0cDovL2xvY2FsaG9zdDozMDAwJykpLmlzX2E/KE5ldDo6SFRUUFN1Y2Nlc3MpID8gMCA6IDEpIgogICAgICBpbnRlcnZhbDogMzBzCiAgICAgIHRpbWVvdXQ6IDEwcwogICAgICByZXRyaWVzOiAzCiAgcmVkaXM6CiAgICBpbWFnZTogJ3JlZGlzOjgtYWxwaW5lJwogICAgY29tbWFuZDogJ3JlZGlzLXNlcnZlciAtLXJlcXVpcmVwYXNzICR7U0VSVklDRV9QQVNTV09SRF9SRURJU30nCiAgICBoZWFsdGhjaGVjazoKICAgICAgdGVzdDoKICAgICAgICAtIENNRAogICAgICAgIC0gcmVkaXMtY2xpCiAgICAgICAgLSBwaW5nCiAgICAgIGludGVydmFsOiAzMHMKICAgICAgdGltZW91dDogMTBzCiAgICAgIHJldHJpZXM6IDMK", + "tags": [ + "auth", + "password", + "secret", + "secure" + ], + "logo": "svgs/onetimesecret.svg", + "minversion": "0.0.0", + "port": "3000" + }, "open-webui": { "documentation": "https://docs.openwebui.com?utm_source=coolify.io", "slogan": "User-friendly AI Interface (Supports Ollama, OpenAI API, ...)", @@ -2440,6 +2483,22 @@ "minversion": "0.0.0", "port": "8080" }, + "orangehrm": { + "documentation": "https://starterhelp.orangehrm.com/hc/en-us?utm_source=coolify.io", + "slogan": "OrangeHRM open source HR management software.", + "compose": "c2VydmljZXM6CiAgb3JhbmdlaHJtOgogICAgaW1hZ2U6ICdvcmFuZ2Vocm0vb3JhbmdlaHJtOmxhdGVzdCcKICAgIHBsYXRmb3JtOiBsaW51eC9hbWQ2NAogICAgZW52aXJvbm1lbnQ6CiAgICAgIC0gU0VSVklDRV9GUUROX09SQU5HRUhSTV84MAogICAgICAtIE9SQU5HRUhSTV9EQVRBQkFTRV9IT1NUPW1hcmlhZGIKICAgICAgLSAnT1JBTkdFSFJNX0RBVEFCQVNFX1VTRVI9JHtTRVJWSUNFX1VTRVJfTVlTUUx9JwogICAgICAtICdPUkFOR0VIUk1fREFUQUJBU0VfUEFTU1dPUkQ9JHtTRVJWSUNFX1BBU1NXT1JEX01ZU1FMfScKICAgICAgLSAnT1JBTkdFSFJNX0RBVEFCQVNFX05BTUU9JHtNWVNRTF9EQVRBQkFTRTotb3JhbmdlaHJtLWRifScKICAgIHZvbHVtZXM6CiAgICAgIC0gJ29yYW5nZWhybS1kYXRhOi9vcmFuZ2Vocm0nCiAgICBkZXBlbmRzX29uOgogICAgICBtYXJpYWRiOgogICAgICAgIGNvbmRpdGlvbjogc2VydmljZV9oZWFsdGh5CiAgICBoZWFsdGhjaGVjazoKICAgICAgdGVzdDoKICAgICAgICAtIENNRAogICAgICAgIC0gY3VybAogICAgICAgIC0gJy1mJwogICAgICAgIC0gJ2h0dHA6Ly8xMjcuMC4wLjEnCiAgICAgIGludGVydmFsOiAycwogICAgICB0aW1lb3V0OiAxMHMKICAgICAgcmV0cmllczogMTAKICBtYXJpYWRiOgogICAgaW1hZ2U6ICdtYXJpYWRiOjExJwogICAgdm9sdW1lczoKICAgICAgLSAnb3JhbmdlaHJtX21hcmlhZGJfZGF0YTovdmFyL2xpYi9teXNxbCcKICAgIGVudmlyb25tZW50OgogICAgICAtICdNWVNRTF9ST09UX1BBU1NXT1JEPSR7U0VSVklDRV9QQVNTV09SRF9NWVNRTFJPT1R9JwogICAgICAtICdNWVNRTF9EQVRBQkFTRT0ke01ZU1FMX0RBVEFCQVNFOi1vcmFuZ2Vocm0tZGJ9JwogICAgICAtICdNWVNRTF9VU0VSPSR7U0VSVklDRV9VU0VSX01ZU1FMfScKICAgICAgLSAnTVlTUUxfUEFTU1dPUkQ9JHtTRVJWSUNFX1BBU1NXT1JEX01ZU1FMfScKICAgIGhlYWx0aGNoZWNrOgogICAgICB0ZXN0OgogICAgICAgIC0gQ01ECiAgICAgICAgLSBoZWFsdGhjaGVjay5zaAogICAgICAgIC0gJy0tY29ubmVjdCcKICAgICAgICAtICctLWlubm9kYl9pbml0aWFsaXplZCcKICAgICAgaW50ZXJ2YWw6IDVzCiAgICAgIHRpbWVvdXQ6IDIwcwogICAgICByZXRyaWVzOiAxMAo=", + "tags": [ + "hr", + "hris", + "hrms", + "human resource management", + "orangehrm", + "hr management" + ], + "logo": "svgs/orangehrm.svg", + "minversion": "0.0.0", + "port": "80" + }, "organizr": { "documentation": "https://docs.organizr.app/?utm_source=coolify.io", "slogan": "Homelab Services Organizer", @@ -2887,6 +2946,19 @@ "minversion": "0.0.0", "port": "8000" }, + "seafile": { + "documentation": "https://manual.seafile.com?utm_source=coolify.io", + "slogan": "Open source cloud storage system for file sync, share and document collaboration", + "compose": "c2VydmljZXM6CiAgc2VhZmlsZToKICAgIGltYWdlOiAnc2VhZmlsZWx0ZC9zZWFmaWxlLW1jOjEyLjAtbGF0ZXN0JwogICAgdm9sdW1lczoKICAgICAgLSAnc2VhZmlsZS1kYXRhOi9zaGFyZWQnCiAgICBlbnZpcm9ubWVudDoKICAgICAgLSBTRVJWSUNFX0ZRRE5fU0VBRklMRV84MAogICAgICAtICdTRUFGSUxFX1NFUlZFUl9IT1NUTkFNRT0ke1NFUlZJQ0VfVVJMX1NFQUZJTEVfODB9JwogICAgICAtIERCX0hPU1Q9bWFyaWFkYgogICAgICAtIERCX1BPUlQ9MzMwNgogICAgICAtICdEQl9ST09UX1BBU1NXRD0ke1NFUlZJQ0VfUEFTU1dPUkRfTVlTUUxST09UfScKICAgICAgLSAnREJfVVNFUj0ke1NFUlZJQ0VfVVNFUl9NWVNRTH0nCiAgICAgIC0gJ0RCX1BBU1NXT1JEPSR7U0VSVklDRV9QQVNTV09SRF9NWVNRTH0nCiAgICAgIC0gJ1NFQUZJTEVfTVlTUUxfREJfQ0NORVRfREJfTkFNRT0ke1NFQUZJTEVfTVlTUUxfREJfQ0NORVRfREJfTkFNRTotY2NuZXRfZGJ9JwogICAgICAtICdTRUFGSUxFX01ZU1FMX0RCX1NFQUZJTEVfREJfTkFNRT0ke1NFQUZJTEVfTVlTUUxfREJfU0VBRklMRV9EQl9OQU1FOi1zZWFmaWxlX2RifScKICAgICAgLSAnU0VBRklMRV9NWVNRTF9EQl9TRUFIVUJfREJfTkFNRT0ke1NFQUZJTEVfTVlTUUxfREJfU0VBSFVCX0RCX05BTUU6LXNlYWh1Yl9kYn0nCiAgICAgIC0gJ1RJTUVfWk9ORT0ke1RJTUVfWk9ORTotVVRDfScKICAgICAgLSAnSU5JVF9TRUFGSUxFX0FETUlOX0VNQUlMPSR7SU5JVF9TRUFGSUxFX0FETUlOX0VNQUlMOi10ZXN0QGV4YW1wbGUuY29tfScKICAgICAgLSAnSU5JVF9TRUFGSUxFX0FETUlOX1BBU1NXT1JEPSR7U0VSVklDRV9QQVNTV09SRF9BRE1JTn0nCiAgICAgIC0gJ1NFQUZJTEVfU0VSVkVSX1BST1RPQ09MPSR7U0VBRklMRV9TRVJWRVJfUFJPVE9DT0w6LWh0dHB9JwogICAgICAtICdTSVRFX1JPT1Q9JHtTSVRFX1JPT1Q6LS99JwogICAgICAtICdOT05fUk9PVD0ke05PTl9ST09UOi1mYWxzZX0nCiAgICAgIC0gJ0pXVF9QUklWQVRFX0tFWT0ke1NFUlZJQ0VfUEFTU1dPUkRfNjRfSldUfScKICAgICAgLSAnU0VBRklMRV9MT0dfVE9fU1RET1VUPSR7U0VBRklMRV9MT0dfVE9fU1RET1VUOi10cnVlfScKICAgIGRlcGVuZHNfb246CiAgICAgIG1hcmlhZGI6CiAgICAgICAgY29uZGl0aW9uOiBzZXJ2aWNlX2hlYWx0aHkKICAgICAgbWVtY2FjaGVkOgogICAgICAgIGNvbmRpdGlvbjogc2VydmljZV9zdGFydGVkCiAgICBoZWFsdGhjaGVjazoKICAgICAgdGVzdDoKICAgICAgICAtIENNRAogICAgICAgIC0gY3VybAogICAgICAgIC0gJy1mJwogICAgICAgIC0gJ2h0dHA6Ly8xMjcuMC4wLjE6ODAvYXBpMi9waW5nJwogICAgICBpbnRlcnZhbDogMjBzCiAgICAgIHRpbWVvdXQ6IDVzCiAgICAgIHJldHJpZXM6IDEwCiAgbWFyaWFkYjoKICAgIGltYWdlOiAnbWFyaWFkYjoxMScKICAgIHZvbHVtZXM6CiAgICAgIC0gJ3NlYWZpbGVfbWFyaWFkYl9kYXRhOi92YXIvbGliL215c3FsJwogICAgZW52aXJvbm1lbnQ6CiAgICAgIC0gJ01ZU1FMX1JPT1RfUEFTU1dPUkQ9JHtTRVJWSUNFX1BBU1NXT1JEX01ZU1FMUk9PVH0nCiAgICAgIC0gJ01ZU1FMX1VTRVI9JHtTRVJWSUNFX1VTRVJfTVlTUUx9JwogICAgICAtICdNWVNRTF9QQVNTV09SRD0ke1NFUlZJQ0VfUEFTU1dPUkRfTVlTUUx9JwogICAgICAtICdNWVNRTF9EQVRBQkFTRT0ke01ZU1FMX0RBVEFCQVNFOi1zZWFmaWxlLWRifScKICAgIGhlYWx0aGNoZWNrOgogICAgICB0ZXN0OgogICAgICAgIC0gQ01ECiAgICAgICAgLSBoZWFsdGhjaGVjay5zaAogICAgICAgIC0gJy0tY29ubmVjdCcKICAgICAgICAtICctLWlubm9kYl9pbml0aWFsaXplZCcKICAgICAgaW50ZXJ2YWw6IDVzCiAgICAgIHRpbWVvdXQ6IDIwcwogICAgICByZXRyaWVzOiAxMAogIG1lbWNhY2hlZDoKICAgIGltYWdlOiAnbWVtY2FjaGVkOmxhdGVzdCcKICAgIGVudHJ5cG9pbnQ6ICdtZW1jYWNoZWQgLW0gMjU2JwogICAgaGVhbHRoY2hlY2s6CiAgICAgIHRlc3Q6CiAgICAgICAgLSBDTUQtU0hFTEwKICAgICAgICAtICdiYXNoIC1jICJlY2hvIHZlcnNpb24gfCAoZXhlYyAzPD4vZGV2L3RjcC9sb2NhbGhvc3QvMTEyMTE7IGNhdCA+JjM7IHRpbWVvdXQgMC41IGNhdCA8JjM7IGV4ZWMgMzwmLSkiJwogICAgICBpbnRlcnZhbDogMjBzCiAgICAgIHRpbWVvdXQ6IDVzCiAgICAgIHJldHJpZXM6IDEwCg==", + "tags": [ + "file-manager", + "file-sharing", + "storage" + ], + "logo": "svgs/seafile.svg", + "minversion": "0.0.0", + "port": "80" + }, "searxng": { "documentation": "https://docs.searxng.org?utm_source=coolify.io", "slogan": "SearXNG is a free internet metasearch engine which aggregates results from more than 70 search services.", @@ -3045,6 +3117,22 @@ "minversion": "4.0.0-beta.228", "port": "8000" }, + "superset-with-postgresql": { + "documentation": "https://github.com/amancevice/docker-superset?utm_source=coolify.io", + "slogan": "Modern data exploration and visualization platform (unofficial community docker image)", + "compose": "c2VydmljZXM6CiAgc3VwZXJzZXQ6CiAgICBpbWFnZTogJ2FtYW5jZXZpY2Uvc3VwZXJzZXQ6bGF0ZXN0JwogICAgZW52aXJvbm1lbnQ6CiAgICAgIC0gU0VSVklDRV9GUUROX1NVUEVSU0VUXzgwODgKICAgICAgLSAnU0VDUkVUX0tFWT0ke1NFUlZJQ0VfQkFTRTY0XzY0X1NVUEVSU0VUU0VDUkVUS0VZfScKICAgICAgLSAnTUFQQk9YX0FQSV9LRVk9JHtNQVBCT1hfQVBJX0tFWX0nCiAgICAgIC0gJ1BPU1RHUkVTX1VTRVI9JHtTRVJWSUNFX1VTRVJfUE9TVEdSRVN9JwogICAgICAtICdQT1NUR1JFU19QQVNTV09SRD0ke1NFUlZJQ0VfUEFTU1dPUkRfUE9TVEdSRVN9JwogICAgICAtICdQT1NUR1JFU19EQj0ke1BPU1RHUkVTX0RCOi1zdXBlcnNldC1kYn0nCiAgICAgIC0gJ1JFRElTX1BBU1NXT1JEPSR7U0VSVklDRV9QQVNTV09SRF9SRURJU30nCiAgICB2b2x1bWVzOgogICAgICAtCiAgICAgICAgdHlwZTogYmluZAogICAgICAgIHNvdXJjZTogLi9zdXBlcnNldC9zdXBlcnNldF9jb25maWcucHkKICAgICAgICB0YXJnZXQ6IC9ldGMvc3VwZXJzZXQvc3VwZXJzZXRfY29uZmlnLnB5CiAgICAgICAgY29udGVudDogIlwiXCJcIlxuRm9yIG1vcmUgY29uZmlndXJhdGlvbiBvcHRpb25zLCBzZWU6XG4tIGh0dHBzOi8vc3VwZXJzZXQuYXBhY2hlLm9yZy9kb2NzL2NvbmZpZ3VyYXRpb24vY29uZmlndXJpbmctc3VwZXJzZXRcblwiXCJcIlxuXG5pbXBvcnQgb3NcblxuU0VDUkVUX0tFWSA9IG9zLmdldGVudihcIlNFQ1JFVF9LRVlcIilcbk1BUEJPWF9BUElfS0VZID0gb3MuZ2V0ZW52KFwiTUFQQk9YX0FQSV9LRVlcIiwgXCJcIilcblxuQ0FDSEVfQ09ORklHID0ge1xuICBcIkNBQ0hFX1RZUEVcIjogXCJSZWRpc0NhY2hlXCIsXG4gIFwiQ0FDSEVfREVGQVVMVF9USU1FT1VUXCI6IDMwMCxcbiAgXCJDQUNIRV9LRVlfUFJFRklYXCI6IFwic3VwZXJzZXRfXCIsXG4gIFwiQ0FDSEVfUkVESVNfSE9TVFwiOiBcInJlZGlzXCIsXG4gIFwiQ0FDSEVfUkVESVNfUE9SVFwiOiA2Mzc5LFxuICBcIkNBQ0hFX1JFRElTX0RCXCI6IDEsXG4gIFwiQ0FDSEVfUkVESVNfVVJMXCI6IGZcInJlZGlzOi8vOntvcy5nZXRlbnYoJ1JFRElTX1BBU1NXT1JEJyl9QHJlZGlzOjYzNzkvMVwiLFxufVxuXG5GSUxURVJfU1RBVEVfQ0FDSEVfQ09ORklHID0geyoqQ0FDSEVfQ09ORklHLCBcIkNBQ0hFX0tFWV9QUkVGSVhcIjogXCJzdXBlcnNldF9maWx0ZXJfXCJ9XG5FWFBMT1JFX0ZPUk1fREFUQV9DQUNIRV9DT05GSUcgPSB7KipDQUNIRV9DT05GSUcsIFwiQ0FDSEVfS0VZX1BSRUZJWFwiOiBcInN1cGVyc2V0X2V4cGxvcmVfZm9ybV9cIn1cblxuU1FMQUxDSEVNWV9UUkFDS19NT0RJRklDQVRJT05TID0gVHJ1ZVxuU1FMQUxDSEVNWV9EQVRBQkFTRV9VUkkgPSBmXCJwb3N0Z3Jlc3FsK3BzeWNvcGcyOi8ve29zLmdldGVudignUE9TVEdSRVNfVVNFUicpfTp7b3MuZ2V0ZW52KCdQT1NUR1JFU19QQVNTV09SRCcpfUBwb3N0Z3Jlczo1NDMyL3tvcy5nZXRlbnYoJ1BPU1RHUkVTX0RCJyl9XCJcblxuIyBVbmNvbW1lbnQgaWYgeW91IHdhbnQgdG8gbG9hZCBleGFtcGxlIGRhdGEgKHVzaW5nIFwic3VwZXJzZXQgbG9hZF9leGFtcGxlc1wiKSBhdCB0aGVcbiMgc2FtZSBsb2NhdGlvbiBhcyB5b3VyIG1ldGFkYXRhIHBvc3RncmVzcWwgaW5zdGFuY2UuIE90aGVyd2lzZSwgdGhlIGRlZmF1bHQgc3FsaXRlXG4jIHdpbGwgYmUgdXNlZCwgd2hpY2ggd2lsbCBub3QgcGVyc2lzdCBpbiB2b2x1bWUgd2hlbiByZXN0YXJ0aW5nIHN1cGVyc2V0IGJ5IGRlZmF1bHQuXG4jU1FMQUxDSEVNWV9FWEFNUExFU19VUkkgPSBTUUxBTENIRU1ZX0RBVEFCQVNFX1VSSSIKICAgIGRlcGVuZHNfb246CiAgICAgIHBvc3RncmVzOgogICAgICAgIGNvbmRpdGlvbjogc2VydmljZV9oZWFsdGh5CiAgICAgIHJlZGlzOgogICAgICAgIGNvbmRpdGlvbjogc2VydmljZV9oZWFsdGh5CiAgICBoZWFsdGhjaGVjazoKICAgICAgdGVzdDoKICAgICAgICAtIENNRAogICAgICAgIC0gY3VybAogICAgICAgIC0gJy1mJwogICAgICAgIC0gJ2h0dHA6Ly8xMjcuMC4wLjE6ODA4OC9oZWFsdGgnCiAgICAgIGludGVydmFsOiA1cwogICAgICB0aW1lb3V0OiAyMHMKICAgICAgcmV0cmllczogMTAKICBwb3N0Z3JlczoKICAgIGltYWdlOiAncG9zdGdyZXM6MTctYWxwaW5lJwogICAgZW52aXJvbm1lbnQ6CiAgICAgIC0gJ1BPU1RHUkVTX1VTRVI9JHtTRVJWSUNFX1VTRVJfUE9TVEdSRVN9JwogICAgICAtICdQT1NUR1JFU19QQVNTV09SRD0ke1NFUlZJQ0VfUEFTU1dPUkRfUE9TVEdSRVN9JwogICAgICAtICdQT1NUR1JFU19EQj0ke1BPU1RHUkVTX0RCOi1zdXBlcnNldC1kYn0nCiAgICB2b2x1bWVzOgogICAgICAtICdzdXBlcnNldF9wb3N0Z3Jlc19kYXRhOi92YXIvbGliL3Bvc3RncmVzcWwvZGF0YScKICAgIGhlYWx0aGNoZWNrOgogICAgICB0ZXN0OgogICAgICAgIC0gQ01ELVNIRUxMCiAgICAgICAgLSAncGdfaXNyZWFkeSAtVSAkJHtQT1NUR1JFU19VU0VSfSAtZCAkJHtQT1NUR1JFU19EQn0nCiAgICAgIGludGVydmFsOiA1cwogICAgICB0aW1lb3V0OiAyMHMKICAgICAgcmV0cmllczogMTAKICByZWRpczoKICAgIGltYWdlOiAncmVkaXM6OC1hbHBpbmUnCiAgICB2b2x1bWVzOgogICAgICAtICdzdXBlcnNldF9yZWRpc19kYXRhOi9kYXRhJwogICAgY29tbWFuZDogJ3JlZGlzLXNlcnZlciAtLXJlcXVpcmVwYXNzICR7U0VSVklDRV9QQVNTV09SRF9SRURJU30nCiAgICBoZWFsdGhjaGVjazoKICAgICAgdGVzdDogJ3JlZGlzLWNsaSBwaW5nJwogICAgICBpbnRlcnZhbDogNXMKICAgICAgdGltZW91dDogMjBzCiAgICAgIHJldHJpZXM6IDEwCg==", + "tags": [ + "analytics", + "bi", + "dashboard", + "database", + "sql", + "unofficial" + ], + "logo": "svgs/superset.svg", + "minversion": "0.0.0", + "port": "8088" + }, "supertokens-with-mysql": { "documentation": "https://supertokens.com/docs/guides?utm_source=coolify.io", "slogan": "An open-source authentication solution that simplifies the implementation of secure user authentication and session management for web and mobile applications.", @@ -3196,7 +3284,7 @@ "typesense": { "documentation": "https://typesense.org/docs?utm_source=coolify.io", "slogan": "Cutting-edge, in-memory search engine for mere mortals. Knowledge of rocket science optional.", - "compose": "c2VydmljZXM6CiAgdHlwZXNlbnNlOgogICAgaW1hZ2U6ICd0eXBlc2Vuc2UvdHlwZXNlbnNlOjI4LjAnCiAgICBlbnZpcm9ubWVudDoKICAgICAgLSBTRVJWSUNFX0ZRRE5fVFlQRVNFTlNFXzgxMDgKICAgICAgLSAnVFlQRVNFTlNFX0VOQUJMRV9DT1JTPSR7VFlQRVNFTlNFX0VOQUJMRV9DT1JTOi10cnVlfScKICAgICAgLSBUWVBFU0VOU0VfREFUQV9ESVI9L2RhdGEKICAgICAgLSAnVFlQRVNFTlNFX0FQSV9LRVk9JHtUWVBFU0VOU0VfQVBJX0tFWX0nCiAgICB2b2x1bWVzOgogICAgICAtICd0eXBlc2Vuc2VfZGF0YTovZGF0YScKICAgIGhlYWx0aGNoZWNrOgogICAgICB0ZXN0OgogICAgICAgIC0gQ01ECiAgICAgICAgLSBiYXNoCiAgICAgICAgLSAnLWMnCiAgICAgICAgLSAnZXhlYyAzPD4vZGV2L3RjcC9sb2NhbGhvc3QvODEwOCAmJiBwcmludGYgJydHRVQgL2hlYWx0aCBIVFRQLzEuMVxyXG5Db25uZWN0aW9uOiBjbG9zZVxyXG5cclxuJycgPiYzICYmIGhlYWQgLW4xIDwmMyB8IGdyZXAgJycyMDAnJyAmJiBleGVjIDM+Ji0nCiAgICAgIHJldHJpZXM6IDUKICAgICAgdGltZW91dDogN3MK", + "compose": "c2VydmljZXM6CiAgdHlwZXNlbnNlOgogICAgaW1hZ2U6ICd0eXBlc2Vuc2UvdHlwZXNlbnNlOjI4LjAnCiAgICBlbnZpcm9ubWVudDoKICAgICAgLSBTRVJWSUNFX0ZRRE5fVFlQRVNFTlNFXzgxMDgKICAgICAgLSAnVFlQRVNFTlNFX0VOQUJMRV9DT1JTPSR7VFlQRVNFTlNFX0VOQUJMRV9DT1JTOi10cnVlfScKICAgICAgLSBUWVBFU0VOU0VfREFUQV9ESVI9L2RhdGEKICAgICAgLSAnVFlQRVNFTlNFX0FQSV9LRVk9JHtUWVBFU0VOU0VfQVBJX0tFWTo/fScKICAgIHZvbHVtZXM6CiAgICAgIC0gJ3R5cGVzZW5zZV9kYXRhOi9kYXRhJwogICAgaGVhbHRoY2hlY2s6CiAgICAgIHRlc3Q6CiAgICAgICAgLSBDTUQKICAgICAgICAtIGJhc2gKICAgICAgICAtICctYycKICAgICAgICAtICdleGVjIDM8Pi9kZXYvdGNwL2xvY2FsaG9zdC84MTA4ICYmIHByaW50ZiAnJ0dFVCAvaGVhbHRoIEhUVFAvMS4xXHJcbkNvbm5lY3Rpb246IGNsb3NlXHJcblxyXG4nJyA+JjMgJiYgaGVhZCAtbjEgPCYzIHwgZ3JlcCAnJzIwMCcnICYmIGV4ZWMgMz4mLScKICAgICAgcmV0cmllczogNQogICAgICB0aW1lb3V0OiA3cwo=", "tags": [ "search", "search-engine", From 86f6cd5fd62eb23b66df772d02de08914c9fd92f Mon Sep 17 00:00:00 2001 From: Andras Bacsai <5845193+andrasbacsai@users.noreply.github.com> Date: Mon, 26 May 2025 12:40:05 +0200 Subject: [PATCH 0028/1232] feat(rules): add comprehensive documentation for Coolify architecture and development practices for AI tools, especially for cursor - Introduced multiple new markdown files covering API and routing, application architecture, deployment architecture, database patterns, frontend patterns, and security practices. - Established guidelines for development workflows, testing strategies, and continuous improvement of rules. - Enhanced project overview and technology stack documentation to provide clarity on Coolify's features and architecture. --- .cursor/rules/README.mdc | 292 ++++++++ .cursor/rules/api-and-routing.mdc | 474 +++++++++++++ .cursor/rules/application-architecture.mdc | 368 ++++++++++ .cursor/rules/cursor_rules.mdc | 53 ++ .cursor/rules/database-patterns.mdc | 306 ++++++++ .cursor/rules/deployment-architecture.mdc | 310 ++++++++ .cursor/rules/dev_workflow.mdc | 219 ++++++ .cursor/rules/development-workflow.mdc | 653 +++++++++++++++++ .cursor/rules/frontend-patterns.mdc | 319 +++++++++ .cursor/rules/project-overview.mdc | 161 +++++ .cursor/rules/security-patterns.mdc | 784 +++++++++++++++++++++ .cursor/rules/self_improve.mdc | 72 ++ .cursor/rules/technology-stack.mdc | 250 +++++++ .cursor/rules/testing-patterns.mdc | 606 ++++++++++++++++ 14 files changed, 4867 insertions(+) create mode 100644 .cursor/rules/README.mdc create mode 100644 .cursor/rules/api-and-routing.mdc create mode 100644 .cursor/rules/application-architecture.mdc create mode 100644 .cursor/rules/cursor_rules.mdc create mode 100644 .cursor/rules/database-patterns.mdc create mode 100644 .cursor/rules/deployment-architecture.mdc create mode 100644 .cursor/rules/dev_workflow.mdc create mode 100644 .cursor/rules/development-workflow.mdc create mode 100644 .cursor/rules/frontend-patterns.mdc create mode 100644 .cursor/rules/project-overview.mdc create mode 100644 .cursor/rules/security-patterns.mdc create mode 100644 .cursor/rules/self_improve.mdc create mode 100644 .cursor/rules/technology-stack.mdc create mode 100644 .cursor/rules/testing-patterns.mdc diff --git a/.cursor/rules/README.mdc b/.cursor/rules/README.mdc new file mode 100644 index 000000000..3eb1c56fb --- /dev/null +++ b/.cursor/rules/README.mdc @@ -0,0 +1,292 @@ +--- +description: +globs: +alwaysApply: false +--- +# Coolify Cursor Rules - Complete Guide + +## Overview + +This comprehensive set of Cursor Rules provides deep insights into **Coolify**, an open-source self-hostable alternative to Heroku/Netlify/Vercel. These rules will help you understand, navigate, and contribute to this complex Laravel-based deployment platform. + +## Rule Categories + +### 🏗️ Architecture & Foundation +- **[project-overview.mdc](mdc:.cursor/rules/project-overview.mdc)** - What Coolify is and its core mission +- **[technology-stack.mdc](mdc:.cursor/rules/technology-stack.mdc)** - Complete technology stack and dependencies +- **[application-architecture.mdc](mdc:.cursor/rules/application-architecture.mdc)** - Laravel application structure and patterns + +### 🎨 Frontend Development +- **[frontend-patterns.mdc](mdc:.cursor/rules/frontend-patterns.mdc)** - Livewire + Alpine.js + Tailwind architecture + +### 🗄️ Data & Backend +- **[database-patterns.mdc](mdc:.cursor/rules/database-patterns.mdc)** - Database architecture, models, and data management +- **[deployment-architecture.mdc](mdc:.cursor/rules/deployment-architecture.mdc)** - Docker orchestration and deployment workflows + +### 🌐 API & Communication +- **[api-and-routing.mdc](mdc:.cursor/rules/api-and-routing.mdc)** - RESTful APIs, webhooks, and routing patterns + +### 🧪 Quality Assurance +- **[testing-patterns.mdc](mdc:.cursor/rules/testing-patterns.mdc)** - Testing strategies with Pest PHP and Laravel Dusk + +### 🔧 Development Process +- **[development-workflow.mdc](mdc:.cursor/rules/development-workflow.mdc)** - Development setup, coding standards, and contribution guidelines + +### 🔒 Security +- **[security-patterns.mdc](mdc:.cursor/rules/security-patterns.mdc)** - Security architecture, authentication, and best practices + +## Quick Navigation + +### Core Application Files +- **[app/Models/Application.php](mdc:app/Models/Application.php)** - Main application entity (74KB, highly complex) +- **[app/Models/Server.php](mdc:app/Models/Server.php)** - Server management (46KB, complex) +- **[app/Models/Service.php](mdc:app/Models/Service.php)** - Service definitions (58KB, complex) +- **[app/Models/Team.php](mdc:app/Models/Team.php)** - Multi-tenant structure (8.9KB) + +### Configuration Files +- **[composer.json](mdc:composer.json)** - PHP dependencies and Laravel setup +- **[package.json](mdc:package.json)** - Frontend dependencies and build scripts +- **[vite.config.js](mdc:vite.config.js)** - Frontend build configuration +- **[docker-compose.dev.yml](mdc:docker-compose.dev.yml)** - Development environment + +### API Documentation +- **[openapi.json](mdc:openapi.json)** - Complete API documentation (373KB) +- **[routes/api.php](mdc:routes/api.php)** - API endpoint definitions (13KB) +- **[routes/web.php](mdc:routes/web.php)** - Web application routes (21KB) + +## Key Concepts to Understand + +### 1. Multi-Tenant Architecture +Coolify uses a **team-based multi-tenancy** model where: +- Users belong to multiple teams +- Resources are scoped to teams +- Access control is team-based +- Data isolation is enforced at the database level + +### 2. Deployment Philosophy +- **Docker-first** approach for all deployments +- **Zero-downtime** deployments with health checks +- **Git-based** workflows with webhook integration +- **Multi-server** support with SSH connections + +### 3. Technology Stack +- **Backend**: Laravel 11 + PHP 8.4 +- **Frontend**: Livewire 3.5 + Alpine.js + Tailwind CSS 4.1 +- **Database**: PostgreSQL 15 + Redis 7 +- **Containerization**: Docker + Docker Compose +- **Testing**: Pest PHP 3.8 + Laravel Dusk + +### 4. Security Model +- **Defense-in-depth** security architecture +- **OAuth integration** with multiple providers +- **API token** authentication with Sanctum +- **Encrypted storage** for sensitive data +- **SSH key** management for server access + +## Development Quick Start + +### Local Setup +```bash +# Clone and setup +git clone https://github.com/coollabsio/coolify.git +cd coolify +cp .env.example .env + +# Docker development (recommended) +docker-compose -f docker-compose.dev.yml up -d +docker-compose exec app composer install +docker-compose exec app npm install +docker-compose exec app php artisan migrate +``` + +### Code Quality +```bash +# PHP code style +./vendor/bin/pint + +# Static analysis +./vendor/bin/phpstan analyse + +# Run tests +./vendor/bin/pest +``` + +## Common Patterns + +### Livewire Components +```php +class ApplicationShow extends Component +{ + public Application $application; + + protected $listeners = [ + 'deployment.started' => 'refresh', + 'deployment.completed' => 'refresh', + ]; + + public function deploy(): void + { + $this->authorize('deploy', $this->application); + app(ApplicationDeploymentService::class)->deploy($this->application); + } +} +``` + +### API Controllers +```php +class ApplicationController extends Controller +{ + public function __construct() + { + $this->middleware('auth:sanctum'); + $this->middleware('team.access'); + } + + public function deploy(Application $application): JsonResponse + { + $this->authorize('deploy', $application); + $deployment = app(ApplicationDeploymentService::class)->deploy($application); + return response()->json(['deployment_id' => $deployment->id]); + } +} +``` + +### Queue Jobs +```php +class DeployApplicationJob implements ShouldQueue +{ + public function handle(DockerService $dockerService): void + { + $this->deployment->update(['status' => 'running']); + + try { + $dockerService->deployContainer($this->deployment->application); + $this->deployment->update(['status' => 'success']); + } catch (Exception $e) { + $this->deployment->update(['status' => 'failed']); + throw $e; + } + } +} +``` + +## Testing Patterns + +### Feature Tests +```php +test('user can deploy application via API', function () { + $user = User::factory()->create(); + $application = Application::factory()->create(['team_id' => $user->currentTeam->id]); + + $response = $this->actingAs($user) + ->postJson("/api/v1/applications/{$application->id}/deploy"); + + $response->assertStatus(200); + expect($application->deployments()->count())->toBe(1); +}); +``` + +### Browser Tests +```php +test('user can create application through UI', function () { + $user = User::factory()->create(); + + $this->browse(function (Browser $browser) use ($user) { + $browser->loginAs($user) + ->visit('/applications/create') + ->type('name', 'Test App') + ->press('Create Application') + ->assertSee('Application created successfully'); + }); +}); +``` + +## Security Considerations + +### Authentication +- Multi-provider OAuth support +- API token authentication +- Team-based access control +- Session management + +### Data Protection +- Encrypted environment variables +- Secure SSH key storage +- Input validation and sanitization +- SQL injection prevention + +### Container Security +- Non-root container users +- Minimal capabilities +- Read-only filesystems +- Network isolation + +## Performance Optimization + +### Database +- Eager loading relationships +- Query optimization +- Connection pooling +- Caching strategies + +### Frontend +- Lazy loading components +- Asset optimization +- CDN integration +- Real-time updates via WebSockets + +## Contributing Guidelines + +### Code Standards +- PSR-12 PHP coding standards +- Laravel best practices +- Comprehensive test coverage +- Security-first approach + +### Pull Request Process +1. Fork repository +2. Create feature branch +3. Implement with tests +4. Run quality checks +5. Submit PR with clear description + +## Useful Commands + +### Development +```bash +# Start development environment +docker-compose -f docker-compose.dev.yml up -d + +# Run tests +./vendor/bin/pest + +# Code formatting +./vendor/bin/pint + +# Frontend development +npm run dev +``` + +### Production +```bash +# Install Coolify +curl -fsSL https://cdn.coollabs.io/coolify/install.sh | bash + +# Update Coolify +./scripts/upgrade.sh +``` + +## Resources + +### Documentation +- **[README.md](mdc:README.md)** - Project overview and installation +- **[CONTRIBUTING.md](mdc:CONTRIBUTING.md)** - Contribution guidelines +- **[CHANGELOG.md](mdc:CHANGELOG.md)** - Release history +- **[TECH_STACK.md](mdc:TECH_STACK.md)** - Technology overview + +### Configuration +- **[config/](mdc:config)** - Laravel configuration files +- **[database/migrations/](mdc:database/migrations)** - Database schema +- **[tests/](mdc:tests)** - Test suite + +This comprehensive rule set provides everything needed to understand, develop, and contribute to the Coolify project effectively. Each rule focuses on specific aspects while maintaining connections to the broader architecture. diff --git a/.cursor/rules/api-and-routing.mdc b/.cursor/rules/api-and-routing.mdc new file mode 100644 index 000000000..21daf22d2 --- /dev/null +++ b/.cursor/rules/api-and-routing.mdc @@ -0,0 +1,474 @@ +--- +description: +globs: +alwaysApply: false +--- +# Coolify API & Routing Architecture + +## Routing Structure + +Coolify implements **multi-layered routing** with web interfaces, RESTful APIs, webhook endpoints, and real-time communication channels. + +## Route Files + +### Core Route Definitions +- **[routes/web.php](mdc:routes/web.php)** - Web application routes (21KB, 362 lines) +- **[routes/api.php](mdc:routes/api.php)** - RESTful API endpoints (13KB, 185 lines) +- **[routes/webhooks.php](mdc:routes/webhooks.php)** - Webhook receivers (815B, 22 lines) +- **[routes/channels.php](mdc:routes/channels.php)** - WebSocket channel definitions (829B, 33 lines) +- **[routes/console.php](mdc:routes/console.php)** - Artisan command routes (592B, 20 lines) + +## Web Application Routing + +### Authentication Routes +```php +// Laravel Fortify authentication +Route::middleware('guest')->group(function () { + Route::get('/login', [AuthController::class, 'login']); + Route::get('/register', [AuthController::class, 'register']); + Route::get('/forgot-password', [AuthController::class, 'forgotPassword']); +}); +``` + +### Dashboard & Core Features +```php +// Main application routes +Route::middleware(['auth', 'verified'])->group(function () { + Route::get('/dashboard', Dashboard::class)->name('dashboard'); + Route::get('/projects', ProjectIndex::class)->name('projects'); + Route::get('/servers', ServerIndex::class)->name('servers'); + Route::get('/teams', TeamIndex::class)->name('teams'); +}); +``` + +### Resource Management Routes +```php +// Server management +Route::prefix('servers')->group(function () { + Route::get('/{server}', ServerShow::class)->name('server.show'); + Route::get('/{server}/edit', ServerEdit::class)->name('server.edit'); + Route::get('/{server}/logs', ServerLogs::class)->name('server.logs'); +}); + +// Application management +Route::prefix('applications')->group(function () { + Route::get('/{application}', ApplicationShow::class)->name('application.show'); + Route::get('/{application}/deployments', ApplicationDeployments::class); + Route::get('/{application}/environment-variables', ApplicationEnvironmentVariables::class); + Route::get('/{application}/logs', ApplicationLogs::class); +}); +``` + +## RESTful API Architecture + +### API Versioning +```php +// API route structure +Route::prefix('v1')->group(function () { + // Application endpoints + Route::apiResource('applications', ApplicationController::class); + Route::apiResource('servers', ServerController::class); + Route::apiResource('teams', TeamController::class); +}); +``` + +### Authentication & Authorization +```php +// Sanctum API authentication +Route::middleware('auth:sanctum')->group(function () { + Route::get('/user', function (Request $request) { + return $request->user(); + }); + + // Team-scoped resources + Route::middleware('team.access')->group(function () { + Route::apiResource('applications', ApplicationController::class); + }); +}); +``` + +### Application Management API +```php +// Application CRUD operations +Route::prefix('applications')->group(function () { + Route::get('/', [ApplicationController::class, 'index']); + Route::post('/', [ApplicationController::class, 'store']); + Route::get('/{application}', [ApplicationController::class, 'show']); + Route::patch('/{application}', [ApplicationController::class, 'update']); + Route::delete('/{application}', [ApplicationController::class, 'destroy']); + + // Deployment operations + Route::post('/{application}/deploy', [ApplicationController::class, 'deploy']); + Route::post('/{application}/restart', [ApplicationController::class, 'restart']); + Route::post('/{application}/stop', [ApplicationController::class, 'stop']); + Route::get('/{application}/logs', [ApplicationController::class, 'logs']); +}); +``` + +### Server Management API +```php +// Server operations +Route::prefix('servers')->group(function () { + Route::get('/', [ServerController::class, 'index']); + Route::post('/', [ServerController::class, 'store']); + Route::get('/{server}', [ServerController::class, 'show']); + Route::patch('/{server}', [ServerController::class, 'update']); + Route::delete('/{server}', [ServerController::class, 'destroy']); + + // Server actions + Route::post('/{server}/validate', [ServerController::class, 'validate']); + Route::get('/{server}/usage', [ServerController::class, 'usage']); + Route::post('/{server}/cleanup', [ServerController::class, 'cleanup']); +}); +``` + +### Database Management API +```php +// Database operations +Route::prefix('databases')->group(function () { + Route::get('/', [DatabaseController::class, 'index']); + Route::post('/', [DatabaseController::class, 'store']); + Route::get('/{database}', [DatabaseController::class, 'show']); + Route::patch('/{database}', [DatabaseController::class, 'update']); + Route::delete('/{database}', [DatabaseController::class, 'destroy']); + + // Database actions + Route::post('/{database}/backup', [DatabaseController::class, 'backup']); + Route::post('/{database}/restore', [DatabaseController::class, 'restore']); + Route::get('/{database}/logs', [DatabaseController::class, 'logs']); +}); +``` + +## Webhook Architecture + +### Git Integration Webhooks +```php +// GitHub webhook endpoints +Route::post('/webhooks/github/{application}', [GitHubWebhookController::class, 'handle']) + ->name('webhooks.github'); + +// GitLab webhook endpoints +Route::post('/webhooks/gitlab/{application}', [GitLabWebhookController::class, 'handle']) + ->name('webhooks.gitlab'); + +// Generic Git webhooks +Route::post('/webhooks/git/{application}', [GitWebhookController::class, 'handle']) + ->name('webhooks.git'); +``` + +### Deployment Webhooks +```php +// Deployment status webhooks +Route::post('/webhooks/deployment/{deployment}/success', [DeploymentWebhookController::class, 'success']); +Route::post('/webhooks/deployment/{deployment}/failure', [DeploymentWebhookController::class, 'failure']); +Route::post('/webhooks/deployment/{deployment}/progress', [DeploymentWebhookController::class, 'progress']); +``` + +### Third-Party Integration Webhooks +```php +// Monitoring webhooks +Route::post('/webhooks/monitoring/{server}', [MonitoringWebhookController::class, 'handle']); + +// Backup status webhooks +Route::post('/webhooks/backup/{backup}', [BackupWebhookController::class, 'handle']); + +// SSL certificate webhooks +Route::post('/webhooks/ssl/{certificate}', [SslWebhookController::class, 'handle']); +``` + +## WebSocket Channel Definitions + +### Real-Time Channels +```php +// Private channels for team members +Broadcast::channel('team.{teamId}', function ($user, $teamId) { + return $user->teams->contains('id', $teamId); +}); + +// Application deployment channels +Broadcast::channel('application.{applicationId}', function ($user, $applicationId) { + return $user->hasAccessToApplication($applicationId); +}); + +// Server monitoring channels +Broadcast::channel('server.{serverId}', function ($user, $serverId) { + return $user->hasAccessToServer($serverId); +}); +``` + +### Presence Channels +```php +// Team collaboration presence +Broadcast::channel('team.{teamId}.presence', function ($user, $teamId) { + if ($user->teams->contains('id', $teamId)) { + return ['id' => $user->id, 'name' => $user->name]; + } +}); +``` + +## API Controllers + +### Location: [app/Http/Controllers/Api/](mdc:app/Http/Controllers) + +#### Resource Controllers +```php +class ApplicationController extends Controller +{ + public function index(Request $request) + { + return ApplicationResource::collection( + $request->user()->currentTeam->applications() + ->with(['server', 'environment']) + ->paginate() + ); + } + + public function store(StoreApplicationRequest $request) + { + $application = $request->user()->currentTeam + ->applications() + ->create($request->validated()); + + return new ApplicationResource($application); + } + + public function deploy(Application $application) + { + $deployment = $application->deploy(); + + return response()->json([ + 'message' => 'Deployment started', + 'deployment_id' => $deployment->id + ]); + } +} +``` + +### API Responses & Resources +```php +// API Resource classes +class ApplicationResource extends JsonResource +{ + public function toArray($request) + { + return [ + 'id' => $this->id, + 'name' => $this->name, + 'fqdn' => $this->fqdn, + 'status' => $this->status, + 'git_repository' => $this->git_repository, + 'git_branch' => $this->git_branch, + 'created_at' => $this->created_at, + 'updated_at' => $this->updated_at, + 'server' => new ServerResource($this->whenLoaded('server')), + 'environment' => new EnvironmentResource($this->whenLoaded('environment')), + ]; + } +} +``` + +## API Authentication + +### Sanctum Token Authentication +```php +// API token generation +Route::post('/auth/tokens', function (Request $request) { + $request->validate([ + 'name' => 'required|string', + 'abilities' => 'array' + ]); + + $token = $request->user()->createToken( + $request->name, + $request->abilities ?? [] + ); + + return response()->json([ + 'token' => $token->plainTextToken, + 'abilities' => $token->accessToken->abilities + ]); +}); +``` + +### Team-Based Authorization +```php +// Team access middleware +class EnsureTeamAccess +{ + public function handle($request, Closure $next) + { + $teamId = $request->route('team'); + + if (!$request->user()->teams->contains('id', $teamId)) { + abort(403, 'Access denied to team resources'); + } + + return $next($request); + } +} +``` + +## Rate Limiting + +### API Rate Limits +```php +// API throttling configuration +RateLimiter::for('api', function (Request $request) { + return Limit::perMinute(60)->by($request->user()?->id ?: $request->ip()); +}); + +// Deployment rate limiting +RateLimiter::for('deployments', function (Request $request) { + return Limit::perMinute(10)->by($request->user()->id); +}); +``` + +### Webhook Rate Limiting +```php +// Webhook throttling +RateLimiter::for('webhooks', function (Request $request) { + return Limit::perMinute(100)->by($request->ip()); +}); +``` + +## Route Model Binding + +### Custom Route Bindings +```php +// Custom model binding for applications +Route::bind('application', function ($value) { + return Application::where('uuid', $value) + ->orWhere('id', $value) + ->firstOrFail(); +}); + +// Team-scoped model binding +Route::bind('team_application', function ($value, $route) { + $teamId = $route->parameter('team'); + return Application::whereHas('environment.project', function ($query) use ($teamId) { + $query->where('team_id', $teamId); + })->findOrFail($value); +}); +``` + +## API Documentation + +### OpenAPI Specification +- **[openapi.json](mdc:openapi.json)** - API documentation (373KB, 8316 lines) +- **[openapi.yaml](mdc:openapi.yaml)** - YAML format documentation (184KB, 5579 lines) + +### Documentation Generation +```php +// Swagger/OpenAPI annotations +/** + * @OA\Get( + * path="/api/v1/applications", + * summary="List applications", + * tags={"Applications"}, + * security={{"bearerAuth":{}}}, + * @OA\Response( + * response=200, + * description="List of applications", + * @OA\JsonContent(type="array", @OA\Items(ref="#/components/schemas/Application")) + * ) + * ) + */ +``` + +## Error Handling + +### API Error Responses +```php +// Standardized error response format +class ApiExceptionHandler +{ + public function render($request, Throwable $exception) + { + if ($request->expectsJson()) { + return response()->json([ + 'message' => $exception->getMessage(), + 'error_code' => $this->getErrorCode($exception), + 'timestamp' => now()->toISOString() + ], $this->getStatusCode($exception)); + } + + return parent::render($request, $exception); + } +} +``` + +### Validation Error Handling +```php +// Form request validation +class StoreApplicationRequest extends FormRequest +{ + public function rules() + { + return [ + 'name' => 'required|string|max:255', + 'git_repository' => 'required|url', + 'git_branch' => 'required|string', + 'server_id' => 'required|exists:servers,id', + 'environment_id' => 'required|exists:environments,id' + ]; + } + + public function failedValidation(Validator $validator) + { + throw new HttpResponseException( + response()->json([ + 'message' => 'Validation failed', + 'errors' => $validator->errors() + ], 422) + ); + } +} +``` + +## Real-Time API Integration + +### WebSocket Events +```php +// Broadcasting deployment events +class DeploymentStarted implements ShouldBroadcast +{ + public $application; + public $deployment; + + public function broadcastOn() + { + return [ + new PrivateChannel("application.{$this->application->id}"), + new PrivateChannel("team.{$this->application->team->id}") + ]; + } + + public function broadcastWith() + { + return [ + 'deployment_id' => $this->deployment->id, + 'status' => 'started', + 'timestamp' => now() + ]; + } +} +``` + +### API Event Streaming +```php +// Server-Sent Events for real-time updates +Route::get('/api/v1/applications/{application}/events', function (Application $application) { + return response()->stream(function () use ($application) { + while (true) { + $events = $application->getRecentEvents(); + foreach ($events as $event) { + echo "data: " . json_encode($event) . "\n\n"; + } + usleep(1000000); // 1 second + } + }, 200, [ + 'Content-Type' => 'text/event-stream', + 'Cache-Control' => 'no-cache', + ]); +}); +``` diff --git a/.cursor/rules/application-architecture.mdc b/.cursor/rules/application-architecture.mdc new file mode 100644 index 000000000..162c0840f --- /dev/null +++ b/.cursor/rules/application-architecture.mdc @@ -0,0 +1,368 @@ +--- +description: +globs: +alwaysApply: false +--- +# Coolify Application Architecture + +## Laravel Project Structure + +### **Core Application Directory** ([app/](mdc:app)) + +``` +app/ +├── Actions/ # Business logic actions (Action pattern) +├── Console/ # Artisan commands +├── Contracts/ # Interface definitions +├── Data/ # Data Transfer Objects (Spatie Laravel Data) +├── Enums/ # Enumeration classes +├── Events/ # Event classes +├── Exceptions/ # Custom exception classes +├── Helpers/ # Utility helper classes +├── Http/ # HTTP layer (Controllers, Middleware, Requests) +├── Jobs/ # Background job classes +├── Listeners/ # Event listeners +├── Livewire/ # Livewire components (Frontend) +├── Models/ # Eloquent models (Domain entities) +├── Notifications/ # Notification classes +├── Policies/ # Authorization policies +├── Providers/ # Service providers +├── Repositories/ # Repository pattern implementations +├── Services/ # Service layer classes +├── Traits/ # Reusable trait classes +└── View/ # View composers and creators +``` + +## Core Domain Models + +### **Infrastructure Management** + +#### **[Server.php](mdc:app/Models/Server.php)** (46KB, 1343 lines) +- **Purpose**: Physical/virtual server management +- **Key Relationships**: + - `hasMany(Application::class)` - Deployed applications + - `hasMany(StandalonePostgresql::class)` - Database instances + - `belongsTo(Team::class)` - Team ownership +- **Key Features**: + - SSH connection management + - Resource monitoring + - Proxy configuration (Traefik/Caddy) + - Docker daemon interaction + +#### **[Application.php](mdc:app/Models/Application.php)** (74KB, 1734 lines) +- **Purpose**: Application deployment and management +- **Key Relationships**: + - `belongsTo(Server::class)` - Deployment target + - `belongsTo(Environment::class)` - Environment context + - `hasMany(ApplicationDeploymentQueue::class)` - Deployment history +- **Key Features**: + - Git repository integration + - Docker build and deployment + - Environment variable management + - SSL certificate handling + +#### **[Service.php](mdc:app/Models/Service.php)** (58KB, 1325 lines) +- **Purpose**: Multi-container service orchestration +- **Key Relationships**: + - `hasMany(ServiceApplication::class)` - Service components + - `hasMany(ServiceDatabase::class)` - Service databases + - `belongsTo(Environment::class)` - Environment context +- **Key Features**: + - Docker Compose generation + - Service dependency management + - Health check configuration + +### **Team & Project Organization** + +#### **[Team.php](mdc:app/Models/Team.php)** (8.9KB, 308 lines) +- **Purpose**: Multi-tenant team management +- **Key Relationships**: + - `hasMany(User::class)` - Team members + - `hasMany(Project::class)` - Team projects + - `hasMany(Server::class)` - Team servers +- **Key Features**: + - Resource limits and quotas + - Team-based access control + - Subscription management + +#### **[Project.php](mdc:app/Models/Project.php)** (4.3KB, 156 lines) +- **Purpose**: Project organization and grouping +- **Key Relationships**: + - `hasMany(Environment::class)` - Project environments + - `belongsTo(Team::class)` - Team ownership +- **Key Features**: + - Environment isolation + - Resource organization + +#### **[Environment.php](mdc:app/Models/Environment.php)** +- **Purpose**: Environment-specific configuration +- **Key Relationships**: + - `hasMany(Application::class)` - Environment applications + - `hasMany(Service::class)` - Environment services + - `belongsTo(Project::class)` - Project context + +### **Database Management Models** + +#### **Standalone Database Models** +- **[StandalonePostgresql.php](mdc:app/Models/StandalonePostgresql.php)** (11KB, 351 lines) +- **[StandaloneMysql.php](mdc:app/Models/StandaloneMysql.php)** (11KB, 351 lines) +- **[StandaloneMariadb.php](mdc:app/Models/StandaloneMariadb.php)** (10KB, 337 lines) +- **[StandaloneMongodb.php](mdc:app/Models/StandaloneMongodb.php)** (12KB, 370 lines) +- **[StandaloneRedis.php](mdc:app/Models/StandaloneRedis.php)** (12KB, 394 lines) +- **[StandaloneKeydb.php](mdc:app/Models/StandaloneKeydb.php)** (11KB, 347 lines) +- **[StandaloneDragonfly.php](mdc:app/Models/StandaloneDragonfly.php)** (11KB, 347 lines) +- **[StandaloneClickhouse.php](mdc:app/Models/StandaloneClickhouse.php)** (10KB, 336 lines) + +**Common Features**: +- Database configuration management +- Backup scheduling and execution +- Connection string generation +- Health monitoring + +### **Configuration & Settings** + +#### **[EnvironmentVariable.php](mdc:app/Models/EnvironmentVariable.php)** (7.6KB, 219 lines) +- **Purpose**: Application environment variable management +- **Key Features**: + - Encrypted value storage + - Build-time vs runtime variables + - Shared variable inheritance + +#### **[InstanceSettings.php](mdc:app/Models/InstanceSettings.php)** (3.2KB, 124 lines) +- **Purpose**: Global Coolify instance configuration +- **Key Features**: + - FQDN and port configuration + - Auto-update settings + - Security configurations + +## Architectural Patterns + +### **Action Pattern** ([app/Actions/](mdc:app/Actions)) + +Using [lorisleiva/laravel-actions](mdc:composer.json) for business logic encapsulation: + +```php +// Example Action structure +class DeployApplication extends Action +{ + public function handle(Application $application): void + { + // Business logic for deployment + } + + public function asJob(Application $application): void + { + // Queue job implementation + } +} +``` + +**Key Action Categories**: +- **Application/**: Deployment and management actions +- **Database/**: Database operations +- **Server/**: Server management actions +- **Service/**: Service orchestration actions + +### **Repository Pattern** ([app/Repositories/](mdc:app/Repositories)) + +Data access abstraction layer: +- Encapsulates database queries +- Provides testable data layer +- Abstracts complex query logic + +### **Service Layer** ([app/Services/](mdc:app/Services)) + +Business logic services: +- External API integrations +- Complex business operations +- Cross-cutting concerns + +## Data Flow Architecture + +### **Request Lifecycle** + +1. **HTTP Request** → [routes/web.php](mdc:routes/web.php) +2. **Middleware** → Authentication, authorization +3. **Livewire Component** → [app/Livewire/](mdc:app/Livewire) +4. **Action/Service** → Business logic execution +5. **Model/Repository** → Data persistence +6. **Response** → Livewire reactive update + +### **Background Processing** + +1. **Job Dispatch** → Queue system (Redis) +2. **Job Processing** → [app/Jobs/](mdc:app/Jobs) +3. **Action Execution** → Business logic +4. **Event Broadcasting** → Real-time updates +5. **Notification** → User feedback + +## Security Architecture + +### **Multi-Tenant Isolation** + +```php +// Team-based query scoping +class Application extends Model +{ + public function scopeOwnedByCurrentTeam($query) + { + return $query->whereHas('environment.project.team', function ($q) { + $q->where('id', currentTeam()->id); + }); + } +} +``` + +### **Authorization Layers** + +1. **Team Membership** → User belongs to team +2. **Resource Ownership** → Resource belongs to team +3. **Policy Authorization** → [app/Policies/](mdc:app/Policies) +4. **Environment Isolation** → Project/environment boundaries + +### **Data Protection** + +- **Environment Variables**: Encrypted at rest +- **SSH Keys**: Secure storage and transmission +- **API Tokens**: Sanctum-based authentication +- **Audit Logging**: [spatie/laravel-activitylog](mdc:composer.json) + +## Configuration Hierarchy + +### **Global Configuration** +- **[InstanceSettings](mdc:app/Models/InstanceSettings.php)**: System-wide settings +- **[config/](mdc:config)**: Laravel configuration files + +### **Team Configuration** +- **[Team](mdc:app/Models/Team.php)**: Team-specific settings +- **[ServerSetting](mdc:app/Models/ServerSetting.php)**: Server configurations + +### **Project Configuration** +- **[ProjectSetting](mdc:app/Models/ProjectSetting.php)**: Project settings +- **[Environment](mdc:app/Models/Environment.php)**: Environment variables + +### **Application Configuration** +- **[ApplicationSetting](mdc:app/Models/ApplicationSetting.php)**: App-specific settings +- **[EnvironmentVariable](mdc:app/Models/EnvironmentVariable.php)**: Runtime configuration + +## Event-Driven Architecture + +### **Event Broadcasting** ([app/Events/](mdc:app/Events)) + +Real-time updates using Laravel Echo and WebSockets: + +```php +// Example event structure +class ApplicationDeploymentStarted implements ShouldBroadcast +{ + public function broadcastOn(): array + { + return [ + new PrivateChannel("team.{$this->application->team->id}"), + ]; + } +} +``` + +### **Event Listeners** ([app/Listeners/](mdc:app/Listeners)) + +- Deployment status updates +- Resource monitoring alerts +- Notification dispatching +- Audit log creation + +## Database Design Patterns + +### **Polymorphic Relationships** + +```php +// Environment variables can belong to multiple resource types +class EnvironmentVariable extends Model +{ + public function resource(): MorphTo + { + return $this->morphTo(); + } +} +``` + +### **Team-Based Soft Scoping** + +All major resources include team-based query scoping: + +```php +// Automatic team filtering +$applications = Application::ownedByCurrentTeam()->get(); +$servers = Server::ownedByCurrentTeam()->get(); +``` + +### **Configuration Inheritance** + +Environment variables cascade from: +1. **Shared Variables** → Team-wide defaults +2. **Project Variables** → Project-specific overrides +3. **Application Variables** → Application-specific values + +## Integration Patterns + +### **Git Provider Integration** + +Abstracted git operations supporting: +- **GitHub**: [app/Models/GithubApp.php](mdc:app/Models/GithubApp.php) +- **GitLab**: [app/Models/GitlabApp.php](mdc:app/Models/GitlabApp.php) +- **Bitbucket**: Webhook integration +- **Gitea**: Self-hosted Git support + +### **Docker Integration** + +- **Container Management**: Direct Docker API communication +- **Image Building**: Dockerfile and Buildpack support +- **Network Management**: Custom Docker networks +- **Volume Management**: Persistent storage handling + +### **SSH Communication** + +- **[phpseclib/phpseclib](mdc:composer.json)**: Secure SSH connections +- **Multiplexing**: Connection pooling for efficiency +- **Key Management**: [PrivateKey](mdc:app/Models/PrivateKey.php) model + +## Testing Architecture + +### **Test Structure** ([tests/](mdc:tests)) + +``` +tests/ +├── Feature/ # Integration tests +├── Unit/ # Unit tests +├── Browser/ # Dusk browser tests +├── Traits/ # Test helper traits +├── Pest.php # Pest configuration +└── TestCase.php # Base test case +``` + +### **Testing Patterns** + +- **Feature Tests**: Full request lifecycle testing +- **Unit Tests**: Individual class/method testing +- **Browser Tests**: End-to-end user workflows +- **Database Testing**: Factories and seeders + +## Performance Considerations + +### **Query Optimization** + +- **Eager Loading**: Prevent N+1 queries +- **Query Scoping**: Team-based filtering +- **Database Indexing**: Optimized for common queries + +### **Caching Strategy** + +- **Redis**: Session and cache storage +- **Model Caching**: Frequently accessed data +- **Query Caching**: Expensive query results + +### **Background Processing** + +- **Queue Workers**: Horizon-managed job processing +- **Job Batching**: Related job grouping +- **Failed Job Handling**: Automatic retry logic diff --git a/.cursor/rules/cursor_rules.mdc b/.cursor/rules/cursor_rules.mdc new file mode 100644 index 000000000..7dfae3de0 --- /dev/null +++ b/.cursor/rules/cursor_rules.mdc @@ -0,0 +1,53 @@ +--- +description: Guidelines for creating and maintaining Cursor rules to ensure consistency and effectiveness. +globs: .cursor/rules/*.mdc +alwaysApply: true +--- + +- **Required Rule Structure:** + ```markdown + --- + description: Clear, one-line description of what the rule enforces + globs: path/to/files/*.ext, other/path/**/* + alwaysApply: boolean + --- + + - **Main Points in Bold** + - Sub-points with details + - Examples and explanations + ``` + +- **File References:** + - Use `[filename](mdc:path/to/file)` ([filename](mdc:filename)) to reference files + - Example: [prisma.mdc](mdc:.cursor/rules/prisma.mdc) for rule references + - Example: [schema.prisma](mdc:prisma/schema.prisma) for code references + +- **Code Examples:** + - Use language-specific code blocks + ```typescript + // ✅ DO: Show good examples + const goodExample = true; + + // ❌ DON'T: Show anti-patterns + const badExample = false; + ``` + +- **Rule Content Guidelines:** + - Start with high-level overview + - Include specific, actionable requirements + - Show examples of correct implementation + - Reference existing code when possible + - Keep rules DRY by referencing other rules + +- **Rule Maintenance:** + - Update rules when new patterns emerge + - Add examples from actual codebase + - Remove outdated patterns + - Cross-reference related rules + +- **Best Practices:** + - Use bullet points for clarity + - Keep descriptions concise + - Include both DO and DON'T examples + - Reference actual code over theoretical examples + - Use consistent formatting across rules \ No newline at end of file diff --git a/.cursor/rules/database-patterns.mdc b/.cursor/rules/database-patterns.mdc new file mode 100644 index 000000000..58934598b --- /dev/null +++ b/.cursor/rules/database-patterns.mdc @@ -0,0 +1,306 @@ +--- +description: +globs: +alwaysApply: false +--- +# Coolify Database Architecture & Patterns + +## Database Strategy + +Coolify uses **PostgreSQL 15** as the primary database with **Redis 7** for caching and real-time features. The architecture supports managing multiple external databases across different servers. + +## Primary Database (PostgreSQL) + +### Core Tables & Models + +#### User & Team Management +- **[User.php](mdc:app/Models/User.php)** - User authentication and profiles +- **[Team.php](mdc:app/Models/Team.php)** - Multi-tenant organization structure +- **[TeamInvitation.php](mdc:app/Models/TeamInvitation.php)** - Team collaboration invitations +- **[PersonalAccessToken.php](mdc:app/Models/PersonalAccessToken.php)** - API token management + +#### Infrastructure Management +- **[Server.php](mdc:app/Models/Server.php)** - Physical/virtual server definitions (46KB, complex) +- **[PrivateKey.php](mdc:app/Models/PrivateKey.php)** - SSH key management +- **[ServerSetting.php](mdc:app/Models/ServerSetting.php)** - Server-specific configurations + +#### Project Organization +- **[Project.php](mdc:app/Models/Project.php)** - Project containers for applications +- **[Environment.php](mdc:app/Models/Environment.php)** - Environment isolation (staging, production, etc.) +- **[ProjectSetting.php](mdc:app/Models/ProjectSetting.php)** - Project-specific settings + +#### Application Deployment +- **[Application.php](mdc:app/Models/Application.php)** - Main application entity (74KB, highly complex) +- **[ApplicationSetting.php](mdc:app/Models/ApplicationSetting.php)** - Application configurations +- **[ApplicationDeploymentQueue.php](mdc:app/Models/ApplicationDeploymentQueue.php)** - Deployment orchestration +- **[ApplicationPreview.php](mdc:app/Models/ApplicationPreview.php)** - Preview environment management + +#### Service Management +- **[Service.php](mdc:app/Models/Service.php)** - Service definitions (58KB, complex) +- **[ServiceApplication.php](mdc:app/Models/ServiceApplication.php)** - Service components +- **[ServiceDatabase.php](mdc:app/Models/ServiceDatabase.php)** - Service-attached databases + +## Database Type Support + +### Standalone Database Models +Each database type has its own dedicated model with specific configurations: + +#### SQL Databases +- **[StandalonePostgresql.php](mdc:app/Models/StandalonePostgresql.php)** - PostgreSQL instances +- **[StandaloneMysql.php](mdc:app/Models/StandaloneMysql.php)** - MySQL instances +- **[StandaloneMariadb.php](mdc:app/Models/StandaloneMariadb.php)** - MariaDB instances + +#### NoSQL & Analytics +- **[StandaloneMongodb.php](mdc:app/Models/StandaloneMongodb.php)** - MongoDB instances +- **[StandaloneClickhouse.php](mdc:app/Models/StandaloneClickhouse.php)** - ClickHouse analytics + +#### Caching & In-Memory +- **[StandaloneRedis.php](mdc:app/Models/StandaloneRedis.php)** - Redis instances +- **[StandaloneKeydb.php](mdc:app/Models/StandaloneKeydb.php)** - KeyDB instances +- **[StandaloneDragonfly.php](mdc:app/Models/StandaloneDragonfly.php)** - Dragonfly instances + +## Configuration Management + +### Environment Variables +- **[EnvironmentVariable.php](mdc:app/Models/EnvironmentVariable.php)** - Application-specific environment variables +- **[SharedEnvironmentVariable.php](mdc:app/Models/SharedEnvironmentVariable.php)** - Shared across applications + +### Settings Hierarchy +- **[InstanceSettings.php](mdc:app/Models/InstanceSettings.php)** - Global Coolify instance settings +- **[ServerSetting.php](mdc:app/Models/ServerSetting.php)** - Server-specific settings +- **[ProjectSetting.php](mdc:app/Models/ProjectSetting.php)** - Project-level settings +- **[ApplicationSetting.php](mdc:app/Models/ApplicationSetting.php)** - Application settings + +## Storage & Backup Systems + +### Storage Management +- **[S3Storage.php](mdc:app/Models/S3Storage.php)** - S3-compatible storage configurations +- **[LocalFileVolume.php](mdc:app/Models/LocalFileVolume.php)** - Local filesystem volumes +- **[LocalPersistentVolume.php](mdc:app/Models/LocalPersistentVolume.php)** - Persistent volume management + +### Backup Infrastructure +- **[ScheduledDatabaseBackup.php](mdc:app/Models/ScheduledDatabaseBackup.php)** - Automated backup scheduling +- **[ScheduledDatabaseBackupExecution.php](mdc:app/Models/ScheduledDatabaseBackupExecution.php)** - Backup execution tracking + +### Task Scheduling +- **[ScheduledTask.php](mdc:app/Models/ScheduledTask.php)** - Cron job management +- **[ScheduledTaskExecution.php](mdc:app/Models/ScheduledTaskExecution.php)** - Task execution history + +## Notification & Integration Models + +### Notification Channels +- **[EmailNotificationSettings.php](mdc:app/Models/EmailNotificationSettings.php)** - Email notifications +- **[DiscordNotificationSettings.php](mdc:app/Models/DiscordNotificationSettings.php)** - Discord integration +- **[SlackNotificationSettings.php](mdc:app/Models/SlackNotificationSettings.php)** - Slack integration +- **[TelegramNotificationSettings.php](mdc:app/Models/TelegramNotificationSettings.php)** - Telegram bot +- **[PushoverNotificationSettings.php](mdc:app/Models/PushoverNotificationSettings.php)** - Pushover notifications + +### Source Control Integration +- **[GithubApp.php](mdc:app/Models/GithubApp.php)** - GitHub App integration +- **[GitlabApp.php](mdc:app/Models/GitlabApp.php)** - GitLab integration + +### OAuth & Authentication +- **[OauthSetting.php](mdc:app/Models/OauthSetting.php)** - OAuth provider configurations + +## Docker & Container Management + +### Container Orchestration +- **[StandaloneDocker.php](mdc:app/Models/StandaloneDocker.php)** - Standalone Docker containers +- **[SwarmDocker.php](mdc:app/Models/SwarmDocker.php)** - Docker Swarm management + +### SSL & Security +- **[SslCertificate.php](mdc:app/Models/SslCertificate.php)** - SSL certificate management + +## Database Migration Strategy + +### Migration Location: [database/migrations/](mdc:database/migrations) + +#### Migration Patterns +```php +// Typical Coolify migration structure +Schema::create('applications', function (Blueprint $table) { + $table->id(); + $table->string('name'); + $table->string('fqdn')->nullable(); + $table->json('environment_variables')->nullable(); + $table->foreignId('destination_id'); + $table->foreignId('source_id'); + $table->timestamps(); +}); +``` + +### Schema Versioning +- **Incremental migrations** for database evolution +- **Data migrations** for complex transformations +- **Rollback support** for deployment safety + +## Eloquent Model Patterns + +### Base Model Structure +- **[BaseModel.php](mdc:app/Models/BaseModel.php)** - Common model functionality +- **UUID primary keys** for distributed systems +- **Soft deletes** for audit trails +- **Activity logging** with Spatie package + +### Relationship Patterns +```php +// Typical relationship structure in Application model +class Application extends Model +{ + public function server() + { + return $this->belongsTo(Server::class); + } + + public function environment() + { + return $this->belongsTo(Environment::class); + } + + public function deployments() + { + return $this->hasMany(ApplicationDeploymentQueue::class); + } + + public function environmentVariables() + { + return $this->hasMany(EnvironmentVariable::class); + } +} +``` + +### Model Traits +```php +// Common traits used across models +use SoftDeletes; +use LogsActivity; +use HasFactory; +use HasUuids; +``` + +## Caching Strategy (Redis) + +### Cache Usage Patterns +- **Session storage** - User authentication sessions +- **Queue backend** - Background job processing +- **Model caching** - Expensive query results +- **Real-time data** - WebSocket state management + +### Cache Keys Structure +``` +coolify:session:{session_id} +coolify:server:{server_id}:status +coolify:deployment:{deployment_id}:logs +coolify:user:{user_id}:teams +``` + +## Query Optimization Patterns + +### Eager Loading +```php +// Optimized queries with relationships +$applications = Application::with([ + 'server', + 'environment.project', + 'environmentVariables', + 'deployments' => function ($query) { + $query->latest()->limit(5); + } +])->get(); +``` + +### Chunking for Large Datasets +```php +// Processing large datasets efficiently +Server::chunk(100, function ($servers) { + foreach ($servers as $server) { + // Process server monitoring + } +}); +``` + +### Database Indexes +- **Primary keys** on all tables +- **Foreign key indexes** for relationships +- **Composite indexes** for common queries +- **Unique constraints** for business rules + +## Data Consistency Patterns + +### Database Transactions +```php +// Atomic operations for deployment +DB::transaction(function () { + $application = Application::create($data); + $application->environmentVariables()->createMany($envVars); + $application->deployments()->create(['status' => 'queued']); +}); +``` + +### Model Events +```php +// Automatic cleanup on model deletion +class Application extends Model +{ + protected static function booted() + { + static::deleting(function ($application) { + $application->environmentVariables()->delete(); + $application->deployments()->delete(); + }); + } +} +``` + +## Backup & Recovery + +### Database Backup Strategy +- **Automated PostgreSQL backups** via scheduled tasks +- **Point-in-time recovery** capability +- **Cross-region backup** replication +- **Backup verification** and testing + +### Data Export/Import +- **Application configurations** export/import +- **Environment variable** bulk operations +- **Server configurations** backup and restore + +## Performance Monitoring + +### Query Performance +- **Laravel Telescope** for development debugging +- **Slow query logging** in production +- **Database connection** pooling +- **Read replica** support for scaling + +### Metrics Collection +- **Database size** monitoring +- **Connection count** tracking +- **Query execution time** analysis +- **Cache hit rates** monitoring + +## Multi-Tenancy Pattern + +### Team-Based Isolation +```php +// Global scope for team-based filtering +class Application extends Model +{ + protected static function booted() + { + static::addGlobalScope('team', function (Builder $builder) { + if (auth()->user()) { + $builder->whereHas('environment.project', function ($query) { + $query->where('team_id', auth()->user()->currentTeam->id); + }); + } + }); + } +} +``` + +### Data Separation +- **Team-scoped queries** by default +- **Cross-team access** controls +- **Admin access** patterns +- **Data isolation** guarantees diff --git a/.cursor/rules/deployment-architecture.mdc b/.cursor/rules/deployment-architecture.mdc new file mode 100644 index 000000000..5174cbb99 --- /dev/null +++ b/.cursor/rules/deployment-architecture.mdc @@ -0,0 +1,310 @@ +--- +description: +globs: +alwaysApply: false +--- +# Coolify Deployment Architecture + +## Deployment Philosophy + +Coolify orchestrates **Docker-based deployments** across multiple servers with automated configuration generation, zero-downtime deployments, and comprehensive monitoring. + +## Core Deployment Components + +### Deployment Models +- **[Application.php](mdc:app/Models/Application.php)** - Main application entity with deployment configurations +- **[ApplicationDeploymentQueue.php](mdc:app/Models/ApplicationDeploymentQueue.php)** - Deployment job orchestration +- **[Service.php](mdc:app/Models/Service.php)** - Multi-container service definitions +- **[Server.php](mdc:app/Models/Server.php)** - Target deployment infrastructure + +### Infrastructure Management +- **[PrivateKey.php](mdc:app/Models/PrivateKey.php)** - SSH key management for secure server access +- **[StandaloneDocker.php](mdc:app/Models/StandaloneDocker.php)** - Single container deployments +- **[SwarmDocker.php](mdc:app/Models/SwarmDocker.php)** - Docker Swarm orchestration + +## Deployment Workflow + +### 1. Source Code Integration +``` +Git Repository → Webhook → Coolify → Build & Deploy +``` + +#### Source Control Models +- **[GithubApp.php](mdc:app/Models/GithubApp.php)** - GitHub integration and webhooks +- **[GitlabApp.php](mdc:app/Models/GitlabApp.php)** - GitLab CI/CD integration + +#### Deployment Triggers +- **Git push** to configured branches +- **Manual deployment** via UI +- **Scheduled deployments** via cron +- **API-triggered** deployments + +### 2. Build Process +``` +Source Code → Docker Build → Image Registry → Deployment +``` + +#### Build Configurations +- **Dockerfile detection** and custom Dockerfile support +- **Buildpack integration** for framework detection +- **Multi-stage builds** for optimization +- **Cache layer** management for faster builds + +### 3. Deployment Orchestration +``` +Queue Job → Configuration Generation → Container Deployment → Health Checks +``` + +## Deployment Actions + +### Location: [app/Actions/](mdc:app/Actions) + +#### Application Deployment Actions +- **Application/** - Core application deployment logic +- **Docker/** - Docker container management +- **Service/** - Multi-container service orchestration +- **Proxy/** - Reverse proxy configuration + +#### Database Actions +- **Database/** - Database deployment and management +- Automated backup scheduling +- Connection management and health checks + +#### Server Management Actions +- **Server/** - Server provisioning and configuration +- SSH connection establishment +- Docker daemon management + +## Configuration Generation + +### Dynamic Configuration +- **[ConfigurationGenerator.php](mdc:app/Services/ConfigurationGenerator.php)** - Generates deployment configurations +- **[ConfigurationRepository.php](mdc:app/Services/ConfigurationRepository.php)** - Configuration management + +### Generated Configurations +#### Docker Compose Files +```yaml +# Generated docker-compose.yml structure +version: '3.8' +services: + app: + image: ${APP_IMAGE} + environment: + - ${ENV_VARIABLES} + labels: + - traefik.enable=true + - traefik.http.routers.app.rule=Host(`${FQDN}`) + volumes: + - ${VOLUME_MAPPINGS} + networks: + - coolify +``` + +#### Nginx Configurations +- **Reverse proxy** setup +- **SSL termination** with automatic certificates +- **Load balancing** for multiple instances +- **Custom headers** and routing rules + +## Container Orchestration + +### Docker Integration +- **[DockerImageParser.php](mdc:app/Services/DockerImageParser.php)** - Parse and validate Docker images +- **Container lifecycle** management +- **Resource allocation** and limits +- **Network isolation** and communication + +### Volume Management +- **[LocalFileVolume.php](mdc:app/Models/LocalFileVolume.php)** - Persistent file storage +- **[LocalPersistentVolume.php](mdc:app/Models/LocalPersistentVolume.php)** - Data persistence +- **Backup integration** for volume data + +### Network Configuration +- **Custom Docker networks** for isolation +- **Service discovery** between containers +- **Port mapping** and exposure +- **SSL/TLS termination** + +## Environment Management + +### Environment Isolation +- **[Environment.php](mdc:app/Models/Environment.php)** - Development, staging, production environments +- **[EnvironmentVariable.php](mdc:app/Models/EnvironmentVariable.php)** - Application-specific variables +- **[SharedEnvironmentVariable.php](mdc:app/Models/SharedEnvironmentVariable.php)** - Cross-application variables + +### Configuration Hierarchy +``` +Instance Settings → Server Settings → Project Settings → Application Settings +``` + +## Preview Environments + +### Git-Based Previews +- **[ApplicationPreview.php](mdc:app/Models/ApplicationPreview.php)** - Preview environment management +- **Automatic PR/MR previews** for feature branches +- **Isolated environments** for testing +- **Automatic cleanup** after merge/close + +### Preview Workflow +``` +Feature Branch → Auto-Deploy → Preview URL → Review → Cleanup +``` + +## SSL & Security + +### Certificate Management +- **[SslCertificate.php](mdc:app/Models/SslCertificate.php)** - SSL certificate automation +- **Let's Encrypt** integration for free certificates +- **Custom certificate** upload support +- **Automatic renewal** and monitoring + +### Security Patterns +- **Private Docker networks** for container isolation +- **SSH key-based** server authentication +- **Environment variable** encryption +- **Access control** via team permissions + +## Backup & Recovery + +### Database Backups +- **[ScheduledDatabaseBackup.php](mdc:app/Models/ScheduledDatabaseBackup.php)** - Automated database backups +- **[ScheduledDatabaseBackupExecution.php](mdc:app/Models/ScheduledDatabaseBackupExecution.php)** - Backup execution tracking +- **S3-compatible storage** for backup destinations + +### Application Backups +- **Volume snapshots** for persistent data +- **Configuration export** for disaster recovery +- **Cross-region replication** for high availability + +## Monitoring & Logging + +### Real-Time Monitoring +- **[ActivityMonitor.php](mdc:app/Livewire/ActivityMonitor.php)** - Live deployment monitoring +- **WebSocket-based** log streaming +- **Container health checks** and alerts +- **Resource usage** tracking + +### Deployment Logs +- **Build process** logging +- **Container startup** logs +- **Application runtime** logs +- **Error tracking** and alerting + +## Queue System + +### Background Jobs +Location: [app/Jobs/](mdc:app/Jobs) +- **Deployment jobs** for async processing +- **Server monitoring** jobs +- **Backup scheduling** jobs +- **Notification delivery** jobs + +### Queue Processing +- **Redis-backed** job queues +- **Laravel Horizon** for queue monitoring +- **Failed job** retry mechanisms +- **Queue worker** auto-scaling + +## Multi-Server Deployment + +### Server Types +- **Standalone servers** - Single Docker host +- **Docker Swarm** - Multi-node orchestration +- **Remote servers** - SSH-based deployment +- **Local development** - Docker Desktop integration + +### Load Balancing +- **Traefik integration** for automatic load balancing +- **Health check** based routing +- **Blue-green deployments** for zero downtime +- **Rolling updates** with configurable strategies + +## Deployment Strategies + +### Zero-Downtime Deployment +``` +Old Container → New Container Build → Health Check → Traffic Switch → Old Container Cleanup +``` + +### Blue-Green Deployment +- **Parallel environments** for safe deployments +- **Instant rollback** capability +- **Database migration** handling +- **Configuration synchronization** + +### Rolling Updates +- **Gradual instance** replacement +- **Configurable update** strategy +- **Automatic rollback** on failure +- **Health check** validation + +## API Integration + +### Deployment API +Routes: [routes/api.php](mdc:routes/api.php) +- **RESTful endpoints** for deployment management +- **Webhook receivers** for CI/CD integration +- **Status reporting** endpoints +- **Deployment triggering** via API + +### Authentication +- **Laravel Sanctum** API tokens +- **Team-based** access control +- **Rate limiting** for API calls +- **Audit logging** for API usage + +## Error Handling & Recovery + +### Deployment Failure Recovery +- **Automatic rollback** on deployment failure +- **Health check** failure handling +- **Container crash** recovery +- **Resource exhaustion** protection + +### Monitoring & Alerting +- **Failed deployment** notifications +- **Resource threshold** alerts +- **SSL certificate** expiry warnings +- **Backup failure** notifications + +## Performance Optimization + +### Build Optimization +- **Docker layer** caching +- **Multi-stage builds** for smaller images +- **Build artifact** reuse +- **Parallel build** processing + +### Runtime Optimization +- **Container resource** limits +- **Auto-scaling** based on metrics +- **Connection pooling** for databases +- **CDN integration** for static assets + +## Compliance & Governance + +### Audit Trail +- **Deployment history** tracking +- **Configuration changes** logging +- **User action** auditing +- **Resource access** monitoring + +### Backup Compliance +- **Retention policies** for backups +- **Encryption at rest** for sensitive data +- **Cross-region** backup replication +- **Recovery testing** automation + +## Integration Patterns + +### CI/CD Integration +- **GitHub Actions** compatibility +- **GitLab CI** pipeline integration +- **Custom webhook** endpoints +- **Build status** reporting + +### External Services +- **S3-compatible** storage integration +- **External database** connections +- **Third-party monitoring** tools +- **Custom notification** channels diff --git a/.cursor/rules/dev_workflow.mdc b/.cursor/rules/dev_workflow.mdc new file mode 100644 index 000000000..003251d8a --- /dev/null +++ b/.cursor/rules/dev_workflow.mdc @@ -0,0 +1,219 @@ +--- +description: Guide for using Task Master to manage task-driven development workflows +globs: **/* +alwaysApply: true +--- +# Task Master Development Workflow + +This guide outlines the typical process for using Task Master to manage software development projects. + +## Primary Interaction: MCP Server vs. CLI + +Task Master offers two primary ways to interact: + +1. **MCP Server (Recommended for Integrated Tools)**: + - For AI agents and integrated development environments (like Cursor), interacting via the **MCP server is the preferred method**. + - The MCP server exposes Task Master functionality through a set of tools (e.g., `get_tasks`, `add_subtask`). + - This method offers better performance, structured data exchange, and richer error handling compared to CLI parsing. + - Refer to [`mcp.mdc`](mdc:.cursor/rules/mcp.mdc) for details on the MCP architecture and available tools. + - A comprehensive list and description of MCP tools and their corresponding CLI commands can be found in [`taskmaster.mdc`](mdc:.cursor/rules/taskmaster.mdc). + - **Restart the MCP server** if core logic in `scripts/modules` or MCP tool/direct function definitions change. + +2. **`task-master` CLI (For Users & Fallback)**: + - The global `task-master` command provides a user-friendly interface for direct terminal interaction. + - It can also serve as a fallback if the MCP server is inaccessible or a specific function isn't exposed via MCP. + - Install globally with `npm install -g task-master-ai` or use locally via `npx task-master-ai ...`. + - The CLI commands often mirror the MCP tools (e.g., `task-master list` corresponds to `get_tasks`). + - Refer to [`taskmaster.mdc`](mdc:.cursor/rules/taskmaster.mdc) for a detailed command reference. + +## Standard Development Workflow Process + +- Start new projects by running `initialize_project` tool / `task-master init` or `parse_prd` / `task-master parse-prd --input=''` (see [`taskmaster.mdc`](mdc:.cursor/rules/taskmaster.mdc)) to generate initial tasks.json +- Begin coding sessions with `get_tasks` / `task-master list` (see [`taskmaster.mdc`](mdc:.cursor/rules/taskmaster.mdc)) to see current tasks, status, and IDs +- Determine the next task to work on using `next_task` / `task-master next` (see [`taskmaster.mdc`](mdc:.cursor/rules/taskmaster.mdc)). +- Analyze task complexity with `analyze_project_complexity` / `task-master analyze-complexity --research` (see [`taskmaster.mdc`](mdc:.cursor/rules/taskmaster.mdc)) before breaking down tasks +- Review complexity report using `complexity_report` / `task-master complexity-report` (see [`taskmaster.mdc`](mdc:.cursor/rules/taskmaster.mdc)). +- Select tasks based on dependencies (all marked 'done'), priority level, and ID order +- Clarify tasks by checking task files in tasks/ directory or asking for user input +- View specific task details using `get_task` / `task-master show ` (see [`taskmaster.mdc`](mdc:.cursor/rules/taskmaster.mdc)) to understand implementation requirements +- Break down complex tasks using `expand_task` / `task-master expand --id= --force --research` (see [`taskmaster.mdc`](mdc:.cursor/rules/taskmaster.mdc)) with appropriate flags like `--force` (to replace existing subtasks) and `--research`. +- Clear existing subtasks if needed using `clear_subtasks` / `task-master clear-subtasks --id=` (see [`taskmaster.mdc`](mdc:.cursor/rules/taskmaster.mdc)) before regenerating +- Implement code following task details, dependencies, and project standards +- Verify tasks according to test strategies before marking as complete (See [`tests.mdc`](mdc:.cursor/rules/tests.mdc)) +- Mark completed tasks with `set_task_status` / `task-master set-status --id= --status=done` (see [`taskmaster.mdc`](mdc:.cursor/rules/taskmaster.mdc)) +- Update dependent tasks when implementation differs from original plan using `update` / `task-master update --from= --prompt="..."` or `update_task` / `task-master update-task --id= --prompt="..."` (see [`taskmaster.mdc`](mdc:.cursor/rules/taskmaster.mdc)) +- Add new tasks discovered during implementation using `add_task` / `task-master add-task --prompt="..." --research` (see [`taskmaster.mdc`](mdc:.cursor/rules/taskmaster.mdc)). +- Add new subtasks as needed using `add_subtask` / `task-master add-subtask --parent= --title="..."` (see [`taskmaster.mdc`](mdc:.cursor/rules/taskmaster.mdc)). +- Append notes or details to subtasks using `update_subtask` / `task-master update-subtask --id= --prompt='Add implementation notes here...\nMore details...'` (see [`taskmaster.mdc`](mdc:.cursor/rules/taskmaster.mdc)). +- Generate task files with `generate` / `task-master generate` (see [`taskmaster.mdc`](mdc:.cursor/rules/taskmaster.mdc)) after updating tasks.json +- Maintain valid dependency structure with `add_dependency`/`remove_dependency` tools or `task-master add-dependency`/`remove-dependency` commands, `validate_dependencies` / `task-master validate-dependencies`, and `fix_dependencies` / `task-master fix-dependencies` (see [`taskmaster.mdc`](mdc:.cursor/rules/taskmaster.mdc)) when needed +- Respect dependency chains and task priorities when selecting work +- Report progress regularly using `get_tasks` / `task-master list` + +## Task Complexity Analysis + +- Run `analyze_project_complexity` / `task-master analyze-complexity --research` (see [`taskmaster.mdc`](mdc:.cursor/rules/taskmaster.mdc)) for comprehensive analysis +- Review complexity report via `complexity_report` / `task-master complexity-report` (see [`taskmaster.mdc`](mdc:.cursor/rules/taskmaster.mdc)) for a formatted, readable version. +- Focus on tasks with highest complexity scores (8-10) for detailed breakdown +- Use analysis results to determine appropriate subtask allocation +- Note that reports are automatically used by the `expand_task` tool/command + +## Task Breakdown Process + +- Use `expand_task` / `task-master expand --id=`. It automatically uses the complexity report if found, otherwise generates default number of subtasks. +- Use `--num=` to specify an explicit number of subtasks, overriding defaults or complexity report recommendations. +- Add `--research` flag to leverage Perplexity AI for research-backed expansion. +- Add `--force` flag to clear existing subtasks before generating new ones (default is to append). +- Use `--prompt=""` to provide additional context when needed. +- Review and adjust generated subtasks as necessary. +- Use `expand_all` tool or `task-master expand --all` to expand multiple pending tasks at once, respecting flags like `--force` and `--research`. +- If subtasks need complete replacement (regardless of the `--force` flag on `expand`), clear them first with `clear_subtasks` / `task-master clear-subtasks --id=`. + +## Implementation Drift Handling + +- When implementation differs significantly from planned approach +- When future tasks need modification due to current implementation choices +- When new dependencies or requirements emerge +- Use `update` / `task-master update --from= --prompt='\nUpdate context...' --research` to update multiple future tasks. +- Use `update_task` / `task-master update-task --id= --prompt='\nUpdate context...' --research` to update a single specific task. + +## Task Status Management + +- Use 'pending' for tasks ready to be worked on +- Use 'done' for completed and verified tasks +- Use 'deferred' for postponed tasks +- Add custom status values as needed for project-specific workflows + +## Task Structure Fields + +- **id**: Unique identifier for the task (Example: `1`, `1.1`) +- **title**: Brief, descriptive title (Example: `"Initialize Repo"`) +- **description**: Concise summary of what the task involves (Example: `"Create a new repository, set up initial structure."`) +- **status**: Current state of the task (Example: `"pending"`, `"done"`, `"deferred"`) +- **dependencies**: IDs of prerequisite tasks (Example: `[1, 2.1]`) + - Dependencies are displayed with status indicators (✅ for completed, ⏱️ for pending) + - This helps quickly identify which prerequisite tasks are blocking work +- **priority**: Importance level (Example: `"high"`, `"medium"`, `"low"`) +- **details**: In-depth implementation instructions (Example: `"Use GitHub client ID/secret, handle callback, set session token."`) +- **testStrategy**: Verification approach (Example: `"Deploy and call endpoint to confirm 'Hello World' response."`) +- **subtasks**: List of smaller, more specific tasks (Example: `[{"id": 1, "title": "Configure OAuth", ...}]`) +- Refer to task structure details (previously linked to `tasks.mdc`). + +## Configuration Management (Updated) + +Taskmaster configuration is managed through two main mechanisms: + +1. **`.taskmasterconfig` File (Primary):** + * Located in the project root directory. + * Stores most configuration settings: AI model selections (main, research, fallback), parameters (max tokens, temperature), logging level, default subtasks/priority, project name, etc. + * **Managed via `task-master models --setup` command.** Do not edit manually unless you know what you are doing. + * **View/Set specific models via `task-master models` command or `models` MCP tool.** + * Created automatically when you run `task-master models --setup` for the first time. + +2. **Environment Variables (`.env` / `mcp.json`):** + * Used **only** for sensitive API keys and specific endpoint URLs. + * Place API keys (one per provider) in a `.env` file in the project root for CLI usage. + * For MCP/Cursor integration, configure these keys in the `env` section of `.cursor/mcp.json`. + * Available keys/variables: See `assets/env.example` or the Configuration section in the command reference (previously linked to `taskmaster.mdc`). + +**Important:** Non-API key settings (like model selections, `MAX_TOKENS`, `TASKMASTER_LOG_LEVEL`) are **no longer configured via environment variables**. Use the `task-master models` command (or `--setup` for interactive configuration) or the `models` MCP tool. +**If AI commands FAIL in MCP** verify that the API key for the selected provider is present in the `env` section of `.cursor/mcp.json`. +**If AI commands FAIL in CLI** verify that the API key for the selected provider is present in the `.env` file in the root of the project. + +## Determining the Next Task + +- Run `next_task` / `task-master next` to show the next task to work on. +- The command identifies tasks with all dependencies satisfied +- Tasks are prioritized by priority level, dependency count, and ID +- The command shows comprehensive task information including: + - Basic task details and description + - Implementation details + - Subtasks (if they exist) + - Contextual suggested actions +- Recommended before starting any new development work +- Respects your project's dependency structure +- Ensures tasks are completed in the appropriate sequence +- Provides ready-to-use commands for common task actions + +## Viewing Specific Task Details + +- Run `get_task` / `task-master show ` to view a specific task. +- Use dot notation for subtasks: `task-master show 1.2` (shows subtask 2 of task 1) +- Displays comprehensive information similar to the next command, but for a specific task +- For parent tasks, shows all subtasks and their current status +- For subtasks, shows parent task information and relationship +- Provides contextual suggested actions appropriate for the specific task +- Useful for examining task details before implementation or checking status + +## Managing Task Dependencies + +- Use `add_dependency` / `task-master add-dependency --id= --depends-on=` to add a dependency. +- Use `remove_dependency` / `task-master remove-dependency --id= --depends-on=` to remove a dependency. +- The system prevents circular dependencies and duplicate dependency entries +- Dependencies are checked for existence before being added or removed +- Task files are automatically regenerated after dependency changes +- Dependencies are visualized with status indicators in task listings and files + +## Iterative Subtask Implementation + +Once a task has been broken down into subtasks using `expand_task` or similar methods, follow this iterative process for implementation: + +1. **Understand the Goal (Preparation):** + * Use `get_task` / `task-master show ` (see [`taskmaster.mdc`](mdc:.cursor/rules/taskmaster.mdc)) to thoroughly understand the specific goals and requirements of the subtask. + +2. **Initial Exploration & Planning (Iteration 1):** + * This is the first attempt at creating a concrete implementation plan. + * Explore the codebase to identify the precise files, functions, and even specific lines of code that will need modification. + * Determine the intended code changes (diffs) and their locations. + * Gather *all* relevant details from this exploration phase. + +3. **Log the Plan:** + * Run `update_subtask` / `task-master update-subtask --id= --prompt=''`. + * Provide the *complete and detailed* findings from the exploration phase in the prompt. Include file paths, line numbers, proposed diffs, reasoning, and any potential challenges identified. Do not omit details. The goal is to create a rich, timestamped log within the subtask's `details`. + +4. **Verify the Plan:** + * Run `get_task` / `task-master show ` again to confirm that the detailed implementation plan has been successfully appended to the subtask's details. + +5. **Begin Implementation:** + * Set the subtask status using `set_task_status` / `task-master set-status --id= --status=in-progress`. + * Start coding based on the logged plan. + +6. **Refine and Log Progress (Iteration 2+):** + * As implementation progresses, you will encounter challenges, discover nuances, or confirm successful approaches. + * **Before appending new information**: Briefly review the *existing* details logged in the subtask (using `get_task` or recalling from context) to ensure the update adds fresh insights and avoids redundancy. + * **Regularly** use `update_subtask` / `task-master update-subtask --id= --prompt='\n- What worked...\n- What didn't work...'` to append new findings. + * **Crucially, log:** + * What worked ("fundamental truths" discovered). + * What didn't work and why (to avoid repeating mistakes). + * Specific code snippets or configurations that were successful. + * Decisions made, especially if confirmed with user input. + * Any deviations from the initial plan and the reasoning. + * The objective is to continuously enrich the subtask's details, creating a log of the implementation journey that helps the AI (and human developers) learn, adapt, and avoid repeating errors. + +7. **Review & Update Rules (Post-Implementation):** + * Once the implementation for the subtask is functionally complete, review all code changes and the relevant chat history. + * Identify any new or modified code patterns, conventions, or best practices established during the implementation. + * Create new or update existing rules following internal guidelines (previously linked to `cursor_rules.mdc` and `self_improve.mdc`). + +8. **Mark Task Complete:** + * After verifying the implementation and updating any necessary rules, mark the subtask as completed: `set_task_status` / `task-master set-status --id= --status=done`. + +9. **Commit Changes (If using Git):** + * Stage the relevant code changes and any updated/new rule files (`git add .`). + * Craft a comprehensive Git commit message summarizing the work done for the subtask, including both code implementation and any rule adjustments. + * Execute the commit command directly in the terminal (e.g., `git commit -m 'feat(module): Implement feature X for subtask \n\n- Details about changes...\n- Updated rule Y for pattern Z'`). + * Consider if a Changeset is needed according to internal versioning guidelines (previously linked to `changeset.mdc`). If so, run `npm run changeset`, stage the generated file, and amend the commit or create a new one. + +10. **Proceed to Next Subtask:** + * Identify the next subtask (e.g., using `next_task` / `task-master next`). + +## Code Analysis & Refactoring Techniques + +- **Top-Level Function Search**: + - Useful for understanding module structure or planning refactors. + - Use grep/ripgrep to find exported functions/constants: + `rg "export (async function|function|const) \w+"` or similar patterns. + - Can help compare functions between files during migrations or identify potential naming conflicts. + +--- +*This workflow provides a general guideline. Adapt it based on your specific project needs and team practices.* \ No newline at end of file diff --git a/.cursor/rules/development-workflow.mdc b/.cursor/rules/development-workflow.mdc new file mode 100644 index 000000000..dd38cbc3f --- /dev/null +++ b/.cursor/rules/development-workflow.mdc @@ -0,0 +1,653 @@ +--- +description: +globs: +alwaysApply: false +--- +# Coolify Development Workflow + +## Development Environment Setup + +### Prerequisites +- **PHP 8.4+** - Latest PHP version for modern features +- **Node.js 18+** - For frontend asset compilation +- **Docker & Docker Compose** - Container orchestration +- **PostgreSQL 15** - Primary database +- **Redis 7** - Caching and queues + +### Local Development Setup + +#### Using Docker (Recommended) +```bash +# Clone the repository +git clone https://github.com/coollabsio/coolify.git +cd coolify + +# Copy environment configuration +cp .env.example .env + +# Start development environment +docker-compose -f docker-compose.dev.yml up -d + +# Install PHP dependencies +docker-compose exec app composer install + +# Install Node.js dependencies +docker-compose exec app npm install + +# Generate application key +docker-compose exec app php artisan key:generate + +# Run database migrations +docker-compose exec app php artisan migrate + +# Seed development data +docker-compose exec app php artisan db:seed +``` + +#### Native Development +```bash +# Install PHP dependencies +composer install + +# Install Node.js dependencies +npm install + +# Setup environment +cp .env.example .env +php artisan key:generate + +# Setup database +createdb coolify_dev +php artisan migrate +php artisan db:seed + +# Start development servers +php artisan serve & +npm run dev & +php artisan queue:work & +``` + +## Development Tools & Configuration + +### Code Quality Tools +- **[Laravel Pint](mdc:pint.json)** - PHP code style fixer +- **[Rector](mdc:rector.php)** - PHP automated refactoring (989B, 35 lines) +- **PHPStan** - Static analysis for type safety +- **ESLint** - JavaScript code quality + +### Development Configuration Files +- **[docker-compose.dev.yml](mdc:docker-compose.dev.yml)** - Development Docker setup (3.4KB, 126 lines) +- **[vite.config.js](mdc:vite.config.js)** - Frontend build configuration (1.0KB, 42 lines) +- **[.editorconfig](mdc:.editorconfig)** - Code formatting standards (258B, 19 lines) + +### Git Configuration +- **[.gitignore](mdc:.gitignore)** - Version control exclusions (522B, 40 lines) +- **[.gitattributes](mdc:.gitattributes)** - Git file handling (185B, 11 lines) + +## Development Workflow Process + +### 1. Feature Development +```bash +# Create feature branch +git checkout -b feature/new-deployment-strategy + +# Make changes following coding standards +# Run code quality checks +./vendor/bin/pint +./vendor/bin/rector process --dry-run +./vendor/bin/phpstan analyse + +# Run tests +./vendor/bin/pest +./vendor/bin/pest --coverage + +# Commit changes +git add . +git commit -m "feat: implement blue-green deployment strategy" +``` + +### 2. Code Review Process +```bash +# Push feature branch +git push origin feature/new-deployment-strategy + +# Create pull request with: +# - Clear description of changes +# - Screenshots for UI changes +# - Test coverage information +# - Breaking change documentation +``` + +### 3. Testing Requirements +- **Unit tests** for new models and services +- **Feature tests** for API endpoints +- **Browser tests** for UI changes +- **Integration tests** for deployment workflows + +## Coding Standards & Conventions + +### PHP Coding Standards +```php +// Follow PSR-12 coding standards +class ApplicationDeploymentService +{ + public function __construct( + private readonly DockerService $dockerService, + private readonly ConfigurationGenerator $configGenerator + ) {} + + public function deploy(Application $application): ApplicationDeploymentQueue + { + return DB::transaction(function () use ($application) { + $deployment = $application->deployments()->create([ + 'status' => 'queued', + 'commit_sha' => $application->getLatestCommitSha(), + ]); + + DeployApplicationJob::dispatch($deployment); + + return $deployment; + }); + } +} +``` + +### Laravel Best Practices +```php +// Use Laravel conventions +class Application extends Model +{ + // Mass assignment protection + protected $fillable = [ + 'name', 'git_repository', 'git_branch', 'fqdn' + ]; + + // Type casting + protected $casts = [ + 'environment_variables' => 'array', + 'build_pack' => BuildPack::class, + 'created_at' => 'datetime', + ]; + + // Relationships + public function server(): BelongsTo + { + return $this->belongsTo(Server::class); + } + + public function deployments(): HasMany + { + return $this->hasMany(ApplicationDeploymentQueue::class); + } +} +``` + +### Frontend Standards +```javascript +// Alpine.js component structure +document.addEventListener('alpine:init', () => { + Alpine.data('deploymentMonitor', () => ({ + status: 'idle', + logs: [], + + init() { + this.connectWebSocket(); + }, + + connectWebSocket() { + Echo.private(`application.${this.applicationId}`) + .listen('DeploymentStarted', (e) => { + this.status = 'deploying'; + }) + .listen('DeploymentCompleted', (e) => { + this.status = 'completed'; + }); + } + })); +}); +``` + +### CSS/Tailwind Standards +```html + +

+``` + +## Database Development + +### Migration Best Practices +```php +// Create descriptive migration files +class CreateApplicationDeploymentQueuesTable extends Migration +{ + public function up(): void + { + Schema::create('application_deployment_queues', function (Blueprint $table) { + $table->id(); + $table->foreignId('application_id')->constrained()->cascadeOnDelete(); + $table->string('status')->default('queued'); + $table->string('commit_sha')->nullable(); + $table->text('build_logs')->nullable(); + $table->text('deployment_logs')->nullable(); + $table->timestamp('started_at')->nullable(); + $table->timestamp('finished_at')->nullable(); + $table->timestamps(); + + $table->index(['application_id', 'status']); + $table->index('created_at'); + }); + } + + public function down(): void + { + Schema::dropIfExists('application_deployment_queues'); + } +} +``` + +### Model Factory Development +```php +// Create comprehensive factories for testing +class ApplicationFactory extends Factory +{ + protected $model = Application::class; + + public function definition(): array + { + return [ + 'name' => $this->faker->words(2, true), + 'fqdn' => $this->faker->domainName, + 'git_repository' => 'https://github.com/' . $this->faker->userName . '/' . $this->faker->word . '.git', + 'git_branch' => 'main', + 'build_pack' => BuildPack::NIXPACKS, + 'server_id' => Server::factory(), + 'environment_id' => Environment::factory(), + ]; + } + + public function withCustomDomain(): static + { + return $this->state(fn (array $attributes) => [ + 'fqdn' => $this->faker->domainName, + ]); + } +} +``` + +## API Development + +### Controller Standards +```php +class ApplicationController extends Controller +{ + public function __construct() + { + $this->middleware('auth:sanctum'); + $this->middleware('team.access'); + } + + public function index(Request $request): AnonymousResourceCollection + { + $applications = $request->user() + ->currentTeam + ->applications() + ->with(['server', 'environment', 'latestDeployment']) + ->paginate(); + + return ApplicationResource::collection($applications); + } + + public function store(StoreApplicationRequest $request): ApplicationResource + { + $application = $request->user() + ->currentTeam + ->applications() + ->create($request->validated()); + + return new ApplicationResource($application); + } + + public function deploy(Application $application): JsonResponse + { + $this->authorize('deploy', $application); + + $deployment = app(ApplicationDeploymentService::class) + ->deploy($application); + + return response()->json([ + 'message' => 'Deployment started successfully', + 'deployment_id' => $deployment->id, + ]); + } +} +``` + +### API Resource Development +```php +class ApplicationResource extends JsonResource +{ + public function toArray($request): array + { + return [ + 'id' => $this->id, + 'name' => $this->name, + 'fqdn' => $this->fqdn, + 'status' => $this->status, + 'git_repository' => $this->git_repository, + 'git_branch' => $this->git_branch, + 'build_pack' => $this->build_pack, + 'created_at' => $this->created_at, + 'updated_at' => $this->updated_at, + + // Conditional relationships + 'server' => new ServerResource($this->whenLoaded('server')), + 'environment' => new EnvironmentResource($this->whenLoaded('environment')), + 'latest_deployment' => new DeploymentResource($this->whenLoaded('latestDeployment')), + + // Computed attributes + 'deployment_url' => $this->getDeploymentUrl(), + 'can_deploy' => $this->canDeploy(), + ]; + } +} +``` + +## Livewire Component Development + +### Component Structure +```php +class ApplicationShow extends Component +{ + public Application $application; + public bool $showLogs = false; + + protected $listeners = [ + 'deployment.started' => 'refreshDeploymentStatus', + 'deployment.completed' => 'refreshDeploymentStatus', + ]; + + public function mount(Application $application): void + { + $this->authorize('view', $application); + $this->application = $application; + } + + public function deploy(): void + { + $this->authorize('deploy', $this->application); + + try { + app(ApplicationDeploymentService::class)->deploy($this->application); + + $this->dispatch('deployment.started', [ + 'application_id' => $this->application->id + ]); + + session()->flash('success', 'Deployment started successfully'); + } catch (Exception $e) { + session()->flash('error', 'Failed to start deployment: ' . $e->getMessage()); + } + } + + public function refreshDeploymentStatus(): void + { + $this->application->refresh(); + } + + public function render(): View + { + return view('livewire.application.show', [ + 'deployments' => $this->application + ->deployments() + ->latest() + ->limit(10) + ->get() + ]); + } +} +``` + +## Queue Job Development + +### Job Structure +```php +class DeployApplicationJob implements ShouldQueue +{ + use Dispatchable, InteractsWithQueue, Queueable, SerializesModels; + + public int $tries = 3; + public int $maxExceptions = 1; + + public function __construct( + public ApplicationDeploymentQueue $deployment + ) {} + + public function handle( + DockerService $dockerService, + ConfigurationGenerator $configGenerator + ): void { + $this->deployment->update(['status' => 'running', 'started_at' => now()]); + + try { + // Generate configuration + $config = $configGenerator->generateDockerCompose($this->deployment->application); + + // Build and deploy + $imageTag = $dockerService->buildImage($this->deployment->application); + $dockerService->deployContainer($this->deployment->application, $imageTag); + + $this->deployment->update([ + 'status' => 'success', + 'finished_at' => now() + ]); + + // Broadcast success + broadcast(new DeploymentCompleted($this->deployment)); + + } catch (Exception $e) { + $this->deployment->update([ + 'status' => 'failed', + 'error_message' => $e->getMessage(), + 'finished_at' => now() + ]); + + broadcast(new DeploymentFailed($this->deployment)); + + throw $e; + } + } + + public function backoff(): array + { + return [1, 5, 10]; + } + + public function failed(Throwable $exception): void + { + $this->deployment->update([ + 'status' => 'failed', + 'error_message' => $exception->getMessage(), + 'finished_at' => now() + ]); + } +} +``` + +## Testing Development + +### Test Structure +```php +// Feature test example +test('user can deploy application via API', function () { + $user = User::factory()->create(); + $application = Application::factory()->create([ + 'team_id' => $user->currentTeam->id + ]); + + // Mock external services + $this->mock(DockerService::class, function ($mock) { + $mock->shouldReceive('buildImage')->andReturn('app:latest'); + $mock->shouldReceive('deployContainer')->andReturn(true); + }); + + $response = $this->actingAs($user) + ->postJson("/api/v1/applications/{$application->id}/deploy"); + + $response->assertStatus(200) + ->assertJson([ + 'message' => 'Deployment started successfully' + ]); + + expect($application->deployments()->count())->toBe(1); + expect($application->deployments()->first()->status)->toBe('queued'); +}); +``` + +## Documentation Standards + +### Code Documentation +```php +/** + * Deploy an application to the specified server. + * + * This method creates a new deployment queue entry and dispatches + * a background job to handle the actual deployment process. + * + * @param Application $application The application to deploy + * @param array $options Additional deployment options + * @return ApplicationDeploymentQueue The created deployment queue entry + * + * @throws DeploymentException When deployment cannot be started + * @throws ServerConnectionException When server is unreachable + */ +public function deploy(Application $application, array $options = []): ApplicationDeploymentQueue +{ + // Implementation +} +``` + +### API Documentation +```php +/** + * @OA\Post( + * path="/api/v1/applications/{application}/deploy", + * summary="Deploy an application", + * description="Triggers a new deployment for the specified application", + * operationId="deployApplication", + * tags={"Applications"}, + * security={{"bearerAuth":{}}}, + * @OA\Parameter( + * name="application", + * in="path", + * required=true, + * @OA\Schema(type="integer"), + * description="Application ID" + * ), + * @OA\Response( + * response=200, + * description="Deployment started successfully", + * @OA\JsonContent( + * @OA\Property(property="message", type="string"), + * @OA\Property(property="deployment_id", type="integer") + * ) + * ) + * ) + */ +``` + +## Performance Optimization + +### Database Optimization +```php +// Use eager loading to prevent N+1 queries +$applications = Application::with([ + 'server:id,name,ip', + 'environment:id,name', + 'latestDeployment:id,application_id,status,created_at' +])->get(); + +// Use database transactions for consistency +DB::transaction(function () use ($application) { + $deployment = $application->deployments()->create(['status' => 'queued']); + $application->update(['last_deployment_at' => now()]); + DeployApplicationJob::dispatch($deployment); +}); +``` + +### Caching Strategies +```php +// Cache expensive operations +public function getServerMetrics(Server $server): array +{ + return Cache::remember( + "server.{$server->id}.metrics", + now()->addMinutes(5), + fn () => $this->fetchServerMetrics($server) + ); +} +``` + +## Deployment & Release Process + +### Version Management +- **[versions.json](mdc:versions.json)** - Version tracking (355B, 19 lines) +- **[CHANGELOG.md](mdc:CHANGELOG.md)** - Release notes (187KB, 7411 lines) +- **[cliff.toml](mdc:cliff.toml)** - Changelog generation (3.2KB, 85 lines) + +### Release Workflow +```bash +# Create release branch +git checkout -b release/v4.1.0 + +# Update version numbers +# Update CHANGELOG.md +# Run full test suite +./vendor/bin/pest +npm run test + +# Create release commit +git commit -m "chore: release v4.1.0" + +# Create and push tag +git tag v4.1.0 +git push origin v4.1.0 + +# Merge to main +git checkout main +git merge release/v4.1.0 +``` + +## Contributing Guidelines + +### Pull Request Process +1. **Fork** the repository +2. **Create** feature branch from `main` +3. **Implement** changes with tests +4. **Run** code quality checks +5. **Submit** pull request with clear description +6. **Address** review feedback +7. **Merge** after approval + +### Code Review Checklist +- [ ] Code follows project standards +- [ ] Tests cover new functionality +- [ ] Documentation is updated +- [ ] No breaking changes without migration +- [ ] Performance impact considered +- [ ] Security implications reviewed + +### Issue Reporting +- Use issue templates +- Provide reproduction steps +- Include environment details +- Add relevant logs/screenshots +- Label appropriately diff --git a/.cursor/rules/frontend-patterns.mdc b/.cursor/rules/frontend-patterns.mdc new file mode 100644 index 000000000..45888eee4 --- /dev/null +++ b/.cursor/rules/frontend-patterns.mdc @@ -0,0 +1,319 @@ +--- +description: +globs: +alwaysApply: false +--- +# Coolify Frontend Architecture & Patterns + +## Frontend Philosophy + +Coolify uses a **server-side first** approach with minimal JavaScript, leveraging Livewire for reactivity and Alpine.js for lightweight client-side interactions. + +## Core Frontend Stack + +### Livewire 3.5+ (Primary Framework) +- **Server-side rendering** with reactive components +- **Real-time updates** without page refreshes +- **State management** handled on the server +- **WebSocket integration** for live updates + +### Alpine.js (Client-Side Interactivity) +- **Lightweight JavaScript** for DOM manipulation +- **Declarative directives** in HTML +- **Component-like behavior** without build steps +- **Perfect companion** to Livewire + +### Tailwind CSS 4.1+ (Styling) +- **Utility-first** CSS framework +- **Custom design system** for deployment platform +- **Responsive design** built-in +- **Dark mode support** + +## Livewire Component Structure + +### Location: [app/Livewire/](mdc:app/Livewire) + +#### Core Application Components +- **[Dashboard.php](mdc:app/Livewire/Dashboard.php)** - Main dashboard interface +- **[ActivityMonitor.php](mdc:app/Livewire/ActivityMonitor.php)** - Real-time activity tracking +- **[MonacoEditor.php](mdc:app/Livewire/MonacoEditor.php)** - Code editor component + +#### Server Management +- **Server/** directory - Server configuration and monitoring +- Real-time server status updates +- SSH connection management +- Resource monitoring + +#### Project & Application Management +- **Project/** directory - Project organization +- Application deployment interfaces +- Environment variable management +- Service configuration + +#### Settings & Configuration +- **Settings/** directory - System configuration +- **[SettingsEmail.php](mdc:app/Livewire/SettingsEmail.php)** - Email notification setup +- **[SettingsOauth.php](mdc:app/Livewire/SettingsOauth.php)** - OAuth provider configuration +- **[SettingsBackup.php](mdc:app/Livewire/SettingsBackup.php)** - Backup configuration + +#### User & Team Management +- **Team/** directory - Team collaboration features +- **Profile/** directory - User profile management +- **Security/** directory - Security settings + +## Blade Template Organization + +### Location: [resources/views/](mdc:resources/views) + +#### Layout Structure +- **layouts/** - Base layout templates +- **components/** - Reusable UI components +- **livewire/** - Livewire component views + +#### Feature-Specific Views +- **server/** - Server management interfaces +- **auth/** - Authentication pages +- **emails/** - Email templates +- **errors/** - Error pages + +## Interactive Components + +### Monaco Editor Integration +- **Code editing** for configuration files +- **Syntax highlighting** for multiple languages +- **Live validation** and error detection +- **Integration** with deployment process + +### Terminal Emulation (XTerm.js) +- **Real-time terminal** access to servers +- **WebSocket-based** communication +- **Multi-session** support +- **Secure connection** through SSH + +### Real-Time Updates +- **WebSocket connections** via Laravel Echo +- **Live deployment logs** streaming +- **Server monitoring** with live metrics +- **Activity notifications** in real-time + +## Alpine.js Patterns + +### Common Directives Used +```html + +
+ + + +``` + +## Tailwind CSS Patterns + +### Design System +- **Consistent spacing** using Tailwind scale +- **Color palette** optimized for deployment platform +- **Typography** hierarchy for technical content +- **Component classes** for reusable elements + +### Responsive Design +```html + +
+ +
+``` + +### Dark Mode Support +```html + +
+ +
+``` + +## Build Process + +### Vite Configuration ([vite.config.js](mdc:vite.config.js)) +- **Fast development** with hot module replacement +- **Optimized production** builds +- **Asset versioning** for cache busting +- **CSS processing** with PostCSS + +### Asset Compilation +```bash +# Development +npm run dev + +# Production build +npm run build +``` + +## State Management Patterns + +### Server-Side State (Livewire) +- **Component properties** for persistent state +- **Session storage** for user preferences +- **Database models** for application state +- **Cache layer** for performance + +### Client-Side State (Alpine.js) +- **Local component state** for UI interactions +- **Form validation** and user feedback +- **Modal and dropdown** state management +- **Temporary UI states** (loading, hover, etc.) + +## Real-Time Features + +### WebSocket Integration +```php +// Livewire component with real-time updates +class ActivityMonitor extends Component +{ + public function getListeners() + { + return [ + 'deployment.started' => 'refresh', + 'deployment.finished' => 'refresh', + 'server.status.changed' => 'updateServerStatus', + ]; + } +} +``` + +### Event Broadcasting +- **Laravel Echo** for client-side WebSocket handling +- **Pusher protocol** for real-time communication +- **Private channels** for user-specific events +- **Presence channels** for collaborative features + +## Performance Patterns + +### Lazy Loading +```php +// Livewire lazy loading +class ServerList extends Component +{ + public function placeholder() + { + return view('components.loading-skeleton'); + } +} +``` + +### Caching Strategies +- **Fragment caching** for expensive operations +- **Image optimization** with lazy loading +- **Asset bundling** and compression +- **CDN integration** for static assets + +## Form Handling Patterns + +### Livewire Forms +```php +class ServerCreateForm extends Component +{ + public $name; + public $ip; + + protected $rules = [ + 'name' => 'required|min:3', + 'ip' => 'required|ip', + ]; + + public function save() + { + $this->validate(); + // Save logic + } +} +``` + +### Real-Time Validation +- **Live validation** as user types +- **Server-side validation** rules +- **Error message** display +- **Success feedback** patterns + +## Component Communication + +### Parent-Child Communication +```php +// Parent component +$this->emit('serverCreated', $server->id); + +// Child component +protected $listeners = ['serverCreated' => 'refresh']; +``` + +### Cross-Component Events +- **Global events** for application-wide updates +- **Scoped events** for feature-specific communication +- **Browser events** for JavaScript integration + +## Error Handling & UX + +### Loading States +- **Skeleton screens** during data loading +- **Progress indicators** for long operations +- **Optimistic updates** with rollback capability + +### Error Display +- **Toast notifications** for user feedback +- **Inline validation** errors +- **Global error** handling +- **Retry mechanisms** for failed operations + +## Accessibility Patterns + +### ARIA Labels and Roles +```html + +``` + +### Keyboard Navigation +- **Tab order** management +- **Keyboard shortcuts** for power users +- **Focus management** in modals and forms +- **Screen reader** compatibility + +## Mobile Optimization + +### Touch-Friendly Interface +- **Larger tap targets** for mobile devices +- **Swipe gestures** where appropriate +- **Mobile-optimized** forms and navigation + +### Progressive Enhancement +- **Core functionality** works without JavaScript +- **Enhanced experience** with JavaScript enabled +- **Offline capabilities** where possible diff --git a/.cursor/rules/project-overview.mdc b/.cursor/rules/project-overview.mdc new file mode 100644 index 000000000..2be9f31e6 --- /dev/null +++ b/.cursor/rules/project-overview.mdc @@ -0,0 +1,161 @@ +--- +description: +globs: +alwaysApply: false +--- +# Coolify Project Overview + +## What is Coolify? + +Coolify is an **open-source & self-hostable alternative to Heroku / Netlify / Vercel**. It's a comprehensive deployment platform that helps you manage servers, applications, and databases on your own hardware with just an SSH connection. + +## Core Mission + +**"Imagine having the ease of a cloud but with your own servers. That is Coolify."** + +- **No vendor lock-in** - All configurations saved to your servers +- **Self-hosted** - Complete control over your infrastructure +- **SSH-only requirement** - Works with VPS, Bare Metal, Raspberry PIs, anything +- **Docker-first** - Container-based deployment architecture + +## Key Features + +### 🚀 **Application Deployment** +- Git-based deployments (GitHub, GitLab, Bitbucket, Gitea) +- Docker & Docker Compose support +- Preview deployments for pull requests +- Zero-downtime deployments +- Build cache optimization + +### 🖥️ **Server Management** +- Multi-server orchestration +- Real-time monitoring and logs +- SSH key management +- Proxy configuration (Traefik/Caddy) +- Resource usage tracking + +### 🗄️ **Database Management** +- PostgreSQL, MySQL, MariaDB, MongoDB +- Redis, KeyDB, Dragonfly, ClickHouse +- Automated backups with S3 integration +- Database clustering support + +### 🔧 **Infrastructure as Code** +- Docker Compose generation +- Environment variable management +- SSL certificate automation +- Custom domain configuration + +### 👥 **Team Collaboration** +- Multi-tenant team organization +- Role-based access control +- Project and environment isolation +- Team-wide resource sharing + +### 📊 **Monitoring & Observability** +- Real-time application logs +- Server resource monitoring +- Deployment status tracking +- Webhook integrations +- Notification systems (Email, Discord, Slack, Telegram) + +## Target Users + +### **DevOps Engineers** +- Infrastructure automation +- Multi-environment management +- CI/CD pipeline integration + +### **Developers** +- Easy application deployment +- Development environment provisioning +- Preview deployments for testing + +### **Small to Medium Businesses** +- Cost-effective Heroku alternative +- Self-hosted control and privacy +- Scalable infrastructure management + +### **Agencies & Consultants** +- Client project isolation +- Multi-tenant management +- White-label deployment solutions + +## Business Model + +### **Open Source (Free)** +- Complete feature set +- Self-hosted deployment +- Community support +- No feature restrictions + +### **Cloud Version (Paid)** +- Managed Coolify instance +- High availability +- Premium support +- Email notifications included +- Same price as self-hosted server (~$4-5/month) + +## Architecture Philosophy + +### **Server-Side First** +- Laravel backend with Livewire frontend +- Minimal JavaScript footprint +- Real-time updates via WebSockets +- Progressive enhancement approach + +### **Docker-Native** +- Container-first deployment strategy +- Docker Compose orchestration +- Image building and registry integration +- Volume and network management + +### **Security-Focused** +- SSH-based server communication +- Environment variable encryption +- Team-based access isolation +- Audit logging and activity tracking + +## Project Structure + +``` +coolify/ +├── app/ # Laravel application core +│ ├── Models/ # Domain models (Application, Server, Service) +│ ├── Livewire/ # Frontend components +│ ├── Actions/ # Business logic actions +│ └── Jobs/ # Background job processing +├── resources/ # Frontend assets and views +├── database/ # Migrations and seeders +├── docker/ # Docker configuration +├── scripts/ # Installation and utility scripts +└── tests/ # Test suites (Pest, Dusk) +``` + +## Key Differentiators + +### **vs. Heroku** +- ✅ Self-hosted (no vendor lock-in) +- ✅ Multi-server support +- ✅ No usage-based pricing +- ✅ Full infrastructure control + +### **vs. Vercel/Netlify** +- ✅ Backend application support +- ✅ Database management included +- ✅ Multi-environment workflows +- ✅ Custom server infrastructure + +### **vs. Docker Swarm/Kubernetes** +- ✅ User-friendly web interface +- ✅ Git-based deployment workflows +- ✅ Integrated monitoring and logging +- ✅ No complex YAML configuration + +## Development Principles + +- **Simplicity over complexity** +- **Convention over configuration** +- **Security by default** +- **Developer experience focused** +- **Community-driven development** diff --git a/.cursor/rules/security-patterns.mdc b/.cursor/rules/security-patterns.mdc new file mode 100644 index 000000000..8cc125dce --- /dev/null +++ b/.cursor/rules/security-patterns.mdc @@ -0,0 +1,784 @@ +--- +description: +globs: +alwaysApply: false +--- +# Coolify Security Architecture & Patterns + +## Security Philosophy + +Coolify implements **defense-in-depth security** with multiple layers of protection including authentication, authorization, encryption, network isolation, and secure deployment practices. + +## Authentication Architecture + +### Multi-Provider Authentication +- **[Laravel Fortify](mdc:config/fortify.php)** - Core authentication scaffolding (4.9KB, 149 lines) +- **[Laravel Sanctum](mdc:config/sanctum.php)** - API token authentication (2.4KB, 69 lines) +- **[Laravel Socialite](mdc:config/services.php)** - OAuth provider integration + +### OAuth Integration +- **[OauthSetting.php](mdc:app/Models/OauthSetting.php)** - OAuth provider configurations +- **Supported Providers**: + - Google OAuth + - Microsoft Azure AD + - Authentik + - GitHub (via GitHub Apps) + - GitLab + +### Authentication Models +```php +// User authentication with team-based access +class User extends Authenticatable +{ + use HasApiTokens, HasFactory, Notifiable; + + protected $fillable = [ + 'name', 'email', 'password' + ]; + + protected $hidden = [ + 'password', 'remember_token' + ]; + + protected $casts = [ + 'email_verified_at' => 'datetime', + 'password' => 'hashed', + ]; + + public function teams(): BelongsToMany + { + return $this->belongsToMany(Team::class) + ->withPivot('role') + ->withTimestamps(); + } + + public function currentTeam(): BelongsTo + { + return $this->belongsTo(Team::class, 'current_team_id'); + } +} +``` + +## Authorization & Access Control + +### Team-Based Multi-Tenancy +- **[Team.php](mdc:app/Models/Team.php)** - Multi-tenant organization structure (8.9KB, 308 lines) +- **[TeamInvitation.php](mdc:app/Models/TeamInvitation.php)** - Secure team collaboration +- **Role-based permissions** within teams +- **Resource isolation** by team ownership + +### Authorization Patterns +```php +// Team-scoped authorization middleware +class EnsureTeamAccess +{ + public function handle(Request $request, Closure $next): Response + { + $user = $request->user(); + $teamId = $request->route('team'); + + if (!$user->teams->contains('id', $teamId)) { + abort(403, 'Access denied to team resources'); + } + + // Set current team context + $user->switchTeam($teamId); + + return $next($request); + } +} + +// Resource-level authorization policies +class ApplicationPolicy +{ + public function view(User $user, Application $application): bool + { + return $user->teams->contains('id', $application->team_id); + } + + public function deploy(User $user, Application $application): bool + { + return $this->view($user, $application) && + $user->hasTeamPermission($application->team_id, 'deploy'); + } + + public function delete(User $user, Application $application): bool + { + return $this->view($user, $application) && + $user->hasTeamRole($application->team_id, 'admin'); + } +} +``` + +### Global Scopes for Data Isolation +```php +// Automatic team-based filtering +class Application extends Model +{ + protected static function booted(): void + { + static::addGlobalScope('team', function (Builder $builder) { + if (auth()->check() && auth()->user()->currentTeam) { + $builder->whereHas('environment.project', function ($query) { + $query->where('team_id', auth()->user()->currentTeam->id); + }); + } + }); + } +} +``` + +## API Security + +### Token-Based Authentication +```php +// Sanctum API token management +class PersonalAccessToken extends Model +{ + protected $fillable = [ + 'name', 'token', 'abilities', 'expires_at' + ]; + + protected $casts = [ + 'abilities' => 'array', + 'expires_at' => 'datetime', + 'last_used_at' => 'datetime', + ]; + + public function tokenable(): MorphTo + { + return $this->morphTo(); + } + + public function hasAbility(string $ability): bool + { + return in_array('*', $this->abilities) || + in_array($ability, $this->abilities); + } +} +``` + +### API Rate Limiting +```php +// Rate limiting configuration +RateLimiter::for('api', function (Request $request) { + return Limit::perMinute(60)->by($request->user()?->id ?: $request->ip()); +}); + +RateLimiter::for('deployments', function (Request $request) { + return Limit::perMinute(10)->by($request->user()->id); +}); + +RateLimiter::for('webhooks', function (Request $request) { + return Limit::perMinute(100)->by($request->ip()); +}); +``` + +### API Input Validation +```php +// Comprehensive input validation +class StoreApplicationRequest extends FormRequest +{ + public function authorize(): bool + { + return $this->user()->can('create', Application::class); + } + + public function rules(): array + { + return [ + 'name' => 'required|string|max:255|regex:/^[a-zA-Z0-9\-_]+$/', + 'git_repository' => 'required|url|starts_with:https://', + 'git_branch' => 'required|string|max:100|regex:/^[a-zA-Z0-9\-_\/]+$/', + 'server_id' => 'required|exists:servers,id', + 'environment_id' => 'required|exists:environments,id', + 'environment_variables' => 'array', + 'environment_variables.*' => 'string|max:1000', + ]; + } + + public function prepareForValidation(): void + { + $this->merge([ + 'name' => strip_tags($this->name), + 'git_repository' => filter_var($this->git_repository, FILTER_SANITIZE_URL), + ]); + } +} +``` + +## SSH Security + +### Private Key Management +- **[PrivateKey.php](mdc:app/Models/PrivateKey.php)** - Secure SSH key storage (6.5KB, 247 lines) +- **Encrypted key storage** in database +- **Key rotation** capabilities +- **Access logging** for key usage + +### SSH Connection Security +```php +class SshConnection +{ + private string $host; + private int $port; + private string $username; + private PrivateKey $privateKey; + + public function __construct(Server $server) + { + $this->host = $server->ip; + $this->port = $server->port; + $this->username = $server->user; + $this->privateKey = $server->privateKey; + } + + public function connect(): bool + { + $connection = ssh2_connect($this->host, $this->port); + + if (!$connection) { + throw new SshConnectionException('Failed to connect to server'); + } + + // Use private key authentication + $privateKeyContent = decrypt($this->privateKey->private_key); + $publicKeyContent = decrypt($this->privateKey->public_key); + + if (!ssh2_auth_pubkey_file($connection, $this->username, $publicKeyContent, $privateKeyContent)) { + throw new SshAuthenticationException('SSH authentication failed'); + } + + return true; + } + + public function execute(string $command): string + { + // Sanitize command to prevent injection + $command = escapeshellcmd($command); + + $stream = ssh2_exec($this->connection, $command); + + if (!$stream) { + throw new SshExecutionException('Failed to execute command'); + } + + return stream_get_contents($stream); + } +} +``` + +## Container Security + +### Docker Security Patterns +```php +class DockerSecurityService +{ + public function createSecureContainer(Application $application): array + { + return [ + 'image' => $this->validateImageName($application->docker_image), + 'user' => '1000:1000', // Non-root user + 'read_only' => true, + 'no_new_privileges' => true, + 'security_opt' => [ + 'no-new-privileges:true', + 'apparmor:docker-default' + ], + 'cap_drop' => ['ALL'], + 'cap_add' => ['CHOWN', 'SETUID', 'SETGID'], // Minimal capabilities + 'tmpfs' => [ + '/tmp' => 'rw,noexec,nosuid,size=100m', + '/var/tmp' => 'rw,noexec,nosuid,size=50m' + ], + 'ulimits' => [ + 'nproc' => 1024, + 'nofile' => 1024 + ] + ]; + } + + private function validateImageName(string $image): string + { + // Validate image name against allowed registries + $allowedRegistries = ['docker.io', 'ghcr.io', 'quay.io']; + + $parser = new DockerImageParser(); + $parsed = $parser->parse($image); + + if (!in_array($parsed['registry'], $allowedRegistries)) { + throw new SecurityException('Image registry not allowed'); + } + + return $image; + } +} +``` + +### Network Isolation +```yaml +# Docker Compose security configuration +version: '3.8' +services: + app: + image: ${APP_IMAGE} + networks: + - app-network + security_opt: + - no-new-privileges:true + - apparmor:docker-default + read_only: true + tmpfs: + - /tmp:rw,noexec,nosuid,size=100m + cap_drop: + - ALL + cap_add: + - CHOWN + - SETUID + - SETGID + +networks: + app-network: + driver: bridge + internal: true + ipam: + config: + - subnet: 172.20.0.0/16 +``` + +## SSL/TLS Security + +### Certificate Management +- **[SslCertificate.php](mdc:app/Models/SslCertificate.php)** - SSL certificate automation +- **Let's Encrypt** integration for free certificates +- **Automatic renewal** and monitoring +- **Custom certificate** upload support + +### SSL Configuration +```php +class SslCertificateService +{ + public function generateCertificate(Application $application): SslCertificate + { + $domains = $this->validateDomains($application->getAllDomains()); + + $certificate = SslCertificate::create([ + 'application_id' => $application->id, + 'domains' => $domains, + 'provider' => 'letsencrypt', + 'status' => 'pending' + ]); + + // Generate certificate using ACME protocol + $acmeClient = new AcmeClient(); + $certData = $acmeClient->generateCertificate($domains); + + $certificate->update([ + 'certificate' => encrypt($certData['certificate']), + 'private_key' => encrypt($certData['private_key']), + 'chain' => encrypt($certData['chain']), + 'expires_at' => $certData['expires_at'], + 'status' => 'active' + ]); + + return $certificate; + } + + private function validateDomains(array $domains): array + { + foreach ($domains as $domain) { + if (!filter_var($domain, FILTER_VALIDATE_DOMAIN)) { + throw new InvalidDomainException("Invalid domain: {$domain}"); + } + + // Check domain ownership + if (!$this->verifyDomainOwnership($domain)) { + throw new DomainOwnershipException("Domain ownership verification failed: {$domain}"); + } + } + + return $domains; + } +} +``` + +## Environment Variable Security + +### Secure Configuration Management +```php +class EnvironmentVariable extends Model +{ + protected $fillable = [ + 'key', 'value', 'is_secret', 'application_id' + ]; + + protected $casts = [ + 'is_secret' => 'boolean', + 'value' => 'encrypted' // Automatic encryption for sensitive values + ]; + + public function setValueAttribute($value): void + { + // Automatically encrypt sensitive environment variables + if ($this->isSensitiveKey($this->key)) { + $this->attributes['value'] = encrypt($value); + $this->attributes['is_secret'] = true; + } else { + $this->attributes['value'] = $value; + } + } + + public function getValueAttribute($value): string + { + if ($this->is_secret) { + return decrypt($value); + } + + return $value; + } + + private function isSensitiveKey(string $key): bool + { + $sensitivePatterns = [ + 'PASSWORD', 'SECRET', 'KEY', 'TOKEN', 'API_KEY', + 'DATABASE_URL', 'REDIS_URL', 'PRIVATE' + ]; + + foreach ($sensitivePatterns as $pattern) { + if (str_contains(strtoupper($key), $pattern)) { + return true; + } + } + + return false; + } +} +``` + +## Webhook Security + +### Webhook Signature Verification +```php +class WebhookSecurityService +{ + public function verifyGitHubSignature(Request $request, string $secret): bool + { + $signature = $request->header('X-Hub-Signature-256'); + + if (!$signature) { + return false; + } + + $expectedSignature = 'sha256=' . hash_hmac('sha256', $request->getContent(), $secret); + + return hash_equals($expectedSignature, $signature); + } + + public function verifyGitLabSignature(Request $request, string $secret): bool + { + $signature = $request->header('X-Gitlab-Token'); + + return hash_equals($secret, $signature); + } + + public function validateWebhookPayload(array $payload): array + { + // Sanitize and validate webhook payload + $validator = Validator::make($payload, [ + 'repository.clone_url' => 'required|url|starts_with:https://', + 'ref' => 'required|string|max:255', + 'head_commit.id' => 'required|string|size:40', // Git SHA + 'head_commit.message' => 'required|string|max:1000' + ]); + + if ($validator->fails()) { + throw new InvalidWebhookPayloadException('Invalid webhook payload'); + } + + return $validator->validated(); + } +} +``` + +## Input Sanitization & Validation + +### XSS Prevention +```php +class SecurityMiddleware +{ + public function handle(Request $request, Closure $next): Response + { + // Sanitize input data + $input = $request->all(); + $sanitized = $this->sanitizeInput($input); + $request->merge($sanitized); + + return $next($request); + } + + private function sanitizeInput(array $input): array + { + foreach ($input as $key => $value) { + if (is_string($value)) { + // Remove potentially dangerous HTML tags + $input[$key] = strip_tags($value, '


'); + + // Escape special characters + $input[$key] = htmlspecialchars($input[$key], ENT_QUOTES, 'UTF-8'); + } elseif (is_array($value)) { + $input[$key] = $this->sanitizeInput($value); + } + } + + return $input; + } +} +``` + +### SQL Injection Prevention +```php +// Always use parameterized queries and Eloquent ORM +class ApplicationRepository +{ + public function findByName(string $name): ?Application + { + // Safe: Uses parameter binding + return Application::where('name', $name)->first(); + } + + public function searchApplications(string $query): Collection + { + // Safe: Eloquent handles escaping + return Application::where('name', 'LIKE', "%{$query}%") + ->orWhere('description', 'LIKE', "%{$query}%") + ->get(); + } + + // NEVER do this - vulnerable to SQL injection + // public function unsafeSearch(string $query): Collection + // { + // return DB::select("SELECT * FROM applications WHERE name LIKE '%{$query}%'"); + // } +} +``` + +## Audit Logging & Monitoring + +### Activity Logging +```php +// Using Spatie Activity Log package +class Application extends Model +{ + use LogsActivity; + + protected static $logAttributes = [ + 'name', 'git_repository', 'git_branch', 'fqdn' + ]; + + protected static $logOnlyDirty = true; + + public function getDescriptionForEvent(string $eventName): string + { + return "Application {$this->name} was {$eventName}"; + } +} + +// Custom security events +class SecurityEventLogger +{ + public function logFailedLogin(string $email, string $ip): void + { + activity('security') + ->withProperties([ + 'email' => $email, + 'ip' => $ip, + 'user_agent' => request()->userAgent() + ]) + ->log('Failed login attempt'); + } + + public function logSuspiciousActivity(User $user, string $activity): void + { + activity('security') + ->causedBy($user) + ->withProperties([ + 'activity' => $activity, + 'ip' => request()->ip(), + 'timestamp' => now() + ]) + ->log('Suspicious activity detected'); + } +} +``` + +### Security Monitoring +```php +class SecurityMonitoringService +{ + public function detectAnomalousActivity(User $user): bool + { + // Check for unusual login patterns + $recentLogins = $user->activities() + ->where('description', 'like', '%login%') + ->where('created_at', '>=', now()->subHours(24)) + ->get(); + + // Multiple failed attempts + $failedAttempts = $recentLogins->where('description', 'Failed login attempt')->count(); + if ($failedAttempts > 5) { + $this->triggerSecurityAlert($user, 'Multiple failed login attempts'); + return true; + } + + // Login from new location + $uniqueIps = $recentLogins->pluck('properties.ip')->unique(); + if ($uniqueIps->count() > 3) { + $this->triggerSecurityAlert($user, 'Login from multiple IP addresses'); + return true; + } + + return false; + } + + private function triggerSecurityAlert(User $user, string $reason): void + { + // Send security notification + $user->notify(new SecurityAlertNotification($reason)); + + // Log security event + activity('security') + ->causedBy($user) + ->withProperties(['reason' => $reason]) + ->log('Security alert triggered'); + } +} +``` + +## Backup Security + +### Encrypted Backups +```php +class SecureBackupService +{ + public function createEncryptedBackup(ScheduledDatabaseBackup $backup): void + { + $database = $backup->database; + $dumpPath = $this->createDatabaseDump($database); + + // Encrypt backup file + $encryptedPath = $this->encryptFile($dumpPath, $backup->encryption_key); + + // Upload to secure storage + $this->uploadToSecureStorage($encryptedPath, $backup->s3Storage); + + // Clean up local files + unlink($dumpPath); + unlink($encryptedPath); + } + + private function encryptFile(string $filePath, string $key): string + { + $data = file_get_contents($filePath); + $encryptedData = encrypt($data, $key); + + $encryptedPath = $filePath . '.encrypted'; + file_put_contents($encryptedPath, $encryptedData); + + return $encryptedPath; + } +} +``` + +## Security Headers & CORS + +### Security Headers Configuration +```php +// Security headers middleware +class SecurityHeadersMiddleware +{ + public function handle(Request $request, Closure $next): Response + { + $response = $next($request); + + $response->headers->set('X-Content-Type-Options', 'nosniff'); + $response->headers->set('X-Frame-Options', 'DENY'); + $response->headers->set('X-XSS-Protection', '1; mode=block'); + $response->headers->set('Referrer-Policy', 'strict-origin-when-cross-origin'); + $response->headers->set('Permissions-Policy', 'geolocation=(), microphone=(), camera=()'); + + if ($request->secure()) { + $response->headers->set('Strict-Transport-Security', 'max-age=31536000; includeSubDomains'); + } + + return $response; + } +} +``` + +### CORS Configuration +```php +// CORS configuration for API endpoints +return [ + 'paths' => ['api/*', 'webhooks/*'], + 'allowed_methods' => ['GET', 'POST', 'PUT', 'PATCH', 'DELETE'], + 'allowed_origins' => [ + 'https://app.coolify.io', + 'https://*.coolify.io' + ], + 'allowed_origins_patterns' => [], + 'allowed_headers' => ['*'], + 'exposed_headers' => [], + 'max_age' => 0, + 'supports_credentials' => true, +]; +``` + +## Security Testing + +### Security Test Patterns +```php +// Security-focused tests +test('prevents SQL injection in search', function () { + $user = User::factory()->create(); + $maliciousInput = "'; DROP TABLE applications; --"; + + $response = $this->actingAs($user) + ->getJson("/api/v1/applications?search={$maliciousInput}"); + + $response->assertStatus(200); + + // Verify applications table still exists + expect(Schema::hasTable('applications'))->toBeTrue(); +}); + +test('prevents XSS in application names', function () { + $user = User::factory()->create(); + $xssPayload = ''; + + $response = $this->actingAs($user) + ->postJson('/api/v1/applications', [ + 'name' => $xssPayload, + 'git_repository' => 'https://github.com/user/repo.git', + 'server_id' => Server::factory()->create()->id + ]); + + $response->assertStatus(422); +}); + +test('enforces team isolation', function () { + $user1 = User::factory()->create(); + $user2 = User::factory()->create(); + + $team1 = Team::factory()->create(); + $team2 = Team::factory()->create(); + + $user1->teams()->attach($team1); + $user2->teams()->attach($team2); + + $application = Application::factory()->create(['team_id' => $team1->id]); + + $response = $this->actingAs($user2) + ->getJson("/api/v1/applications/{$application->id}"); + + $response->assertStatus(403); +}); +``` diff --git a/.cursor/rules/self_improve.mdc b/.cursor/rules/self_improve.mdc new file mode 100644 index 000000000..40b31b6ea --- /dev/null +++ b/.cursor/rules/self_improve.mdc @@ -0,0 +1,72 @@ +--- +description: Guidelines for continuously improving Cursor rules based on emerging code patterns and best practices. +globs: **/* +alwaysApply: true +--- + +- **Rule Improvement Triggers:** + - New code patterns not covered by existing rules + - Repeated similar implementations across files + - Common error patterns that could be prevented + - New libraries or tools being used consistently + - Emerging best practices in the codebase + +- **Analysis Process:** + - Compare new code with existing rules + - Identify patterns that should be standardized + - Look for references to external documentation + - Check for consistent error handling patterns + - Monitor test patterns and coverage + +- **Rule Updates:** + - **Add New Rules When:** + - A new technology/pattern is used in 3+ files + - Common bugs could be prevented by a rule + - Code reviews repeatedly mention the same feedback + - New security or performance patterns emerge + + - **Modify Existing Rules When:** + - Better examples exist in the codebase + - Additional edge cases are discovered + - Related rules have been updated + - Implementation details have changed + +- **Example Pattern Recognition:** + ```typescript + // If you see repeated patterns like: + const data = await prisma.user.findMany({ + select: { id: true, email: true }, + where: { status: 'ACTIVE' } + }); + + // Consider adding to [prisma.mdc](mdc:.cursor/rules/prisma.mdc): + // - Standard select fields + // - Common where conditions + // - Performance optimization patterns + ``` + +- **Rule Quality Checks:** + - Rules should be actionable and specific + - Examples should come from actual code + - References should be up to date + - Patterns should be consistently enforced + +- **Continuous Improvement:** + - Monitor code review comments + - Track common development questions + - Update rules after major refactors + - Add links to relevant documentation + - Cross-reference related rules + +- **Rule Deprecation:** + - Mark outdated patterns as deprecated + - Remove rules that no longer apply + - Update references to deprecated rules + - Document migration paths for old patterns + +- **Documentation Updates:** + - Keep examples synchronized with code + - Update references to external docs + - Maintain links between related rules + - Document breaking changes +Follow [cursor_rules.mdc](mdc:.cursor/rules/cursor_rules.mdc) for proper rule formatting and structure. diff --git a/.cursor/rules/technology-stack.mdc b/.cursor/rules/technology-stack.mdc new file mode 100644 index 000000000..1e894720c --- /dev/null +++ b/.cursor/rules/technology-stack.mdc @@ -0,0 +1,250 @@ +--- +description: +globs: +alwaysApply: false +--- +# Coolify Technology Stack + +## Backend Framework + +### **Laravel 12.4.1** (PHP Framework) +- **Location**: [composer.json](mdc:composer.json) +- **Purpose**: Core application framework +- **Key Features**: + - Eloquent ORM for database interactions + - Artisan CLI for development tasks + - Queue system for background jobs + - Event-driven architecture + +### **PHP 8.4** +- **Requirement**: `^8.4` in [composer.json](mdc:composer.json) +- **Features Used**: + - Typed properties and return types + - Attributes for validation and configuration + - Match expressions + - Constructor property promotion + +## Frontend Stack + +### **Livewire 3.5.20** (Primary Frontend Framework) +- **Purpose**: Server-side rendering with reactive components +- **Location**: [app/Livewire/](mdc:app/Livewire/) +- **Key Components**: + - [Dashboard.php](mdc:app/Livewire/Dashboard.php) - Main interface + - [ActivityMonitor.php](mdc:app/Livewire/ActivityMonitor.php) - Real-time monitoring + - [MonacoEditor.php](mdc:app/Livewire/MonacoEditor.php) - Code editor + +### **Alpine.js** (Client-Side Interactivity) +- **Purpose**: Lightweight JavaScript for DOM manipulation +- **Integration**: Works seamlessly with Livewire components +- **Usage**: Declarative directives in Blade templates + +### **Tailwind CSS 4.1.4** (Styling Framework) +- **Location**: [package.json](mdc:package.json) +- **Configuration**: [postcss.config.cjs](mdc:postcss.config.cjs) +- **Extensions**: + - `@tailwindcss/forms` - Form styling + - `@tailwindcss/typography` - Content typography + - `tailwind-scrollbar` - Custom scrollbars + +### **Vue.js 3.5.13** (Component Framework) +- **Purpose**: Enhanced interactive components +- **Integration**: Used alongside Livewire for complex UI +- **Build Tool**: Vite with Vue plugin + +## Database & Caching + +### **PostgreSQL 15** (Primary Database) +- **Purpose**: Main application data storage +- **Features**: JSONB support, advanced indexing +- **Models**: [app/Models/](mdc:app/Models/) + +### **Redis 7** (Caching & Real-time) +- **Purpose**: + - Session storage + - Queue backend + - Real-time data caching + - WebSocket session management + +### **Supported Databases** (For User Applications) +- **PostgreSQL**: [StandalonePostgresql.php](mdc:app/Models/StandalonePostgresql.php) +- **MySQL**: [StandaloneMysql.php](mdc:app/Models/StandaloneMysql.php) +- **MariaDB**: [StandaloneMariadb.php](mdc:app/Models/StandaloneMariadb.php) +- **MongoDB**: [StandaloneMongodb.php](mdc:app/Models/StandaloneMongodb.php) +- **Redis**: [StandaloneRedis.php](mdc:app/Models/StandaloneRedis.php) +- **KeyDB**: [StandaloneKeydb.php](mdc:app/Models/StandaloneKeydb.php) +- **Dragonfly**: [StandaloneDragonfly.php](mdc:app/Models/StandaloneDragonfly.php) +- **ClickHouse**: [StandaloneClickhouse.php](mdc:app/Models/StandaloneClickhouse.php) + +## Authentication & Security + +### **Laravel Sanctum 4.0.8** +- **Purpose**: API token authentication +- **Usage**: Secure API access for external integrations + +### **Laravel Fortify 1.25.4** +- **Purpose**: Authentication scaffolding +- **Features**: Login, registration, password reset + +### **Laravel Socialite 5.18.0** +- **Purpose**: OAuth provider integration +- **Providers**: + - GitHub, GitLab, Google + - Microsoft Azure, Authentik + - Custom OAuth implementations + +## Background Processing + +### **Laravel Horizon 5.30.3** +- **Purpose**: Queue monitoring and management +- **Features**: Real-time queue metrics, failed job handling + +### **Queue System** +- **Backend**: Redis-based queues +- **Jobs**: [app/Jobs/](mdc:app/Jobs/) +- **Processing**: Background deployment and monitoring tasks + +## Development Tools + +### **Build Tools** +- **Vite 6.2.6**: Modern build tool and dev server +- **Laravel Vite Plugin**: Laravel integration +- **PostCSS**: CSS processing pipeline + +### **Code Quality** +- **Laravel Pint**: PHP code style fixer +- **Rector**: PHP automated refactoring +- **PHPStan**: Static analysis tool + +### **Testing Framework** +- **Pest 3.8.0**: Modern PHP testing framework +- **Laravel Dusk**: Browser automation testing +- **PHPUnit**: Unit testing foundation + +## External Integrations + +### **Git Providers** +- **GitHub**: Repository integration and webhooks +- **GitLab**: Self-hosted and cloud GitLab support +- **Bitbucket**: Atlassian integration +- **Gitea**: Self-hosted Git service + +### **Cloud Storage** +- **AWS S3**: [league/flysystem-aws-s3-v3](mdc:composer.json) +- **SFTP**: [league/flysystem-sftp-v3](mdc:composer.json) +- **Local Storage**: File system integration + +### **Notification Services** +- **Email**: [resend/resend-laravel](mdc:composer.json) +- **Discord**: Custom webhook integration +- **Slack**: Webhook notifications +- **Telegram**: Bot API integration +- **Pushover**: Push notifications + +### **Monitoring & Logging** +- **Sentry**: [sentry/sentry-laravel](mdc:composer.json) - Error tracking +- **Laravel Ray**: [spatie/laravel-ray](mdc:composer.json) - Debug tool +- **Activity Log**: [spatie/laravel-activitylog](mdc:composer.json) + +## DevOps & Infrastructure + +### **Docker & Containerization** +- **Docker**: Container runtime +- **Docker Compose**: Multi-container orchestration +- **Docker Swarm**: Container clustering (optional) + +### **Web Servers & Proxies** +- **Nginx**: Primary web server +- **Traefik**: Reverse proxy and load balancer +- **Caddy**: Alternative reverse proxy + +### **Process Management** +- **S6 Overlay**: Process supervisor +- **Supervisor**: Alternative process manager + +### **SSL/TLS** +- **Let's Encrypt**: Automatic SSL certificates +- **Custom Certificates**: Manual SSL management + +## Terminal & Code Editing + +### **XTerm.js 5.5.0** +- **Purpose**: Web-based terminal emulator +- **Features**: SSH session management, real-time command execution +- **Addons**: Fit addon for responsive terminals + +### **Monaco Editor** +- **Purpose**: Code editor component +- **Features**: Syntax highlighting, auto-completion +- **Integration**: Environment variable editing, configuration files + +## API & Documentation + +### **OpenAPI/Swagger** +- **Documentation**: [openapi.json](mdc:openapi.json) (373KB) +- **Generator**: [zircote/swagger-php](mdc:composer.json) +- **API Routes**: [routes/api.php](mdc:routes/api.php) + +### **WebSocket Communication** +- **Laravel Echo**: Real-time event broadcasting +- **Pusher**: WebSocket service integration +- **Soketi**: Self-hosted WebSocket server + +## Package Management + +### **PHP Dependencies** ([composer.json](mdc:composer.json)) +```json +{ + "require": { + "php": "^8.4", + "laravel/framework": "12.4.1", + "livewire/livewire": "^3.5.20", + "spatie/laravel-data": "^4.13.1", + "lorisleiva/laravel-actions": "^2.8.6" + } +} +``` + +### **JavaScript Dependencies** ([package.json](mdc:package.json)) +```json +{ + "devDependencies": { + "vite": "^6.2.6", + "tailwindcss": "^4.1.4", + "@vitejs/plugin-vue": "5.2.3" + }, + "dependencies": { + "@xterm/xterm": "^5.5.0", + "ioredis": "5.6.0" + } +} +``` + +## Configuration Files + +### **Build Configuration** +- **[vite.config.js](mdc:vite.config.js)**: Frontend build setup +- **[postcss.config.cjs](mdc:postcss.config.cjs)**: CSS processing +- **[rector.php](mdc:rector.php)**: PHP refactoring rules +- **[pint.json](mdc:pint.json)**: Code style configuration + +### **Testing Configuration** +- **[phpunit.xml](mdc:phpunit.xml)**: Unit test configuration +- **[phpunit.dusk.xml](mdc:phpunit.dusk.xml)**: Browser test configuration +- **[tests/Pest.php](mdc:tests/Pest.php)**: Pest testing setup + +## Version Requirements + +### **Minimum Requirements** +- **PHP**: 8.4+ +- **Node.js**: 18+ (for build tools) +- **PostgreSQL**: 15+ +- **Redis**: 7+ +- **Docker**: 20.10+ +- **Docker Compose**: 2.0+ + +### **Recommended Versions** +- **Ubuntu**: 22.04 LTS or 24.04 LTS +- **Memory**: 2GB+ RAM +- **Storage**: 20GB+ available space +- **Network**: Stable internet connection for deployments diff --git a/.cursor/rules/testing-patterns.mdc b/.cursor/rules/testing-patterns.mdc new file mode 100644 index 000000000..c3eabe09f --- /dev/null +++ b/.cursor/rules/testing-patterns.mdc @@ -0,0 +1,606 @@ +--- +description: +globs: +alwaysApply: false +--- +# Coolify Testing Architecture & Patterns + +## Testing Philosophy + +Coolify employs **comprehensive testing strategies** using modern PHP testing frameworks to ensure reliability of deployment operations, infrastructure management, and user interactions. + +## Testing Framework Stack + +### Core Testing Tools +- **Pest PHP 3.8+** - Primary testing framework with expressive syntax +- **Laravel Dusk** - Browser automation and end-to-end testing +- **PHPUnit** - Underlying unit testing framework +- **Mockery** - Mocking and stubbing for isolated tests + +### Testing Configuration +- **[tests/Pest.php](mdc:tests/Pest.php)** - Pest configuration and global setup (1.5KB, 45 lines) +- **[tests/TestCase.php](mdc:tests/TestCase.php)** - Base test case class (163B, 11 lines) +- **[tests/CreatesApplication.php](mdc:tests/CreatesApplication.php)** - Application factory trait (375B, 22 lines) +- **[tests/DuskTestCase.php](mdc:tests/DuskTestCase.php)** - Browser testing setup (1.4KB, 58 lines) + +## Test Directory Structure + +### Test Organization +- **[tests/Feature/](mdc:tests/Feature)** - Feature and integration tests +- **[tests/Unit/](mdc:tests/Unit)** - Unit tests for isolated components +- **[tests/Browser/](mdc:tests/Browser)** - Laravel Dusk browser tests +- **[tests/Traits/](mdc:tests/Traits)** - Shared testing utilities + +## Unit Testing Patterns + +### Model Testing +```php +// Testing Eloquent models +test('application model has correct relationships', function () { + $application = Application::factory()->create(); + + expect($application->server)->toBeInstanceOf(Server::class); + expect($application->environment)->toBeInstanceOf(Environment::class); + expect($application->deployments)->toBeInstanceOf(Collection::class); +}); + +test('application can generate deployment configuration', function () { + $application = Application::factory()->create([ + 'name' => 'test-app', + 'git_repository' => 'https://github.com/user/repo.git' + ]); + + $config = $application->generateDockerCompose(); + + expect($config)->toContain('test-app'); + expect($config)->toContain('image:'); + expect($config)->toContain('networks:'); +}); +``` + +### Service Layer Testing +```php +// Testing service classes +test('configuration generator creates valid docker compose', function () { + $generator = new ConfigurationGenerator(); + $application = Application::factory()->create(); + + $compose = $generator->generateDockerCompose($application); + + expect($compose)->toBeString(); + expect(yaml_parse($compose))->toBeArray(); + expect($compose)->toContain('version: "3.8"'); +}); + +test('docker image parser validates image names', function () { + $parser = new DockerImageParser(); + + expect($parser->isValid('nginx:latest'))->toBeTrue(); + expect($parser->isValid('invalid-image-name'))->toBeFalse(); + expect($parser->parse('nginx:1.21'))->toEqual([ + 'registry' => 'docker.io', + 'namespace' => 'library', + 'repository' => 'nginx', + 'tag' => '1.21' + ]); +}); +``` + +### Action Testing +```php +// Testing Laravel Actions +test('deploy application action creates deployment queue', function () { + $application = Application::factory()->create(); + $action = new DeployApplicationAction(); + + $deployment = $action->handle($application); + + expect($deployment)->toBeInstanceOf(ApplicationDeploymentQueue::class); + expect($deployment->status)->toBe('queued'); + expect($deployment->application_id)->toBe($application->id); +}); + +test('server validation action checks ssh connectivity', function () { + $server = Server::factory()->create([ + 'ip' => '192.168.1.100', + 'port' => 22 + ]); + + $action = new ValidateServerAction(); + + // Mock SSH connection + $this->mock(SshConnection::class, function ($mock) { + $mock->shouldReceive('connect')->andReturn(true); + $mock->shouldReceive('execute')->with('docker --version')->andReturn('Docker version 20.10.0'); + }); + + $result = $action->handle($server); + + expect($result['ssh_connection'])->toBeTrue(); + expect($result['docker_installed'])->toBeTrue(); +}); +``` + +## Feature Testing Patterns + +### API Testing +```php +// Testing API endpoints +test('authenticated user can list applications', function () { + $user = User::factory()->create(); + $team = Team::factory()->create(); + $user->teams()->attach($team); + + $applications = Application::factory(3)->create([ + 'team_id' => $team->id + ]); + + $response = $this->actingAs($user) + ->getJson('/api/v1/applications'); + + $response->assertStatus(200) + ->assertJsonCount(3, 'data') + ->assertJsonStructure([ + 'data' => [ + '*' => ['id', 'name', 'fqdn', 'status', 'created_at'] + ] + ]); +}); + +test('user cannot access applications from other teams', function () { + $user = User::factory()->create(); + $otherTeam = Team::factory()->create(); + + $application = Application::factory()->create([ + 'team_id' => $otherTeam->id + ]); + + $response = $this->actingAs($user) + ->getJson("/api/v1/applications/{$application->id}"); + + $response->assertStatus(403); +}); +``` + +### Deployment Testing +```php +// Testing deployment workflows +test('application deployment creates docker containers', function () { + $application = Application::factory()->create([ + 'git_repository' => 'https://github.com/laravel/laravel.git', + 'git_branch' => 'main' + ]); + + // Mock Docker operations + $this->mock(DockerService::class, function ($mock) { + $mock->shouldReceive('buildImage')->andReturn('app:latest'); + $mock->shouldReceive('createContainer')->andReturn('container_id'); + $mock->shouldReceive('startContainer')->andReturn(true); + }); + + $deployment = $application->deploy(); + + expect($deployment->status)->toBe('queued'); + + // Process the deployment job + $this->artisan('queue:work --once'); + + $deployment->refresh(); + expect($deployment->status)->toBe('success'); +}); + +test('failed deployment triggers rollback', function () { + $application = Application::factory()->create(); + + // Mock failed deployment + $this->mock(DockerService::class, function ($mock) { + $mock->shouldReceive('buildImage')->andThrow(new DeploymentException('Build failed')); + }); + + $deployment = $application->deploy(); + + $this->artisan('queue:work --once'); + + $deployment->refresh(); + expect($deployment->status)->toBe('failed'); + expect($deployment->error_message)->toContain('Build failed'); +}); +``` + +### Webhook Testing +```php +// Testing webhook endpoints +test('github webhook triggers deployment', function () { + $application = Application::factory()->create([ + 'git_repository' => 'https://github.com/user/repo.git', + 'git_branch' => 'main' + ]); + + $payload = [ + 'ref' => 'refs/heads/main', + 'repository' => [ + 'clone_url' => 'https://github.com/user/repo.git' + ], + 'head_commit' => [ + 'id' => 'abc123', + 'message' => 'Update application' + ] + ]; + + $response = $this->postJson("/webhooks/github/{$application->id}", $payload); + + $response->assertStatus(200); + + expect($application->deployments()->count())->toBe(1); + expect($application->deployments()->first()->commit_sha)->toBe('abc123'); +}); + +test('webhook validates payload signature', function () { + $application = Application::factory()->create(); + + $payload = ['invalid' => 'payload']; + + $response = $this->postJson("/webhooks/github/{$application->id}", $payload); + + $response->assertStatus(400); +}); +``` + +## Browser Testing (Laravel Dusk) + +### End-to-End Testing +```php +// Testing complete user workflows +test('user can create and deploy application', function () { + $user = User::factory()->create(); + $server = Server::factory()->create(['team_id' => $user->currentTeam->id]); + + $this->browse(function (Browser $browser) use ($user, $server) { + $browser->loginAs($user) + ->visit('/applications/create') + ->type('name', 'Test Application') + ->type('git_repository', 'https://github.com/laravel/laravel.git') + ->type('git_branch', 'main') + ->select('server_id', $server->id) + ->press('Create Application') + ->assertPathIs('/applications/*') + ->assertSee('Test Application') + ->press('Deploy') + ->waitForText('Deployment started', 10) + ->assertSee('Deployment started'); + }); +}); + +test('user can monitor deployment logs in real-time', function () { + $user = User::factory()->create(); + $application = Application::factory()->create(['team_id' => $user->currentTeam->id]); + + $this->browse(function (Browser $browser) use ($user, $application) { + $browser->loginAs($user) + ->visit("/applications/{$application->id}") + ->press('Deploy') + ->waitForText('Deployment started') + ->click('@logs-tab') + ->waitFor('@deployment-logs') + ->assertSee('Building Docker image') + ->waitForText('Deployment completed', 30); + }); +}); +``` + +### UI Component Testing +```php +// Testing Livewire components +test('server status component updates in real-time', function () { + $user = User::factory()->create(); + $server = Server::factory()->create(['team_id' => $user->currentTeam->id]); + + $this->browse(function (Browser $browser) use ($user, $server) { + $browser->loginAs($user) + ->visit("/servers/{$server->id}") + ->assertSee('Status: Online') + ->waitFor('@server-metrics') + ->assertSee('CPU Usage') + ->assertSee('Memory Usage') + ->assertSee('Disk Usage'); + + // Simulate server going offline + $server->update(['status' => 'offline']); + + $browser->waitForText('Status: Offline', 5) + ->assertSee('Status: Offline'); + }); +}); +``` + +## Database Testing Patterns + +### Migration Testing +```php +// Testing database migrations +test('applications table has correct structure', function () { + expect(Schema::hasTable('applications'))->toBeTrue(); + expect(Schema::hasColumns('applications', [ + 'id', 'name', 'fqdn', 'git_repository', 'git_branch', + 'server_id', 'environment_id', 'created_at', 'updated_at' + ]))->toBeTrue(); +}); + +test('foreign key constraints are properly set', function () { + $application = Application::factory()->create(); + + expect($application->server)->toBeInstanceOf(Server::class); + expect($application->environment)->toBeInstanceOf(Environment::class); + + // Test cascade deletion + $application->server->delete(); + expect(Application::find($application->id))->toBeNull(); +}); +``` + +### Factory Testing +```php +// Testing model factories +test('application factory creates valid models', function () { + $application = Application::factory()->create(); + + expect($application->name)->toBeString(); + expect($application->git_repository)->toStartWith('https://'); + expect($application->server_id)->toBeInt(); + expect($application->environment_id)->toBeInt(); +}); + +test('application factory can create with custom attributes', function () { + $application = Application::factory()->create([ + 'name' => 'Custom App', + 'git_branch' => 'develop' + ]); + + expect($application->name)->toBe('Custom App'); + expect($application->git_branch)->toBe('develop'); +}); +``` + +## Queue Testing + +### Job Testing +```php +// Testing background jobs +test('deploy application job processes successfully', function () { + $application = Application::factory()->create(); + $deployment = ApplicationDeploymentQueue::factory()->create([ + 'application_id' => $application->id, + 'status' => 'queued' + ]); + + $job = new DeployApplicationJob($deployment); + + // Mock external dependencies + $this->mock(DockerService::class, function ($mock) { + $mock->shouldReceive('buildImage')->andReturn('app:latest'); + $mock->shouldReceive('deployContainer')->andReturn(true); + }); + + $job->handle(); + + $deployment->refresh(); + expect($deployment->status)->toBe('success'); +}); + +test('failed job is retried with exponential backoff', function () { + $application = Application::factory()->create(); + $deployment = ApplicationDeploymentQueue::factory()->create([ + 'application_id' => $application->id + ]); + + $job = new DeployApplicationJob($deployment); + + // Mock failure + $this->mock(DockerService::class, function ($mock) { + $mock->shouldReceive('buildImage')->andThrow(new Exception('Network error')); + }); + + expect(fn() => $job->handle())->toThrow(Exception::class); + + // Job should be retried + expect($job->tries)->toBe(3); + expect($job->backoff())->toBe([1, 5, 10]); +}); +``` + +## Security Testing + +### Authentication Testing +```php +// Testing authentication and authorization +test('unauthenticated users cannot access protected routes', function () { + $response = $this->get('/dashboard'); + $response->assertRedirect('/login'); +}); + +test('users can only access their team resources', function () { + $user1 = User::factory()->create(); + $user2 = User::factory()->create(); + + $team1 = Team::factory()->create(); + $team2 = Team::factory()->create(); + + $user1->teams()->attach($team1); + $user2->teams()->attach($team2); + + $application = Application::factory()->create(['team_id' => $team1->id]); + + $response = $this->actingAs($user2) + ->get("/applications/{$application->id}"); + + $response->assertStatus(403); +}); +``` + +### Input Validation Testing +```php +// Testing input validation and sanitization +test('application creation validates required fields', function () { + $user = User::factory()->create(); + + $response = $this->actingAs($user) + ->postJson('/api/v1/applications', []); + + $response->assertStatus(422) + ->assertJsonValidationErrors(['name', 'git_repository', 'server_id']); +}); + +test('malicious input is properly sanitized', function () { + $user = User::factory()->create(); + + $response = $this->actingAs($user) + ->postJson('/api/v1/applications', [ + 'name' => '', + 'git_repository' => 'javascript:alert("xss")', + 'server_id' => 'invalid' + ]); + + $response->assertStatus(422); +}); +``` + +## Performance Testing + +### Load Testing +```php +// Testing application performance under load +test('application list endpoint handles concurrent requests', function () { + $user = User::factory()->create(); + $applications = Application::factory(100)->create(['team_id' => $user->currentTeam->id]); + + $startTime = microtime(true); + + $response = $this->actingAs($user) + ->getJson('/api/v1/applications'); + + $endTime = microtime(true); + $responseTime = ($endTime - $startTime) * 1000; // Convert to milliseconds + + $response->assertStatus(200); + expect($responseTime)->toBeLessThan(500); // Should respond within 500ms +}); +``` + +### Memory Usage Testing +```php +// Testing memory efficiency +test('deployment process does not exceed memory limits', function () { + $initialMemory = memory_get_usage(); + + $application = Application::factory()->create(); + $deployment = $application->deploy(); + + // Process deployment + $this->artisan('queue:work --once'); + + $finalMemory = memory_get_usage(); + $memoryIncrease = $finalMemory - $initialMemory; + + expect($memoryIncrease)->toBeLessThan(50 * 1024 * 1024); // Less than 50MB +}); +``` + +## Test Utilities and Helpers + +### Custom Assertions +```php +// Custom test assertions +expect()->extend('toBeValidDockerCompose', function () { + $yaml = yaml_parse($this->value); + + return $yaml !== false && + isset($yaml['version']) && + isset($yaml['services']) && + is_array($yaml['services']); +}); + +expect()->extend('toHaveValidSshConnection', function () { + $server = $this->value; + + try { + $connection = new SshConnection($server); + return $connection->test(); + } catch (Exception $e) { + return false; + } +}); +``` + +### Test Traits +```php +// Shared testing functionality +trait CreatesTestServers +{ + protected function createTestServer(array $attributes = []): Server + { + return Server::factory()->create(array_merge([ + 'name' => 'Test Server', + 'ip' => '127.0.0.1', + 'port' => 22, + 'team_id' => $this->user->currentTeam->id + ], $attributes)); + } +} + +trait MocksDockerOperations +{ + protected function mockDockerService(): void + { + $this->mock(DockerService::class, function ($mock) { + $mock->shouldReceive('buildImage')->andReturn('test:latest'); + $mock->shouldReceive('createContainer')->andReturn('container_123'); + $mock->shouldReceive('startContainer')->andReturn(true); + $mock->shouldReceive('stopContainer')->andReturn(true); + }); + } +} +``` + +## Continuous Integration Testing + +### GitHub Actions Integration +```yaml +# .github/workflows/tests.yml +name: Tests +on: [push, pull_request] +jobs: + test: + runs-on: ubuntu-latest + services: + postgres: + image: postgres:15 + env: + POSTGRES_PASSWORD: password + options: >- + --health-cmd pg_isready + --health-interval 10s + --health-timeout 5s + --health-retries 5 + steps: + - uses: actions/checkout@v3 + - name: Setup PHP + uses: shivammathur/setup-php@v2 + with: + php-version: 8.4 + - name: Install dependencies + run: composer install + - name: Run tests + run: ./vendor/bin/pest +``` + +### Test Coverage +```php +// Generate test coverage reports +test('application has adequate test coverage', function () { + $coverage = $this->getCoverageData(); + + expect($coverage['application'])->toBeGreaterThan(80); + expect($coverage['models'])->toBeGreaterThan(90); + expect($coverage['actions'])->toBeGreaterThan(85); +}); +``` From 6ea6d2742bfbd8f0373f71729fce82a2a8eef705 Mon Sep 17 00:00:00 2001 From: Andras Bacsai <5845193+andrasbacsai@users.noreply.github.com> Date: Mon, 26 May 2025 14:03:59 +0200 Subject: [PATCH 0029/1232] feat(server): implement server patch check notifications - Added a new job, ServerPatchCheckJob, to handle server patch checks and notifications. - Introduced a new notification class, ServerPatchCheck, for sending updates via email, Discord, Slack, Pushover, and Telegram. - Updated notification settings models to include server patch notification options for email, Discord, Slack, Pushover, and Telegram. - Created a migration to add server patch notification fields to the respective settings tables. - Enhanced the UI to allow users to enable/disable server patch notifications across different channels. --- app/Actions/Server/CheckUpdates.php | 4 - app/Console/Kernel.php | 4 + app/Jobs/ServerPatchCheckJob.php | 66 +++++ app/Livewire/Notifications/Discord.php | 5 + app/Livewire/Notifications/Email.php | 5 + app/Livewire/Notifications/Pushover.php | 5 + app/Livewire/Notifications/Slack.php | 5 + app/Livewire/Notifications/Telegram.php | 10 + app/Models/DiscordNotificationSettings.php | 2 + app/Models/EmailNotificationSettings.php | 2 + app/Models/PushoverNotificationSettings.php | 2 + app/Models/SlackNotificationSettings.php | 2 + app/Models/TelegramNotificationSettings.php | 4 + .../Channels/TelegramChannel.php | 1 + app/Notifications/Server/ServerPatchCheck.php | 245 ++++++++++++++++++ ..._100258_add_server_patch_notifications.php | 74 ++++++ .../views/emails/server-patches.blade.php | 53 ++++ .../livewire/notifications/discord.blade.php | 2 + .../livewire/notifications/email.blade.php | 2 + .../livewire/notifications/pushover.blade.php | 2 + .../livewire/notifications/slack.blade.php | 5 +- .../livewire/notifications/telegram.blade.php | 15 +- .../server/security/patches.blade.php | 26 +- 23 files changed, 520 insertions(+), 21 deletions(-) create mode 100644 app/Jobs/ServerPatchCheckJob.php create mode 100644 app/Notifications/Server/ServerPatchCheck.php create mode 100644 database/migrations/2025_05_26_100258_add_server_patch_notifications.php create mode 100644 resources/views/emails/server-patches.blade.php diff --git a/app/Actions/Server/CheckUpdates.php b/app/Actions/Server/CheckUpdates.php index 55b06e863..a8b1be11d 100644 --- a/app/Actions/Server/CheckUpdates.php +++ b/app/Actions/Server/CheckUpdates.php @@ -83,8 +83,6 @@ public function handle(Server $server) $out = $this->parseDnfOutput($output); $out['osId'] = $osId; $out['package_manager'] = $packageManager; - $rebootRequired = instant_remote_process(['LANG=C dnf needs-restarting -r'], $server); - $out['reboot_required'] = $rebootRequired !== '0'; return $out; case 'apt': @@ -94,8 +92,6 @@ public function handle(Server $server) $out = $this->parseAptOutput($output); $out['osId'] = $osId; $out['package_manager'] = $packageManager; - $rebootRequired = instant_remote_process(['LANG=C test -f /var/run/reboot-required && echo "YES" || echo "NO"'], $server); - $out['reboot_required'] = $rebootRequired === 'YES' ? true : false; return $out; default: diff --git a/app/Console/Kernel.php b/app/Console/Kernel.php index c03475647..372a6c119 100644 --- a/app/Console/Kernel.php +++ b/app/Console/Kernel.php @@ -12,6 +12,7 @@ use App\Jobs\RegenerateSslCertJob; use App\Jobs\ScheduledTaskJob; use App\Jobs\ServerCheckJob; +use App\Jobs\ServerPatchCheckJob; use App\Jobs\ServerStorageCheckJob; use App\Jobs\UpdateCoolifyJob; use App\Models\InstanceSettings; @@ -175,6 +176,9 @@ private function checkResources(): void } $this->scheduleInstance->job(new DockerCleanupJob($server))->cron($dockerCleanupFrequency)->timezone($serverTimezone)->onOneServer(); + // Server patch check - weekly + $this->scheduleInstance->job(new ServerPatchCheckJob($server))->weekly()->timezone($serverTimezone)->onOneServer(); + // Cleanup multiplexed connections every hour // $this->scheduleInstance->job(new ServerCleanupMux($server))->hourly()->onOneServer(); diff --git a/app/Jobs/ServerPatchCheckJob.php b/app/Jobs/ServerPatchCheckJob.php new file mode 100644 index 000000000..c88770d3a --- /dev/null +++ b/app/Jobs/ServerPatchCheckJob.php @@ -0,0 +1,66 @@ +server->uuid))->dontRelease()]; + } + + public function __construct(public Server $server) {} + + public function handle(): void + { + try { + if ($this->server->isFunctional() === false) { + return; + } + + $team = data_get($this->server, 'team'); + if (! $team) { + return; + } + + // Check for updates + $patchData = CheckUpdates::run($this->server); + + if (isset($patchData['error'])) { + return; // Skip if there's an error checking for updates + } + + $totalUpdates = $patchData['total_updates'] ?? 0; + + // Only send notification if there are updates available + if ($totalUpdates > 0) { + $team->notify(new ServerPatchCheck($this->server, $patchData)); + } + } catch (\Throwable $e) { + // Log error but don't fail the job + \Illuminate\Support\Facades\Log::error('ServerPatchCheckJob failed: '.$e->getMessage(), [ + 'server_id' => $this->server->id, + 'server_name' => $this->server->name, + 'error' => $e->getMessage(), + 'trace' => $e->getTraceAsString(), + ]); + } + } +} diff --git a/app/Livewire/Notifications/Discord.php b/app/Livewire/Notifications/Discord.php index 9489eb128..e0425fa17 100644 --- a/app/Livewire/Notifications/Discord.php +++ b/app/Livewire/Notifications/Discord.php @@ -56,6 +56,9 @@ class Discord extends Component #[Validate(['boolean'])] public bool $serverUnreachableDiscordNotifications = true; + #[Validate(['boolean'])] + public bool $serverPatchDiscordNotifications = false; + #[Validate(['boolean'])] public bool $discordPingEnabled = true; @@ -89,6 +92,7 @@ public function syncData(bool $toModel = false) $this->settings->server_disk_usage_discord_notifications = $this->serverDiskUsageDiscordNotifications; $this->settings->server_reachable_discord_notifications = $this->serverReachableDiscordNotifications; $this->settings->server_unreachable_discord_notifications = $this->serverUnreachableDiscordNotifications; + $this->settings->server_patch_discord_notifications = $this->serverPatchDiscordNotifications; $this->settings->discord_ping_enabled = $this->discordPingEnabled; @@ -110,6 +114,7 @@ public function syncData(bool $toModel = false) $this->serverDiskUsageDiscordNotifications = $this->settings->server_disk_usage_discord_notifications; $this->serverReachableDiscordNotifications = $this->settings->server_reachable_discord_notifications; $this->serverUnreachableDiscordNotifications = $this->settings->server_unreachable_discord_notifications; + $this->serverPatchDiscordNotifications = $this->settings->server_patch_discord_notifications; $this->discordPingEnabled = $this->settings->discord_ping_enabled; } diff --git a/app/Livewire/Notifications/Email.php b/app/Livewire/Notifications/Email.php index c5f518e16..4b5d1c6a0 100644 --- a/app/Livewire/Notifications/Email.php +++ b/app/Livewire/Notifications/Email.php @@ -98,6 +98,9 @@ class Email extends Component #[Validate(['boolean'])] public bool $serverUnreachableEmailNotifications = true; + #[Validate(['boolean'])] + public bool $serverPatchEmailNotifications = false; + #[Validate(['nullable', 'email'])] public ?string $testEmailAddress = null; @@ -146,6 +149,7 @@ public function syncData(bool $toModel = false) $this->settings->server_disk_usage_email_notifications = $this->serverDiskUsageEmailNotifications; $this->settings->server_reachable_email_notifications = $this->serverReachableEmailNotifications; $this->settings->server_unreachable_email_notifications = $this->serverUnreachableEmailNotifications; + $this->settings->server_patch_email_notifications = $this->serverPatchEmailNotifications; $this->settings->save(); } else { @@ -177,6 +181,7 @@ public function syncData(bool $toModel = false) $this->serverDiskUsageEmailNotifications = $this->settings->server_disk_usage_email_notifications; $this->serverReachableEmailNotifications = $this->settings->server_reachable_email_notifications; $this->serverUnreachableEmailNotifications = $this->settings->server_unreachable_email_notifications; + $this->serverPatchEmailNotifications = $this->settings->server_patch_email_notifications; } } diff --git a/app/Livewire/Notifications/Pushover.php b/app/Livewire/Notifications/Pushover.php index f1e4c464d..bd5ab79c8 100644 --- a/app/Livewire/Notifications/Pushover.php +++ b/app/Livewire/Notifications/Pushover.php @@ -64,6 +64,9 @@ class Pushover extends Component #[Validate(['boolean'])] public bool $serverUnreachablePushoverNotifications = true; + #[Validate(['boolean'])] + public bool $serverPatchPushoverNotifications = false; + public function mount() { try { @@ -95,6 +98,7 @@ public function syncData(bool $toModel = false) $this->settings->server_disk_usage_pushover_notifications = $this->serverDiskUsagePushoverNotifications; $this->settings->server_reachable_pushover_notifications = $this->serverReachablePushoverNotifications; $this->settings->server_unreachable_pushover_notifications = $this->serverUnreachablePushoverNotifications; + $this->settings->server_patch_pushover_notifications = $this->serverPatchPushoverNotifications; $this->settings->save(); refreshSession(); @@ -115,6 +119,7 @@ public function syncData(bool $toModel = false) $this->serverDiskUsagePushoverNotifications = $this->settings->server_disk_usage_pushover_notifications; $this->serverReachablePushoverNotifications = $this->settings->server_reachable_pushover_notifications; $this->serverUnreachablePushoverNotifications = $this->settings->server_unreachable_pushover_notifications; + $this->serverPatchPushoverNotifications = $this->settings->server_patch_pushover_notifications; } } diff --git a/app/Livewire/Notifications/Slack.php b/app/Livewire/Notifications/Slack.php index f47ad8a97..9c847ce57 100644 --- a/app/Livewire/Notifications/Slack.php +++ b/app/Livewire/Notifications/Slack.php @@ -61,6 +61,9 @@ class Slack extends Component #[Validate(['boolean'])] public bool $serverUnreachableSlackNotifications = true; + #[Validate(['boolean'])] + public bool $serverPatchSlackNotifications = false; + public function mount() { try { @@ -91,6 +94,7 @@ public function syncData(bool $toModel = false) $this->settings->server_disk_usage_slack_notifications = $this->serverDiskUsageSlackNotifications; $this->settings->server_reachable_slack_notifications = $this->serverReachableSlackNotifications; $this->settings->server_unreachable_slack_notifications = $this->serverUnreachableSlackNotifications; + $this->settings->server_patch_slack_notifications = $this->serverPatchSlackNotifications; $this->settings->save(); refreshSession(); @@ -110,6 +114,7 @@ public function syncData(bool $toModel = false) $this->serverDiskUsageSlackNotifications = $this->settings->server_disk_usage_slack_notifications; $this->serverReachableSlackNotifications = $this->settings->server_reachable_slack_notifications; $this->serverUnreachableSlackNotifications = $this->settings->server_unreachable_slack_notifications; + $this->serverPatchSlackNotifications = $this->settings->server_patch_slack_notifications; } } diff --git a/app/Livewire/Notifications/Telegram.php b/app/Livewire/Notifications/Telegram.php index 01afb4ac6..07393d4ea 100644 --- a/app/Livewire/Notifications/Telegram.php +++ b/app/Livewire/Notifications/Telegram.php @@ -64,6 +64,9 @@ class Telegram extends Component #[Validate(['boolean'])] public bool $serverUnreachableTelegramNotifications = true; + #[Validate(['boolean'])] + public bool $serverPatchTelegramNotifications = false; + #[Validate(['nullable', 'string'])] public ?string $telegramNotificationsDeploymentSuccessThreadId = null; @@ -100,6 +103,9 @@ class Telegram extends Component #[Validate(['nullable', 'string'])] public ?string $telegramNotificationsServerUnreachableThreadId = null; + #[Validate(['nullable', 'string'])] + public ?string $telegramNotificationsServerPatchThreadId = null; + public function mount() { try { @@ -131,6 +137,7 @@ public function syncData(bool $toModel = false) $this->settings->server_disk_usage_telegram_notifications = $this->serverDiskUsageTelegramNotifications; $this->settings->server_reachable_telegram_notifications = $this->serverReachableTelegramNotifications; $this->settings->server_unreachable_telegram_notifications = $this->serverUnreachableTelegramNotifications; + $this->settings->server_patch_telegram_notifications = $this->serverPatchTelegramNotifications; $this->settings->telegram_notifications_deployment_success_thread_id = $this->telegramNotificationsDeploymentSuccessThreadId; $this->settings->telegram_notifications_deployment_failure_thread_id = $this->telegramNotificationsDeploymentFailureThreadId; @@ -144,6 +151,7 @@ public function syncData(bool $toModel = false) $this->settings->telegram_notifications_server_disk_usage_thread_id = $this->telegramNotificationsServerDiskUsageThreadId; $this->settings->telegram_notifications_server_reachable_thread_id = $this->telegramNotificationsServerReachableThreadId; $this->settings->telegram_notifications_server_unreachable_thread_id = $this->telegramNotificationsServerUnreachableThreadId; + $this->settings->telegram_notifications_server_patch_thread_id = $this->telegramNotificationsServerPatchThreadId; $this->settings->save(); } else { @@ -163,6 +171,7 @@ public function syncData(bool $toModel = false) $this->serverDiskUsageTelegramNotifications = $this->settings->server_disk_usage_telegram_notifications; $this->serverReachableTelegramNotifications = $this->settings->server_reachable_telegram_notifications; $this->serverUnreachableTelegramNotifications = $this->settings->server_unreachable_telegram_notifications; + $this->serverPatchTelegramNotifications = $this->settings->server_patch_telegram_notifications; $this->telegramNotificationsDeploymentSuccessThreadId = $this->settings->telegram_notifications_deployment_success_thread_id; $this->telegramNotificationsDeploymentFailureThreadId = $this->settings->telegram_notifications_deployment_failure_thread_id; @@ -176,6 +185,7 @@ public function syncData(bool $toModel = false) $this->telegramNotificationsServerDiskUsageThreadId = $this->settings->telegram_notifications_server_disk_usage_thread_id; $this->telegramNotificationsServerReachableThreadId = $this->settings->telegram_notifications_server_reachable_thread_id; $this->telegramNotificationsServerUnreachableThreadId = $this->settings->telegram_notifications_server_unreachable_thread_id; + $this->telegramNotificationsServerPatchThreadId = $this->settings->telegram_notifications_server_patch_thread_id; } } diff --git a/app/Models/DiscordNotificationSettings.php b/app/Models/DiscordNotificationSettings.php index 1ba16ccd8..34adfc997 100644 --- a/app/Models/DiscordNotificationSettings.php +++ b/app/Models/DiscordNotificationSettings.php @@ -28,6 +28,7 @@ class DiscordNotificationSettings extends Model 'server_disk_usage_discord_notifications', 'server_reachable_discord_notifications', 'server_unreachable_discord_notifications', + 'server_patch_discord_notifications', 'discord_ping_enabled', ]; @@ -46,6 +47,7 @@ class DiscordNotificationSettings extends Model 'server_disk_usage_discord_notifications' => 'boolean', 'server_reachable_discord_notifications' => 'boolean', 'server_unreachable_discord_notifications' => 'boolean', + 'server_patch_discord_notifications' => 'boolean', 'discord_ping_enabled' => 'boolean', ]; diff --git a/app/Models/EmailNotificationSettings.php b/app/Models/EmailNotificationSettings.php index 445987619..39617b4cf 100644 --- a/app/Models/EmailNotificationSettings.php +++ b/app/Models/EmailNotificationSettings.php @@ -35,6 +35,7 @@ class EmailNotificationSettings extends Model 'scheduled_task_success_email_notifications', 'scheduled_task_failure_email_notifications', 'server_disk_usage_email_notifications', + 'server_patch_email_notifications', ]; protected $casts = [ @@ -61,6 +62,7 @@ class EmailNotificationSettings extends Model 'scheduled_task_success_email_notifications' => 'boolean', 'scheduled_task_failure_email_notifications' => 'boolean', 'server_disk_usage_email_notifications' => 'boolean', + 'server_patch_email_notifications' => 'boolean', ]; public function team() diff --git a/app/Models/PushoverNotificationSettings.php b/app/Models/PushoverNotificationSettings.php index e3191dcc3..a75fd71d7 100644 --- a/app/Models/PushoverNotificationSettings.php +++ b/app/Models/PushoverNotificationSettings.php @@ -29,6 +29,7 @@ class PushoverNotificationSettings extends Model 'server_disk_usage_pushover_notifications', 'server_reachable_pushover_notifications', 'server_unreachable_pushover_notifications', + 'server_patch_pushover_notifications', ]; protected $casts = [ @@ -47,6 +48,7 @@ class PushoverNotificationSettings extends Model 'server_disk_usage_pushover_notifications' => 'boolean', 'server_reachable_pushover_notifications' => 'boolean', 'server_unreachable_pushover_notifications' => 'boolean', + 'server_patch_pushover_notifications' => 'boolean', ]; public function team() diff --git a/app/Models/SlackNotificationSettings.php b/app/Models/SlackNotificationSettings.php index 48153f2ea..2b52bfd5b 100644 --- a/app/Models/SlackNotificationSettings.php +++ b/app/Models/SlackNotificationSettings.php @@ -28,6 +28,7 @@ class SlackNotificationSettings extends Model 'server_disk_usage_slack_notifications', 'server_reachable_slack_notifications', 'server_unreachable_slack_notifications', + 'server_patch_slack_notifications', ]; protected $casts = [ @@ -45,6 +46,7 @@ class SlackNotificationSettings extends Model 'server_disk_usage_slack_notifications' => 'boolean', 'server_reachable_slack_notifications' => 'boolean', 'server_unreachable_slack_notifications' => 'boolean', + 'server_patch_slack_notifications' => 'boolean', ]; public function team() diff --git a/app/Models/TelegramNotificationSettings.php b/app/Models/TelegramNotificationSettings.php index 78bd841bd..94315ee30 100644 --- a/app/Models/TelegramNotificationSettings.php +++ b/app/Models/TelegramNotificationSettings.php @@ -29,6 +29,7 @@ class TelegramNotificationSettings extends Model 'server_disk_usage_telegram_notifications', 'server_reachable_telegram_notifications', 'server_unreachable_telegram_notifications', + 'server_patch_telegram_notifications', 'telegram_notifications_deployment_success_thread_id', 'telegram_notifications_deployment_failure_thread_id', @@ -41,6 +42,7 @@ class TelegramNotificationSettings extends Model 'telegram_notifications_server_disk_usage_thread_id', 'telegram_notifications_server_reachable_thread_id', 'telegram_notifications_server_unreachable_thread_id', + 'telegram_notifications_server_patch_thread_id', ]; protected $casts = [ @@ -59,6 +61,7 @@ class TelegramNotificationSettings extends Model 'server_disk_usage_telegram_notifications' => 'boolean', 'server_reachable_telegram_notifications' => 'boolean', 'server_unreachable_telegram_notifications' => 'boolean', + 'server_patch_telegram_notifications' => 'boolean', 'telegram_notifications_deployment_success_thread_id' => 'encrypted', 'telegram_notifications_deployment_failure_thread_id' => 'encrypted', @@ -71,6 +74,7 @@ class TelegramNotificationSettings extends Model 'telegram_notifications_server_disk_usage_thread_id' => 'encrypted', 'telegram_notifications_server_reachable_thread_id' => 'encrypted', 'telegram_notifications_server_unreachable_thread_id' => 'encrypted', + 'telegram_notifications_server_patch_thread_id' => 'encrypted', ]; public function team() diff --git a/app/Notifications/Channels/TelegramChannel.php b/app/Notifications/Channels/TelegramChannel.php index ea4ab7171..c2fa3ff10 100644 --- a/app/Notifications/Channels/TelegramChannel.php +++ b/app/Notifications/Channels/TelegramChannel.php @@ -34,6 +34,7 @@ public function send($notifiable, $notification): void \App\Notifications\Server\HighDiskUsage::class => $settings->telegram_notifications_server_disk_usage_thread_id, \App\Notifications\Server\Unreachable::class => $settings->telegram_notifications_server_unreachable_thread_id, \App\Notifications\Server\Reachable::class => $settings->telegram_notifications_server_reachable_thread_id, + \App\Notifications\Server\ServerPatchCheck::class => $settings->telegram_notifications_server_patch_thread_id, default => null, }; diff --git a/app/Notifications/Server/ServerPatchCheck.php b/app/Notifications/Server/ServerPatchCheck.php new file mode 100644 index 000000000..8453e0dd6 --- /dev/null +++ b/app/Notifications/Server/ServerPatchCheck.php @@ -0,0 +1,245 @@ +onQueue('high'); + $this->serverUrl = route('server.security.patches', ['server_uuid' => $this->server->uuid]); + if (isDev()) { + $this->serverUrl = 'https://staging-but-dev.coolify.io/server/'.$this->server->uuid.'/security/patches'; + } + } + + public function via(object $notifiable): array + { + return $notifiable->getEnabledChannels('server_patch'); + } + + public function toMail($notifiable = null): MailMessage + { + $mail = new MailMessage; + $totalUpdates = $this->patchData['total_updates'] ?? 0; + $mail->subject("Coolify: [ACTION REQUIRED] {$totalUpdates} server patches available on {$this->server->name}"); + $mail->view('emails.server-patches', [ + 'name' => $this->server->name, + 'total_updates' => $totalUpdates, + 'updates' => $this->patchData['updates'] ?? [], + 'osId' => $this->patchData['osId'] ?? 'unknown', + 'package_manager' => $this->patchData['package_manager'] ?? 'unknown', + 'server_url' => $this->serverUrl, + ]); + + return $mail; + } + + public function toDiscord(): DiscordMessage + { + $totalUpdates = $this->patchData['total_updates'] ?? 0; + $updates = $this->patchData['updates'] ?? []; + $osId = $this->patchData['osId'] ?? 'unknown'; + $packageManager = $this->patchData['package_manager'] ?? 'unknown'; + + $description = "**{$totalUpdates} package updates** available for server {$this->server->name}\n\n"; + $description .= "**Summary:**\n"; + $description .= '• OS: '.ucfirst($osId)."\n"; + $description .= "• Package Manager: {$packageManager}\n"; + $description .= "• Total Updates: {$totalUpdates}\n\n"; + + // Show first few packages + if (count($updates) > 0) { + $description .= "**Sample Updates:**\n"; + $sampleUpdates = array_slice($updates, 0, 5); + foreach ($sampleUpdates as $update) { + $description .= "• {$update['package']}: {$update['current_version']} → {$update['new_version']}\n"; + } + if (count($updates) > 5) { + $description .= '• ... and '.(count($updates) - 5)." more packages\n"; + } + + // Check for critical packages + $criticalPackages = collect($updates)->filter(function ($update) { + return str_contains(strtolower($update['package']), 'docker') || + str_contains(strtolower($update['package']), 'kernel') || + str_contains(strtolower($update['package']), 'openssh') || + str_contains(strtolower($update['package']), 'ssl'); + }); + + if ($criticalPackages->count() > 0) { + $description .= "\n **Critical packages detected** ({$criticalPackages->count()} packages may require restarts)"; + } + $description .= "\n [Manage Server Patches]($this->serverUrl)"; + } + + return new DiscordMessage( + title: ':warning: Coolify: [ACTION REQUIRED] Server patches available on '.$this->server->name, + description: $description, + color: DiscordMessage::errorColor(), + ); + + } + + public function toTelegram(): array + { + $totalUpdates = $this->patchData['total_updates'] ?? 0; + $updates = $this->patchData['updates'] ?? []; + $osId = $this->patchData['osId'] ?? 'unknown'; + $packageManager = $this->patchData['package_manager'] ?? 'unknown'; + + $message = "🔧 Coolify: [ACTION REQUIRED] {$totalUpdates} server patches available on {$this->server->name}!\n\n"; + $message .= "📊 Summary:\n"; + $message .= '• OS: '.ucfirst($osId)."\n"; + $message .= "• Package Manager: {$packageManager}\n"; + $message .= "• Total Updates: {$totalUpdates}\n\n"; + + if (count($updates) > 0) { + $message .= "📦 Sample Updates:\n"; + $sampleUpdates = array_slice($updates, 0, 5); + foreach ($sampleUpdates as $update) { + $message .= "• {$update['package']}: {$update['current_version']} → {$update['new_version']}\n"; + } + if (count($updates) > 5) { + $message .= '• ... and '.(count($updates) - 5)." more packages\n"; + } + + // Check for critical packages + $criticalPackages = collect($updates)->filter(function ($update) { + return str_contains(strtolower($update['package']), 'docker') || + str_contains(strtolower($update['package']), 'kernel') || + str_contains(strtolower($update['package']), 'openssh') || + str_contains(strtolower($update['package']), 'ssl'); + }); + + if ($criticalPackages->count() > 0) { + $message .= "\n⚠️ Critical packages detected: {$criticalPackages->count()} packages may require restarts\n"; + foreach ($criticalPackages->take(3) as $package) { + $message .= "• {$package['package']}: {$package['current_version']} → {$package['new_version']}\n"; + } + if ($criticalPackages->count() > 3) { + $message .= '• ... and '.($criticalPackages->count() - 3)." more critical packages\n"; + } + } + } + + return [ + 'message' => $message, + 'buttons' => [ + [ + 'text' => 'Manage Server Patches', + 'url' => $this->serverUrl, + ], + ], + ]; + } + + public function toPushover(): PushoverMessage + { + $totalUpdates = $this->patchData['total_updates'] ?? 0; + $updates = $this->patchData['updates'] ?? []; + $osId = $this->patchData['osId'] ?? 'unknown'; + $packageManager = $this->patchData['package_manager'] ?? 'unknown'; + + $message = "[ACTION REQUIRED] {$totalUpdates} server patches available on {$this->server->name}!\n\n"; + $message .= "Summary:\n"; + $message .= '• OS: '.ucfirst($osId)."\n"; + $message .= "• Package Manager: {$packageManager}\n"; + $message .= "• Total Updates: {$totalUpdates}\n\n"; + + if (count($updates) > 0) { + $message .= "Sample Updates:\n"; + $sampleUpdates = array_slice($updates, 0, 3); + foreach ($sampleUpdates as $update) { + $message .= "• {$update['package']}: {$update['current_version']} → {$update['new_version']}\n"; + } + if (count($updates) > 3) { + $message .= '• ... and '.(count($updates) - 3)." more packages\n"; + } + + // Check for critical packages + $criticalPackages = collect($updates)->filter(function ($update) { + return str_contains(strtolower($update['package']), 'docker') || + str_contains(strtolower($update['package']), 'kernel') || + str_contains(strtolower($update['package']), 'openssh') || + str_contains(strtolower($update['package']), 'ssl'); + }); + + if ($criticalPackages->count() > 0) { + $message .= "\nCritical packages detected: {$criticalPackages->count()} may require restarts"; + } + } + + return new PushoverMessage( + title: 'Server patches available', + level: 'error', + message: $message, + buttons: [ + [ + 'text' => 'Manage Server Patches', + 'url' => $this->serverUrl, + ], + ], + ); + } + + public function toSlack(): SlackMessage + { + $totalUpdates = $this->patchData['total_updates'] ?? 0; + $updates = $this->patchData['updates'] ?? []; + $osId = $this->patchData['osId'] ?? 'unknown'; + $packageManager = $this->patchData['package_manager'] ?? 'unknown'; + + $description = "{$totalUpdates} server patches available on '{$this->server->name}'!\n\n"; + $description .= "*Summary:*\n"; + $description .= '• OS: '.ucfirst($osId)."\n"; + $description .= "• Package Manager: {$packageManager}\n"; + $description .= "• Total Updates: {$totalUpdates}\n\n"; + + if (count($updates) > 0) { + $description .= "*Sample Updates:*\n"; + $sampleUpdates = array_slice($updates, 0, 5); + foreach ($sampleUpdates as $update) { + $description .= "• `{$update['package']}`: {$update['current_version']} → {$update['new_version']}\n"; + } + if (count($updates) > 5) { + $description .= '• ... and '.(count($updates) - 5)." more packages\n"; + } + + // Check for critical packages + $criticalPackages = collect($updates)->filter(function ($update) { + return str_contains(strtolower($update['package']), 'docker') || + str_contains(strtolower($update['package']), 'kernel') || + str_contains(strtolower($update['package']), 'openssh') || + str_contains(strtolower($update['package']), 'ssl'); + }); + + if ($criticalPackages->count() > 0) { + $description .= "\n:warning: *Critical packages detected:* {$criticalPackages->count()} packages may require restarts\n"; + foreach ($criticalPackages->take(3) as $package) { + $description .= "• `{$package['package']}`: {$package['current_version']} → {$package['new_version']}\n"; + } + if ($criticalPackages->count() > 3) { + $description .= '• ... and '.($criticalPackages->count() - 3)." more critical packages\n"; + } + } + } + + $description .= "\n:link: <{$this->serverUrl}|Manage Server Patches>"; + + return new SlackMessage( + title: 'Coolify: [ACTION REQUIRED] Server patches available', + description: $description, + color: SlackMessage::errorColor() + ); + } +} diff --git a/database/migrations/2025_05_26_100258_add_server_patch_notifications.php b/database/migrations/2025_05_26_100258_add_server_patch_notifications.php new file mode 100644 index 000000000..6d6611173 --- /dev/null +++ b/database/migrations/2025_05_26_100258_add_server_patch_notifications.php @@ -0,0 +1,74 @@ +boolean('server_patch_email_notifications')->default(true); + }); + + // Add server patch notification fields to discord notification settings + Schema::table('discord_notification_settings', function (Blueprint $table) { + $table->boolean('server_patch_discord_notifications')->default(true); + }); + + // Add server patch notification fields to telegram notification settings + Schema::table('telegram_notification_settings', function (Blueprint $table) { + $table->boolean('server_patch_telegram_notifications')->default(true); + $table->string('telegram_notifications_server_patch_thread_id')->nullable(); + }); + + // Add server patch notification fields to slack notification settings + Schema::table('slack_notification_settings', function (Blueprint $table) { + $table->boolean('server_patch_slack_notifications')->default(true); + }); + + // Add server patch notification fields to pushover notification settings + Schema::table('pushover_notification_settings', function (Blueprint $table) { + $table->boolean('server_patch_pushover_notifications')->default(true); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + // Remove server patch notification fields from email notification settings + Schema::table('email_notification_settings', function (Blueprint $table) { + $table->dropColumn('server_patch_email_notifications'); + }); + + // Remove server patch notification fields from discord notification settings + Schema::table('discord_notification_settings', function (Blueprint $table) { + $table->dropColumn('server_patch_discord_notifications'); + }); + + // Remove server patch notification fields from telegram notification settings + Schema::table('telegram_notification_settings', function (Blueprint $table) { + $table->dropColumn([ + 'server_patch_telegram_notifications', + 'telegram_notifications_server_patch_thread_id', + ]); + }); + + // Remove server patch notification fields from slack notification settings + Schema::table('slack_notification_settings', function (Blueprint $table) { + $table->dropColumn('server_patch_slack_notifications'); + }); + + // Remove server patch notification fields from pushover notification settings + Schema::table('pushover_notification_settings', function (Blueprint $table) { + $table->dropColumn('server_patch_pushover_notifications'); + }); + } +}; diff --git a/resources/views/emails/server-patches.blade.php b/resources/views/emails/server-patches.blade.php new file mode 100644 index 000000000..37644eaa2 --- /dev/null +++ b/resources/views/emails/server-patches.blade.php @@ -0,0 +1,53 @@ + +{{ $total_updates }} package updates are available for your server {{ $name }}. + +## Summary + +- Operating System: {{ ucfirst($osId) }} +- Package Manager: {{ $package_manager }} +- Total Updates: {{ $total_updates }} + +## Available Updates + +@if ($total_updates > 0) +@foreach ($updates as $update) + +Package: {{ $update['package'] }} ({{ $update['architecture'] }}), from version {{ $update['current_version'] }} to {{ $update['new_version'] }} at repository {{ $update['repository'] ?? 'Unknown' }} +@endforeach + +## Security Considerations + +Some of these updates may include important security patches. We recommend reviewing and applying these updates promptly. + +### Critical packages that may require container/server/service restarts: +@php +$criticalPackages = collect($updates)->filter(function ($update) { + return str_contains(strtolower($update['package']), 'docker') || + str_contains(strtolower($update['package']), 'kernel') || + str_contains(strtolower($update['package']), 'openssh') || + str_contains(strtolower($update['package']), 'ssl'); + }); +@endphp + +@if ($criticalPackages->count() > 0) +@foreach ($criticalPackages as $package) +- {{ $package['package'] }}: {{ $package['current_version'] }} → {{ $package['new_version'] }} +@endforeach +@else +No critical packages requiring container restarts detected. +@endif + +## Next Steps + +1. Review the available updates +2. Plan maintenance window if critical packages are involved +3. Apply updates through the Coolify dashboard +4. Monitor services after updates are applied +@else +Your server is up to date! No packages require updating at this time. +@endif + +--- + +You can manage server patches in your [Coolify Dashboard]({{ $server_url }}). + diff --git a/resources/views/livewire/notifications/discord.blade.php b/resources/views/livewire/notifications/discord.blade.php index 9b48c9793..a65be078f 100644 --- a/resources/views/livewire/notifications/discord.blade.php +++ b/resources/views/livewire/notifications/discord.blade.php @@ -78,6 +78,8 @@ label="Server Reachable" /> +

diff --git a/resources/views/livewire/notifications/email.blade.php b/resources/views/livewire/notifications/email.blade.php index 194cb3b43..e4d8bf31d 100644 --- a/resources/views/livewire/notifications/email.blade.php +++ b/resources/views/livewire/notifications/email.blade.php @@ -155,6 +155,8 @@ label="Server Reachable" /> + diff --git a/resources/views/livewire/notifications/pushover.blade.php b/resources/views/livewire/notifications/pushover.blade.php index c8dd777d8..697597acb 100644 --- a/resources/views/livewire/notifications/pushover.blade.php +++ b/resources/views/livewire/notifications/pushover.blade.php @@ -80,6 +80,8 @@ label="Server Reachable" /> + diff --git a/resources/views/livewire/notifications/slack.blade.php b/resources/views/livewire/notifications/slack.blade.php index 28bfe509f..85b9a2de7 100644 --- a/resources/views/livewire/notifications/slack.blade.php +++ b/resources/views/livewire/notifications/slack.blade.php @@ -24,8 +24,8 @@ + helper="Create a Slack APP and generate a Incoming Webhook URL.
Create Slack APP" + required id="slackWebhookUrl" label="Webhook" />

Notification Settings

@@ -73,6 +73,7 @@ label="Server Reachable" /> + diff --git a/resources/views/livewire/notifications/telegram.blade.php b/resources/views/livewire/notifications/telegram.blade.php index ecc9360fa..b1e6eccf7 100644 --- a/resources/views/livewire/notifications/telegram.blade.php +++ b/resources/views/livewire/notifications/telegram.blade.php @@ -27,8 +27,9 @@ - +

Notification Settings

@@ -151,7 +152,6 @@ id="telegramNotificationsServerReachableThreadId" /> -
+ +
+
+ +
+ +
diff --git a/resources/views/livewire/server/security/patches.blade.php b/resources/views/livewire/server/security/patches.blade.php index 7dc2748fc..33a9bba54 100644 --- a/resources/views/livewire/server/security/patches.blade.php +++ b/resources/views/livewire/server/security/patches.blade.php @@ -23,7 +23,7 @@ Check Now -
Update your servers automatically.
+
Update your servers semi-automatically.
@@ -38,18 +38,20 @@
Your server is up to date.
@endif @if (isset($updates) && count($updates) > 0) - + +
@@ -65,7 +67,7 @@ @foreach ($updates as $update)
- @if (data_get_str($update, 'package')->contains('docker')) + @if (data_get_str($update, 'package')->contains('docker') || data_get_str($update, 'package')->contains('kernel')) Date: Mon, 26 May 2025 21:06:00 +0200 Subject: [PATCH 0030/1232] fix: Traefik start on new server validation fix: Multiple server selection ui flow --- .../Project/Application/Configuration.php | 1 + app/Livewire/Project/Shared/Destination.php | 7 +++- app/Livewire/Server/ValidateAndInstall.php | 23 ----------- .../project/shared/destination.blade.php | 2 +- .../server/validate-and-install.blade.php | 38 ++++--------------- 5 files changed, 14 insertions(+), 57 deletions(-) diff --git a/app/Livewire/Project/Application/Configuration.php b/app/Livewire/Project/Application/Configuration.php index f0b95a9c8..021731c20 100644 --- a/app/Livewire/Project/Application/Configuration.php +++ b/app/Livewire/Project/Application/Configuration.php @@ -24,6 +24,7 @@ public function getListeners() return [ "echo-private:team.{$teamId},ServiceChecked" => '$refresh', 'buildPackUpdated' => '$refresh', + 'refresh' => '$refresh', ]; } diff --git a/app/Livewire/Project/Shared/Destination.php b/app/Livewire/Project/Shared/Destination.php index 9d5331ff6..a4343bff9 100644 --- a/app/Livewire/Project/Shared/Destination.php +++ b/app/Livewire/Project/Shared/Destination.php @@ -26,6 +26,7 @@ public function getListeners() return [ "echo-private:team.{$teamId},ApplicationStatusChanged" => 'loadData', + 'refresh' => 'mount', ]; } @@ -114,6 +115,7 @@ public function promote(int $network_id, int $server_id) $this->resource->additional_networks()->detach($network_id, ['server_id' => $server_id]); $this->resource->additional_networks()->attach($main_destination->id, ['server_id' => $main_destination->server->id]); $this->refreshServers(); + $this->resource->refresh(); } public function refreshServers() @@ -126,7 +128,7 @@ public function refreshServers() public function addServer(int $network_id, int $server_id) { $this->resource->additional_networks()->attach($network_id, ['server_id' => $server_id]); - $this->loadData(); + $this->dispatch('refresh'); } public function removeServer(int $network_id, int $server_id, $password) @@ -141,7 +143,7 @@ public function removeServer(int $network_id, int $server_id, $password) } if ($this->resource->destination->server->id == $server_id && $this->resource->destination->id == $network_id) { - $this->dispatch('error', 'You cannot remove this destination server.', 'You are trying to remove the main server.'); + $this->dispatch('error', 'You are trying to remove the main server.'); return; } @@ -149,6 +151,7 @@ public function removeServer(int $network_id, int $server_id, $password) StopApplicationOneServer::run($this->resource, $server); $this->resource->additional_networks()->detach($network_id, ['server_id' => $server_id]); $this->loadData(); + $this->dispatch('refresh'); ApplicationStatusChanged::dispatch(data_get($this->resource, 'environment.project.team.id')); } catch (\Exception $e) { return handleError($e, $this); diff --git a/app/Livewire/Server/ValidateAndInstall.php b/app/Livewire/Server/ValidateAndInstall.php index 791ef9350..ba8fd9d4f 100644 --- a/app/Livewire/Server/ValidateAndInstall.php +++ b/app/Livewire/Server/ValidateAndInstall.php @@ -2,8 +2,6 @@ namespace App\Livewire\Server; -use App\Actions\Proxy\CheckProxy; -use App\Actions\Proxy\StartProxy; use App\Models\Server; use Livewire\Component; @@ -39,7 +37,6 @@ class ValidateAndInstall extends Component 'validateOS', 'validateDockerEngine', 'validateDockerVersion', - 'startProxy', 'refresh' => '$refresh', ]; @@ -64,25 +61,6 @@ public function startValidatingAfterAsking() $this->init(); } - public function startProxy() - { - try { - $shouldStart = CheckProxy::run($this->server); - if ($shouldStart) { - $proxy = StartProxy::run($this->server, false); - if ($proxy === 'OK') { - $this->proxy_started = true; - } else { - throw new \Exception('Proxy could not be started.'); - } - } else { - $this->proxy_started = true; - } - } catch (\Throwable $e) { - return handleError($e, $this); - } - } - public function validateConnection() { ['uptime' => $this->uptime, 'error' => $error] = $this->server->validateConnection(); @@ -172,7 +150,6 @@ public function validateDockerVersion() if ($this->server->isBuildServer()) { return; } - $this->dispatch('startProxy'); } public function render() diff --git a/resources/views/livewire/project/shared/destination.blade.php b/resources/views/livewire/project/shared/destination.blade.php index f0ae90830..c6a3e2370 100644 --- a/resources/views/livewire/project/shared/destination.blade.php +++ b/resources/views/livewire/project/shared/destination.blade.php @@ -34,7 +34,7 @@ class="relative flex flex-col bg-white border cursor-default dark:text-white box @if ($resource?->additional_networks?->count() > 0 && data_get($resource, 'build_pack') !== 'dockercompose')

Additional Server(s)

@foreach ($resource->additional_networks as $destination) -
+
@if (str(data_get($destination, 'pivot.status'))->startsWith('running'))
@isset($docker_version) - @if($docker_version) -
Minimum Docker version: Minimum Docker version:
@else -
Minimum Docker version: - -
+
Minimum Docker version: + +
@endif @else
@endisset - @if (!$server->isBuildServer()) - @if ($proxy_started) -
Proxy started: - - - - -
- @else - @if ($error) -
Proxy started: - -
- @else -
- @endif - @endif - @endif @else @if ($error)
Docker Compose is installed: Date: Mon, 26 May 2025 21:44:25 +0200 Subject: [PATCH 0031/1232] fix(ui): update server status display and improve server addition layout --- .../application/configuration.blade.php | 3 +- .../project/shared/destination.blade.php | 43 ++++++++++--------- 2 files changed, 24 insertions(+), 22 deletions(-) diff --git a/resources/views/livewire/project/application/configuration.blade.php b/resources/views/livewire/project/application/configuration.blade.php index 6b015e3fb..f4cd0afd0 100644 --- a/resources/views/livewire/project/application/configuration.blade.php +++ b/resources/views/livewire/project/application/configuration.blade.php @@ -37,8 +37,7 @@ d="M240.26 186.1L152.81 34.23a28.74 28.74 0 0 0-49.62 0L15.74 186.1a27.45 27.45 0 0 0 0 27.71A28.31 28.31 0 0 0 40.55 228h174.9a28.31 28.31 0 0 0 24.79-14.19a27.45 27.45 0 0 0 .02-27.71m-20.8 15.7a4.46 4.46 0 0 1-4 2.2H40.55a4.46 4.46 0 0 1-4-2.2a3.56 3.56 0 0 1 0-3.73L124 46.2a4.77 4.77 0 0 1 8 0l87.44 151.87a3.56 3.56 0 0 1 .02 3.73M116 136v-32a12 12 0 0 1 24 0v32a12 12 0 0 1-24 0m28 40a16 16 0 1 1-16-16a16 16 0 0 1 16 16" /> - @endif - @if ($application->server_status == false) + @elseif ($application->server_status == false)

Primary Server

+ class="relative flex flex-col bg-white border cursor-default dark:text-white box-without-bg dark:bg-coolgray-100 dark:border-black"> @if (str($resource->realStatus())->startsWith('running'))
@@ -35,7 +35,8 @@ class="relative flex flex-col bg-white border cursor-default dark:text-white box

Additional Server(s)

@foreach ($resource->additional_networks as $destination)
-
+
@if (str(data_get($destination, 'pivot.status'))->startsWith('running'))
@@ -75,25 +76,27 @@ class="absolute bg-error -top-1 -left-1 badge ">
@endif
@if ($resource->getMorphClass() === 'App\Models\Application' && data_get($resource, 'build_pack') !== 'dockercompose') - @if (count($networks) > 0) -

Choose another server

-
- @foreach ($networks as $network) -
-
-
- Server: {{ data_get($network, 'server.name') }} -
-
- Network: {{ data_get($network, 'name') }} +
+ @if (count($networks) > 0) +

Add another server

+
+ @foreach ($networks as $network) +
+
+
+ Server: {{ data_get($network, 'server.name') }} +
+
+ Network: {{ data_get($network, 'name') }} +
-
- @endforeach -
- @else -
No additional servers available to attach.
- @endif + @endforeach +
+ @else +
No additional servers available to attach.
+ @endif +
@endif
From 102bdb5bc361432899b508c27104a77a238ac75d Mon Sep 17 00:00:00 2001 From: Andras Bacsai <5845193+andrasbacsai@users.noreply.github.com> Date: Mon, 26 May 2025 21:44:34 +0200 Subject: [PATCH 0032/1232] refactor(application): enhance application stopping logic to support multiple servers --- app/Actions/Application/StopApplication.php | 67 +++++++++++-------- .../Application/StopApplicationOneServer.php | 5 +- .../Project/Application/Configuration.php | 1 + app/Livewire/Project/Shared/Destination.php | 1 + app/Models/Application.php | 16 +---- 5 files changed, 49 insertions(+), 41 deletions(-) diff --git a/app/Actions/Application/StopApplication.php b/app/Actions/Application/StopApplication.php index 01c258b65..0ca703fce 100644 --- a/app/Actions/Application/StopApplication.php +++ b/app/Actions/Application/StopApplication.php @@ -15,33 +15,46 @@ class StopApplication public function handle(Application $application, bool $previewDeployments = false, bool $dockerCleanup = true) { - ray('StopApplication'); - try { - $server = $application->destination->server; - if (! $server->isFunctional()) { - return 'Server is not functional'; - } - - if ($server->isSwarm()) { - instant_remote_process(["docker stack rm {$application->uuid}"], $server); - - return; - } - - $containersToStop = $application->getContainersToStop($previewDeployments); - $application->stopContainers($containersToStop, $server); - - if ($application->build_pack === 'dockercompose') { - $application->deleteConnectedNetworks(); - } - - if ($dockerCleanup) { - CleanupDocker::dispatch($server, true); - } - } catch (\Exception $e) { - return $e->getMessage(); - } finally { - ServiceStatusChanged::dispatch($application->environment->project->team->id); + $servers = collect([$application->destination->server]); + if ($application?->additional_servers?->count() > 0) { + $servers = $servers->merge($application->additional_servers); } + foreach ($servers as $server) { + try { + if (! $server->isFunctional()) { + return 'Server is not functional'; + } + + if ($server->isSwarm()) { + instant_remote_process(["docker stack rm {$application->uuid}"], $server); + + return; + } + + $containers = $previewDeployments + ? getCurrentApplicationContainerStatus($server, $application->id, includePullrequests: true) + : getCurrentApplicationContainerStatus($server, $application->id, 0); + + $containersToStop = $containers->pluck('Names')->toArray(); + + foreach ($containersToStop as $containerName) { + instant_remote_process(command: [ + "docker stop --time=30 $containerName", + "docker rm -f $containerName", + ], server: $server, throwError: false); + } + + if ($application->build_pack === 'dockercompose') { + $application->deleteConnectedNetworks(); + } + + if ($dockerCleanup) { + CleanupDocker::dispatch($server, true); + } + } catch (\Exception $e) { + return $e->getMessage(); + } + } + ServiceStatusChanged::dispatch($application->environment->project->team->id); } } diff --git a/app/Actions/Application/StopApplicationOneServer.php b/app/Actions/Application/StopApplicationOneServer.php index b13b10efd..600b1cb9a 100644 --- a/app/Actions/Application/StopApplicationOneServer.php +++ b/app/Actions/Application/StopApplicationOneServer.php @@ -25,7 +25,10 @@ public function handle(Application $application, Server $server) $containerName = data_get($container, 'Names'); if ($containerName) { instant_remote_process( - ["docker rm -f {$containerName}"], + [ + "docker stop --time=30 $containerName", + "docker rm -f $containerName", + ], $server ); } diff --git a/app/Livewire/Project/Application/Configuration.php b/app/Livewire/Project/Application/Configuration.php index 021731c20..b50d7b736 100644 --- a/app/Livewire/Project/Application/Configuration.php +++ b/app/Livewire/Project/Application/Configuration.php @@ -23,6 +23,7 @@ public function getListeners() return [ "echo-private:team.{$teamId},ServiceChecked" => '$refresh', + "echo-private:team.{$teamId},ServiceStatusChanged" => '$refresh', 'buildPackUpdated' => '$refresh', 'refresh' => '$refresh', ]; diff --git a/app/Livewire/Project/Shared/Destination.php b/app/Livewire/Project/Shared/Destination.php index a4343bff9..40291d2b0 100644 --- a/app/Livewire/Project/Shared/Destination.php +++ b/app/Livewire/Project/Shared/Destination.php @@ -26,6 +26,7 @@ public function getListeners() return [ "echo-private:team.{$teamId},ApplicationStatusChanged" => 'loadData', + "echo-private:team.{$teamId},ServiceStatusChanged" => 'mount', 'refresh' => 'mount', ]; } diff --git a/app/Models/Application.php b/app/Models/Application.php index 94bd5c75b..7929aadc1 100644 --- a/app/Models/Application.php +++ b/app/Models/Application.php @@ -259,25 +259,15 @@ public static function ownedByCurrentTeam() return Application::whereRelation('environment.project.team', 'id', currentTeam()->id)->orderBy('name'); } - public function getContainersToStop(bool $previewDeployments = false): array + public function getContainersToStop(Server $server, bool $previewDeployments = false): array { $containers = $previewDeployments - ? getCurrentApplicationContainerStatus($this->destination->server, $this->id, includePullrequests: true) - : getCurrentApplicationContainerStatus($this->destination->server, $this->id, 0); + ? getCurrentApplicationContainerStatus($server, $this->id, includePullrequests: true) + : getCurrentApplicationContainerStatus($server, $this->id, 0); return $containers->pluck('Names')->toArray(); } - public function stopContainers(array $containerNames, $server, int $timeout = 30) - { - foreach ($containerNames as $containerName) { - instant_remote_process(command: [ - "docker stop --time=$timeout $containerName", - "docker rm -f $containerName", - ], server: $server, throwError: false); - } - } - public function deleteConfigurations() { $server = data_get($this, 'destination.server'); From 70a7faf139da6202402d046934f194b2cdd33137 Mon Sep 17 00:00:00 2001 From: ShadowArcanist <162910371+ShadowArcanist@users.noreply.github.com> Date: Tue, 27 May 2025 16:15:00 +0530 Subject: [PATCH 0033/1232] fix(service): Neon WS Proxy service not working on ARM64 (#5887) --- templates/compose/neon-ws-proxy.yaml | 1 - 1 file changed, 1 deletion(-) diff --git a/templates/compose/neon-ws-proxy.yaml b/templates/compose/neon-ws-proxy.yaml index 60d64983f..cd1f13b3f 100644 --- a/templates/compose/neon-ws-proxy.yaml +++ b/templates/compose/neon-ws-proxy.yaml @@ -27,7 +27,6 @@ services: postgres: image: 'postgres:17-alpine' - platform: linux/amd64 volumes: - 'postgresql-data:/var/lib/postgresql/data' environment: From 6868ba088c2e5743d2bba7ef603922fce6ed3e55 Mon Sep 17 00:00:00 2001 From: CrazyTim71 <118295691+CrazyTim71@users.noreply.github.com> Date: Tue, 27 May 2025 12:54:26 +0200 Subject: [PATCH 0034/1232] chore(service): update Immich service (#5886) --- templates/compose/immich.yaml | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/templates/compose/immich.yaml b/templates/compose/immich.yaml index 3b98384a2..d3b76d116 100644 --- a/templates/compose/immich.yaml +++ b/templates/compose/immich.yaml @@ -6,7 +6,7 @@ services: immich: - image: ghcr.io/immich-app/immich-server:release + image: ghcr.io/immich-app/immich-server:${IMMICH_VERSION:-release} # extends: # file: hwaccel.transcoding.yml # service: cpu # set to one of [nvenc, quicksync, rkmpp, vaapi, vaapi-wsl] for accelerated transcoding @@ -33,7 +33,7 @@ services: container_name: immich_machine_learning # For hardware acceleration, add one of -[armnn, cuda, openvino] to the image tag. # Example tag: ${IMMICH_VERSION:-release}-cuda - image: ghcr.io/immich-app/immich-machine-learning:release + image: ghcr.io/immich-app/immich-machine-learning:${IMMICH_VERSION:-release} # extends: # uncomment this section for hardware acceleration - see https://immich.app/docs/features/ml-hardware-acceleration # file: hwaccel.ml.yml # service: cpu # set to one of [armnn, cuda, openvino, openvino-wsl] for accelerated inference - use the `-wsl` version for WSL2 where applicable @@ -61,12 +61,14 @@ services: retries: 20 database: - image: docker.io/tensorchord/pgvecto-rs:pg14-v0.2.0@sha256:90724186f0a3517cf6914295b5ab410db9ce23190a2d9d0b9dd6463e3fa298f0 + image: ghcr.io/immich-app/postgres:14-vectorchord0.3.0-pgvectors0.2.0 environment: POSTGRES_PASSWORD: ${SERVICE_PASSWORD_POSTGRES} POSTGRES_USER: ${SERVICE_USER_POSTGRES} POSTGRES_DB: ${DB_DATABASE_NAME:-immich} - POSTGRES_INITDB_ARGS: '--data-checksums' + POSTGRES_INITDB_ARGS: "--data-checksums" + # Use 'HDD' if your database isn't stored on SSDs + DB_STORAGE_TYPE: ${DB_STORAGE_TYPE:-SSD} volumes: - immich-postgres-data:/var/lib/postgresql/data healthcheck: From e005f1c83898207f1b228325a9cd11030191bbcb Mon Sep 17 00:00:00 2001 From: Andras Bacsai <5845193+andrasbacsai@users.noreply.github.com> Date: Tue, 27 May 2025 14:23:16 +0200 Subject: [PATCH 0035/1232] fix(server): enhance error handling in server patch check notifications --- app/Jobs/ServerPatchCheckJob.php | 4 +- app/Notifications/Server/ServerPatchCheck.php | 103 ++++++++++++++++++ .../emails/server-patches-error.blade.php | 13 +++ 3 files changed, 119 insertions(+), 1 deletion(-) create mode 100644 resources/views/emails/server-patches-error.blade.php diff --git a/app/Jobs/ServerPatchCheckJob.php b/app/Jobs/ServerPatchCheckJob.php index c88770d3a..370ce86f4 100644 --- a/app/Jobs/ServerPatchCheckJob.php +++ b/app/Jobs/ServerPatchCheckJob.php @@ -31,7 +31,7 @@ public function __construct(public Server $server) {} public function handle(): void { try { - if ($this->server->isFunctional() === false) { + if ($this->server->serverStatus() === false) { return; } @@ -44,6 +44,8 @@ public function handle(): void $patchData = CheckUpdates::run($this->server); if (isset($patchData['error'])) { + $team->notify(new ServerPatchCheck($this->server, $patchData)); + return; // Skip if there's an error checking for updates } diff --git a/app/Notifications/Server/ServerPatchCheck.php b/app/Notifications/Server/ServerPatchCheck.php index 8453e0dd6..1686a6f37 100644 --- a/app/Notifications/Server/ServerPatchCheck.php +++ b/app/Notifications/Server/ServerPatchCheck.php @@ -30,6 +30,21 @@ public function via(object $notifiable): array public function toMail($notifiable = null): MailMessage { $mail = new MailMessage; + + // Handle error case + if (isset($this->patchData['error'])) { + $mail->subject("Coolify: [ERROR] Failed to check patches on {$this->server->name}"); + $mail->view('emails.server-patches-error', [ + 'name' => $this->server->name, + 'error' => $this->patchData['error'], + 'osId' => $this->patchData['osId'] ?? 'unknown', + 'package_manager' => $this->patchData['package_manager'] ?? 'unknown', + 'server_url' => $this->serverUrl, + ]); + + return $mail; + } + $totalUpdates = $this->patchData['total_updates'] ?? 0; $mail->subject("Coolify: [ACTION REQUIRED] {$totalUpdates} server patches available on {$this->server->name}"); $mail->view('emails.server-patches', [ @@ -46,6 +61,26 @@ public function toMail($notifiable = null): MailMessage public function toDiscord(): DiscordMessage { + // Handle error case + if (isset($this->patchData['error'])) { + $osId = $this->patchData['osId'] ?? 'unknown'; + $packageManager = $this->patchData['package_manager'] ?? 'unknown'; + $error = $this->patchData['error']; + + $description = "**Failed to check for updates** on server {$this->server->name}\n\n"; + $description .= "**Error Details:**\n"; + $description .= '• OS: '.ucfirst($osId)."\n"; + $description .= "• Package Manager: {$packageManager}\n"; + $description .= "• Error: {$error}\n\n"; + $description .= "[Manage Server]($this->serverUrl)"; + + return new DiscordMessage( + title: ':x: Coolify: [ERROR] Failed to check patches on '.$this->server->name, + description: $description, + color: DiscordMessage::errorColor(), + ); + } + $totalUpdates = $this->patchData['total_updates'] ?? 0; $updates = $this->patchData['updates'] ?? []; $osId = $this->patchData['osId'] ?? 'unknown'; @@ -92,6 +127,29 @@ public function toDiscord(): DiscordMessage public function toTelegram(): array { + // Handle error case + if (isset($this->patchData['error'])) { + $osId = $this->patchData['osId'] ?? 'unknown'; + $packageManager = $this->patchData['package_manager'] ?? 'unknown'; + $error = $this->patchData['error']; + + $message = "❌ Coolify: [ERROR] Failed to check patches on {$this->server->name}!\n\n"; + $message .= "📊 Error Details:\n"; + $message .= '• OS: '.ucfirst($osId)."\n"; + $message .= "• Package Manager: {$packageManager}\n"; + $message .= "• Error: {$error}\n\n"; + + return [ + 'message' => $message, + 'buttons' => [ + [ + 'text' => 'Manage Server', + 'url' => $this->serverUrl, + ], + ], + ]; + } + $totalUpdates = $this->patchData['total_updates'] ?? 0; $updates = $this->patchData['updates'] ?? []; $osId = $this->patchData['osId'] ?? 'unknown'; @@ -145,6 +203,31 @@ public function toTelegram(): array public function toPushover(): PushoverMessage { + // Handle error case + if (isset($this->patchData['error'])) { + $osId = $this->patchData['osId'] ?? 'unknown'; + $packageManager = $this->patchData['package_manager'] ?? 'unknown'; + $error = $this->patchData['error']; + + $message = "[ERROR] Failed to check patches on {$this->server->name}!\n\n"; + $message .= "Error Details:\n"; + $message .= '• OS: '.ucfirst($osId)."\n"; + $message .= "• Package Manager: {$packageManager}\n"; + $message .= "• Error: {$error}\n\n"; + + return new PushoverMessage( + title: 'Server patch check failed', + level: 'error', + message: $message, + buttons: [ + [ + 'text' => 'Manage Server', + 'url' => $this->serverUrl, + ], + ], + ); + } + $totalUpdates = $this->patchData['total_updates'] ?? 0; $updates = $this->patchData['updates'] ?? []; $osId = $this->patchData['osId'] ?? 'unknown'; @@ -194,6 +277,26 @@ public function toPushover(): PushoverMessage public function toSlack(): SlackMessage { + // Handle error case + if (isset($this->patchData['error'])) { + $osId = $this->patchData['osId'] ?? 'unknown'; + $packageManager = $this->patchData['package_manager'] ?? 'unknown'; + $error = $this->patchData['error']; + + $description = "Failed to check patches on '{$this->server->name}'!\n\n"; + $description .= "*Error Details:*\n"; + $description .= '• OS: '.ucfirst($osId)."\n"; + $description .= "• Package Manager: {$packageManager}\n"; + $description .= "• Error: `{$error}`\n\n"; + $description .= "\n:link: <{$this->serverUrl}|Manage Server>"; + + return new SlackMessage( + title: 'Coolify: [ERROR] Server patch check failed', + description: $description, + color: SlackMessage::errorColor() + ); + } + $totalUpdates = $this->patchData['total_updates'] ?? 0; $updates = $this->patchData['updates'] ?? []; $osId = $this->patchData['osId'] ?? 'unknown'; diff --git a/resources/views/emails/server-patches-error.blade.php b/resources/views/emails/server-patches-error.blade.php new file mode 100644 index 000000000..070ead440 --- /dev/null +++ b/resources/views/emails/server-patches-error.blade.php @@ -0,0 +1,13 @@ + +Failed to check for package updates on your server {{ $name }}. + +## Error Details + +- Operating System: {{ ucfirst($osId) }} +- Package Manager: {{ $package_manager }} +- Error: {{ $error }} + +--- + +You can manage your server and view more details in your [Coolify Dashboard]({{ $server_url }}). + From 94df6ca51f6ff1bf5d26e4312bd162a86ded7e05 Mon Sep 17 00:00:00 2001 From: Dusan <55688658+dusanbre@users.noreply.github.com> Date: Tue, 27 May 2025 15:03:17 +0200 Subject: [PATCH 0036/1232] feat(api): Add latest query param to Service restart API (#5881) --- app/Actions/Service/RestartService.php | 4 ++-- app/Http/Controllers/Api/ServicesController.php | 13 ++++++++++++- public/svgs/typesense.webp | Bin 0 -> 550 bytes 3 files changed, 14 insertions(+), 3 deletions(-) create mode 100644 public/svgs/typesense.webp diff --git a/app/Actions/Service/RestartService.php b/app/Actions/Service/RestartService.php index 4151ea947..d38ef54d6 100644 --- a/app/Actions/Service/RestartService.php +++ b/app/Actions/Service/RestartService.php @@ -11,10 +11,10 @@ class RestartService public string $jobQueue = 'high'; - public function handle(Service $service) + public function handle(Service $service, bool $pullLatestImages) { StopService::run($service); - return StartService::run($service); + return StartService::run($service, $pullLatestImages); } } diff --git a/app/Http/Controllers/Api/ServicesController.php b/app/Http/Controllers/Api/ServicesController.php index e792779e1..4f2cb61d7 100644 --- a/app/Http/Controllers/Api/ServicesController.php +++ b/app/Http/Controllers/Api/ServicesController.php @@ -1428,6 +1428,16 @@ public function action_stop(Request $request) format: 'uuid', ) ), + new OA\Parameter( + name: 'latest', + in: 'query', + description: 'Pull latest images.', + required: false, + schema: new OA\Schema( + type: 'boolean', + default: false, + ) + ), ], responses: [ new OA\Response( @@ -1473,7 +1483,8 @@ public function action_restart(Request $request) if (! $service) { return response()->json(['message' => 'Service not found.'], 404); } - RestartService::dispatch($service); + $pullLatest = $request->boolean('latest'); + RestartService::dispatch($service, $pullLatest); return response()->json( [ diff --git a/public/svgs/typesense.webp b/public/svgs/typesense.webp new file mode 100644 index 0000000000000000000000000000000000000000..e1e3acd1feab1f8110f42c61dfdb4ba7a110b0fe GIT binary patch literal 550 zcmV+>0@?jiNk&E<0ssJ4MM6+kP&iBx0ssIn$G|ZVw-5%>wrPL=mRABv8+rdQPxvE< zWE-b}C>rSBLIW#-K;I7uR0u$VQy-W*0u#CJExRwkmL#igvzv1Sa)d49i~j##ZFG>T zynad?(f3 z5MAA&m-p$aPZI7NFyTsoMK?rPKL(y;vk>hh+7Kf-%!-vRB(q+yPNd~Utf?DGpQS?D zfwZa=Y!5Oi1>1#Ig@W%wR-v%&!zvW2@4`hWV75I>Dxju*ELs8hwO%F{uw?7Pq8ETU z^%x`rs>e(;U=2|=tf5&p43SB<5-GYZkx8K1t469m&Y||n5y&%=q(6EvX!`KAAJg=BJkWj0 o7V-6g{%`Jxw^~lmWv(~uE6;)d&vKOyIVDdy Date: Tue, 27 May 2025 09:07:31 -0400 Subject: [PATCH 0037/1232] feat(api): Add connect_to_docker_network setting to App creation API (#5691) --- .../Api/ApplicationsController.php | 22 +++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/app/Http/Controllers/Api/ApplicationsController.php b/app/Http/Controllers/Api/ApplicationsController.php index 10d58ecec..0860c7133 100644 --- a/app/Http/Controllers/Api/ApplicationsController.php +++ b/app/Http/Controllers/Api/ApplicationsController.php @@ -187,6 +187,7 @@ public function applications(Request $request) 'is_http_basic_auth_enabled' => ['type' => 'boolean', 'description' => 'HTTP Basic Authentication enabled.'], 'http_basic_auth_username' => ['type' => 'string', 'nullable' => true, 'description' => 'Username for HTTP Basic Authentication'], 'http_basic_auth_password' => ['type' => 'string', 'nullable' => true, 'description' => 'Password for HTTP Basic Authentication'], + 'connect_to_docker_network' => ['type' => 'boolean', 'description' => 'The flag to connect the service to the predefined Docker network.'], ], ) ), @@ -306,6 +307,7 @@ public function create_public_application(Request $request) 'is_http_basic_auth_enabled' => ['type' => 'boolean', 'description' => 'HTTP Basic Authentication enabled.'], 'http_basic_auth_username' => ['type' => 'string', 'nullable' => true, 'description' => 'Username for HTTP Basic Authentication'], 'http_basic_auth_password' => ['type' => 'string', 'nullable' => true, 'description' => 'Password for HTTP Basic Authentication'], + 'connect_to_docker_network' => ['type' => 'boolean', 'description' => 'The flag to connect the service to the predefined Docker network.'], ], ) ), @@ -425,6 +427,7 @@ public function create_private_gh_app_application(Request $request) 'is_http_basic_auth_enabled' => ['type' => 'boolean', 'description' => 'HTTP Basic Authentication enabled.'], 'http_basic_auth_username' => ['type' => 'string', 'nullable' => true, 'description' => 'Username for HTTP Basic Authentication'], 'http_basic_auth_password' => ['type' => 'string', 'nullable' => true, 'description' => 'Password for HTTP Basic Authentication'], + 'connect_to_docker_network' => ['type' => 'boolean', 'description' => 'The flag to connect the service to the predefined Docker network.'], ], ) ), @@ -528,6 +531,7 @@ public function create_private_deploy_key_application(Request $request) 'is_http_basic_auth_enabled' => ['type' => 'boolean', 'description' => 'HTTP Basic Authentication enabled.'], 'http_basic_auth_username' => ['type' => 'string', 'nullable' => true, 'description' => 'Username for HTTP Basic Authentication'], 'http_basic_auth_password' => ['type' => 'string', 'nullable' => true, 'description' => 'Password for HTTP Basic Authentication'], + 'connect_to_docker_network' => ['type' => 'boolean', 'description' => 'The flag to connect the service to the predefined Docker network.'], ], ) ), @@ -628,6 +632,7 @@ public function create_dockerfile_application(Request $request) 'is_http_basic_auth_enabled' => ['type' => 'boolean', 'description' => 'HTTP Basic Authentication enabled.'], 'http_basic_auth_username' => ['type' => 'string', 'nullable' => true, 'description' => 'Username for HTTP Basic Authentication'], 'http_basic_auth_password' => ['type' => 'string', 'nullable' => true, 'description' => 'Password for HTTP Basic Authentication'], + 'connect_to_docker_network' => ['type' => 'boolean', 'description' => 'The flag to connect the service to the predefined Docker network.'], ], ) ), @@ -691,6 +696,7 @@ public function create_dockerimage_application(Request $request) 'description' => ['type' => 'string', 'description' => 'The application description.'], 'instant_deploy' => ['type' => 'boolean', 'description' => 'The flag to indicate if the application should be deployed instantly.'], 'use_build_server' => ['type' => 'boolean', 'nullable' => true, 'description' => 'Use build server.'], + 'connect_to_docker_network' => ['type' => 'boolean', 'description' => 'The flag to connect the service to the predefined Docker network.'], ], ) ), @@ -736,7 +742,7 @@ private function create_application(Request $request, $type) if ($return instanceof \Illuminate\Http\JsonResponse) { return $return; } - $allowedFields = ['project_uuid', 'environment_name', 'environment_uuid', 'server_uuid', 'destination_uuid', 'type', 'name', 'description', 'is_static', 'domains', 'git_repository', 'git_branch', 'git_commit_sha', 'private_key_uuid', 'docker_registry_image_name', 'docker_registry_image_tag', 'build_pack', 'install_command', 'build_command', 'start_command', 'ports_exposes', 'ports_mappings', 'base_directory', 'publish_directory', 'health_check_enabled', 'health_check_path', 'health_check_port', 'health_check_host', 'health_check_method', 'health_check_return_code', 'health_check_scheme', 'health_check_response_text', 'health_check_interval', 'health_check_timeout', 'health_check_retries', 'health_check_start_period', 'limits_memory', 'limits_memory_swap', 'limits_memory_swappiness', 'limits_memory_reservation', 'limits_cpus', 'limits_cpuset', 'limits_cpu_shares', 'custom_labels', 'custom_docker_run_options', 'post_deployment_command', 'post_deployment_command_container', 'pre_deployment_command', 'pre_deployment_command_container', 'manual_webhook_secret_github', 'manual_webhook_secret_gitlab', 'manual_webhook_secret_bitbucket', 'manual_webhook_secret_gitea', 'redirect', 'github_app_uuid', 'instant_deploy', 'dockerfile', 'docker_compose_location', 'docker_compose_raw', 'docker_compose_custom_start_command', 'docker_compose_custom_build_command', 'docker_compose_domains', 'watch_paths', 'use_build_server', 'static_image', 'custom_nginx_configuration', 'is_http_basic_auth_enabled', 'http_basic_auth_username', 'http_basic_auth_password']; + $allowedFields = ['project_uuid', 'environment_name', 'environment_uuid', 'server_uuid', 'destination_uuid', 'type', 'name', 'description', 'is_static', 'domains', 'git_repository', 'git_branch', 'git_commit_sha', 'private_key_uuid', 'docker_registry_image_name', 'docker_registry_image_tag', 'build_pack', 'install_command', 'build_command', 'start_command', 'ports_exposes', 'ports_mappings', 'base_directory', 'publish_directory', 'health_check_enabled', 'health_check_path', 'health_check_port', 'health_check_host', 'health_check_method', 'health_check_return_code', 'health_check_scheme', 'health_check_response_text', 'health_check_interval', 'health_check_timeout', 'health_check_retries', 'health_check_start_period', 'limits_memory', 'limits_memory_swap', 'limits_memory_swappiness', 'limits_memory_reservation', 'limits_cpus', 'limits_cpuset', 'limits_cpu_shares', 'custom_labels', 'custom_docker_run_options', 'post_deployment_command', 'post_deployment_command_container', 'pre_deployment_command', 'pre_deployment_command_container', 'manual_webhook_secret_github', 'manual_webhook_secret_gitlab', 'manual_webhook_secret_bitbucket', 'manual_webhook_secret_gitea', 'redirect', 'github_app_uuid', 'instant_deploy', 'dockerfile', 'docker_compose_location', 'docker_compose_raw', 'docker_compose_custom_start_command', 'docker_compose_custom_build_command', 'docker_compose_domains', 'watch_paths', 'use_build_server', 'static_image', 'custom_nginx_configuration', 'is_http_basic_auth_enabled', 'http_basic_auth_username', 'http_basic_auth_password', 'connect_to_docker_network']; $validator = customApiValidator($request->all(), [ 'name' => 'string|max:255', @@ -777,6 +783,7 @@ private function create_application(Request $request, $type) $githubAppUuid = $request->github_app_uuid; $useBuildServer = $request->use_build_server; $isStatic = $request->is_static; + $connectToDockerNetwork = $request->connect_to_docker_network; $customNginxConfiguration = $request->custom_nginx_configuration; if (! is_null($customNginxConfiguration)) { @@ -886,6 +893,10 @@ private function create_application(Request $request, $type) $application->settings->is_static = $isStatic; $application->settings->save(); } + if (isset($connectToDockerNetwork)) { + $application->settings->connect_to_docker_network = $connectToDockerNetwork; + $application->settings->save(); + } if (isset($useBuildServer)) { $application->settings->is_build_server_enabled = $useBuildServer; $application->settings->save(); @@ -1790,6 +1801,7 @@ public function delete_by_uuid(Request $request) 'docker_compose_domains' => ['type' => 'array', 'description' => 'The Docker Compose domains.'], 'watch_paths' => ['type' => 'string', 'description' => 'The watch paths.'], 'use_build_server' => ['type' => 'boolean', 'nullable' => true, 'description' => 'Use build server.'], + 'connect_to_docker_network' => ['type' => 'boolean', 'description' => 'The flag to connect the service to the predefined Docker network.'], ], ) ), @@ -1843,7 +1855,7 @@ public function update_by_uuid(Request $request) ], 404); } $server = $application->destination->server; - $allowedFields = ['name', 'description', 'is_static', 'domains', 'git_repository', 'git_branch', 'git_commit_sha', 'docker_registry_image_name', 'docker_registry_image_tag', 'build_pack', 'static_image', 'install_command', 'build_command', 'start_command', 'ports_exposes', 'ports_mappings', 'base_directory', 'publish_directory', 'health_check_enabled', 'health_check_path', 'health_check_port', 'health_check_host', 'health_check_method', 'health_check_return_code', 'health_check_scheme', 'health_check_response_text', 'health_check_interval', 'health_check_timeout', 'health_check_retries', 'health_check_start_period', 'limits_memory', 'limits_memory_swap', 'limits_memory_swappiness', 'limits_memory_reservation', 'limits_cpus', 'limits_cpuset', 'limits_cpu_shares', 'custom_labels', 'custom_docker_run_options', 'post_deployment_command', 'post_deployment_command_container', 'pre_deployment_command', 'pre_deployment_command_container', 'watch_paths', 'manual_webhook_secret_github', 'manual_webhook_secret_gitlab', 'manual_webhook_secret_bitbucket', 'manual_webhook_secret_gitea', 'docker_compose_location', 'docker_compose_raw', 'docker_compose_custom_start_command', 'docker_compose_custom_build_command', 'docker_compose_domains', 'redirect', 'instant_deploy', 'use_build_server', 'custom_nginx_configuration', 'is_http_basic_auth_enabled', 'http_basic_auth_username', 'http_basic_auth_password']; + $allowedFields = ['name', 'description', 'is_static', 'domains', 'git_repository', 'git_branch', 'git_commit_sha', 'docker_registry_image_name', 'docker_registry_image_tag', 'build_pack', 'static_image', 'install_command', 'build_command', 'start_command', 'ports_exposes', 'ports_mappings', 'base_directory', 'publish_directory', 'health_check_enabled', 'health_check_path', 'health_check_port', 'health_check_host', 'health_check_method', 'health_check_return_code', 'health_check_scheme', 'health_check_response_text', 'health_check_interval', 'health_check_timeout', 'health_check_retries', 'health_check_start_period', 'limits_memory', 'limits_memory_swap', 'limits_memory_swappiness', 'limits_memory_reservation', 'limits_cpus', 'limits_cpuset', 'limits_cpu_shares', 'custom_labels', 'custom_docker_run_options', 'post_deployment_command', 'post_deployment_command_container', 'pre_deployment_command', 'pre_deployment_command_container', 'watch_paths', 'manual_webhook_secret_github', 'manual_webhook_secret_gitlab', 'manual_webhook_secret_bitbucket', 'manual_webhook_secret_gitea', 'docker_compose_location', 'docker_compose_raw', 'docker_compose_custom_start_command', 'docker_compose_custom_build_command', 'docker_compose_domains', 'redirect', 'instant_deploy', 'use_build_server', 'custom_nginx_configuration', 'is_http_basic_auth_enabled', 'http_basic_auth_username', 'http_basic_auth_password', 'connect_to_docker_network']; $validationRules = [ 'name' => 'string|max:255', @@ -2013,6 +2025,7 @@ public function update_by_uuid(Request $request) } $instantDeploy = $request->instant_deploy; $isStatic = $request->is_static; + $connectToDockerNetwork = $request->connect_to_docker_network; $useBuildServer = $request->use_build_server; if (isset($useBuildServer)) { @@ -2025,6 +2038,11 @@ public function update_by_uuid(Request $request) $application->settings->save(); } + if (isset($connectToDockerNetwork)) { + $application->settings->connect_to_docker_network = $connectToDockerNetwork; + $application->settings->save(); + } + removeUnnecessaryFieldsFromRequest($request); $data = $request->all(); From 3b0237956b9548771ce82c44c907a0b4d11097c8 Mon Sep 17 00:00:00 2001 From: peaklabs-dev <122374094+peaklabs-dev@users.noreply.github.com> Date: Tue, 27 May 2025 15:09:15 +0200 Subject: [PATCH 0038/1232] chore(service): remove unused logo --- public/svgs/typesense.webp | Bin 550 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 public/svgs/typesense.webp diff --git a/public/svgs/typesense.webp b/public/svgs/typesense.webp deleted file mode 100644 index e1e3acd1feab1f8110f42c61dfdb4ba7a110b0fe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 550 zcmV+>0@?jiNk&E<0ssJ4MM6+kP&iBx0ssIn$G|ZVw-5%>wrPL=mRABv8+rdQPxvE< zWE-b}C>rSBLIW#-K;I7uR0u$VQy-W*0u#CJExRwkmL#igvzv1Sa)d49i~j##ZFG>T zynad?(f3 z5MAA&m-p$aPZI7NFyTsoMK?rPKL(y;vk>hh+7Kf-%!-vRB(q+yPNd~Utf?DGpQS?D zfwZa=Y!5Oi1>1#Ig@W%wR-v%&!zvW2@4`hWV75I>Dxju*ELs8hwO%F{uw?7Pq8ETU z^%x`rs>e(;U=2|=tf5&p43SB<5-GYZkx8K1t469m&Y||n5y&%=q(6EvX!`KAAJg=BJkWj0 o7V-6g{%`Jxw^~lmWv(~uE6;)d&vKOyIVDdy Date: Tue, 27 May 2025 15:09:26 +0200 Subject: [PATCH 0039/1232] Update service-templates.json --- templates/service-templates.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/templates/service-templates.json b/templates/service-templates.json index fa3eb3bc7..87c1773d2 100644 --- a/templates/service-templates.json +++ b/templates/service-templates.json @@ -1463,7 +1463,7 @@ "immich": { "documentation": "https://immich.app/docs/overview/introduction?utm_source=coolify.io", "slogan": "Self-hosted photo and video management solution.", - "compose": "c2VydmljZXM6CiAgaW1taWNoOgogICAgaW1hZ2U6ICdnaGNyLmlvL2ltbWljaC1hcHAvaW1taWNoLXNlcnZlcjpyZWxlYXNlJwogICAgdm9sdW1lczoKICAgICAgLSAnaW1taWNoLXVwbG9hZHM6L3Vzci9zcmMvYXBwL3VwbG9hZCcKICAgICAgLSAnL2V0Yy9sb2NhbHRpbWU6L2V0Yy9sb2NhbHRpbWU6cm8nCiAgICBlbnZpcm9ubWVudDoKICAgICAgLSBTRVJWSUNFX0ZRRE5fSU1NSUNIXzIyODMKICAgICAgLSBVUExPQURfTE9DQVRJT049Li9saWJyYXJ5CiAgICAgIC0gREJfREFUQV9MT0NBVElPTj0uL3Bvc3RncmVzCiAgICAgIC0gREJfUEFTU1dPUkQ9JFNFUlZJQ0VfUEFTU1dPUkRfUE9TVEdSRVMKICAgICAgLSBEQl9VU0VSTkFNRT0kU0VSVklDRV9VU0VSX1BPU1RHUkVTCiAgICAgIC0gJ0RCX0RBVEFCQVNFX05BTUU9JHtEQl9EQVRBQkFTRV9OQU1FOi1pbW1pY2h9JwogICAgICAtICdUWj0ke1RaOi1FdGMvVVRDfScKICAgIGRlcGVuZHNfb246CiAgICAgIHJlZGlzOgogICAgICAgIGNvbmRpdGlvbjogc2VydmljZV9oZWFsdGh5CiAgICAgIGRhdGFiYXNlOgogICAgICAgIGNvbmRpdGlvbjogc2VydmljZV9oZWFsdGh5CiAgICBoZWFsdGhjaGVjazoKICAgICAgZGlzYWJsZTogZmFsc2UKICBpbW1pY2gtbWFjaGluZS1sZWFybmluZzoKICAgIGNvbnRhaW5lcl9uYW1lOiBpbW1pY2hfbWFjaGluZV9sZWFybmluZwogICAgaW1hZ2U6ICdnaGNyLmlvL2ltbWljaC1hcHAvaW1taWNoLW1hY2hpbmUtbGVhcm5pbmc6cmVsZWFzZScKICAgIHZvbHVtZXM6CiAgICAgIC0gJ2ltbWljaC1tb2RlbC1jYWNoZTovY2FjaGUnCiAgICBlbnZpcm9ubWVudDoKICAgICAgLSBVUExPQURfTE9DQVRJT049Li9saWJyYXJ5CiAgICAgIC0gREJfREFUQV9MT0NBVElPTj0uL3Bvc3RncmVzCiAgICAgIC0gREJfUEFTU1dPUkQ9JFNFUlZJQ0VfUEFTU1dPUkRfUE9TVEdSRVMKICAgICAgLSBEQl9VU0VSTkFNRT0kU0VSVklDRV9VU0VSX1BPU1RHUkVTCiAgICAgIC0gJ0RCX0RBVEFCQVNFX05BTUU9JHtEQl9EQVRBQkFTRV9OQU1FOi1pbW1pY2h9JwogICAgICAtICdUWj0ke1RaOi1FdGMvVVRDfScKICAgIGhlYWx0aGNoZWNrOgogICAgICBkaXNhYmxlOiBmYWxzZQogIHJlZGlzOgogICAgaW1hZ2U6ICdyZWRpczo3LjQtYWxwaW5lJwogICAgaGVhbHRoY2hlY2s6CiAgICAgIHRlc3Q6CiAgICAgICAgLSBDTUQKICAgICAgICAtIHJlZGlzLWNsaQogICAgICAgIC0gUElORwogICAgICBpbnRlcnZhbDogNXMKICAgICAgdGltZW91dDogMTBzCiAgICAgIHJldHJpZXM6IDIwCiAgZGF0YWJhc2U6CiAgICBpbWFnZTogJ2RvY2tlci5pby90ZW5zb3JjaG9yZC9wZ3ZlY3RvLXJzOnBnMTQtdjAuMi4wQHNoYTI1Njo5MDcyNDE4NmYwYTM1MTdjZjY5MTQyOTViNWFiNDEwZGI5Y2UyMzE5MGEyZDlkMGI5ZGQ2NDYzZTNmYTI5OGYwJwogICAgZW52aXJvbm1lbnQ6CiAgICAgIFBPU1RHUkVTX1BBU1NXT1JEOiAnJHtTRVJWSUNFX1BBU1NXT1JEX1BPU1RHUkVTfScKICAgICAgUE9TVEdSRVNfVVNFUjogJyR7U0VSVklDRV9VU0VSX1BPU1RHUkVTfScKICAgICAgUE9TVEdSRVNfREI6ICcke0RCX0RBVEFCQVNFX05BTUU6LWltbWljaH0nCiAgICAgIFBPU1RHUkVTX0lOSVREQl9BUkdTOiAnLS1kYXRhLWNoZWNrc3VtcycKICAgIHZvbHVtZXM6CiAgICAgIC0gJ2ltbWljaC1wb3N0Z3Jlcy1kYXRhOi92YXIvbGliL3Bvc3RncmVzcWwvZGF0YScKICAgIGhlYWx0aGNoZWNrOgogICAgICB0ZXN0OgogICAgICAgIC0gQ01ELVNIRUxMCiAgICAgICAgLSAncGdfaXNyZWFkeSAtVSAkJHtQT1NUR1JFU19VU0VSfSAtZCAkJHtQT1NUR1JFU19EQn0nCiAgICAgIGludGVydmFsOiA1cwogICAgICB0aW1lb3V0OiAyMHMKICAgICAgcmV0cmllczogMTAK", + "compose": "c2VydmljZXM6CiAgaW1taWNoOgogICAgaW1hZ2U6ICdnaGNyLmlvL2ltbWljaC1hcHAvaW1taWNoLXNlcnZlcjoke0lNTUlDSF9WRVJTSU9OOi1yZWxlYXNlfScKICAgIHZvbHVtZXM6CiAgICAgIC0gJ2ltbWljaC11cGxvYWRzOi91c3Ivc3JjL2FwcC91cGxvYWQnCiAgICAgIC0gJy9ldGMvbG9jYWx0aW1lOi9ldGMvbG9jYWx0aW1lOnJvJwogICAgZW52aXJvbm1lbnQ6CiAgICAgIC0gU0VSVklDRV9GUUROX0lNTUlDSF8yMjgzCiAgICAgIC0gVVBMT0FEX0xPQ0FUSU9OPS4vbGlicmFyeQogICAgICAtIERCX0RBVEFfTE9DQVRJT049Li9wb3N0Z3JlcwogICAgICAtIERCX1BBU1NXT1JEPSRTRVJWSUNFX1BBU1NXT1JEX1BPU1RHUkVTCiAgICAgIC0gREJfVVNFUk5BTUU9JFNFUlZJQ0VfVVNFUl9QT1NUR1JFUwogICAgICAtICdEQl9EQVRBQkFTRV9OQU1FPSR7REJfREFUQUJBU0VfTkFNRTotaW1taWNofScKICAgICAgLSAnVFo9JHtUWjotRXRjL1VUQ30nCiAgICBkZXBlbmRzX29uOgogICAgICByZWRpczoKICAgICAgICBjb25kaXRpb246IHNlcnZpY2VfaGVhbHRoeQogICAgICBkYXRhYmFzZToKICAgICAgICBjb25kaXRpb246IHNlcnZpY2VfaGVhbHRoeQogICAgaGVhbHRoY2hlY2s6CiAgICAgIGRpc2FibGU6IGZhbHNlCiAgaW1taWNoLW1hY2hpbmUtbGVhcm5pbmc6CiAgICBjb250YWluZXJfbmFtZTogaW1taWNoX21hY2hpbmVfbGVhcm5pbmcKICAgIGltYWdlOiAnZ2hjci5pby9pbW1pY2gtYXBwL2ltbWljaC1tYWNoaW5lLWxlYXJuaW5nOiR7SU1NSUNIX1ZFUlNJT046LXJlbGVhc2V9JwogICAgdm9sdW1lczoKICAgICAgLSAnaW1taWNoLW1vZGVsLWNhY2hlOi9jYWNoZScKICAgIGVudmlyb25tZW50OgogICAgICAtIFVQTE9BRF9MT0NBVElPTj0uL2xpYnJhcnkKICAgICAgLSBEQl9EQVRBX0xPQ0FUSU9OPS4vcG9zdGdyZXMKICAgICAgLSBEQl9QQVNTV09SRD0kU0VSVklDRV9QQVNTV09SRF9QT1NUR1JFUwogICAgICAtIERCX1VTRVJOQU1FPSRTRVJWSUNFX1VTRVJfUE9TVEdSRVMKICAgICAgLSAnREJfREFUQUJBU0VfTkFNRT0ke0RCX0RBVEFCQVNFX05BTUU6LWltbWljaH0nCiAgICAgIC0gJ1RaPSR7VFo6LUV0Yy9VVEN9JwogICAgaGVhbHRoY2hlY2s6CiAgICAgIGRpc2FibGU6IGZhbHNlCiAgcmVkaXM6CiAgICBpbWFnZTogJ3JlZGlzOjcuNC1hbHBpbmUnCiAgICBoZWFsdGhjaGVjazoKICAgICAgdGVzdDoKICAgICAgICAtIENNRAogICAgICAgIC0gcmVkaXMtY2xpCiAgICAgICAgLSBQSU5HCiAgICAgIGludGVydmFsOiA1cwogICAgICB0aW1lb3V0OiAxMHMKICAgICAgcmV0cmllczogMjAKICBkYXRhYmFzZToKICAgIGltYWdlOiAnZ2hjci5pby9pbW1pY2gtYXBwL3Bvc3RncmVzOjE0LXZlY3RvcmNob3JkMC4zLjAtcGd2ZWN0b3JzMC4yLjAnCiAgICBlbnZpcm9ubWVudDoKICAgICAgUE9TVEdSRVNfUEFTU1dPUkQ6ICcke1NFUlZJQ0VfUEFTU1dPUkRfUE9TVEdSRVN9JwogICAgICBQT1NUR1JFU19VU0VSOiAnJHtTRVJWSUNFX1VTRVJfUE9TVEdSRVN9JwogICAgICBQT1NUR1JFU19EQjogJyR7REJfREFUQUJBU0VfTkFNRTotaW1taWNofScKICAgICAgUE9TVEdSRVNfSU5JVERCX0FSR1M6ICctLWRhdGEtY2hlY2tzdW1zJwogICAgICBEQl9TVE9SQUdFX1RZUEU6ICcke0RCX1NUT1JBR0VfVFlQRTotU1NEfScKICAgIHZvbHVtZXM6CiAgICAgIC0gJ2ltbWljaC1wb3N0Z3Jlcy1kYXRhOi92YXIvbGliL3Bvc3RncmVzcWwvZGF0YScKICAgIGhlYWx0aGNoZWNrOgogICAgICB0ZXN0OgogICAgICAgIC0gQ01ELVNIRUxMCiAgICAgICAgLSAncGdfaXNyZWFkeSAtVSAkJHtQT1NUR1JFU19VU0VSfSAtZCAkJHtQT1NUR1JFU19EQn0nCiAgICAgIGludGVydmFsOiA1cwogICAgICB0aW1lb3V0OiAyMHMKICAgICAgcmV0cmllczogMTAK", "tags": [ "photo", "video", @@ -2176,7 +2176,7 @@ "neon-ws-proxy": { "documentation": "https://neon.tech?utm_source=coolify.io", "slogan": "The database you love, on a serverless platform designed to help you build reliable and scalable applications faster.", - "compose": "c2VydmljZXM6CiAgbmVvbi1wcm94eToKICAgIGltYWdlOiAnZ2hjci5pby9uZW9uZGF0YWJhc2Uvd3Nwcm94eTpsYXRlc3QnCiAgICBlbnZpcm9ubWVudDoKICAgICAgLSBTRVJWSUNFX0ZRRE5fTkVPTlBST1hZCiAgICAgIC0gU0VSVklDRV9GUUROX05FT05QUk9NRVRIRVVTXzIxMTIKICAgICAgLSAnQVBQRU5EX1BPUlQ9cG9zdGdyZXM6NTQzMicKICAgICAgLSAnQUxMT1dfQUREUl9SRUdFWD0uKicKICAgICAgLSBMT0dfVFJBRkZJQz1mYWxzZQogICAgICAtIExPR19DT05OX0lORk89dHJ1ZQogICAgcmVzdGFydDogdW5sZXNzLXN0b3BwZWQKICAgIGRlcGVuZHNfb246CiAgICAgIC0gcG9zdGdyZXMKICAgIGhlYWx0aGNoZWNrOgogICAgICB0ZXN0OgogICAgICAgIC0gQ01ELVNIRUxMCiAgICAgICAgLSAnbmMgLXogMTI3LjAuMC4xIDgwJwogICAgICBpbnRlcnZhbDogNXMKICAgICAgdGltZW91dDogMnMKICAgICAgcmV0cmllczogMjAKICBwb3N0Z3JlczoKICAgIGltYWdlOiAncG9zdGdyZXM6MTctYWxwaW5lJwogICAgcGxhdGZvcm06IGxpbnV4L2FtZDY0CiAgICB2b2x1bWVzOgogICAgICAtICdwb3N0Z3Jlc3FsLWRhdGE6L3Zhci9saWIvcG9zdGdyZXNxbC9kYXRhJwogICAgZW52aXJvbm1lbnQ6CiAgICAgIC0gJ1BPU1RHUkVTX1VTRVI9JHtTRVJWSUNFX1VTRVJfUE9TVEdSRVNRTH0nCiAgICAgIC0gJ1BPU1RHUkVTX1BBU1NXT1JEPSR7U0VSVklDRV9QQVNTV09SRF9QT1NUR1JFU1FMfScKICAgICAgLSAnUE9TVEdSRVNfREI9JHtQT1NUR1JFU1FMX0RBVEFCQVNFOi1wb3N0Z3Jlc30nCiAgICAgIC0gUE9TVEdSRVNfSE9TVF9BVVRIX01FVEhPRD1wYXNzd29yZAogICAgaGVhbHRoY2hlY2s6CiAgICAgIHRlc3Q6CiAgICAgICAgLSBDTUQtU0hFTEwKICAgICAgICAtICdwZ19pc3JlYWR5IC1VICQke1BPU1RHUkVTX1VTRVJ9IC1kICQke1BPU1RHUkVTX0RCfScKICAgICAgaW50ZXJ2YWw6IDVzCiAgICAgIHRpbWVvdXQ6IDIwcwogICAgICByZXRyaWVzOiAxMAo=", + "compose": "c2VydmljZXM6CiAgbmVvbi1wcm94eToKICAgIGltYWdlOiAnZ2hjci5pby9uZW9uZGF0YWJhc2Uvd3Nwcm94eTpsYXRlc3QnCiAgICBlbnZpcm9ubWVudDoKICAgICAgLSBTRVJWSUNFX0ZRRE5fTkVPTlBST1hZCiAgICAgIC0gU0VSVklDRV9GUUROX05FT05QUk9NRVRIRVVTXzIxMTIKICAgICAgLSAnQVBQRU5EX1BPUlQ9cG9zdGdyZXM6NTQzMicKICAgICAgLSAnQUxMT1dfQUREUl9SRUdFWD0uKicKICAgICAgLSBMT0dfVFJBRkZJQz1mYWxzZQogICAgICAtIExPR19DT05OX0lORk89dHJ1ZQogICAgcmVzdGFydDogdW5sZXNzLXN0b3BwZWQKICAgIGRlcGVuZHNfb246CiAgICAgIC0gcG9zdGdyZXMKICAgIGhlYWx0aGNoZWNrOgogICAgICB0ZXN0OgogICAgICAgIC0gQ01ELVNIRUxMCiAgICAgICAgLSAnbmMgLXogMTI3LjAuMC4xIDgwJwogICAgICBpbnRlcnZhbDogNXMKICAgICAgdGltZW91dDogMnMKICAgICAgcmV0cmllczogMjAKICBwb3N0Z3JlczoKICAgIGltYWdlOiAncG9zdGdyZXM6MTctYWxwaW5lJwogICAgdm9sdW1lczoKICAgICAgLSAncG9zdGdyZXNxbC1kYXRhOi92YXIvbGliL3Bvc3RncmVzcWwvZGF0YScKICAgIGVudmlyb25tZW50OgogICAgICAtICdQT1NUR1JFU19VU0VSPSR7U0VSVklDRV9VU0VSX1BPU1RHUkVTUUx9JwogICAgICAtICdQT1NUR1JFU19QQVNTV09SRD0ke1NFUlZJQ0VfUEFTU1dPUkRfUE9TVEdSRVNRTH0nCiAgICAgIC0gJ1BPU1RHUkVTX0RCPSR7UE9TVEdSRVNRTF9EQVRBQkFTRTotcG9zdGdyZXN9JwogICAgICAtIFBPU1RHUkVTX0hPU1RfQVVUSF9NRVRIT0Q9cGFzc3dvcmQKICAgIGhlYWx0aGNoZWNrOgogICAgICB0ZXN0OgogICAgICAgIC0gQ01ELVNIRUxMCiAgICAgICAgLSAncGdfaXNyZWFkeSAtVSAkJHtQT1NUR1JFU19VU0VSfSAtZCAkJHtQT1NUR1JFU19EQn0nCiAgICAgIGludGVydmFsOiA1cwogICAgICB0aW1lb3V0OiAyMHMKICAgICAgcmV0cmllczogMTAK", "tags": [ "proxy", "neon", From 2934d4a2590a01841f4f1577211603ab6c8ea3c1 Mon Sep 17 00:00:00 2001 From: peaklabs-dev <122374094+peaklabs-dev@users.noreply.github.com> Date: Tue, 27 May 2025 15:10:20 +0200 Subject: [PATCH 0040/1232] chore(api): update API docs --- .../Controllers/Api/ServicesController.php | 1 - openapi.json | 37 +++++++++++++++++++ openapi.yaml | 28 ++++++++++++++ 3 files changed, 65 insertions(+), 1 deletion(-) diff --git a/app/Http/Controllers/Api/ServicesController.php b/app/Http/Controllers/Api/ServicesController.php index 4f2cb61d7..542be83de 100644 --- a/app/Http/Controllers/Api/ServicesController.php +++ b/app/Http/Controllers/Api/ServicesController.php @@ -1432,7 +1432,6 @@ public function action_stop(Request $request) name: 'latest', in: 'query', description: 'Pull latest images.', - required: false, schema: new OA\Schema( type: 'boolean', default: false, diff --git a/openapi.json b/openapi.json index 40f663e51..791828aed 100644 --- a/openapi.json +++ b/openapi.json @@ -353,6 +353,10 @@ "type": "string", "nullable": true, "description": "Password for HTTP Basic Authentication" + }, + "connect_to_docker_network": { + "type": "boolean", + "description": "The flag to connect the service to the predefined Docker network." } }, "type": "object" @@ -701,6 +705,10 @@ "type": "string", "nullable": true, "description": "Password for HTTP Basic Authentication" + }, + "connect_to_docker_network": { + "type": "boolean", + "description": "The flag to connect the service to the predefined Docker network." } }, "type": "object" @@ -1049,6 +1057,10 @@ "type": "string", "nullable": true, "description": "Password for HTTP Basic Authentication" + }, + "connect_to_docker_network": { + "type": "boolean", + "description": "The flag to connect the service to the predefined Docker network." } }, "type": "object" @@ -1326,6 +1338,10 @@ "type": "string", "nullable": true, "description": "Password for HTTP Basic Authentication" + }, + "connect_to_docker_network": { + "type": "boolean", + "description": "The flag to connect the service to the predefined Docker network." } }, "type": "object" @@ -1586,6 +1602,10 @@ "type": "string", "nullable": true, "description": "Password for HTTP Basic Authentication" + }, + "connect_to_docker_network": { + "type": "boolean", + "description": "The flag to connect the service to the predefined Docker network." } }, "type": "object" @@ -1685,6 +1705,10 @@ "type": "boolean", "nullable": true, "description": "Use build server." + }, + "connect_to_docker_network": { + "type": "boolean", + "description": "The flag to connect the service to the predefined Docker network." } }, "type": "object" @@ -2147,6 +2171,10 @@ "type": "boolean", "nullable": true, "description": "Use build server." + }, + "connect_to_docker_network": { + "type": "boolean", + "description": "The flag to connect the service to the predefined Docker network." } }, "type": "object" @@ -7017,6 +7045,15 @@ "type": "string", "format": "uuid" } + }, + { + "name": "latest", + "in": "query", + "description": "Pull latest images.", + "schema": { + "type": "boolean", + "default": false + } } ], "responses": { diff --git a/openapi.yaml b/openapi.yaml index c5113d9f7..3f2fa1c59 100644 --- a/openapi.yaml +++ b/openapi.yaml @@ -259,6 +259,9 @@ paths: type: string nullable: true description: 'Password for HTTP Basic Authentication' + connect_to_docker_network: + type: boolean + description: 'The flag to connect the service to the predefined Docker network.' type: object responses: '201': @@ -509,6 +512,9 @@ paths: type: string nullable: true description: 'Password for HTTP Basic Authentication' + connect_to_docker_network: + type: boolean + description: 'The flag to connect the service to the predefined Docker network.' type: object responses: '201': @@ -759,6 +765,9 @@ paths: type: string nullable: true description: 'Password for HTTP Basic Authentication' + connect_to_docker_network: + type: boolean + description: 'The flag to connect the service to the predefined Docker network.' type: object responses: '201': @@ -956,6 +965,9 @@ paths: type: string nullable: true description: 'Password for HTTP Basic Authentication' + connect_to_docker_network: + type: boolean + description: 'The flag to connect the service to the predefined Docker network.' type: object responses: '201': @@ -1144,6 +1156,9 @@ paths: type: string nullable: true description: 'Password for HTTP Basic Authentication' + connect_to_docker_network: + type: boolean + description: 'The flag to connect the service to the predefined Docker network.' type: object responses: '201': @@ -1212,6 +1227,9 @@ paths: type: boolean nullable: true description: 'Use build server.' + connect_to_docker_network: + type: boolean + description: 'The flag to connect the service to the predefined Docker network.' type: object responses: '201': @@ -1539,6 +1557,9 @@ paths: type: boolean nullable: true description: 'Use build server.' + connect_to_docker_network: + type: boolean + description: 'The flag to connect the service to the predefined Docker network.' type: object responses: '200': @@ -4660,6 +4681,13 @@ paths: schema: type: string format: uuid + - + name: latest + in: query + description: 'Pull latest images.' + schema: + type: boolean + default: false responses: '200': description: 'Restart service.' From 82529a324654e4108f1ff6ff79c5825f4956b181 Mon Sep 17 00:00:00 2001 From: Andras Bacsai <5845193+andrasbacsai@users.noreply.github.com> Date: Wed, 28 May 2025 10:48:46 +0200 Subject: [PATCH 0041/1232] feat(routes): restrict backup download access to team admins and owners --- routes/web.php | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/routes/web.php b/routes/web.php index f1031e629..dc6817906 100644 --- a/routes/web.php +++ b/routes/web.php @@ -290,9 +290,13 @@ Route::get('/download/backup/{executionId}', function () { try { $team = auth()->user()->currentTeam(); + $user = auth()->user(); if (is_null($team)) { return response()->json(['message' => 'Team not found.'], 404); } + if ($user->isAdminFromSession() === false) { + return response()->json(['message' => 'Only team admins/owners can download backups.'], 403); + } $exeuctionId = request()->route('executionId'); $execution = ScheduledDatabaseBackupExecution::where('id', $exeuctionId)->firstOrFail(); $execution_team_id = $execution->scheduledDatabaseBackup->database->team()?->id; From 15c1b76db510f57585bcb52d2c6b42747ba04522 Mon Sep 17 00:00:00 2001 From: Andras Bacsai <5845193+andrasbacsai@users.noreply.github.com> Date: Wed, 28 May 2025 10:50:55 +0200 Subject: [PATCH 0042/1232] refactor(pricing-plans): improve label class binding for payment frequency selection --- .../subscription/pricing-plans.blade.php | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/resources/views/livewire/subscription/pricing-plans.blade.php b/resources/views/livewire/subscription/pricing-plans.blade.php index d9e4119ee..1c5cde63a 100644 --- a/resources/views/livewire/subscription/pricing-plans.blade.php +++ b/resources/views/livewire/subscription/pricing-plans.blade.php @@ -4,17 +4,22 @@
Payment frequency -
From 7af972507672dabed256ea5b5e2031d2055557ba Mon Sep 17 00:00:00 2001 From: Andras Bacsai <5845193+andrasbacsai@users.noreply.github.com> Date: Wed, 28 May 2025 11:49:04 +0200 Subject: [PATCH 0043/1232] feat(destination): update confirmation modal text and add persistent storage warning for server deployment --- .../project/shared/destination.blade.php | 24 ++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-) diff --git a/resources/views/livewire/project/shared/destination.blade.php b/resources/views/livewire/project/shared/destination.blade.php index 97e978e7a..6c0aa1d68 100644 --- a/resources/views/livewire/project/shared/destination.blade.php +++ b/resources/views/livewire/project/shared/destination.blade.php @@ -63,13 +63,14 @@ class="absolute bg-error -top-1 -left-1 badge ">
Stop @endif - + shortConfirmationLabel="Server Name" step3ButtonText="Remove application from server" />
@endforeach @@ -77,7 +78,24 @@ class="absolute bg-error -top-1 -left-1 badge ">
@if ($resource->getMorphClass() === 'App\Models\Application' && data_get($resource, 'build_pack') !== 'dockercompose')
- @if (count($networks) > 0) + @if ($resource->persistentStorages()->count() > 0) +

Add another server

+
+
+ +
+

Cannot add additional + servers

+

+ This application has persistent storage volumes configured. Applications with persistent + storage cannot be deployed to multiple servers as the storage would not be accessible + across different servers. +

+
+
+
+ @elseif (count($networks) > 0)

Add another server

@foreach ($networks as $network) From 0369909408d4045a2729dcefa7b85e7fe0ff9d9a Mon Sep 17 00:00:00 2001 From: Andras Bacsai <5845193+andrasbacsai@users.noreply.github.com> Date: Thu, 29 May 2025 10:47:26 +0200 Subject: [PATCH 0044/1232] fix(PushServerUpdateJob): add null checks before updating application and database statuses --- app/Jobs/PushServerUpdateJob.php | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/app/Jobs/PushServerUpdateJob.php b/app/Jobs/PushServerUpdateJob.php index 93b203fcb..fbf847ed3 100644 --- a/app/Jobs/PushServerUpdateJob.php +++ b/app/Jobs/PushServerUpdateJob.php @@ -317,13 +317,16 @@ private function updateServiceSubStatus(string $serviceId, string $subType, stri } if ($subType === 'application') { $application = $service->applications()->where('id', $subId)->first(); - $application->status = $containerStatus; - $application->save(); + if ($application) { + $application->status = $containerStatus; + $application->save(); + } } elseif ($subType === 'database') { $database = $service->databases()->where('id', $subId)->first(); - $database->status = $containerStatus; - $database->save(); - } else { + if ($database) { + $database->status = $containerStatus; + $database->save(); + } } } From 2361c34a537e718cc373c4ec9b0eba69447faa12 Mon Sep 17 00:00:00 2001 From: Andras Bacsai <5845193+andrasbacsai@users.noreply.github.com> Date: Thu, 29 May 2025 10:49:55 +0200 Subject: [PATCH 0045/1232] refactor(error-handling): replace generic Exception with RuntimeException for improved error specificity --- app/Actions/Service/DeleteService.php | 2 +- app/Models/Application.php | 2 +- bootstrap/helpers/shared.php | 6 +++--- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/app/Actions/Service/DeleteService.php b/app/Actions/Service/DeleteService.php index 372ffe397..404e11559 100644 --- a/app/Actions/Service/DeleteService.php +++ b/app/Actions/Service/DeleteService.php @@ -53,7 +53,7 @@ public function handle(Service $service, bool $deleteConfigurations, bool $delet instant_remote_process(["docker rm -f $service->uuid"], $server, throwError: false); } catch (\Exception $e) { - throw new \Exception($e->getMessage()); + throw new \RuntimeException($e->getMessage()); } finally { if ($deleteConfigurations) { $service->deleteConfigurations(); diff --git a/app/Models/Application.php b/app/Models/Application.php index 7929aadc1..f3f063d19 100644 --- a/app/Models/Application.php +++ b/app/Models/Application.php @@ -1289,7 +1289,7 @@ public function oldRawParser() try { $yaml = Yaml::parse($this->docker_compose_raw); } catch (\Exception $e) { - throw new \Exception($e->getMessage()); + throw new \RuntimeException($e->getMessage()); } $services = data_get($yaml, 'services'); diff --git a/bootstrap/helpers/shared.php b/bootstrap/helpers/shared.php index 7d6d55c5d..7e4dd121a 100644 --- a/bootstrap/helpers/shared.php +++ b/bootstrap/helpers/shared.php @@ -599,7 +599,7 @@ function getTopLevelNetworks(Service|Application $resource) try { $yaml = Yaml::parse($resource->docker_compose_raw); } catch (\Exception $e) { - throw new \Exception($e->getMessage()); + throw new \RuntimeException($e->getMessage()); } $services = data_get($yaml, 'services'); $topLevelNetworks = collect(data_get($yaml, 'networks', [])); @@ -653,7 +653,7 @@ function getTopLevelNetworks(Service|Application $resource) try { $yaml = Yaml::parse($resource->docker_compose_raw); } catch (\Exception $e) { - throw new \Exception($e->getMessage()); + throw new \RuntimeException($e->getMessage()); } $server = $resource->destination->server; $topLevelNetworks = collect(data_get($yaml, 'networks', [])); @@ -1435,7 +1435,7 @@ function parseDockerComposeFile(Service|Application $resource, bool $isNew = fal try { $yaml = Yaml::parse($resource->docker_compose_raw); } catch (\Exception $e) { - throw new \Exception($e->getMessage()); + throw new \RuntimeException($e->getMessage()); } $allServices = get_service_templates(); $topLevelVolumes = collect(data_get($yaml, 'volumes', [])); From c272a770e281b7cb3b0c0a8399a5e7db1fe19fdc Mon Sep 17 00:00:00 2001 From: Andras Bacsai <5845193+andrasbacsai@users.noreply.github.com> Date: Thu, 29 May 2025 10:54:35 +0200 Subject: [PATCH 0046/1232] refactor(error-handling): change Exception to RuntimeException for clearer error reporting --- app/Actions/Server/StartSentinel.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/Actions/Server/StartSentinel.php b/app/Actions/Server/StartSentinel.php index 2785505c0..1ecf882dc 100644 --- a/app/Actions/Server/StartSentinel.php +++ b/app/Actions/Server/StartSentinel.php @@ -27,7 +27,7 @@ public function handle(Server $server, bool $restart = false, ?string $latestVer $mountDir = '/data/coolify/sentinel'; $image = config('constants.coolify.registry_url').'/coollabsio/sentinel:'.$version; if (! $endpoint) { - throw new \Exception('You should set FQDN in Instance Settings.'); + throw new \RuntimeException('You should set FQDN in Instance Settings.'); } $environments = [ 'TOKEN' => $token, From 58be59a7b3d712550ae2a5054c3bde2aeca4d147 Mon Sep 17 00:00:00 2001 From: Andras Bacsai <5845193+andrasbacsai@users.noreply.github.com> Date: Thu, 29 May 2025 11:11:49 +0200 Subject: [PATCH 0047/1232] refactor(service): remove informational dispatch during service stop for cleaner execution --- app/Livewire/Project/Service/Heading.php | 1 - 1 file changed, 1 deletion(-) diff --git a/app/Livewire/Project/Service/Heading.php b/app/Livewire/Project/Service/Heading.php index 153b10fc8..eb7f469a8 100644 --- a/app/Livewire/Project/Service/Heading.php +++ b/app/Livewire/Project/Service/Heading.php @@ -121,7 +121,6 @@ public function forceDeploy() public function stop() { try { - $this->dispatch('info', 'Gracefully stopping service, it could take a while depending on the service.'); StopService::dispatch($this->service, false, $this->docker_cleanup); } catch (\Exception $e) { $this->dispatch('error', $e->getMessage()); From d2ce5c03f8defd859040de1a1068285f39d85be9 Mon Sep 17 00:00:00 2001 From: Andras Bacsai <5845193+andrasbacsai@users.noreply.github.com> Date: Thu, 29 May 2025 11:15:09 +0200 Subject: [PATCH 0048/1232] chore(dependencies): update package versions in composer.json and composer.lock for improved compatibility and performance --- composer.json | 6 +- composer.lock | 874 +++++++++++----------- public/vendor/telescope/app-dark.css | 6 +- public/vendor/telescope/app.css | 3 +- public/vendor/telescope/app.js | 2 +- public/vendor/telescope/mix-manifest.json | 2 +- 6 files changed, 456 insertions(+), 437 deletions(-) diff --git a/composer.json b/composer.json index 5b97e76e9..3fb1206ce 100644 --- a/composer.json +++ b/composer.json @@ -12,11 +12,11 @@ ], "require": { "php": "^8.4", - "danharrin/livewire-rate-limiting": "2.1.0", + "danharrin/livewire-rate-limiting": "^2.1.0", "doctrine/dbal": "^4.2.2", "guzzlehttp/guzzle": "^7.9.2", "laravel/fortify": "^1.25.4", - "laravel/framework": "12.4.1", + "laravel/framework": "^12.4.1", "laravel/horizon": "^5.30.3", "laravel/pail": "^1.2.2", "laravel/prompts": "^0.3.5|^0.3.5|^0.3.5", @@ -124,4 +124,4 @@ "@php artisan key:generate --ansi" ] } -} +} \ No newline at end of file diff --git a/composer.lock b/composer.lock index 939178d38..14ae57fcb 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "f0ef990aa6e05ab48d61fcc22c0c1ca2", + "content-hash": "ae74a752b941c9b981288c2934479eb8", "packages": [ { "name": "amphp/amp", @@ -870,16 +870,16 @@ }, { "name": "aws/aws-sdk-php", - "version": "3.342.17", + "version": "3.343.20", "source": { "type": "git", "url": "https://github.com/aws/aws-sdk-php.git", - "reference": "110ca44672e59ec3255c693e9e761001f2706b53" + "reference": "bf40b00d2e1cbd2a5d8c903743073440d8ebb5dc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/110ca44672e59ec3255c693e9e761001f2706b53", - "reference": "110ca44672e59ec3255c693e9e761001f2706b53", + "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/bf40b00d2e1cbd2a5d8c903743073440d8ebb5dc", + "reference": "bf40b00d2e1cbd2a5d8c903743073440d8ebb5dc", "shasum": "" }, "require": { @@ -961,9 +961,9 @@ "support": { "forum": "https://github.com/aws/aws-sdk-php/discussions", "issues": "https://github.com/aws/aws-sdk-php/issues", - "source": "https://github.com/aws/aws-sdk-php/tree/3.342.17" + "source": "https://github.com/aws/aws-sdk-php/tree/3.343.20" }, - "time": "2025-03-31T18:16:40+00:00" + "time": "2025-05-28T18:10:03+00:00" }, { "name": "bacon/bacon-qr-code", @@ -1479,26 +1479,29 @@ }, { "name": "doctrine/deprecations", - "version": "1.1.4", + "version": "1.1.5", "source": { "type": "git", "url": "https://github.com/doctrine/deprecations.git", - "reference": "31610dbb31faa98e6b5447b62340826f54fbc4e9" + "reference": "459c2f5dd3d6a4633d3b5f46ee2b1c40f57d3f38" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/deprecations/zipball/31610dbb31faa98e6b5447b62340826f54fbc4e9", - "reference": "31610dbb31faa98e6b5447b62340826f54fbc4e9", + "url": "https://api.github.com/repos/doctrine/deprecations/zipball/459c2f5dd3d6a4633d3b5f46ee2b1c40f57d3f38", + "reference": "459c2f5dd3d6a4633d3b5f46ee2b1c40f57d3f38", "shasum": "" }, "require": { "php": "^7.1 || ^8.0" }, + "conflict": { + "phpunit/phpunit": "<=7.5 || >=13" + }, "require-dev": { - "doctrine/coding-standard": "^9 || ^12", - "phpstan/phpstan": "1.4.10 || 2.0.3", + "doctrine/coding-standard": "^9 || ^12 || ^13", + "phpstan/phpstan": "1.4.10 || 2.1.11", "phpstan/phpstan-phpunit": "^1.0 || ^2", - "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.6 || ^10.5 || ^11.5 || ^12", "psr/log": "^1 || ^2 || ^3" }, "suggest": { @@ -1518,9 +1521,9 @@ "homepage": "https://www.doctrine-project.org/", "support": { "issues": "https://github.com/doctrine/deprecations/issues", - "source": "https://github.com/doctrine/deprecations/tree/1.1.4" + "source": "https://github.com/doctrine/deprecations/tree/1.1.5" }, - "time": "2024-12-07T21:18:45+00:00" + "time": "2025-04-07T20:06:18+00:00" }, { "name": "doctrine/inflector", @@ -1885,16 +1888,16 @@ }, { "name": "firebase/php-jwt", - "version": "v6.11.0", + "version": "v6.11.1", "source": { "type": "git", "url": "https://github.com/firebase/php-jwt.git", - "reference": "8f718f4dfc9c5d5f0c994cdfd103921b43592712" + "reference": "d1e91ecf8c598d073d0995afa8cd5c75c6e19e66" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/firebase/php-jwt/zipball/8f718f4dfc9c5d5f0c994cdfd103921b43592712", - "reference": "8f718f4dfc9c5d5f0c994cdfd103921b43592712", + "url": "https://api.github.com/repos/firebase/php-jwt/zipball/d1e91ecf8c598d073d0995afa8cd5c75c6e19e66", + "reference": "d1e91ecf8c598d073d0995afa8cd5c75c6e19e66", "shasum": "" }, "require": { @@ -1942,9 +1945,9 @@ ], "support": { "issues": "https://github.com/firebase/php-jwt/issues", - "source": "https://github.com/firebase/php-jwt/tree/v6.11.0" + "source": "https://github.com/firebase/php-jwt/tree/v6.11.1" }, - "time": "2025-01-23T05:11:06+00:00" + "time": "2025-04-09T20:32:01+00:00" }, { "name": "fruitcake/php-cors", @@ -2675,16 +2678,16 @@ }, { "name": "laravel/framework", - "version": "v12.4.1", + "version": "v12.16.0", "source": { "type": "git", "url": "https://github.com/laravel/framework.git", - "reference": "cdefd852ecb459a65392cd6ccb578c92a15b8e2b" + "reference": "293bb1c70224faebfd3d4328e201c37115da055f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/framework/zipball/cdefd852ecb459a65392cd6ccb578c92a15b8e2b", - "reference": "cdefd852ecb459a65392cd6ccb578c92a15b8e2b", + "url": "https://api.github.com/repos/laravel/framework/zipball/293bb1c70224faebfd3d4328e201c37115da055f", + "reference": "293bb1c70224faebfd3d4328e201c37115da055f", "shasum": "" }, "require": { @@ -2705,7 +2708,7 @@ "guzzlehttp/uri-template": "^1.0", "laravel/prompts": "^0.3.0", "laravel/serializable-closure": "^1.3|^2.0", - "league/commonmark": "^2.6", + "league/commonmark": "^2.7", "league/flysystem": "^3.25.1", "league/flysystem-local": "^3.25.1", "league/uri": "^7.5.1", @@ -2793,11 +2796,11 @@ "league/flysystem-sftp-v3": "^3.25.1", "mockery/mockery": "^1.6.10", "orchestra/testbench-core": "^10.0.0", - "pda/pheanstalk": "^5.0.6", + "pda/pheanstalk": "^5.0.6|^7.0.0", "php-http/discovery": "^1.15", "phpstan/phpstan": "^2.0", "phpunit/phpunit": "^10.5.35|^11.5.3|^12.0.1", - "predis/predis": "^2.3", + "predis/predis": "^2.3|^3.0", "resend/resend-php": "^0.10.0", "symfony/cache": "^7.2.0", "symfony/http-client": "^7.2.0", @@ -2829,7 +2832,7 @@ "pda/pheanstalk": "Required to use the beanstalk queue driver (^5.0).", "php-http/discovery": "Required to use PSR-7 bridging features (^1.15).", "phpunit/phpunit": "Required to use assertions and run tests (^10.5.35|^11.5.3|^12.0.1).", - "predis/predis": "Required to use the predis connector (^2.3).", + "predis/predis": "Required to use the predis connector (^2.3|^3.0).", "psr/http-message": "Required to allow Storage::put to accept a StreamInterface (^1.0).", "pusher/pusher-php-server": "Required to use the Pusher broadcast driver (^6.0|^7.0).", "resend/resend-php": "Required to enable support for the Resend mail transport (^0.10.0).", @@ -2886,20 +2889,20 @@ "issues": "https://github.com/laravel/framework/issues", "source": "https://github.com/laravel/framework" }, - "time": "2025-03-30T16:27:26+00:00" + "time": "2025-05-27T15:49:44+00:00" }, { "name": "laravel/horizon", - "version": "v5.31.0", + "version": "v5.32.1", "source": { "type": "git", "url": "https://github.com/laravel/horizon.git", - "reference": "a21e7d64784b24eaf3bf873f82affbf67707a72a" + "reference": "e78d9689d85b3d4769dc64def5eb6d94e5776beb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/horizon/zipball/a21e7d64784b24eaf3bf873f82affbf67707a72a", - "reference": "a21e7d64784b24eaf3bf873f82affbf67707a72a", + "url": "https://api.github.com/repos/laravel/horizon/zipball/e78d9689d85b3d4769dc64def5eb6d94e5776beb", + "reference": "e78d9689d85b3d4769dc64def5eb6d94e5776beb", "shasum": "" }, "require": { @@ -2939,7 +2942,7 @@ ] }, "branch-alias": { - "dev-master": "5.x-dev" + "dev-master": "6.x-dev" } }, "autoload": { @@ -2964,9 +2967,9 @@ ], "support": { "issues": "https://github.com/laravel/horizon/issues", - "source": "https://github.com/laravel/horizon/tree/v5.31.0" + "source": "https://github.com/laravel/horizon/tree/v5.32.1" }, - "time": "2025-03-04T14:56:42+00:00" + "time": "2025-05-19T13:13:30+00:00" }, { "name": "laravel/pail", @@ -3107,16 +3110,16 @@ }, { "name": "laravel/sanctum", - "version": "v4.0.8", + "version": "v4.1.1", "source": { "type": "git", "url": "https://github.com/laravel/sanctum.git", - "reference": "ec1dd9ddb2ab370f79dfe724a101856e0963f43c" + "reference": "a360a6a1fd2400ead4eb9b6a9c1bb272939194f5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/sanctum/zipball/ec1dd9ddb2ab370f79dfe724a101856e0963f43c", - "reference": "ec1dd9ddb2ab370f79dfe724a101856e0963f43c", + "url": "https://api.github.com/repos/laravel/sanctum/zipball/a360a6a1fd2400ead4eb9b6a9c1bb272939194f5", + "reference": "a360a6a1fd2400ead4eb9b6a9c1bb272939194f5", "shasum": "" }, "require": { @@ -3167,7 +3170,7 @@ "issues": "https://github.com/laravel/sanctum/issues", "source": "https://github.com/laravel/sanctum" }, - "time": "2025-01-26T19:34:36+00:00" + "time": "2025-04-23T13:03:38+00:00" }, { "name": "laravel/serializable-closure", @@ -3232,16 +3235,16 @@ }, { "name": "laravel/socialite", - "version": "v5.18.0", + "version": "v5.21.0", "source": { "type": "git", "url": "https://github.com/laravel/socialite.git", - "reference": "7809dc71250e074cd42970f0f803f2cddc04c5de" + "reference": "d83639499ad14985c9a6a9713b70073300ce998d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/socialite/zipball/7809dc71250e074cd42970f0f803f2cddc04c5de", - "reference": "7809dc71250e074cd42970f0f803f2cddc04c5de", + "url": "https://api.github.com/repos/laravel/socialite/zipball/d83639499ad14985c9a6a9713b70073300ce998d", + "reference": "d83639499ad14985c9a6a9713b70073300ce998d", "shasum": "" }, "require": { @@ -3258,7 +3261,7 @@ "require-dev": { "mockery/mockery": "^1.0", "orchestra/testbench": "^4.0|^5.0|^6.0|^7.0|^8.0|^9.0|^10.0", - "phpstan/phpstan": "^1.10", + "phpstan/phpstan": "^1.12.23", "phpunit/phpunit": "^8.0|^9.3|^10.4|^11.5" }, "type": "library", @@ -3300,7 +3303,7 @@ "issues": "https://github.com/laravel/socialite/issues", "source": "https://github.com/laravel/socialite" }, - "time": "2025-02-11T13:38:19+00:00" + "time": "2025-05-19T12:56:37+00:00" }, { "name": "laravel/tinker", @@ -3506,16 +3509,16 @@ }, { "name": "league/commonmark", - "version": "2.6.1", + "version": "2.7.0", "source": { "type": "git", "url": "https://github.com/thephpleague/commonmark.git", - "reference": "d990688c91cedfb69753ffc2512727ec646df2ad" + "reference": "6fbb36d44824ed4091adbcf4c7d4a3923cdb3405" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/commonmark/zipball/d990688c91cedfb69753ffc2512727ec646df2ad", - "reference": "d990688c91cedfb69753ffc2512727ec646df2ad", + "url": "https://api.github.com/repos/thephpleague/commonmark/zipball/6fbb36d44824ed4091adbcf4c7d4a3923cdb3405", + "reference": "6fbb36d44824ed4091adbcf4c7d4a3923cdb3405", "shasum": "" }, "require": { @@ -3552,7 +3555,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "2.7-dev" + "dev-main": "2.8-dev" } }, "autoload": { @@ -3609,7 +3612,7 @@ "type": "tidelift" } ], - "time": "2024-12-29T14:10:59+00:00" + "time": "2025-05-05T12:20:28+00:00" }, { "name": "league/config", @@ -4237,16 +4240,16 @@ }, { "name": "livewire/livewire", - "version": "v3.6.2", + "version": "v3.6.3", "source": { "type": "git", "url": "https://github.com/livewire/livewire.git", - "reference": "8f8914731f5eb43b6bb145d87c8d5a9edfc89313" + "reference": "56aa1bb63a46e06181c56fa64717a7287e19115e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/livewire/livewire/zipball/8f8914731f5eb43b6bb145d87c8d5a9edfc89313", - "reference": "8f8914731f5eb43b6bb145d87c8d5a9edfc89313", + "url": "https://api.github.com/repos/livewire/livewire/zipball/56aa1bb63a46e06181c56fa64717a7287e19115e", + "reference": "56aa1bb63a46e06181c56fa64717a7287e19115e", "shasum": "" }, "require": { @@ -4301,7 +4304,7 @@ "description": "A front-end framework for Laravel.", "support": { "issues": "https://github.com/livewire/livewire/issues", - "source": "https://github.com/livewire/livewire/tree/v3.6.2" + "source": "https://github.com/livewire/livewire/tree/v3.6.3" }, "funding": [ { @@ -4309,7 +4312,7 @@ "type": "github" } ], - "time": "2025-03-12T20:24:15+00:00" + "time": "2025-04-12T22:26:52+00:00" }, { "name": "log1x/laravel-webfonts", @@ -4692,16 +4695,16 @@ }, { "name": "nesbot/carbon", - "version": "3.8.6", + "version": "3.9.1", "source": { "type": "git", "url": "https://github.com/CarbonPHP/carbon.git", - "reference": "ff2f20cf83bd4d503720632ce8a426dc747bf7fd" + "reference": "ced71f79398ece168e24f7f7710462f462310d4d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/CarbonPHP/carbon/zipball/ff2f20cf83bd4d503720632ce8a426dc747bf7fd", - "reference": "ff2f20cf83bd4d503720632ce8a426dc747bf7fd", + "url": "https://api.github.com/repos/CarbonPHP/carbon/zipball/ced71f79398ece168e24f7f7710462f462310d4d", + "reference": "ced71f79398ece168e24f7f7710462f462310d4d", "shasum": "" }, "require": { @@ -4794,7 +4797,7 @@ "type": "tidelift" } ], - "time": "2025-02-20T17:33:38+00:00" + "time": "2025-05-01T19:51:51+00:00" }, { "name": "nette/schema", @@ -5057,31 +5060,31 @@ }, { "name": "nunomaduro/termwind", - "version": "v2.3.0", + "version": "v2.3.1", "source": { "type": "git", "url": "https://github.com/nunomaduro/termwind.git", - "reference": "52915afe6a1044e8b9cee1bcff836fb63acf9cda" + "reference": "dfa08f390e509967a15c22493dc0bac5733d9123" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nunomaduro/termwind/zipball/52915afe6a1044e8b9cee1bcff836fb63acf9cda", - "reference": "52915afe6a1044e8b9cee1bcff836fb63acf9cda", + "url": "https://api.github.com/repos/nunomaduro/termwind/zipball/dfa08f390e509967a15c22493dc0bac5733d9123", + "reference": "dfa08f390e509967a15c22493dc0bac5733d9123", "shasum": "" }, "require": { "ext-mbstring": "*", "php": "^8.2", - "symfony/console": "^7.1.8" + "symfony/console": "^7.2.6" }, "require-dev": { - "illuminate/console": "^11.33.2", - "laravel/pint": "^1.18.2", + "illuminate/console": "^11.44.7", + "laravel/pint": "^1.22.0", "mockery/mockery": "^1.6.12", - "pestphp/pest": "^2.36.0", - "phpstan/phpstan": "^1.12.11", - "phpstan/phpstan-strict-rules": "^1.6.1", - "symfony/var-dumper": "^7.1.8", + "pestphp/pest": "^2.36.0 || ^3.8.2", + "phpstan/phpstan": "^1.12.25", + "phpstan/phpstan-strict-rules": "^1.6.2", + "symfony/var-dumper": "^7.2.6", "thecodingmachine/phpstan-strict-rules": "^1.0.0" }, "type": "library", @@ -5124,7 +5127,7 @@ ], "support": { "issues": "https://github.com/nunomaduro/termwind/issues", - "source": "https://github.com/nunomaduro/termwind/tree/v2.3.0" + "source": "https://github.com/nunomaduro/termwind/tree/v2.3.1" }, "funding": [ { @@ -5140,7 +5143,7 @@ "type": "github" } ], - "time": "2024-11-21T10:39:51+00:00" + "time": "2025-05-08T08:14:37+00:00" }, { "name": "nyholm/psr7", @@ -5485,16 +5488,16 @@ }, { "name": "php-di/php-di", - "version": "7.0.9", + "version": "7.0.10", "source": { "type": "git", "url": "https://github.com/PHP-DI/PHP-DI.git", - "reference": "d8480267f5cf239650debba704f3ecd15b638cde" + "reference": "0d1ed64126577e9a095b3204dcaee58cf76432c2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/PHP-DI/PHP-DI/zipball/d8480267f5cf239650debba704f3ecd15b638cde", - "reference": "d8480267f5cf239650debba704f3ecd15b638cde", + "url": "https://api.github.com/repos/PHP-DI/PHP-DI/zipball/0d1ed64126577e9a095b3204dcaee58cf76432c2", + "reference": "0d1ed64126577e9a095b3204dcaee58cf76432c2", "shasum": "" }, "require": { @@ -5510,7 +5513,7 @@ "friendsofphp/php-cs-fixer": "^3", "friendsofphp/proxy-manager-lts": "^1", "mnapoli/phpunit-easymock": "^1.3", - "phpunit/phpunit": "^9.6", + "phpunit/phpunit": "^9.6 || ^10 || ^11", "vimeo/psalm": "^5|^6" }, "suggest": { @@ -5542,7 +5545,7 @@ ], "support": { "issues": "https://github.com/PHP-DI/PHP-DI/issues", - "source": "https://github.com/PHP-DI/PHP-DI/tree/7.0.9" + "source": "https://github.com/PHP-DI/PHP-DI/tree/7.0.10" }, "funding": [ { @@ -5554,7 +5557,7 @@ "type": "tidelift" } ], - "time": "2025-02-28T12:46:35+00:00" + "time": "2025-04-22T08:53:15+00:00" }, { "name": "phpdocumentor/reflection", @@ -5678,16 +5681,16 @@ }, { "name": "phpdocumentor/reflection-docblock", - "version": "5.6.1", + "version": "5.6.2", "source": { "type": "git", "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", - "reference": "e5e784149a09bd69d9a5e3b01c5cbd2e2bd653d8" + "reference": "92dde6a5919e34835c506ac8c523ef095a95ed62" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/e5e784149a09bd69d9a5e3b01c5cbd2e2bd653d8", - "reference": "e5e784149a09bd69d9a5e3b01c5cbd2e2bd653d8", + "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/92dde6a5919e34835c506ac8c523ef095a95ed62", + "reference": "92dde6a5919e34835c506ac8c523ef095a95ed62", "shasum": "" }, "require": { @@ -5736,9 +5739,9 @@ "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.", "support": { "issues": "https://github.com/phpDocumentor/ReflectionDocBlock/issues", - "source": "https://github.com/phpDocumentor/ReflectionDocBlock/tree/5.6.1" + "source": "https://github.com/phpDocumentor/ReflectionDocBlock/tree/5.6.2" }, - "time": "2024-12-07T09:39:29+00:00" + "time": "2025-04-13T19:20:35+00:00" }, { "name": "phpdocumentor/type-resolver", @@ -7253,16 +7256,16 @@ }, { "name": "sentry/sentry", - "version": "4.10.0", + "version": "4.11.1", "source": { "type": "git", "url": "https://github.com/getsentry/sentry-php.git", - "reference": "2af937d47d8aadb8dab0b1d7b9557e495dd12856" + "reference": "53dc0bcb6a667cac5b760b46f98d5380e63e02ca" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/getsentry/sentry-php/zipball/2af937d47d8aadb8dab0b1d7b9557e495dd12856", - "reference": "2af937d47d8aadb8dab0b1d7b9557e495dd12856", + "url": "https://api.github.com/repos/getsentry/sentry-php/zipball/53dc0bcb6a667cac5b760b46f98d5380e63e02ca", + "reference": "53dc0bcb6a667cac5b760b46f98d5380e63e02ca", "shasum": "" }, "require": { @@ -7326,7 +7329,7 @@ ], "support": { "issues": "https://github.com/getsentry/sentry-php/issues", - "source": "https://github.com/getsentry/sentry-php/tree/4.10.0" + "source": "https://github.com/getsentry/sentry-php/tree/4.11.1" }, "funding": [ { @@ -7338,7 +7341,7 @@ "type": "custom" } ], - "time": "2024-11-06T07:44:19+00:00" + "time": "2025-05-12T11:30:33+00:00" }, { "name": "sentry/sentry-laravel", @@ -7698,16 +7701,16 @@ }, { "name": "spatie/backtrace", - "version": "1.7.1", + "version": "1.7.4", "source": { "type": "git", "url": "https://github.com/spatie/backtrace.git", - "reference": "0f2477c520e3729de58e061b8192f161c99f770b" + "reference": "cd37a49fce7137359ac30ecc44ef3e16404cccbe" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/spatie/backtrace/zipball/0f2477c520e3729de58e061b8192f161c99f770b", - "reference": "0f2477c520e3729de58e061b8192f161c99f770b", + "url": "https://api.github.com/repos/spatie/backtrace/zipball/cd37a49fce7137359ac30ecc44ef3e16404cccbe", + "reference": "cd37a49fce7137359ac30ecc44ef3e16404cccbe", "shasum": "" }, "require": { @@ -7745,7 +7748,7 @@ "spatie" ], "support": { - "source": "https://github.com/spatie/backtrace/tree/1.7.1" + "source": "https://github.com/spatie/backtrace/tree/1.7.4" }, "funding": [ { @@ -7757,7 +7760,7 @@ "type": "other" } ], - "time": "2024-12-02T13:28:15+00:00" + "time": "2025-05-08T15:41:09+00:00" }, { "name": "spatie/laravel-activitylog", @@ -7852,16 +7855,16 @@ }, { "name": "spatie/laravel-data", - "version": "4.14.1", + "version": "4.15.1", "source": { "type": "git", "url": "https://github.com/spatie/laravel-data.git", - "reference": "edd61b4dca5acdcfd1e3b7f2c19b75e83730f87c" + "reference": "cb97afe6c0dadeb2e76ea1b7220cd04ed33dcca9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/spatie/laravel-data/zipball/edd61b4dca5acdcfd1e3b7f2c19b75e83730f87c", - "reference": "edd61b4dca5acdcfd1e3b7f2c19b75e83730f87c", + "url": "https://api.github.com/repos/spatie/laravel-data/zipball/cb97afe6c0dadeb2e76ea1b7220cd04ed33dcca9", + "reference": "cb97afe6c0dadeb2e76ea1b7220cd04ed33dcca9", "shasum": "" }, "require": { @@ -7874,6 +7877,7 @@ "require-dev": { "fakerphp/faker": "^1.14", "friendsofphp/php-cs-fixer": "^3.0", + "inertiajs/inertia-laravel": "^2.0", "livewire/livewire": "^3.0", "mockery/mockery": "^1.6", "nesbot/carbon": "^2.63|^3.0", @@ -7922,7 +7926,7 @@ ], "support": { "issues": "https://github.com/spatie/laravel-data/issues", - "source": "https://github.com/spatie/laravel-data/tree/4.14.1" + "source": "https://github.com/spatie/laravel-data/tree/4.15.1" }, "funding": [ { @@ -7930,20 +7934,20 @@ "type": "github" } ], - "time": "2025-03-17T13:54:28+00:00" + "time": "2025-04-10T06:06:27+00:00" }, { "name": "spatie/laravel-package-tools", - "version": "1.92.0", + "version": "1.92.4", "source": { "type": "git", "url": "https://github.com/spatie/laravel-package-tools.git", - "reference": "dd46cd0ed74015db28822d88ad2e667f4496a6f6" + "reference": "d20b1969f836d210459b78683d85c9cd5c5f508c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/spatie/laravel-package-tools/zipball/dd46cd0ed74015db28822d88ad2e667f4496a6f6", - "reference": "dd46cd0ed74015db28822d88ad2e667f4496a6f6", + "url": "https://api.github.com/repos/spatie/laravel-package-tools/zipball/d20b1969f836d210459b78683d85c9cd5c5f508c", + "reference": "d20b1969f836d210459b78683d85c9cd5c5f508c", "shasum": "" }, "require": { @@ -7954,6 +7958,7 @@ "mockery/mockery": "^1.5", "orchestra/testbench": "^7.7|^8.0|^9.0|^10.0", "pestphp/pest": "^1.23|^2.1|^3.1", + "phpunit/php-code-coverage": "^9.0|^10.0|^11.0", "phpunit/phpunit": "^9.5.24|^10.5|^11.5", "spatie/pest-plugin-test-time": "^1.1|^2.2" }, @@ -7982,7 +7987,7 @@ ], "support": { "issues": "https://github.com/spatie/laravel-package-tools/issues", - "source": "https://github.com/spatie/laravel-package-tools/tree/1.92.0" + "source": "https://github.com/spatie/laravel-package-tools/tree/1.92.4" }, "funding": [ { @@ -7990,7 +7995,7 @@ "type": "github" } ], - "time": "2025-03-27T08:34:10+00:00" + "time": "2025-04-11T15:27:14+00:00" }, { "name": "spatie/laravel-ray", @@ -8287,16 +8292,16 @@ }, { "name": "spatie/ray", - "version": "1.41.6", + "version": "1.42.0", "source": { "type": "git", "url": "https://github.com/spatie/ray.git", - "reference": "ae6e32a54a901544a3d70b12b865900bc240f71c" + "reference": "152250ce7c490bf830349fa30ba5200084e95860" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/spatie/ray/zipball/ae6e32a54a901544a3d70b12b865900bc240f71c", - "reference": "ae6e32a54a901544a3d70b12b865900bc240f71c", + "url": "https://api.github.com/repos/spatie/ray/zipball/152250ce7c490bf830349fa30ba5200084e95860", + "reference": "152250ce7c490bf830349fa30ba5200084e95860", "shasum": "" }, "require": { @@ -8356,7 +8361,7 @@ ], "support": { "issues": "https://github.com/spatie/ray/issues", - "source": "https://github.com/spatie/ray/tree/1.41.6" + "source": "https://github.com/spatie/ray/tree/1.42.0" }, "funding": [ { @@ -8368,7 +8373,7 @@ "type": "other" } ], - "time": "2025-03-21T08:56:30+00:00" + "time": "2025-04-18T08:17:40+00:00" }, { "name": "spatie/url", @@ -8434,16 +8439,16 @@ }, { "name": "stevebauman/purify", - "version": "v6.3.0", + "version": "v6.3.1", "source": { "type": "git", "url": "https://github.com/stevebauman/purify.git", - "reference": "2e5e6e1bfe072189b6056c6ad4a8c68ba57f3ba1" + "reference": "3acb5e77904f420ce8aad8fa1c7f394e82daa500" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/stevebauman/purify/zipball/2e5e6e1bfe072189b6056c6ad4a8c68ba57f3ba1", - "reference": "2e5e6e1bfe072189b6056c6ad4a8c68ba57f3ba1", + "url": "https://api.github.com/repos/stevebauman/purify/zipball/3acb5e77904f420ce8aad8fa1c7f394e82daa500", + "reference": "3acb5e77904f420ce8aad8fa1c7f394e82daa500", "shasum": "" }, "require": { @@ -8494,9 +8499,9 @@ ], "support": { "issues": "https://github.com/stevebauman/purify/issues", - "source": "https://github.com/stevebauman/purify/tree/v6.3.0" + "source": "https://github.com/stevebauman/purify/tree/v6.3.1" }, - "time": "2025-02-18T23:08:15+00:00" + "time": "2025-05-21T16:53:09+00:00" }, { "name": "stripe/stripe-php", @@ -8559,7 +8564,7 @@ }, { "name": "symfony/clock", - "version": "v7.2.0", + "version": "v7.3.0", "source": { "type": "git", "url": "https://github.com/symfony/clock.git", @@ -8613,7 +8618,7 @@ "time" ], "support": { - "source": "https://github.com/symfony/clock/tree/v7.2.0" + "source": "https://github.com/symfony/clock/tree/v7.3.0" }, "funding": [ { @@ -8633,23 +8638,24 @@ }, { "name": "symfony/console", - "version": "v7.2.5", + "version": "v7.3.0", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "e51498ea18570c062e7df29d05a7003585b19b88" + "reference": "66c1440edf6f339fd82ed6c7caa76cb006211b44" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/e51498ea18570c062e7df29d05a7003585b19b88", - "reference": "e51498ea18570c062e7df29d05a7003585b19b88", + "url": "https://api.github.com/repos/symfony/console/zipball/66c1440edf6f339fd82ed6c7caa76cb006211b44", + "reference": "66c1440edf6f339fd82ed6c7caa76cb006211b44", "shasum": "" }, "require": { "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3", "symfony/polyfill-mbstring": "~1.0", "symfony/service-contracts": "^2.5|^3", - "symfony/string": "^6.4|^7.0" + "symfony/string": "^7.2" }, "conflict": { "symfony/dependency-injection": "<6.4", @@ -8706,7 +8712,7 @@ "terminal" ], "support": { - "source": "https://github.com/symfony/console/tree/v7.2.5" + "source": "https://github.com/symfony/console/tree/v7.3.0" }, "funding": [ { @@ -8722,11 +8728,11 @@ "type": "tidelift" } ], - "time": "2025-03-12T08:11:12+00:00" + "time": "2025-05-24T10:34:04+00:00" }, { "name": "symfony/css-selector", - "version": "v7.2.0", + "version": "v7.3.0", "source": { "type": "git", "url": "https://github.com/symfony/css-selector.git", @@ -8771,7 +8777,7 @@ "description": "Converts CSS selectors to XPath expressions", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/css-selector/tree/v7.2.0" + "source": "https://github.com/symfony/css-selector/tree/v7.3.0" }, "funding": [ { @@ -8791,16 +8797,16 @@ }, { "name": "symfony/deprecation-contracts", - "version": "v3.5.1", + "version": "v3.6.0", "source": { "type": "git", "url": "https://github.com/symfony/deprecation-contracts.git", - "reference": "74c71c939a79f7d5bf3c1ce9f5ea37ba0114c6f6" + "reference": "63afe740e99a13ba87ec199bb07bbdee937a5b62" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/74c71c939a79f7d5bf3c1ce9f5ea37ba0114c6f6", - "reference": "74c71c939a79f7d5bf3c1ce9f5ea37ba0114c6f6", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/63afe740e99a13ba87ec199bb07bbdee937a5b62", + "reference": "63afe740e99a13ba87ec199bb07bbdee937a5b62", "shasum": "" }, "require": { @@ -8813,7 +8819,7 @@ "name": "symfony/contracts" }, "branch-alias": { - "dev-main": "3.5-dev" + "dev-main": "3.6-dev" } }, "autoload": { @@ -8838,7 +8844,7 @@ "description": "A generic function and convention to trigger deprecation notices", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/deprecation-contracts/tree/v3.5.1" + "source": "https://github.com/symfony/deprecation-contracts/tree/v3.6.0" }, "funding": [ { @@ -8854,20 +8860,20 @@ "type": "tidelift" } ], - "time": "2024-09-25T14:20:29+00:00" + "time": "2024-09-25T14:21:43+00:00" }, { "name": "symfony/error-handler", - "version": "v7.2.5", + "version": "v7.3.0", "source": { "type": "git", "url": "https://github.com/symfony/error-handler.git", - "reference": "102be5e6a8e4f4f3eb3149bcbfa33a80d1ee374b" + "reference": "cf68d225bc43629de4ff54778029aee6dc191b83" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/error-handler/zipball/102be5e6a8e4f4f3eb3149bcbfa33a80d1ee374b", - "reference": "102be5e6a8e4f4f3eb3149bcbfa33a80d1ee374b", + "url": "https://api.github.com/repos/symfony/error-handler/zipball/cf68d225bc43629de4ff54778029aee6dc191b83", + "reference": "cf68d225bc43629de4ff54778029aee6dc191b83", "shasum": "" }, "require": { @@ -8880,9 +8886,11 @@ "symfony/http-kernel": "<6.4" }, "require-dev": { + "symfony/console": "^6.4|^7.0", "symfony/deprecation-contracts": "^2.5|^3", "symfony/http-kernel": "^6.4|^7.0", - "symfony/serializer": "^6.4|^7.0" + "symfony/serializer": "^6.4|^7.0", + "symfony/webpack-encore-bundle": "^1.0|^2.0" }, "bin": [ "Resources/bin/patch-type-declarations" @@ -8913,7 +8921,7 @@ "description": "Provides tools to manage errors and ease debugging PHP code", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/error-handler/tree/v7.2.5" + "source": "https://github.com/symfony/error-handler/tree/v7.3.0" }, "funding": [ { @@ -8929,20 +8937,20 @@ "type": "tidelift" } ], - "time": "2025-03-03T07:12:39+00:00" + "time": "2025-05-29T07:19:49+00:00" }, { "name": "symfony/event-dispatcher", - "version": "v7.2.0", + "version": "v7.3.0", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher.git", - "reference": "910c5db85a5356d0fea57680defec4e99eb9c8c1" + "reference": "497f73ac996a598c92409b44ac43b6690c4f666d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/910c5db85a5356d0fea57680defec4e99eb9c8c1", - "reference": "910c5db85a5356d0fea57680defec4e99eb9c8c1", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/497f73ac996a598c92409b44ac43b6690c4f666d", + "reference": "497f73ac996a598c92409b44ac43b6690c4f666d", "shasum": "" }, "require": { @@ -8993,7 +9001,7 @@ "description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/event-dispatcher/tree/v7.2.0" + "source": "https://github.com/symfony/event-dispatcher/tree/v7.3.0" }, "funding": [ { @@ -9009,20 +9017,20 @@ "type": "tidelift" } ], - "time": "2024-09-25T14:21:43+00:00" + "time": "2025-04-22T09:11:45+00:00" }, { "name": "symfony/event-dispatcher-contracts", - "version": "v3.5.1", + "version": "v3.6.0", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher-contracts.git", - "reference": "7642f5e970b672283b7823222ae8ef8bbc160b9f" + "reference": "59eb412e93815df44f05f342958efa9f46b1e586" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/7642f5e970b672283b7823222ae8ef8bbc160b9f", - "reference": "7642f5e970b672283b7823222ae8ef8bbc160b9f", + "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/59eb412e93815df44f05f342958efa9f46b1e586", + "reference": "59eb412e93815df44f05f342958efa9f46b1e586", "shasum": "" }, "require": { @@ -9036,7 +9044,7 @@ "name": "symfony/contracts" }, "branch-alias": { - "dev-main": "3.5-dev" + "dev-main": "3.6-dev" } }, "autoload": { @@ -9069,7 +9077,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v3.5.1" + "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v3.6.0" }, "funding": [ { @@ -9085,20 +9093,20 @@ "type": "tidelift" } ], - "time": "2024-09-25T14:20:29+00:00" + "time": "2024-09-25T14:21:43+00:00" }, { "name": "symfony/finder", - "version": "v7.2.2", + "version": "v7.3.0", "source": { "type": "git", "url": "https://github.com/symfony/finder.git", - "reference": "87a71856f2f56e4100373e92529eed3171695cfb" + "reference": "ec2344cf77a48253bbca6939aa3d2477773ea63d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/87a71856f2f56e4100373e92529eed3171695cfb", - "reference": "87a71856f2f56e4100373e92529eed3171695cfb", + "url": "https://api.github.com/repos/symfony/finder/zipball/ec2344cf77a48253bbca6939aa3d2477773ea63d", + "reference": "ec2344cf77a48253bbca6939aa3d2477773ea63d", "shasum": "" }, "require": { @@ -9133,7 +9141,7 @@ "description": "Finds files and directories via an intuitive fluent interface", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/finder/tree/v7.2.2" + "source": "https://github.com/symfony/finder/tree/v7.3.0" }, "funding": [ { @@ -9149,20 +9157,20 @@ "type": "tidelift" } ], - "time": "2024-12-30T19:00:17+00:00" + "time": "2024-12-30T19:00:26+00:00" }, { "name": "symfony/http-foundation", - "version": "v7.2.5", + "version": "v7.3.0", "source": { "type": "git", "url": "https://github.com/symfony/http-foundation.git", - "reference": "371272aeb6286f8135e028ca535f8e4d6f114126" + "reference": "4236baf01609667d53b20371486228231eb135fd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/371272aeb6286f8135e028ca535f8e4d6f114126", - "reference": "371272aeb6286f8135e028ca535f8e4d6f114126", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/4236baf01609667d53b20371486228231eb135fd", + "reference": "4236baf01609667d53b20371486228231eb135fd", "shasum": "" }, "require": { @@ -9179,6 +9187,7 @@ "doctrine/dbal": "^3.6|^4", "predis/predis": "^1.1|^2.0", "symfony/cache": "^6.4.12|^7.1.5", + "symfony/clock": "^6.4|^7.0", "symfony/dependency-injection": "^6.4|^7.0", "symfony/expression-language": "^6.4|^7.0", "symfony/http-kernel": "^6.4|^7.0", @@ -9211,7 +9220,7 @@ "description": "Defines an object-oriented layer for the HTTP specification", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-foundation/tree/v7.2.5" + "source": "https://github.com/symfony/http-foundation/tree/v7.3.0" }, "funding": [ { @@ -9227,20 +9236,20 @@ "type": "tidelift" } ], - "time": "2025-03-25T15:54:33+00:00" + "time": "2025-05-12T14:48:23+00:00" }, { "name": "symfony/http-kernel", - "version": "v7.2.5", + "version": "v7.3.0", "source": { "type": "git", "url": "https://github.com/symfony/http-kernel.git", - "reference": "b1fe91bc1fa454a806d3f98db4ba826eb9941a54" + "reference": "ac7b8e163e8c83dce3abcc055a502d4486051a9f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-kernel/zipball/b1fe91bc1fa454a806d3f98db4ba826eb9941a54", - "reference": "b1fe91bc1fa454a806d3f98db4ba826eb9941a54", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/ac7b8e163e8c83dce3abcc055a502d4486051a9f", + "reference": "ac7b8e163e8c83dce3abcc055a502d4486051a9f", "shasum": "" }, "require": { @@ -9248,8 +9257,8 @@ "psr/log": "^1|^2|^3", "symfony/deprecation-contracts": "^2.5|^3", "symfony/error-handler": "^6.4|^7.0", - "symfony/event-dispatcher": "^6.4|^7.0", - "symfony/http-foundation": "^6.4|^7.0", + "symfony/event-dispatcher": "^7.3", + "symfony/http-foundation": "^7.3", "symfony/polyfill-ctype": "^1.8" }, "conflict": { @@ -9325,7 +9334,7 @@ "description": "Provides a structured process for converting a Request into a Response", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-kernel/tree/v7.2.5" + "source": "https://github.com/symfony/http-kernel/tree/v7.3.0" }, "funding": [ { @@ -9341,20 +9350,20 @@ "type": "tidelift" } ], - "time": "2025-03-28T13:32:50+00:00" + "time": "2025-05-29T07:47:32+00:00" }, { "name": "symfony/mailer", - "version": "v7.2.3", + "version": "v7.3.0", "source": { "type": "git", "url": "https://github.com/symfony/mailer.git", - "reference": "f3871b182c44997cf039f3b462af4a48fb85f9d3" + "reference": "0f375bbbde96ae8c78e4aa3e63aabd486e33364c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mailer/zipball/f3871b182c44997cf039f3b462af4a48fb85f9d3", - "reference": "f3871b182c44997cf039f3b462af4a48fb85f9d3", + "url": "https://api.github.com/repos/symfony/mailer/zipball/0f375bbbde96ae8c78e4aa3e63aabd486e33364c", + "reference": "0f375bbbde96ae8c78e4aa3e63aabd486e33364c", "shasum": "" }, "require": { @@ -9405,7 +9414,7 @@ "description": "Helps sending emails", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/mailer/tree/v7.2.3" + "source": "https://github.com/symfony/mailer/tree/v7.3.0" }, "funding": [ { @@ -9421,20 +9430,20 @@ "type": "tidelift" } ], - "time": "2025-01-27T11:08:17+00:00" + "time": "2025-04-04T09:51:09+00:00" }, { "name": "symfony/mime", - "version": "v7.2.4", + "version": "v7.3.0", "source": { "type": "git", "url": "https://github.com/symfony/mime.git", - "reference": "87ca22046b78c3feaff04b337f33b38510fd686b" + "reference": "0e7b19b2f399c31df0cdbe5d8cbf53f02f6cfcd9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mime/zipball/87ca22046b78c3feaff04b337f33b38510fd686b", - "reference": "87ca22046b78c3feaff04b337f33b38510fd686b", + "url": "https://api.github.com/repos/symfony/mime/zipball/0e7b19b2f399c31df0cdbe5d8cbf53f02f6cfcd9", + "reference": "0e7b19b2f399c31df0cdbe5d8cbf53f02f6cfcd9", "shasum": "" }, "require": { @@ -9489,7 +9498,7 @@ "mime-type" ], "support": { - "source": "https://github.com/symfony/mime/tree/v7.2.4" + "source": "https://github.com/symfony/mime/tree/v7.3.0" }, "funding": [ { @@ -9505,20 +9514,20 @@ "type": "tidelift" } ], - "time": "2025-02-19T08:51:20+00:00" + "time": "2025-02-19T08:51:26+00:00" }, { "name": "symfony/options-resolver", - "version": "v7.2.0", + "version": "v7.3.0", "source": { "type": "git", "url": "https://github.com/symfony/options-resolver.git", - "reference": "7da8fbac9dcfef75ffc212235d76b2754ce0cf50" + "reference": "afb9a8038025e5dbc657378bfab9198d75f10fca" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/options-resolver/zipball/7da8fbac9dcfef75ffc212235d76b2754ce0cf50", - "reference": "7da8fbac9dcfef75ffc212235d76b2754ce0cf50", + "url": "https://api.github.com/repos/symfony/options-resolver/zipball/afb9a8038025e5dbc657378bfab9198d75f10fca", + "reference": "afb9a8038025e5dbc657378bfab9198d75f10fca", "shasum": "" }, "require": { @@ -9556,7 +9565,7 @@ "options" ], "support": { - "source": "https://github.com/symfony/options-resolver/tree/v7.2.0" + "source": "https://github.com/symfony/options-resolver/tree/v7.3.0" }, "funding": [ { @@ -9572,11 +9581,11 @@ "type": "tidelift" } ], - "time": "2024-11-20T11:17:29+00:00" + "time": "2025-04-04T13:12:05+00:00" }, { "name": "symfony/polyfill-ctype", - "version": "v1.31.0", + "version": "v1.32.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-ctype.git", @@ -9635,7 +9644,7 @@ "portable" ], "support": { - "source": "https://github.com/symfony/polyfill-ctype/tree/v1.31.0" + "source": "https://github.com/symfony/polyfill-ctype/tree/v1.32.0" }, "funding": [ { @@ -9655,16 +9664,16 @@ }, { "name": "symfony/polyfill-iconv", - "version": "v1.31.0", + "version": "v1.32.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-iconv.git", - "reference": "48becf00c920479ca2e910c22a5a39e5d47ca956" + "reference": "5f3b930437ae03ae5dff61269024d8ea1b3774aa" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-iconv/zipball/48becf00c920479ca2e910c22a5a39e5d47ca956", - "reference": "48becf00c920479ca2e910c22a5a39e5d47ca956", + "url": "https://api.github.com/repos/symfony/polyfill-iconv/zipball/5f3b930437ae03ae5dff61269024d8ea1b3774aa", + "reference": "5f3b930437ae03ae5dff61269024d8ea1b3774aa", "shasum": "" }, "require": { @@ -9715,7 +9724,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-iconv/tree/v1.31.0" + "source": "https://github.com/symfony/polyfill-iconv/tree/v1.32.0" }, "funding": [ { @@ -9731,11 +9740,11 @@ "type": "tidelift" } ], - "time": "2024-09-09T11:45:10+00:00" + "time": "2024-09-17T14:58:18+00:00" }, { "name": "symfony/polyfill-intl-grapheme", - "version": "v1.31.0", + "version": "v1.32.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-grapheme.git", @@ -9793,7 +9802,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.31.0" + "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.32.0" }, "funding": [ { @@ -9813,16 +9822,16 @@ }, { "name": "symfony/polyfill-intl-idn", - "version": "v1.31.0", + "version": "v1.32.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-idn.git", - "reference": "c36586dcf89a12315939e00ec9b4474adcb1d773" + "reference": "9614ac4d8061dc257ecc64cba1b140873dce8ad3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/c36586dcf89a12315939e00ec9b4474adcb1d773", - "reference": "c36586dcf89a12315939e00ec9b4474adcb1d773", + "url": "https://api.github.com/repos/symfony/polyfill-intl-idn/zipball/9614ac4d8061dc257ecc64cba1b140873dce8ad3", + "reference": "9614ac4d8061dc257ecc64cba1b140873dce8ad3", "shasum": "" }, "require": { @@ -9876,7 +9885,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.31.0" + "source": "https://github.com/symfony/polyfill-intl-idn/tree/v1.32.0" }, "funding": [ { @@ -9892,11 +9901,11 @@ "type": "tidelift" } ], - "time": "2024-09-09T11:45:10+00:00" + "time": "2024-09-10T14:38:51+00:00" }, { "name": "symfony/polyfill-intl-normalizer", - "version": "v1.31.0", + "version": "v1.32.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-intl-normalizer.git", @@ -9957,7 +9966,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.31.0" + "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.32.0" }, "funding": [ { @@ -9977,19 +9986,20 @@ }, { "name": "symfony/polyfill-mbstring", - "version": "v1.31.0", + "version": "v1.32.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "85181ba99b2345b0ef10ce42ecac37612d9fd341" + "reference": "6d857f4d76bd4b343eac26d6b539585d2bc56493" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/85181ba99b2345b0ef10ce42ecac37612d9fd341", - "reference": "85181ba99b2345b0ef10ce42ecac37612d9fd341", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/6d857f4d76bd4b343eac26d6b539585d2bc56493", + "reference": "6d857f4d76bd4b343eac26d6b539585d2bc56493", "shasum": "" }, "require": { + "ext-iconv": "*", "php": ">=7.2" }, "provide": { @@ -10037,7 +10047,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.31.0" + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.32.0" }, "funding": [ { @@ -10053,20 +10063,20 @@ "type": "tidelift" } ], - "time": "2024-09-09T11:45:10+00:00" + "time": "2024-12-23T08:48:59+00:00" }, { "name": "symfony/polyfill-php80", - "version": "v1.31.0", + "version": "v1.32.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php80.git", - "reference": "60328e362d4c2c802a54fcbf04f9d3fb892b4cf8" + "reference": "0cc9dd0f17f61d8131e7df6b84bd344899fe2608" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/60328e362d4c2c802a54fcbf04f9d3fb892b4cf8", - "reference": "60328e362d4c2c802a54fcbf04f9d3fb892b4cf8", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/0cc9dd0f17f61d8131e7df6b84bd344899fe2608", + "reference": "0cc9dd0f17f61d8131e7df6b84bd344899fe2608", "shasum": "" }, "require": { @@ -10117,7 +10127,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php80/tree/v1.31.0" + "source": "https://github.com/symfony/polyfill-php80/tree/v1.32.0" }, "funding": [ { @@ -10133,11 +10143,11 @@ "type": "tidelift" } ], - "time": "2024-09-09T11:45:10+00:00" + "time": "2025-01-02T08:10:11+00:00" }, { "name": "symfony/polyfill-php83", - "version": "v1.31.0", + "version": "v1.32.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php83.git", @@ -10193,7 +10203,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php83/tree/v1.31.0" + "source": "https://github.com/symfony/polyfill-php83/tree/v1.32.0" }, "funding": [ { @@ -10213,7 +10223,7 @@ }, { "name": "symfony/polyfill-uuid", - "version": "v1.31.0", + "version": "v1.32.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-uuid.git", @@ -10272,7 +10282,7 @@ "uuid" ], "support": { - "source": "https://github.com/symfony/polyfill-uuid/tree/v1.31.0" + "source": "https://github.com/symfony/polyfill-uuid/tree/v1.32.0" }, "funding": [ { @@ -10292,16 +10302,16 @@ }, { "name": "symfony/process", - "version": "v7.2.5", + "version": "v7.3.0", "source": { "type": "git", "url": "https://github.com/symfony/process.git", - "reference": "87b7c93e57df9d8e39a093d32587702380ff045d" + "reference": "40c295f2deb408d5e9d2d32b8ba1dd61e36f05af" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/87b7c93e57df9d8e39a093d32587702380ff045d", - "reference": "87b7c93e57df9d8e39a093d32587702380ff045d", + "url": "https://api.github.com/repos/symfony/process/zipball/40c295f2deb408d5e9d2d32b8ba1dd61e36f05af", + "reference": "40c295f2deb408d5e9d2d32b8ba1dd61e36f05af", "shasum": "" }, "require": { @@ -10333,7 +10343,7 @@ "description": "Executes commands in sub-processes", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/process/tree/v7.2.5" + "source": "https://github.com/symfony/process/tree/v7.3.0" }, "funding": [ { @@ -10349,11 +10359,11 @@ "type": "tidelift" } ], - "time": "2025-03-13T12:21:46+00:00" + "time": "2025-04-17T09:11:12+00:00" }, { "name": "symfony/psr-http-message-bridge", - "version": "v7.2.0", + "version": "v7.3.0", "source": { "type": "git", "url": "https://github.com/symfony/psr-http-message-bridge.git", @@ -10416,7 +10426,7 @@ "psr-7" ], "support": { - "source": "https://github.com/symfony/psr-http-message-bridge/tree/v7.2.0" + "source": "https://github.com/symfony/psr-http-message-bridge/tree/v7.3.0" }, "funding": [ { @@ -10436,16 +10446,16 @@ }, { "name": "symfony/routing", - "version": "v7.2.3", + "version": "v7.3.0", "source": { "type": "git", "url": "https://github.com/symfony/routing.git", - "reference": "ee9a67edc6baa33e5fae662f94f91fd262930996" + "reference": "8e213820c5fea844ecea29203d2a308019007c15" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/routing/zipball/ee9a67edc6baa33e5fae662f94f91fd262930996", - "reference": "ee9a67edc6baa33e5fae662f94f91fd262930996", + "url": "https://api.github.com/repos/symfony/routing/zipball/8e213820c5fea844ecea29203d2a308019007c15", + "reference": "8e213820c5fea844ecea29203d2a308019007c15", "shasum": "" }, "require": { @@ -10497,7 +10507,7 @@ "url" ], "support": { - "source": "https://github.com/symfony/routing/tree/v7.2.3" + "source": "https://github.com/symfony/routing/tree/v7.3.0" }, "funding": [ { @@ -10513,20 +10523,20 @@ "type": "tidelift" } ], - "time": "2025-01-17T10:56:55+00:00" + "time": "2025-05-24T20:43:28+00:00" }, { "name": "symfony/service-contracts", - "version": "v3.5.1", + "version": "v3.6.0", "source": { "type": "git", "url": "https://github.com/symfony/service-contracts.git", - "reference": "e53260aabf78fb3d63f8d79d69ece59f80d5eda0" + "reference": "f021b05a130d35510bd6b25fe9053c2a8a15d5d4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/service-contracts/zipball/e53260aabf78fb3d63f8d79d69ece59f80d5eda0", - "reference": "e53260aabf78fb3d63f8d79d69ece59f80d5eda0", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/f021b05a130d35510bd6b25fe9053c2a8a15d5d4", + "reference": "f021b05a130d35510bd6b25fe9053c2a8a15d5d4", "shasum": "" }, "require": { @@ -10544,7 +10554,7 @@ "name": "symfony/contracts" }, "branch-alias": { - "dev-main": "3.5-dev" + "dev-main": "3.6-dev" } }, "autoload": { @@ -10580,7 +10590,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/service-contracts/tree/v3.5.1" + "source": "https://github.com/symfony/service-contracts/tree/v3.6.0" }, "funding": [ { @@ -10596,11 +10606,11 @@ "type": "tidelift" } ], - "time": "2024-09-25T14:20:29+00:00" + "time": "2025-04-25T09:37:31+00:00" }, { "name": "symfony/stopwatch", - "version": "v7.2.4", + "version": "v7.3.0", "source": { "type": "git", "url": "https://github.com/symfony/stopwatch.git", @@ -10642,7 +10652,7 @@ "description": "Provides a way to profile code", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/stopwatch/tree/v7.2.4" + "source": "https://github.com/symfony/stopwatch/tree/v7.3.0" }, "funding": [ { @@ -10662,16 +10672,16 @@ }, { "name": "symfony/string", - "version": "v7.2.0", + "version": "v7.3.0", "source": { "type": "git", "url": "https://github.com/symfony/string.git", - "reference": "446e0d146f991dde3e73f45f2c97a9faad773c82" + "reference": "f3570b8c61ca887a9e2938e85cb6458515d2b125" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/446e0d146f991dde3e73f45f2c97a9faad773c82", - "reference": "446e0d146f991dde3e73f45f2c97a9faad773c82", + "url": "https://api.github.com/repos/symfony/string/zipball/f3570b8c61ca887a9e2938e85cb6458515d2b125", + "reference": "f3570b8c61ca887a9e2938e85cb6458515d2b125", "shasum": "" }, "require": { @@ -10729,7 +10739,7 @@ "utf8" ], "support": { - "source": "https://github.com/symfony/string/tree/v7.2.0" + "source": "https://github.com/symfony/string/tree/v7.3.0" }, "funding": [ { @@ -10745,20 +10755,20 @@ "type": "tidelift" } ], - "time": "2024-11-13T13:31:26+00:00" + "time": "2025-04-20T20:19:01+00:00" }, { "name": "symfony/translation", - "version": "v7.2.4", + "version": "v7.3.0", "source": { "type": "git", "url": "https://github.com/symfony/translation.git", - "reference": "283856e6981286cc0d800b53bd5703e8e363f05a" + "reference": "4aba29076a29a3aa667e09b791e5f868973a8667" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/translation/zipball/283856e6981286cc0d800b53bd5703e8e363f05a", - "reference": "283856e6981286cc0d800b53bd5703e8e363f05a", + "url": "https://api.github.com/repos/symfony/translation/zipball/4aba29076a29a3aa667e09b791e5f868973a8667", + "reference": "4aba29076a29a3aa667e09b791e5f868973a8667", "shasum": "" }, "require": { @@ -10768,6 +10778,7 @@ "symfony/translation-contracts": "^2.5|^3.0" }, "conflict": { + "nikic/php-parser": "<5.0", "symfony/config": "<6.4", "symfony/console": "<6.4", "symfony/dependency-injection": "<6.4", @@ -10781,7 +10792,7 @@ "symfony/translation-implementation": "2.3|3.0" }, "require-dev": { - "nikic/php-parser": "^4.18|^5.0", + "nikic/php-parser": "^5.0", "psr/log": "^1|^2|^3", "symfony/config": "^6.4|^7.0", "symfony/console": "^6.4|^7.0", @@ -10824,7 +10835,7 @@ "description": "Provides tools to internationalize your application", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/translation/tree/v7.2.4" + "source": "https://github.com/symfony/translation/tree/v7.3.0" }, "funding": [ { @@ -10840,20 +10851,20 @@ "type": "tidelift" } ], - "time": "2025-02-13T10:27:23+00:00" + "time": "2025-05-29T07:19:49+00:00" }, { "name": "symfony/translation-contracts", - "version": "v3.5.1", + "version": "v3.6.0", "source": { "type": "git", "url": "https://github.com/symfony/translation-contracts.git", - "reference": "4667ff3bd513750603a09c8dedbea942487fb07c" + "reference": "df210c7a2573f1913b2d17cc95f90f53a73d8f7d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/4667ff3bd513750603a09c8dedbea942487fb07c", - "reference": "4667ff3bd513750603a09c8dedbea942487fb07c", + "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/df210c7a2573f1913b2d17cc95f90f53a73d8f7d", + "reference": "df210c7a2573f1913b2d17cc95f90f53a73d8f7d", "shasum": "" }, "require": { @@ -10866,7 +10877,7 @@ "name": "symfony/contracts" }, "branch-alias": { - "dev-main": "3.5-dev" + "dev-main": "3.6-dev" } }, "autoload": { @@ -10902,7 +10913,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/translation-contracts/tree/v3.5.1" + "source": "https://github.com/symfony/translation-contracts/tree/v3.6.0" }, "funding": [ { @@ -10918,20 +10929,20 @@ "type": "tidelift" } ], - "time": "2024-09-25T14:20:29+00:00" + "time": "2024-09-27T08:32:26+00:00" }, { "name": "symfony/uid", - "version": "v7.2.0", + "version": "v7.3.0", "source": { "type": "git", "url": "https://github.com/symfony/uid.git", - "reference": "2d294d0c48df244c71c105a169d0190bfb080426" + "reference": "7beeb2b885cd584cd01e126c5777206ae4c3c6a3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/uid/zipball/2d294d0c48df244c71c105a169d0190bfb080426", - "reference": "2d294d0c48df244c71c105a169d0190bfb080426", + "url": "https://api.github.com/repos/symfony/uid/zipball/7beeb2b885cd584cd01e126c5777206ae4c3c6a3", + "reference": "7beeb2b885cd584cd01e126c5777206ae4c3c6a3", "shasum": "" }, "require": { @@ -10976,7 +10987,7 @@ "uuid" ], "support": { - "source": "https://github.com/symfony/uid/tree/v7.2.0" + "source": "https://github.com/symfony/uid/tree/v7.3.0" }, "funding": [ { @@ -10992,24 +11003,25 @@ "type": "tidelift" } ], - "time": "2024-09-25T14:21:43+00:00" + "time": "2025-05-24T14:28:13+00:00" }, { "name": "symfony/var-dumper", - "version": "v7.2.3", + "version": "v7.3.0", "source": { "type": "git", "url": "https://github.com/symfony/var-dumper.git", - "reference": "82b478c69745d8878eb60f9a049a4d584996f73a" + "reference": "548f6760c54197b1084e1e5c71f6d9d523f2f78e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-dumper/zipball/82b478c69745d8878eb60f9a049a4d584996f73a", - "reference": "82b478c69745d8878eb60f9a049a4d584996f73a", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/548f6760c54197b1084e1e5c71f6d9d523f2f78e", + "reference": "548f6760c54197b1084e1e5c71f6d9d523f2f78e", "shasum": "" }, "require": { "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3", "symfony/polyfill-mbstring": "~1.0" }, "conflict": { @@ -11059,7 +11071,7 @@ "dump" ], "support": { - "source": "https://github.com/symfony/var-dumper/tree/v7.2.3" + "source": "https://github.com/symfony/var-dumper/tree/v7.3.0" }, "funding": [ { @@ -11075,20 +11087,20 @@ "type": "tidelift" } ], - "time": "2025-01-17T11:39:41+00:00" + "time": "2025-04-27T18:39:23+00:00" }, { "name": "symfony/yaml", - "version": "v7.2.5", + "version": "v7.3.0", "source": { "type": "git", "url": "https://github.com/symfony/yaml.git", - "reference": "4c4b6f4cfcd7e52053f0c8bfad0f7f30fb924912" + "reference": "cea40a48279d58dc3efee8112634cb90141156c2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/4c4b6f4cfcd7e52053f0c8bfad0f7f30fb924912", - "reference": "4c4b6f4cfcd7e52053f0c8bfad0f7f30fb924912", + "url": "https://api.github.com/repos/symfony/yaml/zipball/cea40a48279d58dc3efee8112634cb90141156c2", + "reference": "cea40a48279d58dc3efee8112634cb90141156c2", "shasum": "" }, "require": { @@ -11131,7 +11143,7 @@ "description": "Loads and dumps YAML files", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/yaml/tree/v7.2.5" + "source": "https://github.com/symfony/yaml/tree/v7.3.0" }, "funding": [ { @@ -11147,7 +11159,7 @@ "type": "tidelift" } ], - "time": "2025-03-03T07:12:39+00:00" + "time": "2025-04-04T10:10:33+00:00" }, { "name": "tijsverkoyen/css-to-inline-styles", @@ -11264,16 +11276,16 @@ }, { "name": "vlucas/phpdotenv", - "version": "v5.6.1", + "version": "v5.6.2", "source": { "type": "git", "url": "https://github.com/vlucas/phpdotenv.git", - "reference": "a59a13791077fe3d44f90e7133eb68e7d22eaff2" + "reference": "24ac4c74f91ee2c193fa1aaa5c249cb0822809af" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/vlucas/phpdotenv/zipball/a59a13791077fe3d44f90e7133eb68e7d22eaff2", - "reference": "a59a13791077fe3d44f90e7133eb68e7d22eaff2", + "url": "https://api.github.com/repos/vlucas/phpdotenv/zipball/24ac4c74f91ee2c193fa1aaa5c249cb0822809af", + "reference": "24ac4c74f91ee2c193fa1aaa5c249cb0822809af", "shasum": "" }, "require": { @@ -11332,7 +11344,7 @@ ], "support": { "issues": "https://github.com/vlucas/phpdotenv/issues", - "source": "https://github.com/vlucas/phpdotenv/tree/v5.6.1" + "source": "https://github.com/vlucas/phpdotenv/tree/v5.6.2" }, "funding": [ { @@ -11344,7 +11356,7 @@ "type": "tidelift" } ], - "time": "2024-07-20T21:52:34+00:00" + "time": "2025-04-30T23:37:27+00:00" }, { "name": "voku/portable-ascii", @@ -11798,16 +11810,16 @@ }, { "name": "zircote/swagger-php", - "version": "5.0.7", + "version": "5.1.3", "source": { "type": "git", "url": "https://github.com/zircote/swagger-php.git", - "reference": "18457fa71f753cfd4a2b21916baf329864fdfaa6" + "reference": "b8ba6bd99805c0ae09a38d1b26c1c92820509bd0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/zircote/swagger-php/zipball/18457fa71f753cfd4a2b21916baf329864fdfaa6", - "reference": "18457fa71f753cfd4a2b21916baf329864fdfaa6", + "url": "https://api.github.com/repos/zircote/swagger-php/zipball/b8ba6bd99805c0ae09a38d1b26c1c92820509bd0", + "reference": "b8ba6bd99805c0ae09a38d1b26c1c92820509bd0", "shasum": "" }, "require": { @@ -11868,8 +11880,8 @@ "homepage": "https://radebatz.net" } ], - "description": "swagger-php - Generate interactive documentation for your RESTful API using phpdoc annotations", - "homepage": "https://github.com/zircote/swagger-php/", + "description": "Generate interactive documentation for your RESTful API using PHP attributes (preferred) or PHPDoc annotations", + "homepage": "https://github.com/zircote/swagger-php", "keywords": [ "api", "json", @@ -11878,24 +11890,24 @@ ], "support": { "issues": "https://github.com/zircote/swagger-php/issues", - "source": "https://github.com/zircote/swagger-php/tree/5.0.7" + "source": "https://github.com/zircote/swagger-php/tree/5.1.3" }, - "time": "2025-03-19T03:31:11+00:00" + "time": "2025-05-20T03:35:10+00:00" } ], "packages-dev": [ { "name": "barryvdh/laravel-debugbar", - "version": "v3.15.2", + "version": "v3.15.4", "source": { "type": "git", "url": "https://github.com/barryvdh/laravel-debugbar.git", - "reference": "0bc1e1361e7fffc2be156f46ad1fba6927c01729" + "reference": "c0667ea91f7185f1e074402c5788195e96bf8106" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/barryvdh/laravel-debugbar/zipball/0bc1e1361e7fffc2be156f46ad1fba6927c01729", - "reference": "0bc1e1361e7fffc2be156f46ad1fba6927c01729", + "url": "https://api.github.com/repos/barryvdh/laravel-debugbar/zipball/c0667ea91f7185f1e074402c5788195e96bf8106", + "reference": "c0667ea91f7185f1e074402c5788195e96bf8106", "shasum": "" }, "require": { @@ -11906,9 +11918,6 @@ "php-debugbar/php-debugbar": "~2.1.1", "symfony/finder": "^6|^7" }, - "conflict": { - "maximebf/debugbar": "*" - }, "require-dev": { "mockery/mockery": "^1.3.3", "orchestra/testbench-dusk": "^7|^8|^9|^10", @@ -11958,7 +11967,7 @@ ], "support": { "issues": "https://github.com/barryvdh/laravel-debugbar/issues", - "source": "https://github.com/barryvdh/laravel-debugbar/tree/v3.15.2" + "source": "https://github.com/barryvdh/laravel-debugbar/tree/v3.15.4" }, "funding": [ { @@ -11970,7 +11979,7 @@ "type": "github" } ], - "time": "2025-02-25T15:25:22+00:00" + "time": "2025-04-16T06:32:06+00:00" }, { "name": "brianium/paratest", @@ -12067,20 +12076,20 @@ }, { "name": "driftingly/rector-laravel", - "version": "2.0.2", + "version": "2.0.5", "source": { "type": "git", "url": "https://github.com/driftingly/rector-laravel.git", - "reference": "f0e3a9e2c92ff760730d1af34fbdc43f51f3b868" + "reference": "ac61de4f267c23249d175d7fc9149fd01528567d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/driftingly/rector-laravel/zipball/f0e3a9e2c92ff760730d1af34fbdc43f51f3b868", - "reference": "f0e3a9e2c92ff760730d1af34fbdc43f51f3b868", + "url": "https://api.github.com/repos/driftingly/rector-laravel/zipball/ac61de4f267c23249d175d7fc9149fd01528567d", + "reference": "ac61de4f267c23249d175d7fc9149fd01528567d", "shasum": "" }, "require": { - "php": "^7.2 || ^8.0", + "php": "^7.4 || ^8.0", "rector/rector": "^2.0" }, "type": "rector-extension", @@ -12096,9 +12105,9 @@ "description": "Rector upgrades rules for Laravel Framework", "support": { "issues": "https://github.com/driftingly/rector-laravel/issues", - "source": "https://github.com/driftingly/rector-laravel/tree/2.0.2" + "source": "https://github.com/driftingly/rector-laravel/tree/2.0.5" }, - "time": "2025-01-17T18:07:03+00:00" + "time": "2025-05-14T17:30:41+00:00" }, { "name": "fakerphp/faker", @@ -12297,20 +12306,20 @@ }, { "name": "hamcrest/hamcrest-php", - "version": "v2.0.1", + "version": "v2.1.1", "source": { "type": "git", "url": "https://github.com/hamcrest/hamcrest-php.git", - "reference": "8c3d0a3f6af734494ad8f6fbbee0ba92422859f3" + "reference": "f8b1c0173b22fa6ec77a81fe63e5b01eba7e6487" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/hamcrest/hamcrest-php/zipball/8c3d0a3f6af734494ad8f6fbbee0ba92422859f3", - "reference": "8c3d0a3f6af734494ad8f6fbbee0ba92422859f3", + "url": "https://api.github.com/repos/hamcrest/hamcrest-php/zipball/f8b1c0173b22fa6ec77a81fe63e5b01eba7e6487", + "reference": "f8b1c0173b22fa6ec77a81fe63e5b01eba7e6487", "shasum": "" }, "require": { - "php": "^5.3|^7.0|^8.0" + "php": "^7.4|^8.0" }, "replace": { "cordoval/hamcrest-php": "*", @@ -12318,8 +12327,8 @@ "kodova/hamcrest-php": "*" }, "require-dev": { - "phpunit/php-file-iterator": "^1.4 || ^2.0", - "phpunit/phpunit": "^4.8.36 || ^5.7 || ^6.5 || ^7.0" + "phpunit/php-file-iterator": "^1.4 || ^2.0 || ^3.0", + "phpunit/phpunit": "^4.8.36 || ^5.7 || ^6.5 || ^7.0 || ^8.0 || ^9.0" }, "type": "library", "extra": { @@ -12342,9 +12351,9 @@ ], "support": { "issues": "https://github.com/hamcrest/hamcrest-php/issues", - "source": "https://github.com/hamcrest/hamcrest-php/tree/v2.0.1" + "source": "https://github.com/hamcrest/hamcrest-php/tree/v2.1.1" }, - "time": "2020-07-09T08:09:16+00:00" + "time": "2025-04-30T06:54:44+00:00" }, { "name": "laravel/dusk", @@ -12422,16 +12431,16 @@ }, { "name": "laravel/pint", - "version": "v1.21.2", + "version": "v1.22.1", "source": { "type": "git", "url": "https://github.com/laravel/pint.git", - "reference": "370772e7d9e9da087678a0edf2b11b6960e40558" + "reference": "941d1927c5ca420c22710e98420287169c7bcaf7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/pint/zipball/370772e7d9e9da087678a0edf2b11b6960e40558", - "reference": "370772e7d9e9da087678a0edf2b11b6960e40558", + "url": "https://api.github.com/repos/laravel/pint/zipball/941d1927c5ca420c22710e98420287169c7bcaf7", + "reference": "941d1927c5ca420c22710e98420287169c7bcaf7", "shasum": "" }, "require": { @@ -12442,12 +12451,12 @@ "php": "^8.2.0" }, "require-dev": { - "friendsofphp/php-cs-fixer": "^3.72.0", - "illuminate/view": "^11.44.2", - "larastan/larastan": "^3.2.0", + "friendsofphp/php-cs-fixer": "^3.75.0", + "illuminate/view": "^11.44.7", + "larastan/larastan": "^3.4.0", "laravel-zero/framework": "^11.36.1", "mockery/mockery": "^1.6.12", - "nunomaduro/termwind": "^2.3", + "nunomaduro/termwind": "^2.3.1", "pestphp/pest": "^2.36.0" }, "bin": [ @@ -12484,20 +12493,20 @@ "issues": "https://github.com/laravel/pint/issues", "source": "https://github.com/laravel/pint" }, - "time": "2025-03-14T22:31:42+00:00" + "time": "2025-05-08T08:38:12+00:00" }, { "name": "laravel/telescope", - "version": "v5.6.0", + "version": "v5.8.0", "source": { "type": "git", "url": "https://github.com/laravel/telescope.git", - "reference": "352dc633c2fe500c169e3401a10a7efae4fc3327" + "reference": "9be1b8851b8ffe67689e7960135f8b32a966f23d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/telescope/zipball/352dc633c2fe500c169e3401a10a7efae4fc3327", - "reference": "352dc633c2fe500c169e3401a10a7efae4fc3327", + "url": "https://api.github.com/repos/laravel/telescope/zipball/9be1b8851b8ffe67689e7960135f8b32a966f23d", + "reference": "9be1b8851b8ffe67689e7960135f8b32a966f23d", "shasum": "" }, "require": { @@ -12551,9 +12560,9 @@ ], "support": { "issues": "https://github.com/laravel/telescope/issues", - "source": "https://github.com/laravel/telescope/tree/v5.6.0" + "source": "https://github.com/laravel/telescope/tree/v5.8.0" }, - "time": "2025-03-17T20:24:10+00:00" + "time": "2025-05-26T17:22:18+00:00" }, { "name": "mockery/mockery", @@ -12640,16 +12649,16 @@ }, { "name": "myclabs/deep-copy", - "version": "1.13.0", + "version": "1.13.1", "source": { "type": "git", "url": "https://github.com/myclabs/DeepCopy.git", - "reference": "024473a478be9df5fdaca2c793f2232fe788e414" + "reference": "1720ddd719e16cf0db4eb1c6eca108031636d46c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/024473a478be9df5fdaca2c793f2232fe788e414", - "reference": "024473a478be9df5fdaca2c793f2232fe788e414", + "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/1720ddd719e16cf0db4eb1c6eca108031636d46c", + "reference": "1720ddd719e16cf0db4eb1c6eca108031636d46c", "shasum": "" }, "require": { @@ -12688,7 +12697,7 @@ ], "support": { "issues": "https://github.com/myclabs/DeepCopy/issues", - "source": "https://github.com/myclabs/DeepCopy/tree/1.13.0" + "source": "https://github.com/myclabs/DeepCopy/tree/1.13.1" }, "funding": [ { @@ -12696,42 +12705,43 @@ "type": "tidelift" } ], - "time": "2025-02-12T12:17:51+00:00" + "time": "2025-04-29T12:36:36+00:00" }, { "name": "nunomaduro/collision", - "version": "v8.7.0", + "version": "v8.8.0", "source": { "type": "git", "url": "https://github.com/nunomaduro/collision.git", - "reference": "586cb8181a257a2152b6a855ca8d9598878a1a26" + "reference": "4cf9f3b47afff38b139fb79ce54fc71799022ce8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nunomaduro/collision/zipball/586cb8181a257a2152b6a855ca8d9598878a1a26", - "reference": "586cb8181a257a2152b6a855ca8d9598878a1a26", + "url": "https://api.github.com/repos/nunomaduro/collision/zipball/4cf9f3b47afff38b139fb79ce54fc71799022ce8", + "reference": "4cf9f3b47afff38b139fb79ce54fc71799022ce8", "shasum": "" }, "require": { - "filp/whoops": "^2.17.0", + "filp/whoops": "^2.18.0", "nunomaduro/termwind": "^2.3.0", "php": "^8.2.0", - "symfony/console": "^7.2.1" + "symfony/console": "^7.2.5" }, "conflict": { - "laravel/framework": "<11.39.1 || >=13.0.0", - "phpunit/phpunit": "<11.5.3 || >=12.0.0" + "laravel/framework": "<11.44.2 || >=13.0.0", + "phpunit/phpunit": "<11.5.15 || >=13.0.0" }, "require-dev": { - "larastan/larastan": "^2.10.0", - "laravel/framework": "^11.44.2", + "brianium/paratest": "^7.8.3", + "larastan/larastan": "^3.2", + "laravel/framework": "^11.44.2 || ^12.6", "laravel/pint": "^1.21.2", "laravel/sail": "^1.41.0", "laravel/sanctum": "^4.0.8", "laravel/tinker": "^2.10.1", - "orchestra/testbench-core": "^9.12.0", - "pestphp/pest": "^3.7.4", - "sebastian/environment": "^6.1.0 || ^7.2.0" + "orchestra/testbench-core": "^9.12.0 || ^10.1", + "pestphp/pest": "^3.8.0", + "sebastian/environment": "^7.2.0 || ^8.0" }, "type": "library", "extra": { @@ -12794,25 +12804,25 @@ "type": "patreon" } ], - "time": "2025-03-14T22:37:40+00:00" + "time": "2025-04-03T14:33:09+00:00" }, { "name": "pestphp/pest", - "version": "v3.8.0", + "version": "v3.8.2", "source": { "type": "git", "url": "https://github.com/pestphp/pest.git", - "reference": "42e1b9f17fc2b2036701f4b968158264bde542d4" + "reference": "c6244a8712968dbac88eb998e7ff3b5caa556b0d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pestphp/pest/zipball/42e1b9f17fc2b2036701f4b968158264bde542d4", - "reference": "42e1b9f17fc2b2036701f4b968158264bde542d4", + "url": "https://api.github.com/repos/pestphp/pest/zipball/c6244a8712968dbac88eb998e7ff3b5caa556b0d", + "reference": "c6244a8712968dbac88eb998e7ff3b5caa556b0d", "shasum": "" }, "require": { "brianium/paratest": "^7.8.3", - "nunomaduro/collision": "^8.7.0", + "nunomaduro/collision": "^8.8.0", "nunomaduro/termwind": "^2.3.0", "pestphp/pest-plugin": "^3.0.0", "pestphp/pest-plugin-arch": "^3.1.0", @@ -12894,7 +12904,7 @@ ], "support": { "issues": "https://github.com/pestphp/pest/issues", - "source": "https://github.com/pestphp/pest/tree/v3.8.0" + "source": "https://github.com/pestphp/pest/tree/v3.8.2" }, "funding": [ { @@ -12906,7 +12916,7 @@ "type": "github" } ], - "time": "2025-03-30T17:49:10+00:00" + "time": "2025-04-17T10:53:02+00:00" }, { "name": "pestphp/pest-plugin", @@ -12980,16 +12990,16 @@ }, { "name": "pestphp/pest-plugin-arch", - "version": "v3.1.0", + "version": "v3.1.1", "source": { "type": "git", "url": "https://github.com/pestphp/pest-plugin-arch.git", - "reference": "ebec636b97ee73936ee8485e15a59c3f5a4c21b2" + "reference": "db7bd9cb1612b223e16618d85475c6f63b9c8daa" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/pestphp/pest-plugin-arch/zipball/ebec636b97ee73936ee8485e15a59c3f5a4c21b2", - "reference": "ebec636b97ee73936ee8485e15a59c3f5a4c21b2", + "url": "https://api.github.com/repos/pestphp/pest-plugin-arch/zipball/db7bd9cb1612b223e16618d85475c6f63b9c8daa", + "reference": "db7bd9cb1612b223e16618d85475c6f63b9c8daa", "shasum": "" }, "require": { @@ -12998,7 +13008,7 @@ "ta-tikoma/phpunit-architecture-test": "^0.8.4" }, "require-dev": { - "pestphp/pest": "^3.7.5", + "pestphp/pest": "^3.8.1", "pestphp/pest-dev-tools": "^3.4.0" }, "type": "library", @@ -13034,7 +13044,7 @@ "unit" ], "support": { - "source": "https://github.com/pestphp/pest-plugin-arch/tree/v3.1.0" + "source": "https://github.com/pestphp/pest-plugin-arch/tree/v3.1.1" }, "funding": [ { @@ -13046,7 +13056,7 @@ "type": "github" } ], - "time": "2025-03-30T17:28:50+00:00" + "time": "2025-04-16T22:59:48+00:00" }, { "name": "pestphp/pest-plugin-mutate", @@ -13376,16 +13386,16 @@ }, { "name": "phpstan/phpstan", - "version": "2.1.11", + "version": "2.1.17", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan.git", - "reference": "8ca5f79a8f63c49b2359065832a654e1ec70ac30" + "reference": "89b5ef665716fa2a52ecd2633f21007a6a349053" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan/zipball/8ca5f79a8f63c49b2359065832a654e1ec70ac30", - "reference": "8ca5f79a8f63c49b2359065832a654e1ec70ac30", + "url": "https://api.github.com/repos/phpstan/phpstan/zipball/89b5ef665716fa2a52ecd2633f21007a6a349053", + "reference": "89b5ef665716fa2a52ecd2633f21007a6a349053", "shasum": "" }, "require": { @@ -13430,7 +13440,7 @@ "type": "github" } ], - "time": "2025-03-24T13:45:00+00:00" + "time": "2025-05-21T20:55:28+00:00" }, { "name": "phpunit/php-code-coverage", @@ -13858,21 +13868,21 @@ }, { "name": "rector/rector", - "version": "2.0.11", + "version": "2.0.16", "source": { "type": "git", "url": "https://github.com/rectorphp/rector.git", - "reference": "059b827cc648929711606e9824337e41e2f9ed92" + "reference": "f1366d1f8c7490541c8f7af6e5c7cef7cca1b5a2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/rectorphp/rector/zipball/059b827cc648929711606e9824337e41e2f9ed92", - "reference": "059b827cc648929711606e9824337e41e2f9ed92", + "url": "https://api.github.com/repos/rectorphp/rector/zipball/f1366d1f8c7490541c8f7af6e5c7cef7cca1b5a2", + "reference": "f1366d1f8c7490541c8f7af6e5c7cef7cca1b5a2", "shasum": "" }, "require": { "php": "^7.4|^8.0", - "phpstan/phpstan": "^2.1.9" + "phpstan/phpstan": "^2.1.14" }, "conflict": { "rector/rector-doctrine": "*", @@ -13905,7 +13915,7 @@ ], "support": { "issues": "https://github.com/rectorphp/rector/issues", - "source": "https://github.com/rectorphp/rector/tree/2.0.11" + "source": "https://github.com/rectorphp/rector/tree/2.0.16" }, "funding": [ { @@ -13913,7 +13923,7 @@ "type": "github" } ], - "time": "2025-03-28T10:25:17+00:00" + "time": "2025-05-12T16:37:16+00:00" }, { "name": "sebastian/cli-parser", @@ -14292,23 +14302,23 @@ }, { "name": "sebastian/environment", - "version": "7.2.0", + "version": "7.2.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/environment.git", - "reference": "855f3ae0ab316bbafe1ba4e16e9f3c078d24a0c5" + "reference": "a5c75038693ad2e8d4b6c15ba2403532647830c4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/855f3ae0ab316bbafe1ba4e16e9f3c078d24a0c5", - "reference": "855f3ae0ab316bbafe1ba4e16e9f3c078d24a0c5", + "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/a5c75038693ad2e8d4b6c15ba2403532647830c4", + "reference": "a5c75038693ad2e8d4b6c15ba2403532647830c4", "shasum": "" }, "require": { "php": ">=8.2" }, "require-dev": { - "phpunit/phpunit": "^11.0" + "phpunit/phpunit": "^11.3" }, "suggest": { "ext-posix": "*" @@ -14344,15 +14354,27 @@ "support": { "issues": "https://github.com/sebastianbergmann/environment/issues", "security": "https://github.com/sebastianbergmann/environment/security/policy", - "source": "https://github.com/sebastianbergmann/environment/tree/7.2.0" + "source": "https://github.com/sebastianbergmann/environment/tree/7.2.1" }, "funding": [ { "url": "https://github.com/sebastianbergmann", "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/sebastian/environment", + "type": "tidelift" } ], - "time": "2024-07-03T04:54:44+00:00" + "time": "2025-05-21T11:55:47+00:00" }, { "name": "sebastian/exporter", @@ -15257,16 +15279,16 @@ }, { "name": "symfony/http-client", - "version": "v7.2.4", + "version": "v7.3.0", "source": { "type": "git", "url": "https://github.com/symfony/http-client.git", - "reference": "78981a2ffef6437ed92d4d7e2a86a82f256c6dc6" + "reference": "57e4fb86314015a695a750ace358d07a7e37b8a9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-client/zipball/78981a2ffef6437ed92d4d7e2a86a82f256c6dc6", - "reference": "78981a2ffef6437ed92d4d7e2a86a82f256c6dc6", + "url": "https://api.github.com/repos/symfony/http-client/zipball/57e4fb86314015a695a750ace358d07a7e37b8a9", + "reference": "57e4fb86314015a695a750ace358d07a7e37b8a9", "shasum": "" }, "require": { @@ -15332,7 +15354,7 @@ "http" ], "support": { - "source": "https://github.com/symfony/http-client/tree/v7.2.4" + "source": "https://github.com/symfony/http-client/tree/v7.3.0" }, "funding": [ { @@ -15348,20 +15370,20 @@ "type": "tidelift" } ], - "time": "2025-02-13T10:27:23+00:00" + "time": "2025-05-02T08:23:16+00:00" }, { "name": "symfony/http-client-contracts", - "version": "v3.5.2", + "version": "v3.6.0", "source": { "type": "git", "url": "https://github.com/symfony/http-client-contracts.git", - "reference": "ee8d807ab20fcb51267fdace50fbe3494c31e645" + "reference": "75d7043853a42837e68111812f4d964b01e5101c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-client-contracts/zipball/ee8d807ab20fcb51267fdace50fbe3494c31e645", - "reference": "ee8d807ab20fcb51267fdace50fbe3494c31e645", + "url": "https://api.github.com/repos/symfony/http-client-contracts/zipball/75d7043853a42837e68111812f4d964b01e5101c", + "reference": "75d7043853a42837e68111812f4d964b01e5101c", "shasum": "" }, "require": { @@ -15374,7 +15396,7 @@ "name": "symfony/contracts" }, "branch-alias": { - "dev-main": "3.5-dev" + "dev-main": "3.6-dev" } }, "autoload": { @@ -15410,7 +15432,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/http-client-contracts/tree/v3.5.2" + "source": "https://github.com/symfony/http-client-contracts/tree/v3.6.0" }, "funding": [ { @@ -15426,27 +15448,27 @@ "type": "tidelift" } ], - "time": "2024-12-07T08:49:48+00:00" + "time": "2025-04-29T11:18:49+00:00" }, { "name": "ta-tikoma/phpunit-architecture-test", - "version": "0.8.4", + "version": "0.8.5", "source": { "type": "git", "url": "https://github.com/ta-tikoma/phpunit-architecture-test.git", - "reference": "89f0dea1cb0f0d5744d3ec1764a286af5e006636" + "reference": "cf6fb197b676ba716837c886baca842e4db29005" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/ta-tikoma/phpunit-architecture-test/zipball/89f0dea1cb0f0d5744d3ec1764a286af5e006636", - "reference": "89f0dea1cb0f0d5744d3ec1764a286af5e006636", + "url": "https://api.github.com/repos/ta-tikoma/phpunit-architecture-test/zipball/cf6fb197b676ba716837c886baca842e4db29005", + "reference": "cf6fb197b676ba716837c886baca842e4db29005", "shasum": "" }, "require": { "nikic/php-parser": "^4.18.0 || ^5.0.0", "php": "^8.1.0", "phpdocumentor/reflection-docblock": "^5.3.0", - "phpunit/phpunit": "^10.5.5 || ^11.0.0", + "phpunit/phpunit": "^10.5.5 || ^11.0.0 || ^12.0.0", "symfony/finder": "^6.4.0 || ^7.0.0" }, "require-dev": { @@ -15483,9 +15505,9 @@ ], "support": { "issues": "https://github.com/ta-tikoma/phpunit-architecture-test/issues", - "source": "https://github.com/ta-tikoma/phpunit-architecture-test/tree/0.8.4" + "source": "https://github.com/ta-tikoma/phpunit-architecture-test/tree/0.8.5" }, - "time": "2024-01-05T14:10:56+00:00" + "time": "2025-04-20T20:23:40+00:00" }, { "name": "theseer/tokenizer", diff --git a/public/vendor/telescope/app-dark.css b/public/vendor/telescope/app-dark.css index 70a872a92..9559860e7 100644 --- a/public/vendor/telescope/app-dark.css +++ b/public/vendor/telescope/app-dark.css @@ -1,10 +1,8 @@ -@charset "UTF-8"; - -.form-control:-moz-focusring{text-shadow:none!important} +@charset "UTF-8";.form-control:-moz-focusring{text-shadow:none!important} /*! * Bootstrap v4.6.2 (https://getbootstrap.com/) * Copyright 2011-2022 The Bootstrap Authors * Copyright 2011-2022 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) - */:root{--blue:#007bff;--indigo:#6610f2;--purple:#6f42c1;--pink:#e83e8c;--red:#dc3545;--orange:#fd7e14;--yellow:#ffc107;--green:#28a745;--teal:#20c997;--cyan:#17a2b8;--white:#fff;--gray:#4b5563;--gray-dark:#1f2937;--primary:#4040c8;--secondary:#4b5563;--success:#059669;--info:#2563eb;--warning:#d97706;--danger:#dc2626;--light:#f3f4f6;--dark:#1f2937;--breakpoint-xs:0;--breakpoint-sm:2px;--breakpoint-md:8px;--breakpoint-lg:9px;--breakpoint-xl:10px;--font-family-sans-serif:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans","Liberation Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--font-family-monospace:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace}*,:after,:before{box-sizing:border-box}html{-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:rgba(0,0,0,0);font-family:sans-serif;line-height:1.15}article,aside,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}body{background-color:#111827;color:#f3f4f6;font-family:Figtree,sans-serif;font-size:1rem;font-weight:400;line-height:1.5;margin:0;text-align:left}[tabindex="-1"]:focus:not(:focus-visible){outline:0!important}hr{box-sizing:content-box;height:0;overflow:visible}h1,h2,h3,h4,h5,h6{margin-bottom:.5rem;margin-top:0}p{margin-bottom:1rem;margin-top:0}abbr[data-original-title],abbr[title]{border-bottom:0;cursor:help;text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted;-webkit-text-decoration-skip-ink:none;text-decoration-skip-ink:none}address{font-style:normal;line-height:inherit}address,dl,ol,ul{margin-bottom:1rem}dl,ol,ul{margin-top:0}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:600}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}b,strong{font-weight:bolder}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{background-color:transparent;color:#818cf8;text-decoration:none}a:hover{color:#a5b4fc;text-decoration:underline}a:not([href]):not([class]),a:not([href]):not([class]):hover{color:inherit;text-decoration:none}code,kbd,pre,samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-size:1em}pre{-ms-overflow-style:scrollbar;margin-bottom:1rem;margin-top:0;overflow:auto}figure{margin:0 0 1rem}img{border-style:none}img,svg{vertical-align:middle}svg{overflow:hidden}table{border-collapse:collapse}caption{caption-side:bottom;color:#9ca3af;padding-bottom:.75rem;padding-top:.75rem;text-align:left}th{text-align:inherit;text-align:-webkit-match-parent}label{display:inline-block;margin-bottom:.5rem}button{border-radius:0}button:focus:not(:focus-visible){outline:0}button,input,optgroup,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit;margin:0}button,input{overflow:visible}button,select{text-transform:none}[role=button]{cursor:pointer}select{word-wrap:normal}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]:not(:disabled),[type=reset]:not(:disabled),[type=submit]:not(:disabled),button:not(:disabled){cursor:pointer}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}textarea{overflow:auto;resize:vertical}fieldset{border:0;margin:0;min-width:0;padding:0}legend{color:inherit;display:block;font-size:1.5rem;line-height:inherit;margin-bottom:.5rem;max-width:100%;padding:0;white-space:normal;width:100%}progress{vertical-align:baseline}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:none;outline-offset:-2px}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}output{display:inline-block}summary{cursor:pointer;display:list-item}template{display:none}[hidden]{display:none!important}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{font-weight:500;line-height:1.2;margin-bottom:.5rem}.h1,h1{font-size:2.5rem}.h2,h2{font-size:2rem}.h3,h3{font-size:1.75rem}.h4,h4{font-size:1.5rem}.h5,h5{font-size:1.25rem}.h6,h6{font-size:1rem}.lead{font-size:1.25rem;font-weight:300}.display-1{font-size:6rem}.display-1,.display-2{font-weight:300;line-height:1.2}.display-2{font-size:5.5rem}.display-3{font-size:4.5rem}.display-3,.display-4{font-weight:300;line-height:1.2}.display-4{font-size:3.5rem}hr{border:0;border-top:1px solid rgba(0,0,0,.1);margin-bottom:1rem;margin-top:1rem}.small,small{font-size:.875em;font-weight:400}.mark,mark{background-color:#fcf8e3;padding:.2em}.list-inline,.list-unstyled{list-style:none;padding-left:0}.list-inline-item{display:inline-block}.list-inline-item:not(:last-child){margin-right:.5rem}.initialism{font-size:90%;text-transform:uppercase}.blockquote{font-size:1.25rem;margin-bottom:1rem}.blockquote-footer{color:#4b5563;display:block;font-size:.875em}.blockquote-footer:before{content:"— "}.img-fluid,.img-thumbnail{height:auto;max-width:100%}.img-thumbnail{background-color:#111827;border:1px solid #d1d5db;border-radius:.25rem;padding:.25rem}.figure{display:inline-block}.figure-img{line-height:1;margin-bottom:.5rem}.figure-caption{color:#4b5563;font-size:90%}code{word-wrap:break-word;color:#e83e8c;font-size:87.5%}a>code{color:inherit}kbd{background-color:#111827;border-radius:.2rem;color:#fff;font-size:87.5%;padding:.2rem .4rem}kbd kbd{font-size:100%;font-weight:600;padding:0}pre{color:#111827;display:block;font-size:87.5%}pre code{color:inherit;font-size:inherit;word-break:normal}.pre-scrollable{max-height:340px;overflow-y:scroll}.container,.container-fluid,.container-lg,.container-md,.container-sm,.container-xl{margin-left:auto;margin-right:auto;padding-left:15px;padding-right:15px;width:100%}@media (min-width:2px){.container,.container-sm{max-width:1137px}}@media (min-width:8px){.container,.container-md,.container-sm{max-width:1138px}}@media (min-width:9px){.container,.container-lg,.container-md,.container-sm{max-width:1139px}}@media (min-width:10px){.container,.container-lg,.container-md,.container-sm,.container-xl{max-width:1140px}}.row{display:flex;flex-wrap:wrap;margin-left:-15px;margin-right:-15px}.no-gutters{margin-left:0;margin-right:0}.no-gutters>.col,.no-gutters>[class*=col-]{padding-left:0;padding-right:0}.col,.col-1,.col-10,.col-11,.col-12,.col-2,.col-3,.col-4,.col-5,.col-6,.col-7,.col-8,.col-9,.col-auto,.col-lg,.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-auto,.col-md,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-auto,.col-sm,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-auto,.col-xl,.col-xl-1,.col-xl-10,.col-xl-11,.col-xl-12,.col-xl-2,.col-xl-3,.col-xl-4,.col-xl-5,.col-xl-6,.col-xl-7,.col-xl-8,.col-xl-9,.col-xl-auto{padding-left:15px;padding-right:15px;position:relative;width:100%}.col{flex-basis:0;flex-grow:1;max-width:100%}.row-cols-1>*{flex:0 0 100%;max-width:100%}.row-cols-2>*{flex:0 0 50%;max-width:50%}.row-cols-3>*{flex:0 0 33.3333333333%;max-width:33.3333333333%}.row-cols-4>*{flex:0 0 25%;max-width:25%}.row-cols-5>*{flex:0 0 20%;max-width:20%}.row-cols-6>*{flex:0 0 16.6666666667%;max-width:16.6666666667%}.col-auto{flex:0 0 auto;max-width:100%;width:auto}.col-1{flex:0 0 8.33333333%;max-width:8.33333333%}.col-2{flex:0 0 16.66666667%;max-width:16.66666667%}.col-3{flex:0 0 25%;max-width:25%}.col-4{flex:0 0 33.33333333%;max-width:33.33333333%}.col-5{flex:0 0 41.66666667%;max-width:41.66666667%}.col-6{flex:0 0 50%;max-width:50%}.col-7{flex:0 0 58.33333333%;max-width:58.33333333%}.col-8{flex:0 0 66.66666667%;max-width:66.66666667%}.col-9{flex:0 0 75%;max-width:75%}.col-10{flex:0 0 83.33333333%;max-width:83.33333333%}.col-11{flex:0 0 91.66666667%;max-width:91.66666667%}.col-12{flex:0 0 100%;max-width:100%}.order-first{order:-1}.order-last{order:13}.order-0{order:0}.order-1{order:1}.order-2{order:2}.order-3{order:3}.order-4{order:4}.order-5{order:5}.order-6{order:6}.order-7{order:7}.order-8{order:8}.order-9{order:9}.order-10{order:10}.order-11{order:11}.order-12{order:12}.offset-1{margin-left:8.33333333%}.offset-2{margin-left:16.66666667%}.offset-3{margin-left:25%}.offset-4{margin-left:33.33333333%}.offset-5{margin-left:41.66666667%}.offset-6{margin-left:50%}.offset-7{margin-left:58.33333333%}.offset-8{margin-left:66.66666667%}.offset-9{margin-left:75%}.offset-10{margin-left:83.33333333%}.offset-11{margin-left:91.66666667%}@media (min-width:2px){.col-sm{flex-basis:0;flex-grow:1;max-width:100%}.row-cols-sm-1>*{flex:0 0 100%;max-width:100%}.row-cols-sm-2>*{flex:0 0 50%;max-width:50%}.row-cols-sm-3>*{flex:0 0 33.3333333333%;max-width:33.3333333333%}.row-cols-sm-4>*{flex:0 0 25%;max-width:25%}.row-cols-sm-5>*{flex:0 0 20%;max-width:20%}.row-cols-sm-6>*{flex:0 0 16.6666666667%;max-width:16.6666666667%}.col-sm-auto{flex:0 0 auto;max-width:100%;width:auto}.col-sm-1{flex:0 0 8.33333333%;max-width:8.33333333%}.col-sm-2{flex:0 0 16.66666667%;max-width:16.66666667%}.col-sm-3{flex:0 0 25%;max-width:25%}.col-sm-4{flex:0 0 33.33333333%;max-width:33.33333333%}.col-sm-5{flex:0 0 41.66666667%;max-width:41.66666667%}.col-sm-6{flex:0 0 50%;max-width:50%}.col-sm-7{flex:0 0 58.33333333%;max-width:58.33333333%}.col-sm-8{flex:0 0 66.66666667%;max-width:66.66666667%}.col-sm-9{flex:0 0 75%;max-width:75%}.col-sm-10{flex:0 0 83.33333333%;max-width:83.33333333%}.col-sm-11{flex:0 0 91.66666667%;max-width:91.66666667%}.col-sm-12{flex:0 0 100%;max-width:100%}.order-sm-first{order:-1}.order-sm-last{order:13}.order-sm-0{order:0}.order-sm-1{order:1}.order-sm-2{order:2}.order-sm-3{order:3}.order-sm-4{order:4}.order-sm-5{order:5}.order-sm-6{order:6}.order-sm-7{order:7}.order-sm-8{order:8}.order-sm-9{order:9}.order-sm-10{order:10}.order-sm-11{order:11}.order-sm-12{order:12}.offset-sm-0{margin-left:0}.offset-sm-1{margin-left:8.33333333%}.offset-sm-2{margin-left:16.66666667%}.offset-sm-3{margin-left:25%}.offset-sm-4{margin-left:33.33333333%}.offset-sm-5{margin-left:41.66666667%}.offset-sm-6{margin-left:50%}.offset-sm-7{margin-left:58.33333333%}.offset-sm-8{margin-left:66.66666667%}.offset-sm-9{margin-left:75%}.offset-sm-10{margin-left:83.33333333%}.offset-sm-11{margin-left:91.66666667%}}@media (min-width:8px){.col-md{flex-basis:0;flex-grow:1;max-width:100%}.row-cols-md-1>*{flex:0 0 100%;max-width:100%}.row-cols-md-2>*{flex:0 0 50%;max-width:50%}.row-cols-md-3>*{flex:0 0 33.3333333333%;max-width:33.3333333333%}.row-cols-md-4>*{flex:0 0 25%;max-width:25%}.row-cols-md-5>*{flex:0 0 20%;max-width:20%}.row-cols-md-6>*{flex:0 0 16.6666666667%;max-width:16.6666666667%}.col-md-auto{flex:0 0 auto;max-width:100%;width:auto}.col-md-1{flex:0 0 8.33333333%;max-width:8.33333333%}.col-md-2{flex:0 0 16.66666667%;max-width:16.66666667%}.col-md-3{flex:0 0 25%;max-width:25%}.col-md-4{flex:0 0 33.33333333%;max-width:33.33333333%}.col-md-5{flex:0 0 41.66666667%;max-width:41.66666667%}.col-md-6{flex:0 0 50%;max-width:50%}.col-md-7{flex:0 0 58.33333333%;max-width:58.33333333%}.col-md-8{flex:0 0 66.66666667%;max-width:66.66666667%}.col-md-9{flex:0 0 75%;max-width:75%}.col-md-10{flex:0 0 83.33333333%;max-width:83.33333333%}.col-md-11{flex:0 0 91.66666667%;max-width:91.66666667%}.col-md-12{flex:0 0 100%;max-width:100%}.order-md-first{order:-1}.order-md-last{order:13}.order-md-0{order:0}.order-md-1{order:1}.order-md-2{order:2}.order-md-3{order:3}.order-md-4{order:4}.order-md-5{order:5}.order-md-6{order:6}.order-md-7{order:7}.order-md-8{order:8}.order-md-9{order:9}.order-md-10{order:10}.order-md-11{order:11}.order-md-12{order:12}.offset-md-0{margin-left:0}.offset-md-1{margin-left:8.33333333%}.offset-md-2{margin-left:16.66666667%}.offset-md-3{margin-left:25%}.offset-md-4{margin-left:33.33333333%}.offset-md-5{margin-left:41.66666667%}.offset-md-6{margin-left:50%}.offset-md-7{margin-left:58.33333333%}.offset-md-8{margin-left:66.66666667%}.offset-md-9{margin-left:75%}.offset-md-10{margin-left:83.33333333%}.offset-md-11{margin-left:91.66666667%}}@media (min-width:9px){.col-lg{flex-basis:0;flex-grow:1;max-width:100%}.row-cols-lg-1>*{flex:0 0 100%;max-width:100%}.row-cols-lg-2>*{flex:0 0 50%;max-width:50%}.row-cols-lg-3>*{flex:0 0 33.3333333333%;max-width:33.3333333333%}.row-cols-lg-4>*{flex:0 0 25%;max-width:25%}.row-cols-lg-5>*{flex:0 0 20%;max-width:20%}.row-cols-lg-6>*{flex:0 0 16.6666666667%;max-width:16.6666666667%}.col-lg-auto{flex:0 0 auto;max-width:100%;width:auto}.col-lg-1{flex:0 0 8.33333333%;max-width:8.33333333%}.col-lg-2{flex:0 0 16.66666667%;max-width:16.66666667%}.col-lg-3{flex:0 0 25%;max-width:25%}.col-lg-4{flex:0 0 33.33333333%;max-width:33.33333333%}.col-lg-5{flex:0 0 41.66666667%;max-width:41.66666667%}.col-lg-6{flex:0 0 50%;max-width:50%}.col-lg-7{flex:0 0 58.33333333%;max-width:58.33333333%}.col-lg-8{flex:0 0 66.66666667%;max-width:66.66666667%}.col-lg-9{flex:0 0 75%;max-width:75%}.col-lg-10{flex:0 0 83.33333333%;max-width:83.33333333%}.col-lg-11{flex:0 0 91.66666667%;max-width:91.66666667%}.col-lg-12{flex:0 0 100%;max-width:100%}.order-lg-first{order:-1}.order-lg-last{order:13}.order-lg-0{order:0}.order-lg-1{order:1}.order-lg-2{order:2}.order-lg-3{order:3}.order-lg-4{order:4}.order-lg-5{order:5}.order-lg-6{order:6}.order-lg-7{order:7}.order-lg-8{order:8}.order-lg-9{order:9}.order-lg-10{order:10}.order-lg-11{order:11}.order-lg-12{order:12}.offset-lg-0{margin-left:0}.offset-lg-1{margin-left:8.33333333%}.offset-lg-2{margin-left:16.66666667%}.offset-lg-3{margin-left:25%}.offset-lg-4{margin-left:33.33333333%}.offset-lg-5{margin-left:41.66666667%}.offset-lg-6{margin-left:50%}.offset-lg-7{margin-left:58.33333333%}.offset-lg-8{margin-left:66.66666667%}.offset-lg-9{margin-left:75%}.offset-lg-10{margin-left:83.33333333%}.offset-lg-11{margin-left:91.66666667%}}@media (min-width:10px){.col-xl{flex-basis:0;flex-grow:1;max-width:100%}.row-cols-xl-1>*{flex:0 0 100%;max-width:100%}.row-cols-xl-2>*{flex:0 0 50%;max-width:50%}.row-cols-xl-3>*{flex:0 0 33.3333333333%;max-width:33.3333333333%}.row-cols-xl-4>*{flex:0 0 25%;max-width:25%}.row-cols-xl-5>*{flex:0 0 20%;max-width:20%}.row-cols-xl-6>*{flex:0 0 16.6666666667%;max-width:16.6666666667%}.col-xl-auto{flex:0 0 auto;max-width:100%;width:auto}.col-xl-1{flex:0 0 8.33333333%;max-width:8.33333333%}.col-xl-2{flex:0 0 16.66666667%;max-width:16.66666667%}.col-xl-3{flex:0 0 25%;max-width:25%}.col-xl-4{flex:0 0 33.33333333%;max-width:33.33333333%}.col-xl-5{flex:0 0 41.66666667%;max-width:41.66666667%}.col-xl-6{flex:0 0 50%;max-width:50%}.col-xl-7{flex:0 0 58.33333333%;max-width:58.33333333%}.col-xl-8{flex:0 0 66.66666667%;max-width:66.66666667%}.col-xl-9{flex:0 0 75%;max-width:75%}.col-xl-10{flex:0 0 83.33333333%;max-width:83.33333333%}.col-xl-11{flex:0 0 91.66666667%;max-width:91.66666667%}.col-xl-12{flex:0 0 100%;max-width:100%}.order-xl-first{order:-1}.order-xl-last{order:13}.order-xl-0{order:0}.order-xl-1{order:1}.order-xl-2{order:2}.order-xl-3{order:3}.order-xl-4{order:4}.order-xl-5{order:5}.order-xl-6{order:6}.order-xl-7{order:7}.order-xl-8{order:8}.order-xl-9{order:9}.order-xl-10{order:10}.order-xl-11{order:11}.order-xl-12{order:12}.offset-xl-0{margin-left:0}.offset-xl-1{margin-left:8.33333333%}.offset-xl-2{margin-left:16.66666667%}.offset-xl-3{margin-left:25%}.offset-xl-4{margin-left:33.33333333%}.offset-xl-5{margin-left:41.66666667%}.offset-xl-6{margin-left:50%}.offset-xl-7{margin-left:58.33333333%}.offset-xl-8{margin-left:66.66666667%}.offset-xl-9{margin-left:75%}.offset-xl-10{margin-left:83.33333333%}.offset-xl-11{margin-left:91.66666667%}}.table{color:#f3f4f6;margin-bottom:1rem;width:100%}.table td,.table th{border-top:1px solid #374151;padding:.75rem;vertical-align:top}.table thead th{border-bottom:2px solid #374151;vertical-align:bottom}.table tbody+tbody{border-top:2px solid #374151}.table-sm td,.table-sm th{padding:.3rem}.table-bordered,.table-bordered td,.table-bordered th{border:1px solid #374151}.table-bordered thead td,.table-bordered thead th{border-bottom-width:2px}.table-borderless tbody+tbody,.table-borderless td,.table-borderless th,.table-borderless thead th{border:0}.table-striped tbody tr:nth-of-type(odd){background-color:rgba(0,0,0,.05)}.table-hover tbody tr:hover{background-color:#374151;color:#f3f4f6}.table-primary,.table-primary>td,.table-primary>th{background-color:#cacaf0}.table-primary tbody+tbody,.table-primary td,.table-primary th,.table-primary thead th{border-color:#9c9ce2}.table-hover .table-primary:hover,.table-hover .table-primary:hover>td,.table-hover .table-primary:hover>th{background-color:#b6b6ea}.table-secondary,.table-secondary>td,.table-secondary>th{background-color:#cdcfd3}.table-secondary tbody+tbody,.table-secondary td,.table-secondary th,.table-secondary thead th{border-color:#a1a7ae}.table-hover .table-secondary:hover,.table-hover .table-secondary:hover>td,.table-hover .table-secondary:hover>th{background-color:#bfc2c7}.table-success,.table-success>td,.table-success>th{background-color:#b9e2d5}.table-success tbody+tbody,.table-success td,.table-success th,.table-success thead th{border-color:#7dc8b1}.table-hover .table-success:hover,.table-hover .table-success:hover>td,.table-hover .table-success:hover>th{background-color:#a7dbca}.table-info,.table-info>td,.table-info>th{background-color:#c2d3f9}.table-info tbody+tbody,.table-info td,.table-info th,.table-info thead th{border-color:#8eaef5}.table-hover .table-info:hover,.table-hover .table-info:hover>td,.table-hover .table-info:hover>th{background-color:#abc2f7}.table-warning,.table-warning>td,.table-warning>th{background-color:#f4d9b9}.table-warning tbody+tbody,.table-warning td,.table-warning th,.table-warning thead th{border-color:#ebb87e}.table-hover .table-warning:hover,.table-hover .table-warning:hover>td,.table-hover .table-warning:hover>th{background-color:#f1cda3}.table-danger,.table-danger>td,.table-danger>th{background-color:#f5c2c2}.table-danger tbody+tbody,.table-danger td,.table-danger th,.table-danger thead th{border-color:#ed8e8e}.table-hover .table-danger:hover,.table-hover .table-danger:hover>td,.table-hover .table-danger:hover>th{background-color:#f1acac}.table-light,.table-light>td,.table-light>th{background-color:#fcfcfc}.table-light tbody+tbody,.table-light td,.table-light th,.table-light thead th{border-color:#f9f9fa}.table-hover .table-light:hover,.table-hover .table-light:hover>td,.table-hover .table-light:hover>th{background-color:#efefef}.table-dark,.table-dark>td,.table-dark>th{background-color:#c0c3c7}.table-dark tbody+tbody,.table-dark td,.table-dark th,.table-dark thead th{border-color:#8b9097}.table-hover .table-dark:hover,.table-hover .table-dark:hover>td,.table-hover .table-dark:hover>th{background-color:#b3b6bb}.table-active,.table-active>td,.table-active>th{background-color:#374151}.table-hover .table-active:hover,.table-hover .table-active:hover>td,.table-hover .table-active:hover>th{background-color:#2d3542}.table .thead-dark th{background-color:#1f2937;border-color:#2d3b4f;color:#fff}.table .thead-light th{background-color:#e5e7eb;border-color:#374151;color:#374151}.table-dark{background-color:#1f2937;color:#fff}.table-dark td,.table-dark th,.table-dark thead th{border-color:#2d3b4f}.table-dark.table-bordered{border:0}.table-dark.table-striped tbody tr:nth-of-type(odd){background-color:hsla(0,0%,100%,.05)}.table-dark.table-hover tbody tr:hover{background-color:hsla(0,0%,100%,.075);color:#fff}@media (max-width:1.98px){.table-responsive-sm{-webkit-overflow-scrolling:touch;display:block;overflow-x:auto;width:100%}.table-responsive-sm>.table-bordered{border:0}}@media (max-width:7.98px){.table-responsive-md{-webkit-overflow-scrolling:touch;display:block;overflow-x:auto;width:100%}.table-responsive-md>.table-bordered{border:0}}@media (max-width:8.98px){.table-responsive-lg{-webkit-overflow-scrolling:touch;display:block;overflow-x:auto;width:100%}.table-responsive-lg>.table-bordered{border:0}}@media (max-width:9.98px){.table-responsive-xl{-webkit-overflow-scrolling:touch;display:block;overflow-x:auto;width:100%}.table-responsive-xl>.table-bordered{border:0}}.table-responsive{-webkit-overflow-scrolling:touch;display:block;overflow-x:auto;width:100%}.table-responsive>.table-bordered{border:0}.form-control{background-clip:padding-box;background-color:#1f2937;border:1px solid #4b5563;border-radius:.25rem;color:#e5e7eb;display:block;font-size:1rem;font-weight:400;height:calc(1.5em + .75rem + 2px);line-height:1.5;padding:.375rem .75rem;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out;width:100%}@media (prefers-reduced-motion:reduce){.form-control{transition:none}}.form-control::-ms-expand{background-color:transparent;border:0}.form-control:focus{background-color:#1f2937;border-color:#a3a3e5;box-shadow:0 0 0 .2rem rgba(64,64,200,.25);color:#e5e7eb;outline:0}.form-control::-moz-placeholder{color:#4b5563;opacity:1}.form-control::placeholder{color:#4b5563;opacity:1}.form-control:disabled,.form-control[readonly]{background-color:#e5e7eb;opacity:1}input[type=date].form-control,input[type=datetime-local].form-control,input[type=month].form-control,input[type=time].form-control{-webkit-appearance:none;-moz-appearance:none;appearance:none}select.form-control:-moz-focusring{color:transparent;text-shadow:0 0 0 #e5e7eb}select.form-control:focus::-ms-value{background-color:#1f2937;color:#e5e7eb}.form-control-file,.form-control-range{display:block;width:100%}.col-form-label{font-size:inherit;line-height:1.5;margin-bottom:0;padding-bottom:calc(.375rem + 1px);padding-top:calc(.375rem + 1px)}.col-form-label-lg{font-size:1.25rem;line-height:1.5;padding-bottom:calc(.5rem + 1px);padding-top:calc(.5rem + 1px)}.col-form-label-sm{font-size:.875rem;line-height:1.5;padding-bottom:calc(.25rem + 1px);padding-top:calc(.25rem + 1px)}.form-control-plaintext{background-color:transparent;border:solid transparent;border-width:1px 0;color:#f3f4f6;display:block;font-size:1rem;line-height:1.5;margin-bottom:0;padding:.375rem 0;width:100%}.form-control-plaintext.form-control-lg,.form-control-plaintext.form-control-sm{padding-left:0;padding-right:0}.form-control-sm{border-radius:.2rem;font-size:.875rem;height:calc(1.5em + .5rem + 2px);line-height:1.5;padding:.25rem .5rem}.form-control-lg{border-radius:6px;font-size:1.25rem;height:calc(1.5em + 1rem + 2px);line-height:1.5;padding:.5rem 1rem}select.form-control[multiple],select.form-control[size],textarea.form-control{height:auto}.form-group{margin-bottom:1rem}.form-text{display:block;margin-top:.25rem}.form-row{display:flex;flex-wrap:wrap;margin-left:-5px;margin-right:-5px}.form-row>.col,.form-row>[class*=col-]{padding-left:5px;padding-right:5px}.form-check{display:block;padding-left:1.25rem;position:relative}.form-check-input{margin-left:-1.25rem;margin-top:.3rem;position:absolute}.form-check-input:disabled~.form-check-label,.form-check-input[disabled]~.form-check-label{color:#9ca3af}.form-check-label{margin-bottom:0}.form-check-inline{align-items:center;display:inline-flex;margin-right:.75rem;padding-left:0}.form-check-inline .form-check-input{margin-left:0;margin-right:.3125rem;margin-top:0;position:static}.valid-feedback{color:#059669;display:none;font-size:.875em;margin-top:.25rem;width:100%}.valid-tooltip{background-color:rgba(5,150,105,.9);border-radius:.25rem;color:#fff;display:none;font-size:.875rem;left:0;line-height:1.5;margin-top:.1rem;max-width:100%;padding:.25rem .5rem;position:absolute;top:100%;z-index:5}.form-row>.col>.valid-tooltip,.form-row>[class*=col-]>.valid-tooltip{left:5px}.is-valid~.valid-feedback,.is-valid~.valid-tooltip,.was-validated :valid~.valid-feedback,.was-validated :valid~.valid-tooltip{display:block}.form-control.is-valid,.was-validated .form-control:valid{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8'%3E%3Cpath fill='%23059669' d='M2.3 6.73.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3E%3C/svg%3E");background-position:right calc(.375em + .1875rem) center;background-repeat:no-repeat;background-size:calc(.75em + .375rem) calc(.75em + .375rem);border-color:#059669;padding-right:calc(1.5em + .75rem)!important}.form-control.is-valid:focus,.was-validated .form-control:valid:focus{border-color:#059669;box-shadow:0 0 0 .2rem rgba(5,150,105,.25)}.was-validated select.form-control:valid,select.form-control.is-valid{background-position:right 1.5rem center;padding-right:3rem!important}.was-validated textarea.form-control:valid,textarea.form-control.is-valid{background-position:top calc(.375em + .1875rem) right calc(.375em + .1875rem);padding-right:calc(1.5em + .75rem)}.custom-select.is-valid,.was-validated .custom-select:valid{background:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='4' height='5'%3E%3Cpath fill='%231f2937' d='M2 0 0 2h4zm0 5L0 3h4z'/%3E%3C/svg%3E") right .75rem center/8px 10px no-repeat,#1f2937 url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8'%3E%3Cpath fill='%23059669' d='M2.3 6.73.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3E%3C/svg%3E") center right 1.75rem/calc(.75em + .375rem) calc(.75em + .375rem) no-repeat;border-color:#059669;padding-right:calc(.75em + 2.3125rem)!important}.custom-select.is-valid:focus,.was-validated .custom-select:valid:focus{border-color:#059669;box-shadow:0 0 0 .2rem rgba(5,150,105,.25)}.form-check-input.is-valid~.form-check-label,.was-validated .form-check-input:valid~.form-check-label{color:#059669}.form-check-input.is-valid~.valid-feedback,.form-check-input.is-valid~.valid-tooltip,.was-validated .form-check-input:valid~.valid-feedback,.was-validated .form-check-input:valid~.valid-tooltip{display:block}.custom-control-input.is-valid~.custom-control-label,.was-validated .custom-control-input:valid~.custom-control-label{color:#059669}.custom-control-input.is-valid~.custom-control-label:before,.was-validated .custom-control-input:valid~.custom-control-label:before{border-color:#059669}.custom-control-input.is-valid:checked~.custom-control-label:before,.was-validated .custom-control-input:valid:checked~.custom-control-label:before{background-color:#07c78c;border-color:#07c78c}.custom-control-input.is-valid:focus~.custom-control-label:before,.was-validated .custom-control-input:valid:focus~.custom-control-label:before{box-shadow:0 0 0 .2rem rgba(5,150,105,.25)}.custom-control-input.is-valid:focus:not(:checked)~.custom-control-label:before,.was-validated .custom-control-input:valid:focus:not(:checked)~.custom-control-label:before{border-color:#059669}.custom-file-input.is-valid~.custom-file-label,.was-validated .custom-file-input:valid~.custom-file-label{border-color:#059669}.custom-file-input.is-valid:focus~.custom-file-label,.was-validated .custom-file-input:valid:focus~.custom-file-label{border-color:#059669;box-shadow:0 0 0 .2rem rgba(5,150,105,.25)}.invalid-feedback{color:#dc2626;display:none;font-size:.875em;margin-top:.25rem;width:100%}.invalid-tooltip{background-color:rgba(220,38,38,.9);border-radius:.25rem;color:#fff;display:none;font-size:.875rem;left:0;line-height:1.5;margin-top:.1rem;max-width:100%;padding:.25rem .5rem;position:absolute;top:100%;z-index:5}.form-row>.col>.invalid-tooltip,.form-row>[class*=col-]>.invalid-tooltip{left:5px}.is-invalid~.invalid-feedback,.is-invalid~.invalid-tooltip,.was-validated :invalid~.invalid-feedback,.was-validated :invalid~.invalid-tooltip{display:block}.form-control.is-invalid,.was-validated .form-control:invalid{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' fill='none' stroke='%23dc2626'%3E%3Ccircle cx='6' cy='6' r='4.5'/%3E%3Cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3E%3Ccircle cx='6' cy='8.2' r='.6' fill='%23dc2626' stroke='none'/%3E%3C/svg%3E");background-position:right calc(.375em + .1875rem) center;background-repeat:no-repeat;background-size:calc(.75em + .375rem) calc(.75em + .375rem);border-color:#dc2626;padding-right:calc(1.5em + .75rem)!important}.form-control.is-invalid:focus,.was-validated .form-control:invalid:focus{border-color:#dc2626;box-shadow:0 0 0 .2rem rgba(220,38,38,.25)}.was-validated select.form-control:invalid,select.form-control.is-invalid{background-position:right 1.5rem center;padding-right:3rem!important}.was-validated textarea.form-control:invalid,textarea.form-control.is-invalid{background-position:top calc(.375em + .1875rem) right calc(.375em + .1875rem);padding-right:calc(1.5em + .75rem)}.custom-select.is-invalid,.was-validated .custom-select:invalid{background:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='4' height='5'%3E%3Cpath fill='%231f2937' d='M2 0 0 2h4zm0 5L0 3h4z'/%3E%3C/svg%3E") right .75rem center/8px 10px no-repeat,#1f2937 url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' fill='none' stroke='%23dc2626'%3E%3Ccircle cx='6' cy='6' r='4.5'/%3E%3Cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3E%3Ccircle cx='6' cy='8.2' r='.6' fill='%23dc2626' stroke='none'/%3E%3C/svg%3E") center right 1.75rem/calc(.75em + .375rem) calc(.75em + .375rem) no-repeat;border-color:#dc2626;padding-right:calc(.75em + 2.3125rem)!important}.custom-select.is-invalid:focus,.was-validated .custom-select:invalid:focus{border-color:#dc2626;box-shadow:0 0 0 .2rem rgba(220,38,38,.25)}.form-check-input.is-invalid~.form-check-label,.was-validated .form-check-input:invalid~.form-check-label{color:#dc2626}.form-check-input.is-invalid~.invalid-feedback,.form-check-input.is-invalid~.invalid-tooltip,.was-validated .form-check-input:invalid~.invalid-feedback,.was-validated .form-check-input:invalid~.invalid-tooltip{display:block}.custom-control-input.is-invalid~.custom-control-label,.was-validated .custom-control-input:invalid~.custom-control-label{color:#dc2626}.custom-control-input.is-invalid~.custom-control-label:before,.was-validated .custom-control-input:invalid~.custom-control-label:before{border-color:#dc2626}.custom-control-input.is-invalid:checked~.custom-control-label:before,.was-validated .custom-control-input:invalid:checked~.custom-control-label:before{background-color:#e35252;border-color:#e35252}.custom-control-input.is-invalid:focus~.custom-control-label:before,.was-validated .custom-control-input:invalid:focus~.custom-control-label:before{box-shadow:0 0 0 .2rem rgba(220,38,38,.25)}.custom-control-input.is-invalid:focus:not(:checked)~.custom-control-label:before,.was-validated .custom-control-input:invalid:focus:not(:checked)~.custom-control-label:before{border-color:#dc2626}.custom-file-input.is-invalid~.custom-file-label,.was-validated .custom-file-input:invalid~.custom-file-label{border-color:#dc2626}.custom-file-input.is-invalid:focus~.custom-file-label,.was-validated .custom-file-input:invalid:focus~.custom-file-label{border-color:#dc2626;box-shadow:0 0 0 .2rem rgba(220,38,38,.25)}.form-inline{align-items:center;display:flex;flex-flow:row wrap}.form-inline .form-check{width:100%}@media (min-width:2px){.form-inline label{justify-content:center}.form-inline .form-group,.form-inline label{align-items:center;display:flex;margin-bottom:0}.form-inline .form-group{flex:0 0 auto;flex-flow:row wrap}.form-inline .form-control{display:inline-block;vertical-align:middle;width:auto}.form-inline .form-control-plaintext{display:inline-block}.form-inline .custom-select,.form-inline .input-group{width:auto}.form-inline .form-check{align-items:center;display:flex;justify-content:center;padding-left:0;width:auto}.form-inline .form-check-input{flex-shrink:0;margin-left:0;margin-right:.25rem;margin-top:0;position:relative}.form-inline .custom-control{align-items:center;justify-content:center}.form-inline .custom-control-label{margin-bottom:0}}.btn{background-color:transparent;border:1px solid transparent;border-radius:.25rem;color:#f3f4f6;display:inline-block;font-size:1rem;font-weight:400;line-height:1.5;padding:.375rem .75rem;text-align:center;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;-webkit-user-select:none;-moz-user-select:none;user-select:none;vertical-align:middle}@media (prefers-reduced-motion:reduce){.btn{transition:none}}.btn:hover{color:#f3f4f6;text-decoration:none}.btn.focus,.btn:focus{box-shadow:0 0 0 .2rem rgba(64,64,200,.25);outline:0}.btn.disabled,.btn:disabled{opacity:.65}.btn:not(:disabled):not(.disabled){cursor:pointer}a.btn.disabled,fieldset:disabled a.btn{pointer-events:none}.btn-primary{background-color:#4040c8;border-color:#4040c8;color:#fff}.btn-primary.focus,.btn-primary:focus,.btn-primary:hover{background-color:#3232af;border-color:#3030a5;color:#fff}.btn-primary.focus,.btn-primary:focus{box-shadow:0 0 0 .2rem rgba(93,93,208,.5)}.btn-primary.disabled,.btn-primary:disabled{background-color:#4040c8;border-color:#4040c8;color:#fff}.btn-primary:not(:disabled):not(.disabled).active,.btn-primary:not(:disabled):not(.disabled):active,.show>.btn-primary.dropdown-toggle{background-color:#3030a5;border-color:#2d2d9b;color:#fff}.btn-primary:not(:disabled):not(.disabled).active:focus,.btn-primary:not(:disabled):not(.disabled):active:focus,.show>.btn-primary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(93,93,208,.5)}.btn-secondary{background-color:#4b5563;border-color:#4b5563;color:#fff}.btn-secondary.focus,.btn-secondary:focus,.btn-secondary:hover{background-color:#3b424d;border-color:#353c46;color:#fff}.btn-secondary.focus,.btn-secondary:focus{box-shadow:0 0 0 .2rem hsla(213,9%,44%,.5)}.btn-secondary.disabled,.btn-secondary:disabled{background-color:#4b5563;border-color:#4b5563;color:#fff}.btn-secondary:not(:disabled):not(.disabled).active,.btn-secondary:not(:disabled):not(.disabled):active,.show>.btn-secondary.dropdown-toggle{background-color:#353c46;border-color:#30363f;color:#fff}.btn-secondary:not(:disabled):not(.disabled).active:focus,.btn-secondary:not(:disabled):not(.disabled):active:focus,.show>.btn-secondary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem hsla(213,9%,44%,.5)}.btn-success{background-color:#059669;border-color:#059669;color:#fff}.btn-success.focus,.btn-success:focus,.btn-success:hover{background-color:#04714f;border-color:#036546;color:#fff}.btn-success.focus,.btn-success:focus{box-shadow:0 0 0 .2rem rgba(43,166,128,.5)}.btn-success.disabled,.btn-success:disabled{background-color:#059669;border-color:#059669;color:#fff}.btn-success:not(:disabled):not(.disabled).active,.btn-success:not(:disabled):not(.disabled):active,.show>.btn-success.dropdown-toggle{background-color:#036546;border-color:#03583e;color:#fff}.btn-success:not(:disabled):not(.disabled).active:focus,.btn-success:not(:disabled):not(.disabled):active:focus,.show>.btn-success.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(43,166,128,.5)}.btn-info{background-color:#2563eb;border-color:#2563eb;color:#fff}.btn-info.focus,.btn-info:focus,.btn-info:hover{background-color:#1451d6;border-color:#134cca;color:#fff}.btn-info.focus,.btn-info:focus{box-shadow:0 0 0 .2rem rgba(70,122,238,.5)}.btn-info.disabled,.btn-info:disabled{background-color:#2563eb;border-color:#2563eb;color:#fff}.btn-info:not(:disabled):not(.disabled).active,.btn-info:not(:disabled):not(.disabled):active,.show>.btn-info.dropdown-toggle{background-color:#134cca;border-color:#1248bf;color:#fff}.btn-info:not(:disabled):not(.disabled).active:focus,.btn-info:not(:disabled):not(.disabled):active:focus,.show>.btn-info.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(70,122,238,.5)}.btn-warning{background-color:#d97706;border-color:#d97706;color:#fff}.btn-warning.focus,.btn-warning:focus,.btn-warning:hover{background-color:#b46305;border-color:#a75c05;color:#fff}.btn-warning.focus,.btn-warning:focus{box-shadow:0 0 0 .2rem rgba(223,139,43,.5)}.btn-warning.disabled,.btn-warning:disabled{background-color:#d97706;border-color:#d97706;color:#fff}.btn-warning:not(:disabled):not(.disabled).active,.btn-warning:not(:disabled):not(.disabled):active,.show>.btn-warning.dropdown-toggle{background-color:#a75c05;border-color:#9b5504;color:#fff}.btn-warning:not(:disabled):not(.disabled).active:focus,.btn-warning:not(:disabled):not(.disabled):active:focus,.show>.btn-warning.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(223,139,43,.5)}.btn-danger{background-color:#dc2626;border-color:#dc2626;color:#fff}.btn-danger.focus,.btn-danger:focus,.btn-danger:hover{background-color:#bd1f1f;border-color:#b21d1d;color:#fff}.btn-danger.focus,.btn-danger:focus{box-shadow:0 0 0 .2rem rgba(225,71,71,.5)}.btn-danger.disabled,.btn-danger:disabled{background-color:#dc2626;border-color:#dc2626;color:#fff}.btn-danger:not(:disabled):not(.disabled).active,.btn-danger:not(:disabled):not(.disabled):active,.show>.btn-danger.dropdown-toggle{background-color:#b21d1d;border-color:#a71b1b;color:#fff}.btn-danger:not(:disabled):not(.disabled).active:focus,.btn-danger:not(:disabled):not(.disabled):active:focus,.show>.btn-danger.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(225,71,71,.5)}.btn-light{background-color:#f3f4f6;border-color:#f3f4f6;color:#111827}.btn-light.focus,.btn-light:focus,.btn-light:hover{background-color:#dde0e6;border-color:#d6d9e0;color:#111827}.btn-light.focus,.btn-light:focus{box-shadow:0 0 0 .2rem hsla(220,7%,83%,.5)}.btn-light.disabled,.btn-light:disabled{background-color:#f3f4f6;border-color:#f3f4f6;color:#111827}.btn-light:not(:disabled):not(.disabled).active,.btn-light:not(:disabled):not(.disabled):active,.show>.btn-light.dropdown-toggle{background-color:#d6d9e0;border-color:#cfd3db;color:#111827}.btn-light:not(:disabled):not(.disabled).active:focus,.btn-light:not(:disabled):not(.disabled):active:focus,.show>.btn-light.dropdown-toggle:focus{box-shadow:0 0 0 .2rem hsla(220,7%,83%,.5)}.btn-dark{background-color:#1f2937;border-color:#1f2937;color:#fff}.btn-dark.focus,.btn-dark:focus,.btn-dark:hover{background-color:#11171f;border-color:#0d1116;color:#fff}.btn-dark.focus,.btn-dark:focus{box-shadow:0 0 0 .2rem rgba(65,73,85,.5)}.btn-dark.disabled,.btn-dark:disabled{background-color:#1f2937;border-color:#1f2937;color:#fff}.btn-dark:not(:disabled):not(.disabled).active,.btn-dark:not(:disabled):not(.disabled):active,.show>.btn-dark.dropdown-toggle{background-color:#0d1116;border-color:#080b0e;color:#fff}.btn-dark:not(:disabled):not(.disabled).active:focus,.btn-dark:not(:disabled):not(.disabled):active:focus,.show>.btn-dark.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(65,73,85,.5)}.btn-outline-primary{border-color:#4040c8;color:#4040c8}.btn-outline-primary:hover{background-color:#4040c8;border-color:#4040c8;color:#fff}.btn-outline-primary.focus,.btn-outline-primary:focus{box-shadow:0 0 0 .2rem rgba(64,64,200,.5)}.btn-outline-primary.disabled,.btn-outline-primary:disabled{background-color:transparent;color:#4040c8}.btn-outline-primary:not(:disabled):not(.disabled).active,.btn-outline-primary:not(:disabled):not(.disabled):active,.show>.btn-outline-primary.dropdown-toggle{background-color:#4040c8;border-color:#4040c8;color:#fff}.btn-outline-primary:not(:disabled):not(.disabled).active:focus,.btn-outline-primary:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-primary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(64,64,200,.5)}.btn-outline-secondary{border-color:#4b5563;color:#4b5563}.btn-outline-secondary:hover{background-color:#4b5563;border-color:#4b5563;color:#fff}.btn-outline-secondary.focus,.btn-outline-secondary:focus{box-shadow:0 0 0 .2rem rgba(75,85,99,.5)}.btn-outline-secondary.disabled,.btn-outline-secondary:disabled{background-color:transparent;color:#4b5563}.btn-outline-secondary:not(:disabled):not(.disabled).active,.btn-outline-secondary:not(:disabled):not(.disabled):active,.show>.btn-outline-secondary.dropdown-toggle{background-color:#4b5563;border-color:#4b5563;color:#fff}.btn-outline-secondary:not(:disabled):not(.disabled).active:focus,.btn-outline-secondary:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-secondary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(75,85,99,.5)}.btn-outline-success{border-color:#059669;color:#059669}.btn-outline-success:hover{background-color:#059669;border-color:#059669;color:#fff}.btn-outline-success.focus,.btn-outline-success:focus{box-shadow:0 0 0 .2rem rgba(5,150,105,.5)}.btn-outline-success.disabled,.btn-outline-success:disabled{background-color:transparent;color:#059669}.btn-outline-success:not(:disabled):not(.disabled).active,.btn-outline-success:not(:disabled):not(.disabled):active,.show>.btn-outline-success.dropdown-toggle{background-color:#059669;border-color:#059669;color:#fff}.btn-outline-success:not(:disabled):not(.disabled).active:focus,.btn-outline-success:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-success.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(5,150,105,.5)}.btn-outline-info{border-color:#2563eb;color:#2563eb}.btn-outline-info:hover{background-color:#2563eb;border-color:#2563eb;color:#fff}.btn-outline-info.focus,.btn-outline-info:focus{box-shadow:0 0 0 .2rem rgba(37,99,235,.5)}.btn-outline-info.disabled,.btn-outline-info:disabled{background-color:transparent;color:#2563eb}.btn-outline-info:not(:disabled):not(.disabled).active,.btn-outline-info:not(:disabled):not(.disabled):active,.show>.btn-outline-info.dropdown-toggle{background-color:#2563eb;border-color:#2563eb;color:#fff}.btn-outline-info:not(:disabled):not(.disabled).active:focus,.btn-outline-info:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-info.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(37,99,235,.5)}.btn-outline-warning{border-color:#d97706;color:#d97706}.btn-outline-warning:hover{background-color:#d97706;border-color:#d97706;color:#fff}.btn-outline-warning.focus,.btn-outline-warning:focus{box-shadow:0 0 0 .2rem rgba(217,119,6,.5)}.btn-outline-warning.disabled,.btn-outline-warning:disabled{background-color:transparent;color:#d97706}.btn-outline-warning:not(:disabled):not(.disabled).active,.btn-outline-warning:not(:disabled):not(.disabled):active,.show>.btn-outline-warning.dropdown-toggle{background-color:#d97706;border-color:#d97706;color:#fff}.btn-outline-warning:not(:disabled):not(.disabled).active:focus,.btn-outline-warning:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-warning.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(217,119,6,.5)}.btn-outline-danger{border-color:#dc2626;color:#dc2626}.btn-outline-danger:hover{background-color:#dc2626;border-color:#dc2626;color:#fff}.btn-outline-danger.focus,.btn-outline-danger:focus{box-shadow:0 0 0 .2rem rgba(220,38,38,.5)}.btn-outline-danger.disabled,.btn-outline-danger:disabled{background-color:transparent;color:#dc2626}.btn-outline-danger:not(:disabled):not(.disabled).active,.btn-outline-danger:not(:disabled):not(.disabled):active,.show>.btn-outline-danger.dropdown-toggle{background-color:#dc2626;border-color:#dc2626;color:#fff}.btn-outline-danger:not(:disabled):not(.disabled).active:focus,.btn-outline-danger:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-danger.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(220,38,38,.5)}.btn-outline-light{border-color:#f3f4f6;color:#f3f4f6}.btn-outline-light:hover{background-color:#f3f4f6;border-color:#f3f4f6;color:#111827}.btn-outline-light.focus,.btn-outline-light:focus{box-shadow:0 0 0 .2rem rgba(243,244,246,.5)}.btn-outline-light.disabled,.btn-outline-light:disabled{background-color:transparent;color:#f3f4f6}.btn-outline-light:not(:disabled):not(.disabled).active,.btn-outline-light:not(:disabled):not(.disabled):active,.show>.btn-outline-light.dropdown-toggle{background-color:#f3f4f6;border-color:#f3f4f6;color:#111827}.btn-outline-light:not(:disabled):not(.disabled).active:focus,.btn-outline-light:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-light.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(243,244,246,.5)}.btn-outline-dark{border-color:#1f2937;color:#1f2937}.btn-outline-dark:hover{background-color:#1f2937;border-color:#1f2937;color:#fff}.btn-outline-dark.focus,.btn-outline-dark:focus{box-shadow:0 0 0 .2rem rgba(31,41,55,.5)}.btn-outline-dark.disabled,.btn-outline-dark:disabled{background-color:transparent;color:#1f2937}.btn-outline-dark:not(:disabled):not(.disabled).active,.btn-outline-dark:not(:disabled):not(.disabled):active,.show>.btn-outline-dark.dropdown-toggle{background-color:#1f2937;border-color:#1f2937;color:#fff}.btn-outline-dark:not(:disabled):not(.disabled).active:focus,.btn-outline-dark:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-dark.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(31,41,55,.5)}.btn-link{color:#818cf8;font-weight:400;text-decoration:none}.btn-link:hover{color:#a5b4fc}.btn-link.focus,.btn-link:focus,.btn-link:hover{text-decoration:underline}.btn-link.disabled,.btn-link:disabled{color:#4b5563;pointer-events:none}.btn-group-lg>.btn,.btn-lg{border-radius:6px;font-size:1.25rem;line-height:1.5;padding:.5rem 1rem}.btn-group-sm>.btn,.btn-sm{border-radius:.2rem;font-size:.875rem;line-height:1.5;padding:.25rem .5rem}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:.5rem}input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%}.fade{transition:opacity .15s linear}@media (prefers-reduced-motion:reduce){.fade{transition:none}}.fade:not(.show){opacity:0}.collapse:not(.show){display:none}.collapsing{height:0;overflow:hidden;position:relative;transition:height .35s ease}@media (prefers-reduced-motion:reduce){.collapsing{transition:none}}.collapsing.width{height:auto;transition:width .35s ease;width:0}@media (prefers-reduced-motion:reduce){.collapsing.width{transition:none}}.dropdown,.dropleft,.dropright,.dropup{position:relative}.dropdown-toggle{white-space:nowrap}.dropdown-toggle:after{border-bottom:0;border-left:.3em solid transparent;border-right:.3em solid transparent;border-top:.3em solid;content:"";display:inline-block;margin-left:.255em;vertical-align:.255em}.dropdown-toggle:empty:after{margin-left:0}.dropdown-menu{background-clip:padding-box;background-color:#374151;border:1px solid rgba(0,0,0,.15);border-radius:.25rem;color:#f3f4f6;display:none;float:left;font-size:1rem;left:0;list-style:none;margin:.125rem 0 0;min-width:10rem;padding:.5rem 0;position:absolute;text-align:left;top:100%;z-index:1000}.dropdown-menu-left{left:0;right:auto}.dropdown-menu-right{left:auto;right:0}@media (min-width:2px){.dropdown-menu-sm-left{left:0;right:auto}.dropdown-menu-sm-right{left:auto;right:0}}@media (min-width:8px){.dropdown-menu-md-left{left:0;right:auto}.dropdown-menu-md-right{left:auto;right:0}}@media (min-width:9px){.dropdown-menu-lg-left{left:0;right:auto}.dropdown-menu-lg-right{left:auto;right:0}}@media (min-width:10px){.dropdown-menu-xl-left{left:0;right:auto}.dropdown-menu-xl-right{left:auto;right:0}}.dropup .dropdown-menu{bottom:100%;margin-bottom:.125rem;margin-top:0;top:auto}.dropup .dropdown-toggle:after{border-bottom:.3em solid;border-left:.3em solid transparent;border-right:.3em solid transparent;border-top:0;content:"";display:inline-block;margin-left:.255em;vertical-align:.255em}.dropup .dropdown-toggle:empty:after{margin-left:0}.dropright .dropdown-menu{left:100%;margin-left:.125rem;margin-top:0;right:auto;top:0}.dropright .dropdown-toggle:after{border-bottom:.3em solid transparent;border-left:.3em solid;border-right:0;border-top:.3em solid transparent;content:"";display:inline-block;margin-left:.255em;vertical-align:.255em}.dropright .dropdown-toggle:empty:after{margin-left:0}.dropright .dropdown-toggle:after{vertical-align:0}.dropleft .dropdown-menu{left:auto;margin-right:.125rem;margin-top:0;right:100%;top:0}.dropleft .dropdown-toggle:after{content:"";display:inline-block;display:none;margin-left:.255em;vertical-align:.255em}.dropleft .dropdown-toggle:before{border-bottom:.3em solid transparent;border-right:.3em solid;border-top:.3em solid transparent;content:"";display:inline-block;margin-right:.255em;vertical-align:.255em}.dropleft .dropdown-toggle:empty:after{margin-left:0}.dropleft .dropdown-toggle:before{vertical-align:0}.dropdown-menu[x-placement^=bottom],.dropdown-menu[x-placement^=left],.dropdown-menu[x-placement^=right],.dropdown-menu[x-placement^=top]{bottom:auto;right:auto}.dropdown-divider{border-top:1px solid #e5e7eb;height:0;margin:.5rem 0;overflow:hidden}.dropdown-item{background-color:transparent;border:0;clear:both;color:#fff;display:block;font-weight:400;padding:.25rem 1.5rem;text-align:inherit;white-space:nowrap;width:100%}.dropdown-item:focus,.dropdown-item:hover{background-color:#e5e7eb;color:#090d15;text-decoration:none}.dropdown-item.active,.dropdown-item:active{background-color:#4040c8;color:#fff;text-decoration:none}.dropdown-item.disabled,.dropdown-item:disabled{background-color:transparent;color:#6b7280;pointer-events:none}.dropdown-menu.show{display:block}.dropdown-header{color:#4b5563;display:block;font-size:.875rem;margin-bottom:0;padding:.5rem 1.5rem;white-space:nowrap}.dropdown-item-text{color:#fff;display:block;padding:.25rem 1.5rem}.btn-group,.btn-group-vertical{display:inline-flex;position:relative;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{flex:1 1 auto;position:relative}.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:hover,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus,.btn-group>.btn:hover{z-index:1}.btn-toolbar{display:flex;flex-wrap:wrap;justify-content:flex-start}.btn-toolbar .input-group{width:auto}.btn-group>.btn-group:not(:first-child),.btn-group>.btn:not(:first-child){margin-left:-1px}.btn-group>.btn-group:not(:last-child)>.btn,.btn-group>.btn:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-top-right-radius:0}.btn-group>.btn-group:not(:first-child)>.btn,.btn-group>.btn:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.dropdown-toggle-split{padding-left:.5625rem;padding-right:.5625rem}.dropdown-toggle-split:after,.dropright .dropdown-toggle-split:after,.dropup .dropdown-toggle-split:after{margin-left:0}.dropleft .dropdown-toggle-split:before{margin-right:0}.btn-group-sm>.btn+.dropdown-toggle-split,.btn-sm+.dropdown-toggle-split{padding-left:.375rem;padding-right:.375rem}.btn-group-lg>.btn+.dropdown-toggle-split,.btn-lg+.dropdown-toggle-split{padding-left:.75rem;padding-right:.75rem}.btn-group-vertical{align-items:flex-start;flex-direction:column;justify-content:center}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group{width:100%}.btn-group-vertical>.btn-group:not(:first-child),.btn-group-vertical>.btn:not(:first-child){margin-top:-1px}.btn-group-vertical>.btn-group:not(:last-child)>.btn,.btn-group-vertical>.btn:not(:last-child):not(.dropdown-toggle){border-bottom-left-radius:0;border-bottom-right-radius:0}.btn-group-vertical>.btn-group:not(:first-child)>.btn,.btn-group-vertical>.btn:not(:first-child){border-top-left-radius:0;border-top-right-radius:0}.btn-group-toggle>.btn,.btn-group-toggle>.btn-group>.btn{margin-bottom:0}.btn-group-toggle>.btn input[type=checkbox],.btn-group-toggle>.btn input[type=radio],.btn-group-toggle>.btn-group>.btn input[type=checkbox],.btn-group-toggle>.btn-group>.btn input[type=radio]{clip:rect(0,0,0,0);pointer-events:none;position:absolute}.input-group{align-items:stretch;display:flex;flex-wrap:wrap;position:relative;width:100%}.input-group>.custom-file,.input-group>.custom-select,.input-group>.form-control,.input-group>.form-control-plaintext{flex:1 1 auto;margin-bottom:0;min-width:0;position:relative;width:1%}.input-group>.custom-file+.custom-file,.input-group>.custom-file+.custom-select,.input-group>.custom-file+.form-control,.input-group>.custom-select+.custom-file,.input-group>.custom-select+.custom-select,.input-group>.custom-select+.form-control,.input-group>.form-control+.custom-file,.input-group>.form-control+.custom-select,.input-group>.form-control+.form-control,.input-group>.form-control-plaintext+.custom-file,.input-group>.form-control-plaintext+.custom-select,.input-group>.form-control-plaintext+.form-control{margin-left:-1px}.input-group>.custom-file .custom-file-input:focus~.custom-file-label,.input-group>.custom-select:focus,.input-group>.form-control:focus{z-index:3}.input-group>.custom-file .custom-file-input:focus{z-index:4}.input-group>.custom-select:not(:first-child),.input-group>.form-control:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.input-group>.custom-file{align-items:center;display:flex}.input-group>.custom-file:not(:last-child) .custom-file-label,.input-group>.custom-file:not(:last-child) .custom-file-label:after{border-bottom-right-radius:0;border-top-right-radius:0}.input-group>.custom-file:not(:first-child) .custom-file-label{border-bottom-left-radius:0;border-top-left-radius:0}.input-group.has-validation>.custom-file:nth-last-child(n+3) .custom-file-label,.input-group.has-validation>.custom-file:nth-last-child(n+3) .custom-file-label:after,.input-group.has-validation>.custom-select:nth-last-child(n+3),.input-group.has-validation>.form-control:nth-last-child(n+3),.input-group:not(.has-validation)>.custom-file:not(:last-child) .custom-file-label,.input-group:not(.has-validation)>.custom-file:not(:last-child) .custom-file-label:after,.input-group:not(.has-validation)>.custom-select:not(:last-child),.input-group:not(.has-validation)>.form-control:not(:last-child){border-bottom-right-radius:0;border-top-right-radius:0}.input-group-append,.input-group-prepend{display:flex}.input-group-append .btn,.input-group-prepend .btn{position:relative;z-index:2}.input-group-append .btn:focus,.input-group-prepend .btn:focus{z-index:3}.input-group-append .btn+.btn,.input-group-append .btn+.input-group-text,.input-group-append .input-group-text+.btn,.input-group-append .input-group-text+.input-group-text,.input-group-prepend .btn+.btn,.input-group-prepend .btn+.input-group-text,.input-group-prepend .input-group-text+.btn,.input-group-prepend .input-group-text+.input-group-text{margin-left:-1px}.input-group-prepend{margin-right:-1px}.input-group-append{margin-left:-1px}.input-group-text{align-items:center;background-color:#e5e7eb;border:1px solid #4b5563;border-radius:.25rem;color:#e5e7eb;display:flex;font-size:1rem;font-weight:400;line-height:1.5;margin-bottom:0;padding:.375rem .75rem;text-align:center;white-space:nowrap}.input-group-text input[type=checkbox],.input-group-text input[type=radio]{margin-top:0}.input-group-lg>.custom-select,.input-group-lg>.form-control:not(textarea){height:calc(1.5em + 1rem + 2px)}.input-group-lg>.custom-select,.input-group-lg>.form-control,.input-group-lg>.input-group-append>.btn,.input-group-lg>.input-group-append>.input-group-text,.input-group-lg>.input-group-prepend>.btn,.input-group-lg>.input-group-prepend>.input-group-text{border-radius:6px;font-size:1.25rem;line-height:1.5;padding:.5rem 1rem}.input-group-sm>.custom-select,.input-group-sm>.form-control:not(textarea){height:calc(1.5em + .5rem + 2px)}.input-group-sm>.custom-select,.input-group-sm>.form-control,.input-group-sm>.input-group-append>.btn,.input-group-sm>.input-group-append>.input-group-text,.input-group-sm>.input-group-prepend>.btn,.input-group-sm>.input-group-prepend>.input-group-text{border-radius:.2rem;font-size:.875rem;line-height:1.5;padding:.25rem .5rem}.input-group-lg>.custom-select,.input-group-sm>.custom-select{padding-right:1.75rem}.input-group.has-validation>.input-group-append:nth-last-child(n+3)>.btn,.input-group.has-validation>.input-group-append:nth-last-child(n+3)>.input-group-text,.input-group:not(.has-validation)>.input-group-append:not(:last-child)>.btn,.input-group:not(.has-validation)>.input-group-append:not(:last-child)>.input-group-text,.input-group>.input-group-append:last-child>.btn:not(:last-child):not(.dropdown-toggle),.input-group>.input-group-append:last-child>.input-group-text:not(:last-child),.input-group>.input-group-prepend>.btn,.input-group>.input-group-prepend>.input-group-text{border-bottom-right-radius:0;border-top-right-radius:0}.input-group>.input-group-append>.btn,.input-group>.input-group-append>.input-group-text,.input-group>.input-group-prepend:first-child>.btn:not(:first-child),.input-group>.input-group-prepend:first-child>.input-group-text:not(:first-child),.input-group>.input-group-prepend:not(:first-child)>.btn,.input-group>.input-group-prepend:not(:first-child)>.input-group-text{border-bottom-left-radius:0;border-top-left-radius:0}.custom-control{display:block;min-height:1.5rem;padding-left:1.5rem;position:relative;-webkit-print-color-adjust:exact;print-color-adjust:exact;z-index:1}.custom-control-inline{display:inline-flex;margin-right:1rem}.custom-control-input{height:1.25rem;left:0;opacity:0;position:absolute;width:1rem;z-index:-1}.custom-control-input:checked~.custom-control-label:before{background-color:#4040c8;border-color:#4040c8;color:#fff}.custom-control-input:focus~.custom-control-label:before{box-shadow:0 0 0 .2rem rgba(64,64,200,.25)}.custom-control-input:focus:not(:checked)~.custom-control-label:before{border-color:#a3a3e5}.custom-control-input:not(:disabled):active~.custom-control-label:before{background-color:#cbcbf0;border-color:#cbcbf0;color:#fff}.custom-control-input:disabled~.custom-control-label,.custom-control-input[disabled]~.custom-control-label{color:#4b5563}.custom-control-input:disabled~.custom-control-label:before,.custom-control-input[disabled]~.custom-control-label:before{background-color:#e5e7eb}.custom-control-label{margin-bottom:0;position:relative;vertical-align:top}.custom-control-label:before{background-color:#1f2937;border:1px solid #6b7280;pointer-events:none}.custom-control-label:after,.custom-control-label:before{content:"";display:block;height:1rem;left:-1.5rem;position:absolute;top:.25rem;width:1rem}.custom-control-label:after{background:50%/50% 50% no-repeat}.custom-checkbox .custom-control-label:before{border-radius:.25rem}.custom-checkbox .custom-control-input:checked~.custom-control-label:after{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8'%3E%3Cpath fill='%23fff' d='m6.564.75-3.59 3.612-1.538-1.55L0 4.26l2.974 2.99L8 2.193z'/%3E%3C/svg%3E")}.custom-checkbox .custom-control-input:indeterminate~.custom-control-label:before{background-color:#4040c8;border-color:#4040c8}.custom-checkbox .custom-control-input:indeterminate~.custom-control-label:after{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='4' height='4'%3E%3Cpath stroke='%23fff' d='M0 2h4'/%3E%3C/svg%3E")}.custom-checkbox .custom-control-input:disabled:checked~.custom-control-label:before{background-color:rgba(64,64,200,.5)}.custom-checkbox .custom-control-input:disabled:indeterminate~.custom-control-label:before{background-color:rgba(64,64,200,.5)}.custom-radio .custom-control-label:before{border-radius:50%}.custom-radio .custom-control-input:checked~.custom-control-label:after{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='-4 -4 8 8'%3E%3Ccircle r='3' fill='%23fff'/%3E%3C/svg%3E")}.custom-radio .custom-control-input:disabled:checked~.custom-control-label:before{background-color:rgba(64,64,200,.5)}.custom-switch{padding-left:2.25rem}.custom-switch .custom-control-label:before{border-radius:.5rem;left:-2.25rem;pointer-events:all;width:1.75rem}.custom-switch .custom-control-label:after{background-color:#6b7280;border-radius:.5rem;height:calc(1rem - 4px);left:calc(-2.25rem + 2px);top:calc(.25rem + 2px);transition:transform .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;width:calc(1rem - 4px)}@media (prefers-reduced-motion:reduce){.custom-switch .custom-control-label:after{transition:none}}.custom-switch .custom-control-input:checked~.custom-control-label:after{background-color:#1f2937;transform:translateX(.75rem)}.custom-switch .custom-control-input:disabled:checked~.custom-control-label:before{background-color:rgba(64,64,200,.5)}.custom-select{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:#1f2937 url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='4' height='5'%3E%3Cpath fill='%231f2937' d='M2 0 0 2h4zm0 5L0 3h4z'/%3E%3C/svg%3E") right .75rem center/8px 10px no-repeat;border:1px solid #4b5563;border-radius:.25rem;color:#e5e7eb;display:inline-block;font-size:1rem;font-weight:400;height:calc(1.5em + .75rem + 2px);line-height:1.5;padding:.375rem 1.75rem .375rem .75rem;vertical-align:middle;width:100%}.custom-select:focus{border-color:#a3a3e5;box-shadow:0 0 0 .2rem rgba(64,64,200,.25);outline:0}.custom-select:focus::-ms-value{background-color:#1f2937;color:#e5e7eb}.custom-select[multiple],.custom-select[size]:not([size="1"]){background-image:none;height:auto;padding-right:.75rem}.custom-select:disabled{background-color:#e5e7eb;color:#4b5563}.custom-select::-ms-expand{display:none}.custom-select:-moz-focusring{color:transparent;text-shadow:0 0 0 #e5e7eb}.custom-select-sm{font-size:.875rem;height:calc(1.5em + .5rem + 2px);padding-bottom:.25rem;padding-left:.5rem;padding-top:.25rem}.custom-select-lg{font-size:1.25rem;height:calc(1.5em + 1rem + 2px);padding-bottom:.5rem;padding-left:1rem;padding-top:.5rem}.custom-file{display:inline-block;margin-bottom:0}.custom-file,.custom-file-input{height:calc(1.5em + .75rem + 2px);position:relative;width:100%}.custom-file-input{margin:0;opacity:0;overflow:hidden;z-index:2}.custom-file-input:focus~.custom-file-label{border-color:#a3a3e5;box-shadow:0 0 0 .2rem rgba(64,64,200,.25)}.custom-file-input:disabled~.custom-file-label,.custom-file-input[disabled]~.custom-file-label{background-color:#e5e7eb}.custom-file-input:lang(en)~.custom-file-label:after{content:"Browse"}.custom-file-input~.custom-file-label[data-browse]:after{content:attr(data-browse)}.custom-file-label{background-color:#1f2937;border:1px solid #4b5563;border-radius:.25rem;font-weight:400;height:calc(1.5em + .75rem + 2px);left:0;overflow:hidden;z-index:1}.custom-file-label,.custom-file-label:after{color:#e5e7eb;line-height:1.5;padding:.375rem .75rem;position:absolute;right:0;top:0}.custom-file-label:after{background-color:#e5e7eb;border-left:inherit;border-radius:0 .25rem .25rem 0;bottom:0;content:"Browse";display:block;height:calc(1.5em + .75rem);z-index:3}.custom-range{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:transparent;height:1.4rem;padding:0;width:100%}.custom-range:focus{outline:0}.custom-range:focus::-webkit-slider-thumb{box-shadow:0 0 0 1px #111827,0 0 0 .2rem rgba(64,64,200,.25)}.custom-range:focus::-moz-range-thumb{box-shadow:0 0 0 1px #111827,0 0 0 .2rem rgba(64,64,200,.25)}.custom-range:focus::-ms-thumb{box-shadow:0 0 0 1px #111827,0 0 0 .2rem rgba(64,64,200,.25)}.custom-range::-moz-focus-outer{border:0}.custom-range::-webkit-slider-thumb{-webkit-appearance:none;appearance:none;background-color:#4040c8;border:0;border-radius:1rem;height:1rem;margin-top:-.25rem;-webkit-transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;width:1rem}@media (prefers-reduced-motion:reduce){.custom-range::-webkit-slider-thumb{-webkit-transition:none;transition:none}}.custom-range::-webkit-slider-thumb:active{background-color:#cbcbf0}.custom-range::-webkit-slider-runnable-track{background-color:#d1d5db;border-color:transparent;border-radius:1rem;color:transparent;cursor:pointer;height:.5rem;width:100%}.custom-range::-moz-range-thumb{-moz-appearance:none;appearance:none;background-color:#4040c8;border:0;border-radius:1rem;height:1rem;-moz-transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;width:1rem}@media (prefers-reduced-motion:reduce){.custom-range::-moz-range-thumb{-moz-transition:none;transition:none}}.custom-range::-moz-range-thumb:active{background-color:#cbcbf0}.custom-range::-moz-range-track{background-color:#d1d5db;border-color:transparent;border-radius:1rem;color:transparent;cursor:pointer;height:.5rem;width:100%}.custom-range::-ms-thumb{appearance:none;background-color:#4040c8;border:0;border-radius:1rem;height:1rem;margin-left:.2rem;margin-right:.2rem;margin-top:0;-ms-transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;width:1rem}@media (prefers-reduced-motion:reduce){.custom-range::-ms-thumb{-ms-transition:none;transition:none}}.custom-range::-ms-thumb:active{background-color:#cbcbf0}.custom-range::-ms-track{background-color:transparent;border-color:transparent;border-width:.5rem;color:transparent;cursor:pointer;height:.5rem;width:100%}.custom-range::-ms-fill-lower,.custom-range::-ms-fill-upper{background-color:#d1d5db;border-radius:1rem}.custom-range::-ms-fill-upper{margin-right:15px}.custom-range:disabled::-webkit-slider-thumb{background-color:#6b7280}.custom-range:disabled::-webkit-slider-runnable-track{cursor:default}.custom-range:disabled::-moz-range-thumb{background-color:#6b7280}.custom-range:disabled::-moz-range-track{cursor:default}.custom-range:disabled::-ms-thumb{background-color:#6b7280}.custom-control-label:before,.custom-file-label,.custom-select{transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.custom-control-label:before,.custom-file-label,.custom-select{transition:none}}.nav{display:flex;flex-wrap:wrap;list-style:none;margin-bottom:0;padding-left:0}.nav-link{display:block;padding:.5rem 1rem}.nav-link:focus,.nav-link:hover{text-decoration:none}.nav-link.disabled{color:#4b5563;cursor:default;pointer-events:none}.nav-tabs{border-bottom:1px solid #d1d5db}.nav-tabs .nav-link{background-color:transparent;border:1px solid transparent;border-top-left-radius:.25rem;border-top-right-radius:.25rem;margin-bottom:-1px}.nav-tabs .nav-link:focus,.nav-tabs .nav-link:hover{border-color:#e5e7eb #e5e7eb #d1d5db;isolation:isolate}.nav-tabs .nav-link.disabled{background-color:transparent;border-color:transparent;color:#4b5563}.nav-tabs .nav-item.show .nav-link,.nav-tabs .nav-link.active{background-color:#111827;border-color:#d1d5db #d1d5db #111827;color:#374151}.nav-tabs .dropdown-menu{border-top-left-radius:0;border-top-right-radius:0;margin-top:-1px}.nav-pills .nav-link{background:none;border:0;border-radius:.25rem}.nav-pills .nav-link.active,.nav-pills .show>.nav-link{background-color:#1f2937;color:#fff}.nav-fill .nav-item,.nav-fill>.nav-link{flex:1 1 auto;text-align:center}.nav-justified .nav-item,.nav-justified>.nav-link{flex-basis:0;flex-grow:1;text-align:center}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.navbar{padding:.5rem 1rem;position:relative}.navbar,.navbar .container,.navbar .container-fluid,.navbar .container-lg,.navbar .container-md,.navbar .container-sm,.navbar .container-xl{align-items:center;display:flex;flex-wrap:wrap;justify-content:space-between}.navbar-brand{display:inline-block;font-size:1.25rem;line-height:inherit;margin-right:1rem;padding-bottom:.3125rem;padding-top:.3125rem;white-space:nowrap}.navbar-brand:focus,.navbar-brand:hover{text-decoration:none}.navbar-nav{display:flex;flex-direction:column;list-style:none;margin-bottom:0;padding-left:0}.navbar-nav .nav-link{padding-left:0;padding-right:0}.navbar-nav .dropdown-menu{float:none;position:static}.navbar-text{display:inline-block;padding-bottom:.5rem;padding-top:.5rem}.navbar-collapse{align-items:center;flex-basis:100%;flex-grow:1}.navbar-toggler{background-color:transparent;border:1px solid transparent;border-radius:.25rem;font-size:1.25rem;line-height:1;padding:.25rem .75rem}.navbar-toggler:focus,.navbar-toggler:hover{text-decoration:none}.navbar-toggler-icon{background:50%/100% 100% no-repeat;content:"";display:inline-block;height:1.5em;vertical-align:middle;width:1.5em}.navbar-nav-scroll{max-height:75vh;overflow-y:auto}@media (max-width:1.98px){.navbar-expand-sm>.container,.navbar-expand-sm>.container-fluid,.navbar-expand-sm>.container-lg,.navbar-expand-sm>.container-md,.navbar-expand-sm>.container-sm,.navbar-expand-sm>.container-xl{padding-left:0;padding-right:0}}@media (min-width:2px){.navbar-expand-sm{flex-flow:row nowrap;justify-content:flex-start}.navbar-expand-sm .navbar-nav{flex-direction:row}.navbar-expand-sm .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-sm .navbar-nav .nav-link{padding-left:.5rem;padding-right:.5rem}.navbar-expand-sm>.container,.navbar-expand-sm>.container-fluid,.navbar-expand-sm>.container-lg,.navbar-expand-sm>.container-md,.navbar-expand-sm>.container-sm,.navbar-expand-sm>.container-xl{flex-wrap:nowrap}.navbar-expand-sm .navbar-nav-scroll{overflow:visible}.navbar-expand-sm .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-sm .navbar-toggler{display:none}}@media (max-width:7.98px){.navbar-expand-md>.container,.navbar-expand-md>.container-fluid,.navbar-expand-md>.container-lg,.navbar-expand-md>.container-md,.navbar-expand-md>.container-sm,.navbar-expand-md>.container-xl{padding-left:0;padding-right:0}}@media (min-width:8px){.navbar-expand-md{flex-flow:row nowrap;justify-content:flex-start}.navbar-expand-md .navbar-nav{flex-direction:row}.navbar-expand-md .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-md .navbar-nav .nav-link{padding-left:.5rem;padding-right:.5rem}.navbar-expand-md>.container,.navbar-expand-md>.container-fluid,.navbar-expand-md>.container-lg,.navbar-expand-md>.container-md,.navbar-expand-md>.container-sm,.navbar-expand-md>.container-xl{flex-wrap:nowrap}.navbar-expand-md .navbar-nav-scroll{overflow:visible}.navbar-expand-md .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-md .navbar-toggler{display:none}}@media (max-width:8.98px){.navbar-expand-lg>.container,.navbar-expand-lg>.container-fluid,.navbar-expand-lg>.container-lg,.navbar-expand-lg>.container-md,.navbar-expand-lg>.container-sm,.navbar-expand-lg>.container-xl{padding-left:0;padding-right:0}}@media (min-width:9px){.navbar-expand-lg{flex-flow:row nowrap;justify-content:flex-start}.navbar-expand-lg .navbar-nav{flex-direction:row}.navbar-expand-lg .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-lg .navbar-nav .nav-link{padding-left:.5rem;padding-right:.5rem}.navbar-expand-lg>.container,.navbar-expand-lg>.container-fluid,.navbar-expand-lg>.container-lg,.navbar-expand-lg>.container-md,.navbar-expand-lg>.container-sm,.navbar-expand-lg>.container-xl{flex-wrap:nowrap}.navbar-expand-lg .navbar-nav-scroll{overflow:visible}.navbar-expand-lg .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-lg .navbar-toggler{display:none}}@media (max-width:9.98px){.navbar-expand-xl>.container,.navbar-expand-xl>.container-fluid,.navbar-expand-xl>.container-lg,.navbar-expand-xl>.container-md,.navbar-expand-xl>.container-sm,.navbar-expand-xl>.container-xl{padding-left:0;padding-right:0}}@media (min-width:10px){.navbar-expand-xl{flex-flow:row nowrap;justify-content:flex-start}.navbar-expand-xl .navbar-nav{flex-direction:row}.navbar-expand-xl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xl .navbar-nav .nav-link{padding-left:.5rem;padding-right:.5rem}.navbar-expand-xl>.container,.navbar-expand-xl>.container-fluid,.navbar-expand-xl>.container-lg,.navbar-expand-xl>.container-md,.navbar-expand-xl>.container-sm,.navbar-expand-xl>.container-xl{flex-wrap:nowrap}.navbar-expand-xl .navbar-nav-scroll{overflow:visible}.navbar-expand-xl .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-xl .navbar-toggler{display:none}}.navbar-expand{flex-flow:row nowrap;justify-content:flex-start}.navbar-expand>.container,.navbar-expand>.container-fluid,.navbar-expand>.container-lg,.navbar-expand>.container-md,.navbar-expand>.container-sm,.navbar-expand>.container-xl{padding-left:0;padding-right:0}.navbar-expand .navbar-nav{flex-direction:row}.navbar-expand .navbar-nav .dropdown-menu{position:absolute}.navbar-expand .navbar-nav .nav-link{padding-left:.5rem;padding-right:.5rem}.navbar-expand>.container,.navbar-expand>.container-fluid,.navbar-expand>.container-lg,.navbar-expand>.container-md,.navbar-expand>.container-sm,.navbar-expand>.container-xl{flex-wrap:nowrap}.navbar-expand .navbar-nav-scroll{overflow:visible}.navbar-expand .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand .navbar-toggler{display:none}.navbar-light .navbar-brand,.navbar-light .navbar-brand:focus,.navbar-light .navbar-brand:hover{color:rgba(0,0,0,.9)}.navbar-light .navbar-nav .nav-link{color:rgba(0,0,0,.5)}.navbar-light .navbar-nav .nav-link:focus,.navbar-light .navbar-nav .nav-link:hover{color:rgba(0,0,0,.7)}.navbar-light .navbar-nav .nav-link.disabled{color:rgba(0,0,0,.3)}.navbar-light .navbar-nav .active>.nav-link,.navbar-light .navbar-nav .nav-link.active,.navbar-light .navbar-nav .nav-link.show,.navbar-light .navbar-nav .show>.nav-link{color:rgba(0,0,0,.9)}.navbar-light .navbar-toggler{border-color:rgba(0,0,0,.1);color:rgba(0,0,0,.5)}.navbar-light .navbar-toggler-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='30' height='30'%3E%3Cpath stroke='rgba(0, 0, 0, 0.5)' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3E%3C/svg%3E")}.navbar-light .navbar-text{color:rgba(0,0,0,.5)}.navbar-light .navbar-text a,.navbar-light .navbar-text a:focus,.navbar-light .navbar-text a:hover{color:rgba(0,0,0,.9)}.navbar-dark .navbar-brand,.navbar-dark .navbar-brand:focus,.navbar-dark .navbar-brand:hover{color:#fff}.navbar-dark .navbar-nav .nav-link{color:hsla(0,0%,100%,.5)}.navbar-dark .navbar-nav .nav-link:focus,.navbar-dark .navbar-nav .nav-link:hover{color:hsla(0,0%,100%,.75)}.navbar-dark .navbar-nav .nav-link.disabled{color:hsla(0,0%,100%,.25)}.navbar-dark .navbar-nav .active>.nav-link,.navbar-dark .navbar-nav .nav-link.active,.navbar-dark .navbar-nav .nav-link.show,.navbar-dark .navbar-nav .show>.nav-link{color:#fff}.navbar-dark .navbar-toggler{border-color:hsla(0,0%,100%,.1);color:hsla(0,0%,100%,.5)}.navbar-dark .navbar-toggler-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='30' height='30'%3E%3Cpath stroke='rgba(255, 255, 255, 0.5)' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3E%3C/svg%3E")}.navbar-dark .navbar-text{color:hsla(0,0%,100%,.5)}.navbar-dark .navbar-text a,.navbar-dark .navbar-text a:focus,.navbar-dark .navbar-text a:hover{color:#fff}.card{word-wrap:break-word;background-clip:border-box;background-color:#1f2937;border:1px solid rgba(0,0,0,.125);border-radius:6px;display:flex;flex-direction:column;min-width:0;position:relative}.card>hr{margin-left:0;margin-right:0}.card>.list-group{border-bottom:inherit;border-top:inherit}.card>.list-group:first-child{border-top-left-radius:5px;border-top-right-radius:5px;border-top-width:0}.card>.list-group:last-child{border-bottom-left-radius:5px;border-bottom-right-radius:5px;border-bottom-width:0}.card>.card-header+.list-group,.card>.list-group+.card-footer{border-top:0}.card-body{flex:1 1 auto;min-height:1px;padding:1.25rem}.card-title{margin-bottom:.75rem}.card-subtitle{margin-top:-.375rem}.card-subtitle,.card-text:last-child{margin-bottom:0}.card-link:hover{text-decoration:none}.card-link+.card-link{margin-left:1.25rem}.card-header{background-color:#374151;border-bottom:1px solid rgba(0,0,0,.125);margin-bottom:0;padding:.75rem 1.25rem}.card-header:first-child{border-radius:5px 5px 0 0}.card-footer{background-color:#374151;border-top:1px solid rgba(0,0,0,.125);padding:.75rem 1.25rem}.card-footer:last-child{border-radius:0 0 5px 5px}.card-header-tabs{border-bottom:0;margin-bottom:-.75rem}.card-header-pills,.card-header-tabs{margin-left:-.625rem;margin-right:-.625rem}.card-img-overlay{border-radius:5px;bottom:0;left:0;padding:1.25rem;position:absolute;right:0;top:0}.card-img,.card-img-bottom,.card-img-top{flex-shrink:0;width:100%}.card-img,.card-img-top{border-top-left-radius:5px;border-top-right-radius:5px}.card-img,.card-img-bottom{border-bottom-left-radius:5px;border-bottom-right-radius:5px}.card-deck .card{margin-bottom:15px}@media (min-width:2px){.card-deck{display:flex;flex-flow:row wrap;margin-left:-15px;margin-right:-15px}.card-deck .card{flex:1 0 0%;margin-bottom:0;margin-left:15px;margin-right:15px}}.card-group>.card{margin-bottom:15px}@media (min-width:2px){.card-group{display:flex;flex-flow:row wrap}.card-group>.card{flex:1 0 0%;margin-bottom:0}.card-group>.card+.card{border-left:0;margin-left:0}.card-group>.card:not(:last-child){border-bottom-right-radius:0;border-top-right-radius:0}.card-group>.card:not(:last-child) .card-header,.card-group>.card:not(:last-child) .card-img-top{border-top-right-radius:0}.card-group>.card:not(:last-child) .card-footer,.card-group>.card:not(:last-child) .card-img-bottom{border-bottom-right-radius:0}.card-group>.card:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.card-group>.card:not(:first-child) .card-header,.card-group>.card:not(:first-child) .card-img-top{border-top-left-radius:0}.card-group>.card:not(:first-child) .card-footer,.card-group>.card:not(:first-child) .card-img-bottom{border-bottom-left-radius:0}}.card-columns .card{margin-bottom:.75rem}@media (min-width:2px){.card-columns{-moz-column-count:3;column-count:3;-moz-column-gap:1.25rem;column-gap:1.25rem;orphans:1;widows:1}.card-columns .card{display:inline-block;width:100%}}.accordion{overflow-anchor:none}.accordion>.card{overflow:hidden}.accordion>.card:not(:last-of-type){border-bottom:0;border-bottom-left-radius:0;border-bottom-right-radius:0}.accordion>.card:not(:first-of-type){border-top-left-radius:0;border-top-right-radius:0}.accordion>.card>.card-header{border-radius:0;margin-bottom:-1px}.breadcrumb{background-color:#e5e7eb;border-radius:.25rem;display:flex;flex-wrap:wrap;list-style:none;margin-bottom:1rem;padding:.75rem 1rem}.breadcrumb-item+.breadcrumb-item{padding-left:.5rem}.breadcrumb-item+.breadcrumb-item:before{color:#4b5563;content:"/";float:left;padding-right:.5rem}.breadcrumb-item+.breadcrumb-item:hover:before{text-decoration:underline;text-decoration:none}.breadcrumb-item.active{color:#4b5563}.pagination{border-radius:.25rem;display:flex;list-style:none;padding-left:0}.page-link{background-color:#fff;border:1px solid #d1d5db;color:#818cf8;display:block;line-height:1.25;margin-left:-1px;padding:.5rem .75rem;position:relative}.page-link:hover{background-color:#e5e7eb;border-color:#d1d5db;color:#a5b4fc;text-decoration:none;z-index:2}.page-link:focus{box-shadow:0 0 0 .2rem rgba(64,64,200,.25);outline:0;z-index:3}.page-item:first-child .page-link{border-bottom-left-radius:.25rem;border-top-left-radius:.25rem;margin-left:0}.page-item:last-child .page-link{border-bottom-right-radius:.25rem;border-top-right-radius:.25rem}.page-item.active .page-link{background-color:#4040c8;border-color:#4040c8;color:#fff;z-index:3}.page-item.disabled .page-link{background-color:#fff;border-color:#d1d5db;color:#4b5563;cursor:auto;pointer-events:none}.pagination-lg .page-link{font-size:1.25rem;line-height:1.5;padding:.75rem 1.5rem}.pagination-lg .page-item:first-child .page-link{border-bottom-left-radius:6px;border-top-left-radius:6px}.pagination-lg .page-item:last-child .page-link{border-bottom-right-radius:6px;border-top-right-radius:6px}.pagination-sm .page-link{font-size:.875rem;line-height:1.5;padding:.25rem .5rem}.pagination-sm .page-item:first-child .page-link{border-bottom-left-radius:.2rem;border-top-left-radius:.2rem}.pagination-sm .page-item:last-child .page-link{border-bottom-right-radius:.2rem;border-top-right-radius:.2rem}.badge{border-radius:.25rem;display:inline-block;font-size:.875rem;font-weight:600;line-height:1;padding:.25em .4em;text-align:center;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;vertical-align:baseline;white-space:nowrap}@media (prefers-reduced-motion:reduce){.badge{transition:none}}a.badge:focus,a.badge:hover{text-decoration:none}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.badge-pill{border-radius:10rem;padding-left:.6em;padding-right:.6em}.badge-primary{background-color:#4040c8;color:#fff}a.badge-primary:focus,a.badge-primary:hover{background-color:#3030a5;color:#fff}a.badge-primary.focus,a.badge-primary:focus{box-shadow:0 0 0 .2rem rgba(64,64,200,.5);outline:0}.badge-secondary{background-color:#4b5563;color:#fff}a.badge-secondary:focus,a.badge-secondary:hover{background-color:#353c46;color:#fff}a.badge-secondary.focus,a.badge-secondary:focus{box-shadow:0 0 0 .2rem rgba(75,85,99,.5);outline:0}.badge-success{background-color:#059669}a.badge-success:focus,a.badge-success:hover{background-color:#036546;color:#fff}a.badge-success.focus,a.badge-success:focus{box-shadow:0 0 0 .2rem rgba(5,150,105,.5);outline:0}.badge-info{background-color:#2563eb}a.badge-info:focus,a.badge-info:hover{background-color:#134cca;color:#fff}a.badge-info.focus,a.badge-info:focus{box-shadow:0 0 0 .2rem rgba(37,99,235,.5);outline:0}.badge-warning{background-color:#d97706}a.badge-warning:focus,a.badge-warning:hover{background-color:#a75c05;color:#fff}a.badge-warning.focus,a.badge-warning:focus{box-shadow:0 0 0 .2rem rgba(217,119,6,.5);outline:0}.badge-danger{background-color:#dc2626}a.badge-danger:focus,a.badge-danger:hover{background-color:#b21d1d;color:#fff}a.badge-danger.focus,a.badge-danger:focus{box-shadow:0 0 0 .2rem rgba(220,38,38,.5);outline:0}.badge-light{background-color:#f3f4f6;color:#111827}a.badge-light:focus,a.badge-light:hover{background-color:#d6d9e0;color:#111827}a.badge-light.focus,a.badge-light:focus{box-shadow:0 0 0 .2rem rgba(243,244,246,.5);outline:0}.badge-dark{background-color:#1f2937;color:#fff}a.badge-dark:focus,a.badge-dark:hover{background-color:#0d1116;color:#fff}a.badge-dark.focus,a.badge-dark:focus{box-shadow:0 0 0 .2rem rgba(31,41,55,.5);outline:0}.jumbotron{background-color:#e5e7eb;border-radius:6px;margin-bottom:2rem;padding:2rem 1rem}@media (min-width:2px){.jumbotron{padding:4rem 2rem}}.jumbotron-fluid{border-radius:0;padding-left:0;padding-right:0}.alert{border:1px solid transparent;border-radius:.25rem;margin-bottom:1rem;padding:.75rem 1.25rem;position:relative}.alert-heading{color:inherit}.alert-link{font-weight:600}.alert-dismissible{padding-right:4rem}.alert-dismissible .close{color:inherit;padding:.75rem 1.25rem;position:absolute;right:0;top:0;z-index:2}.alert-primary{background-color:#d9d9f4;border-color:#cacaf0;color:#212168}.alert-primary hr{border-top-color:#b6b6ea}.alert-primary .alert-link{color:#151541}.alert-secondary{background-color:#dbdde0;border-color:#cdcfd3;color:#272c33}.alert-secondary hr{border-top-color:#bfc2c7}.alert-secondary .alert-link{color:#111316}.alert-success{background-color:#cdeae1;border-color:#b9e2d5;color:#034e37}.alert-success hr{border-top-color:#a7dbca}.alert-success .alert-link{color:#011d14}.alert-info{background-color:#d3e0fb;border-color:#c2d3f9;color:#13337a}.alert-info hr{border-top-color:#abc2f7}.alert-info .alert-link{color:#0c214e}.alert-warning{background-color:#f7e4cd;border-color:#f4d9b9;color:#713e03}.alert-warning hr{border-top-color:#f1cda3}.alert-warning .alert-link{color:#3f2302}.alert-danger{background-color:#f8d4d4;border-color:#f5c2c2;color:#721414}.alert-danger hr{border-top-color:#f1acac}.alert-danger .alert-link{color:#470c0c}.alert-light{background-color:#fdfdfd;border-color:#fcfcfc;color:#7e7f80}.alert-light hr{border-top-color:#efefef}.alert-light .alert-link{color:#656666}.alert-dark{background-color:#d2d4d7;border-color:#c0c3c7;color:#10151d}.alert-dark hr{border-top-color:#b3b6bb}.alert-dark .alert-link{color:#000}@keyframes progress-bar-stripes{0%{background-position:1rem 0}to{background-position:0 0}}.progress{background-color:#e5e7eb;border-radius:.25rem;font-size:.75rem;height:1rem;line-height:0}.progress,.progress-bar{display:flex;overflow:hidden}.progress-bar{background-color:#4040c8;color:#fff;flex-direction:column;justify-content:center;text-align:center;transition:width .6s ease;white-space:nowrap}@media (prefers-reduced-motion:reduce){.progress-bar{transition:none}}.progress-bar-striped{background-image:linear-gradient(45deg,hsla(0,0%,100%,.15) 25%,transparent 0,transparent 50%,hsla(0,0%,100%,.15) 0,hsla(0,0%,100%,.15) 75%,transparent 0,transparent);background-size:1rem 1rem}.progress-bar-animated{animation:progress-bar-stripes 1s linear infinite}@media (prefers-reduced-motion:reduce){.progress-bar-animated{animation:none}}.media{align-items:flex-start;display:flex}.media-body{flex:1}.list-group{border-radius:.25rem;display:flex;flex-direction:column;margin-bottom:0;padding-left:0}.list-group-item-action{color:#374151;text-align:inherit;width:100%}.list-group-item-action:focus,.list-group-item-action:hover{background-color:#f3f4f6;color:#374151;text-decoration:none;z-index:1}.list-group-item-action:active{background-color:#e5e7eb;color:#f3f4f6}.list-group-item{background-color:#fff;border:1px solid rgba(0,0,0,.125);display:block;padding:.75rem 1.25rem;position:relative}.list-group-item:first-child{border-top-left-radius:inherit;border-top-right-radius:inherit}.list-group-item:last-child{border-bottom-left-radius:inherit;border-bottom-right-radius:inherit}.list-group-item.disabled,.list-group-item:disabled{background-color:#fff;color:#4b5563;pointer-events:none}.list-group-item.active{background-color:#4040c8;border-color:#4040c8;color:#fff;z-index:2}.list-group-item+.list-group-item{border-top-width:0}.list-group-item+.list-group-item.active{border-top-width:1px;margin-top:-1px}.list-group-horizontal{flex-direction:row}.list-group-horizontal>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal>.list-group-item:last-child{border-bottom-left-radius:0;border-top-right-radius:.25rem}.list-group-horizontal>.list-group-item.active{margin-top:0}.list-group-horizontal>.list-group-item+.list-group-item{border-left-width:0;border-top-width:1px}.list-group-horizontal>.list-group-item+.list-group-item.active{border-left-width:1px;margin-left:-1px}@media (min-width:2px){.list-group-horizontal-sm{flex-direction:row}.list-group-horizontal-sm>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-sm>.list-group-item:last-child{border-bottom-left-radius:0;border-top-right-radius:.25rem}.list-group-horizontal-sm>.list-group-item.active{margin-top:0}.list-group-horizontal-sm>.list-group-item+.list-group-item{border-left-width:0;border-top-width:1px}.list-group-horizontal-sm>.list-group-item+.list-group-item.active{border-left-width:1px;margin-left:-1px}}@media (min-width:8px){.list-group-horizontal-md{flex-direction:row}.list-group-horizontal-md>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-md>.list-group-item:last-child{border-bottom-left-radius:0;border-top-right-radius:.25rem}.list-group-horizontal-md>.list-group-item.active{margin-top:0}.list-group-horizontal-md>.list-group-item+.list-group-item{border-left-width:0;border-top-width:1px}.list-group-horizontal-md>.list-group-item+.list-group-item.active{border-left-width:1px;margin-left:-1px}}@media (min-width:9px){.list-group-horizontal-lg{flex-direction:row}.list-group-horizontal-lg>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-lg>.list-group-item:last-child{border-bottom-left-radius:0;border-top-right-radius:.25rem}.list-group-horizontal-lg>.list-group-item.active{margin-top:0}.list-group-horizontal-lg>.list-group-item+.list-group-item{border-left-width:0;border-top-width:1px}.list-group-horizontal-lg>.list-group-item+.list-group-item.active{border-left-width:1px;margin-left:-1px}}@media (min-width:10px){.list-group-horizontal-xl{flex-direction:row}.list-group-horizontal-xl>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-xl>.list-group-item:last-child{border-bottom-left-radius:0;border-top-right-radius:.25rem}.list-group-horizontal-xl>.list-group-item.active{margin-top:0}.list-group-horizontal-xl>.list-group-item+.list-group-item{border-left-width:0;border-top-width:1px}.list-group-horizontal-xl>.list-group-item+.list-group-item.active{border-left-width:1px;margin-left:-1px}}.list-group-flush{border-radius:0}.list-group-flush>.list-group-item{border-width:0 0 1px}.list-group-flush>.list-group-item:last-child{border-bottom-width:0}.list-group-item-primary{background-color:#cacaf0;color:#212168}.list-group-item-primary.list-group-item-action:focus,.list-group-item-primary.list-group-item-action:hover{background-color:#b6b6ea;color:#212168}.list-group-item-primary.list-group-item-action.active{background-color:#212168;border-color:#212168;color:#fff}.list-group-item-secondary{background-color:#cdcfd3;color:#272c33}.list-group-item-secondary.list-group-item-action:focus,.list-group-item-secondary.list-group-item-action:hover{background-color:#bfc2c7;color:#272c33}.list-group-item-secondary.list-group-item-action.active{background-color:#272c33;border-color:#272c33;color:#fff}.list-group-item-success{background-color:#b9e2d5;color:#034e37}.list-group-item-success.list-group-item-action:focus,.list-group-item-success.list-group-item-action:hover{background-color:#a7dbca;color:#034e37}.list-group-item-success.list-group-item-action.active{background-color:#034e37;border-color:#034e37;color:#fff}.list-group-item-info{background-color:#c2d3f9;color:#13337a}.list-group-item-info.list-group-item-action:focus,.list-group-item-info.list-group-item-action:hover{background-color:#abc2f7;color:#13337a}.list-group-item-info.list-group-item-action.active{background-color:#13337a;border-color:#13337a;color:#fff}.list-group-item-warning{background-color:#f4d9b9;color:#713e03}.list-group-item-warning.list-group-item-action:focus,.list-group-item-warning.list-group-item-action:hover{background-color:#f1cda3;color:#713e03}.list-group-item-warning.list-group-item-action.active{background-color:#713e03;border-color:#713e03;color:#fff}.list-group-item-danger{background-color:#f5c2c2;color:#721414}.list-group-item-danger.list-group-item-action:focus,.list-group-item-danger.list-group-item-action:hover{background-color:#f1acac;color:#721414}.list-group-item-danger.list-group-item-action.active{background-color:#721414;border-color:#721414;color:#fff}.list-group-item-light{background-color:#fcfcfc;color:#7e7f80}.list-group-item-light.list-group-item-action:focus,.list-group-item-light.list-group-item-action:hover{background-color:#efefef;color:#7e7f80}.list-group-item-light.list-group-item-action.active{background-color:#7e7f80;border-color:#7e7f80;color:#fff}.list-group-item-dark{background-color:#c0c3c7;color:#10151d}.list-group-item-dark.list-group-item-action:focus,.list-group-item-dark.list-group-item-action:hover{background-color:#b3b6bb;color:#10151d}.list-group-item-dark.list-group-item-action.active{background-color:#10151d;border-color:#10151d;color:#fff}.close{color:#000;float:right;font-size:1.5rem;font-weight:600;line-height:1;opacity:.5;text-shadow:0 1px 0 #fff}.close:hover{color:#000;text-decoration:none}.close:not(:disabled):not(.disabled):focus,.close:not(:disabled):not(.disabled):hover{opacity:.75}button.close{background-color:transparent;border:0;padding:0}a.close.disabled{pointer-events:none}.toast{background-clip:padding-box;background-color:hsla(0,0%,100%,.85);border:1px solid rgba(0,0,0,.1);border-radius:.25rem;box-shadow:0 .25rem .75rem rgba(0,0,0,.1);flex-basis:350px;font-size:.875rem;max-width:350px;opacity:0}.toast:not(:last-child){margin-bottom:.75rem}.toast.showing{opacity:1}.toast.show{display:block;opacity:1}.toast.hide{display:none}.toast-header{align-items:center;background-clip:padding-box;background-color:hsla(0,0%,100%,.85);border-bottom:1px solid rgba(0,0,0,.05);border-top-left-radius:calc(.25rem - 1px);border-top-right-radius:calc(.25rem - 1px);color:#4b5563;display:flex;padding:.25rem .75rem}.toast-body{padding:.75rem}.modal-open{overflow:hidden}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal{display:none;height:100%;left:0;outline:0;overflow:hidden;position:fixed;top:0;width:100%;z-index:1050}.modal-dialog{margin:.5rem;pointer-events:none;position:relative;width:auto}.modal.fade .modal-dialog{transform:translateY(-50px);transition:transform .3s ease-out}@media (prefers-reduced-motion:reduce){.modal.fade .modal-dialog{transition:none}}.modal.show .modal-dialog{transform:none}.modal.modal-static .modal-dialog{transform:scale(1.02)}.modal-dialog-scrollable{display:flex;max-height:calc(100% - 1rem)}.modal-dialog-scrollable .modal-content{max-height:calc(100vh - 1rem);overflow:hidden}.modal-dialog-scrollable .modal-footer,.modal-dialog-scrollable .modal-header{flex-shrink:0}.modal-dialog-scrollable .modal-body{overflow-y:auto}.modal-dialog-centered{align-items:center;display:flex;min-height:calc(100% - 1rem)}.modal-dialog-centered:before{content:"";display:block;height:calc(100vh - 1rem);height:-moz-min-content;height:min-content}.modal-dialog-centered.modal-dialog-scrollable{flex-direction:column;height:100%;justify-content:center}.modal-dialog-centered.modal-dialog-scrollable .modal-content{max-height:none}.modal-dialog-centered.modal-dialog-scrollable:before{content:none}.modal-content{background-clip:padding-box;background-color:#1f2937;border:1px solid rgba(0,0,0,.2);border-radius:6px;display:flex;flex-direction:column;outline:0;pointer-events:auto;position:relative;width:100%}.modal-backdrop{background-color:#4b5563;height:100vh;left:0;position:fixed;top:0;width:100vw;z-index:1040}.modal-backdrop.fade{opacity:0}.modal-backdrop.show{opacity:.5}.modal-header{align-items:flex-start;border-bottom:1px solid #4b5563;border-top-left-radius:5px;border-top-right-radius:5px;display:flex;justify-content:space-between;padding:1rem}.modal-header .close{margin:-1rem -1rem -1rem auto;padding:1rem}.modal-title{line-height:1.5;margin-bottom:0}.modal-body{flex:1 1 auto;padding:1rem;position:relative}.modal-footer{align-items:center;border-bottom-left-radius:5px;border-bottom-right-radius:5px;border-top:1px solid #4b5563;display:flex;flex-wrap:wrap;justify-content:flex-end;padding:.75rem}.modal-footer>*{margin:.25rem}.modal-scrollbar-measure{height:50px;overflow:scroll;position:absolute;top:-9999px;width:50px}@media (min-width:2px){.modal-dialog{margin:1.75rem auto;max-width:500px}.modal-dialog-scrollable{max-height:calc(100% - 3.5rem)}.modal-dialog-scrollable .modal-content{max-height:calc(100vh - 3.5rem)}.modal-dialog-centered{min-height:calc(100% - 3.5rem)}.modal-dialog-centered:before{height:calc(100vh - 3.5rem);height:-moz-min-content;height:min-content}.modal-sm{max-width:300px}}@media (min-width:9px){.modal-lg,.modal-xl{max-width:800px}}@media (min-width:10px){.modal-xl{max-width:1140px}}.tooltip{word-wrap:break-word;display:block;font-family:Figtree,sans-serif;font-size:.875rem;font-style:normal;font-weight:400;letter-spacing:normal;line-break:auto;line-height:1.5;margin:0;opacity:0;position:absolute;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;white-space:normal;word-break:normal;word-spacing:normal;z-index:1070}.tooltip.show{opacity:.9}.tooltip .arrow{display:block;height:.4rem;position:absolute;width:.8rem}.tooltip .arrow:before{border-color:transparent;border-style:solid;content:"";position:absolute}.bs-tooltip-auto[x-placement^=top],.bs-tooltip-top{padding:.4rem 0}.bs-tooltip-auto[x-placement^=top] .arrow,.bs-tooltip-top .arrow{bottom:0}.bs-tooltip-auto[x-placement^=top] .arrow:before,.bs-tooltip-top .arrow:before{border-top-color:#000;border-width:.4rem .4rem 0;top:0}.bs-tooltip-auto[x-placement^=right],.bs-tooltip-right{padding:0 .4rem}.bs-tooltip-auto[x-placement^=right] .arrow,.bs-tooltip-right .arrow{height:.8rem;left:0;width:.4rem}.bs-tooltip-auto[x-placement^=right] .arrow:before,.bs-tooltip-right .arrow:before{border-right-color:#000;border-width:.4rem .4rem .4rem 0;right:0}.bs-tooltip-auto[x-placement^=bottom],.bs-tooltip-bottom{padding:.4rem 0}.bs-tooltip-auto[x-placement^=bottom] .arrow,.bs-tooltip-bottom .arrow{top:0}.bs-tooltip-auto[x-placement^=bottom] .arrow:before,.bs-tooltip-bottom .arrow:before{border-bottom-color:#000;border-width:0 .4rem .4rem;bottom:0}.bs-tooltip-auto[x-placement^=left],.bs-tooltip-left{padding:0 .4rem}.bs-tooltip-auto[x-placement^=left] .arrow,.bs-tooltip-left .arrow{height:.8rem;right:0;width:.4rem}.bs-tooltip-auto[x-placement^=left] .arrow:before,.bs-tooltip-left .arrow:before{border-left-color:#000;border-width:.4rem 0 .4rem .4rem;left:0}.tooltip-inner{background-color:#000;border-radius:.25rem;color:#fff;max-width:200px;padding:.25rem .5rem;text-align:center}.popover{word-wrap:break-word;background-clip:padding-box;background-color:#fff;border:1px solid rgba(0,0,0,.2);border-radius:6px;font-family:Figtree,sans-serif;font-size:.875rem;font-style:normal;font-weight:400;left:0;letter-spacing:normal;line-break:auto;line-height:1.5;max-width:276px;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;top:0;white-space:normal;word-break:normal;word-spacing:normal;z-index:1060}.popover,.popover .arrow{display:block;position:absolute}.popover .arrow{height:.5rem;margin:0 6px;width:1rem}.popover .arrow:after,.popover .arrow:before{border-color:transparent;border-style:solid;content:"";display:block;position:absolute}.bs-popover-auto[x-placement^=top],.bs-popover-top{margin-bottom:.5rem}.bs-popover-auto[x-placement^=top]>.arrow,.bs-popover-top>.arrow{bottom:calc(-.5rem - 1px)}.bs-popover-auto[x-placement^=top]>.arrow:before,.bs-popover-top>.arrow:before{border-top-color:rgba(0,0,0,.25);border-width:.5rem .5rem 0;bottom:0}.bs-popover-auto[x-placement^=top]>.arrow:after,.bs-popover-top>.arrow:after{border-top-color:#fff;border-width:.5rem .5rem 0;bottom:1px}.bs-popover-auto[x-placement^=right],.bs-popover-right{margin-left:.5rem}.bs-popover-auto[x-placement^=right]>.arrow,.bs-popover-right>.arrow{height:1rem;left:calc(-.5rem - 1px);margin:6px 0;width:.5rem}.bs-popover-auto[x-placement^=right]>.arrow:before,.bs-popover-right>.arrow:before{border-right-color:rgba(0,0,0,.25);border-width:.5rem .5rem .5rem 0;left:0}.bs-popover-auto[x-placement^=right]>.arrow:after,.bs-popover-right>.arrow:after{border-right-color:#fff;border-width:.5rem .5rem .5rem 0;left:1px}.bs-popover-auto[x-placement^=bottom],.bs-popover-bottom{margin-top:.5rem}.bs-popover-auto[x-placement^=bottom]>.arrow,.bs-popover-bottom>.arrow{top:calc(-.5rem - 1px)}.bs-popover-auto[x-placement^=bottom]>.arrow:before,.bs-popover-bottom>.arrow:before{border-bottom-color:rgba(0,0,0,.25);border-width:0 .5rem .5rem;top:0}.bs-popover-auto[x-placement^=bottom]>.arrow:after,.bs-popover-bottom>.arrow:after{border-bottom-color:#fff;border-width:0 .5rem .5rem;top:1px}.bs-popover-auto[x-placement^=bottom] .popover-header:before,.bs-popover-bottom .popover-header:before{border-bottom:1px solid #f7f7f7;content:"";display:block;left:50%;margin-left:-.5rem;position:absolute;top:0;width:1rem}.bs-popover-auto[x-placement^=left],.bs-popover-left{margin-right:.5rem}.bs-popover-auto[x-placement^=left]>.arrow,.bs-popover-left>.arrow{height:1rem;margin:6px 0;right:calc(-.5rem - 1px);width:.5rem}.bs-popover-auto[x-placement^=left]>.arrow:before,.bs-popover-left>.arrow:before{border-left-color:rgba(0,0,0,.25);border-width:.5rem 0 .5rem .5rem;right:0}.bs-popover-auto[x-placement^=left]>.arrow:after,.bs-popover-left>.arrow:after{border-left-color:#fff;border-width:.5rem 0 .5rem .5rem;right:1px}.popover-header{background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-top-left-radius:5px;border-top-right-radius:5px;font-size:1rem;margin-bottom:0;padding:.5rem .75rem}.popover-header:empty{display:none}.popover-body{color:#f3f4f6;padding:.5rem .75rem}.carousel{position:relative}.carousel.pointer-event{touch-action:pan-y}.carousel-inner{overflow:hidden;position:relative;width:100%}.carousel-inner:after{clear:both;content:"";display:block}.carousel-item{backface-visibility:hidden;display:none;float:left;margin-right:-100%;position:relative;transition:transform .6s ease-in-out;width:100%}@media (prefers-reduced-motion:reduce){.carousel-item{transition:none}}.carousel-item-next,.carousel-item-prev,.carousel-item.active{display:block}.active.carousel-item-right,.carousel-item-next:not(.carousel-item-left){transform:translateX(100%)}.active.carousel-item-left,.carousel-item-prev:not(.carousel-item-right){transform:translateX(-100%)}.carousel-fade .carousel-item{opacity:0;transform:none;transition-property:opacity}.carousel-fade .carousel-item-next.carousel-item-left,.carousel-fade .carousel-item-prev.carousel-item-right,.carousel-fade .carousel-item.active{opacity:1;z-index:1}.carousel-fade .active.carousel-item-left,.carousel-fade .active.carousel-item-right{opacity:0;transition:opacity 0s .6s;z-index:0}@media (prefers-reduced-motion:reduce){.carousel-fade .active.carousel-item-left,.carousel-fade .active.carousel-item-right{transition:none}}.carousel-control-next,.carousel-control-prev{align-items:center;background:none;border:0;bottom:0;color:#fff;display:flex;justify-content:center;opacity:.5;padding:0;position:absolute;text-align:center;top:0;transition:opacity .15s ease;width:15%;z-index:1}@media (prefers-reduced-motion:reduce){.carousel-control-next,.carousel-control-prev{transition:none}}.carousel-control-next:focus,.carousel-control-next:hover,.carousel-control-prev:focus,.carousel-control-prev:hover{color:#fff;opacity:.9;outline:0;text-decoration:none}.carousel-control-prev{left:0}.carousel-control-next{right:0}.carousel-control-next-icon,.carousel-control-prev-icon{background:50%/100% 100% no-repeat;display:inline-block;height:20px;width:20px}.carousel-control-prev-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' width='8' height='8'%3E%3Cpath d='m5.25 0-4 4 4 4 1.5-1.5L4.25 4l2.5-2.5L5.25 0z'/%3E%3C/svg%3E")}.carousel-control-next-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' width='8' height='8'%3E%3Cpath d='m2.75 0-1.5 1.5L3.75 4l-2.5 2.5L2.75 8l4-4-4-4z'/%3E%3C/svg%3E")}.carousel-indicators{bottom:0;display:flex;justify-content:center;left:0;list-style:none;margin-left:15%;margin-right:15%;padding-left:0;position:absolute;right:0;z-index:15}.carousel-indicators li{background-clip:padding-box;background-color:#fff;border-bottom:10px solid transparent;border-top:10px solid transparent;box-sizing:content-box;cursor:pointer;flex:0 1 auto;height:3px;margin-left:3px;margin-right:3px;opacity:.5;text-indent:-999px;transition:opacity .6s ease;width:30px}@media (prefers-reduced-motion:reduce){.carousel-indicators li{transition:none}}.carousel-indicators .active{opacity:1}.carousel-caption{bottom:20px;color:#fff;left:15%;padding-bottom:20px;padding-top:20px;position:absolute;right:15%;text-align:center;z-index:10}@keyframes spinner-border{to{transform:rotate(1turn)}}.spinner-border{animation:spinner-border .75s linear infinite;border:.25em solid;border-radius:50%;border-right:.25em solid transparent;display:inline-block;height:2rem;vertical-align:-.125em;width:2rem}.spinner-border-sm{border-width:.2em;height:1rem;width:1rem}@keyframes spinner-grow{0%{transform:scale(0)}50%{opacity:1;transform:none}}.spinner-grow{animation:spinner-grow .75s linear infinite;background-color:currentcolor;border-radius:50%;display:inline-block;height:2rem;opacity:0;vertical-align:-.125em;width:2rem}.spinner-grow-sm{height:1rem;width:1rem}@media (prefers-reduced-motion:reduce){.spinner-border,.spinner-grow{animation-duration:1.5s}}.align-baseline{vertical-align:baseline!important}.align-top{vertical-align:top!important}.align-middle{vertical-align:middle!important}.align-bottom{vertical-align:bottom!important}.align-text-bottom{vertical-align:text-bottom!important}.align-text-top{vertical-align:text-top!important}.bg-primary{background-color:#4040c8!important}a.bg-primary:focus,a.bg-primary:hover,button.bg-primary:focus,button.bg-primary:hover{background-color:#3030a5!important}.bg-secondary{background-color:#4b5563!important}a.bg-secondary:focus,a.bg-secondary:hover,button.bg-secondary:focus,button.bg-secondary:hover{background-color:#353c46!important}.bg-success{background-color:#059669!important}a.bg-success:focus,a.bg-success:hover,button.bg-success:focus,button.bg-success:hover{background-color:#036546!important}.bg-info{background-color:#2563eb!important}a.bg-info:focus,a.bg-info:hover,button.bg-info:focus,button.bg-info:hover{background-color:#134cca!important}.bg-warning{background-color:#d97706!important}a.bg-warning:focus,a.bg-warning:hover,button.bg-warning:focus,button.bg-warning:hover{background-color:#a75c05!important}.bg-danger{background-color:#dc2626!important}a.bg-danger:focus,a.bg-danger:hover,button.bg-danger:focus,button.bg-danger:hover{background-color:#b21d1d!important}.bg-light{background-color:#f3f4f6!important}a.bg-light:focus,a.bg-light:hover,button.bg-light:focus,button.bg-light:hover{background-color:#d6d9e0!important}.bg-dark{background-color:#1f2937!important}a.bg-dark:focus,a.bg-dark:hover,button.bg-dark:focus,button.bg-dark:hover{background-color:#0d1116!important}.bg-white{background-color:#fff!important}.bg-transparent{background-color:transparent!important}.border{border:1px solid #4b5563!important}.border-top{border-top:1px solid #4b5563!important}.border-right{border-right:1px solid #4b5563!important}.border-bottom{border-bottom:1px solid #4b5563!important}.border-left{border-left:1px solid #4b5563!important}.border-0{border:0!important}.border-top-0{border-top:0!important}.border-right-0{border-right:0!important}.border-bottom-0{border-bottom:0!important}.border-left-0{border-left:0!important}.border-primary{border-color:#4040c8!important}.border-secondary{border-color:#4b5563!important}.border-success{border-color:#059669!important}.border-info{border-color:#2563eb!important}.border-warning{border-color:#d97706!important}.border-danger{border-color:#dc2626!important}.border-light{border-color:#f3f4f6!important}.border-dark{border-color:#1f2937!important}.border-white{border-color:#fff!important}.rounded-sm{border-radius:.2rem!important}.rounded{border-radius:.25rem!important}.rounded-top{border-top-left-radius:.25rem!important}.rounded-right,.rounded-top{border-top-right-radius:.25rem!important}.rounded-bottom,.rounded-right{border-bottom-right-radius:.25rem!important}.rounded-bottom,.rounded-left{border-bottom-left-radius:.25rem!important}.rounded-left{border-top-left-radius:.25rem!important}.rounded-lg{border-radius:6px!important}.rounded-circle{border-radius:50%!important}.rounded-pill{border-radius:50rem!important}.rounded-0{border-radius:0!important}.clearfix:after{clear:both;content:"";display:block}.d-none{display:none!important}.d-inline{display:inline!important}.d-inline-block{display:inline-block!important}.d-block{display:block!important}.d-table{display:table!important}.d-table-row{display:table-row!important}.d-table-cell{display:table-cell!important}.d-flex{display:flex!important}.d-inline-flex{display:inline-flex!important}@media (min-width:2px){.d-sm-none{display:none!important}.d-sm-inline{display:inline!important}.d-sm-inline-block{display:inline-block!important}.d-sm-block{display:block!important}.d-sm-table{display:table!important}.d-sm-table-row{display:table-row!important}.d-sm-table-cell{display:table-cell!important}.d-sm-flex{display:flex!important}.d-sm-inline-flex{display:inline-flex!important}}@media (min-width:8px){.d-md-none{display:none!important}.d-md-inline{display:inline!important}.d-md-inline-block{display:inline-block!important}.d-md-block{display:block!important}.d-md-table{display:table!important}.d-md-table-row{display:table-row!important}.d-md-table-cell{display:table-cell!important}.d-md-flex{display:flex!important}.d-md-inline-flex{display:inline-flex!important}}@media (min-width:9px){.d-lg-none{display:none!important}.d-lg-inline{display:inline!important}.d-lg-inline-block{display:inline-block!important}.d-lg-block{display:block!important}.d-lg-table{display:table!important}.d-lg-table-row{display:table-row!important}.d-lg-table-cell{display:table-cell!important}.d-lg-flex{display:flex!important}.d-lg-inline-flex{display:inline-flex!important}}@media (min-width:10px){.d-xl-none{display:none!important}.d-xl-inline{display:inline!important}.d-xl-inline-block{display:inline-block!important}.d-xl-block{display:block!important}.d-xl-table{display:table!important}.d-xl-table-row{display:table-row!important}.d-xl-table-cell{display:table-cell!important}.d-xl-flex{display:flex!important}.d-xl-inline-flex{display:inline-flex!important}}@media print{.d-print-none{display:none!important}.d-print-inline{display:inline!important}.d-print-inline-block{display:inline-block!important}.d-print-block{display:block!important}.d-print-table{display:table!important}.d-print-table-row{display:table-row!important}.d-print-table-cell{display:table-cell!important}.d-print-flex{display:flex!important}.d-print-inline-flex{display:inline-flex!important}}.embed-responsive{display:block;overflow:hidden;padding:0;position:relative;width:100%}.embed-responsive:before{content:"";display:block}.embed-responsive .embed-responsive-item,.embed-responsive embed,.embed-responsive iframe,.embed-responsive object,.embed-responsive video{border:0;bottom:0;height:100%;left:0;position:absolute;top:0;width:100%}.embed-responsive-21by9:before{padding-top:42.85714286%}.embed-responsive-16by9:before{padding-top:56.25%}.embed-responsive-4by3:before{padding-top:75%}.embed-responsive-1by1:before{padding-top:100%}.flex-row{flex-direction:row!important}.flex-column{flex-direction:column!important}.flex-row-reverse{flex-direction:row-reverse!important}.flex-column-reverse{flex-direction:column-reverse!important}.flex-wrap{flex-wrap:wrap!important}.flex-nowrap{flex-wrap:nowrap!important}.flex-wrap-reverse{flex-wrap:wrap-reverse!important}.flex-fill{flex:1 1 auto!important}.flex-grow-0{flex-grow:0!important}.flex-grow-1{flex-grow:1!important}.flex-shrink-0{flex-shrink:0!important}.flex-shrink-1{flex-shrink:1!important}.justify-content-start{justify-content:flex-start!important}.justify-content-end{justify-content:flex-end!important}.justify-content-center{justify-content:center!important}.justify-content-between{justify-content:space-between!important}.justify-content-around{justify-content:space-around!important}.align-items-start{align-items:flex-start!important}.align-items-end{align-items:flex-end!important}.align-items-center{align-items:center!important}.align-items-baseline{align-items:baseline!important}.align-items-stretch{align-items:stretch!important}.align-content-start{align-content:flex-start!important}.align-content-end{align-content:flex-end!important}.align-content-center{align-content:center!important}.align-content-between{align-content:space-between!important}.align-content-around{align-content:space-around!important}.align-content-stretch{align-content:stretch!important}.align-self-auto{align-self:auto!important}.align-self-start{align-self:flex-start!important}.align-self-end{align-self:flex-end!important}.align-self-center{align-self:center!important}.align-self-baseline{align-self:baseline!important}.align-self-stretch{align-self:stretch!important}@media (min-width:2px){.flex-sm-row{flex-direction:row!important}.flex-sm-column{flex-direction:column!important}.flex-sm-row-reverse{flex-direction:row-reverse!important}.flex-sm-column-reverse{flex-direction:column-reverse!important}.flex-sm-wrap{flex-wrap:wrap!important}.flex-sm-nowrap{flex-wrap:nowrap!important}.flex-sm-wrap-reverse{flex-wrap:wrap-reverse!important}.flex-sm-fill{flex:1 1 auto!important}.flex-sm-grow-0{flex-grow:0!important}.flex-sm-grow-1{flex-grow:1!important}.flex-sm-shrink-0{flex-shrink:0!important}.flex-sm-shrink-1{flex-shrink:1!important}.justify-content-sm-start{justify-content:flex-start!important}.justify-content-sm-end{justify-content:flex-end!important}.justify-content-sm-center{justify-content:center!important}.justify-content-sm-between{justify-content:space-between!important}.justify-content-sm-around{justify-content:space-around!important}.align-items-sm-start{align-items:flex-start!important}.align-items-sm-end{align-items:flex-end!important}.align-items-sm-center{align-items:center!important}.align-items-sm-baseline{align-items:baseline!important}.align-items-sm-stretch{align-items:stretch!important}.align-content-sm-start{align-content:flex-start!important}.align-content-sm-end{align-content:flex-end!important}.align-content-sm-center{align-content:center!important}.align-content-sm-between{align-content:space-between!important}.align-content-sm-around{align-content:space-around!important}.align-content-sm-stretch{align-content:stretch!important}.align-self-sm-auto{align-self:auto!important}.align-self-sm-start{align-self:flex-start!important}.align-self-sm-end{align-self:flex-end!important}.align-self-sm-center{align-self:center!important}.align-self-sm-baseline{align-self:baseline!important}.align-self-sm-stretch{align-self:stretch!important}}@media (min-width:8px){.flex-md-row{flex-direction:row!important}.flex-md-column{flex-direction:column!important}.flex-md-row-reverse{flex-direction:row-reverse!important}.flex-md-column-reverse{flex-direction:column-reverse!important}.flex-md-wrap{flex-wrap:wrap!important}.flex-md-nowrap{flex-wrap:nowrap!important}.flex-md-wrap-reverse{flex-wrap:wrap-reverse!important}.flex-md-fill{flex:1 1 auto!important}.flex-md-grow-0{flex-grow:0!important}.flex-md-grow-1{flex-grow:1!important}.flex-md-shrink-0{flex-shrink:0!important}.flex-md-shrink-1{flex-shrink:1!important}.justify-content-md-start{justify-content:flex-start!important}.justify-content-md-end{justify-content:flex-end!important}.justify-content-md-center{justify-content:center!important}.justify-content-md-between{justify-content:space-between!important}.justify-content-md-around{justify-content:space-around!important}.align-items-md-start{align-items:flex-start!important}.align-items-md-end{align-items:flex-end!important}.align-items-md-center{align-items:center!important}.align-items-md-baseline{align-items:baseline!important}.align-items-md-stretch{align-items:stretch!important}.align-content-md-start{align-content:flex-start!important}.align-content-md-end{align-content:flex-end!important}.align-content-md-center{align-content:center!important}.align-content-md-between{align-content:space-between!important}.align-content-md-around{align-content:space-around!important}.align-content-md-stretch{align-content:stretch!important}.align-self-md-auto{align-self:auto!important}.align-self-md-start{align-self:flex-start!important}.align-self-md-end{align-self:flex-end!important}.align-self-md-center{align-self:center!important}.align-self-md-baseline{align-self:baseline!important}.align-self-md-stretch{align-self:stretch!important}}@media (min-width:9px){.flex-lg-row{flex-direction:row!important}.flex-lg-column{flex-direction:column!important}.flex-lg-row-reverse{flex-direction:row-reverse!important}.flex-lg-column-reverse{flex-direction:column-reverse!important}.flex-lg-wrap{flex-wrap:wrap!important}.flex-lg-nowrap{flex-wrap:nowrap!important}.flex-lg-wrap-reverse{flex-wrap:wrap-reverse!important}.flex-lg-fill{flex:1 1 auto!important}.flex-lg-grow-0{flex-grow:0!important}.flex-lg-grow-1{flex-grow:1!important}.flex-lg-shrink-0{flex-shrink:0!important}.flex-lg-shrink-1{flex-shrink:1!important}.justify-content-lg-start{justify-content:flex-start!important}.justify-content-lg-end{justify-content:flex-end!important}.justify-content-lg-center{justify-content:center!important}.justify-content-lg-between{justify-content:space-between!important}.justify-content-lg-around{justify-content:space-around!important}.align-items-lg-start{align-items:flex-start!important}.align-items-lg-end{align-items:flex-end!important}.align-items-lg-center{align-items:center!important}.align-items-lg-baseline{align-items:baseline!important}.align-items-lg-stretch{align-items:stretch!important}.align-content-lg-start{align-content:flex-start!important}.align-content-lg-end{align-content:flex-end!important}.align-content-lg-center{align-content:center!important}.align-content-lg-between{align-content:space-between!important}.align-content-lg-around{align-content:space-around!important}.align-content-lg-stretch{align-content:stretch!important}.align-self-lg-auto{align-self:auto!important}.align-self-lg-start{align-self:flex-start!important}.align-self-lg-end{align-self:flex-end!important}.align-self-lg-center{align-self:center!important}.align-self-lg-baseline{align-self:baseline!important}.align-self-lg-stretch{align-self:stretch!important}}@media (min-width:10px){.flex-xl-row{flex-direction:row!important}.flex-xl-column{flex-direction:column!important}.flex-xl-row-reverse{flex-direction:row-reverse!important}.flex-xl-column-reverse{flex-direction:column-reverse!important}.flex-xl-wrap{flex-wrap:wrap!important}.flex-xl-nowrap{flex-wrap:nowrap!important}.flex-xl-wrap-reverse{flex-wrap:wrap-reverse!important}.flex-xl-fill{flex:1 1 auto!important}.flex-xl-grow-0{flex-grow:0!important}.flex-xl-grow-1{flex-grow:1!important}.flex-xl-shrink-0{flex-shrink:0!important}.flex-xl-shrink-1{flex-shrink:1!important}.justify-content-xl-start{justify-content:flex-start!important}.justify-content-xl-end{justify-content:flex-end!important}.justify-content-xl-center{justify-content:center!important}.justify-content-xl-between{justify-content:space-between!important}.justify-content-xl-around{justify-content:space-around!important}.align-items-xl-start{align-items:flex-start!important}.align-items-xl-end{align-items:flex-end!important}.align-items-xl-center{align-items:center!important}.align-items-xl-baseline{align-items:baseline!important}.align-items-xl-stretch{align-items:stretch!important}.align-content-xl-start{align-content:flex-start!important}.align-content-xl-end{align-content:flex-end!important}.align-content-xl-center{align-content:center!important}.align-content-xl-between{align-content:space-between!important}.align-content-xl-around{align-content:space-around!important}.align-content-xl-stretch{align-content:stretch!important}.align-self-xl-auto{align-self:auto!important}.align-self-xl-start{align-self:flex-start!important}.align-self-xl-end{align-self:flex-end!important}.align-self-xl-center{align-self:center!important}.align-self-xl-baseline{align-self:baseline!important}.align-self-xl-stretch{align-self:stretch!important}}.float-left{float:left!important}.float-right{float:right!important}.float-none{float:none!important}@media (min-width:2px){.float-sm-left{float:left!important}.float-sm-right{float:right!important}.float-sm-none{float:none!important}}@media (min-width:8px){.float-md-left{float:left!important}.float-md-right{float:right!important}.float-md-none{float:none!important}}@media (min-width:9px){.float-lg-left{float:left!important}.float-lg-right{float:right!important}.float-lg-none{float:none!important}}@media (min-width:10px){.float-xl-left{float:left!important}.float-xl-right{float:right!important}.float-xl-none{float:none!important}}.user-select-all{-webkit-user-select:all!important;-moz-user-select:all!important;user-select:all!important}.user-select-auto{-webkit-user-select:auto!important;-moz-user-select:auto!important;user-select:auto!important}.user-select-none{-webkit-user-select:none!important;-moz-user-select:none!important;user-select:none!important}.overflow-auto{overflow:auto!important}.overflow-hidden{overflow:hidden!important}.position-static{position:static!important}.position-relative{position:relative!important}.position-absolute{position:absolute!important}.position-fixed{position:fixed!important}.position-sticky{position:sticky!important}.fixed-top{top:0}.fixed-bottom,.fixed-top{left:0;position:fixed;right:0;z-index:1030}.fixed-bottom{bottom:0}@supports (position:sticky){.sticky-top{position:sticky;top:0;z-index:1020}}.sr-only{clip:rect(0,0,0,0);border:0;height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;white-space:nowrap;width:1px}.sr-only-focusable:active,.sr-only-focusable:focus{clip:auto;height:auto;overflow:visible;position:static;white-space:normal;width:auto}.shadow-sm{box-shadow:0 .125rem .25rem rgba(0,0,0,.075)!important}.shadow{box-shadow:0 .5rem 1rem rgba(0,0,0,.15)!important}.shadow-lg{box-shadow:0 1rem 3rem rgba(0,0,0,.175)!important}.shadow-none{box-shadow:none!important}.w-25{width:25%!important}.w-50{width:50%!important}.w-75{width:75%!important}.w-100{width:100%!important}.w-auto{width:auto!important}.h-25{height:25%!important}.h-50{height:50%!important}.h-75{height:75%!important}.h-100{height:100%!important}.h-auto{height:auto!important}.mw-100{max-width:100%!important}.mh-100{max-height:100%!important}.min-vw-100{min-width:100vw!important}.min-vh-100{min-height:100vh!important}.vw-100{width:100vw!important}.vh-100{height:100vh!important}.m-0{margin:0!important}.mt-0,.my-0{margin-top:0!important}.mr-0,.mx-0{margin-right:0!important}.mb-0,.my-0{margin-bottom:0!important}.ml-0,.mx-0{margin-left:0!important}.m-1{margin:.25rem!important}.mt-1,.my-1{margin-top:.25rem!important}.mr-1,.mx-1{margin-right:.25rem!important}.mb-1,.my-1{margin-bottom:.25rem!important}.ml-1,.mx-1{margin-left:.25rem!important}.m-2{margin:.5rem!important}.mt-2,.my-2{margin-top:.5rem!important}.mr-2,.mx-2{margin-right:.5rem!important}.mb-2,.my-2{margin-bottom:.5rem!important}.ml-2,.mx-2{margin-left:.5rem!important}.m-3{margin:1rem!important}.mt-3,.my-3{margin-top:1rem!important}.mr-3,.mx-3{margin-right:1rem!important}.mb-3,.my-3{margin-bottom:1rem!important}.ml-3,.mx-3{margin-left:1rem!important}.m-4{margin:1.5rem!important}.mt-4,.my-4{margin-top:1.5rem!important}.mr-4,.mx-4{margin-right:1.5rem!important}.mb-4,.my-4{margin-bottom:1.5rem!important}.ml-4,.mx-4{margin-left:1.5rem!important}.m-5{margin:3rem!important}.mt-5,.my-5{margin-top:3rem!important}.mr-5,.mx-5{margin-right:3rem!important}.mb-5,.my-5{margin-bottom:3rem!important}.ml-5,.mx-5{margin-left:3rem!important}.p-0{padding:0!important}.pt-0,.py-0{padding-top:0!important}.pr-0,.px-0{padding-right:0!important}.pb-0,.py-0{padding-bottom:0!important}.pl-0,.px-0{padding-left:0!important}.p-1{padding:.25rem!important}.pt-1,.py-1{padding-top:.25rem!important}.pr-1,.px-1{padding-right:.25rem!important}.pb-1,.py-1{padding-bottom:.25rem!important}.pl-1,.px-1{padding-left:.25rem!important}.p-2{padding:.5rem!important}.pt-2,.py-2{padding-top:.5rem!important}.pr-2,.px-2{padding-right:.5rem!important}.pb-2,.py-2{padding-bottom:.5rem!important}.pl-2,.px-2{padding-left:.5rem!important}.p-3{padding:1rem!important}.pt-3,.py-3{padding-top:1rem!important}.pr-3,.px-3{padding-right:1rem!important}.pb-3,.py-3{padding-bottom:1rem!important}.pl-3,.px-3{padding-left:1rem!important}.p-4{padding:1.5rem!important}.pt-4,.py-4{padding-top:1.5rem!important}.pr-4,.px-4{padding-right:1.5rem!important}.pb-4,.py-4{padding-bottom:1.5rem!important}.pl-4,.px-4{padding-left:1.5rem!important}.p-5{padding:3rem!important}.pt-5,.py-5{padding-top:3rem!important}.pr-5,.px-5{padding-right:3rem!important}.pb-5,.py-5{padding-bottom:3rem!important}.pl-5,.px-5{padding-left:3rem!important}.m-n1{margin:-.25rem!important}.mt-n1,.my-n1{margin-top:-.25rem!important}.mr-n1,.mx-n1{margin-right:-.25rem!important}.mb-n1,.my-n1{margin-bottom:-.25rem!important}.ml-n1,.mx-n1{margin-left:-.25rem!important}.m-n2{margin:-.5rem!important}.mt-n2,.my-n2{margin-top:-.5rem!important}.mr-n2,.mx-n2{margin-right:-.5rem!important}.mb-n2,.my-n2{margin-bottom:-.5rem!important}.ml-n2,.mx-n2{margin-left:-.5rem!important}.m-n3{margin:-1rem!important}.mt-n3,.my-n3{margin-top:-1rem!important}.mr-n3,.mx-n3{margin-right:-1rem!important}.mb-n3,.my-n3{margin-bottom:-1rem!important}.ml-n3,.mx-n3{margin-left:-1rem!important}.m-n4{margin:-1.5rem!important}.mt-n4,.my-n4{margin-top:-1.5rem!important}.mr-n4,.mx-n4{margin-right:-1.5rem!important}.mb-n4,.my-n4{margin-bottom:-1.5rem!important}.ml-n4,.mx-n4{margin-left:-1.5rem!important}.m-n5{margin:-3rem!important}.mt-n5,.my-n5{margin-top:-3rem!important}.mr-n5,.mx-n5{margin-right:-3rem!important}.mb-n5,.my-n5{margin-bottom:-3rem!important}.ml-n5,.mx-n5{margin-left:-3rem!important}.m-auto{margin:auto!important}.mt-auto,.my-auto{margin-top:auto!important}.mr-auto,.mx-auto{margin-right:auto!important}.mb-auto,.my-auto{margin-bottom:auto!important}.ml-auto,.mx-auto{margin-left:auto!important}@media (min-width:2px){.m-sm-0{margin:0!important}.mt-sm-0,.my-sm-0{margin-top:0!important}.mr-sm-0,.mx-sm-0{margin-right:0!important}.mb-sm-0,.my-sm-0{margin-bottom:0!important}.ml-sm-0,.mx-sm-0{margin-left:0!important}.m-sm-1{margin:.25rem!important}.mt-sm-1,.my-sm-1{margin-top:.25rem!important}.mr-sm-1,.mx-sm-1{margin-right:.25rem!important}.mb-sm-1,.my-sm-1{margin-bottom:.25rem!important}.ml-sm-1,.mx-sm-1{margin-left:.25rem!important}.m-sm-2{margin:.5rem!important}.mt-sm-2,.my-sm-2{margin-top:.5rem!important}.mr-sm-2,.mx-sm-2{margin-right:.5rem!important}.mb-sm-2,.my-sm-2{margin-bottom:.5rem!important}.ml-sm-2,.mx-sm-2{margin-left:.5rem!important}.m-sm-3{margin:1rem!important}.mt-sm-3,.my-sm-3{margin-top:1rem!important}.mr-sm-3,.mx-sm-3{margin-right:1rem!important}.mb-sm-3,.my-sm-3{margin-bottom:1rem!important}.ml-sm-3,.mx-sm-3{margin-left:1rem!important}.m-sm-4{margin:1.5rem!important}.mt-sm-4,.my-sm-4{margin-top:1.5rem!important}.mr-sm-4,.mx-sm-4{margin-right:1.5rem!important}.mb-sm-4,.my-sm-4{margin-bottom:1.5rem!important}.ml-sm-4,.mx-sm-4{margin-left:1.5rem!important}.m-sm-5{margin:3rem!important}.mt-sm-5,.my-sm-5{margin-top:3rem!important}.mr-sm-5,.mx-sm-5{margin-right:3rem!important}.mb-sm-5,.my-sm-5{margin-bottom:3rem!important}.ml-sm-5,.mx-sm-5{margin-left:3rem!important}.p-sm-0{padding:0!important}.pt-sm-0,.py-sm-0{padding-top:0!important}.pr-sm-0,.px-sm-0{padding-right:0!important}.pb-sm-0,.py-sm-0{padding-bottom:0!important}.pl-sm-0,.px-sm-0{padding-left:0!important}.p-sm-1{padding:.25rem!important}.pt-sm-1,.py-sm-1{padding-top:.25rem!important}.pr-sm-1,.px-sm-1{padding-right:.25rem!important}.pb-sm-1,.py-sm-1{padding-bottom:.25rem!important}.pl-sm-1,.px-sm-1{padding-left:.25rem!important}.p-sm-2{padding:.5rem!important}.pt-sm-2,.py-sm-2{padding-top:.5rem!important}.pr-sm-2,.px-sm-2{padding-right:.5rem!important}.pb-sm-2,.py-sm-2{padding-bottom:.5rem!important}.pl-sm-2,.px-sm-2{padding-left:.5rem!important}.p-sm-3{padding:1rem!important}.pt-sm-3,.py-sm-3{padding-top:1rem!important}.pr-sm-3,.px-sm-3{padding-right:1rem!important}.pb-sm-3,.py-sm-3{padding-bottom:1rem!important}.pl-sm-3,.px-sm-3{padding-left:1rem!important}.p-sm-4{padding:1.5rem!important}.pt-sm-4,.py-sm-4{padding-top:1.5rem!important}.pr-sm-4,.px-sm-4{padding-right:1.5rem!important}.pb-sm-4,.py-sm-4{padding-bottom:1.5rem!important}.pl-sm-4,.px-sm-4{padding-left:1.5rem!important}.p-sm-5{padding:3rem!important}.pt-sm-5,.py-sm-5{padding-top:3rem!important}.pr-sm-5,.px-sm-5{padding-right:3rem!important}.pb-sm-5,.py-sm-5{padding-bottom:3rem!important}.pl-sm-5,.px-sm-5{padding-left:3rem!important}.m-sm-n1{margin:-.25rem!important}.mt-sm-n1,.my-sm-n1{margin-top:-.25rem!important}.mr-sm-n1,.mx-sm-n1{margin-right:-.25rem!important}.mb-sm-n1,.my-sm-n1{margin-bottom:-.25rem!important}.ml-sm-n1,.mx-sm-n1{margin-left:-.25rem!important}.m-sm-n2{margin:-.5rem!important}.mt-sm-n2,.my-sm-n2{margin-top:-.5rem!important}.mr-sm-n2,.mx-sm-n2{margin-right:-.5rem!important}.mb-sm-n2,.my-sm-n2{margin-bottom:-.5rem!important}.ml-sm-n2,.mx-sm-n2{margin-left:-.5rem!important}.m-sm-n3{margin:-1rem!important}.mt-sm-n3,.my-sm-n3{margin-top:-1rem!important}.mr-sm-n3,.mx-sm-n3{margin-right:-1rem!important}.mb-sm-n3,.my-sm-n3{margin-bottom:-1rem!important}.ml-sm-n3,.mx-sm-n3{margin-left:-1rem!important}.m-sm-n4{margin:-1.5rem!important}.mt-sm-n4,.my-sm-n4{margin-top:-1.5rem!important}.mr-sm-n4,.mx-sm-n4{margin-right:-1.5rem!important}.mb-sm-n4,.my-sm-n4{margin-bottom:-1.5rem!important}.ml-sm-n4,.mx-sm-n4{margin-left:-1.5rem!important}.m-sm-n5{margin:-3rem!important}.mt-sm-n5,.my-sm-n5{margin-top:-3rem!important}.mr-sm-n5,.mx-sm-n5{margin-right:-3rem!important}.mb-sm-n5,.my-sm-n5{margin-bottom:-3rem!important}.ml-sm-n5,.mx-sm-n5{margin-left:-3rem!important}.m-sm-auto{margin:auto!important}.mt-sm-auto,.my-sm-auto{margin-top:auto!important}.mr-sm-auto,.mx-sm-auto{margin-right:auto!important}.mb-sm-auto,.my-sm-auto{margin-bottom:auto!important}.ml-sm-auto,.mx-sm-auto{margin-left:auto!important}}@media (min-width:8px){.m-md-0{margin:0!important}.mt-md-0,.my-md-0{margin-top:0!important}.mr-md-0,.mx-md-0{margin-right:0!important}.mb-md-0,.my-md-0{margin-bottom:0!important}.ml-md-0,.mx-md-0{margin-left:0!important}.m-md-1{margin:.25rem!important}.mt-md-1,.my-md-1{margin-top:.25rem!important}.mr-md-1,.mx-md-1{margin-right:.25rem!important}.mb-md-1,.my-md-1{margin-bottom:.25rem!important}.ml-md-1,.mx-md-1{margin-left:.25rem!important}.m-md-2{margin:.5rem!important}.mt-md-2,.my-md-2{margin-top:.5rem!important}.mr-md-2,.mx-md-2{margin-right:.5rem!important}.mb-md-2,.my-md-2{margin-bottom:.5rem!important}.ml-md-2,.mx-md-2{margin-left:.5rem!important}.m-md-3{margin:1rem!important}.mt-md-3,.my-md-3{margin-top:1rem!important}.mr-md-3,.mx-md-3{margin-right:1rem!important}.mb-md-3,.my-md-3{margin-bottom:1rem!important}.ml-md-3,.mx-md-3{margin-left:1rem!important}.m-md-4{margin:1.5rem!important}.mt-md-4,.my-md-4{margin-top:1.5rem!important}.mr-md-4,.mx-md-4{margin-right:1.5rem!important}.mb-md-4,.my-md-4{margin-bottom:1.5rem!important}.ml-md-4,.mx-md-4{margin-left:1.5rem!important}.m-md-5{margin:3rem!important}.mt-md-5,.my-md-5{margin-top:3rem!important}.mr-md-5,.mx-md-5{margin-right:3rem!important}.mb-md-5,.my-md-5{margin-bottom:3rem!important}.ml-md-5,.mx-md-5{margin-left:3rem!important}.p-md-0{padding:0!important}.pt-md-0,.py-md-0{padding-top:0!important}.pr-md-0,.px-md-0{padding-right:0!important}.pb-md-0,.py-md-0{padding-bottom:0!important}.pl-md-0,.px-md-0{padding-left:0!important}.p-md-1{padding:.25rem!important}.pt-md-1,.py-md-1{padding-top:.25rem!important}.pr-md-1,.px-md-1{padding-right:.25rem!important}.pb-md-1,.py-md-1{padding-bottom:.25rem!important}.pl-md-1,.px-md-1{padding-left:.25rem!important}.p-md-2{padding:.5rem!important}.pt-md-2,.py-md-2{padding-top:.5rem!important}.pr-md-2,.px-md-2{padding-right:.5rem!important}.pb-md-2,.py-md-2{padding-bottom:.5rem!important}.pl-md-2,.px-md-2{padding-left:.5rem!important}.p-md-3{padding:1rem!important}.pt-md-3,.py-md-3{padding-top:1rem!important}.pr-md-3,.px-md-3{padding-right:1rem!important}.pb-md-3,.py-md-3{padding-bottom:1rem!important}.pl-md-3,.px-md-3{padding-left:1rem!important}.p-md-4{padding:1.5rem!important}.pt-md-4,.py-md-4{padding-top:1.5rem!important}.pr-md-4,.px-md-4{padding-right:1.5rem!important}.pb-md-4,.py-md-4{padding-bottom:1.5rem!important}.pl-md-4,.px-md-4{padding-left:1.5rem!important}.p-md-5{padding:3rem!important}.pt-md-5,.py-md-5{padding-top:3rem!important}.pr-md-5,.px-md-5{padding-right:3rem!important}.pb-md-5,.py-md-5{padding-bottom:3rem!important}.pl-md-5,.px-md-5{padding-left:3rem!important}.m-md-n1{margin:-.25rem!important}.mt-md-n1,.my-md-n1{margin-top:-.25rem!important}.mr-md-n1,.mx-md-n1{margin-right:-.25rem!important}.mb-md-n1,.my-md-n1{margin-bottom:-.25rem!important}.ml-md-n1,.mx-md-n1{margin-left:-.25rem!important}.m-md-n2{margin:-.5rem!important}.mt-md-n2,.my-md-n2{margin-top:-.5rem!important}.mr-md-n2,.mx-md-n2{margin-right:-.5rem!important}.mb-md-n2,.my-md-n2{margin-bottom:-.5rem!important}.ml-md-n2,.mx-md-n2{margin-left:-.5rem!important}.m-md-n3{margin:-1rem!important}.mt-md-n3,.my-md-n3{margin-top:-1rem!important}.mr-md-n3,.mx-md-n3{margin-right:-1rem!important}.mb-md-n3,.my-md-n3{margin-bottom:-1rem!important}.ml-md-n3,.mx-md-n3{margin-left:-1rem!important}.m-md-n4{margin:-1.5rem!important}.mt-md-n4,.my-md-n4{margin-top:-1.5rem!important}.mr-md-n4,.mx-md-n4{margin-right:-1.5rem!important}.mb-md-n4,.my-md-n4{margin-bottom:-1.5rem!important}.ml-md-n4,.mx-md-n4{margin-left:-1.5rem!important}.m-md-n5{margin:-3rem!important}.mt-md-n5,.my-md-n5{margin-top:-3rem!important}.mr-md-n5,.mx-md-n5{margin-right:-3rem!important}.mb-md-n5,.my-md-n5{margin-bottom:-3rem!important}.ml-md-n5,.mx-md-n5{margin-left:-3rem!important}.m-md-auto{margin:auto!important}.mt-md-auto,.my-md-auto{margin-top:auto!important}.mr-md-auto,.mx-md-auto{margin-right:auto!important}.mb-md-auto,.my-md-auto{margin-bottom:auto!important}.ml-md-auto,.mx-md-auto{margin-left:auto!important}}@media (min-width:9px){.m-lg-0{margin:0!important}.mt-lg-0,.my-lg-0{margin-top:0!important}.mr-lg-0,.mx-lg-0{margin-right:0!important}.mb-lg-0,.my-lg-0{margin-bottom:0!important}.ml-lg-0,.mx-lg-0{margin-left:0!important}.m-lg-1{margin:.25rem!important}.mt-lg-1,.my-lg-1{margin-top:.25rem!important}.mr-lg-1,.mx-lg-1{margin-right:.25rem!important}.mb-lg-1,.my-lg-1{margin-bottom:.25rem!important}.ml-lg-1,.mx-lg-1{margin-left:.25rem!important}.m-lg-2{margin:.5rem!important}.mt-lg-2,.my-lg-2{margin-top:.5rem!important}.mr-lg-2,.mx-lg-2{margin-right:.5rem!important}.mb-lg-2,.my-lg-2{margin-bottom:.5rem!important}.ml-lg-2,.mx-lg-2{margin-left:.5rem!important}.m-lg-3{margin:1rem!important}.mt-lg-3,.my-lg-3{margin-top:1rem!important}.mr-lg-3,.mx-lg-3{margin-right:1rem!important}.mb-lg-3,.my-lg-3{margin-bottom:1rem!important}.ml-lg-3,.mx-lg-3{margin-left:1rem!important}.m-lg-4{margin:1.5rem!important}.mt-lg-4,.my-lg-4{margin-top:1.5rem!important}.mr-lg-4,.mx-lg-4{margin-right:1.5rem!important}.mb-lg-4,.my-lg-4{margin-bottom:1.5rem!important}.ml-lg-4,.mx-lg-4{margin-left:1.5rem!important}.m-lg-5{margin:3rem!important}.mt-lg-5,.my-lg-5{margin-top:3rem!important}.mr-lg-5,.mx-lg-5{margin-right:3rem!important}.mb-lg-5,.my-lg-5{margin-bottom:3rem!important}.ml-lg-5,.mx-lg-5{margin-left:3rem!important}.p-lg-0{padding:0!important}.pt-lg-0,.py-lg-0{padding-top:0!important}.pr-lg-0,.px-lg-0{padding-right:0!important}.pb-lg-0,.py-lg-0{padding-bottom:0!important}.pl-lg-0,.px-lg-0{padding-left:0!important}.p-lg-1{padding:.25rem!important}.pt-lg-1,.py-lg-1{padding-top:.25rem!important}.pr-lg-1,.px-lg-1{padding-right:.25rem!important}.pb-lg-1,.py-lg-1{padding-bottom:.25rem!important}.pl-lg-1,.px-lg-1{padding-left:.25rem!important}.p-lg-2{padding:.5rem!important}.pt-lg-2,.py-lg-2{padding-top:.5rem!important}.pr-lg-2,.px-lg-2{padding-right:.5rem!important}.pb-lg-2,.py-lg-2{padding-bottom:.5rem!important}.pl-lg-2,.px-lg-2{padding-left:.5rem!important}.p-lg-3{padding:1rem!important}.pt-lg-3,.py-lg-3{padding-top:1rem!important}.pr-lg-3,.px-lg-3{padding-right:1rem!important}.pb-lg-3,.py-lg-3{padding-bottom:1rem!important}.pl-lg-3,.px-lg-3{padding-left:1rem!important}.p-lg-4{padding:1.5rem!important}.pt-lg-4,.py-lg-4{padding-top:1.5rem!important}.pr-lg-4,.px-lg-4{padding-right:1.5rem!important}.pb-lg-4,.py-lg-4{padding-bottom:1.5rem!important}.pl-lg-4,.px-lg-4{padding-left:1.5rem!important}.p-lg-5{padding:3rem!important}.pt-lg-5,.py-lg-5{padding-top:3rem!important}.pr-lg-5,.px-lg-5{padding-right:3rem!important}.pb-lg-5,.py-lg-5{padding-bottom:3rem!important}.pl-lg-5,.px-lg-5{padding-left:3rem!important}.m-lg-n1{margin:-.25rem!important}.mt-lg-n1,.my-lg-n1{margin-top:-.25rem!important}.mr-lg-n1,.mx-lg-n1{margin-right:-.25rem!important}.mb-lg-n1,.my-lg-n1{margin-bottom:-.25rem!important}.ml-lg-n1,.mx-lg-n1{margin-left:-.25rem!important}.m-lg-n2{margin:-.5rem!important}.mt-lg-n2,.my-lg-n2{margin-top:-.5rem!important}.mr-lg-n2,.mx-lg-n2{margin-right:-.5rem!important}.mb-lg-n2,.my-lg-n2{margin-bottom:-.5rem!important}.ml-lg-n2,.mx-lg-n2{margin-left:-.5rem!important}.m-lg-n3{margin:-1rem!important}.mt-lg-n3,.my-lg-n3{margin-top:-1rem!important}.mr-lg-n3,.mx-lg-n3{margin-right:-1rem!important}.mb-lg-n3,.my-lg-n3{margin-bottom:-1rem!important}.ml-lg-n3,.mx-lg-n3{margin-left:-1rem!important}.m-lg-n4{margin:-1.5rem!important}.mt-lg-n4,.my-lg-n4{margin-top:-1.5rem!important}.mr-lg-n4,.mx-lg-n4{margin-right:-1.5rem!important}.mb-lg-n4,.my-lg-n4{margin-bottom:-1.5rem!important}.ml-lg-n4,.mx-lg-n4{margin-left:-1.5rem!important}.m-lg-n5{margin:-3rem!important}.mt-lg-n5,.my-lg-n5{margin-top:-3rem!important}.mr-lg-n5,.mx-lg-n5{margin-right:-3rem!important}.mb-lg-n5,.my-lg-n5{margin-bottom:-3rem!important}.ml-lg-n5,.mx-lg-n5{margin-left:-3rem!important}.m-lg-auto{margin:auto!important}.mt-lg-auto,.my-lg-auto{margin-top:auto!important}.mr-lg-auto,.mx-lg-auto{margin-right:auto!important}.mb-lg-auto,.my-lg-auto{margin-bottom:auto!important}.ml-lg-auto,.mx-lg-auto{margin-left:auto!important}}@media (min-width:10px){.m-xl-0{margin:0!important}.mt-xl-0,.my-xl-0{margin-top:0!important}.mr-xl-0,.mx-xl-0{margin-right:0!important}.mb-xl-0,.my-xl-0{margin-bottom:0!important}.ml-xl-0,.mx-xl-0{margin-left:0!important}.m-xl-1{margin:.25rem!important}.mt-xl-1,.my-xl-1{margin-top:.25rem!important}.mr-xl-1,.mx-xl-1{margin-right:.25rem!important}.mb-xl-1,.my-xl-1{margin-bottom:.25rem!important}.ml-xl-1,.mx-xl-1{margin-left:.25rem!important}.m-xl-2{margin:.5rem!important}.mt-xl-2,.my-xl-2{margin-top:.5rem!important}.mr-xl-2,.mx-xl-2{margin-right:.5rem!important}.mb-xl-2,.my-xl-2{margin-bottom:.5rem!important}.ml-xl-2,.mx-xl-2{margin-left:.5rem!important}.m-xl-3{margin:1rem!important}.mt-xl-3,.my-xl-3{margin-top:1rem!important}.mr-xl-3,.mx-xl-3{margin-right:1rem!important}.mb-xl-3,.my-xl-3{margin-bottom:1rem!important}.ml-xl-3,.mx-xl-3{margin-left:1rem!important}.m-xl-4{margin:1.5rem!important}.mt-xl-4,.my-xl-4{margin-top:1.5rem!important}.mr-xl-4,.mx-xl-4{margin-right:1.5rem!important}.mb-xl-4,.my-xl-4{margin-bottom:1.5rem!important}.ml-xl-4,.mx-xl-4{margin-left:1.5rem!important}.m-xl-5{margin:3rem!important}.mt-xl-5,.my-xl-5{margin-top:3rem!important}.mr-xl-5,.mx-xl-5{margin-right:3rem!important}.mb-xl-5,.my-xl-5{margin-bottom:3rem!important}.ml-xl-5,.mx-xl-5{margin-left:3rem!important}.p-xl-0{padding:0!important}.pt-xl-0,.py-xl-0{padding-top:0!important}.pr-xl-0,.px-xl-0{padding-right:0!important}.pb-xl-0,.py-xl-0{padding-bottom:0!important}.pl-xl-0,.px-xl-0{padding-left:0!important}.p-xl-1{padding:.25rem!important}.pt-xl-1,.py-xl-1{padding-top:.25rem!important}.pr-xl-1,.px-xl-1{padding-right:.25rem!important}.pb-xl-1,.py-xl-1{padding-bottom:.25rem!important}.pl-xl-1,.px-xl-1{padding-left:.25rem!important}.p-xl-2{padding:.5rem!important}.pt-xl-2,.py-xl-2{padding-top:.5rem!important}.pr-xl-2,.px-xl-2{padding-right:.5rem!important}.pb-xl-2,.py-xl-2{padding-bottom:.5rem!important}.pl-xl-2,.px-xl-2{padding-left:.5rem!important}.p-xl-3{padding:1rem!important}.pt-xl-3,.py-xl-3{padding-top:1rem!important}.pr-xl-3,.px-xl-3{padding-right:1rem!important}.pb-xl-3,.py-xl-3{padding-bottom:1rem!important}.pl-xl-3,.px-xl-3{padding-left:1rem!important}.p-xl-4{padding:1.5rem!important}.pt-xl-4,.py-xl-4{padding-top:1.5rem!important}.pr-xl-4,.px-xl-4{padding-right:1.5rem!important}.pb-xl-4,.py-xl-4{padding-bottom:1.5rem!important}.pl-xl-4,.px-xl-4{padding-left:1.5rem!important}.p-xl-5{padding:3rem!important}.pt-xl-5,.py-xl-5{padding-top:3rem!important}.pr-xl-5,.px-xl-5{padding-right:3rem!important}.pb-xl-5,.py-xl-5{padding-bottom:3rem!important}.pl-xl-5,.px-xl-5{padding-left:3rem!important}.m-xl-n1{margin:-.25rem!important}.mt-xl-n1,.my-xl-n1{margin-top:-.25rem!important}.mr-xl-n1,.mx-xl-n1{margin-right:-.25rem!important}.mb-xl-n1,.my-xl-n1{margin-bottom:-.25rem!important}.ml-xl-n1,.mx-xl-n1{margin-left:-.25rem!important}.m-xl-n2{margin:-.5rem!important}.mt-xl-n2,.my-xl-n2{margin-top:-.5rem!important}.mr-xl-n2,.mx-xl-n2{margin-right:-.5rem!important}.mb-xl-n2,.my-xl-n2{margin-bottom:-.5rem!important}.ml-xl-n2,.mx-xl-n2{margin-left:-.5rem!important}.m-xl-n3{margin:-1rem!important}.mt-xl-n3,.my-xl-n3{margin-top:-1rem!important}.mr-xl-n3,.mx-xl-n3{margin-right:-1rem!important}.mb-xl-n3,.my-xl-n3{margin-bottom:-1rem!important}.ml-xl-n3,.mx-xl-n3{margin-left:-1rem!important}.m-xl-n4{margin:-1.5rem!important}.mt-xl-n4,.my-xl-n4{margin-top:-1.5rem!important}.mr-xl-n4,.mx-xl-n4{margin-right:-1.5rem!important}.mb-xl-n4,.my-xl-n4{margin-bottom:-1.5rem!important}.ml-xl-n4,.mx-xl-n4{margin-left:-1.5rem!important}.m-xl-n5{margin:-3rem!important}.mt-xl-n5,.my-xl-n5{margin-top:-3rem!important}.mr-xl-n5,.mx-xl-n5{margin-right:-3rem!important}.mb-xl-n5,.my-xl-n5{margin-bottom:-3rem!important}.ml-xl-n5,.mx-xl-n5{margin-left:-3rem!important}.m-xl-auto{margin:auto!important}.mt-xl-auto,.my-xl-auto{margin-top:auto!important}.mr-xl-auto,.mx-xl-auto{margin-right:auto!important}.mb-xl-auto,.my-xl-auto{margin-bottom:auto!important}.ml-xl-auto,.mx-xl-auto{margin-left:auto!important}}.stretched-link:after{background-color:transparent;bottom:0;content:"";left:0;pointer-events:auto;position:absolute;right:0;top:0;z-index:1}.text-monospace{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace!important}.text-justify{text-align:justify!important}.text-wrap{white-space:normal!important}.text-nowrap{white-space:nowrap!important}.text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.text-left{text-align:left!important}.text-right{text-align:right!important}.text-center{text-align:center!important}@media (min-width:2px){.text-sm-left{text-align:left!important}.text-sm-right{text-align:right!important}.text-sm-center{text-align:center!important}}@media (min-width:8px){.text-md-left{text-align:left!important}.text-md-right{text-align:right!important}.text-md-center{text-align:center!important}}@media (min-width:9px){.text-lg-left{text-align:left!important}.text-lg-right{text-align:right!important}.text-lg-center{text-align:center!important}}@media (min-width:10px){.text-xl-left{text-align:left!important}.text-xl-right{text-align:right!important}.text-xl-center{text-align:center!important}}.text-lowercase{text-transform:lowercase!important}.text-uppercase{text-transform:uppercase!important}.text-capitalize{text-transform:capitalize!important}.font-weight-light{font-weight:300!important}.font-weight-lighter{font-weight:lighter!important}.font-weight-normal{font-weight:400!important}.font-weight-bold{font-weight:600!important}.font-weight-bolder{font-weight:bolder!important}.font-italic{font-style:italic!important}.text-white{color:#fff!important}.text-primary{color:#4040c8!important}a.text-primary:focus,a.text-primary:hover{color:#2a2a92!important}.text-secondary{color:#4b5563!important}a.text-secondary:focus,a.text-secondary:hover{color:#2a3037!important}.text-success{color:#059669!important}a.text-success:focus,a.text-success:hover{color:#034c35!important}.text-info{color:#2563eb!important}a.text-info:focus,a.text-info:hover{color:#1043b3!important}.text-warning{color:#d97706!important}a.text-warning:focus,a.text-warning:hover{color:#8f4e04!important}.text-danger{color:#dc2626!important}a.text-danger:focus,a.text-danger:hover{color:#9c1919!important}.text-light{color:#f3f4f6!important}a.text-light:focus,a.text-light:hover{color:#c7ccd5!important}.text-dark{color:#1f2937!important}a.text-dark:focus,a.text-dark:hover{color:#030506!important}.text-body{color:#f3f4f6!important}.text-muted{color:#9ca3af!important}.text-black-50{color:rgba(0,0,0,.5)!important}.text-white-50{color:hsla(0,0%,100%,.5)!important}.text-hide{background-color:transparent;border:0;color:transparent;font:0/0 a;text-shadow:none}.text-decoration-none{text-decoration:none!important}.text-break{word-wrap:break-word!important;word-break:break-word!important}.text-reset{color:inherit!important}.visible{visibility:visible!important}.invisible{visibility:hidden!important}@media print{*,:after,:before{box-shadow:none!important;text-shadow:none!important}a:not(.btn){text-decoration:underline}abbr[title]:after{content:" (" attr(title) ")"}pre{white-space:pre-wrap!important}blockquote,pre{border:1px solid #6b7280}blockquote,img,pre,tr{page-break-inside:avoid}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}@page{size:a3;}.container,body{min-width:9px!important}.navbar{display:none}.badge{border:1px solid #000}.table{border-collapse:collapse!important}.table td,.table th{background-color:#fff!important}.table-bordered td,.table-bordered th{border:1px solid #d1d5db!important}.table-dark{color:inherit}.table-dark tbody+tbody,.table-dark td,.table-dark th,.table-dark thead th{border-color:#374151}.table .thead-dark th{border-color:#374151;color:inherit}}.vjs-tree{color:#bfc7d5!important;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}.vjs-tree .vjs-tree__content{border-left:1px dotted hsla(0,0%,80%,.28)!important}.vjs-tree .vjs-tree__node{cursor:pointer}.vjs-tree .vjs-tree__node:hover{color:#20a0ff}.vjs-tree .vjs-checkbox{left:-30px;position:absolute}.vjs-tree .vjs-value__boolean,.vjs-tree .vjs-value__null,.vjs-tree .vjs-value__number{color:#a291f5!important}.vjs-tree .vjs-value__string{color:#c3e88d!important}.vjs-tree .vjs-key{color:#c3cbd3!important}.hljs-addition,.hljs-attr,.hljs-keyword,.hljs-selector-tag{color:#13ce66}.hljs-bullet,.hljs-meta,.hljs-name,.hljs-string,.hljs-symbol,.hljs-template-tag,.hljs-template-variable,.hljs-type,.hljs-variable{color:#c3e88d}.hljs-comment,.hljs-deletion,.hljs-quote{color:#bfcbd9}.hljs-literal,.hljs-number,.hljs-title{color:#a291f5!important}body{padding-bottom:20px}.container{max-width:1440px}html{min-width:1140px}[v-cloak]{display:none}svg.icon{height:1rem;width:1rem}.header{border-bottom:1px solid #374151}.header .logo{color:#e5e7eb;text-decoration:none}.header .logo svg{height:1.7rem;width:1.7rem}.sidebar .nav-item a{border-radius:6px;color:#9ca3af;margin-bottom:4px;padding:.5rem .75rem}.sidebar .nav-item a svg{fill:#6b7280;height:1.25rem;margin-right:15px;width:1.25rem}.sidebar .nav-item a:hover{background-color:#1f2937;color:#d1d5db}.sidebar .nav-item a.active{background-color:#1f2937;color:#818cf8}.sidebar .nav-item a.active svg{fill:#6366f1}.card{border:none;box-shadow:0 4px 6px -1px rgba(0,0,0,.1),0 2px 4px -2px rgba(0,0,0,.1)}.card .bottom-radius{border-bottom-left-radius:6px;border-bottom-right-radius:6px}.card .card-header{background-color:#374151;border-bottom:none;min-height:60px;padding-bottom:.7rem;padding-top:.7rem}.card .card-header .btn-group .btn{padding:.2rem .5rem}.card .card-header .form-control-with-icon{position:relative}.card .card-header .form-control-with-icon .icon-wrapper{align-items:center;bottom:0;display:flex;justify-content:center;left:.75rem;position:absolute;top:0}.card .card-header .form-control-with-icon .icon-wrapper .icon{fill:#9ca3af}.card .card-header .form-control-with-icon .form-control{border-radius:9999px;font-size:.875rem;padding-left:2.25rem}.card .table td,.card .table th{padding:.75rem 1.25rem}.card .table th{background-color:#1f2937;border-bottom:0;font-size:.875rem;padding:.5rem 1.25rem}.card .table:not(.table-borderless) td{border-top:1px solid #374151}.card .table.penultimate-column-right td:nth-last-child(2),.card .table.penultimate-column-right th:nth-last-child(2){text-align:right}.card .table td.table-fit,.card .table th.table-fit{white-space:nowrap;width:1%}.fill-text-color{fill:#f3f4f6}.fill-danger{fill:#dc2626}.fill-warning{fill:#d97706}.fill-info{fill:#2563eb}.fill-success{fill:#059669}.fill-primary{fill:#4040c8}button:hover .fill-primary{fill:#fff}.btn-outline-primary.active .fill-primary{fill:#111827}.btn-outline-primary:not(:disabled):not(.disabled).active:focus{box-shadow:none!important}.btn-muted{background:#1f2937;color:#9ca3af}.btn-muted:focus,.btn-muted:hover{background:#374151;color:#d1d5db}.btn-muted.active{background:#4040c8;color:#fff}.badge-secondary{background:#d1d5db;color:#374151}.badge-success{background:#10b981;color:#fff}.badge-info{background:#3b82f6;color:#fff}.badge-warning{background:#f59e0b;color:#fff}.badge-danger{background:#ef4444;color:#fff}.control-action svg{fill:#6b7280;height:1.2rem;width:1.2rem}.control-action svg:hover{fill:#818cf8}@keyframes spin{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.spin{animation:spin 2s linear infinite}.card .nav-pills{background:#374151}.card .nav-pills .nav-link{border-radius:0;color:#9ca3af;font-size:.9rem;padding:.75rem 1.25rem}.card .nav-pills .nav-link:focus,.card .nav-pills .nav-link:hover{color:#e5e7eb}.card .nav-pills .nav-link.active{background:none;border-bottom:2px solid #a5b4fc;color:#a5b4fc}.list-enter-active:not(.dontanimate){transition:background 1s linear}.list-enter:not(.dontanimate),.list-leave-to:not(.dontanimate){background:#312e81}.code-bg .list-enter:not(.dontanimate),.code-bg .list-leave-to:not(.dontanimate){background:#4b5563}#indexScreen td{vertical-align:middle!important}.card-bg-secondary{background:#1f2937}.code-bg{background:#292d3e}.disabled-watcher{background:#dc2626;color:#fff;padding:.75rem}.copy-to-clipboard{--tw-text-opacity:1;color:rgb(231 232 242/var(--tw-text-opacity));opacity:.7;outline:2px solid transparent;outline-offset:2px;position:absolute;right:0;top:0;z-index:10} + */:root{--blue:#007bff;--indigo:#6610f2;--purple:#6f42c1;--pink:#e83e8c;--red:#dc3545;--orange:#fd7e14;--yellow:#ffc107;--green:#28a745;--teal:#20c997;--cyan:#17a2b8;--white:#fff;--gray:#4b5563;--gray-dark:#1f2937;--primary:#4040c8;--secondary:#4b5563;--success:#059669;--info:#2563eb;--warning:#d97706;--danger:#dc2626;--light:#f3f4f6;--dark:#1f2937;--breakpoint-xs:0;--breakpoint-sm:2px;--breakpoint-md:8px;--breakpoint-lg:9px;--breakpoint-xl:10px;--font-family-sans-serif:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans","Liberation Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--font-family-monospace:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace}*,:after,:before{box-sizing:border-box}html{-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:rgba(0,0,0,0);font-family:sans-serif;line-height:1.15}article,aside,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}body{background-color:#111827;color:#f3f4f6;font-family:Figtree,sans-serif;font-size:1rem;font-weight:400;line-height:1.5;margin:0;text-align:left}[tabindex="-1"]:focus:not(:focus-visible){outline:0!important}hr{box-sizing:content-box;height:0;overflow:visible}h1,h2,h3,h4,h5,h6{margin-bottom:.5rem;margin-top:0}p{margin-bottom:1rem;margin-top:0}abbr[data-original-title],abbr[title]{border-bottom:0;cursor:help;text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted;-webkit-text-decoration-skip-ink:none;text-decoration-skip-ink:none}address{font-style:normal;line-height:inherit}address,dl,ol,ul{margin-bottom:1rem}dl,ol,ul{margin-top:0}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:600}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}b,strong{font-weight:bolder}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{background-color:transparent;color:#818cf8;text-decoration:none}a:hover{color:#a5b4fc;text-decoration:underline}a:not([href]):not([class]),a:not([href]):not([class]):hover{color:inherit;text-decoration:none}code,kbd,pre,samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-size:1em}pre{-ms-overflow-style:scrollbar;margin-bottom:1rem;margin-top:0;overflow:auto}figure{margin:0 0 1rem}img{border-style:none}img,svg{vertical-align:middle}svg{overflow:hidden}table{border-collapse:collapse}caption{caption-side:bottom;color:#9ca3af;padding-bottom:.75rem;padding-top:.75rem;text-align:left}th{text-align:inherit;text-align:-webkit-match-parent}label{display:inline-block;margin-bottom:.5rem}button{border-radius:0}button:focus:not(:focus-visible){outline:0}button,input,optgroup,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit;margin:0}button,input{overflow:visible}button,select{text-transform:none}[role=button]{cursor:pointer}select{word-wrap:normal}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]:not(:disabled),[type=reset]:not(:disabled),[type=submit]:not(:disabled),button:not(:disabled){cursor:pointer}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}textarea{overflow:auto;resize:vertical}fieldset{border:0;margin:0;min-width:0;padding:0}legend{color:inherit;display:block;font-size:1.5rem;line-height:inherit;margin-bottom:.5rem;max-width:100%;padding:0;white-space:normal;width:100%}progress{vertical-align:baseline}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:none;outline-offset:-2px}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}output{display:inline-block}summary{cursor:pointer;display:list-item}template{display:none}[hidden]{display:none!important}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{font-weight:500;line-height:1.2;margin-bottom:.5rem}.h1,h1{font-size:2.5rem}.h2,h2{font-size:2rem}.h3,h3{font-size:1.75rem}.h4,h4{font-size:1.5rem}.h5,h5{font-size:1.25rem}.h6,h6{font-size:1rem}.lead{font-size:1.25rem;font-weight:300}.display-1{font-size:6rem}.display-1,.display-2{font-weight:300;line-height:1.2}.display-2{font-size:5.5rem}.display-3{font-size:4.5rem}.display-3,.display-4{font-weight:300;line-height:1.2}.display-4{font-size:3.5rem}hr{border:0;border-top:1px solid rgba(0,0,0,.1);margin-bottom:1rem;margin-top:1rem}.small,small{font-size:.875em;font-weight:400}.mark,mark{background-color:#fcf8e3;padding:.2em}.list-inline,.list-unstyled{list-style:none;padding-left:0}.list-inline-item{display:inline-block}.list-inline-item:not(:last-child){margin-right:.5rem}.initialism{font-size:90%;text-transform:uppercase}.blockquote{font-size:1.25rem;margin-bottom:1rem}.blockquote-footer{color:#4b5563;display:block;font-size:.875em}.blockquote-footer:before{content:"— "}.img-fluid,.img-thumbnail{height:auto;max-width:100%}.img-thumbnail{background-color:#111827;border:1px solid #d1d5db;border-radius:.25rem;padding:.25rem}.figure{display:inline-block}.figure-img{line-height:1;margin-bottom:.5rem}.figure-caption{color:#4b5563;font-size:90%}code{word-wrap:break-word;color:#e83e8c;font-size:87.5%}a>code{color:inherit}kbd{background-color:#111827;border-radius:.2rem;color:#fff;font-size:87.5%;padding:.2rem .4rem}kbd kbd{font-size:100%;font-weight:600;padding:0}pre{color:#111827;display:block;font-size:87.5%}pre code{color:inherit;font-size:inherit;word-break:normal}.pre-scrollable{max-height:340px;overflow-y:scroll}.container,.container-fluid,.container-lg,.container-md,.container-sm,.container-xl{margin-left:auto;margin-right:auto;padding-left:15px;padding-right:15px;width:100%}@media (min-width:2px){.container,.container-sm{max-width:1137px}}@media (min-width:8px){.container,.container-md,.container-sm{max-width:1138px}}@media (min-width:9px){.container,.container-lg,.container-md,.container-sm{max-width:1139px}}@media (min-width:10px){.container,.container-lg,.container-md,.container-sm,.container-xl{max-width:1140px}}.row{display:flex;flex-wrap:wrap;margin-left:-15px;margin-right:-15px}.no-gutters{margin-left:0;margin-right:0}.no-gutters>.col,.no-gutters>[class*=col-]{padding-left:0;padding-right:0}.col,.col-1,.col-10,.col-11,.col-12,.col-2,.col-3,.col-4,.col-5,.col-6,.col-7,.col-8,.col-9,.col-auto,.col-lg,.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-auto,.col-md,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-auto,.col-sm,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-auto,.col-xl,.col-xl-1,.col-xl-10,.col-xl-11,.col-xl-12,.col-xl-2,.col-xl-3,.col-xl-4,.col-xl-5,.col-xl-6,.col-xl-7,.col-xl-8,.col-xl-9,.col-xl-auto{padding-left:15px;padding-right:15px;position:relative;width:100%}.col{flex-basis:0;flex-grow:1;max-width:100%}.row-cols-1>*{flex:0 0 100%;max-width:100%}.row-cols-2>*{flex:0 0 50%;max-width:50%}.row-cols-3>*{flex:0 0 33.3333333333%;max-width:33.3333333333%}.row-cols-4>*{flex:0 0 25%;max-width:25%}.row-cols-5>*{flex:0 0 20%;max-width:20%}.row-cols-6>*{flex:0 0 16.6666666667%;max-width:16.6666666667%}.col-auto{flex:0 0 auto;max-width:100%;width:auto}.col-1{flex:0 0 8.33333333%;max-width:8.33333333%}.col-2{flex:0 0 16.66666667%;max-width:16.66666667%}.col-3{flex:0 0 25%;max-width:25%}.col-4{flex:0 0 33.33333333%;max-width:33.33333333%}.col-5{flex:0 0 41.66666667%;max-width:41.66666667%}.col-6{flex:0 0 50%;max-width:50%}.col-7{flex:0 0 58.33333333%;max-width:58.33333333%}.col-8{flex:0 0 66.66666667%;max-width:66.66666667%}.col-9{flex:0 0 75%;max-width:75%}.col-10{flex:0 0 83.33333333%;max-width:83.33333333%}.col-11{flex:0 0 91.66666667%;max-width:91.66666667%}.col-12{flex:0 0 100%;max-width:100%}.order-first{order:-1}.order-last{order:13}.order-0{order:0}.order-1{order:1}.order-2{order:2}.order-3{order:3}.order-4{order:4}.order-5{order:5}.order-6{order:6}.order-7{order:7}.order-8{order:8}.order-9{order:9}.order-10{order:10}.order-11{order:11}.order-12{order:12}.offset-1{margin-left:8.33333333%}.offset-2{margin-left:16.66666667%}.offset-3{margin-left:25%}.offset-4{margin-left:33.33333333%}.offset-5{margin-left:41.66666667%}.offset-6{margin-left:50%}.offset-7{margin-left:58.33333333%}.offset-8{margin-left:66.66666667%}.offset-9{margin-left:75%}.offset-10{margin-left:83.33333333%}.offset-11{margin-left:91.66666667%}@media (min-width:2px){.col-sm{flex-basis:0;flex-grow:1;max-width:100%}.row-cols-sm-1>*{flex:0 0 100%;max-width:100%}.row-cols-sm-2>*{flex:0 0 50%;max-width:50%}.row-cols-sm-3>*{flex:0 0 33.3333333333%;max-width:33.3333333333%}.row-cols-sm-4>*{flex:0 0 25%;max-width:25%}.row-cols-sm-5>*{flex:0 0 20%;max-width:20%}.row-cols-sm-6>*{flex:0 0 16.6666666667%;max-width:16.6666666667%}.col-sm-auto{flex:0 0 auto;max-width:100%;width:auto}.col-sm-1{flex:0 0 8.33333333%;max-width:8.33333333%}.col-sm-2{flex:0 0 16.66666667%;max-width:16.66666667%}.col-sm-3{flex:0 0 25%;max-width:25%}.col-sm-4{flex:0 0 33.33333333%;max-width:33.33333333%}.col-sm-5{flex:0 0 41.66666667%;max-width:41.66666667%}.col-sm-6{flex:0 0 50%;max-width:50%}.col-sm-7{flex:0 0 58.33333333%;max-width:58.33333333%}.col-sm-8{flex:0 0 66.66666667%;max-width:66.66666667%}.col-sm-9{flex:0 0 75%;max-width:75%}.col-sm-10{flex:0 0 83.33333333%;max-width:83.33333333%}.col-sm-11{flex:0 0 91.66666667%;max-width:91.66666667%}.col-sm-12{flex:0 0 100%;max-width:100%}.order-sm-first{order:-1}.order-sm-last{order:13}.order-sm-0{order:0}.order-sm-1{order:1}.order-sm-2{order:2}.order-sm-3{order:3}.order-sm-4{order:4}.order-sm-5{order:5}.order-sm-6{order:6}.order-sm-7{order:7}.order-sm-8{order:8}.order-sm-9{order:9}.order-sm-10{order:10}.order-sm-11{order:11}.order-sm-12{order:12}.offset-sm-0{margin-left:0}.offset-sm-1{margin-left:8.33333333%}.offset-sm-2{margin-left:16.66666667%}.offset-sm-3{margin-left:25%}.offset-sm-4{margin-left:33.33333333%}.offset-sm-5{margin-left:41.66666667%}.offset-sm-6{margin-left:50%}.offset-sm-7{margin-left:58.33333333%}.offset-sm-8{margin-left:66.66666667%}.offset-sm-9{margin-left:75%}.offset-sm-10{margin-left:83.33333333%}.offset-sm-11{margin-left:91.66666667%}}@media (min-width:8px){.col-md{flex-basis:0;flex-grow:1;max-width:100%}.row-cols-md-1>*{flex:0 0 100%;max-width:100%}.row-cols-md-2>*{flex:0 0 50%;max-width:50%}.row-cols-md-3>*{flex:0 0 33.3333333333%;max-width:33.3333333333%}.row-cols-md-4>*{flex:0 0 25%;max-width:25%}.row-cols-md-5>*{flex:0 0 20%;max-width:20%}.row-cols-md-6>*{flex:0 0 16.6666666667%;max-width:16.6666666667%}.col-md-auto{flex:0 0 auto;max-width:100%;width:auto}.col-md-1{flex:0 0 8.33333333%;max-width:8.33333333%}.col-md-2{flex:0 0 16.66666667%;max-width:16.66666667%}.col-md-3{flex:0 0 25%;max-width:25%}.col-md-4{flex:0 0 33.33333333%;max-width:33.33333333%}.col-md-5{flex:0 0 41.66666667%;max-width:41.66666667%}.col-md-6{flex:0 0 50%;max-width:50%}.col-md-7{flex:0 0 58.33333333%;max-width:58.33333333%}.col-md-8{flex:0 0 66.66666667%;max-width:66.66666667%}.col-md-9{flex:0 0 75%;max-width:75%}.col-md-10{flex:0 0 83.33333333%;max-width:83.33333333%}.col-md-11{flex:0 0 91.66666667%;max-width:91.66666667%}.col-md-12{flex:0 0 100%;max-width:100%}.order-md-first{order:-1}.order-md-last{order:13}.order-md-0{order:0}.order-md-1{order:1}.order-md-2{order:2}.order-md-3{order:3}.order-md-4{order:4}.order-md-5{order:5}.order-md-6{order:6}.order-md-7{order:7}.order-md-8{order:8}.order-md-9{order:9}.order-md-10{order:10}.order-md-11{order:11}.order-md-12{order:12}.offset-md-0{margin-left:0}.offset-md-1{margin-left:8.33333333%}.offset-md-2{margin-left:16.66666667%}.offset-md-3{margin-left:25%}.offset-md-4{margin-left:33.33333333%}.offset-md-5{margin-left:41.66666667%}.offset-md-6{margin-left:50%}.offset-md-7{margin-left:58.33333333%}.offset-md-8{margin-left:66.66666667%}.offset-md-9{margin-left:75%}.offset-md-10{margin-left:83.33333333%}.offset-md-11{margin-left:91.66666667%}}@media (min-width:9px){.col-lg{flex-basis:0;flex-grow:1;max-width:100%}.row-cols-lg-1>*{flex:0 0 100%;max-width:100%}.row-cols-lg-2>*{flex:0 0 50%;max-width:50%}.row-cols-lg-3>*{flex:0 0 33.3333333333%;max-width:33.3333333333%}.row-cols-lg-4>*{flex:0 0 25%;max-width:25%}.row-cols-lg-5>*{flex:0 0 20%;max-width:20%}.row-cols-lg-6>*{flex:0 0 16.6666666667%;max-width:16.6666666667%}.col-lg-auto{flex:0 0 auto;max-width:100%;width:auto}.col-lg-1{flex:0 0 8.33333333%;max-width:8.33333333%}.col-lg-2{flex:0 0 16.66666667%;max-width:16.66666667%}.col-lg-3{flex:0 0 25%;max-width:25%}.col-lg-4{flex:0 0 33.33333333%;max-width:33.33333333%}.col-lg-5{flex:0 0 41.66666667%;max-width:41.66666667%}.col-lg-6{flex:0 0 50%;max-width:50%}.col-lg-7{flex:0 0 58.33333333%;max-width:58.33333333%}.col-lg-8{flex:0 0 66.66666667%;max-width:66.66666667%}.col-lg-9{flex:0 0 75%;max-width:75%}.col-lg-10{flex:0 0 83.33333333%;max-width:83.33333333%}.col-lg-11{flex:0 0 91.66666667%;max-width:91.66666667%}.col-lg-12{flex:0 0 100%;max-width:100%}.order-lg-first{order:-1}.order-lg-last{order:13}.order-lg-0{order:0}.order-lg-1{order:1}.order-lg-2{order:2}.order-lg-3{order:3}.order-lg-4{order:4}.order-lg-5{order:5}.order-lg-6{order:6}.order-lg-7{order:7}.order-lg-8{order:8}.order-lg-9{order:9}.order-lg-10{order:10}.order-lg-11{order:11}.order-lg-12{order:12}.offset-lg-0{margin-left:0}.offset-lg-1{margin-left:8.33333333%}.offset-lg-2{margin-left:16.66666667%}.offset-lg-3{margin-left:25%}.offset-lg-4{margin-left:33.33333333%}.offset-lg-5{margin-left:41.66666667%}.offset-lg-6{margin-left:50%}.offset-lg-7{margin-left:58.33333333%}.offset-lg-8{margin-left:66.66666667%}.offset-lg-9{margin-left:75%}.offset-lg-10{margin-left:83.33333333%}.offset-lg-11{margin-left:91.66666667%}}@media (min-width:10px){.col-xl{flex-basis:0;flex-grow:1;max-width:100%}.row-cols-xl-1>*{flex:0 0 100%;max-width:100%}.row-cols-xl-2>*{flex:0 0 50%;max-width:50%}.row-cols-xl-3>*{flex:0 0 33.3333333333%;max-width:33.3333333333%}.row-cols-xl-4>*{flex:0 0 25%;max-width:25%}.row-cols-xl-5>*{flex:0 0 20%;max-width:20%}.row-cols-xl-6>*{flex:0 0 16.6666666667%;max-width:16.6666666667%}.col-xl-auto{flex:0 0 auto;max-width:100%;width:auto}.col-xl-1{flex:0 0 8.33333333%;max-width:8.33333333%}.col-xl-2{flex:0 0 16.66666667%;max-width:16.66666667%}.col-xl-3{flex:0 0 25%;max-width:25%}.col-xl-4{flex:0 0 33.33333333%;max-width:33.33333333%}.col-xl-5{flex:0 0 41.66666667%;max-width:41.66666667%}.col-xl-6{flex:0 0 50%;max-width:50%}.col-xl-7{flex:0 0 58.33333333%;max-width:58.33333333%}.col-xl-8{flex:0 0 66.66666667%;max-width:66.66666667%}.col-xl-9{flex:0 0 75%;max-width:75%}.col-xl-10{flex:0 0 83.33333333%;max-width:83.33333333%}.col-xl-11{flex:0 0 91.66666667%;max-width:91.66666667%}.col-xl-12{flex:0 0 100%;max-width:100%}.order-xl-first{order:-1}.order-xl-last{order:13}.order-xl-0{order:0}.order-xl-1{order:1}.order-xl-2{order:2}.order-xl-3{order:3}.order-xl-4{order:4}.order-xl-5{order:5}.order-xl-6{order:6}.order-xl-7{order:7}.order-xl-8{order:8}.order-xl-9{order:9}.order-xl-10{order:10}.order-xl-11{order:11}.order-xl-12{order:12}.offset-xl-0{margin-left:0}.offset-xl-1{margin-left:8.33333333%}.offset-xl-2{margin-left:16.66666667%}.offset-xl-3{margin-left:25%}.offset-xl-4{margin-left:33.33333333%}.offset-xl-5{margin-left:41.66666667%}.offset-xl-6{margin-left:50%}.offset-xl-7{margin-left:58.33333333%}.offset-xl-8{margin-left:66.66666667%}.offset-xl-9{margin-left:75%}.offset-xl-10{margin-left:83.33333333%}.offset-xl-11{margin-left:91.66666667%}}.table{color:#f3f4f6;margin-bottom:1rem;width:100%}.table td,.table th{border-top:1px solid #374151;padding:.75rem;vertical-align:top}.table thead th{border-bottom:2px solid #374151;vertical-align:bottom}.table tbody+tbody{border-top:2px solid #374151}.table-sm td,.table-sm th{padding:.3rem}.table-bordered,.table-bordered td,.table-bordered th{border:1px solid #374151}.table-bordered thead td,.table-bordered thead th{border-bottom-width:2px}.table-borderless tbody+tbody,.table-borderless td,.table-borderless th,.table-borderless thead th{border:0}.table-striped tbody tr:nth-of-type(odd){background-color:rgba(0,0,0,.05)}.table-hover tbody tr:hover{background-color:#374151;color:#f3f4f6}.table-primary,.table-primary>td,.table-primary>th{background-color:#cacaf0}.table-primary tbody+tbody,.table-primary td,.table-primary th,.table-primary thead th{border-color:#9c9ce2}.table-hover .table-primary:hover,.table-hover .table-primary:hover>td,.table-hover .table-primary:hover>th{background-color:#b6b6ea}.table-secondary,.table-secondary>td,.table-secondary>th{background-color:#cdcfd3}.table-secondary tbody+tbody,.table-secondary td,.table-secondary th,.table-secondary thead th{border-color:#a1a7ae}.table-hover .table-secondary:hover,.table-hover .table-secondary:hover>td,.table-hover .table-secondary:hover>th{background-color:#bfc2c7}.table-success,.table-success>td,.table-success>th{background-color:#b9e2d5}.table-success tbody+tbody,.table-success td,.table-success th,.table-success thead th{border-color:#7dc8b1}.table-hover .table-success:hover,.table-hover .table-success:hover>td,.table-hover .table-success:hover>th{background-color:#a7dbca}.table-info,.table-info>td,.table-info>th{background-color:#c2d3f9}.table-info tbody+tbody,.table-info td,.table-info th,.table-info thead th{border-color:#8eaef5}.table-hover .table-info:hover,.table-hover .table-info:hover>td,.table-hover .table-info:hover>th{background-color:#abc2f7}.table-warning,.table-warning>td,.table-warning>th{background-color:#f4d9b9}.table-warning tbody+tbody,.table-warning td,.table-warning th,.table-warning thead th{border-color:#ebb87e}.table-hover .table-warning:hover,.table-hover .table-warning:hover>td,.table-hover .table-warning:hover>th{background-color:#f1cda3}.table-danger,.table-danger>td,.table-danger>th{background-color:#f5c2c2}.table-danger tbody+tbody,.table-danger td,.table-danger th,.table-danger thead th{border-color:#ed8e8e}.table-hover .table-danger:hover,.table-hover .table-danger:hover>td,.table-hover .table-danger:hover>th{background-color:#f1acac}.table-light,.table-light>td,.table-light>th{background-color:#fcfcfc}.table-light tbody+tbody,.table-light td,.table-light th,.table-light thead th{border-color:#f9f9fa}.table-hover .table-light:hover,.table-hover .table-light:hover>td,.table-hover .table-light:hover>th{background-color:#efefef}.table-dark,.table-dark>td,.table-dark>th{background-color:#c0c3c7}.table-dark tbody+tbody,.table-dark td,.table-dark th,.table-dark thead th{border-color:#8b9097}.table-hover .table-dark:hover,.table-hover .table-dark:hover>td,.table-hover .table-dark:hover>th{background-color:#b3b6bb}.table-active,.table-active>td,.table-active>th{background-color:#374151}.table-hover .table-active:hover,.table-hover .table-active:hover>td,.table-hover .table-active:hover>th{background-color:#2d3542}.table .thead-dark th{background-color:#1f2937;border-color:#2d3b4f;color:#fff}.table .thead-light th{background-color:#e5e7eb;border-color:#374151;color:#374151}.table-dark{background-color:#1f2937;color:#fff}.table-dark td,.table-dark th,.table-dark thead th{border-color:#2d3b4f}.table-dark.table-bordered{border:0}.table-dark.table-striped tbody tr:nth-of-type(odd){background-color:hsla(0,0%,100%,.05)}.table-dark.table-hover tbody tr:hover{background-color:hsla(0,0%,100%,.075);color:#fff}@media (max-width:1.98px){.table-responsive-sm{-webkit-overflow-scrolling:touch;display:block;overflow-x:auto;width:100%}.table-responsive-sm>.table-bordered{border:0}}@media (max-width:7.98px){.table-responsive-md{-webkit-overflow-scrolling:touch;display:block;overflow-x:auto;width:100%}.table-responsive-md>.table-bordered{border:0}}@media (max-width:8.98px){.table-responsive-lg{-webkit-overflow-scrolling:touch;display:block;overflow-x:auto;width:100%}.table-responsive-lg>.table-bordered{border:0}}@media (max-width:9.98px){.table-responsive-xl{-webkit-overflow-scrolling:touch;display:block;overflow-x:auto;width:100%}.table-responsive-xl>.table-bordered{border:0}}.table-responsive{-webkit-overflow-scrolling:touch;display:block;overflow-x:auto;width:100%}.table-responsive>.table-bordered{border:0}.form-control{background-clip:padding-box;background-color:#1f2937;border:1px solid #4b5563;border-radius:.25rem;color:#e5e7eb;display:block;font-size:1rem;font-weight:400;height:calc(1.5em + .75rem + 2px);line-height:1.5;padding:.375rem .75rem;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out;width:100%}@media (prefers-reduced-motion:reduce){.form-control{transition:none}}.form-control::-ms-expand{background-color:transparent;border:0}.form-control:focus{background-color:#1f2937;border-color:#a3a3e5;box-shadow:0 0 0 .2rem rgba(64,64,200,.25);color:#e5e7eb;outline:0}.form-control::-moz-placeholder{color:#4b5563;opacity:1}.form-control::placeholder{color:#4b5563;opacity:1}.form-control:disabled,.form-control[readonly]{background-color:#e5e7eb;opacity:1}input[type=date].form-control,input[type=datetime-local].form-control,input[type=month].form-control,input[type=time].form-control{-webkit-appearance:none;-moz-appearance:none;appearance:none}select.form-control:-moz-focusring{color:transparent;text-shadow:0 0 0 #e5e7eb}select.form-control:focus::-ms-value{background-color:#1f2937;color:#e5e7eb}.form-control-file,.form-control-range{display:block;width:100%}.col-form-label{font-size:inherit;line-height:1.5;margin-bottom:0;padding-bottom:calc(.375rem + 1px);padding-top:calc(.375rem + 1px)}.col-form-label-lg{font-size:1.25rem;line-height:1.5;padding-bottom:calc(.5rem + 1px);padding-top:calc(.5rem + 1px)}.col-form-label-sm{font-size:.875rem;line-height:1.5;padding-bottom:calc(.25rem + 1px);padding-top:calc(.25rem + 1px)}.form-control-plaintext{background-color:transparent;border:solid transparent;border-width:1px 0;color:#f3f4f6;display:block;font-size:1rem;line-height:1.5;margin-bottom:0;padding:.375rem 0;width:100%}.form-control-plaintext.form-control-lg,.form-control-plaintext.form-control-sm{padding-left:0;padding-right:0}.form-control-sm{border-radius:.2rem;font-size:.875rem;height:calc(1.5em + .5rem + 2px);line-height:1.5;padding:.25rem .5rem}.form-control-lg{border-radius:6px;font-size:1.25rem;height:calc(1.5em + 1rem + 2px);line-height:1.5;padding:.5rem 1rem}select.form-control[multiple],select.form-control[size],textarea.form-control{height:auto}.form-group{margin-bottom:1rem}.form-text{display:block;margin-top:.25rem}.form-row{display:flex;flex-wrap:wrap;margin-left:-5px;margin-right:-5px}.form-row>.col,.form-row>[class*=col-]{padding-left:5px;padding-right:5px}.form-check{display:block;padding-left:1.25rem;position:relative}.form-check-input{margin-left:-1.25rem;margin-top:.3rem;position:absolute}.form-check-input:disabled~.form-check-label,.form-check-input[disabled]~.form-check-label{color:#9ca3af}.form-check-label{margin-bottom:0}.form-check-inline{align-items:center;display:inline-flex;margin-right:.75rem;padding-left:0}.form-check-inline .form-check-input{margin-left:0;margin-right:.3125rem;margin-top:0;position:static}.valid-feedback{color:#059669;display:none;font-size:.875em;margin-top:.25rem;width:100%}.valid-tooltip{background-color:rgba(5,150,105,.9);border-radius:.25rem;color:#fff;display:none;font-size:.875rem;left:0;line-height:1.5;margin-top:.1rem;max-width:100%;padding:.25rem .5rem;position:absolute;top:100%;z-index:5}.form-row>.col>.valid-tooltip,.form-row>[class*=col-]>.valid-tooltip{left:5px}.is-valid~.valid-feedback,.is-valid~.valid-tooltip,.was-validated :valid~.valid-feedback,.was-validated :valid~.valid-tooltip{display:block}.form-control.is-valid,.was-validated .form-control:valid{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8'%3E%3Cpath fill='%23059669' d='M2.3 6.73.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3E%3C/svg%3E");background-position:right calc(.375em + .1875rem) center;background-repeat:no-repeat;background-size:calc(.75em + .375rem) calc(.75em + .375rem);border-color:#059669;padding-right:calc(1.5em + .75rem)!important}.form-control.is-valid:focus,.was-validated .form-control:valid:focus{border-color:#059669;box-shadow:0 0 0 .2rem rgba(5,150,105,.25)}.was-validated select.form-control:valid,select.form-control.is-valid{background-position:right 1.5rem center;padding-right:3rem!important}.was-validated textarea.form-control:valid,textarea.form-control.is-valid{background-position:top calc(.375em + .1875rem) right calc(.375em + .1875rem);padding-right:calc(1.5em + .75rem)}.custom-select.is-valid,.was-validated .custom-select:valid{background:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='4' height='5'%3E%3Cpath fill='%231f2937' d='M2 0 0 2h4zm0 5L0 3h4z'/%3E%3C/svg%3E") right .75rem center/8px 10px no-repeat,#1f2937 url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8'%3E%3Cpath fill='%23059669' d='M2.3 6.73.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3E%3C/svg%3E") center right 1.75rem/calc(.75em + .375rem) calc(.75em + .375rem) no-repeat;border-color:#059669;padding-right:calc(.75em + 2.3125rem)!important}.custom-select.is-valid:focus,.was-validated .custom-select:valid:focus{border-color:#059669;box-shadow:0 0 0 .2rem rgba(5,150,105,.25)}.form-check-input.is-valid~.form-check-label,.was-validated .form-check-input:valid~.form-check-label{color:#059669}.form-check-input.is-valid~.valid-feedback,.form-check-input.is-valid~.valid-tooltip,.was-validated .form-check-input:valid~.valid-feedback,.was-validated .form-check-input:valid~.valid-tooltip{display:block}.custom-control-input.is-valid~.custom-control-label,.was-validated .custom-control-input:valid~.custom-control-label{color:#059669}.custom-control-input.is-valid~.custom-control-label:before,.was-validated .custom-control-input:valid~.custom-control-label:before{border-color:#059669}.custom-control-input.is-valid:checked~.custom-control-label:before,.was-validated .custom-control-input:valid:checked~.custom-control-label:before{background-color:#07c78c;border-color:#07c78c}.custom-control-input.is-valid:focus~.custom-control-label:before,.was-validated .custom-control-input:valid:focus~.custom-control-label:before{box-shadow:0 0 0 .2rem rgba(5,150,105,.25)}.custom-control-input.is-valid:focus:not(:checked)~.custom-control-label:before,.was-validated .custom-control-input:valid:focus:not(:checked)~.custom-control-label:before{border-color:#059669}.custom-file-input.is-valid~.custom-file-label,.was-validated .custom-file-input:valid~.custom-file-label{border-color:#059669}.custom-file-input.is-valid:focus~.custom-file-label,.was-validated .custom-file-input:valid:focus~.custom-file-label{border-color:#059669;box-shadow:0 0 0 .2rem rgba(5,150,105,.25)}.invalid-feedback{color:#dc2626;display:none;font-size:.875em;margin-top:.25rem;width:100%}.invalid-tooltip{background-color:rgba(220,38,38,.9);border-radius:.25rem;color:#fff;display:none;font-size:.875rem;left:0;line-height:1.5;margin-top:.1rem;max-width:100%;padding:.25rem .5rem;position:absolute;top:100%;z-index:5}.form-row>.col>.invalid-tooltip,.form-row>[class*=col-]>.invalid-tooltip{left:5px}.is-invalid~.invalid-feedback,.is-invalid~.invalid-tooltip,.was-validated :invalid~.invalid-feedback,.was-validated :invalid~.invalid-tooltip{display:block}.form-control.is-invalid,.was-validated .form-control:invalid{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' fill='none' stroke='%23dc2626'%3E%3Ccircle cx='6' cy='6' r='4.5'/%3E%3Cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3E%3Ccircle cx='6' cy='8.2' r='.6' fill='%23dc2626' stroke='none'/%3E%3C/svg%3E");background-position:right calc(.375em + .1875rem) center;background-repeat:no-repeat;background-size:calc(.75em + .375rem) calc(.75em + .375rem);border-color:#dc2626;padding-right:calc(1.5em + .75rem)!important}.form-control.is-invalid:focus,.was-validated .form-control:invalid:focus{border-color:#dc2626;box-shadow:0 0 0 .2rem rgba(220,38,38,.25)}.was-validated select.form-control:invalid,select.form-control.is-invalid{background-position:right 1.5rem center;padding-right:3rem!important}.was-validated textarea.form-control:invalid,textarea.form-control.is-invalid{background-position:top calc(.375em + .1875rem) right calc(.375em + .1875rem);padding-right:calc(1.5em + .75rem)}.custom-select.is-invalid,.was-validated .custom-select:invalid{background:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='4' height='5'%3E%3Cpath fill='%231f2937' d='M2 0 0 2h4zm0 5L0 3h4z'/%3E%3C/svg%3E") right .75rem center/8px 10px no-repeat,#1f2937 url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' fill='none' stroke='%23dc2626'%3E%3Ccircle cx='6' cy='6' r='4.5'/%3E%3Cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3E%3Ccircle cx='6' cy='8.2' r='.6' fill='%23dc2626' stroke='none'/%3E%3C/svg%3E") center right 1.75rem/calc(.75em + .375rem) calc(.75em + .375rem) no-repeat;border-color:#dc2626;padding-right:calc(.75em + 2.3125rem)!important}.custom-select.is-invalid:focus,.was-validated .custom-select:invalid:focus{border-color:#dc2626;box-shadow:0 0 0 .2rem rgba(220,38,38,.25)}.form-check-input.is-invalid~.form-check-label,.was-validated .form-check-input:invalid~.form-check-label{color:#dc2626}.form-check-input.is-invalid~.invalid-feedback,.form-check-input.is-invalid~.invalid-tooltip,.was-validated .form-check-input:invalid~.invalid-feedback,.was-validated .form-check-input:invalid~.invalid-tooltip{display:block}.custom-control-input.is-invalid~.custom-control-label,.was-validated .custom-control-input:invalid~.custom-control-label{color:#dc2626}.custom-control-input.is-invalid~.custom-control-label:before,.was-validated .custom-control-input:invalid~.custom-control-label:before{border-color:#dc2626}.custom-control-input.is-invalid:checked~.custom-control-label:before,.was-validated .custom-control-input:invalid:checked~.custom-control-label:before{background-color:#e35252;border-color:#e35252}.custom-control-input.is-invalid:focus~.custom-control-label:before,.was-validated .custom-control-input:invalid:focus~.custom-control-label:before{box-shadow:0 0 0 .2rem rgba(220,38,38,.25)}.custom-control-input.is-invalid:focus:not(:checked)~.custom-control-label:before,.was-validated .custom-control-input:invalid:focus:not(:checked)~.custom-control-label:before{border-color:#dc2626}.custom-file-input.is-invalid~.custom-file-label,.was-validated .custom-file-input:invalid~.custom-file-label{border-color:#dc2626}.custom-file-input.is-invalid:focus~.custom-file-label,.was-validated .custom-file-input:invalid:focus~.custom-file-label{border-color:#dc2626;box-shadow:0 0 0 .2rem rgba(220,38,38,.25)}.form-inline{align-items:center;display:flex;flex-flow:row wrap}.form-inline .form-check{width:100%}@media (min-width:2px){.form-inline label{justify-content:center}.form-inline .form-group,.form-inline label{align-items:center;display:flex;margin-bottom:0}.form-inline .form-group{flex:0 0 auto;flex-flow:row wrap}.form-inline .form-control{display:inline-block;vertical-align:middle;width:auto}.form-inline .form-control-plaintext{display:inline-block}.form-inline .custom-select,.form-inline .input-group{width:auto}.form-inline .form-check{align-items:center;display:flex;justify-content:center;padding-left:0;width:auto}.form-inline .form-check-input{flex-shrink:0;margin-left:0;margin-right:.25rem;margin-top:0;position:relative}.form-inline .custom-control{align-items:center;justify-content:center}.form-inline .custom-control-label{margin-bottom:0}}.btn{background-color:transparent;border:1px solid transparent;border-radius:.25rem;color:#f3f4f6;display:inline-block;font-size:1rem;font-weight:400;line-height:1.5;padding:.375rem .75rem;text-align:center;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;-webkit-user-select:none;-moz-user-select:none;user-select:none;vertical-align:middle}@media (prefers-reduced-motion:reduce){.btn{transition:none}}.btn:hover{color:#f3f4f6;text-decoration:none}.btn.focus,.btn:focus{box-shadow:0 0 0 .2rem rgba(64,64,200,.25);outline:0}.btn.disabled,.btn:disabled{opacity:.65}.btn:not(:disabled):not(.disabled){cursor:pointer}a.btn.disabled,fieldset:disabled a.btn{pointer-events:none}.btn-primary{background-color:#4040c8;border-color:#4040c8;color:#fff}.btn-primary.focus,.btn-primary:focus,.btn-primary:hover{background-color:#3232af;border-color:#3030a5;color:#fff}.btn-primary.focus,.btn-primary:focus{box-shadow:0 0 0 .2rem rgba(93,93,208,.5)}.btn-primary.disabled,.btn-primary:disabled{background-color:#4040c8;border-color:#4040c8;color:#fff}.btn-primary:not(:disabled):not(.disabled).active,.btn-primary:not(:disabled):not(.disabled):active,.show>.btn-primary.dropdown-toggle{background-color:#3030a5;border-color:#2d2d9b;color:#fff}.btn-primary:not(:disabled):not(.disabled).active:focus,.btn-primary:not(:disabled):not(.disabled):active:focus,.show>.btn-primary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(93,93,208,.5)}.btn-secondary{background-color:#4b5563;border-color:#4b5563;color:#fff}.btn-secondary.focus,.btn-secondary:focus,.btn-secondary:hover{background-color:#3b424d;border-color:#353c46;color:#fff}.btn-secondary.focus,.btn-secondary:focus{box-shadow:0 0 0 .2rem hsla(213,9%,44%,.5)}.btn-secondary.disabled,.btn-secondary:disabled{background-color:#4b5563;border-color:#4b5563;color:#fff}.btn-secondary:not(:disabled):not(.disabled).active,.btn-secondary:not(:disabled):not(.disabled):active,.show>.btn-secondary.dropdown-toggle{background-color:#353c46;border-color:#30363f;color:#fff}.btn-secondary:not(:disabled):not(.disabled).active:focus,.btn-secondary:not(:disabled):not(.disabled):active:focus,.show>.btn-secondary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem hsla(213,9%,44%,.5)}.btn-success{background-color:#059669;border-color:#059669;color:#fff}.btn-success.focus,.btn-success:focus,.btn-success:hover{background-color:#04714f;border-color:#036546;color:#fff}.btn-success.focus,.btn-success:focus{box-shadow:0 0 0 .2rem rgba(43,166,128,.5)}.btn-success.disabled,.btn-success:disabled{background-color:#059669;border-color:#059669;color:#fff}.btn-success:not(:disabled):not(.disabled).active,.btn-success:not(:disabled):not(.disabled):active,.show>.btn-success.dropdown-toggle{background-color:#036546;border-color:#03583e;color:#fff}.btn-success:not(:disabled):not(.disabled).active:focus,.btn-success:not(:disabled):not(.disabled):active:focus,.show>.btn-success.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(43,166,128,.5)}.btn-info{background-color:#2563eb;border-color:#2563eb;color:#fff}.btn-info.focus,.btn-info:focus,.btn-info:hover{background-color:#1451d6;border-color:#134cca;color:#fff}.btn-info.focus,.btn-info:focus{box-shadow:0 0 0 .2rem rgba(70,122,238,.5)}.btn-info.disabled,.btn-info:disabled{background-color:#2563eb;border-color:#2563eb;color:#fff}.btn-info:not(:disabled):not(.disabled).active,.btn-info:not(:disabled):not(.disabled):active,.show>.btn-info.dropdown-toggle{background-color:#134cca;border-color:#1248bf;color:#fff}.btn-info:not(:disabled):not(.disabled).active:focus,.btn-info:not(:disabled):not(.disabled):active:focus,.show>.btn-info.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(70,122,238,.5)}.btn-warning{background-color:#d97706;border-color:#d97706;color:#fff}.btn-warning.focus,.btn-warning:focus,.btn-warning:hover{background-color:#b46305;border-color:#a75c05;color:#fff}.btn-warning.focus,.btn-warning:focus{box-shadow:0 0 0 .2rem rgba(223,139,43,.5)}.btn-warning.disabled,.btn-warning:disabled{background-color:#d97706;border-color:#d97706;color:#fff}.btn-warning:not(:disabled):not(.disabled).active,.btn-warning:not(:disabled):not(.disabled):active,.show>.btn-warning.dropdown-toggle{background-color:#a75c05;border-color:#9b5504;color:#fff}.btn-warning:not(:disabled):not(.disabled).active:focus,.btn-warning:not(:disabled):not(.disabled):active:focus,.show>.btn-warning.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(223,139,43,.5)}.btn-danger{background-color:#dc2626;border-color:#dc2626;color:#fff}.btn-danger.focus,.btn-danger:focus,.btn-danger:hover{background-color:#bd1f1f;border-color:#b21d1d;color:#fff}.btn-danger.focus,.btn-danger:focus{box-shadow:0 0 0 .2rem rgba(225,71,71,.5)}.btn-danger.disabled,.btn-danger:disabled{background-color:#dc2626;border-color:#dc2626;color:#fff}.btn-danger:not(:disabled):not(.disabled).active,.btn-danger:not(:disabled):not(.disabled):active,.show>.btn-danger.dropdown-toggle{background-color:#b21d1d;border-color:#a71b1b;color:#fff}.btn-danger:not(:disabled):not(.disabled).active:focus,.btn-danger:not(:disabled):not(.disabled):active:focus,.show>.btn-danger.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(225,71,71,.5)}.btn-light{background-color:#f3f4f6;border-color:#f3f4f6;color:#111827}.btn-light.focus,.btn-light:focus,.btn-light:hover{background-color:#dde0e6;border-color:#d6d9e0;color:#111827}.btn-light.focus,.btn-light:focus{box-shadow:0 0 0 .2rem hsla(220,7%,83%,.5)}.btn-light.disabled,.btn-light:disabled{background-color:#f3f4f6;border-color:#f3f4f6;color:#111827}.btn-light:not(:disabled):not(.disabled).active,.btn-light:not(:disabled):not(.disabled):active,.show>.btn-light.dropdown-toggle{background-color:#d6d9e0;border-color:#cfd3db;color:#111827}.btn-light:not(:disabled):not(.disabled).active:focus,.btn-light:not(:disabled):not(.disabled):active:focus,.show>.btn-light.dropdown-toggle:focus{box-shadow:0 0 0 .2rem hsla(220,7%,83%,.5)}.btn-dark{background-color:#1f2937;border-color:#1f2937;color:#fff}.btn-dark.focus,.btn-dark:focus,.btn-dark:hover{background-color:#11171f;border-color:#0d1116;color:#fff}.btn-dark.focus,.btn-dark:focus{box-shadow:0 0 0 .2rem rgba(65,73,85,.5)}.btn-dark.disabled,.btn-dark:disabled{background-color:#1f2937;border-color:#1f2937;color:#fff}.btn-dark:not(:disabled):not(.disabled).active,.btn-dark:not(:disabled):not(.disabled):active,.show>.btn-dark.dropdown-toggle{background-color:#0d1116;border-color:#080b0e;color:#fff}.btn-dark:not(:disabled):not(.disabled).active:focus,.btn-dark:not(:disabled):not(.disabled):active:focus,.show>.btn-dark.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(65,73,85,.5)}.btn-outline-primary{border-color:#4040c8;color:#4040c8}.btn-outline-primary:hover{background-color:#4040c8;border-color:#4040c8;color:#fff}.btn-outline-primary.focus,.btn-outline-primary:focus{box-shadow:0 0 0 .2rem rgba(64,64,200,.5)}.btn-outline-primary.disabled,.btn-outline-primary:disabled{background-color:transparent;color:#4040c8}.btn-outline-primary:not(:disabled):not(.disabled).active,.btn-outline-primary:not(:disabled):not(.disabled):active,.show>.btn-outline-primary.dropdown-toggle{background-color:#4040c8;border-color:#4040c8;color:#fff}.btn-outline-primary:not(:disabled):not(.disabled).active:focus,.btn-outline-primary:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-primary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(64,64,200,.5)}.btn-outline-secondary{border-color:#4b5563;color:#4b5563}.btn-outline-secondary:hover{background-color:#4b5563;border-color:#4b5563;color:#fff}.btn-outline-secondary.focus,.btn-outline-secondary:focus{box-shadow:0 0 0 .2rem rgba(75,85,99,.5)}.btn-outline-secondary.disabled,.btn-outline-secondary:disabled{background-color:transparent;color:#4b5563}.btn-outline-secondary:not(:disabled):not(.disabled).active,.btn-outline-secondary:not(:disabled):not(.disabled):active,.show>.btn-outline-secondary.dropdown-toggle{background-color:#4b5563;border-color:#4b5563;color:#fff}.btn-outline-secondary:not(:disabled):not(.disabled).active:focus,.btn-outline-secondary:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-secondary.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(75,85,99,.5)}.btn-outline-success{border-color:#059669;color:#059669}.btn-outline-success:hover{background-color:#059669;border-color:#059669;color:#fff}.btn-outline-success.focus,.btn-outline-success:focus{box-shadow:0 0 0 .2rem rgba(5,150,105,.5)}.btn-outline-success.disabled,.btn-outline-success:disabled{background-color:transparent;color:#059669}.btn-outline-success:not(:disabled):not(.disabled).active,.btn-outline-success:not(:disabled):not(.disabled):active,.show>.btn-outline-success.dropdown-toggle{background-color:#059669;border-color:#059669;color:#fff}.btn-outline-success:not(:disabled):not(.disabled).active:focus,.btn-outline-success:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-success.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(5,150,105,.5)}.btn-outline-info{border-color:#2563eb;color:#2563eb}.btn-outline-info:hover{background-color:#2563eb;border-color:#2563eb;color:#fff}.btn-outline-info.focus,.btn-outline-info:focus{box-shadow:0 0 0 .2rem rgba(37,99,235,.5)}.btn-outline-info.disabled,.btn-outline-info:disabled{background-color:transparent;color:#2563eb}.btn-outline-info:not(:disabled):not(.disabled).active,.btn-outline-info:not(:disabled):not(.disabled):active,.show>.btn-outline-info.dropdown-toggle{background-color:#2563eb;border-color:#2563eb;color:#fff}.btn-outline-info:not(:disabled):not(.disabled).active:focus,.btn-outline-info:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-info.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(37,99,235,.5)}.btn-outline-warning{border-color:#d97706;color:#d97706}.btn-outline-warning:hover{background-color:#d97706;border-color:#d97706;color:#fff}.btn-outline-warning.focus,.btn-outline-warning:focus{box-shadow:0 0 0 .2rem rgba(217,119,6,.5)}.btn-outline-warning.disabled,.btn-outline-warning:disabled{background-color:transparent;color:#d97706}.btn-outline-warning:not(:disabled):not(.disabled).active,.btn-outline-warning:not(:disabled):not(.disabled):active,.show>.btn-outline-warning.dropdown-toggle{background-color:#d97706;border-color:#d97706;color:#fff}.btn-outline-warning:not(:disabled):not(.disabled).active:focus,.btn-outline-warning:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-warning.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(217,119,6,.5)}.btn-outline-danger{border-color:#dc2626;color:#dc2626}.btn-outline-danger:hover{background-color:#dc2626;border-color:#dc2626;color:#fff}.btn-outline-danger.focus,.btn-outline-danger:focus{box-shadow:0 0 0 .2rem rgba(220,38,38,.5)}.btn-outline-danger.disabled,.btn-outline-danger:disabled{background-color:transparent;color:#dc2626}.btn-outline-danger:not(:disabled):not(.disabled).active,.btn-outline-danger:not(:disabled):not(.disabled):active,.show>.btn-outline-danger.dropdown-toggle{background-color:#dc2626;border-color:#dc2626;color:#fff}.btn-outline-danger:not(:disabled):not(.disabled).active:focus,.btn-outline-danger:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-danger.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(220,38,38,.5)}.btn-outline-light{border-color:#f3f4f6;color:#f3f4f6}.btn-outline-light:hover{background-color:#f3f4f6;border-color:#f3f4f6;color:#111827}.btn-outline-light.focus,.btn-outline-light:focus{box-shadow:0 0 0 .2rem rgba(243,244,246,.5)}.btn-outline-light.disabled,.btn-outline-light:disabled{background-color:transparent;color:#f3f4f6}.btn-outline-light:not(:disabled):not(.disabled).active,.btn-outline-light:not(:disabled):not(.disabled):active,.show>.btn-outline-light.dropdown-toggle{background-color:#f3f4f6;border-color:#f3f4f6;color:#111827}.btn-outline-light:not(:disabled):not(.disabled).active:focus,.btn-outline-light:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-light.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(243,244,246,.5)}.btn-outline-dark{border-color:#1f2937;color:#1f2937}.btn-outline-dark:hover{background-color:#1f2937;border-color:#1f2937;color:#fff}.btn-outline-dark.focus,.btn-outline-dark:focus{box-shadow:0 0 0 .2rem rgba(31,41,55,.5)}.btn-outline-dark.disabled,.btn-outline-dark:disabled{background-color:transparent;color:#1f2937}.btn-outline-dark:not(:disabled):not(.disabled).active,.btn-outline-dark:not(:disabled):not(.disabled):active,.show>.btn-outline-dark.dropdown-toggle{background-color:#1f2937;border-color:#1f2937;color:#fff}.btn-outline-dark:not(:disabled):not(.disabled).active:focus,.btn-outline-dark:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-dark.dropdown-toggle:focus{box-shadow:0 0 0 .2rem rgba(31,41,55,.5)}.btn-link{color:#818cf8;font-weight:400;text-decoration:none}.btn-link:hover{color:#a5b4fc}.btn-link.focus,.btn-link:focus,.btn-link:hover{text-decoration:underline}.btn-link.disabled,.btn-link:disabled{color:#4b5563;pointer-events:none}.btn-group-lg>.btn,.btn-lg{border-radius:6px;font-size:1.25rem;line-height:1.5;padding:.5rem 1rem}.btn-group-sm>.btn,.btn-sm{border-radius:.2rem;font-size:.875rem;line-height:1.5;padding:.25rem .5rem}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:.5rem}input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%}.fade{transition:opacity .15s linear}@media (prefers-reduced-motion:reduce){.fade{transition:none}}.fade:not(.show){opacity:0}.collapse:not(.show){display:none}.collapsing{height:0;overflow:hidden;position:relative;transition:height .35s ease}@media (prefers-reduced-motion:reduce){.collapsing{transition:none}}.collapsing.width{height:auto;transition:width .35s ease;width:0}@media (prefers-reduced-motion:reduce){.collapsing.width{transition:none}}.dropdown,.dropleft,.dropright,.dropup{position:relative}.dropdown-toggle{white-space:nowrap}.dropdown-toggle:after{border-bottom:0;border-left:.3em solid transparent;border-right:.3em solid transparent;border-top:.3em solid;content:"";display:inline-block;margin-left:.255em;vertical-align:.255em}.dropdown-toggle:empty:after{margin-left:0}.dropdown-menu{background-clip:padding-box;background-color:#374151;border:1px solid rgba(0,0,0,.15);border-radius:.25rem;color:#f3f4f6;display:none;float:left;font-size:1rem;left:0;list-style:none;margin:.125rem 0 0;min-width:10rem;padding:.5rem 0;position:absolute;text-align:left;top:100%;z-index:1000}.dropdown-menu-left{left:0;right:auto}.dropdown-menu-right{left:auto;right:0}@media (min-width:2px){.dropdown-menu-sm-left{left:0;right:auto}.dropdown-menu-sm-right{left:auto;right:0}}@media (min-width:8px){.dropdown-menu-md-left{left:0;right:auto}.dropdown-menu-md-right{left:auto;right:0}}@media (min-width:9px){.dropdown-menu-lg-left{left:0;right:auto}.dropdown-menu-lg-right{left:auto;right:0}}@media (min-width:10px){.dropdown-menu-xl-left{left:0;right:auto}.dropdown-menu-xl-right{left:auto;right:0}}.dropup .dropdown-menu{bottom:100%;margin-bottom:.125rem;margin-top:0;top:auto}.dropup .dropdown-toggle:after{border-bottom:.3em solid;border-left:.3em solid transparent;border-right:.3em solid transparent;border-top:0;content:"";display:inline-block;margin-left:.255em;vertical-align:.255em}.dropup .dropdown-toggle:empty:after{margin-left:0}.dropright .dropdown-menu{left:100%;margin-left:.125rem;margin-top:0;right:auto;top:0}.dropright .dropdown-toggle:after{border-bottom:.3em solid transparent;border-left:.3em solid;border-right:0;border-top:.3em solid transparent;content:"";display:inline-block;margin-left:.255em;vertical-align:.255em}.dropright .dropdown-toggle:empty:after{margin-left:0}.dropright .dropdown-toggle:after{vertical-align:0}.dropleft .dropdown-menu{left:auto;margin-right:.125rem;margin-top:0;right:100%;top:0}.dropleft .dropdown-toggle:after{content:"";display:inline-block;display:none;margin-left:.255em;vertical-align:.255em}.dropleft .dropdown-toggle:before{border-bottom:.3em solid transparent;border-right:.3em solid;border-top:.3em solid transparent;content:"";display:inline-block;margin-right:.255em;vertical-align:.255em}.dropleft .dropdown-toggle:empty:after{margin-left:0}.dropleft .dropdown-toggle:before{vertical-align:0}.dropdown-menu[x-placement^=bottom],.dropdown-menu[x-placement^=left],.dropdown-menu[x-placement^=right],.dropdown-menu[x-placement^=top]{bottom:auto;right:auto}.dropdown-divider{border-top:1px solid #e5e7eb;height:0;margin:.5rem 0;overflow:hidden}.dropdown-item{background-color:transparent;border:0;clear:both;color:#fff;display:block;font-weight:400;padding:.25rem 1.5rem;text-align:inherit;white-space:nowrap;width:100%}.dropdown-item:focus,.dropdown-item:hover{background-color:#e5e7eb;color:#090d15;text-decoration:none}.dropdown-item.active,.dropdown-item:active{background-color:#4040c8;color:#fff;text-decoration:none}.dropdown-item.disabled,.dropdown-item:disabled{background-color:transparent;color:#6b7280;pointer-events:none}.dropdown-menu.show{display:block}.dropdown-header{color:#4b5563;display:block;font-size:.875rem;margin-bottom:0;padding:.5rem 1.5rem;white-space:nowrap}.dropdown-item-text{color:#fff;display:block;padding:.25rem 1.5rem}.btn-group,.btn-group-vertical{display:inline-flex;position:relative;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{flex:1 1 auto;position:relative}.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:hover,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus,.btn-group>.btn:hover{z-index:1}.btn-toolbar{display:flex;flex-wrap:wrap;justify-content:flex-start}.btn-toolbar .input-group{width:auto}.btn-group>.btn-group:not(:first-child),.btn-group>.btn:not(:first-child){margin-left:-1px}.btn-group>.btn-group:not(:last-child)>.btn,.btn-group>.btn:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-top-right-radius:0}.btn-group>.btn-group:not(:first-child)>.btn,.btn-group>.btn:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.dropdown-toggle-split{padding-left:.5625rem;padding-right:.5625rem}.dropdown-toggle-split:after,.dropright .dropdown-toggle-split:after,.dropup .dropdown-toggle-split:after{margin-left:0}.dropleft .dropdown-toggle-split:before{margin-right:0}.btn-group-sm>.btn+.dropdown-toggle-split,.btn-sm+.dropdown-toggle-split{padding-left:.375rem;padding-right:.375rem}.btn-group-lg>.btn+.dropdown-toggle-split,.btn-lg+.dropdown-toggle-split{padding-left:.75rem;padding-right:.75rem}.btn-group-vertical{align-items:flex-start;flex-direction:column;justify-content:center}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group{width:100%}.btn-group-vertical>.btn-group:not(:first-child),.btn-group-vertical>.btn:not(:first-child){margin-top:-1px}.btn-group-vertical>.btn-group:not(:last-child)>.btn,.btn-group-vertical>.btn:not(:last-child):not(.dropdown-toggle){border-bottom-left-radius:0;border-bottom-right-radius:0}.btn-group-vertical>.btn-group:not(:first-child)>.btn,.btn-group-vertical>.btn:not(:first-child){border-top-left-radius:0;border-top-right-radius:0}.btn-group-toggle>.btn,.btn-group-toggle>.btn-group>.btn{margin-bottom:0}.btn-group-toggle>.btn input[type=checkbox],.btn-group-toggle>.btn input[type=radio],.btn-group-toggle>.btn-group>.btn input[type=checkbox],.btn-group-toggle>.btn-group>.btn input[type=radio]{clip:rect(0,0,0,0);pointer-events:none;position:absolute}.input-group{align-items:stretch;display:flex;flex-wrap:wrap;position:relative;width:100%}.input-group>.custom-file,.input-group>.custom-select,.input-group>.form-control,.input-group>.form-control-plaintext{flex:1 1 auto;margin-bottom:0;min-width:0;position:relative;width:1%}.input-group>.custom-file+.custom-file,.input-group>.custom-file+.custom-select,.input-group>.custom-file+.form-control,.input-group>.custom-select+.custom-file,.input-group>.custom-select+.custom-select,.input-group>.custom-select+.form-control,.input-group>.form-control+.custom-file,.input-group>.form-control+.custom-select,.input-group>.form-control+.form-control,.input-group>.form-control-plaintext+.custom-file,.input-group>.form-control-plaintext+.custom-select,.input-group>.form-control-plaintext+.form-control{margin-left:-1px}.input-group>.custom-file .custom-file-input:focus~.custom-file-label,.input-group>.custom-select:focus,.input-group>.form-control:focus{z-index:3}.input-group>.custom-file .custom-file-input:focus{z-index:4}.input-group>.custom-select:not(:first-child),.input-group>.form-control:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.input-group>.custom-file{align-items:center;display:flex}.input-group>.custom-file:not(:last-child) .custom-file-label,.input-group>.custom-file:not(:last-child) .custom-file-label:after{border-bottom-right-radius:0;border-top-right-radius:0}.input-group>.custom-file:not(:first-child) .custom-file-label{border-bottom-left-radius:0;border-top-left-radius:0}.input-group.has-validation>.custom-file:nth-last-child(n+3) .custom-file-label,.input-group.has-validation>.custom-file:nth-last-child(n+3) .custom-file-label:after,.input-group.has-validation>.custom-select:nth-last-child(n+3),.input-group.has-validation>.form-control:nth-last-child(n+3),.input-group:not(.has-validation)>.custom-file:not(:last-child) .custom-file-label,.input-group:not(.has-validation)>.custom-file:not(:last-child) .custom-file-label:after,.input-group:not(.has-validation)>.custom-select:not(:last-child),.input-group:not(.has-validation)>.form-control:not(:last-child){border-bottom-right-radius:0;border-top-right-radius:0}.input-group-append,.input-group-prepend{display:flex}.input-group-append .btn,.input-group-prepend .btn{position:relative;z-index:2}.input-group-append .btn:focus,.input-group-prepend .btn:focus{z-index:3}.input-group-append .btn+.btn,.input-group-append .btn+.input-group-text,.input-group-append .input-group-text+.btn,.input-group-append .input-group-text+.input-group-text,.input-group-prepend .btn+.btn,.input-group-prepend .btn+.input-group-text,.input-group-prepend .input-group-text+.btn,.input-group-prepend .input-group-text+.input-group-text{margin-left:-1px}.input-group-prepend{margin-right:-1px}.input-group-append{margin-left:-1px}.input-group-text{align-items:center;background-color:#e5e7eb;border:1px solid #4b5563;border-radius:.25rem;color:#e5e7eb;display:flex;font-size:1rem;font-weight:400;line-height:1.5;margin-bottom:0;padding:.375rem .75rem;text-align:center;white-space:nowrap}.input-group-text input[type=checkbox],.input-group-text input[type=radio]{margin-top:0}.input-group-lg>.custom-select,.input-group-lg>.form-control:not(textarea){height:calc(1.5em + 1rem + 2px)}.input-group-lg>.custom-select,.input-group-lg>.form-control,.input-group-lg>.input-group-append>.btn,.input-group-lg>.input-group-append>.input-group-text,.input-group-lg>.input-group-prepend>.btn,.input-group-lg>.input-group-prepend>.input-group-text{border-radius:6px;font-size:1.25rem;line-height:1.5;padding:.5rem 1rem}.input-group-sm>.custom-select,.input-group-sm>.form-control:not(textarea){height:calc(1.5em + .5rem + 2px)}.input-group-sm>.custom-select,.input-group-sm>.form-control,.input-group-sm>.input-group-append>.btn,.input-group-sm>.input-group-append>.input-group-text,.input-group-sm>.input-group-prepend>.btn,.input-group-sm>.input-group-prepend>.input-group-text{border-radius:.2rem;font-size:.875rem;line-height:1.5;padding:.25rem .5rem}.input-group-lg>.custom-select,.input-group-sm>.custom-select{padding-right:1.75rem}.input-group.has-validation>.input-group-append:nth-last-child(n+3)>.btn,.input-group.has-validation>.input-group-append:nth-last-child(n+3)>.input-group-text,.input-group:not(.has-validation)>.input-group-append:not(:last-child)>.btn,.input-group:not(.has-validation)>.input-group-append:not(:last-child)>.input-group-text,.input-group>.input-group-append:last-child>.btn:not(:last-child):not(.dropdown-toggle),.input-group>.input-group-append:last-child>.input-group-text:not(:last-child),.input-group>.input-group-prepend>.btn,.input-group>.input-group-prepend>.input-group-text{border-bottom-right-radius:0;border-top-right-radius:0}.input-group>.input-group-append>.btn,.input-group>.input-group-append>.input-group-text,.input-group>.input-group-prepend:first-child>.btn:not(:first-child),.input-group>.input-group-prepend:first-child>.input-group-text:not(:first-child),.input-group>.input-group-prepend:not(:first-child)>.btn,.input-group>.input-group-prepend:not(:first-child)>.input-group-text{border-bottom-left-radius:0;border-top-left-radius:0}.custom-control{display:block;min-height:1.5rem;padding-left:1.5rem;position:relative;-webkit-print-color-adjust:exact;print-color-adjust:exact;z-index:1}.custom-control-inline{display:inline-flex;margin-right:1rem}.custom-control-input{height:1.25rem;left:0;opacity:0;position:absolute;width:1rem;z-index:-1}.custom-control-input:checked~.custom-control-label:before{background-color:#4040c8;border-color:#4040c8;color:#fff}.custom-control-input:focus~.custom-control-label:before{box-shadow:0 0 0 .2rem rgba(64,64,200,.25)}.custom-control-input:focus:not(:checked)~.custom-control-label:before{border-color:#a3a3e5}.custom-control-input:not(:disabled):active~.custom-control-label:before{background-color:#cbcbf0;border-color:#cbcbf0;color:#fff}.custom-control-input:disabled~.custom-control-label,.custom-control-input[disabled]~.custom-control-label{color:#4b5563}.custom-control-input:disabled~.custom-control-label:before,.custom-control-input[disabled]~.custom-control-label:before{background-color:#e5e7eb}.custom-control-label{margin-bottom:0;position:relative;vertical-align:top}.custom-control-label:before{background-color:#1f2937;border:1px solid #6b7280;pointer-events:none}.custom-control-label:after,.custom-control-label:before{content:"";display:block;height:1rem;left:-1.5rem;position:absolute;top:.25rem;width:1rem}.custom-control-label:after{background:50%/50% 50% no-repeat}.custom-checkbox .custom-control-label:before{border-radius:.25rem}.custom-checkbox .custom-control-input:checked~.custom-control-label:after{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8'%3E%3Cpath fill='%23fff' d='m6.564.75-3.59 3.612-1.538-1.55L0 4.26l2.974 2.99L8 2.193z'/%3E%3C/svg%3E")}.custom-checkbox .custom-control-input:indeterminate~.custom-control-label:before{background-color:#4040c8;border-color:#4040c8}.custom-checkbox .custom-control-input:indeterminate~.custom-control-label:after{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='4' height='4'%3E%3Cpath stroke='%23fff' d='M0 2h4'/%3E%3C/svg%3E")}.custom-checkbox .custom-control-input:disabled:checked~.custom-control-label:before{background-color:rgba(64,64,200,.5)}.custom-checkbox .custom-control-input:disabled:indeterminate~.custom-control-label:before{background-color:rgba(64,64,200,.5)}.custom-radio .custom-control-label:before{border-radius:50%}.custom-radio .custom-control-input:checked~.custom-control-label:after{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='-4 -4 8 8'%3E%3Ccircle r='3' fill='%23fff'/%3E%3C/svg%3E")}.custom-radio .custom-control-input:disabled:checked~.custom-control-label:before{background-color:rgba(64,64,200,.5)}.custom-switch{padding-left:2.25rem}.custom-switch .custom-control-label:before{border-radius:.5rem;left:-2.25rem;pointer-events:all;width:1.75rem}.custom-switch .custom-control-label:after{background-color:#6b7280;border-radius:.5rem;height:calc(1rem - 4px);left:calc(-2.25rem + 2px);top:calc(.25rem + 2px);transition:transform .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;width:calc(1rem - 4px)}@media (prefers-reduced-motion:reduce){.custom-switch .custom-control-label:after{transition:none}}.custom-switch .custom-control-input:checked~.custom-control-label:after{background-color:#1f2937;transform:translateX(.75rem)}.custom-switch .custom-control-input:disabled:checked~.custom-control-label:before{background-color:rgba(64,64,200,.5)}.custom-select{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:#1f2937 url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='4' height='5'%3E%3Cpath fill='%231f2937' d='M2 0 0 2h4zm0 5L0 3h4z'/%3E%3C/svg%3E") right .75rem center/8px 10px no-repeat;border:1px solid #4b5563;border-radius:.25rem;color:#e5e7eb;display:inline-block;font-size:1rem;font-weight:400;height:calc(1.5em + .75rem + 2px);line-height:1.5;padding:.375rem 1.75rem .375rem .75rem;vertical-align:middle;width:100%}.custom-select:focus{border-color:#a3a3e5;box-shadow:0 0 0 .2rem rgba(64,64,200,.25);outline:0}.custom-select:focus::-ms-value{background-color:#1f2937;color:#e5e7eb}.custom-select[multiple],.custom-select[size]:not([size="1"]){background-image:none;height:auto;padding-right:.75rem}.custom-select:disabled{background-color:#e5e7eb;color:#4b5563}.custom-select::-ms-expand{display:none}.custom-select:-moz-focusring{color:transparent;text-shadow:0 0 0 #e5e7eb}.custom-select-sm{font-size:.875rem;height:calc(1.5em + .5rem + 2px);padding-bottom:.25rem;padding-left:.5rem;padding-top:.25rem}.custom-select-lg{font-size:1.25rem;height:calc(1.5em + 1rem + 2px);padding-bottom:.5rem;padding-left:1rem;padding-top:.5rem}.custom-file{display:inline-block;margin-bottom:0}.custom-file,.custom-file-input{height:calc(1.5em + .75rem + 2px);position:relative;width:100%}.custom-file-input{margin:0;opacity:0;overflow:hidden;z-index:2}.custom-file-input:focus~.custom-file-label{border-color:#a3a3e5;box-shadow:0 0 0 .2rem rgba(64,64,200,.25)}.custom-file-input:disabled~.custom-file-label,.custom-file-input[disabled]~.custom-file-label{background-color:#e5e7eb}.custom-file-input:lang(en)~.custom-file-label:after{content:"Browse"}.custom-file-input~.custom-file-label[data-browse]:after{content:attr(data-browse)}.custom-file-label{background-color:#1f2937;border:1px solid #4b5563;border-radius:.25rem;font-weight:400;height:calc(1.5em + .75rem + 2px);left:0;overflow:hidden;z-index:1}.custom-file-label,.custom-file-label:after{color:#e5e7eb;line-height:1.5;padding:.375rem .75rem;position:absolute;right:0;top:0}.custom-file-label:after{background-color:#e5e7eb;border-left:inherit;border-radius:0 .25rem .25rem 0;bottom:0;content:"Browse";display:block;height:calc(1.5em + .75rem);z-index:3}.custom-range{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:transparent;height:1.4rem;padding:0;width:100%}.custom-range:focus{outline:0}.custom-range:focus::-webkit-slider-thumb{box-shadow:0 0 0 1px #111827,0 0 0 .2rem rgba(64,64,200,.25)}.custom-range:focus::-moz-range-thumb{box-shadow:0 0 0 1px #111827,0 0 0 .2rem rgba(64,64,200,.25)}.custom-range:focus::-ms-thumb{box-shadow:0 0 0 1px #111827,0 0 0 .2rem rgba(64,64,200,.25)}.custom-range::-moz-focus-outer{border:0}.custom-range::-webkit-slider-thumb{-webkit-appearance:none;appearance:none;background-color:#4040c8;border:0;border-radius:1rem;height:1rem;margin-top:-.25rem;-webkit-transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;width:1rem}@media (prefers-reduced-motion:reduce){.custom-range::-webkit-slider-thumb{-webkit-transition:none;transition:none}}.custom-range::-webkit-slider-thumb:active{background-color:#cbcbf0}.custom-range::-webkit-slider-runnable-track{background-color:#d1d5db;border-color:transparent;border-radius:1rem;color:transparent;cursor:pointer;height:.5rem;width:100%}.custom-range::-moz-range-thumb{-moz-appearance:none;appearance:none;background-color:#4040c8;border:0;border-radius:1rem;height:1rem;-moz-transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;width:1rem}@media (prefers-reduced-motion:reduce){.custom-range::-moz-range-thumb{-moz-transition:none;transition:none}}.custom-range::-moz-range-thumb:active{background-color:#cbcbf0}.custom-range::-moz-range-track{background-color:#d1d5db;border-color:transparent;border-radius:1rem;color:transparent;cursor:pointer;height:.5rem;width:100%}.custom-range::-ms-thumb{appearance:none;background-color:#4040c8;border:0;border-radius:1rem;height:1rem;margin-left:.2rem;margin-right:.2rem;margin-top:0;-ms-transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;width:1rem}@media (prefers-reduced-motion:reduce){.custom-range::-ms-thumb{-ms-transition:none;transition:none}}.custom-range::-ms-thumb:active{background-color:#cbcbf0}.custom-range::-ms-track{background-color:transparent;border-color:transparent;border-width:.5rem;color:transparent;cursor:pointer;height:.5rem;width:100%}.custom-range::-ms-fill-lower,.custom-range::-ms-fill-upper{background-color:#d1d5db;border-radius:1rem}.custom-range::-ms-fill-upper{margin-right:15px}.custom-range:disabled::-webkit-slider-thumb{background-color:#6b7280}.custom-range:disabled::-webkit-slider-runnable-track{cursor:default}.custom-range:disabled::-moz-range-thumb{background-color:#6b7280}.custom-range:disabled::-moz-range-track{cursor:default}.custom-range:disabled::-ms-thumb{background-color:#6b7280}.custom-control-label:before,.custom-file-label,.custom-select{transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.custom-control-label:before,.custom-file-label,.custom-select{transition:none}}.nav{display:flex;flex-wrap:wrap;list-style:none;margin-bottom:0;padding-left:0}.nav-link{display:block;padding:.5rem 1rem}.nav-link:focus,.nav-link:hover{text-decoration:none}.nav-link.disabled{color:#4b5563;cursor:default;pointer-events:none}.nav-tabs{border-bottom:1px solid #d1d5db}.nav-tabs .nav-link{background-color:transparent;border:1px solid transparent;border-top-left-radius:.25rem;border-top-right-radius:.25rem;margin-bottom:-1px}.nav-tabs .nav-link:focus,.nav-tabs .nav-link:hover{border-color:#e5e7eb #e5e7eb #d1d5db;isolation:isolate}.nav-tabs .nav-link.disabled{background-color:transparent;border-color:transparent;color:#4b5563}.nav-tabs .nav-item.show .nav-link,.nav-tabs .nav-link.active{background-color:#111827;border-color:#d1d5db #d1d5db #111827;color:#374151}.nav-tabs .dropdown-menu{border-top-left-radius:0;border-top-right-radius:0;margin-top:-1px}.nav-pills .nav-link{background:none;border:0;border-radius:.25rem}.nav-pills .nav-link.active,.nav-pills .show>.nav-link{background-color:#1f2937;color:#fff}.nav-fill .nav-item,.nav-fill>.nav-link{flex:1 1 auto;text-align:center}.nav-justified .nav-item,.nav-justified>.nav-link{flex-basis:0;flex-grow:1;text-align:center}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.navbar{padding:.5rem 1rem;position:relative}.navbar,.navbar .container,.navbar .container-fluid,.navbar .container-lg,.navbar .container-md,.navbar .container-sm,.navbar .container-xl{align-items:center;display:flex;flex-wrap:wrap;justify-content:space-between}.navbar-brand{display:inline-block;font-size:1.25rem;line-height:inherit;margin-right:1rem;padding-bottom:.3125rem;padding-top:.3125rem;white-space:nowrap}.navbar-brand:focus,.navbar-brand:hover{text-decoration:none}.navbar-nav{display:flex;flex-direction:column;list-style:none;margin-bottom:0;padding-left:0}.navbar-nav .nav-link{padding-left:0;padding-right:0}.navbar-nav .dropdown-menu{float:none;position:static}.navbar-text{display:inline-block;padding-bottom:.5rem;padding-top:.5rem}.navbar-collapse{align-items:center;flex-basis:100%;flex-grow:1}.navbar-toggler{background-color:transparent;border:1px solid transparent;border-radius:.25rem;font-size:1.25rem;line-height:1;padding:.25rem .75rem}.navbar-toggler:focus,.navbar-toggler:hover{text-decoration:none}.navbar-toggler-icon{background:50%/100% 100% no-repeat;content:"";display:inline-block;height:1.5em;vertical-align:middle;width:1.5em}.navbar-nav-scroll{max-height:75vh;overflow-y:auto}@media (max-width:1.98px){.navbar-expand-sm>.container,.navbar-expand-sm>.container-fluid,.navbar-expand-sm>.container-lg,.navbar-expand-sm>.container-md,.navbar-expand-sm>.container-sm,.navbar-expand-sm>.container-xl{padding-left:0;padding-right:0}}@media (min-width:2px){.navbar-expand-sm{flex-flow:row nowrap;justify-content:flex-start}.navbar-expand-sm .navbar-nav{flex-direction:row}.navbar-expand-sm .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-sm .navbar-nav .nav-link{padding-left:.5rem;padding-right:.5rem}.navbar-expand-sm>.container,.navbar-expand-sm>.container-fluid,.navbar-expand-sm>.container-lg,.navbar-expand-sm>.container-md,.navbar-expand-sm>.container-sm,.navbar-expand-sm>.container-xl{flex-wrap:nowrap}.navbar-expand-sm .navbar-nav-scroll{overflow:visible}.navbar-expand-sm .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-sm .navbar-toggler{display:none}}@media (max-width:7.98px){.navbar-expand-md>.container,.navbar-expand-md>.container-fluid,.navbar-expand-md>.container-lg,.navbar-expand-md>.container-md,.navbar-expand-md>.container-sm,.navbar-expand-md>.container-xl{padding-left:0;padding-right:0}}@media (min-width:8px){.navbar-expand-md{flex-flow:row nowrap;justify-content:flex-start}.navbar-expand-md .navbar-nav{flex-direction:row}.navbar-expand-md .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-md .navbar-nav .nav-link{padding-left:.5rem;padding-right:.5rem}.navbar-expand-md>.container,.navbar-expand-md>.container-fluid,.navbar-expand-md>.container-lg,.navbar-expand-md>.container-md,.navbar-expand-md>.container-sm,.navbar-expand-md>.container-xl{flex-wrap:nowrap}.navbar-expand-md .navbar-nav-scroll{overflow:visible}.navbar-expand-md .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-md .navbar-toggler{display:none}}@media (max-width:8.98px){.navbar-expand-lg>.container,.navbar-expand-lg>.container-fluid,.navbar-expand-lg>.container-lg,.navbar-expand-lg>.container-md,.navbar-expand-lg>.container-sm,.navbar-expand-lg>.container-xl{padding-left:0;padding-right:0}}@media (min-width:9px){.navbar-expand-lg{flex-flow:row nowrap;justify-content:flex-start}.navbar-expand-lg .navbar-nav{flex-direction:row}.navbar-expand-lg .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-lg .navbar-nav .nav-link{padding-left:.5rem;padding-right:.5rem}.navbar-expand-lg>.container,.navbar-expand-lg>.container-fluid,.navbar-expand-lg>.container-lg,.navbar-expand-lg>.container-md,.navbar-expand-lg>.container-sm,.navbar-expand-lg>.container-xl{flex-wrap:nowrap}.navbar-expand-lg .navbar-nav-scroll{overflow:visible}.navbar-expand-lg .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-lg .navbar-toggler{display:none}}@media (max-width:9.98px){.navbar-expand-xl>.container,.navbar-expand-xl>.container-fluid,.navbar-expand-xl>.container-lg,.navbar-expand-xl>.container-md,.navbar-expand-xl>.container-sm,.navbar-expand-xl>.container-xl{padding-left:0;padding-right:0}}@media (min-width:10px){.navbar-expand-xl{flex-flow:row nowrap;justify-content:flex-start}.navbar-expand-xl .navbar-nav{flex-direction:row}.navbar-expand-xl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xl .navbar-nav .nav-link{padding-left:.5rem;padding-right:.5rem}.navbar-expand-xl>.container,.navbar-expand-xl>.container-fluid,.navbar-expand-xl>.container-lg,.navbar-expand-xl>.container-md,.navbar-expand-xl>.container-sm,.navbar-expand-xl>.container-xl{flex-wrap:nowrap}.navbar-expand-xl .navbar-nav-scroll{overflow:visible}.navbar-expand-xl .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-xl .navbar-toggler{display:none}}.navbar-expand{flex-flow:row nowrap;justify-content:flex-start}.navbar-expand>.container,.navbar-expand>.container-fluid,.navbar-expand>.container-lg,.navbar-expand>.container-md,.navbar-expand>.container-sm,.navbar-expand>.container-xl{padding-left:0;padding-right:0}.navbar-expand .navbar-nav{flex-direction:row}.navbar-expand .navbar-nav .dropdown-menu{position:absolute}.navbar-expand .navbar-nav .nav-link{padding-left:.5rem;padding-right:.5rem}.navbar-expand>.container,.navbar-expand>.container-fluid,.navbar-expand>.container-lg,.navbar-expand>.container-md,.navbar-expand>.container-sm,.navbar-expand>.container-xl{flex-wrap:nowrap}.navbar-expand .navbar-nav-scroll{overflow:visible}.navbar-expand .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand .navbar-toggler{display:none}.navbar-light .navbar-brand,.navbar-light .navbar-brand:focus,.navbar-light .navbar-brand:hover{color:rgba(0,0,0,.9)}.navbar-light .navbar-nav .nav-link{color:rgba(0,0,0,.5)}.navbar-light .navbar-nav .nav-link:focus,.navbar-light .navbar-nav .nav-link:hover{color:rgba(0,0,0,.7)}.navbar-light .navbar-nav .nav-link.disabled{color:rgba(0,0,0,.3)}.navbar-light .navbar-nav .active>.nav-link,.navbar-light .navbar-nav .nav-link.active,.navbar-light .navbar-nav .nav-link.show,.navbar-light .navbar-nav .show>.nav-link{color:rgba(0,0,0,.9)}.navbar-light .navbar-toggler{border-color:rgba(0,0,0,.1);color:rgba(0,0,0,.5)}.navbar-light .navbar-toggler-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='30' height='30'%3E%3Cpath stroke='rgba(0, 0, 0, 0.5)' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3E%3C/svg%3E")}.navbar-light .navbar-text{color:rgba(0,0,0,.5)}.navbar-light .navbar-text a,.navbar-light .navbar-text a:focus,.navbar-light .navbar-text a:hover{color:rgba(0,0,0,.9)}.navbar-dark .navbar-brand,.navbar-dark .navbar-brand:focus,.navbar-dark .navbar-brand:hover{color:#fff}.navbar-dark .navbar-nav .nav-link{color:hsla(0,0%,100%,.5)}.navbar-dark .navbar-nav .nav-link:focus,.navbar-dark .navbar-nav .nav-link:hover{color:hsla(0,0%,100%,.75)}.navbar-dark .navbar-nav .nav-link.disabled{color:hsla(0,0%,100%,.25)}.navbar-dark .navbar-nav .active>.nav-link,.navbar-dark .navbar-nav .nav-link.active,.navbar-dark .navbar-nav .nav-link.show,.navbar-dark .navbar-nav .show>.nav-link{color:#fff}.navbar-dark .navbar-toggler{border-color:hsla(0,0%,100%,.1);color:hsla(0,0%,100%,.5)}.navbar-dark .navbar-toggler-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='30' height='30'%3E%3Cpath stroke='rgba(255, 255, 255, 0.5)' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3E%3C/svg%3E")}.navbar-dark .navbar-text{color:hsla(0,0%,100%,.5)}.navbar-dark .navbar-text a,.navbar-dark .navbar-text a:focus,.navbar-dark .navbar-text a:hover{color:#fff}.card{word-wrap:break-word;background-clip:border-box;background-color:#1f2937;border:1px solid rgba(0,0,0,.125);border-radius:6px;display:flex;flex-direction:column;min-width:0;position:relative}.card>hr{margin-left:0;margin-right:0}.card>.list-group{border-bottom:inherit;border-top:inherit}.card>.list-group:first-child{border-top-left-radius:5px;border-top-right-radius:5px;border-top-width:0}.card>.list-group:last-child{border-bottom-left-radius:5px;border-bottom-right-radius:5px;border-bottom-width:0}.card>.card-header+.list-group,.card>.list-group+.card-footer{border-top:0}.card-body{flex:1 1 auto;min-height:1px;padding:1.25rem}.card-title{margin-bottom:.75rem}.card-subtitle{margin-top:-.375rem}.card-subtitle,.card-text:last-child{margin-bottom:0}.card-link:hover{text-decoration:none}.card-link+.card-link{margin-left:1.25rem}.card-header{background-color:#374151;border-bottom:1px solid rgba(0,0,0,.125);margin-bottom:0;padding:.75rem 1.25rem}.card-header:first-child{border-radius:5px 5px 0 0}.card-footer{background-color:#374151;border-top:1px solid rgba(0,0,0,.125);padding:.75rem 1.25rem}.card-footer:last-child{border-radius:0 0 5px 5px}.card-header-tabs{border-bottom:0;margin-bottom:-.75rem}.card-header-pills,.card-header-tabs{margin-left:-.625rem;margin-right:-.625rem}.card-img-overlay{border-radius:5px;bottom:0;left:0;padding:1.25rem;position:absolute;right:0;top:0}.card-img,.card-img-bottom,.card-img-top{flex-shrink:0;width:100%}.card-img,.card-img-top{border-top-left-radius:5px;border-top-right-radius:5px}.card-img,.card-img-bottom{border-bottom-left-radius:5px;border-bottom-right-radius:5px}.card-deck .card{margin-bottom:15px}@media (min-width:2px){.card-deck{display:flex;flex-flow:row wrap;margin-left:-15px;margin-right:-15px}.card-deck .card{flex:1 0 0%;margin-bottom:0;margin-left:15px;margin-right:15px}}.card-group>.card{margin-bottom:15px}@media (min-width:2px){.card-group{display:flex;flex-flow:row wrap}.card-group>.card{flex:1 0 0%;margin-bottom:0}.card-group>.card+.card{border-left:0;margin-left:0}.card-group>.card:not(:last-child){border-bottom-right-radius:0;border-top-right-radius:0}.card-group>.card:not(:last-child) .card-header,.card-group>.card:not(:last-child) .card-img-top{border-top-right-radius:0}.card-group>.card:not(:last-child) .card-footer,.card-group>.card:not(:last-child) .card-img-bottom{border-bottom-right-radius:0}.card-group>.card:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.card-group>.card:not(:first-child) .card-header,.card-group>.card:not(:first-child) .card-img-top{border-top-left-radius:0}.card-group>.card:not(:first-child) .card-footer,.card-group>.card:not(:first-child) .card-img-bottom{border-bottom-left-radius:0}}.card-columns .card{margin-bottom:.75rem}@media (min-width:2px){.card-columns{-moz-column-count:3;column-count:3;-moz-column-gap:1.25rem;column-gap:1.25rem;orphans:1;widows:1}.card-columns .card{display:inline-block;width:100%}}.accordion{overflow-anchor:none}.accordion>.card{overflow:hidden}.accordion>.card:not(:last-of-type){border-bottom:0;border-bottom-left-radius:0;border-bottom-right-radius:0}.accordion>.card:not(:first-of-type){border-top-left-radius:0;border-top-right-radius:0}.accordion>.card>.card-header{border-radius:0;margin-bottom:-1px}.breadcrumb{background-color:#e5e7eb;border-radius:.25rem;display:flex;flex-wrap:wrap;list-style:none;margin-bottom:1rem;padding:.75rem 1rem}.breadcrumb-item+.breadcrumb-item{padding-left:.5rem}.breadcrumb-item+.breadcrumb-item:before{color:#4b5563;content:"/";float:left;padding-right:.5rem}.breadcrumb-item+.breadcrumb-item:hover:before{text-decoration:underline;text-decoration:none}.breadcrumb-item.active{color:#4b5563}.pagination{border-radius:.25rem;display:flex;list-style:none;padding-left:0}.page-link{background-color:#fff;border:1px solid #d1d5db;color:#818cf8;display:block;line-height:1.25;margin-left:-1px;padding:.5rem .75rem;position:relative}.page-link:hover{background-color:#e5e7eb;border-color:#d1d5db;color:#a5b4fc;text-decoration:none;z-index:2}.page-link:focus{box-shadow:0 0 0 .2rem rgba(64,64,200,.25);outline:0;z-index:3}.page-item:first-child .page-link{border-bottom-left-radius:.25rem;border-top-left-radius:.25rem;margin-left:0}.page-item:last-child .page-link{border-bottom-right-radius:.25rem;border-top-right-radius:.25rem}.page-item.active .page-link{background-color:#4040c8;border-color:#4040c8;color:#fff;z-index:3}.page-item.disabled .page-link{background-color:#fff;border-color:#d1d5db;color:#4b5563;cursor:auto;pointer-events:none}.pagination-lg .page-link{font-size:1.25rem;line-height:1.5;padding:.75rem 1.5rem}.pagination-lg .page-item:first-child .page-link{border-bottom-left-radius:6px;border-top-left-radius:6px}.pagination-lg .page-item:last-child .page-link{border-bottom-right-radius:6px;border-top-right-radius:6px}.pagination-sm .page-link{font-size:.875rem;line-height:1.5;padding:.25rem .5rem}.pagination-sm .page-item:first-child .page-link{border-bottom-left-radius:.2rem;border-top-left-radius:.2rem}.pagination-sm .page-item:last-child .page-link{border-bottom-right-radius:.2rem;border-top-right-radius:.2rem}.badge{border-radius:.25rem;display:inline-block;font-size:.875rem;font-weight:600;line-height:1;padding:.25em .4em;text-align:center;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;vertical-align:baseline;white-space:nowrap}@media (prefers-reduced-motion:reduce){.badge{transition:none}}a.badge:focus,a.badge:hover{text-decoration:none}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.badge-pill{border-radius:10rem;padding-left:.6em;padding-right:.6em}.badge-primary{background-color:#4040c8;color:#fff}a.badge-primary:focus,a.badge-primary:hover{background-color:#3030a5;color:#fff}a.badge-primary.focus,a.badge-primary:focus{box-shadow:0 0 0 .2rem rgba(64,64,200,.5);outline:0}.badge-secondary{background-color:#4b5563;color:#fff}a.badge-secondary:focus,a.badge-secondary:hover{background-color:#353c46;color:#fff}a.badge-secondary.focus,a.badge-secondary:focus{box-shadow:0 0 0 .2rem rgba(75,85,99,.5);outline:0}.badge-success{background-color:#059669}a.badge-success:focus,a.badge-success:hover{background-color:#036546;color:#fff}a.badge-success.focus,a.badge-success:focus{box-shadow:0 0 0 .2rem rgba(5,150,105,.5);outline:0}.badge-info{background-color:#2563eb}a.badge-info:focus,a.badge-info:hover{background-color:#134cca;color:#fff}a.badge-info.focus,a.badge-info:focus{box-shadow:0 0 0 .2rem rgba(37,99,235,.5);outline:0}.badge-warning{background-color:#d97706}a.badge-warning:focus,a.badge-warning:hover{background-color:#a75c05;color:#fff}a.badge-warning.focus,a.badge-warning:focus{box-shadow:0 0 0 .2rem rgba(217,119,6,.5);outline:0}.badge-danger{background-color:#dc2626}a.badge-danger:focus,a.badge-danger:hover{background-color:#b21d1d;color:#fff}a.badge-danger.focus,a.badge-danger:focus{box-shadow:0 0 0 .2rem rgba(220,38,38,.5);outline:0}.badge-light{background-color:#f3f4f6;color:#111827}a.badge-light:focus,a.badge-light:hover{background-color:#d6d9e0;color:#111827}a.badge-light.focus,a.badge-light:focus{box-shadow:0 0 0 .2rem rgba(243,244,246,.5);outline:0}.badge-dark{background-color:#1f2937;color:#fff}a.badge-dark:focus,a.badge-dark:hover{background-color:#0d1116;color:#fff}a.badge-dark.focus,a.badge-dark:focus{box-shadow:0 0 0 .2rem rgba(31,41,55,.5);outline:0}.jumbotron{background-color:#e5e7eb;border-radius:6px;margin-bottom:2rem;padding:2rem 1rem}@media (min-width:2px){.jumbotron{padding:4rem 2rem}}.jumbotron-fluid{border-radius:0;padding-left:0;padding-right:0}.alert{border:1px solid transparent;border-radius:.25rem;margin-bottom:1rem;padding:.75rem 1.25rem;position:relative}.alert-heading{color:inherit}.alert-link{font-weight:600}.alert-dismissible{padding-right:4rem}.alert-dismissible .close{color:inherit;padding:.75rem 1.25rem;position:absolute;right:0;top:0;z-index:2}.alert-primary{background-color:#d9d9f4;border-color:#cacaf0;color:#212168}.alert-primary hr{border-top-color:#b6b6ea}.alert-primary .alert-link{color:#151541}.alert-secondary{background-color:#dbdde0;border-color:#cdcfd3;color:#272c33}.alert-secondary hr{border-top-color:#bfc2c7}.alert-secondary .alert-link{color:#111316}.alert-success{background-color:#cdeae1;border-color:#b9e2d5;color:#034e37}.alert-success hr{border-top-color:#a7dbca}.alert-success .alert-link{color:#011d14}.alert-info{background-color:#d3e0fb;border-color:#c2d3f9;color:#13337a}.alert-info hr{border-top-color:#abc2f7}.alert-info .alert-link{color:#0c214e}.alert-warning{background-color:#f7e4cd;border-color:#f4d9b9;color:#713e03}.alert-warning hr{border-top-color:#f1cda3}.alert-warning .alert-link{color:#3f2302}.alert-danger{background-color:#f8d4d4;border-color:#f5c2c2;color:#721414}.alert-danger hr{border-top-color:#f1acac}.alert-danger .alert-link{color:#470c0c}.alert-light{background-color:#fdfdfd;border-color:#fcfcfc;color:#7e7f80}.alert-light hr{border-top-color:#efefef}.alert-light .alert-link{color:#656666}.alert-dark{background-color:#d2d4d7;border-color:#c0c3c7;color:#10151d}.alert-dark hr{border-top-color:#b3b6bb}.alert-dark .alert-link{color:#000}@keyframes progress-bar-stripes{0%{background-position:1rem 0}to{background-position:0 0}}.progress{background-color:#e5e7eb;border-radius:.25rem;font-size:.75rem;height:1rem;line-height:0}.progress,.progress-bar{display:flex;overflow:hidden}.progress-bar{background-color:#4040c8;color:#fff;flex-direction:column;justify-content:center;text-align:center;transition:width .6s ease;white-space:nowrap}@media (prefers-reduced-motion:reduce){.progress-bar{transition:none}}.progress-bar-striped{background-image:linear-gradient(45deg,hsla(0,0%,100%,.15) 25%,transparent 0,transparent 50%,hsla(0,0%,100%,.15) 0,hsla(0,0%,100%,.15) 75%,transparent 0,transparent);background-size:1rem 1rem}.progress-bar-animated{animation:progress-bar-stripes 1s linear infinite}@media (prefers-reduced-motion:reduce){.progress-bar-animated{animation:none}}.media{align-items:flex-start;display:flex}.media-body{flex:1}.list-group{border-radius:.25rem;display:flex;flex-direction:column;margin-bottom:0;padding-left:0}.list-group-item-action{color:#374151;text-align:inherit;width:100%}.list-group-item-action:focus,.list-group-item-action:hover{background-color:#f3f4f6;color:#374151;text-decoration:none;z-index:1}.list-group-item-action:active{background-color:#e5e7eb;color:#f3f4f6}.list-group-item{background-color:#fff;border:1px solid rgba(0,0,0,.125);display:block;padding:.75rem 1.25rem;position:relative}.list-group-item:first-child{border-top-left-radius:inherit;border-top-right-radius:inherit}.list-group-item:last-child{border-bottom-left-radius:inherit;border-bottom-right-radius:inherit}.list-group-item.disabled,.list-group-item:disabled{background-color:#fff;color:#4b5563;pointer-events:none}.list-group-item.active{background-color:#4040c8;border-color:#4040c8;color:#fff;z-index:2}.list-group-item+.list-group-item{border-top-width:0}.list-group-item+.list-group-item.active{border-top-width:1px;margin-top:-1px}.list-group-horizontal{flex-direction:row}.list-group-horizontal>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal>.list-group-item:last-child{border-bottom-left-radius:0;border-top-right-radius:.25rem}.list-group-horizontal>.list-group-item.active{margin-top:0}.list-group-horizontal>.list-group-item+.list-group-item{border-left-width:0;border-top-width:1px}.list-group-horizontal>.list-group-item+.list-group-item.active{border-left-width:1px;margin-left:-1px}@media (min-width:2px){.list-group-horizontal-sm{flex-direction:row}.list-group-horizontal-sm>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-sm>.list-group-item:last-child{border-bottom-left-radius:0;border-top-right-radius:.25rem}.list-group-horizontal-sm>.list-group-item.active{margin-top:0}.list-group-horizontal-sm>.list-group-item+.list-group-item{border-left-width:0;border-top-width:1px}.list-group-horizontal-sm>.list-group-item+.list-group-item.active{border-left-width:1px;margin-left:-1px}}@media (min-width:8px){.list-group-horizontal-md{flex-direction:row}.list-group-horizontal-md>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-md>.list-group-item:last-child{border-bottom-left-radius:0;border-top-right-radius:.25rem}.list-group-horizontal-md>.list-group-item.active{margin-top:0}.list-group-horizontal-md>.list-group-item+.list-group-item{border-left-width:0;border-top-width:1px}.list-group-horizontal-md>.list-group-item+.list-group-item.active{border-left-width:1px;margin-left:-1px}}@media (min-width:9px){.list-group-horizontal-lg{flex-direction:row}.list-group-horizontal-lg>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-lg>.list-group-item:last-child{border-bottom-left-radius:0;border-top-right-radius:.25rem}.list-group-horizontal-lg>.list-group-item.active{margin-top:0}.list-group-horizontal-lg>.list-group-item+.list-group-item{border-left-width:0;border-top-width:1px}.list-group-horizontal-lg>.list-group-item+.list-group-item.active{border-left-width:1px;margin-left:-1px}}@media (min-width:10px){.list-group-horizontal-xl{flex-direction:row}.list-group-horizontal-xl>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-xl>.list-group-item:last-child{border-bottom-left-radius:0;border-top-right-radius:.25rem}.list-group-horizontal-xl>.list-group-item.active{margin-top:0}.list-group-horizontal-xl>.list-group-item+.list-group-item{border-left-width:0;border-top-width:1px}.list-group-horizontal-xl>.list-group-item+.list-group-item.active{border-left-width:1px;margin-left:-1px}}.list-group-flush{border-radius:0}.list-group-flush>.list-group-item{border-width:0 0 1px}.list-group-flush>.list-group-item:last-child{border-bottom-width:0}.list-group-item-primary{background-color:#cacaf0;color:#212168}.list-group-item-primary.list-group-item-action:focus,.list-group-item-primary.list-group-item-action:hover{background-color:#b6b6ea;color:#212168}.list-group-item-primary.list-group-item-action.active{background-color:#212168;border-color:#212168;color:#fff}.list-group-item-secondary{background-color:#cdcfd3;color:#272c33}.list-group-item-secondary.list-group-item-action:focus,.list-group-item-secondary.list-group-item-action:hover{background-color:#bfc2c7;color:#272c33}.list-group-item-secondary.list-group-item-action.active{background-color:#272c33;border-color:#272c33;color:#fff}.list-group-item-success{background-color:#b9e2d5;color:#034e37}.list-group-item-success.list-group-item-action:focus,.list-group-item-success.list-group-item-action:hover{background-color:#a7dbca;color:#034e37}.list-group-item-success.list-group-item-action.active{background-color:#034e37;border-color:#034e37;color:#fff}.list-group-item-info{background-color:#c2d3f9;color:#13337a}.list-group-item-info.list-group-item-action:focus,.list-group-item-info.list-group-item-action:hover{background-color:#abc2f7;color:#13337a}.list-group-item-info.list-group-item-action.active{background-color:#13337a;border-color:#13337a;color:#fff}.list-group-item-warning{background-color:#f4d9b9;color:#713e03}.list-group-item-warning.list-group-item-action:focus,.list-group-item-warning.list-group-item-action:hover{background-color:#f1cda3;color:#713e03}.list-group-item-warning.list-group-item-action.active{background-color:#713e03;border-color:#713e03;color:#fff}.list-group-item-danger{background-color:#f5c2c2;color:#721414}.list-group-item-danger.list-group-item-action:focus,.list-group-item-danger.list-group-item-action:hover{background-color:#f1acac;color:#721414}.list-group-item-danger.list-group-item-action.active{background-color:#721414;border-color:#721414;color:#fff}.list-group-item-light{background-color:#fcfcfc;color:#7e7f80}.list-group-item-light.list-group-item-action:focus,.list-group-item-light.list-group-item-action:hover{background-color:#efefef;color:#7e7f80}.list-group-item-light.list-group-item-action.active{background-color:#7e7f80;border-color:#7e7f80;color:#fff}.list-group-item-dark{background-color:#c0c3c7;color:#10151d}.list-group-item-dark.list-group-item-action:focus,.list-group-item-dark.list-group-item-action:hover{background-color:#b3b6bb;color:#10151d}.list-group-item-dark.list-group-item-action.active{background-color:#10151d;border-color:#10151d;color:#fff}.close{color:#000;float:right;font-size:1.5rem;font-weight:600;line-height:1;opacity:.5;text-shadow:0 1px 0 #fff}.close:hover{color:#000;text-decoration:none}.close:not(:disabled):not(.disabled):focus,.close:not(:disabled):not(.disabled):hover{opacity:.75}button.close{background-color:transparent;border:0;padding:0}a.close.disabled{pointer-events:none}.toast{background-clip:padding-box;background-color:hsla(0,0%,100%,.85);border:1px solid rgba(0,0,0,.1);border-radius:.25rem;box-shadow:0 .25rem .75rem rgba(0,0,0,.1);flex-basis:350px;font-size:.875rem;max-width:350px;opacity:0}.toast:not(:last-child){margin-bottom:.75rem}.toast.showing{opacity:1}.toast.show{display:block;opacity:1}.toast.hide{display:none}.toast-header{align-items:center;background-clip:padding-box;background-color:hsla(0,0%,100%,.85);border-bottom:1px solid rgba(0,0,0,.05);border-top-left-radius:calc(.25rem - 1px);border-top-right-radius:calc(.25rem - 1px);color:#4b5563;display:flex;padding:.25rem .75rem}.toast-body{padding:.75rem}.modal-open{overflow:hidden}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal{display:none;height:100%;left:0;outline:0;overflow:hidden;position:fixed;top:0;width:100%;z-index:1050}.modal-dialog{margin:.5rem;pointer-events:none;position:relative;width:auto}.modal.fade .modal-dialog{transform:translateY(-50px);transition:transform .3s ease-out}@media (prefers-reduced-motion:reduce){.modal.fade .modal-dialog{transition:none}}.modal.show .modal-dialog{transform:none}.modal.modal-static .modal-dialog{transform:scale(1.02)}.modal-dialog-scrollable{display:flex;max-height:calc(100% - 1rem)}.modal-dialog-scrollable .modal-content{max-height:calc(100vh - 1rem);overflow:hidden}.modal-dialog-scrollable .modal-footer,.modal-dialog-scrollable .modal-header{flex-shrink:0}.modal-dialog-scrollable .modal-body{overflow-y:auto}.modal-dialog-centered{align-items:center;display:flex;min-height:calc(100% - 1rem)}.modal-dialog-centered:before{content:"";display:block;height:calc(100vh - 1rem);height:-moz-min-content;height:min-content}.modal-dialog-centered.modal-dialog-scrollable{flex-direction:column;height:100%;justify-content:center}.modal-dialog-centered.modal-dialog-scrollable .modal-content{max-height:none}.modal-dialog-centered.modal-dialog-scrollable:before{content:none}.modal-content{background-clip:padding-box;background-color:#1f2937;border:1px solid rgba(0,0,0,.2);border-radius:6px;display:flex;flex-direction:column;outline:0;pointer-events:auto;position:relative;width:100%}.modal-backdrop{background-color:#4b5563;height:100vh;left:0;position:fixed;top:0;width:100vw;z-index:1040}.modal-backdrop.fade{opacity:0}.modal-backdrop.show{opacity:.5}.modal-header{align-items:flex-start;border-bottom:1px solid #4b5563;border-top-left-radius:5px;border-top-right-radius:5px;display:flex;justify-content:space-between;padding:1rem}.modal-header .close{margin:-1rem -1rem -1rem auto;padding:1rem}.modal-title{line-height:1.5;margin-bottom:0}.modal-body{flex:1 1 auto;padding:1rem;position:relative}.modal-footer{align-items:center;border-bottom-left-radius:5px;border-bottom-right-radius:5px;border-top:1px solid #4b5563;display:flex;flex-wrap:wrap;justify-content:flex-end;padding:.75rem}.modal-footer>*{margin:.25rem}.modal-scrollbar-measure{height:50px;overflow:scroll;position:absolute;top:-9999px;width:50px}@media (min-width:2px){.modal-dialog{margin:1.75rem auto;max-width:500px}.modal-dialog-scrollable{max-height:calc(100% - 3.5rem)}.modal-dialog-scrollable .modal-content{max-height:calc(100vh - 3.5rem)}.modal-dialog-centered{min-height:calc(100% - 3.5rem)}.modal-dialog-centered:before{height:calc(100vh - 3.5rem);height:-moz-min-content;height:min-content}.modal-sm{max-width:300px}}@media (min-width:9px){.modal-lg,.modal-xl{max-width:800px}}@media (min-width:10px){.modal-xl{max-width:1140px}}.tooltip{word-wrap:break-word;display:block;font-family:Figtree,sans-serif;font-size:.875rem;font-style:normal;font-weight:400;letter-spacing:normal;line-break:auto;line-height:1.5;margin:0;opacity:0;position:absolute;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;white-space:normal;word-break:normal;word-spacing:normal;z-index:1070}.tooltip.show{opacity:.9}.tooltip .arrow{display:block;height:.4rem;position:absolute;width:.8rem}.tooltip .arrow:before{border-color:transparent;border-style:solid;content:"";position:absolute}.bs-tooltip-auto[x-placement^=top],.bs-tooltip-top{padding:.4rem 0}.bs-tooltip-auto[x-placement^=top] .arrow,.bs-tooltip-top .arrow{bottom:0}.bs-tooltip-auto[x-placement^=top] .arrow:before,.bs-tooltip-top .arrow:before{border-top-color:#000;border-width:.4rem .4rem 0;top:0}.bs-tooltip-auto[x-placement^=right],.bs-tooltip-right{padding:0 .4rem}.bs-tooltip-auto[x-placement^=right] .arrow,.bs-tooltip-right .arrow{height:.8rem;left:0;width:.4rem}.bs-tooltip-auto[x-placement^=right] .arrow:before,.bs-tooltip-right .arrow:before{border-right-color:#000;border-width:.4rem .4rem .4rem 0;right:0}.bs-tooltip-auto[x-placement^=bottom],.bs-tooltip-bottom{padding:.4rem 0}.bs-tooltip-auto[x-placement^=bottom] .arrow,.bs-tooltip-bottom .arrow{top:0}.bs-tooltip-auto[x-placement^=bottom] .arrow:before,.bs-tooltip-bottom .arrow:before{border-bottom-color:#000;border-width:0 .4rem .4rem;bottom:0}.bs-tooltip-auto[x-placement^=left],.bs-tooltip-left{padding:0 .4rem}.bs-tooltip-auto[x-placement^=left] .arrow,.bs-tooltip-left .arrow{height:.8rem;right:0;width:.4rem}.bs-tooltip-auto[x-placement^=left] .arrow:before,.bs-tooltip-left .arrow:before{border-left-color:#000;border-width:.4rem 0 .4rem .4rem;left:0}.tooltip-inner{background-color:#000;border-radius:.25rem;color:#fff;max-width:200px;padding:.25rem .5rem;text-align:center}.popover{word-wrap:break-word;background-clip:padding-box;background-color:#fff;border:1px solid rgba(0,0,0,.2);border-radius:6px;font-family:Figtree,sans-serif;font-size:.875rem;font-style:normal;font-weight:400;left:0;letter-spacing:normal;line-break:auto;line-height:1.5;max-width:276px;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;top:0;white-space:normal;word-break:normal;word-spacing:normal;z-index:1060}.popover,.popover .arrow{display:block;position:absolute}.popover .arrow{height:.5rem;margin:0 6px;width:1rem}.popover .arrow:after,.popover .arrow:before{border-color:transparent;border-style:solid;content:"";display:block;position:absolute}.bs-popover-auto[x-placement^=top],.bs-popover-top{margin-bottom:.5rem}.bs-popover-auto[x-placement^=top]>.arrow,.bs-popover-top>.arrow{bottom:calc(-.5rem - 1px)}.bs-popover-auto[x-placement^=top]>.arrow:before,.bs-popover-top>.arrow:before{border-top-color:rgba(0,0,0,.25);border-width:.5rem .5rem 0;bottom:0}.bs-popover-auto[x-placement^=top]>.arrow:after,.bs-popover-top>.arrow:after{border-top-color:#fff;border-width:.5rem .5rem 0;bottom:1px}.bs-popover-auto[x-placement^=right],.bs-popover-right{margin-left:.5rem}.bs-popover-auto[x-placement^=right]>.arrow,.bs-popover-right>.arrow{height:1rem;left:calc(-.5rem - 1px);margin:6px 0;width:.5rem}.bs-popover-auto[x-placement^=right]>.arrow:before,.bs-popover-right>.arrow:before{border-right-color:rgba(0,0,0,.25);border-width:.5rem .5rem .5rem 0;left:0}.bs-popover-auto[x-placement^=right]>.arrow:after,.bs-popover-right>.arrow:after{border-right-color:#fff;border-width:.5rem .5rem .5rem 0;left:1px}.bs-popover-auto[x-placement^=bottom],.bs-popover-bottom{margin-top:.5rem}.bs-popover-auto[x-placement^=bottom]>.arrow,.bs-popover-bottom>.arrow{top:calc(-.5rem - 1px)}.bs-popover-auto[x-placement^=bottom]>.arrow:before,.bs-popover-bottom>.arrow:before{border-bottom-color:rgba(0,0,0,.25);border-width:0 .5rem .5rem;top:0}.bs-popover-auto[x-placement^=bottom]>.arrow:after,.bs-popover-bottom>.arrow:after{border-bottom-color:#fff;border-width:0 .5rem .5rem;top:1px}.bs-popover-auto[x-placement^=bottom] .popover-header:before,.bs-popover-bottom .popover-header:before{border-bottom:1px solid #f7f7f7;content:"";display:block;left:50%;margin-left:-.5rem;position:absolute;top:0;width:1rem}.bs-popover-auto[x-placement^=left],.bs-popover-left{margin-right:.5rem}.bs-popover-auto[x-placement^=left]>.arrow,.bs-popover-left>.arrow{height:1rem;margin:6px 0;right:calc(-.5rem - 1px);width:.5rem}.bs-popover-auto[x-placement^=left]>.arrow:before,.bs-popover-left>.arrow:before{border-left-color:rgba(0,0,0,.25);border-width:.5rem 0 .5rem .5rem;right:0}.bs-popover-auto[x-placement^=left]>.arrow:after,.bs-popover-left>.arrow:after{border-left-color:#fff;border-width:.5rem 0 .5rem .5rem;right:1px}.popover-header{background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-top-left-radius:5px;border-top-right-radius:5px;font-size:1rem;margin-bottom:0;padding:.5rem .75rem}.popover-header:empty{display:none}.popover-body{color:#f3f4f6;padding:.5rem .75rem}.carousel{position:relative}.carousel.pointer-event{touch-action:pan-y}.carousel-inner{overflow:hidden;position:relative;width:100%}.carousel-inner:after{clear:both;content:"";display:block}.carousel-item{backface-visibility:hidden;display:none;float:left;margin-right:-100%;position:relative;transition:transform .6s ease-in-out;width:100%}@media (prefers-reduced-motion:reduce){.carousel-item{transition:none}}.carousel-item-next,.carousel-item-prev,.carousel-item.active{display:block}.active.carousel-item-right,.carousel-item-next:not(.carousel-item-left){transform:translateX(100%)}.active.carousel-item-left,.carousel-item-prev:not(.carousel-item-right){transform:translateX(-100%)}.carousel-fade .carousel-item{opacity:0;transform:none;transition-property:opacity}.carousel-fade .carousel-item-next.carousel-item-left,.carousel-fade .carousel-item-prev.carousel-item-right,.carousel-fade .carousel-item.active{opacity:1;z-index:1}.carousel-fade .active.carousel-item-left,.carousel-fade .active.carousel-item-right{opacity:0;transition:opacity 0s .6s;z-index:0}@media (prefers-reduced-motion:reduce){.carousel-fade .active.carousel-item-left,.carousel-fade .active.carousel-item-right{transition:none}}.carousel-control-next,.carousel-control-prev{align-items:center;background:none;border:0;bottom:0;color:#fff;display:flex;justify-content:center;opacity:.5;padding:0;position:absolute;text-align:center;top:0;transition:opacity .15s ease;width:15%;z-index:1}@media (prefers-reduced-motion:reduce){.carousel-control-next,.carousel-control-prev{transition:none}}.carousel-control-next:focus,.carousel-control-next:hover,.carousel-control-prev:focus,.carousel-control-prev:hover{color:#fff;opacity:.9;outline:0;text-decoration:none}.carousel-control-prev{left:0}.carousel-control-next{right:0}.carousel-control-next-icon,.carousel-control-prev-icon{background:50%/100% 100% no-repeat;display:inline-block;height:20px;width:20px}.carousel-control-prev-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' width='8' height='8'%3E%3Cpath d='m5.25 0-4 4 4 4 1.5-1.5L4.25 4l2.5-2.5L5.25 0z'/%3E%3C/svg%3E")}.carousel-control-next-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' width='8' height='8'%3E%3Cpath d='m2.75 0-1.5 1.5L3.75 4l-2.5 2.5L2.75 8l4-4-4-4z'/%3E%3C/svg%3E")}.carousel-indicators{bottom:0;display:flex;justify-content:center;left:0;list-style:none;margin-left:15%;margin-right:15%;padding-left:0;position:absolute;right:0;z-index:15}.carousel-indicators li{background-clip:padding-box;background-color:#fff;border-bottom:10px solid transparent;border-top:10px solid transparent;box-sizing:content-box;cursor:pointer;flex:0 1 auto;height:3px;margin-left:3px;margin-right:3px;opacity:.5;text-indent:-999px;transition:opacity .6s ease;width:30px}@media (prefers-reduced-motion:reduce){.carousel-indicators li{transition:none}}.carousel-indicators .active{opacity:1}.carousel-caption{bottom:20px;color:#fff;left:15%;padding-bottom:20px;padding-top:20px;position:absolute;right:15%;text-align:center;z-index:10}@keyframes spinner-border{to{transform:rotate(1turn)}}.spinner-border{animation:spinner-border .75s linear infinite;border:.25em solid;border-radius:50%;border-right:.25em solid transparent;display:inline-block;height:2rem;vertical-align:-.125em;width:2rem}.spinner-border-sm{border-width:.2em;height:1rem;width:1rem}@keyframes spinner-grow{0%{transform:scale(0)}50%{opacity:1;transform:none}}.spinner-grow{animation:spinner-grow .75s linear infinite;background-color:currentcolor;border-radius:50%;display:inline-block;height:2rem;opacity:0;vertical-align:-.125em;width:2rem}.spinner-grow-sm{height:1rem;width:1rem}@media (prefers-reduced-motion:reduce){.spinner-border,.spinner-grow{animation-duration:1.5s}}.align-baseline{vertical-align:baseline!important}.align-top{vertical-align:top!important}.align-middle{vertical-align:middle!important}.align-bottom{vertical-align:bottom!important}.align-text-bottom{vertical-align:text-bottom!important}.align-text-top{vertical-align:text-top!important}.bg-primary{background-color:#4040c8!important}a.bg-primary:focus,a.bg-primary:hover,button.bg-primary:focus,button.bg-primary:hover{background-color:#3030a5!important}.bg-secondary{background-color:#4b5563!important}a.bg-secondary:focus,a.bg-secondary:hover,button.bg-secondary:focus,button.bg-secondary:hover{background-color:#353c46!important}.bg-success{background-color:#059669!important}a.bg-success:focus,a.bg-success:hover,button.bg-success:focus,button.bg-success:hover{background-color:#036546!important}.bg-info{background-color:#2563eb!important}a.bg-info:focus,a.bg-info:hover,button.bg-info:focus,button.bg-info:hover{background-color:#134cca!important}.bg-warning{background-color:#d97706!important}a.bg-warning:focus,a.bg-warning:hover,button.bg-warning:focus,button.bg-warning:hover{background-color:#a75c05!important}.bg-danger{background-color:#dc2626!important}a.bg-danger:focus,a.bg-danger:hover,button.bg-danger:focus,button.bg-danger:hover{background-color:#b21d1d!important}.bg-light{background-color:#f3f4f6!important}a.bg-light:focus,a.bg-light:hover,button.bg-light:focus,button.bg-light:hover{background-color:#d6d9e0!important}.bg-dark{background-color:#1f2937!important}a.bg-dark:focus,a.bg-dark:hover,button.bg-dark:focus,button.bg-dark:hover{background-color:#0d1116!important}.bg-white{background-color:#fff!important}.bg-transparent{background-color:transparent!important}.border{border:1px solid #4b5563!important}.border-top{border-top:1px solid #4b5563!important}.border-right{border-right:1px solid #4b5563!important}.border-bottom{border-bottom:1px solid #4b5563!important}.border-left{border-left:1px solid #4b5563!important}.border-0{border:0!important}.border-top-0{border-top:0!important}.border-right-0{border-right:0!important}.border-bottom-0{border-bottom:0!important}.border-left-0{border-left:0!important}.border-primary{border-color:#4040c8!important}.border-secondary{border-color:#4b5563!important}.border-success{border-color:#059669!important}.border-info{border-color:#2563eb!important}.border-warning{border-color:#d97706!important}.border-danger{border-color:#dc2626!important}.border-light{border-color:#f3f4f6!important}.border-dark{border-color:#1f2937!important}.border-white{border-color:#fff!important}.rounded-sm{border-radius:.2rem!important}.rounded{border-radius:.25rem!important}.rounded-top{border-top-left-radius:.25rem!important}.rounded-right,.rounded-top{border-top-right-radius:.25rem!important}.rounded-bottom,.rounded-right{border-bottom-right-radius:.25rem!important}.rounded-bottom,.rounded-left{border-bottom-left-radius:.25rem!important}.rounded-left{border-top-left-radius:.25rem!important}.rounded-lg{border-radius:6px!important}.rounded-circle{border-radius:50%!important}.rounded-pill{border-radius:50rem!important}.rounded-0{border-radius:0!important}.clearfix:after{clear:both;content:"";display:block}.d-none{display:none!important}.d-inline{display:inline!important}.d-inline-block{display:inline-block!important}.d-block{display:block!important}.d-table{display:table!important}.d-table-row{display:table-row!important}.d-table-cell{display:table-cell!important}.d-flex{display:flex!important}.d-inline-flex{display:inline-flex!important}@media (min-width:2px){.d-sm-none{display:none!important}.d-sm-inline{display:inline!important}.d-sm-inline-block{display:inline-block!important}.d-sm-block{display:block!important}.d-sm-table{display:table!important}.d-sm-table-row{display:table-row!important}.d-sm-table-cell{display:table-cell!important}.d-sm-flex{display:flex!important}.d-sm-inline-flex{display:inline-flex!important}}@media (min-width:8px){.d-md-none{display:none!important}.d-md-inline{display:inline!important}.d-md-inline-block{display:inline-block!important}.d-md-block{display:block!important}.d-md-table{display:table!important}.d-md-table-row{display:table-row!important}.d-md-table-cell{display:table-cell!important}.d-md-flex{display:flex!important}.d-md-inline-flex{display:inline-flex!important}}@media (min-width:9px){.d-lg-none{display:none!important}.d-lg-inline{display:inline!important}.d-lg-inline-block{display:inline-block!important}.d-lg-block{display:block!important}.d-lg-table{display:table!important}.d-lg-table-row{display:table-row!important}.d-lg-table-cell{display:table-cell!important}.d-lg-flex{display:flex!important}.d-lg-inline-flex{display:inline-flex!important}}@media (min-width:10px){.d-xl-none{display:none!important}.d-xl-inline{display:inline!important}.d-xl-inline-block{display:inline-block!important}.d-xl-block{display:block!important}.d-xl-table{display:table!important}.d-xl-table-row{display:table-row!important}.d-xl-table-cell{display:table-cell!important}.d-xl-flex{display:flex!important}.d-xl-inline-flex{display:inline-flex!important}}@media print{.d-print-none{display:none!important}.d-print-inline{display:inline!important}.d-print-inline-block{display:inline-block!important}.d-print-block{display:block!important}.d-print-table{display:table!important}.d-print-table-row{display:table-row!important}.d-print-table-cell{display:table-cell!important}.d-print-flex{display:flex!important}.d-print-inline-flex{display:inline-flex!important}}.embed-responsive{display:block;overflow:hidden;padding:0;position:relative;width:100%}.embed-responsive:before{content:"";display:block}.embed-responsive .embed-responsive-item,.embed-responsive embed,.embed-responsive iframe,.embed-responsive object,.embed-responsive video{border:0;bottom:0;height:100%;left:0;position:absolute;top:0;width:100%}.embed-responsive-21by9:before{padding-top:42.85714286%}.embed-responsive-16by9:before{padding-top:56.25%}.embed-responsive-4by3:before{padding-top:75%}.embed-responsive-1by1:before{padding-top:100%}.flex-row{flex-direction:row!important}.flex-column{flex-direction:column!important}.flex-row-reverse{flex-direction:row-reverse!important}.flex-column-reverse{flex-direction:column-reverse!important}.flex-wrap{flex-wrap:wrap!important}.flex-nowrap{flex-wrap:nowrap!important}.flex-wrap-reverse{flex-wrap:wrap-reverse!important}.flex-fill{flex:1 1 auto!important}.flex-grow-0{flex-grow:0!important}.flex-grow-1{flex-grow:1!important}.flex-shrink-0{flex-shrink:0!important}.flex-shrink-1{flex-shrink:1!important}.justify-content-start{justify-content:flex-start!important}.justify-content-end{justify-content:flex-end!important}.justify-content-center{justify-content:center!important}.justify-content-between{justify-content:space-between!important}.justify-content-around{justify-content:space-around!important}.align-items-start{align-items:flex-start!important}.align-items-end{align-items:flex-end!important}.align-items-center{align-items:center!important}.align-items-baseline{align-items:baseline!important}.align-items-stretch{align-items:stretch!important}.align-content-start{align-content:flex-start!important}.align-content-end{align-content:flex-end!important}.align-content-center{align-content:center!important}.align-content-between{align-content:space-between!important}.align-content-around{align-content:space-around!important}.align-content-stretch{align-content:stretch!important}.align-self-auto{align-self:auto!important}.align-self-start{align-self:flex-start!important}.align-self-end{align-self:flex-end!important}.align-self-center{align-self:center!important}.align-self-baseline{align-self:baseline!important}.align-self-stretch{align-self:stretch!important}@media (min-width:2px){.flex-sm-row{flex-direction:row!important}.flex-sm-column{flex-direction:column!important}.flex-sm-row-reverse{flex-direction:row-reverse!important}.flex-sm-column-reverse{flex-direction:column-reverse!important}.flex-sm-wrap{flex-wrap:wrap!important}.flex-sm-nowrap{flex-wrap:nowrap!important}.flex-sm-wrap-reverse{flex-wrap:wrap-reverse!important}.flex-sm-fill{flex:1 1 auto!important}.flex-sm-grow-0{flex-grow:0!important}.flex-sm-grow-1{flex-grow:1!important}.flex-sm-shrink-0{flex-shrink:0!important}.flex-sm-shrink-1{flex-shrink:1!important}.justify-content-sm-start{justify-content:flex-start!important}.justify-content-sm-end{justify-content:flex-end!important}.justify-content-sm-center{justify-content:center!important}.justify-content-sm-between{justify-content:space-between!important}.justify-content-sm-around{justify-content:space-around!important}.align-items-sm-start{align-items:flex-start!important}.align-items-sm-end{align-items:flex-end!important}.align-items-sm-center{align-items:center!important}.align-items-sm-baseline{align-items:baseline!important}.align-items-sm-stretch{align-items:stretch!important}.align-content-sm-start{align-content:flex-start!important}.align-content-sm-end{align-content:flex-end!important}.align-content-sm-center{align-content:center!important}.align-content-sm-between{align-content:space-between!important}.align-content-sm-around{align-content:space-around!important}.align-content-sm-stretch{align-content:stretch!important}.align-self-sm-auto{align-self:auto!important}.align-self-sm-start{align-self:flex-start!important}.align-self-sm-end{align-self:flex-end!important}.align-self-sm-center{align-self:center!important}.align-self-sm-baseline{align-self:baseline!important}.align-self-sm-stretch{align-self:stretch!important}}@media (min-width:8px){.flex-md-row{flex-direction:row!important}.flex-md-column{flex-direction:column!important}.flex-md-row-reverse{flex-direction:row-reverse!important}.flex-md-column-reverse{flex-direction:column-reverse!important}.flex-md-wrap{flex-wrap:wrap!important}.flex-md-nowrap{flex-wrap:nowrap!important}.flex-md-wrap-reverse{flex-wrap:wrap-reverse!important}.flex-md-fill{flex:1 1 auto!important}.flex-md-grow-0{flex-grow:0!important}.flex-md-grow-1{flex-grow:1!important}.flex-md-shrink-0{flex-shrink:0!important}.flex-md-shrink-1{flex-shrink:1!important}.justify-content-md-start{justify-content:flex-start!important}.justify-content-md-end{justify-content:flex-end!important}.justify-content-md-center{justify-content:center!important}.justify-content-md-between{justify-content:space-between!important}.justify-content-md-around{justify-content:space-around!important}.align-items-md-start{align-items:flex-start!important}.align-items-md-end{align-items:flex-end!important}.align-items-md-center{align-items:center!important}.align-items-md-baseline{align-items:baseline!important}.align-items-md-stretch{align-items:stretch!important}.align-content-md-start{align-content:flex-start!important}.align-content-md-end{align-content:flex-end!important}.align-content-md-center{align-content:center!important}.align-content-md-between{align-content:space-between!important}.align-content-md-around{align-content:space-around!important}.align-content-md-stretch{align-content:stretch!important}.align-self-md-auto{align-self:auto!important}.align-self-md-start{align-self:flex-start!important}.align-self-md-end{align-self:flex-end!important}.align-self-md-center{align-self:center!important}.align-self-md-baseline{align-self:baseline!important}.align-self-md-stretch{align-self:stretch!important}}@media (min-width:9px){.flex-lg-row{flex-direction:row!important}.flex-lg-column{flex-direction:column!important}.flex-lg-row-reverse{flex-direction:row-reverse!important}.flex-lg-column-reverse{flex-direction:column-reverse!important}.flex-lg-wrap{flex-wrap:wrap!important}.flex-lg-nowrap{flex-wrap:nowrap!important}.flex-lg-wrap-reverse{flex-wrap:wrap-reverse!important}.flex-lg-fill{flex:1 1 auto!important}.flex-lg-grow-0{flex-grow:0!important}.flex-lg-grow-1{flex-grow:1!important}.flex-lg-shrink-0{flex-shrink:0!important}.flex-lg-shrink-1{flex-shrink:1!important}.justify-content-lg-start{justify-content:flex-start!important}.justify-content-lg-end{justify-content:flex-end!important}.justify-content-lg-center{justify-content:center!important}.justify-content-lg-between{justify-content:space-between!important}.justify-content-lg-around{justify-content:space-around!important}.align-items-lg-start{align-items:flex-start!important}.align-items-lg-end{align-items:flex-end!important}.align-items-lg-center{align-items:center!important}.align-items-lg-baseline{align-items:baseline!important}.align-items-lg-stretch{align-items:stretch!important}.align-content-lg-start{align-content:flex-start!important}.align-content-lg-end{align-content:flex-end!important}.align-content-lg-center{align-content:center!important}.align-content-lg-between{align-content:space-between!important}.align-content-lg-around{align-content:space-around!important}.align-content-lg-stretch{align-content:stretch!important}.align-self-lg-auto{align-self:auto!important}.align-self-lg-start{align-self:flex-start!important}.align-self-lg-end{align-self:flex-end!important}.align-self-lg-center{align-self:center!important}.align-self-lg-baseline{align-self:baseline!important}.align-self-lg-stretch{align-self:stretch!important}}@media (min-width:10px){.flex-xl-row{flex-direction:row!important}.flex-xl-column{flex-direction:column!important}.flex-xl-row-reverse{flex-direction:row-reverse!important}.flex-xl-column-reverse{flex-direction:column-reverse!important}.flex-xl-wrap{flex-wrap:wrap!important}.flex-xl-nowrap{flex-wrap:nowrap!important}.flex-xl-wrap-reverse{flex-wrap:wrap-reverse!important}.flex-xl-fill{flex:1 1 auto!important}.flex-xl-grow-0{flex-grow:0!important}.flex-xl-grow-1{flex-grow:1!important}.flex-xl-shrink-0{flex-shrink:0!important}.flex-xl-shrink-1{flex-shrink:1!important}.justify-content-xl-start{justify-content:flex-start!important}.justify-content-xl-end{justify-content:flex-end!important}.justify-content-xl-center{justify-content:center!important}.justify-content-xl-between{justify-content:space-between!important}.justify-content-xl-around{justify-content:space-around!important}.align-items-xl-start{align-items:flex-start!important}.align-items-xl-end{align-items:flex-end!important}.align-items-xl-center{align-items:center!important}.align-items-xl-baseline{align-items:baseline!important}.align-items-xl-stretch{align-items:stretch!important}.align-content-xl-start{align-content:flex-start!important}.align-content-xl-end{align-content:flex-end!important}.align-content-xl-center{align-content:center!important}.align-content-xl-between{align-content:space-between!important}.align-content-xl-around{align-content:space-around!important}.align-content-xl-stretch{align-content:stretch!important}.align-self-xl-auto{align-self:auto!important}.align-self-xl-start{align-self:flex-start!important}.align-self-xl-end{align-self:flex-end!important}.align-self-xl-center{align-self:center!important}.align-self-xl-baseline{align-self:baseline!important}.align-self-xl-stretch{align-self:stretch!important}}.float-left{float:left!important}.float-right{float:right!important}.float-none{float:none!important}@media (min-width:2px){.float-sm-left{float:left!important}.float-sm-right{float:right!important}.float-sm-none{float:none!important}}@media (min-width:8px){.float-md-left{float:left!important}.float-md-right{float:right!important}.float-md-none{float:none!important}}@media (min-width:9px){.float-lg-left{float:left!important}.float-lg-right{float:right!important}.float-lg-none{float:none!important}}@media (min-width:10px){.float-xl-left{float:left!important}.float-xl-right{float:right!important}.float-xl-none{float:none!important}}.user-select-all{-webkit-user-select:all!important;-moz-user-select:all!important;user-select:all!important}.user-select-auto{-webkit-user-select:auto!important;-moz-user-select:auto!important;user-select:auto!important}.user-select-none{-webkit-user-select:none!important;-moz-user-select:none!important;user-select:none!important}.overflow-auto{overflow:auto!important}.overflow-hidden{overflow:hidden!important}.position-static{position:static!important}.position-relative{position:relative!important}.position-absolute{position:absolute!important}.position-fixed{position:fixed!important}.position-sticky{position:sticky!important}.fixed-top{top:0}.fixed-bottom,.fixed-top{left:0;position:fixed;right:0;z-index:1030}.fixed-bottom{bottom:0}@supports (position:sticky){.sticky-top{position:sticky;top:0;z-index:1020}}.sr-only{clip:rect(0,0,0,0);border:0;height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;white-space:nowrap;width:1px}.sr-only-focusable:active,.sr-only-focusable:focus{clip:auto;height:auto;overflow:visible;position:static;white-space:normal;width:auto}.shadow-sm{box-shadow:0 .125rem .25rem rgba(0,0,0,.075)!important}.shadow{box-shadow:0 .5rem 1rem rgba(0,0,0,.15)!important}.shadow-lg{box-shadow:0 1rem 3rem rgba(0,0,0,.175)!important}.shadow-none{box-shadow:none!important}.w-25{width:25%!important}.w-50{width:50%!important}.w-75{width:75%!important}.w-100{width:100%!important}.w-auto{width:auto!important}.h-25{height:25%!important}.h-50{height:50%!important}.h-75{height:75%!important}.h-100{height:100%!important}.h-auto{height:auto!important}.mw-100{max-width:100%!important}.mh-100{max-height:100%!important}.min-vw-100{min-width:100vw!important}.min-vh-100{min-height:100vh!important}.vw-100{width:100vw!important}.vh-100{height:100vh!important}.m-0{margin:0!important}.mt-0,.my-0{margin-top:0!important}.mr-0,.mx-0{margin-right:0!important}.mb-0,.my-0{margin-bottom:0!important}.ml-0,.mx-0{margin-left:0!important}.m-1{margin:.25rem!important}.mt-1,.my-1{margin-top:.25rem!important}.mr-1,.mx-1{margin-right:.25rem!important}.mb-1,.my-1{margin-bottom:.25rem!important}.ml-1,.mx-1{margin-left:.25rem!important}.m-2{margin:.5rem!important}.mt-2,.my-2{margin-top:.5rem!important}.mr-2,.mx-2{margin-right:.5rem!important}.mb-2,.my-2{margin-bottom:.5rem!important}.ml-2,.mx-2{margin-left:.5rem!important}.m-3{margin:1rem!important}.mt-3,.my-3{margin-top:1rem!important}.mr-3,.mx-3{margin-right:1rem!important}.mb-3,.my-3{margin-bottom:1rem!important}.ml-3,.mx-3{margin-left:1rem!important}.m-4{margin:1.5rem!important}.mt-4,.my-4{margin-top:1.5rem!important}.mr-4,.mx-4{margin-right:1.5rem!important}.mb-4,.my-4{margin-bottom:1.5rem!important}.ml-4,.mx-4{margin-left:1.5rem!important}.m-5{margin:3rem!important}.mt-5,.my-5{margin-top:3rem!important}.mr-5,.mx-5{margin-right:3rem!important}.mb-5,.my-5{margin-bottom:3rem!important}.ml-5,.mx-5{margin-left:3rem!important}.p-0{padding:0!important}.pt-0,.py-0{padding-top:0!important}.pr-0,.px-0{padding-right:0!important}.pb-0,.py-0{padding-bottom:0!important}.pl-0,.px-0{padding-left:0!important}.p-1{padding:.25rem!important}.pt-1,.py-1{padding-top:.25rem!important}.pr-1,.px-1{padding-right:.25rem!important}.pb-1,.py-1{padding-bottom:.25rem!important}.pl-1,.px-1{padding-left:.25rem!important}.p-2{padding:.5rem!important}.pt-2,.py-2{padding-top:.5rem!important}.pr-2,.px-2{padding-right:.5rem!important}.pb-2,.py-2{padding-bottom:.5rem!important}.pl-2,.px-2{padding-left:.5rem!important}.p-3{padding:1rem!important}.pt-3,.py-3{padding-top:1rem!important}.pr-3,.px-3{padding-right:1rem!important}.pb-3,.py-3{padding-bottom:1rem!important}.pl-3,.px-3{padding-left:1rem!important}.p-4{padding:1.5rem!important}.pt-4,.py-4{padding-top:1.5rem!important}.pr-4,.px-4{padding-right:1.5rem!important}.pb-4,.py-4{padding-bottom:1.5rem!important}.pl-4,.px-4{padding-left:1.5rem!important}.p-5{padding:3rem!important}.pt-5,.py-5{padding-top:3rem!important}.pr-5,.px-5{padding-right:3rem!important}.pb-5,.py-5{padding-bottom:3rem!important}.pl-5,.px-5{padding-left:3rem!important}.m-n1{margin:-.25rem!important}.mt-n1,.my-n1{margin-top:-.25rem!important}.mr-n1,.mx-n1{margin-right:-.25rem!important}.mb-n1,.my-n1{margin-bottom:-.25rem!important}.ml-n1,.mx-n1{margin-left:-.25rem!important}.m-n2{margin:-.5rem!important}.mt-n2,.my-n2{margin-top:-.5rem!important}.mr-n2,.mx-n2{margin-right:-.5rem!important}.mb-n2,.my-n2{margin-bottom:-.5rem!important}.ml-n2,.mx-n2{margin-left:-.5rem!important}.m-n3{margin:-1rem!important}.mt-n3,.my-n3{margin-top:-1rem!important}.mr-n3,.mx-n3{margin-right:-1rem!important}.mb-n3,.my-n3{margin-bottom:-1rem!important}.ml-n3,.mx-n3{margin-left:-1rem!important}.m-n4{margin:-1.5rem!important}.mt-n4,.my-n4{margin-top:-1.5rem!important}.mr-n4,.mx-n4{margin-right:-1.5rem!important}.mb-n4,.my-n4{margin-bottom:-1.5rem!important}.ml-n4,.mx-n4{margin-left:-1.5rem!important}.m-n5{margin:-3rem!important}.mt-n5,.my-n5{margin-top:-3rem!important}.mr-n5,.mx-n5{margin-right:-3rem!important}.mb-n5,.my-n5{margin-bottom:-3rem!important}.ml-n5,.mx-n5{margin-left:-3rem!important}.m-auto{margin:auto!important}.mt-auto,.my-auto{margin-top:auto!important}.mr-auto,.mx-auto{margin-right:auto!important}.mb-auto,.my-auto{margin-bottom:auto!important}.ml-auto,.mx-auto{margin-left:auto!important}@media (min-width:2px){.m-sm-0{margin:0!important}.mt-sm-0,.my-sm-0{margin-top:0!important}.mr-sm-0,.mx-sm-0{margin-right:0!important}.mb-sm-0,.my-sm-0{margin-bottom:0!important}.ml-sm-0,.mx-sm-0{margin-left:0!important}.m-sm-1{margin:.25rem!important}.mt-sm-1,.my-sm-1{margin-top:.25rem!important}.mr-sm-1,.mx-sm-1{margin-right:.25rem!important}.mb-sm-1,.my-sm-1{margin-bottom:.25rem!important}.ml-sm-1,.mx-sm-1{margin-left:.25rem!important}.m-sm-2{margin:.5rem!important}.mt-sm-2,.my-sm-2{margin-top:.5rem!important}.mr-sm-2,.mx-sm-2{margin-right:.5rem!important}.mb-sm-2,.my-sm-2{margin-bottom:.5rem!important}.ml-sm-2,.mx-sm-2{margin-left:.5rem!important}.m-sm-3{margin:1rem!important}.mt-sm-3,.my-sm-3{margin-top:1rem!important}.mr-sm-3,.mx-sm-3{margin-right:1rem!important}.mb-sm-3,.my-sm-3{margin-bottom:1rem!important}.ml-sm-3,.mx-sm-3{margin-left:1rem!important}.m-sm-4{margin:1.5rem!important}.mt-sm-4,.my-sm-4{margin-top:1.5rem!important}.mr-sm-4,.mx-sm-4{margin-right:1.5rem!important}.mb-sm-4,.my-sm-4{margin-bottom:1.5rem!important}.ml-sm-4,.mx-sm-4{margin-left:1.5rem!important}.m-sm-5{margin:3rem!important}.mt-sm-5,.my-sm-5{margin-top:3rem!important}.mr-sm-5,.mx-sm-5{margin-right:3rem!important}.mb-sm-5,.my-sm-5{margin-bottom:3rem!important}.ml-sm-5,.mx-sm-5{margin-left:3rem!important}.p-sm-0{padding:0!important}.pt-sm-0,.py-sm-0{padding-top:0!important}.pr-sm-0,.px-sm-0{padding-right:0!important}.pb-sm-0,.py-sm-0{padding-bottom:0!important}.pl-sm-0,.px-sm-0{padding-left:0!important}.p-sm-1{padding:.25rem!important}.pt-sm-1,.py-sm-1{padding-top:.25rem!important}.pr-sm-1,.px-sm-1{padding-right:.25rem!important}.pb-sm-1,.py-sm-1{padding-bottom:.25rem!important}.pl-sm-1,.px-sm-1{padding-left:.25rem!important}.p-sm-2{padding:.5rem!important}.pt-sm-2,.py-sm-2{padding-top:.5rem!important}.pr-sm-2,.px-sm-2{padding-right:.5rem!important}.pb-sm-2,.py-sm-2{padding-bottom:.5rem!important}.pl-sm-2,.px-sm-2{padding-left:.5rem!important}.p-sm-3{padding:1rem!important}.pt-sm-3,.py-sm-3{padding-top:1rem!important}.pr-sm-3,.px-sm-3{padding-right:1rem!important}.pb-sm-3,.py-sm-3{padding-bottom:1rem!important}.pl-sm-3,.px-sm-3{padding-left:1rem!important}.p-sm-4{padding:1.5rem!important}.pt-sm-4,.py-sm-4{padding-top:1.5rem!important}.pr-sm-4,.px-sm-4{padding-right:1.5rem!important}.pb-sm-4,.py-sm-4{padding-bottom:1.5rem!important}.pl-sm-4,.px-sm-4{padding-left:1.5rem!important}.p-sm-5{padding:3rem!important}.pt-sm-5,.py-sm-5{padding-top:3rem!important}.pr-sm-5,.px-sm-5{padding-right:3rem!important}.pb-sm-5,.py-sm-5{padding-bottom:3rem!important}.pl-sm-5,.px-sm-5{padding-left:3rem!important}.m-sm-n1{margin:-.25rem!important}.mt-sm-n1,.my-sm-n1{margin-top:-.25rem!important}.mr-sm-n1,.mx-sm-n1{margin-right:-.25rem!important}.mb-sm-n1,.my-sm-n1{margin-bottom:-.25rem!important}.ml-sm-n1,.mx-sm-n1{margin-left:-.25rem!important}.m-sm-n2{margin:-.5rem!important}.mt-sm-n2,.my-sm-n2{margin-top:-.5rem!important}.mr-sm-n2,.mx-sm-n2{margin-right:-.5rem!important}.mb-sm-n2,.my-sm-n2{margin-bottom:-.5rem!important}.ml-sm-n2,.mx-sm-n2{margin-left:-.5rem!important}.m-sm-n3{margin:-1rem!important}.mt-sm-n3,.my-sm-n3{margin-top:-1rem!important}.mr-sm-n3,.mx-sm-n3{margin-right:-1rem!important}.mb-sm-n3,.my-sm-n3{margin-bottom:-1rem!important}.ml-sm-n3,.mx-sm-n3{margin-left:-1rem!important}.m-sm-n4{margin:-1.5rem!important}.mt-sm-n4,.my-sm-n4{margin-top:-1.5rem!important}.mr-sm-n4,.mx-sm-n4{margin-right:-1.5rem!important}.mb-sm-n4,.my-sm-n4{margin-bottom:-1.5rem!important}.ml-sm-n4,.mx-sm-n4{margin-left:-1.5rem!important}.m-sm-n5{margin:-3rem!important}.mt-sm-n5,.my-sm-n5{margin-top:-3rem!important}.mr-sm-n5,.mx-sm-n5{margin-right:-3rem!important}.mb-sm-n5,.my-sm-n5{margin-bottom:-3rem!important}.ml-sm-n5,.mx-sm-n5{margin-left:-3rem!important}.m-sm-auto{margin:auto!important}.mt-sm-auto,.my-sm-auto{margin-top:auto!important}.mr-sm-auto,.mx-sm-auto{margin-right:auto!important}.mb-sm-auto,.my-sm-auto{margin-bottom:auto!important}.ml-sm-auto,.mx-sm-auto{margin-left:auto!important}}@media (min-width:8px){.m-md-0{margin:0!important}.mt-md-0,.my-md-0{margin-top:0!important}.mr-md-0,.mx-md-0{margin-right:0!important}.mb-md-0,.my-md-0{margin-bottom:0!important}.ml-md-0,.mx-md-0{margin-left:0!important}.m-md-1{margin:.25rem!important}.mt-md-1,.my-md-1{margin-top:.25rem!important}.mr-md-1,.mx-md-1{margin-right:.25rem!important}.mb-md-1,.my-md-1{margin-bottom:.25rem!important}.ml-md-1,.mx-md-1{margin-left:.25rem!important}.m-md-2{margin:.5rem!important}.mt-md-2,.my-md-2{margin-top:.5rem!important}.mr-md-2,.mx-md-2{margin-right:.5rem!important}.mb-md-2,.my-md-2{margin-bottom:.5rem!important}.ml-md-2,.mx-md-2{margin-left:.5rem!important}.m-md-3{margin:1rem!important}.mt-md-3,.my-md-3{margin-top:1rem!important}.mr-md-3,.mx-md-3{margin-right:1rem!important}.mb-md-3,.my-md-3{margin-bottom:1rem!important}.ml-md-3,.mx-md-3{margin-left:1rem!important}.m-md-4{margin:1.5rem!important}.mt-md-4,.my-md-4{margin-top:1.5rem!important}.mr-md-4,.mx-md-4{margin-right:1.5rem!important}.mb-md-4,.my-md-4{margin-bottom:1.5rem!important}.ml-md-4,.mx-md-4{margin-left:1.5rem!important}.m-md-5{margin:3rem!important}.mt-md-5,.my-md-5{margin-top:3rem!important}.mr-md-5,.mx-md-5{margin-right:3rem!important}.mb-md-5,.my-md-5{margin-bottom:3rem!important}.ml-md-5,.mx-md-5{margin-left:3rem!important}.p-md-0{padding:0!important}.pt-md-0,.py-md-0{padding-top:0!important}.pr-md-0,.px-md-0{padding-right:0!important}.pb-md-0,.py-md-0{padding-bottom:0!important}.pl-md-0,.px-md-0{padding-left:0!important}.p-md-1{padding:.25rem!important}.pt-md-1,.py-md-1{padding-top:.25rem!important}.pr-md-1,.px-md-1{padding-right:.25rem!important}.pb-md-1,.py-md-1{padding-bottom:.25rem!important}.pl-md-1,.px-md-1{padding-left:.25rem!important}.p-md-2{padding:.5rem!important}.pt-md-2,.py-md-2{padding-top:.5rem!important}.pr-md-2,.px-md-2{padding-right:.5rem!important}.pb-md-2,.py-md-2{padding-bottom:.5rem!important}.pl-md-2,.px-md-2{padding-left:.5rem!important}.p-md-3{padding:1rem!important}.pt-md-3,.py-md-3{padding-top:1rem!important}.pr-md-3,.px-md-3{padding-right:1rem!important}.pb-md-3,.py-md-3{padding-bottom:1rem!important}.pl-md-3,.px-md-3{padding-left:1rem!important}.p-md-4{padding:1.5rem!important}.pt-md-4,.py-md-4{padding-top:1.5rem!important}.pr-md-4,.px-md-4{padding-right:1.5rem!important}.pb-md-4,.py-md-4{padding-bottom:1.5rem!important}.pl-md-4,.px-md-4{padding-left:1.5rem!important}.p-md-5{padding:3rem!important}.pt-md-5,.py-md-5{padding-top:3rem!important}.pr-md-5,.px-md-5{padding-right:3rem!important}.pb-md-5,.py-md-5{padding-bottom:3rem!important}.pl-md-5,.px-md-5{padding-left:3rem!important}.m-md-n1{margin:-.25rem!important}.mt-md-n1,.my-md-n1{margin-top:-.25rem!important}.mr-md-n1,.mx-md-n1{margin-right:-.25rem!important}.mb-md-n1,.my-md-n1{margin-bottom:-.25rem!important}.ml-md-n1,.mx-md-n1{margin-left:-.25rem!important}.m-md-n2{margin:-.5rem!important}.mt-md-n2,.my-md-n2{margin-top:-.5rem!important}.mr-md-n2,.mx-md-n2{margin-right:-.5rem!important}.mb-md-n2,.my-md-n2{margin-bottom:-.5rem!important}.ml-md-n2,.mx-md-n2{margin-left:-.5rem!important}.m-md-n3{margin:-1rem!important}.mt-md-n3,.my-md-n3{margin-top:-1rem!important}.mr-md-n3,.mx-md-n3{margin-right:-1rem!important}.mb-md-n3,.my-md-n3{margin-bottom:-1rem!important}.ml-md-n3,.mx-md-n3{margin-left:-1rem!important}.m-md-n4{margin:-1.5rem!important}.mt-md-n4,.my-md-n4{margin-top:-1.5rem!important}.mr-md-n4,.mx-md-n4{margin-right:-1.5rem!important}.mb-md-n4,.my-md-n4{margin-bottom:-1.5rem!important}.ml-md-n4,.mx-md-n4{margin-left:-1.5rem!important}.m-md-n5{margin:-3rem!important}.mt-md-n5,.my-md-n5{margin-top:-3rem!important}.mr-md-n5,.mx-md-n5{margin-right:-3rem!important}.mb-md-n5,.my-md-n5{margin-bottom:-3rem!important}.ml-md-n5,.mx-md-n5{margin-left:-3rem!important}.m-md-auto{margin:auto!important}.mt-md-auto,.my-md-auto{margin-top:auto!important}.mr-md-auto,.mx-md-auto{margin-right:auto!important}.mb-md-auto,.my-md-auto{margin-bottom:auto!important}.ml-md-auto,.mx-md-auto{margin-left:auto!important}}@media (min-width:9px){.m-lg-0{margin:0!important}.mt-lg-0,.my-lg-0{margin-top:0!important}.mr-lg-0,.mx-lg-0{margin-right:0!important}.mb-lg-0,.my-lg-0{margin-bottom:0!important}.ml-lg-0,.mx-lg-0{margin-left:0!important}.m-lg-1{margin:.25rem!important}.mt-lg-1,.my-lg-1{margin-top:.25rem!important}.mr-lg-1,.mx-lg-1{margin-right:.25rem!important}.mb-lg-1,.my-lg-1{margin-bottom:.25rem!important}.ml-lg-1,.mx-lg-1{margin-left:.25rem!important}.m-lg-2{margin:.5rem!important}.mt-lg-2,.my-lg-2{margin-top:.5rem!important}.mr-lg-2,.mx-lg-2{margin-right:.5rem!important}.mb-lg-2,.my-lg-2{margin-bottom:.5rem!important}.ml-lg-2,.mx-lg-2{margin-left:.5rem!important}.m-lg-3{margin:1rem!important}.mt-lg-3,.my-lg-3{margin-top:1rem!important}.mr-lg-3,.mx-lg-3{margin-right:1rem!important}.mb-lg-3,.my-lg-3{margin-bottom:1rem!important}.ml-lg-3,.mx-lg-3{margin-left:1rem!important}.m-lg-4{margin:1.5rem!important}.mt-lg-4,.my-lg-4{margin-top:1.5rem!important}.mr-lg-4,.mx-lg-4{margin-right:1.5rem!important}.mb-lg-4,.my-lg-4{margin-bottom:1.5rem!important}.ml-lg-4,.mx-lg-4{margin-left:1.5rem!important}.m-lg-5{margin:3rem!important}.mt-lg-5,.my-lg-5{margin-top:3rem!important}.mr-lg-5,.mx-lg-5{margin-right:3rem!important}.mb-lg-5,.my-lg-5{margin-bottom:3rem!important}.ml-lg-5,.mx-lg-5{margin-left:3rem!important}.p-lg-0{padding:0!important}.pt-lg-0,.py-lg-0{padding-top:0!important}.pr-lg-0,.px-lg-0{padding-right:0!important}.pb-lg-0,.py-lg-0{padding-bottom:0!important}.pl-lg-0,.px-lg-0{padding-left:0!important}.p-lg-1{padding:.25rem!important}.pt-lg-1,.py-lg-1{padding-top:.25rem!important}.pr-lg-1,.px-lg-1{padding-right:.25rem!important}.pb-lg-1,.py-lg-1{padding-bottom:.25rem!important}.pl-lg-1,.px-lg-1{padding-left:.25rem!important}.p-lg-2{padding:.5rem!important}.pt-lg-2,.py-lg-2{padding-top:.5rem!important}.pr-lg-2,.px-lg-2{padding-right:.5rem!important}.pb-lg-2,.py-lg-2{padding-bottom:.5rem!important}.pl-lg-2,.px-lg-2{padding-left:.5rem!important}.p-lg-3{padding:1rem!important}.pt-lg-3,.py-lg-3{padding-top:1rem!important}.pr-lg-3,.px-lg-3{padding-right:1rem!important}.pb-lg-3,.py-lg-3{padding-bottom:1rem!important}.pl-lg-3,.px-lg-3{padding-left:1rem!important}.p-lg-4{padding:1.5rem!important}.pt-lg-4,.py-lg-4{padding-top:1.5rem!important}.pr-lg-4,.px-lg-4{padding-right:1.5rem!important}.pb-lg-4,.py-lg-4{padding-bottom:1.5rem!important}.pl-lg-4,.px-lg-4{padding-left:1.5rem!important}.p-lg-5{padding:3rem!important}.pt-lg-5,.py-lg-5{padding-top:3rem!important}.pr-lg-5,.px-lg-5{padding-right:3rem!important}.pb-lg-5,.py-lg-5{padding-bottom:3rem!important}.pl-lg-5,.px-lg-5{padding-left:3rem!important}.m-lg-n1{margin:-.25rem!important}.mt-lg-n1,.my-lg-n1{margin-top:-.25rem!important}.mr-lg-n1,.mx-lg-n1{margin-right:-.25rem!important}.mb-lg-n1,.my-lg-n1{margin-bottom:-.25rem!important}.ml-lg-n1,.mx-lg-n1{margin-left:-.25rem!important}.m-lg-n2{margin:-.5rem!important}.mt-lg-n2,.my-lg-n2{margin-top:-.5rem!important}.mr-lg-n2,.mx-lg-n2{margin-right:-.5rem!important}.mb-lg-n2,.my-lg-n2{margin-bottom:-.5rem!important}.ml-lg-n2,.mx-lg-n2{margin-left:-.5rem!important}.m-lg-n3{margin:-1rem!important}.mt-lg-n3,.my-lg-n3{margin-top:-1rem!important}.mr-lg-n3,.mx-lg-n3{margin-right:-1rem!important}.mb-lg-n3,.my-lg-n3{margin-bottom:-1rem!important}.ml-lg-n3,.mx-lg-n3{margin-left:-1rem!important}.m-lg-n4{margin:-1.5rem!important}.mt-lg-n4,.my-lg-n4{margin-top:-1.5rem!important}.mr-lg-n4,.mx-lg-n4{margin-right:-1.5rem!important}.mb-lg-n4,.my-lg-n4{margin-bottom:-1.5rem!important}.ml-lg-n4,.mx-lg-n4{margin-left:-1.5rem!important}.m-lg-n5{margin:-3rem!important}.mt-lg-n5,.my-lg-n5{margin-top:-3rem!important}.mr-lg-n5,.mx-lg-n5{margin-right:-3rem!important}.mb-lg-n5,.my-lg-n5{margin-bottom:-3rem!important}.ml-lg-n5,.mx-lg-n5{margin-left:-3rem!important}.m-lg-auto{margin:auto!important}.mt-lg-auto,.my-lg-auto{margin-top:auto!important}.mr-lg-auto,.mx-lg-auto{margin-right:auto!important}.mb-lg-auto,.my-lg-auto{margin-bottom:auto!important}.ml-lg-auto,.mx-lg-auto{margin-left:auto!important}}@media (min-width:10px){.m-xl-0{margin:0!important}.mt-xl-0,.my-xl-0{margin-top:0!important}.mr-xl-0,.mx-xl-0{margin-right:0!important}.mb-xl-0,.my-xl-0{margin-bottom:0!important}.ml-xl-0,.mx-xl-0{margin-left:0!important}.m-xl-1{margin:.25rem!important}.mt-xl-1,.my-xl-1{margin-top:.25rem!important}.mr-xl-1,.mx-xl-1{margin-right:.25rem!important}.mb-xl-1,.my-xl-1{margin-bottom:.25rem!important}.ml-xl-1,.mx-xl-1{margin-left:.25rem!important}.m-xl-2{margin:.5rem!important}.mt-xl-2,.my-xl-2{margin-top:.5rem!important}.mr-xl-2,.mx-xl-2{margin-right:.5rem!important}.mb-xl-2,.my-xl-2{margin-bottom:.5rem!important}.ml-xl-2,.mx-xl-2{margin-left:.5rem!important}.m-xl-3{margin:1rem!important}.mt-xl-3,.my-xl-3{margin-top:1rem!important}.mr-xl-3,.mx-xl-3{margin-right:1rem!important}.mb-xl-3,.my-xl-3{margin-bottom:1rem!important}.ml-xl-3,.mx-xl-3{margin-left:1rem!important}.m-xl-4{margin:1.5rem!important}.mt-xl-4,.my-xl-4{margin-top:1.5rem!important}.mr-xl-4,.mx-xl-4{margin-right:1.5rem!important}.mb-xl-4,.my-xl-4{margin-bottom:1.5rem!important}.ml-xl-4,.mx-xl-4{margin-left:1.5rem!important}.m-xl-5{margin:3rem!important}.mt-xl-5,.my-xl-5{margin-top:3rem!important}.mr-xl-5,.mx-xl-5{margin-right:3rem!important}.mb-xl-5,.my-xl-5{margin-bottom:3rem!important}.ml-xl-5,.mx-xl-5{margin-left:3rem!important}.p-xl-0{padding:0!important}.pt-xl-0,.py-xl-0{padding-top:0!important}.pr-xl-0,.px-xl-0{padding-right:0!important}.pb-xl-0,.py-xl-0{padding-bottom:0!important}.pl-xl-0,.px-xl-0{padding-left:0!important}.p-xl-1{padding:.25rem!important}.pt-xl-1,.py-xl-1{padding-top:.25rem!important}.pr-xl-1,.px-xl-1{padding-right:.25rem!important}.pb-xl-1,.py-xl-1{padding-bottom:.25rem!important}.pl-xl-1,.px-xl-1{padding-left:.25rem!important}.p-xl-2{padding:.5rem!important}.pt-xl-2,.py-xl-2{padding-top:.5rem!important}.pr-xl-2,.px-xl-2{padding-right:.5rem!important}.pb-xl-2,.py-xl-2{padding-bottom:.5rem!important}.pl-xl-2,.px-xl-2{padding-left:.5rem!important}.p-xl-3{padding:1rem!important}.pt-xl-3,.py-xl-3{padding-top:1rem!important}.pr-xl-3,.px-xl-3{padding-right:1rem!important}.pb-xl-3,.py-xl-3{padding-bottom:1rem!important}.pl-xl-3,.px-xl-3{padding-left:1rem!important}.p-xl-4{padding:1.5rem!important}.pt-xl-4,.py-xl-4{padding-top:1.5rem!important}.pr-xl-4,.px-xl-4{padding-right:1.5rem!important}.pb-xl-4,.py-xl-4{padding-bottom:1.5rem!important}.pl-xl-4,.px-xl-4{padding-left:1.5rem!important}.p-xl-5{padding:3rem!important}.pt-xl-5,.py-xl-5{padding-top:3rem!important}.pr-xl-5,.px-xl-5{padding-right:3rem!important}.pb-xl-5,.py-xl-5{padding-bottom:3rem!important}.pl-xl-5,.px-xl-5{padding-left:3rem!important}.m-xl-n1{margin:-.25rem!important}.mt-xl-n1,.my-xl-n1{margin-top:-.25rem!important}.mr-xl-n1,.mx-xl-n1{margin-right:-.25rem!important}.mb-xl-n1,.my-xl-n1{margin-bottom:-.25rem!important}.ml-xl-n1,.mx-xl-n1{margin-left:-.25rem!important}.m-xl-n2{margin:-.5rem!important}.mt-xl-n2,.my-xl-n2{margin-top:-.5rem!important}.mr-xl-n2,.mx-xl-n2{margin-right:-.5rem!important}.mb-xl-n2,.my-xl-n2{margin-bottom:-.5rem!important}.ml-xl-n2,.mx-xl-n2{margin-left:-.5rem!important}.m-xl-n3{margin:-1rem!important}.mt-xl-n3,.my-xl-n3{margin-top:-1rem!important}.mr-xl-n3,.mx-xl-n3{margin-right:-1rem!important}.mb-xl-n3,.my-xl-n3{margin-bottom:-1rem!important}.ml-xl-n3,.mx-xl-n3{margin-left:-1rem!important}.m-xl-n4{margin:-1.5rem!important}.mt-xl-n4,.my-xl-n4{margin-top:-1.5rem!important}.mr-xl-n4,.mx-xl-n4{margin-right:-1.5rem!important}.mb-xl-n4,.my-xl-n4{margin-bottom:-1.5rem!important}.ml-xl-n4,.mx-xl-n4{margin-left:-1.5rem!important}.m-xl-n5{margin:-3rem!important}.mt-xl-n5,.my-xl-n5{margin-top:-3rem!important}.mr-xl-n5,.mx-xl-n5{margin-right:-3rem!important}.mb-xl-n5,.my-xl-n5{margin-bottom:-3rem!important}.ml-xl-n5,.mx-xl-n5{margin-left:-3rem!important}.m-xl-auto{margin:auto!important}.mt-xl-auto,.my-xl-auto{margin-top:auto!important}.mr-xl-auto,.mx-xl-auto{margin-right:auto!important}.mb-xl-auto,.my-xl-auto{margin-bottom:auto!important}.ml-xl-auto,.mx-xl-auto{margin-left:auto!important}}.stretched-link:after{background-color:transparent;bottom:0;content:"";left:0;pointer-events:auto;position:absolute;right:0;top:0;z-index:1}.text-monospace{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace!important}.text-justify{text-align:justify!important}.text-wrap{white-space:normal!important}.text-nowrap{white-space:nowrap!important}.text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.text-left{text-align:left!important}.text-right{text-align:right!important}.text-center{text-align:center!important}@media (min-width:2px){.text-sm-left{text-align:left!important}.text-sm-right{text-align:right!important}.text-sm-center{text-align:center!important}}@media (min-width:8px){.text-md-left{text-align:left!important}.text-md-right{text-align:right!important}.text-md-center{text-align:center!important}}@media (min-width:9px){.text-lg-left{text-align:left!important}.text-lg-right{text-align:right!important}.text-lg-center{text-align:center!important}}@media (min-width:10px){.text-xl-left{text-align:left!important}.text-xl-right{text-align:right!important}.text-xl-center{text-align:center!important}}.text-lowercase{text-transform:lowercase!important}.text-uppercase{text-transform:uppercase!important}.text-capitalize{text-transform:capitalize!important}.font-weight-light{font-weight:300!important}.font-weight-lighter{font-weight:lighter!important}.font-weight-normal{font-weight:400!important}.font-weight-bold{font-weight:600!important}.font-weight-bolder{font-weight:bolder!important}.font-italic{font-style:italic!important}.text-white{color:#fff!important}.text-primary{color:#4040c8!important}a.text-primary:focus,a.text-primary:hover{color:#2a2a92!important}.text-secondary{color:#4b5563!important}a.text-secondary:focus,a.text-secondary:hover{color:#2a3037!important}.text-success{color:#059669!important}a.text-success:focus,a.text-success:hover{color:#034c35!important}.text-info{color:#2563eb!important}a.text-info:focus,a.text-info:hover{color:#1043b3!important}.text-warning{color:#d97706!important}a.text-warning:focus,a.text-warning:hover{color:#8f4e04!important}.text-danger{color:#dc2626!important}a.text-danger:focus,a.text-danger:hover{color:#9c1919!important}.text-light{color:#f3f4f6!important}a.text-light:focus,a.text-light:hover{color:#c7ccd5!important}.text-dark{color:#1f2937!important}a.text-dark:focus,a.text-dark:hover{color:#030506!important}.text-body{color:#f3f4f6!important}.text-muted{color:#9ca3af!important}.text-black-50{color:rgba(0,0,0,.5)!important}.text-white-50{color:hsla(0,0%,100%,.5)!important}.text-hide{background-color:transparent;border:0;color:transparent;font:0/0 a;text-shadow:none}.text-decoration-none{text-decoration:none!important}.text-break{word-wrap:break-word!important;word-break:break-word!important}.text-reset{color:inherit!important}.visible{visibility:visible!important}.invisible{visibility:hidden!important}@media print{*,:after,:before{box-shadow:none!important;text-shadow:none!important}a:not(.btn){text-decoration:underline}abbr[title]:after{content:" (" attr(title) ")"}pre{white-space:pre-wrap!important}blockquote,pre{border:1px solid #6b7280}blockquote,img,pre,tr{page-break-inside:avoid}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}@page{size:a3}.container,body{min-width:9px!important}.navbar{display:none}.badge{border:1px solid #000}.table{border-collapse:collapse!important}.table td,.table th{background-color:#fff!important}.table-bordered td,.table-bordered th{border:1px solid #d1d5db!important}.table-dark{color:inherit}.table-dark tbody+tbody,.table-dark td,.table-dark th,.table-dark thead th{border-color:#374151}.table .thead-dark th{border-color:#374151;color:inherit}}.vjs-tree{color:#bfc7d5!important;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}.vjs-tree .vjs-tree__content{border-left:1px dotted hsla(0,0%,80%,.28)!important}.vjs-tree .vjs-tree__node{cursor:pointer}.vjs-tree .vjs-tree__node:hover{color:#20a0ff}.vjs-tree .vjs-checkbox{left:-30px;position:absolute}.vjs-tree .vjs-value__boolean,.vjs-tree .vjs-value__null,.vjs-tree .vjs-value__number{color:#a291f5!important}.vjs-tree .vjs-value__string{color:#c3e88d!important}.vjs-tree .vjs-key{color:#c3cbd3!important}.hljs-addition,.hljs-attr,.hljs-keyword,.hljs-selector-tag{color:#13ce66}.hljs-bullet,.hljs-meta,.hljs-name,.hljs-string,.hljs-symbol,.hljs-template-tag,.hljs-template-variable,.hljs-type,.hljs-variable{color:#c3e88d}.hljs-comment,.hljs-deletion,.hljs-quote{color:#bfcbd9}.hljs-literal,.hljs-number,.hljs-title{color:#a291f5!important}body{padding-bottom:20px}.container{max-width:1440px}html{min-width:1140px}[v-cloak]{display:none}svg.icon{height:1rem;width:1rem}.header{border-bottom:1px solid #374151}.header .logo{color:#e5e7eb;text-decoration:none}.header .logo svg{height:1.7rem;width:1.7rem}.sidebar .nav-item a{border-radius:6px;color:#9ca3af;margin-bottom:4px;padding:.5rem .75rem}.sidebar .nav-item a svg{fill:#6b7280;height:1.25rem;margin-right:15px;width:1.25rem}.sidebar .nav-item a:hover{background-color:#1f2937;color:#d1d5db}.sidebar .nav-item a.active{background-color:#1f2937;color:#818cf8}.sidebar .nav-item a.active svg{fill:#6366f1}.card{border:none;box-shadow:0 4px 6px -1px rgba(0,0,0,.1),0 2px 4px -2px rgba(0,0,0,.1)}.card .bottom-radius{border-bottom-left-radius:6px;border-bottom-right-radius:6px}.card .card-header{background-color:#374151;border-bottom:none;min-height:60px;padding-bottom:.7rem;padding-top:.7rem}.card .card-header .btn-group .btn{padding:.2rem .5rem}.card .card-header .form-control-with-icon{position:relative}.card .card-header .form-control-with-icon .icon-wrapper{align-items:center;bottom:0;display:flex;justify-content:center;left:.75rem;position:absolute;top:0}.card .card-header .form-control-with-icon .icon-wrapper .icon{fill:#9ca3af}.card .card-header .form-control-with-icon .form-control{border-radius:9999px;font-size:.875rem;padding-left:2.25rem}.card .table td,.card .table th{padding:.75rem 1.25rem}.card .table th{background-color:#1f2937;border-bottom:0;font-size:.875rem;padding:.5rem 1.25rem}.card .table:not(.table-borderless) td{border-top:1px solid #374151}.card .table.penultimate-column-right td:nth-last-child(2),.card .table.penultimate-column-right th:nth-last-child(2){text-align:right}.card .table td.table-fit,.card .table th.table-fit{white-space:nowrap;width:1%}.fill-text-color{fill:#f3f4f6}.fill-danger{fill:#dc2626}.fill-warning{fill:#d97706}.fill-info{fill:#2563eb}.fill-success{fill:#059669}.fill-primary{fill:#4040c8}button:hover .fill-primary{fill:#fff}.btn-outline-primary.active .fill-primary{fill:#111827}.btn-outline-primary:not(:disabled):not(.disabled).active:focus{box-shadow:none!important}.btn-muted{background:#1f2937;color:#9ca3af}.btn-muted:focus,.btn-muted:hover{background:#374151;color:#d1d5db}.btn-muted.active{background:#4040c8;color:#fff}.badge-secondary{background:#d1d5db;color:#374151}.badge-success{background:#10b981;color:#fff}.badge-info{background:#3b82f6;color:#fff}.badge-warning{background:#f59e0b;color:#fff}.badge-danger{background:#ef4444;color:#fff}.control-action svg{fill:#6b7280;height:1.2rem;width:1.2rem}.control-action svg:hover{fill:#818cf8}@keyframes spin{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.spin{animation:spin 2s linear infinite}.card .nav-pills{background:#374151}.card .nav-pills .nav-link{border-radius:0;color:#9ca3af;font-size:.9rem;padding:.75rem 1.25rem}.card .nav-pills .nav-link:focus,.card .nav-pills .nav-link:hover{color:#e5e7eb}.card .nav-pills .nav-link.active{background:none;border-bottom:2px solid #a5b4fc;color:#a5b4fc}.list-enter-active:not(.dontanimate){transition:background 1s linear}.list-enter:not(.dontanimate),.list-leave-to:not(.dontanimate){background:#312e81}.code-bg .list-enter:not(.dontanimate),.code-bg .list-leave-to:not(.dontanimate){background:#4b5563}#indexScreen td{vertical-align:middle!important}.card-bg-secondary{background:#1f2937}.code-bg{background:#292d3e}.disabled-watcher{background:#dc2626;color:#fff;padding:.75rem}.copy-to-clipboard{--tw-text-opacity:1;color:rgb(231 232 242/var(--tw-text-opacity));opacity:.7;outline:2px solid transparent;outline-offset:2px;position:absolute;right:0;top:0;z-index:10} diff --git a/public/vendor/telescope/app.css b/public/vendor/telescope/app.css index fac021b32..1f6375bf1 100644 --- a/public/vendor/telescope/app.css +++ b/public/vendor/telescope/app.css @@ -1,8 +1,7 @@ @charset "UTF-8"; - /*! * Bootstrap v4.6.2 (https://getbootstrap.com/) * Copyright 2011-2022 The Bootstrap Authors * Copyright 2011-2022 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) - */:root{--blue:#007bff;--indigo:#6610f2;--purple:#6f42c1;--pink:#e83e8c;--red:#dc3545;--orange:#fd7e14;--yellow:#ffc107;--green:#28a745;--teal:#20c997;--cyan:#17a2b8;--white:#fff;--gray:#4b5563;--gray-dark:#1f2937;--primary:#4040c8;--secondary:#4b5563;--success:#059669;--info:#2563eb;--warning:#d97706;--danger:#dc2626;--light:#f3f4f6;--dark:#1f2937;--breakpoint-xs:0;--breakpoint-sm:2px;--breakpoint-md:8px;--breakpoint-lg:9px;--breakpoint-xl:10px;--font-family-sans-serif:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans","Liberation Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--font-family-monospace:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace}*,:after,:before{box-sizing:border-box}html{-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:rgba(0,0,0,0);font-family:sans-serif;line-height:1.15}article,aside,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}body{background-color:#f3f4f6;color:#111827;font-family:Figtree,sans-serif;font-size:1rem;font-weight:400;line-height:1.5;margin:0;text-align:left}[tabindex="-1"]:focus:not(:focus-visible){outline:0!important}hr{box-sizing:content-box;height:0;overflow:visible}h1,h2,h3,h4,h5,h6{margin-bottom:.5rem;margin-top:0}p{margin-bottom:1rem;margin-top:0}abbr[data-original-title],abbr[title]{border-bottom:0;cursor:help;text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted;-webkit-text-decoration-skip-ink:none;text-decoration-skip-ink:none}address{font-style:normal;line-height:inherit}address,dl,ol,ul{margin-bottom:1rem}dl,ol,ul{margin-top:0}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:600}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}b,strong{font-weight:bolder}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{background-color:transparent;color:#6366f1;text-decoration:none}a:hover{color:#4f46e5;text-decoration:underline}a:not([href]):not([class]),a:not([href]):not([class]):hover{color:inherit;text-decoration:none}code,kbd,pre,samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-size:1em}pre{-ms-overflow-style:scrollbar;margin-bottom:1rem;margin-top:0;overflow:auto}figure{margin:0 0 1rem}img{border-style:none}img,svg{vertical-align:middle}svg{overflow:hidden}table{border-collapse:collapse}caption{caption-side:bottom;color:#6b7280;padding-bottom:.75rem;padding-top:.75rem;text-align:left}th{text-align:inherit;text-align:-webkit-match-parent}label{display:inline-block;margin-bottom:.5rem}button{border-radius:0}button:focus:not(:focus-visible){outline:0}button,input,optgroup,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit;margin:0}button,input{overflow:visible}button,select{text-transform:none}[role=button]{cursor:pointer}select{word-wrap:normal}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]:not(:disabled),[type=reset]:not(:disabled),[type=submit]:not(:disabled),button:not(:disabled){cursor:pointer}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}textarea{overflow:auto;resize:vertical}fieldset{border:0;margin:0;min-width:0;padding:0}legend{color:inherit;display:block;font-size:1.5rem;line-height:inherit;margin-bottom:.5rem;max-width:100%;padding:0;white-space:normal;width:100%}progress{vertical-align:baseline}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:none;outline-offset:-2px}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}output{display:inline-block}summary{cursor:pointer;display:list-item}template{display:none}[hidden]{display:none!important}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{font-weight:500;line-height:1.2;margin-bottom:.5rem}.h1,h1{font-size:2.5rem}.h2,h2{font-size:2rem}.h3,h3{font-size:1.75rem}.h4,h4{font-size:1.5rem}.h5,h5{font-size:1.25rem}.h6,h6{font-size:1rem}.lead{font-size:1.25rem;font-weight:300}.display-1{font-size:6rem}.display-1,.display-2{font-weight:300;line-height:1.2}.display-2{font-size:5.5rem}.display-3{font-size:4.5rem}.display-3,.display-4{font-weight:300;line-height:1.2}.display-4{font-size:3.5rem}hr{border:0;border-top:1px solid rgba(0,0,0,.1);margin-bottom:1rem;margin-top:1rem}.small,small{font-size:.875em;font-weight:400}.mark,mark{background-color:#fcf8e3;padding:.2em}.list-inline,.list-unstyled{list-style:none;padding-left:0}.list-inline-item{display:inline-block}.list-inline-item:not(:last-child){margin-right:.5rem}.initialism{font-size:90%;text-transform:uppercase}.blockquote{font-size:1.25rem;margin-bottom:1rem}.blockquote-footer{color:#4b5563;display:block;font-size:.875em}.blockquote-footer:before{content:"— "}.img-fluid,.img-thumbnail{height:auto;max-width:100%}.img-thumbnail{background-color:#f3f4f6;border:1px solid #d1d5db;border-radius:.25rem;padding:.25rem}.figure{display:inline-block}.figure-img{line-height:1;margin-bottom:.5rem}.figure-caption{color:#4b5563;font-size:90%}code{word-wrap:break-word;color:#e83e8c;font-size:87.5%}a>code{color:inherit}kbd{background-color:#111827;border-radius:.2rem;color:#fff;font-size:87.5%;padding:.2rem .4rem}kbd kbd{font-size:100%;font-weight:600;padding:0}pre{color:#111827;display:block;font-size:87.5%}pre code{color:inherit;font-size:inherit;word-break:normal}.pre-scrollable{max-height:340px;overflow-y:scroll}.container,.container-fluid,.container-lg,.container-md,.container-sm,.container-xl{margin-left:auto;margin-right:auto;padding-left:15px;padding-right:15px;width:100%}@media (min-width:2px){.container,.container-sm{max-width:1137px}}@media (min-width:8px){.container,.container-md,.container-sm{max-width:1138px}}@media (min-width:9px){.container,.container-lg,.container-md,.container-sm{max-width:1139px}}@media (min-width:10px){.container,.container-lg,.container-md,.container-sm,.container-xl{max-width:1140px}}.row{display:flex;flex-wrap:wrap;margin-left:-15px;margin-right:-15px}.no-gutters{margin-left:0;margin-right:0}.no-gutters>.col,.no-gutters>[class*=col-]{padding-left:0;padding-right:0}.col,.col-1,.col-10,.col-11,.col-12,.col-2,.col-3,.col-4,.col-5,.col-6,.col-7,.col-8,.col-9,.col-auto,.col-lg,.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-auto,.col-md,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-auto,.col-sm,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-auto,.col-xl,.col-xl-1,.col-xl-10,.col-xl-11,.col-xl-12,.col-xl-2,.col-xl-3,.col-xl-4,.col-xl-5,.col-xl-6,.col-xl-7,.col-xl-8,.col-xl-9,.col-xl-auto{padding-left:15px;padding-right:15px;position:relative;width:100%}.col{flex-basis:0;flex-grow:1;max-width:100%}.row-cols-1>*{flex:0 0 100%;max-width:100%}.row-cols-2>*{flex:0 0 50%;max-width:50%}.row-cols-3>*{flex:0 0 33.3333333333%;max-width:33.3333333333%}.row-cols-4>*{flex:0 0 25%;max-width:25%}.row-cols-5>*{flex:0 0 20%;max-width:20%}.row-cols-6>*{flex:0 0 16.6666666667%;max-width:16.6666666667%}.col-auto{flex:0 0 auto;max-width:100%;width:auto}.col-1{flex:0 0 8.33333333%;max-width:8.33333333%}.col-2{flex:0 0 16.66666667%;max-width:16.66666667%}.col-3{flex:0 0 25%;max-width:25%}.col-4{flex:0 0 33.33333333%;max-width:33.33333333%}.col-5{flex:0 0 41.66666667%;max-width:41.66666667%}.col-6{flex:0 0 50%;max-width:50%}.col-7{flex:0 0 58.33333333%;max-width:58.33333333%}.col-8{flex:0 0 66.66666667%;max-width:66.66666667%}.col-9{flex:0 0 75%;max-width:75%}.col-10{flex:0 0 83.33333333%;max-width:83.33333333%}.col-11{flex:0 0 91.66666667%;max-width:91.66666667%}.col-12{flex:0 0 100%;max-width:100%}.order-first{order:-1}.order-last{order:13}.order-0{order:0}.order-1{order:1}.order-2{order:2}.order-3{order:3}.order-4{order:4}.order-5{order:5}.order-6{order:6}.order-7{order:7}.order-8{order:8}.order-9{order:9}.order-10{order:10}.order-11{order:11}.order-12{order:12}.offset-1{margin-left:8.33333333%}.offset-2{margin-left:16.66666667%}.offset-3{margin-left:25%}.offset-4{margin-left:33.33333333%}.offset-5{margin-left:41.66666667%}.offset-6{margin-left:50%}.offset-7{margin-left:58.33333333%}.offset-8{margin-left:66.66666667%}.offset-9{margin-left:75%}.offset-10{margin-left:83.33333333%}.offset-11{margin-left:91.66666667%}@media (min-width:2px){.col-sm{flex-basis:0;flex-grow:1;max-width:100%}.row-cols-sm-1>*{flex:0 0 100%;max-width:100%}.row-cols-sm-2>*{flex:0 0 50%;max-width:50%}.row-cols-sm-3>*{flex:0 0 33.3333333333%;max-width:33.3333333333%}.row-cols-sm-4>*{flex:0 0 25%;max-width:25%}.row-cols-sm-5>*{flex:0 0 20%;max-width:20%}.row-cols-sm-6>*{flex:0 0 16.6666666667%;max-width:16.6666666667%}.col-sm-auto{flex:0 0 auto;max-width:100%;width:auto}.col-sm-1{flex:0 0 8.33333333%;max-width:8.33333333%}.col-sm-2{flex:0 0 16.66666667%;max-width:16.66666667%}.col-sm-3{flex:0 0 25%;max-width:25%}.col-sm-4{flex:0 0 33.33333333%;max-width:33.33333333%}.col-sm-5{flex:0 0 41.66666667%;max-width:41.66666667%}.col-sm-6{flex:0 0 50%;max-width:50%}.col-sm-7{flex:0 0 58.33333333%;max-width:58.33333333%}.col-sm-8{flex:0 0 66.66666667%;max-width:66.66666667%}.col-sm-9{flex:0 0 75%;max-width:75%}.col-sm-10{flex:0 0 83.33333333%;max-width:83.33333333%}.col-sm-11{flex:0 0 91.66666667%;max-width:91.66666667%}.col-sm-12{flex:0 0 100%;max-width:100%}.order-sm-first{order:-1}.order-sm-last{order:13}.order-sm-0{order:0}.order-sm-1{order:1}.order-sm-2{order:2}.order-sm-3{order:3}.order-sm-4{order:4}.order-sm-5{order:5}.order-sm-6{order:6}.order-sm-7{order:7}.order-sm-8{order:8}.order-sm-9{order:9}.order-sm-10{order:10}.order-sm-11{order:11}.order-sm-12{order:12}.offset-sm-0{margin-left:0}.offset-sm-1{margin-left:8.33333333%}.offset-sm-2{margin-left:16.66666667%}.offset-sm-3{margin-left:25%}.offset-sm-4{margin-left:33.33333333%}.offset-sm-5{margin-left:41.66666667%}.offset-sm-6{margin-left:50%}.offset-sm-7{margin-left:58.33333333%}.offset-sm-8{margin-left:66.66666667%}.offset-sm-9{margin-left:75%}.offset-sm-10{margin-left:83.33333333%}.offset-sm-11{margin-left:91.66666667%}}@media (min-width:8px){.col-md{flex-basis:0;flex-grow:1;max-width:100%}.row-cols-md-1>*{flex:0 0 100%;max-width:100%}.row-cols-md-2>*{flex:0 0 50%;max-width:50%}.row-cols-md-3>*{flex:0 0 33.3333333333%;max-width:33.3333333333%}.row-cols-md-4>*{flex:0 0 25%;max-width:25%}.row-cols-md-5>*{flex:0 0 20%;max-width:20%}.row-cols-md-6>*{flex:0 0 16.6666666667%;max-width:16.6666666667%}.col-md-auto{flex:0 0 auto;max-width:100%;width:auto}.col-md-1{flex:0 0 8.33333333%;max-width:8.33333333%}.col-md-2{flex:0 0 16.66666667%;max-width:16.66666667%}.col-md-3{flex:0 0 25%;max-width:25%}.col-md-4{flex:0 0 33.33333333%;max-width:33.33333333%}.col-md-5{flex:0 0 41.66666667%;max-width:41.66666667%}.col-md-6{flex:0 0 50%;max-width:50%}.col-md-7{flex:0 0 58.33333333%;max-width:58.33333333%}.col-md-8{flex:0 0 66.66666667%;max-width:66.66666667%}.col-md-9{flex:0 0 75%;max-width:75%}.col-md-10{flex:0 0 83.33333333%;max-width:83.33333333%}.col-md-11{flex:0 0 91.66666667%;max-width:91.66666667%}.col-md-12{flex:0 0 100%;max-width:100%}.order-md-first{order:-1}.order-md-last{order:13}.order-md-0{order:0}.order-md-1{order:1}.order-md-2{order:2}.order-md-3{order:3}.order-md-4{order:4}.order-md-5{order:5}.order-md-6{order:6}.order-md-7{order:7}.order-md-8{order:8}.order-md-9{order:9}.order-md-10{order:10}.order-md-11{order:11}.order-md-12{order:12}.offset-md-0{margin-left:0}.offset-md-1{margin-left:8.33333333%}.offset-md-2{margin-left:16.66666667%}.offset-md-3{margin-left:25%}.offset-md-4{margin-left:33.33333333%}.offset-md-5{margin-left:41.66666667%}.offset-md-6{margin-left:50%}.offset-md-7{margin-left:58.33333333%}.offset-md-8{margin-left:66.66666667%}.offset-md-9{margin-left:75%}.offset-md-10{margin-left:83.33333333%}.offset-md-11{margin-left:91.66666667%}}@media (min-width:9px){.col-lg{flex-basis:0;flex-grow:1;max-width:100%}.row-cols-lg-1>*{flex:0 0 100%;max-width:100%}.row-cols-lg-2>*{flex:0 0 50%;max-width:50%}.row-cols-lg-3>*{flex:0 0 33.3333333333%;max-width:33.3333333333%}.row-cols-lg-4>*{flex:0 0 25%;max-width:25%}.row-cols-lg-5>*{flex:0 0 20%;max-width:20%}.row-cols-lg-6>*{flex:0 0 16.6666666667%;max-width:16.6666666667%}.col-lg-auto{flex:0 0 auto;max-width:100%;width:auto}.col-lg-1{flex:0 0 8.33333333%;max-width:8.33333333%}.col-lg-2{flex:0 0 16.66666667%;max-width:16.66666667%}.col-lg-3{flex:0 0 25%;max-width:25%}.col-lg-4{flex:0 0 33.33333333%;max-width:33.33333333%}.col-lg-5{flex:0 0 41.66666667%;max-width:41.66666667%}.col-lg-6{flex:0 0 50%;max-width:50%}.col-lg-7{flex:0 0 58.33333333%;max-width:58.33333333%}.col-lg-8{flex:0 0 66.66666667%;max-width:66.66666667%}.col-lg-9{flex:0 0 75%;max-width:75%}.col-lg-10{flex:0 0 83.33333333%;max-width:83.33333333%}.col-lg-11{flex:0 0 91.66666667%;max-width:91.66666667%}.col-lg-12{flex:0 0 100%;max-width:100%}.order-lg-first{order:-1}.order-lg-last{order:13}.order-lg-0{order:0}.order-lg-1{order:1}.order-lg-2{order:2}.order-lg-3{order:3}.order-lg-4{order:4}.order-lg-5{order:5}.order-lg-6{order:6}.order-lg-7{order:7}.order-lg-8{order:8}.order-lg-9{order:9}.order-lg-10{order:10}.order-lg-11{order:11}.order-lg-12{order:12}.offset-lg-0{margin-left:0}.offset-lg-1{margin-left:8.33333333%}.offset-lg-2{margin-left:16.66666667%}.offset-lg-3{margin-left:25%}.offset-lg-4{margin-left:33.33333333%}.offset-lg-5{margin-left:41.66666667%}.offset-lg-6{margin-left:50%}.offset-lg-7{margin-left:58.33333333%}.offset-lg-8{margin-left:66.66666667%}.offset-lg-9{margin-left:75%}.offset-lg-10{margin-left:83.33333333%}.offset-lg-11{margin-left:91.66666667%}}@media (min-width:10px){.col-xl{flex-basis:0;flex-grow:1;max-width:100%}.row-cols-xl-1>*{flex:0 0 100%;max-width:100%}.row-cols-xl-2>*{flex:0 0 50%;max-width:50%}.row-cols-xl-3>*{flex:0 0 33.3333333333%;max-width:33.3333333333%}.row-cols-xl-4>*{flex:0 0 25%;max-width:25%}.row-cols-xl-5>*{flex:0 0 20%;max-width:20%}.row-cols-xl-6>*{flex:0 0 16.6666666667%;max-width:16.6666666667%}.col-xl-auto{flex:0 0 auto;max-width:100%;width:auto}.col-xl-1{flex:0 0 8.33333333%;max-width:8.33333333%}.col-xl-2{flex:0 0 16.66666667%;max-width:16.66666667%}.col-xl-3{flex:0 0 25%;max-width:25%}.col-xl-4{flex:0 0 33.33333333%;max-width:33.33333333%}.col-xl-5{flex:0 0 41.66666667%;max-width:41.66666667%}.col-xl-6{flex:0 0 50%;max-width:50%}.col-xl-7{flex:0 0 58.33333333%;max-width:58.33333333%}.col-xl-8{flex:0 0 66.66666667%;max-width:66.66666667%}.col-xl-9{flex:0 0 75%;max-width:75%}.col-xl-10{flex:0 0 83.33333333%;max-width:83.33333333%}.col-xl-11{flex:0 0 91.66666667%;max-width:91.66666667%}.col-xl-12{flex:0 0 100%;max-width:100%}.order-xl-first{order:-1}.order-xl-last{order:13}.order-xl-0{order:0}.order-xl-1{order:1}.order-xl-2{order:2}.order-xl-3{order:3}.order-xl-4{order:4}.order-xl-5{order:5}.order-xl-6{order:6}.order-xl-7{order:7}.order-xl-8{order:8}.order-xl-9{order:9}.order-xl-10{order:10}.order-xl-11{order:11}.order-xl-12{order:12}.offset-xl-0{margin-left:0}.offset-xl-1{margin-left:8.33333333%}.offset-xl-2{margin-left:16.66666667%}.offset-xl-3{margin-left:25%}.offset-xl-4{margin-left:33.33333333%}.offset-xl-5{margin-left:41.66666667%}.offset-xl-6{margin-left:50%}.offset-xl-7{margin-left:58.33333333%}.offset-xl-8{margin-left:66.66666667%}.offset-xl-9{margin-left:75%}.offset-xl-10{margin-left:83.33333333%}.offset-xl-11{margin-left:91.66666667%}}.table{color:#111827;margin-bottom:1rem;width:100%}.table td,.table th{border-top:1px solid #e5e7eb;padding:.75rem;vertical-align:top}.table thead th{border-bottom:2px solid #e5e7eb;vertical-align:bottom}.table tbody+tbody{border-top:2px solid #e5e7eb}.table-sm td,.table-sm th{padding:.3rem}.table-bordered,.table-bordered td,.table-bordered th{border:1px solid #e5e7eb}.table-bordered thead td,.table-bordered thead th{border-bottom-width:2px}.table-borderless tbody+tbody,.table-borderless td,.table-borderless th,.table-borderless thead th{border:0}.table-striped tbody tr:nth-of-type(odd){background-color:rgba(0,0,0,.05)}.table-hover tbody tr:hover{background-color:#f3f4f6;color:#111827}.table-primary,.table-primary>td,.table-primary>th{background-color:#cacaf0}.table-primary tbody+tbody,.table-primary td,.table-primary th,.table-primary thead th{border-color:#9c9ce2}.table-hover .table-primary:hover,.table-hover .table-primary:hover>td,.table-hover .table-primary:hover>th{background-color:#b6b6ea}.table-secondary,.table-secondary>td,.table-secondary>th{background-color:#cdcfd3}.table-secondary tbody+tbody,.table-secondary td,.table-secondary th,.table-secondary thead th{border-color:#a1a7ae}.table-hover .table-secondary:hover,.table-hover .table-secondary:hover>td,.table-hover .table-secondary:hover>th{background-color:#bfc2c7}.table-success,.table-success>td,.table-success>th{background-color:#b9e2d5}.table-success tbody+tbody,.table-success td,.table-success th,.table-success thead th{border-color:#7dc8b1}.table-hover .table-success:hover,.table-hover .table-success:hover>td,.table-hover .table-success:hover>th{background-color:#a7dbca}.table-info,.table-info>td,.table-info>th{background-color:#c2d3f9}.table-info tbody+tbody,.table-info td,.table-info th,.table-info thead th{border-color:#8eaef5}.table-hover .table-info:hover,.table-hover .table-info:hover>td,.table-hover .table-info:hover>th{background-color:#abc2f7}.table-warning,.table-warning>td,.table-warning>th{background-color:#f4d9b9}.table-warning tbody+tbody,.table-warning td,.table-warning th,.table-warning thead th{border-color:#ebb87e}.table-hover .table-warning:hover,.table-hover .table-warning:hover>td,.table-hover .table-warning:hover>th{background-color:#f1cda3}.table-danger,.table-danger>td,.table-danger>th{background-color:#f5c2c2}.table-danger tbody+tbody,.table-danger td,.table-danger th,.table-danger thead th{border-color:#ed8e8e}.table-hover .table-danger:hover,.table-hover .table-danger:hover>td,.table-hover .table-danger:hover>th{background-color:#f1acac}.table-light,.table-light>td,.table-light>th{background-color:#fcfcfc}.table-light tbody+tbody,.table-light td,.table-light th,.table-light thead th{border-color:#f9f9fa}.table-hover .table-light:hover,.table-hover .table-light:hover>td,.table-hover .table-light:hover>th{background-color:#efefef}.table-dark,.table-dark>td,.table-dark>th{background-color:#c0c3c7}.table-dark tbody+tbody,.table-dark td,.table-dark th,.table-dark thead th{border-color:#8b9097}.table-hover .table-dark:hover,.table-hover .table-dark:hover>td,.table-hover .table-dark:hover>th{background-color:#b3b6bb}.table-active,.table-active>td,.table-active>th{background-color:#f3f4f6}.table-hover .table-active:hover,.table-hover .table-active:hover>td,.table-hover .table-active:hover>th{background-color:#e4e7eb}.table .thead-dark th{background-color:#1f2937;border-color:#2d3b4f;color:#fff}.table .thead-light th{background-color:#e5e7eb;border-color:#e5e7eb;color:#374151}.table-dark{background-color:#1f2937;color:#fff}.table-dark td,.table-dark th,.table-dark thead th{border-color:#2d3b4f}.table-dark.table-bordered{border:0}.table-dark.table-striped tbody tr:nth-of-type(odd){background-color:hsla(0,0%,100%,.05)}.table-dark.table-hover tbody tr:hover{background-color:hsla(0,0%,100%,.075);color:#fff}@media (max-width:1.98px){.table-responsive-sm{-webkit-overflow-scrolling:touch;display:block;overflow-x:auto;width:100%}.table-responsive-sm>.table-bordered{border:0}}@media (max-width:7.98px){.table-responsive-md{-webkit-overflow-scrolling:touch;display:block;overflow-x:auto;width:100%}.table-responsive-md>.table-bordered{border:0}}@media (max-width:8.98px){.table-responsive-lg{-webkit-overflow-scrolling:touch;display:block;overflow-x:auto;width:100%}.table-responsive-lg>.table-bordered{border:0}}@media (max-width:9.98px){.table-responsive-xl{-webkit-overflow-scrolling:touch;display:block;overflow-x:auto;width:100%}.table-responsive-xl>.table-bordered{border:0}}.table-responsive{-webkit-overflow-scrolling:touch;display:block;overflow-x:auto;width:100%}.table-responsive>.table-bordered{border:0}.form-control{background-clip:padding-box;background-color:#fff;border:1px solid #d1d5db;border-radius:.25rem;color:#1f2937;display:block;font-size:1rem;font-weight:400;height:calc(1.5em + .75rem + 2px);line-height:1.5;padding:.375rem .75rem;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out;width:100%}@media (prefers-reduced-motion:reduce){.form-control{transition:none}}.form-control::-ms-expand{background-color:transparent;border:0}.form-control:focus{background-color:#fff;border-color:#a3a3e5;box-shadow:0 0 0 .2rem rgba(64,64,200,.25);color:#1f2937;outline:0}.form-control::-moz-placeholder{color:#4b5563;opacity:1}.form-control::placeholder{color:#4b5563;opacity:1}.form-control:disabled,.form-control[readonly]{background-color:#e5e7eb;opacity:1}input[type=date].form-control,input[type=datetime-local].form-control,input[type=month].form-control,input[type=time].form-control{-webkit-appearance:none;-moz-appearance:none;appearance:none}select.form-control:-moz-focusring{color:transparent;text-shadow:0 0 0 #1f2937}select.form-control:focus::-ms-value{background-color:#fff;color:#1f2937}.form-control-file,.form-control-range{display:block;width:100%}.col-form-label{font-size:inherit;line-height:1.5;margin-bottom:0;padding-bottom:calc(.375rem + 1px);padding-top:calc(.375rem + 1px)}.col-form-label-lg{font-size:1.25rem;line-height:1.5;padding-bottom:calc(.5rem + 1px);padding-top:calc(.5rem + 1px)}.col-form-label-sm{font-size:.875rem;line-height:1.5;padding-bottom:calc(.25rem + 1px);padding-top:calc(.25rem + 1px)}.form-control-plaintext{background-color:transparent;border:solid transparent;border-width:1px 0;color:#111827;display:block;font-size:1rem;line-height:1.5;margin-bottom:0;padding:.375rem 0;width:100%}.form-control-plaintext.form-control-lg,.form-control-plaintext.form-control-sm{padding-left:0;padding-right:0}.form-control-sm{border-radius:.2rem;font-size:.875rem;height:calc(1.5em + .5rem + 2px);line-height:1.5;padding:.25rem .5rem}.form-control-lg{border-radius:6px;font-size:1.25rem;height:calc(1.5em + 1rem + 2px);line-height:1.5;padding:.5rem 1rem}select.form-control[multiple],select.form-control[size],textarea.form-control{height:auto}.form-group{margin-bottom:1rem}.form-text{display:block;margin-top:.25rem}.form-row{display:flex;flex-wrap:wrap;margin-left:-5px;margin-right:-5px}.form-row>.col,.form-row>[class*=col-]{padding-left:5px;padding-right:5px}.form-check{display:block;padding-left:1.25rem;position:relative}.form-check-input{margin-left:-1.25rem;margin-top:.3rem;position:absolute}.form-check-input:disabled~.form-check-label,.form-check-input[disabled]~.form-check-label{color:#6b7280}.form-check-label{margin-bottom:0}.form-check-inline{align-items:center;display:inline-flex;margin-right:.75rem;padding-left:0}.form-check-inline .form-check-input{margin-left:0;margin-right:.3125rem;margin-top:0;position:static}.valid-feedback{color:#059669;display:none;font-size:.875em;margin-top:.25rem;width:100%}.valid-tooltip{background-color:rgba(5,150,105,.9);border-radius:.25rem;color:#fff;display:none;font-size:.875rem;left:0;line-height:1.5;margin-top:.1rem;max-width:100%;padding:.25rem .5rem;position:absolute;top:100%;z-index:5}.form-row>.col>.valid-tooltip,.form-row>[class*=col-]>.valid-tooltip{left:5px}.is-valid~.valid-feedback,.is-valid~.valid-tooltip,.was-validated :valid~.valid-feedback,.was-validated :valid~.valid-tooltip{display:block}.form-control.is-valid,.was-validated .form-control:valid{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8'%3E%3Cpath fill='%23059669' d='M2.3 6.73.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3E%3C/svg%3E");background-position:right calc(.375em + .1875rem) center;background-repeat:no-repeat;background-size:calc(.75em + .375rem) calc(.75em + .375rem);border-color:#059669;padding-right:calc(1.5em + .75rem)!important}.form-control.is-valid:focus,.was-validated .form-control:valid:focus{border-color:#059669;box-shadow:0 0 0 .2rem rgba(5,150,105,.25)}.was-validated select.form-control:valid,select.form-control.is-valid{background-position:right 1.5rem center;padding-right:3rem!important}.was-validated textarea.form-control:valid,textarea.form-control.is-valid{background-position:top calc(.375em + .1875rem) right calc(.375em + .1875rem);padding-right:calc(1.5em + .75rem)}.custom-select.is-valid,.was-validated .custom-select:valid{background:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='4' height='5'%3E%3Cpath fill='%231f2937' d='M2 0 0 2h4zm0 5L0 3h4z'/%3E%3C/svg%3E") right .75rem center/8px 10px no-repeat,#fff url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8'%3E%3Cpath fill='%23059669' d='M2.3 6.73.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3E%3C/svg%3E") center right 1.75rem/calc(.75em + .375rem) calc(.75em + .375rem) no-repeat;border-color:#059669;padding-right:calc(.75em + 2.3125rem)!important}.custom-select.is-valid:focus,.was-validated .custom-select:valid:focus{border-color:#059669;box-shadow:0 0 0 .2rem rgba(5,150,105,.25)}.form-check-input.is-valid~.form-check-label,.was-validated .form-check-input:valid~.form-check-label{color:#059669}.form-check-input.is-valid~.valid-feedback,.form-check-input.is-valid~.valid-tooltip,.was-validated .form-check-input:valid~.valid-feedback,.was-validated .form-check-input:valid~.valid-tooltip{display:block}.custom-control-input.is-valid~.custom-control-label,.was-validated .custom-control-input:valid~.custom-control-label{color:#059669}.custom-control-input.is-valid~.custom-control-label:before,.was-validated .custom-control-input:valid~.custom-control-label:before{border-color:#059669}.custom-control-input.is-valid:checked~.custom-control-label:before,.was-validated .custom-control-input:valid:checked~.custom-control-label:before{background-color:#07c78c;border-color:#07c78c}.custom-control-input.is-valid:focus~.custom-control-label:before,.was-validated .custom-control-input:valid:focus~.custom-control-label:before{box-shadow:0 0 0 .2rem rgba(5,150,105,.25)}.custom-control-input.is-valid:focus:not(:checked)~.custom-control-label:before,.was-validated .custom-control-input:valid:focus:not(:checked)~.custom-control-label:before{border-color:#059669}.custom-file-input.is-valid~.custom-file-label,.was-validated .custom-file-input:valid~.custom-file-label{border-color:#059669}.custom-file-input.is-valid:focus~.custom-file-label,.was-validated .custom-file-input:valid:focus~.custom-file-label{border-color:#059669;box-shadow:0 0 0 .2rem rgba(5,150,105,.25)}.invalid-feedback{color:#dc2626;display:none;font-size:.875em;margin-top:.25rem;width:100%}.invalid-tooltip{background-color:rgba(220,38,38,.9);border-radius:.25rem;color:#fff;display:none;font-size:.875rem;left:0;line-height:1.5;margin-top:.1rem;max-width:100%;padding:.25rem .5rem;position:absolute;top:100%;z-index:5}.form-row>.col>.invalid-tooltip,.form-row>[class*=col-]>.invalid-tooltip{left:5px}.is-invalid~.invalid-feedback,.is-invalid~.invalid-tooltip,.was-validated :invalid~.invalid-feedback,.was-validated :invalid~.invalid-tooltip{display:block}.form-control.is-invalid,.was-validated .form-control:invalid{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' fill='none' stroke='%23dc2626'%3E%3Ccircle cx='6' cy='6' r='4.5'/%3E%3Cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3E%3Ccircle cx='6' cy='8.2' r='.6' fill='%23dc2626' stroke='none'/%3E%3C/svg%3E");background-position:right calc(.375em + .1875rem) center;background-repeat:no-repeat;background-size:calc(.75em + .375rem) calc(.75em + .375rem);border-color:#dc2626;padding-right:calc(1.5em + .75rem)!important}.form-control.is-invalid:focus,.was-validated .form-control:invalid:focus{border-color:#dc2626;box-shadow:0 0 0 .2rem rgba(220,38,38,.25)}.was-validated select.form-control:invalid,select.form-control.is-invalid{background-position:right 1.5rem center;padding-right:3rem!important}.was-validated textarea.form-control:invalid,textarea.form-control.is-invalid{background-position:top calc(.375em + .1875rem) right calc(.375em + .1875rem);padding-right:calc(1.5em + .75rem)}.custom-select.is-invalid,.was-validated .custom-select:invalid{background:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='4' height='5'%3E%3Cpath fill='%231f2937' d='M2 0 0 2h4zm0 5L0 3h4z'/%3E%3C/svg%3E") right .75rem center/8px 10px no-repeat,#fff url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' fill='none' stroke='%23dc2626'%3E%3Ccircle cx='6' cy='6' r='4.5'/%3E%3Cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3E%3Ccircle cx='6' cy='8.2' r='.6' fill='%23dc2626' stroke='none'/%3E%3C/svg%3E") center right 1.75rem/calc(.75em + .375rem) calc(.75em + .375rem) no-repeat;border-color:#dc2626;padding-right:calc(.75em + 2.3125rem)!important}.custom-select.is-invalid:focus,.was-validated .custom-select:invalid:focus{border-color:#dc2626;box-shadow:0 0 0 .2rem rgba(220,38,38,.25)}.form-check-input.is-invalid~.form-check-label,.was-validated .form-check-input:invalid~.form-check-label{color:#dc2626}.form-check-input.is-invalid~.invalid-feedback,.form-check-input.is-invalid~.invalid-tooltip,.was-validated .form-check-input:invalid~.invalid-feedback,.was-validated .form-check-input:invalid~.invalid-tooltip{display:block}.custom-control-input.is-invalid~.custom-control-label,.was-validated .custom-control-input:invalid~.custom-control-label{color:#dc2626}.custom-control-input.is-invalid~.custom-control-label:before,.was-validated .custom-control-input:invalid~.custom-control-label:before{border-color:#dc2626}.custom-control-input.is-invalid:checked~.custom-control-label:before,.was-validated .custom-control-input:invalid:checked~.custom-control-label:before{background-color:#e35252;border-color:#e35252}.custom-control-input.is-invalid:focus~.custom-control-label:before,.was-validated .custom-control-input:invalid:focus~.custom-control-label:before{box-shadow:0 0 0 .2rem rgba(220,38,38,.25)}.custom-control-input.is-invalid:focus:not(:checked)~.custom-control-label:before,.was-validated .custom-control-input:invalid:focus:not(:checked)~.custom-control-label:before{border-color:#dc2626}.custom-file-input.is-invalid~.custom-file-label,.was-validated .custom-file-input:invalid~.custom-file-label{border-color:#dc2626}.custom-file-input.is-invalid:focus~.custom-file-label,.was-validated .custom-file-input:invalid:focus~.custom-file-label{border-color:#dc2626;box-shadow:0 0 0 .2rem rgba(220,38,38,.25)}.form-inline{align-items:center;display:flex;flex-flow:row wrap}.form-inline .form-check{width:100%}@media (min-width:2px){.form-inline label{justify-content:center}.form-inline .form-group,.form-inline label{align-items:center;display:flex;margin-bottom:0}.form-inline .form-group{flex:0 0 auto;flex-flow:row wrap}.form-inline .form-control{display:inline-block;vertical-align:middle;width:auto}.form-inline .form-control-plaintext{display:inline-block}.form-inline .custom-select,.form-inline .input-group{width:auto}.form-inline .form-check{align-items:center;display:flex;justify-content:center;padding-left:0;width:auto}.form-inline .form-check-input{flex-shrink:0;margin-left:0;margin-right:.25rem;margin-top:0;position:relative}.form-inline .custom-control{align-items:center;justify-content:center}.form-inline .custom-control-label{margin-bottom:0}}.btn{background-color:transparent;border:1px solid transparent;border-radius:.25rem;color:#111827;display:inline-block;font-size:1rem;font-weight:400;line-height:1.5;padding:.375rem .75rem;text-align:center;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;-webkit-user-select:none;-moz-user-select:none;user-select:none;vertical-align:middle}@media (prefers-reduced-motion:reduce){.btn{transition:none}}.btn:hover{color:#111827;text-decoration:none}.btn.focus,.btn:focus{box-shadow:0 0 0 .2rem rgba(64,64,200,.25);outline:0}.btn.disabled,.btn:disabled{opacity:.65}.btn:not(:disabled):not(.disabled){cursor:pointer}a.btn.disabled,fieldset:disabled a.btn{pointer-events:none}.btn-primary{background-color:#4040c8;border-color:#4040c8;color:#fff}.btn-primary.focus,.btn-primary:focus,.btn-primary:hover{background-color:#3232af;border-color:#3030a5;color:#fff}.btn-primary.focus,.btn-primary:focus{box-shadow:0 0 0 0 rgba(93,93,208,.5)}.btn-primary.disabled,.btn-primary:disabled{background-color:#4040c8;border-color:#4040c8;color:#fff}.btn-primary:not(:disabled):not(.disabled).active,.btn-primary:not(:disabled):not(.disabled):active,.show>.btn-primary.dropdown-toggle{background-color:#3030a5;border-color:#2d2d9b;color:#fff}.btn-primary:not(:disabled):not(.disabled).active:focus,.btn-primary:not(:disabled):not(.disabled):active:focus,.show>.btn-primary.dropdown-toggle:focus{box-shadow:0 0 0 0 rgba(93,93,208,.5)}.btn-secondary{background-color:#4b5563;border-color:#4b5563;color:#fff}.btn-secondary.focus,.btn-secondary:focus,.btn-secondary:hover{background-color:#3b424d;border-color:#353c46;color:#fff}.btn-secondary.focus,.btn-secondary:focus{box-shadow:0 0 0 0 hsla(213,9%,44%,.5)}.btn-secondary.disabled,.btn-secondary:disabled{background-color:#4b5563;border-color:#4b5563;color:#fff}.btn-secondary:not(:disabled):not(.disabled).active,.btn-secondary:not(:disabled):not(.disabled):active,.show>.btn-secondary.dropdown-toggle{background-color:#353c46;border-color:#30363f;color:#fff}.btn-secondary:not(:disabled):not(.disabled).active:focus,.btn-secondary:not(:disabled):not(.disabled):active:focus,.show>.btn-secondary.dropdown-toggle:focus{box-shadow:0 0 0 0 hsla(213,9%,44%,.5)}.btn-success{background-color:#059669;border-color:#059669;color:#fff}.btn-success.focus,.btn-success:focus,.btn-success:hover{background-color:#04714f;border-color:#036546;color:#fff}.btn-success.focus,.btn-success:focus{box-shadow:0 0 0 0 rgba(43,166,128,.5)}.btn-success.disabled,.btn-success:disabled{background-color:#059669;border-color:#059669;color:#fff}.btn-success:not(:disabled):not(.disabled).active,.btn-success:not(:disabled):not(.disabled):active,.show>.btn-success.dropdown-toggle{background-color:#036546;border-color:#03583e;color:#fff}.btn-success:not(:disabled):not(.disabled).active:focus,.btn-success:not(:disabled):not(.disabled):active:focus,.show>.btn-success.dropdown-toggle:focus{box-shadow:0 0 0 0 rgba(43,166,128,.5)}.btn-info{background-color:#2563eb;border-color:#2563eb;color:#fff}.btn-info.focus,.btn-info:focus,.btn-info:hover{background-color:#1451d6;border-color:#134cca;color:#fff}.btn-info.focus,.btn-info:focus{box-shadow:0 0 0 0 rgba(70,122,238,.5)}.btn-info.disabled,.btn-info:disabled{background-color:#2563eb;border-color:#2563eb;color:#fff}.btn-info:not(:disabled):not(.disabled).active,.btn-info:not(:disabled):not(.disabled):active,.show>.btn-info.dropdown-toggle{background-color:#134cca;border-color:#1248bf;color:#fff}.btn-info:not(:disabled):not(.disabled).active:focus,.btn-info:not(:disabled):not(.disabled):active:focus,.show>.btn-info.dropdown-toggle:focus{box-shadow:0 0 0 0 rgba(70,122,238,.5)}.btn-warning{background-color:#d97706;border-color:#d97706;color:#fff}.btn-warning.focus,.btn-warning:focus,.btn-warning:hover{background-color:#b46305;border-color:#a75c05;color:#fff}.btn-warning.focus,.btn-warning:focus{box-shadow:0 0 0 0 rgba(223,139,43,.5)}.btn-warning.disabled,.btn-warning:disabled{background-color:#d97706;border-color:#d97706;color:#fff}.btn-warning:not(:disabled):not(.disabled).active,.btn-warning:not(:disabled):not(.disabled):active,.show>.btn-warning.dropdown-toggle{background-color:#a75c05;border-color:#9b5504;color:#fff}.btn-warning:not(:disabled):not(.disabled).active:focus,.btn-warning:not(:disabled):not(.disabled):active:focus,.show>.btn-warning.dropdown-toggle:focus{box-shadow:0 0 0 0 rgba(223,139,43,.5)}.btn-danger{background-color:#dc2626;border-color:#dc2626;color:#fff}.btn-danger.focus,.btn-danger:focus,.btn-danger:hover{background-color:#bd1f1f;border-color:#b21d1d;color:#fff}.btn-danger.focus,.btn-danger:focus{box-shadow:0 0 0 0 rgba(225,71,71,.5)}.btn-danger.disabled,.btn-danger:disabled{background-color:#dc2626;border-color:#dc2626;color:#fff}.btn-danger:not(:disabled):not(.disabled).active,.btn-danger:not(:disabled):not(.disabled):active,.show>.btn-danger.dropdown-toggle{background-color:#b21d1d;border-color:#a71b1b;color:#fff}.btn-danger:not(:disabled):not(.disabled).active:focus,.btn-danger:not(:disabled):not(.disabled):active:focus,.show>.btn-danger.dropdown-toggle:focus{box-shadow:0 0 0 0 rgba(225,71,71,.5)}.btn-light{background-color:#f3f4f6;border-color:#f3f4f6;color:#111827}.btn-light.focus,.btn-light:focus,.btn-light:hover{background-color:#dde0e6;border-color:#d6d9e0;color:#111827}.btn-light.focus,.btn-light:focus{box-shadow:0 0 0 0 hsla(220,7%,83%,.5)}.btn-light.disabled,.btn-light:disabled{background-color:#f3f4f6;border-color:#f3f4f6;color:#111827}.btn-light:not(:disabled):not(.disabled).active,.btn-light:not(:disabled):not(.disabled):active,.show>.btn-light.dropdown-toggle{background-color:#d6d9e0;border-color:#cfd3db;color:#111827}.btn-light:not(:disabled):not(.disabled).active:focus,.btn-light:not(:disabled):not(.disabled):active:focus,.show>.btn-light.dropdown-toggle:focus{box-shadow:0 0 0 0 hsla(220,7%,83%,.5)}.btn-dark{background-color:#1f2937;border-color:#1f2937;color:#fff}.btn-dark.focus,.btn-dark:focus,.btn-dark:hover{background-color:#11171f;border-color:#0d1116;color:#fff}.btn-dark.focus,.btn-dark:focus{box-shadow:0 0 0 0 rgba(65,73,85,.5)}.btn-dark.disabled,.btn-dark:disabled{background-color:#1f2937;border-color:#1f2937;color:#fff}.btn-dark:not(:disabled):not(.disabled).active,.btn-dark:not(:disabled):not(.disabled):active,.show>.btn-dark.dropdown-toggle{background-color:#0d1116;border-color:#080b0e;color:#fff}.btn-dark:not(:disabled):not(.disabled).active:focus,.btn-dark:not(:disabled):not(.disabled):active:focus,.show>.btn-dark.dropdown-toggle:focus{box-shadow:0 0 0 0 rgba(65,73,85,.5)}.btn-outline-primary{border-color:#4040c8;color:#4040c8}.btn-outline-primary:hover{background-color:#4040c8;border-color:#4040c8;color:#fff}.btn-outline-primary.focus,.btn-outline-primary:focus{box-shadow:0 0 0 0 rgba(64,64,200,.5)}.btn-outline-primary.disabled,.btn-outline-primary:disabled{background-color:transparent;color:#4040c8}.btn-outline-primary:not(:disabled):not(.disabled).active,.btn-outline-primary:not(:disabled):not(.disabled):active,.show>.btn-outline-primary.dropdown-toggle{background-color:#4040c8;border-color:#4040c8;color:#fff}.btn-outline-primary:not(:disabled):not(.disabled).active:focus,.btn-outline-primary:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-primary.dropdown-toggle:focus{box-shadow:0 0 0 0 rgba(64,64,200,.5)}.btn-outline-secondary{border-color:#4b5563;color:#4b5563}.btn-outline-secondary:hover{background-color:#4b5563;border-color:#4b5563;color:#fff}.btn-outline-secondary.focus,.btn-outline-secondary:focus{box-shadow:0 0 0 0 rgba(75,85,99,.5)}.btn-outline-secondary.disabled,.btn-outline-secondary:disabled{background-color:transparent;color:#4b5563}.btn-outline-secondary:not(:disabled):not(.disabled).active,.btn-outline-secondary:not(:disabled):not(.disabled):active,.show>.btn-outline-secondary.dropdown-toggle{background-color:#4b5563;border-color:#4b5563;color:#fff}.btn-outline-secondary:not(:disabled):not(.disabled).active:focus,.btn-outline-secondary:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-secondary.dropdown-toggle:focus{box-shadow:0 0 0 0 rgba(75,85,99,.5)}.btn-outline-success{border-color:#059669;color:#059669}.btn-outline-success:hover{background-color:#059669;border-color:#059669;color:#fff}.btn-outline-success.focus,.btn-outline-success:focus{box-shadow:0 0 0 0 rgba(5,150,105,.5)}.btn-outline-success.disabled,.btn-outline-success:disabled{background-color:transparent;color:#059669}.btn-outline-success:not(:disabled):not(.disabled).active,.btn-outline-success:not(:disabled):not(.disabled):active,.show>.btn-outline-success.dropdown-toggle{background-color:#059669;border-color:#059669;color:#fff}.btn-outline-success:not(:disabled):not(.disabled).active:focus,.btn-outline-success:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-success.dropdown-toggle:focus{box-shadow:0 0 0 0 rgba(5,150,105,.5)}.btn-outline-info{border-color:#2563eb;color:#2563eb}.btn-outline-info:hover{background-color:#2563eb;border-color:#2563eb;color:#fff}.btn-outline-info.focus,.btn-outline-info:focus{box-shadow:0 0 0 0 rgba(37,99,235,.5)}.btn-outline-info.disabled,.btn-outline-info:disabled{background-color:transparent;color:#2563eb}.btn-outline-info:not(:disabled):not(.disabled).active,.btn-outline-info:not(:disabled):not(.disabled):active,.show>.btn-outline-info.dropdown-toggle{background-color:#2563eb;border-color:#2563eb;color:#fff}.btn-outline-info:not(:disabled):not(.disabled).active:focus,.btn-outline-info:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-info.dropdown-toggle:focus{box-shadow:0 0 0 0 rgba(37,99,235,.5)}.btn-outline-warning{border-color:#d97706;color:#d97706}.btn-outline-warning:hover{background-color:#d97706;border-color:#d97706;color:#fff}.btn-outline-warning.focus,.btn-outline-warning:focus{box-shadow:0 0 0 0 rgba(217,119,6,.5)}.btn-outline-warning.disabled,.btn-outline-warning:disabled{background-color:transparent;color:#d97706}.btn-outline-warning:not(:disabled):not(.disabled).active,.btn-outline-warning:not(:disabled):not(.disabled):active,.show>.btn-outline-warning.dropdown-toggle{background-color:#d97706;border-color:#d97706;color:#fff}.btn-outline-warning:not(:disabled):not(.disabled).active:focus,.btn-outline-warning:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-warning.dropdown-toggle:focus{box-shadow:0 0 0 0 rgba(217,119,6,.5)}.btn-outline-danger{border-color:#dc2626;color:#dc2626}.btn-outline-danger:hover{background-color:#dc2626;border-color:#dc2626;color:#fff}.btn-outline-danger.focus,.btn-outline-danger:focus{box-shadow:0 0 0 0 rgba(220,38,38,.5)}.btn-outline-danger.disabled,.btn-outline-danger:disabled{background-color:transparent;color:#dc2626}.btn-outline-danger:not(:disabled):not(.disabled).active,.btn-outline-danger:not(:disabled):not(.disabled):active,.show>.btn-outline-danger.dropdown-toggle{background-color:#dc2626;border-color:#dc2626;color:#fff}.btn-outline-danger:not(:disabled):not(.disabled).active:focus,.btn-outline-danger:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-danger.dropdown-toggle:focus{box-shadow:0 0 0 0 rgba(220,38,38,.5)}.btn-outline-light{border-color:#f3f4f6;color:#f3f4f6}.btn-outline-light:hover{background-color:#f3f4f6;border-color:#f3f4f6;color:#111827}.btn-outline-light.focus,.btn-outline-light:focus{box-shadow:0 0 0 0 rgba(243,244,246,.5)}.btn-outline-light.disabled,.btn-outline-light:disabled{background-color:transparent;color:#f3f4f6}.btn-outline-light:not(:disabled):not(.disabled).active,.btn-outline-light:not(:disabled):not(.disabled):active,.show>.btn-outline-light.dropdown-toggle{background-color:#f3f4f6;border-color:#f3f4f6;color:#111827}.btn-outline-light:not(:disabled):not(.disabled).active:focus,.btn-outline-light:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-light.dropdown-toggle:focus{box-shadow:0 0 0 0 rgba(243,244,246,.5)}.btn-outline-dark{border-color:#1f2937;color:#1f2937}.btn-outline-dark:hover{background-color:#1f2937;border-color:#1f2937;color:#fff}.btn-outline-dark.focus,.btn-outline-dark:focus{box-shadow:0 0 0 0 rgba(31,41,55,.5)}.btn-outline-dark.disabled,.btn-outline-dark:disabled{background-color:transparent;color:#1f2937}.btn-outline-dark:not(:disabled):not(.disabled).active,.btn-outline-dark:not(:disabled):not(.disabled):active,.show>.btn-outline-dark.dropdown-toggle{background-color:#1f2937;border-color:#1f2937;color:#fff}.btn-outline-dark:not(:disabled):not(.disabled).active:focus,.btn-outline-dark:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-dark.dropdown-toggle:focus{box-shadow:0 0 0 0 rgba(31,41,55,.5)}.btn-link{color:#6366f1;font-weight:400;text-decoration:none}.btn-link:hover{color:#4f46e5}.btn-link.focus,.btn-link:focus,.btn-link:hover{text-decoration:underline}.btn-link.disabled,.btn-link:disabled{color:#4b5563;pointer-events:none}.btn-group-lg>.btn,.btn-lg{border-radius:6px;font-size:1.25rem;line-height:1.5;padding:.5rem 1rem}.btn-group-sm>.btn,.btn-sm{border-radius:.2rem;font-size:.875rem;line-height:1.5;padding:.25rem .5rem}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:.5rem}input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%}.fade{transition:opacity .15s linear}@media (prefers-reduced-motion:reduce){.fade{transition:none}}.fade:not(.show){opacity:0}.collapse:not(.show){display:none}.collapsing{height:0;overflow:hidden;position:relative;transition:height .35s ease}@media (prefers-reduced-motion:reduce){.collapsing{transition:none}}.collapsing.width{height:auto;transition:width .35s ease;width:0}@media (prefers-reduced-motion:reduce){.collapsing.width{transition:none}}.dropdown,.dropleft,.dropright,.dropup{position:relative}.dropdown-toggle{white-space:nowrap}.dropdown-toggle:after{border-bottom:0;border-left:.3em solid transparent;border-right:.3em solid transparent;border-top:.3em solid;content:"";display:inline-block;margin-left:.255em;vertical-align:.255em}.dropdown-toggle:empty:after{margin-left:0}.dropdown-menu{background-clip:padding-box;background-color:#fff;border:1px solid rgba(0,0,0,.15);border-radius:.25rem;color:#111827;display:none;float:left;font-size:1rem;left:0;list-style:none;margin:.125rem 0 0;min-width:10rem;padding:.5rem 0;position:absolute;text-align:left;top:100%;z-index:1000}.dropdown-menu-left{left:0;right:auto}.dropdown-menu-right{left:auto;right:0}@media (min-width:2px){.dropdown-menu-sm-left{left:0;right:auto}.dropdown-menu-sm-right{left:auto;right:0}}@media (min-width:8px){.dropdown-menu-md-left{left:0;right:auto}.dropdown-menu-md-right{left:auto;right:0}}@media (min-width:9px){.dropdown-menu-lg-left{left:0;right:auto}.dropdown-menu-lg-right{left:auto;right:0}}@media (min-width:10px){.dropdown-menu-xl-left{left:0;right:auto}.dropdown-menu-xl-right{left:auto;right:0}}.dropup .dropdown-menu{bottom:100%;margin-bottom:.125rem;margin-top:0;top:auto}.dropup .dropdown-toggle:after{border-bottom:.3em solid;border-left:.3em solid transparent;border-right:.3em solid transparent;border-top:0;content:"";display:inline-block;margin-left:.255em;vertical-align:.255em}.dropup .dropdown-toggle:empty:after{margin-left:0}.dropright .dropdown-menu{left:100%;margin-left:.125rem;margin-top:0;right:auto;top:0}.dropright .dropdown-toggle:after{border-bottom:.3em solid transparent;border-left:.3em solid;border-right:0;border-top:.3em solid transparent;content:"";display:inline-block;margin-left:.255em;vertical-align:.255em}.dropright .dropdown-toggle:empty:after{margin-left:0}.dropright .dropdown-toggle:after{vertical-align:0}.dropleft .dropdown-menu{left:auto;margin-right:.125rem;margin-top:0;right:100%;top:0}.dropleft .dropdown-toggle:after{content:"";display:inline-block;display:none;margin-left:.255em;vertical-align:.255em}.dropleft .dropdown-toggle:before{border-bottom:.3em solid transparent;border-right:.3em solid;border-top:.3em solid transparent;content:"";display:inline-block;margin-right:.255em;vertical-align:.255em}.dropleft .dropdown-toggle:empty:after{margin-left:0}.dropleft .dropdown-toggle:before{vertical-align:0}.dropdown-menu[x-placement^=bottom],.dropdown-menu[x-placement^=left],.dropdown-menu[x-placement^=right],.dropdown-menu[x-placement^=top]{bottom:auto;right:auto}.dropdown-divider{border-top:1px solid #e5e7eb;height:0;margin:.5rem 0;overflow:hidden}.dropdown-item{background-color:transparent;border:0;clear:both;color:#374151;display:block;font-weight:400;padding:.25rem 1.5rem;text-align:inherit;white-space:nowrap;width:100%}.dropdown-item:focus,.dropdown-item:hover{background-color:#e5e7eb;color:#090d15;text-decoration:none}.dropdown-item.active,.dropdown-item:active{background-color:#4040c8;color:#fff;text-decoration:none}.dropdown-item.disabled,.dropdown-item:disabled{background-color:transparent;color:#6b7280;pointer-events:none}.dropdown-menu.show{display:block}.dropdown-header{color:#4b5563;display:block;font-size:.875rem;margin-bottom:0;padding:.5rem 1.5rem;white-space:nowrap}.dropdown-item-text{color:#374151;display:block;padding:.25rem 1.5rem}.btn-group,.btn-group-vertical{display:inline-flex;position:relative;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{flex:1 1 auto;position:relative}.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:hover,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus,.btn-group>.btn:hover{z-index:1}.btn-toolbar{display:flex;flex-wrap:wrap;justify-content:flex-start}.btn-toolbar .input-group{width:auto}.btn-group>.btn-group:not(:first-child),.btn-group>.btn:not(:first-child){margin-left:-1px}.btn-group>.btn-group:not(:last-child)>.btn,.btn-group>.btn:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-top-right-radius:0}.btn-group>.btn-group:not(:first-child)>.btn,.btn-group>.btn:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.dropdown-toggle-split{padding-left:.5625rem;padding-right:.5625rem}.dropdown-toggle-split:after,.dropright .dropdown-toggle-split:after,.dropup .dropdown-toggle-split:after{margin-left:0}.dropleft .dropdown-toggle-split:before{margin-right:0}.btn-group-sm>.btn+.dropdown-toggle-split,.btn-sm+.dropdown-toggle-split{padding-left:.375rem;padding-right:.375rem}.btn-group-lg>.btn+.dropdown-toggle-split,.btn-lg+.dropdown-toggle-split{padding-left:.75rem;padding-right:.75rem}.btn-group-vertical{align-items:flex-start;flex-direction:column;justify-content:center}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group{width:100%}.btn-group-vertical>.btn-group:not(:first-child),.btn-group-vertical>.btn:not(:first-child){margin-top:-1px}.btn-group-vertical>.btn-group:not(:last-child)>.btn,.btn-group-vertical>.btn:not(:last-child):not(.dropdown-toggle){border-bottom-left-radius:0;border-bottom-right-radius:0}.btn-group-vertical>.btn-group:not(:first-child)>.btn,.btn-group-vertical>.btn:not(:first-child){border-top-left-radius:0;border-top-right-radius:0}.btn-group-toggle>.btn,.btn-group-toggle>.btn-group>.btn{margin-bottom:0}.btn-group-toggle>.btn input[type=checkbox],.btn-group-toggle>.btn input[type=radio],.btn-group-toggle>.btn-group>.btn input[type=checkbox],.btn-group-toggle>.btn-group>.btn input[type=radio]{clip:rect(0,0,0,0);pointer-events:none;position:absolute}.input-group{align-items:stretch;display:flex;flex-wrap:wrap;position:relative;width:100%}.input-group>.custom-file,.input-group>.custom-select,.input-group>.form-control,.input-group>.form-control-plaintext{flex:1 1 auto;margin-bottom:0;min-width:0;position:relative;width:1%}.input-group>.custom-file+.custom-file,.input-group>.custom-file+.custom-select,.input-group>.custom-file+.form-control,.input-group>.custom-select+.custom-file,.input-group>.custom-select+.custom-select,.input-group>.custom-select+.form-control,.input-group>.form-control+.custom-file,.input-group>.form-control+.custom-select,.input-group>.form-control+.form-control,.input-group>.form-control-plaintext+.custom-file,.input-group>.form-control-plaintext+.custom-select,.input-group>.form-control-plaintext+.form-control{margin-left:-1px}.input-group>.custom-file .custom-file-input:focus~.custom-file-label,.input-group>.custom-select:focus,.input-group>.form-control:focus{z-index:3}.input-group>.custom-file .custom-file-input:focus{z-index:4}.input-group>.custom-select:not(:first-child),.input-group>.form-control:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.input-group>.custom-file{align-items:center;display:flex}.input-group>.custom-file:not(:last-child) .custom-file-label,.input-group>.custom-file:not(:last-child) .custom-file-label:after{border-bottom-right-radius:0;border-top-right-radius:0}.input-group>.custom-file:not(:first-child) .custom-file-label{border-bottom-left-radius:0;border-top-left-radius:0}.input-group.has-validation>.custom-file:nth-last-child(n+3) .custom-file-label,.input-group.has-validation>.custom-file:nth-last-child(n+3) .custom-file-label:after,.input-group.has-validation>.custom-select:nth-last-child(n+3),.input-group.has-validation>.form-control:nth-last-child(n+3),.input-group:not(.has-validation)>.custom-file:not(:last-child) .custom-file-label,.input-group:not(.has-validation)>.custom-file:not(:last-child) .custom-file-label:after,.input-group:not(.has-validation)>.custom-select:not(:last-child),.input-group:not(.has-validation)>.form-control:not(:last-child){border-bottom-right-radius:0;border-top-right-radius:0}.input-group-append,.input-group-prepend{display:flex}.input-group-append .btn,.input-group-prepend .btn{position:relative;z-index:2}.input-group-append .btn:focus,.input-group-prepend .btn:focus{z-index:3}.input-group-append .btn+.btn,.input-group-append .btn+.input-group-text,.input-group-append .input-group-text+.btn,.input-group-append .input-group-text+.input-group-text,.input-group-prepend .btn+.btn,.input-group-prepend .btn+.input-group-text,.input-group-prepend .input-group-text+.btn,.input-group-prepend .input-group-text+.input-group-text{margin-left:-1px}.input-group-prepend{margin-right:-1px}.input-group-append{margin-left:-1px}.input-group-text{align-items:center;background-color:#e5e7eb;border:1px solid #d1d5db;border-radius:.25rem;color:#1f2937;display:flex;font-size:1rem;font-weight:400;line-height:1.5;margin-bottom:0;padding:.375rem .75rem;text-align:center;white-space:nowrap}.input-group-text input[type=checkbox],.input-group-text input[type=radio]{margin-top:0}.input-group-lg>.custom-select,.input-group-lg>.form-control:not(textarea){height:calc(1.5em + 1rem + 2px)}.input-group-lg>.custom-select,.input-group-lg>.form-control,.input-group-lg>.input-group-append>.btn,.input-group-lg>.input-group-append>.input-group-text,.input-group-lg>.input-group-prepend>.btn,.input-group-lg>.input-group-prepend>.input-group-text{border-radius:6px;font-size:1.25rem;line-height:1.5;padding:.5rem 1rem}.input-group-sm>.custom-select,.input-group-sm>.form-control:not(textarea){height:calc(1.5em + .5rem + 2px)}.input-group-sm>.custom-select,.input-group-sm>.form-control,.input-group-sm>.input-group-append>.btn,.input-group-sm>.input-group-append>.input-group-text,.input-group-sm>.input-group-prepend>.btn,.input-group-sm>.input-group-prepend>.input-group-text{border-radius:.2rem;font-size:.875rem;line-height:1.5;padding:.25rem .5rem}.input-group-lg>.custom-select,.input-group-sm>.custom-select{padding-right:1.75rem}.input-group.has-validation>.input-group-append:nth-last-child(n+3)>.btn,.input-group.has-validation>.input-group-append:nth-last-child(n+3)>.input-group-text,.input-group:not(.has-validation)>.input-group-append:not(:last-child)>.btn,.input-group:not(.has-validation)>.input-group-append:not(:last-child)>.input-group-text,.input-group>.input-group-append:last-child>.btn:not(:last-child):not(.dropdown-toggle),.input-group>.input-group-append:last-child>.input-group-text:not(:last-child),.input-group>.input-group-prepend>.btn,.input-group>.input-group-prepend>.input-group-text{border-bottom-right-radius:0;border-top-right-radius:0}.input-group>.input-group-append>.btn,.input-group>.input-group-append>.input-group-text,.input-group>.input-group-prepend:first-child>.btn:not(:first-child),.input-group>.input-group-prepend:first-child>.input-group-text:not(:first-child),.input-group>.input-group-prepend:not(:first-child)>.btn,.input-group>.input-group-prepend:not(:first-child)>.input-group-text{border-bottom-left-radius:0;border-top-left-radius:0}.custom-control{display:block;min-height:1.5rem;padding-left:1.5rem;position:relative;-webkit-print-color-adjust:exact;print-color-adjust:exact;z-index:1}.custom-control-inline{display:inline-flex;margin-right:1rem}.custom-control-input{height:1.25rem;left:0;opacity:0;position:absolute;width:1rem;z-index:-1}.custom-control-input:checked~.custom-control-label:before{background-color:#4040c8;border-color:#4040c8;color:#fff}.custom-control-input:focus~.custom-control-label:before{box-shadow:0 0 0 .2rem rgba(64,64,200,.25)}.custom-control-input:focus:not(:checked)~.custom-control-label:before{border-color:#a3a3e5}.custom-control-input:not(:disabled):active~.custom-control-label:before{background-color:#cbcbf0;border-color:#cbcbf0;color:#fff}.custom-control-input:disabled~.custom-control-label,.custom-control-input[disabled]~.custom-control-label{color:#4b5563}.custom-control-input:disabled~.custom-control-label:before,.custom-control-input[disabled]~.custom-control-label:before{background-color:#e5e7eb}.custom-control-label{margin-bottom:0;position:relative;vertical-align:top}.custom-control-label:before{background-color:#fff;border:1px solid #6b7280;pointer-events:none}.custom-control-label:after,.custom-control-label:before{content:"";display:block;height:1rem;left:-1.5rem;position:absolute;top:.25rem;width:1rem}.custom-control-label:after{background:50%/50% 50% no-repeat}.custom-checkbox .custom-control-label:before{border-radius:.25rem}.custom-checkbox .custom-control-input:checked~.custom-control-label:after{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8'%3E%3Cpath fill='%23fff' d='m6.564.75-3.59 3.612-1.538-1.55L0 4.26l2.974 2.99L8 2.193z'/%3E%3C/svg%3E")}.custom-checkbox .custom-control-input:indeterminate~.custom-control-label:before{background-color:#4040c8;border-color:#4040c8}.custom-checkbox .custom-control-input:indeterminate~.custom-control-label:after{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='4' height='4'%3E%3Cpath stroke='%23fff' d='M0 2h4'/%3E%3C/svg%3E")}.custom-checkbox .custom-control-input:disabled:checked~.custom-control-label:before{background-color:rgba(64,64,200,.5)}.custom-checkbox .custom-control-input:disabled:indeterminate~.custom-control-label:before{background-color:rgba(64,64,200,.5)}.custom-radio .custom-control-label:before{border-radius:50%}.custom-radio .custom-control-input:checked~.custom-control-label:after{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='-4 -4 8 8'%3E%3Ccircle r='3' fill='%23fff'/%3E%3C/svg%3E")}.custom-radio .custom-control-input:disabled:checked~.custom-control-label:before{background-color:rgba(64,64,200,.5)}.custom-switch{padding-left:2.25rem}.custom-switch .custom-control-label:before{border-radius:.5rem;left:-2.25rem;pointer-events:all;width:1.75rem}.custom-switch .custom-control-label:after{background-color:#6b7280;border-radius:.5rem;height:calc(1rem - 4px);left:calc(-2.25rem + 2px);top:calc(.25rem + 2px);transition:transform .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;width:calc(1rem - 4px)}@media (prefers-reduced-motion:reduce){.custom-switch .custom-control-label:after{transition:none}}.custom-switch .custom-control-input:checked~.custom-control-label:after{background-color:#fff;transform:translateX(.75rem)}.custom-switch .custom-control-input:disabled:checked~.custom-control-label:before{background-color:rgba(64,64,200,.5)}.custom-select{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:#fff url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='4' height='5'%3E%3Cpath fill='%231f2937' d='M2 0 0 2h4zm0 5L0 3h4z'/%3E%3C/svg%3E") right .75rem center/8px 10px no-repeat;border:1px solid #d1d5db;border-radius:.25rem;color:#1f2937;display:inline-block;font-size:1rem;font-weight:400;height:calc(1.5em + .75rem + 2px);line-height:1.5;padding:.375rem 1.75rem .375rem .75rem;vertical-align:middle;width:100%}.custom-select:focus{border-color:#a3a3e5;box-shadow:0 0 0 .2rem rgba(64,64,200,.25);outline:0}.custom-select:focus::-ms-value{background-color:#fff;color:#1f2937}.custom-select[multiple],.custom-select[size]:not([size="1"]){background-image:none;height:auto;padding-right:.75rem}.custom-select:disabled{background-color:#e5e7eb;color:#4b5563}.custom-select::-ms-expand{display:none}.custom-select:-moz-focusring{color:transparent;text-shadow:0 0 0 #1f2937}.custom-select-sm{font-size:.875rem;height:calc(1.5em + .5rem + 2px);padding-bottom:.25rem;padding-left:.5rem;padding-top:.25rem}.custom-select-lg{font-size:1.25rem;height:calc(1.5em + 1rem + 2px);padding-bottom:.5rem;padding-left:1rem;padding-top:.5rem}.custom-file{display:inline-block;margin-bottom:0}.custom-file,.custom-file-input{height:calc(1.5em + .75rem + 2px);position:relative;width:100%}.custom-file-input{margin:0;opacity:0;overflow:hidden;z-index:2}.custom-file-input:focus~.custom-file-label{border-color:#a3a3e5;box-shadow:0 0 0 .2rem rgba(64,64,200,.25)}.custom-file-input:disabled~.custom-file-label,.custom-file-input[disabled]~.custom-file-label{background-color:#e5e7eb}.custom-file-input:lang(en)~.custom-file-label:after{content:"Browse"}.custom-file-input~.custom-file-label[data-browse]:after{content:attr(data-browse)}.custom-file-label{background-color:#fff;border:1px solid #d1d5db;border-radius:.25rem;font-weight:400;height:calc(1.5em + .75rem + 2px);left:0;overflow:hidden;z-index:1}.custom-file-label,.custom-file-label:after{color:#1f2937;line-height:1.5;padding:.375rem .75rem;position:absolute;right:0;top:0}.custom-file-label:after{background-color:#e5e7eb;border-left:inherit;border-radius:0 .25rem .25rem 0;bottom:0;content:"Browse";display:block;height:calc(1.5em + .75rem);z-index:3}.custom-range{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:transparent;height:1.4rem;padding:0;width:100%}.custom-range:focus{outline:0}.custom-range:focus::-webkit-slider-thumb{box-shadow:0 0 0 1px #f3f4f6,0 0 0 .2rem rgba(64,64,200,.25)}.custom-range:focus::-moz-range-thumb{box-shadow:0 0 0 1px #f3f4f6,0 0 0 .2rem rgba(64,64,200,.25)}.custom-range:focus::-ms-thumb{box-shadow:0 0 0 1px #f3f4f6,0 0 0 .2rem rgba(64,64,200,.25)}.custom-range::-moz-focus-outer{border:0}.custom-range::-webkit-slider-thumb{-webkit-appearance:none;appearance:none;background-color:#4040c8;border:0;border-radius:1rem;height:1rem;margin-top:-.25rem;-webkit-transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;width:1rem}@media (prefers-reduced-motion:reduce){.custom-range::-webkit-slider-thumb{-webkit-transition:none;transition:none}}.custom-range::-webkit-slider-thumb:active{background-color:#cbcbf0}.custom-range::-webkit-slider-runnable-track{background-color:#d1d5db;border-color:transparent;border-radius:1rem;color:transparent;cursor:pointer;height:.5rem;width:100%}.custom-range::-moz-range-thumb{-moz-appearance:none;appearance:none;background-color:#4040c8;border:0;border-radius:1rem;height:1rem;-moz-transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;width:1rem}@media (prefers-reduced-motion:reduce){.custom-range::-moz-range-thumb{-moz-transition:none;transition:none}}.custom-range::-moz-range-thumb:active{background-color:#cbcbf0}.custom-range::-moz-range-track{background-color:#d1d5db;border-color:transparent;border-radius:1rem;color:transparent;cursor:pointer;height:.5rem;width:100%}.custom-range::-ms-thumb{appearance:none;background-color:#4040c8;border:0;border-radius:1rem;height:1rem;margin-left:.2rem;margin-right:.2rem;margin-top:0;-ms-transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;width:1rem}@media (prefers-reduced-motion:reduce){.custom-range::-ms-thumb{-ms-transition:none;transition:none}}.custom-range::-ms-thumb:active{background-color:#cbcbf0}.custom-range::-ms-track{background-color:transparent;border-color:transparent;border-width:.5rem;color:transparent;cursor:pointer;height:.5rem;width:100%}.custom-range::-ms-fill-lower,.custom-range::-ms-fill-upper{background-color:#d1d5db;border-radius:1rem}.custom-range::-ms-fill-upper{margin-right:15px}.custom-range:disabled::-webkit-slider-thumb{background-color:#6b7280}.custom-range:disabled::-webkit-slider-runnable-track{cursor:default}.custom-range:disabled::-moz-range-thumb{background-color:#6b7280}.custom-range:disabled::-moz-range-track{cursor:default}.custom-range:disabled::-ms-thumb{background-color:#6b7280}.custom-control-label:before,.custom-file-label,.custom-select{transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.custom-control-label:before,.custom-file-label,.custom-select{transition:none}}.nav{display:flex;flex-wrap:wrap;list-style:none;margin-bottom:0;padding-left:0}.nav-link{display:block;padding:.5rem 1rem}.nav-link:focus,.nav-link:hover{text-decoration:none}.nav-link.disabled{color:#4b5563;cursor:default;pointer-events:none}.nav-tabs{border-bottom:1px solid #d1d5db}.nav-tabs .nav-link{background-color:transparent;border:1px solid transparent;border-top-left-radius:.25rem;border-top-right-radius:.25rem;margin-bottom:-1px}.nav-tabs .nav-link:focus,.nav-tabs .nav-link:hover{border-color:#e5e7eb #e5e7eb #d1d5db;isolation:isolate}.nav-tabs .nav-link.disabled{background-color:transparent;border-color:transparent;color:#4b5563}.nav-tabs .nav-item.show .nav-link,.nav-tabs .nav-link.active{background-color:#f3f4f6;border-color:#d1d5db #d1d5db #f3f4f6;color:#374151}.nav-tabs .dropdown-menu{border-top-left-radius:0;border-top-right-radius:0;margin-top:-1px}.nav-pills .nav-link{background:none;border:0;border-radius:.25rem}.nav-pills .nav-link.active,.nav-pills .show>.nav-link{background-color:#e5e7eb;color:#fff}.nav-fill .nav-item,.nav-fill>.nav-link{flex:1 1 auto;text-align:center}.nav-justified .nav-item,.nav-justified>.nav-link{flex-basis:0;flex-grow:1;text-align:center}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.navbar{padding:.5rem 1rem;position:relative}.navbar,.navbar .container,.navbar .container-fluid,.navbar .container-lg,.navbar .container-md,.navbar .container-sm,.navbar .container-xl{align-items:center;display:flex;flex-wrap:wrap;justify-content:space-between}.navbar-brand{display:inline-block;font-size:1.25rem;line-height:inherit;margin-right:1rem;padding-bottom:.3125rem;padding-top:.3125rem;white-space:nowrap}.navbar-brand:focus,.navbar-brand:hover{text-decoration:none}.navbar-nav{display:flex;flex-direction:column;list-style:none;margin-bottom:0;padding-left:0}.navbar-nav .nav-link{padding-left:0;padding-right:0}.navbar-nav .dropdown-menu{float:none;position:static}.navbar-text{display:inline-block;padding-bottom:.5rem;padding-top:.5rem}.navbar-collapse{align-items:center;flex-basis:100%;flex-grow:1}.navbar-toggler{background-color:transparent;border:1px solid transparent;border-radius:.25rem;font-size:1.25rem;line-height:1;padding:.25rem .75rem}.navbar-toggler:focus,.navbar-toggler:hover{text-decoration:none}.navbar-toggler-icon{background:50%/100% 100% no-repeat;content:"";display:inline-block;height:1.5em;vertical-align:middle;width:1.5em}.navbar-nav-scroll{max-height:75vh;overflow-y:auto}@media (max-width:1.98px){.navbar-expand-sm>.container,.navbar-expand-sm>.container-fluid,.navbar-expand-sm>.container-lg,.navbar-expand-sm>.container-md,.navbar-expand-sm>.container-sm,.navbar-expand-sm>.container-xl{padding-left:0;padding-right:0}}@media (min-width:2px){.navbar-expand-sm{flex-flow:row nowrap;justify-content:flex-start}.navbar-expand-sm .navbar-nav{flex-direction:row}.navbar-expand-sm .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-sm .navbar-nav .nav-link{padding-left:.5rem;padding-right:.5rem}.navbar-expand-sm>.container,.navbar-expand-sm>.container-fluid,.navbar-expand-sm>.container-lg,.navbar-expand-sm>.container-md,.navbar-expand-sm>.container-sm,.navbar-expand-sm>.container-xl{flex-wrap:nowrap}.navbar-expand-sm .navbar-nav-scroll{overflow:visible}.navbar-expand-sm .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-sm .navbar-toggler{display:none}}@media (max-width:7.98px){.navbar-expand-md>.container,.navbar-expand-md>.container-fluid,.navbar-expand-md>.container-lg,.navbar-expand-md>.container-md,.navbar-expand-md>.container-sm,.navbar-expand-md>.container-xl{padding-left:0;padding-right:0}}@media (min-width:8px){.navbar-expand-md{flex-flow:row nowrap;justify-content:flex-start}.navbar-expand-md .navbar-nav{flex-direction:row}.navbar-expand-md .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-md .navbar-nav .nav-link{padding-left:.5rem;padding-right:.5rem}.navbar-expand-md>.container,.navbar-expand-md>.container-fluid,.navbar-expand-md>.container-lg,.navbar-expand-md>.container-md,.navbar-expand-md>.container-sm,.navbar-expand-md>.container-xl{flex-wrap:nowrap}.navbar-expand-md .navbar-nav-scroll{overflow:visible}.navbar-expand-md .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-md .navbar-toggler{display:none}}@media (max-width:8.98px){.navbar-expand-lg>.container,.navbar-expand-lg>.container-fluid,.navbar-expand-lg>.container-lg,.navbar-expand-lg>.container-md,.navbar-expand-lg>.container-sm,.navbar-expand-lg>.container-xl{padding-left:0;padding-right:0}}@media (min-width:9px){.navbar-expand-lg{flex-flow:row nowrap;justify-content:flex-start}.navbar-expand-lg .navbar-nav{flex-direction:row}.navbar-expand-lg .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-lg .navbar-nav .nav-link{padding-left:.5rem;padding-right:.5rem}.navbar-expand-lg>.container,.navbar-expand-lg>.container-fluid,.navbar-expand-lg>.container-lg,.navbar-expand-lg>.container-md,.navbar-expand-lg>.container-sm,.navbar-expand-lg>.container-xl{flex-wrap:nowrap}.navbar-expand-lg .navbar-nav-scroll{overflow:visible}.navbar-expand-lg .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-lg .navbar-toggler{display:none}}@media (max-width:9.98px){.navbar-expand-xl>.container,.navbar-expand-xl>.container-fluid,.navbar-expand-xl>.container-lg,.navbar-expand-xl>.container-md,.navbar-expand-xl>.container-sm,.navbar-expand-xl>.container-xl{padding-left:0;padding-right:0}}@media (min-width:10px){.navbar-expand-xl{flex-flow:row nowrap;justify-content:flex-start}.navbar-expand-xl .navbar-nav{flex-direction:row}.navbar-expand-xl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xl .navbar-nav .nav-link{padding-left:.5rem;padding-right:.5rem}.navbar-expand-xl>.container,.navbar-expand-xl>.container-fluid,.navbar-expand-xl>.container-lg,.navbar-expand-xl>.container-md,.navbar-expand-xl>.container-sm,.navbar-expand-xl>.container-xl{flex-wrap:nowrap}.navbar-expand-xl .navbar-nav-scroll{overflow:visible}.navbar-expand-xl .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-xl .navbar-toggler{display:none}}.navbar-expand{flex-flow:row nowrap;justify-content:flex-start}.navbar-expand>.container,.navbar-expand>.container-fluid,.navbar-expand>.container-lg,.navbar-expand>.container-md,.navbar-expand>.container-sm,.navbar-expand>.container-xl{padding-left:0;padding-right:0}.navbar-expand .navbar-nav{flex-direction:row}.navbar-expand .navbar-nav .dropdown-menu{position:absolute}.navbar-expand .navbar-nav .nav-link{padding-left:.5rem;padding-right:.5rem}.navbar-expand>.container,.navbar-expand>.container-fluid,.navbar-expand>.container-lg,.navbar-expand>.container-md,.navbar-expand>.container-sm,.navbar-expand>.container-xl{flex-wrap:nowrap}.navbar-expand .navbar-nav-scroll{overflow:visible}.navbar-expand .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand .navbar-toggler{display:none}.navbar-light .navbar-brand,.navbar-light .navbar-brand:focus,.navbar-light .navbar-brand:hover{color:rgba(0,0,0,.9)}.navbar-light .navbar-nav .nav-link{color:rgba(0,0,0,.5)}.navbar-light .navbar-nav .nav-link:focus,.navbar-light .navbar-nav .nav-link:hover{color:rgba(0,0,0,.7)}.navbar-light .navbar-nav .nav-link.disabled{color:rgba(0,0,0,.3)}.navbar-light .navbar-nav .active>.nav-link,.navbar-light .navbar-nav .nav-link.active,.navbar-light .navbar-nav .nav-link.show,.navbar-light .navbar-nav .show>.nav-link{color:rgba(0,0,0,.9)}.navbar-light .navbar-toggler{border-color:rgba(0,0,0,.1);color:rgba(0,0,0,.5)}.navbar-light .navbar-toggler-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='30' height='30'%3E%3Cpath stroke='rgba(0, 0, 0, 0.5)' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3E%3C/svg%3E")}.navbar-light .navbar-text{color:rgba(0,0,0,.5)}.navbar-light .navbar-text a,.navbar-light .navbar-text a:focus,.navbar-light .navbar-text a:hover{color:rgba(0,0,0,.9)}.navbar-dark .navbar-brand,.navbar-dark .navbar-brand:focus,.navbar-dark .navbar-brand:hover{color:#fff}.navbar-dark .navbar-nav .nav-link{color:hsla(0,0%,100%,.5)}.navbar-dark .navbar-nav .nav-link:focus,.navbar-dark .navbar-nav .nav-link:hover{color:hsla(0,0%,100%,.75)}.navbar-dark .navbar-nav .nav-link.disabled{color:hsla(0,0%,100%,.25)}.navbar-dark .navbar-nav .active>.nav-link,.navbar-dark .navbar-nav .nav-link.active,.navbar-dark .navbar-nav .nav-link.show,.navbar-dark .navbar-nav .show>.nav-link{color:#fff}.navbar-dark .navbar-toggler{border-color:hsla(0,0%,100%,.1);color:hsla(0,0%,100%,.5)}.navbar-dark .navbar-toggler-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='30' height='30'%3E%3Cpath stroke='rgba(255, 255, 255, 0.5)' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3E%3C/svg%3E")}.navbar-dark .navbar-text{color:hsla(0,0%,100%,.5)}.navbar-dark .navbar-text a,.navbar-dark .navbar-text a:focus,.navbar-dark .navbar-text a:hover{color:#fff}.card{word-wrap:break-word;background-clip:border-box;background-color:#fff;border:1px solid rgba(0,0,0,.125);border-radius:6px;display:flex;flex-direction:column;min-width:0;position:relative}.card>hr{margin-left:0;margin-right:0}.card>.list-group{border-bottom:inherit;border-top:inherit}.card>.list-group:first-child{border-top-left-radius:5px;border-top-right-radius:5px;border-top-width:0}.card>.list-group:last-child{border-bottom-left-radius:5px;border-bottom-right-radius:5px;border-bottom-width:0}.card>.card-header+.list-group,.card>.list-group+.card-footer{border-top:0}.card-body{flex:1 1 auto;min-height:1px;padding:1.25rem}.card-title{margin-bottom:.75rem}.card-subtitle{margin-top:-.375rem}.card-subtitle,.card-text:last-child{margin-bottom:0}.card-link:hover{text-decoration:none}.card-link+.card-link{margin-left:1.25rem}.card-header{background-color:#fff;border-bottom:1px solid rgba(0,0,0,.125);margin-bottom:0;padding:.75rem 1.25rem}.card-header:first-child{border-radius:5px 5px 0 0}.card-footer{background-color:#fff;border-top:1px solid rgba(0,0,0,.125);padding:.75rem 1.25rem}.card-footer:last-child{border-radius:0 0 5px 5px}.card-header-tabs{border-bottom:0;margin-bottom:-.75rem}.card-header-pills,.card-header-tabs{margin-left:-.625rem;margin-right:-.625rem}.card-img-overlay{border-radius:5px;bottom:0;left:0;padding:1.25rem;position:absolute;right:0;top:0}.card-img,.card-img-bottom,.card-img-top{flex-shrink:0;width:100%}.card-img,.card-img-top{border-top-left-radius:5px;border-top-right-radius:5px}.card-img,.card-img-bottom{border-bottom-left-radius:5px;border-bottom-right-radius:5px}.card-deck .card{margin-bottom:15px}@media (min-width:2px){.card-deck{display:flex;flex-flow:row wrap;margin-left:-15px;margin-right:-15px}.card-deck .card{flex:1 0 0%;margin-bottom:0;margin-left:15px;margin-right:15px}}.card-group>.card{margin-bottom:15px}@media (min-width:2px){.card-group{display:flex;flex-flow:row wrap}.card-group>.card{flex:1 0 0%;margin-bottom:0}.card-group>.card+.card{border-left:0;margin-left:0}.card-group>.card:not(:last-child){border-bottom-right-radius:0;border-top-right-radius:0}.card-group>.card:not(:last-child) .card-header,.card-group>.card:not(:last-child) .card-img-top{border-top-right-radius:0}.card-group>.card:not(:last-child) .card-footer,.card-group>.card:not(:last-child) .card-img-bottom{border-bottom-right-radius:0}.card-group>.card:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.card-group>.card:not(:first-child) .card-header,.card-group>.card:not(:first-child) .card-img-top{border-top-left-radius:0}.card-group>.card:not(:first-child) .card-footer,.card-group>.card:not(:first-child) .card-img-bottom{border-bottom-left-radius:0}}.card-columns .card{margin-bottom:.75rem}@media (min-width:2px){.card-columns{-moz-column-count:3;column-count:3;-moz-column-gap:1.25rem;column-gap:1.25rem;orphans:1;widows:1}.card-columns .card{display:inline-block;width:100%}}.accordion{overflow-anchor:none}.accordion>.card{overflow:hidden}.accordion>.card:not(:last-of-type){border-bottom:0;border-bottom-left-radius:0;border-bottom-right-radius:0}.accordion>.card:not(:first-of-type){border-top-left-radius:0;border-top-right-radius:0}.accordion>.card>.card-header{border-radius:0;margin-bottom:-1px}.breadcrumb{background-color:#e5e7eb;border-radius:.25rem;display:flex;flex-wrap:wrap;list-style:none;margin-bottom:1rem;padding:.75rem 1rem}.breadcrumb-item+.breadcrumb-item{padding-left:.5rem}.breadcrumb-item+.breadcrumb-item:before{color:#4b5563;content:"/";float:left;padding-right:.5rem}.breadcrumb-item+.breadcrumb-item:hover:before{text-decoration:underline;text-decoration:none}.breadcrumb-item.active{color:#4b5563}.pagination{border-radius:.25rem;display:flex;list-style:none;padding-left:0}.page-link{background-color:#fff;border:1px solid #d1d5db;color:#6366f1;display:block;line-height:1.25;margin-left:-1px;padding:.5rem .75rem;position:relative}.page-link:hover{background-color:#e5e7eb;border-color:#d1d5db;color:#4f46e5;text-decoration:none;z-index:2}.page-link:focus{box-shadow:0 0 0 .2rem rgba(64,64,200,.25);outline:0;z-index:3}.page-item:first-child .page-link{border-bottom-left-radius:.25rem;border-top-left-radius:.25rem;margin-left:0}.page-item:last-child .page-link{border-bottom-right-radius:.25rem;border-top-right-radius:.25rem}.page-item.active .page-link{background-color:#4040c8;border-color:#4040c8;color:#fff;z-index:3}.page-item.disabled .page-link{background-color:#fff;border-color:#d1d5db;color:#4b5563;cursor:auto;pointer-events:none}.pagination-lg .page-link{font-size:1.25rem;line-height:1.5;padding:.75rem 1.5rem}.pagination-lg .page-item:first-child .page-link{border-bottom-left-radius:6px;border-top-left-radius:6px}.pagination-lg .page-item:last-child .page-link{border-bottom-right-radius:6px;border-top-right-radius:6px}.pagination-sm .page-link{font-size:.875rem;line-height:1.5;padding:.25rem .5rem}.pagination-sm .page-item:first-child .page-link{border-bottom-left-radius:.2rem;border-top-left-radius:.2rem}.pagination-sm .page-item:last-child .page-link{border-bottom-right-radius:.2rem;border-top-right-radius:.2rem}.badge{border-radius:.25rem;display:inline-block;font-size:.875rem;font-weight:600;line-height:1;padding:.25em .4em;text-align:center;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;vertical-align:baseline;white-space:nowrap}@media (prefers-reduced-motion:reduce){.badge{transition:none}}a.badge:focus,a.badge:hover{text-decoration:none}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.badge-pill{border-radius:10rem;padding-left:.6em;padding-right:.6em}.badge-primary{background-color:#4040c8;color:#fff}a.badge-primary:focus,a.badge-primary:hover{background-color:#3030a5;color:#fff}a.badge-primary.focus,a.badge-primary:focus{box-shadow:0 0 0 .2rem rgba(64,64,200,.5);outline:0}.badge-secondary{background-color:#4b5563;color:#fff}a.badge-secondary:focus,a.badge-secondary:hover{background-color:#353c46;color:#fff}a.badge-secondary.focus,a.badge-secondary:focus{box-shadow:0 0 0 .2rem rgba(75,85,99,.5);outline:0}.badge-success{background-color:#059669;color:#fff}a.badge-success:focus,a.badge-success:hover{background-color:#036546;color:#fff}a.badge-success.focus,a.badge-success:focus{box-shadow:0 0 0 .2rem rgba(5,150,105,.5);outline:0}.badge-info{background-color:#2563eb;color:#fff}a.badge-info:focus,a.badge-info:hover{background-color:#134cca;color:#fff}a.badge-info.focus,a.badge-info:focus{box-shadow:0 0 0 .2rem rgba(37,99,235,.5);outline:0}.badge-warning{background-color:#d97706;color:#fff}a.badge-warning:focus,a.badge-warning:hover{background-color:#a75c05;color:#fff}a.badge-warning.focus,a.badge-warning:focus{box-shadow:0 0 0 .2rem rgba(217,119,6,.5);outline:0}.badge-danger{background-color:#dc2626;color:#fff}a.badge-danger:focus,a.badge-danger:hover{background-color:#b21d1d;color:#fff}a.badge-danger.focus,a.badge-danger:focus{box-shadow:0 0 0 .2rem rgba(220,38,38,.5);outline:0}.badge-light{background-color:#f3f4f6;color:#111827}a.badge-light:focus,a.badge-light:hover{background-color:#d6d9e0;color:#111827}a.badge-light.focus,a.badge-light:focus{box-shadow:0 0 0 .2rem rgba(243,244,246,.5);outline:0}.badge-dark{background-color:#1f2937;color:#fff}a.badge-dark:focus,a.badge-dark:hover{background-color:#0d1116;color:#fff}a.badge-dark.focus,a.badge-dark:focus{box-shadow:0 0 0 .2rem rgba(31,41,55,.5);outline:0}.jumbotron{background-color:#e5e7eb;border-radius:6px;margin-bottom:2rem;padding:2rem 1rem}@media (min-width:2px){.jumbotron{padding:4rem 2rem}}.jumbotron-fluid{border-radius:0;padding-left:0;padding-right:0}.alert{border:1px solid transparent;border-radius:.25rem;margin-bottom:1rem;padding:.75rem 1.25rem;position:relative}.alert-heading{color:inherit}.alert-link{font-weight:600}.alert-dismissible{padding-right:4rem}.alert-dismissible .close{color:inherit;padding:.75rem 1.25rem;position:absolute;right:0;top:0;z-index:2}.alert-primary{background-color:#d9d9f4;border-color:#cacaf0;color:#212168}.alert-primary hr{border-top-color:#b6b6ea}.alert-primary .alert-link{color:#151541}.alert-secondary{background-color:#dbdde0;border-color:#cdcfd3;color:#272c33}.alert-secondary hr{border-top-color:#bfc2c7}.alert-secondary .alert-link{color:#111316}.alert-success{background-color:#cdeae1;border-color:#b9e2d5;color:#034e37}.alert-success hr{border-top-color:#a7dbca}.alert-success .alert-link{color:#011d14}.alert-info{background-color:#d3e0fb;border-color:#c2d3f9;color:#13337a}.alert-info hr{border-top-color:#abc2f7}.alert-info .alert-link{color:#0c214e}.alert-warning{background-color:#f7e4cd;border-color:#f4d9b9;color:#713e03}.alert-warning hr{border-top-color:#f1cda3}.alert-warning .alert-link{color:#3f2302}.alert-danger{background-color:#f8d4d4;border-color:#f5c2c2;color:#721414}.alert-danger hr{border-top-color:#f1acac}.alert-danger .alert-link{color:#470c0c}.alert-light{background-color:#fdfdfd;border-color:#fcfcfc;color:#7e7f80}.alert-light hr{border-top-color:#efefef}.alert-light .alert-link{color:#656666}.alert-dark{background-color:#d2d4d7;border-color:#c0c3c7;color:#10151d}.alert-dark hr{border-top-color:#b3b6bb}.alert-dark .alert-link{color:#000}@keyframes progress-bar-stripes{0%{background-position:1rem 0}to{background-position:0 0}}.progress{background-color:#e5e7eb;border-radius:.25rem;font-size:.75rem;height:1rem;line-height:0}.progress,.progress-bar{display:flex;overflow:hidden}.progress-bar{background-color:#4040c8;color:#fff;flex-direction:column;justify-content:center;text-align:center;transition:width .6s ease;white-space:nowrap}@media (prefers-reduced-motion:reduce){.progress-bar{transition:none}}.progress-bar-striped{background-image:linear-gradient(45deg,hsla(0,0%,100%,.15) 25%,transparent 0,transparent 50%,hsla(0,0%,100%,.15) 0,hsla(0,0%,100%,.15) 75%,transparent 0,transparent);background-size:1rem 1rem}.progress-bar-animated{animation:progress-bar-stripes 1s linear infinite}@media (prefers-reduced-motion:reduce){.progress-bar-animated{animation:none}}.media{align-items:flex-start;display:flex}.media-body{flex:1}.list-group{border-radius:.25rem;display:flex;flex-direction:column;margin-bottom:0;padding-left:0}.list-group-item-action{color:#374151;text-align:inherit;width:100%}.list-group-item-action:focus,.list-group-item-action:hover{background-color:#f3f4f6;color:#374151;text-decoration:none;z-index:1}.list-group-item-action:active{background-color:#e5e7eb;color:#111827}.list-group-item{background-color:#fff;border:1px solid rgba(0,0,0,.125);display:block;padding:.75rem 1.25rem;position:relative}.list-group-item:first-child{border-top-left-radius:inherit;border-top-right-radius:inherit}.list-group-item:last-child{border-bottom-left-radius:inherit;border-bottom-right-radius:inherit}.list-group-item.disabled,.list-group-item:disabled{background-color:#fff;color:#4b5563;pointer-events:none}.list-group-item.active{background-color:#4040c8;border-color:#4040c8;color:#fff;z-index:2}.list-group-item+.list-group-item{border-top-width:0}.list-group-item+.list-group-item.active{border-top-width:1px;margin-top:-1px}.list-group-horizontal{flex-direction:row}.list-group-horizontal>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal>.list-group-item:last-child{border-bottom-left-radius:0;border-top-right-radius:.25rem}.list-group-horizontal>.list-group-item.active{margin-top:0}.list-group-horizontal>.list-group-item+.list-group-item{border-left-width:0;border-top-width:1px}.list-group-horizontal>.list-group-item+.list-group-item.active{border-left-width:1px;margin-left:-1px}@media (min-width:2px){.list-group-horizontal-sm{flex-direction:row}.list-group-horizontal-sm>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-sm>.list-group-item:last-child{border-bottom-left-radius:0;border-top-right-radius:.25rem}.list-group-horizontal-sm>.list-group-item.active{margin-top:0}.list-group-horizontal-sm>.list-group-item+.list-group-item{border-left-width:0;border-top-width:1px}.list-group-horizontal-sm>.list-group-item+.list-group-item.active{border-left-width:1px;margin-left:-1px}}@media (min-width:8px){.list-group-horizontal-md{flex-direction:row}.list-group-horizontal-md>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-md>.list-group-item:last-child{border-bottom-left-radius:0;border-top-right-radius:.25rem}.list-group-horizontal-md>.list-group-item.active{margin-top:0}.list-group-horizontal-md>.list-group-item+.list-group-item{border-left-width:0;border-top-width:1px}.list-group-horizontal-md>.list-group-item+.list-group-item.active{border-left-width:1px;margin-left:-1px}}@media (min-width:9px){.list-group-horizontal-lg{flex-direction:row}.list-group-horizontal-lg>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-lg>.list-group-item:last-child{border-bottom-left-radius:0;border-top-right-radius:.25rem}.list-group-horizontal-lg>.list-group-item.active{margin-top:0}.list-group-horizontal-lg>.list-group-item+.list-group-item{border-left-width:0;border-top-width:1px}.list-group-horizontal-lg>.list-group-item+.list-group-item.active{border-left-width:1px;margin-left:-1px}}@media (min-width:10px){.list-group-horizontal-xl{flex-direction:row}.list-group-horizontal-xl>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-xl>.list-group-item:last-child{border-bottom-left-radius:0;border-top-right-radius:.25rem}.list-group-horizontal-xl>.list-group-item.active{margin-top:0}.list-group-horizontal-xl>.list-group-item+.list-group-item{border-left-width:0;border-top-width:1px}.list-group-horizontal-xl>.list-group-item+.list-group-item.active{border-left-width:1px;margin-left:-1px}}.list-group-flush{border-radius:0}.list-group-flush>.list-group-item{border-width:0 0 1px}.list-group-flush>.list-group-item:last-child{border-bottom-width:0}.list-group-item-primary{background-color:#cacaf0;color:#212168}.list-group-item-primary.list-group-item-action:focus,.list-group-item-primary.list-group-item-action:hover{background-color:#b6b6ea;color:#212168}.list-group-item-primary.list-group-item-action.active{background-color:#212168;border-color:#212168;color:#fff}.list-group-item-secondary{background-color:#cdcfd3;color:#272c33}.list-group-item-secondary.list-group-item-action:focus,.list-group-item-secondary.list-group-item-action:hover{background-color:#bfc2c7;color:#272c33}.list-group-item-secondary.list-group-item-action.active{background-color:#272c33;border-color:#272c33;color:#fff}.list-group-item-success{background-color:#b9e2d5;color:#034e37}.list-group-item-success.list-group-item-action:focus,.list-group-item-success.list-group-item-action:hover{background-color:#a7dbca;color:#034e37}.list-group-item-success.list-group-item-action.active{background-color:#034e37;border-color:#034e37;color:#fff}.list-group-item-info{background-color:#c2d3f9;color:#13337a}.list-group-item-info.list-group-item-action:focus,.list-group-item-info.list-group-item-action:hover{background-color:#abc2f7;color:#13337a}.list-group-item-info.list-group-item-action.active{background-color:#13337a;border-color:#13337a;color:#fff}.list-group-item-warning{background-color:#f4d9b9;color:#713e03}.list-group-item-warning.list-group-item-action:focus,.list-group-item-warning.list-group-item-action:hover{background-color:#f1cda3;color:#713e03}.list-group-item-warning.list-group-item-action.active{background-color:#713e03;border-color:#713e03;color:#fff}.list-group-item-danger{background-color:#f5c2c2;color:#721414}.list-group-item-danger.list-group-item-action:focus,.list-group-item-danger.list-group-item-action:hover{background-color:#f1acac;color:#721414}.list-group-item-danger.list-group-item-action.active{background-color:#721414;border-color:#721414;color:#fff}.list-group-item-light{background-color:#fcfcfc;color:#7e7f80}.list-group-item-light.list-group-item-action:focus,.list-group-item-light.list-group-item-action:hover{background-color:#efefef;color:#7e7f80}.list-group-item-light.list-group-item-action.active{background-color:#7e7f80;border-color:#7e7f80;color:#fff}.list-group-item-dark{background-color:#c0c3c7;color:#10151d}.list-group-item-dark.list-group-item-action:focus,.list-group-item-dark.list-group-item-action:hover{background-color:#b3b6bb;color:#10151d}.list-group-item-dark.list-group-item-action.active{background-color:#10151d;border-color:#10151d;color:#fff}.close{color:#000;float:right;font-size:1.5rem;font-weight:600;line-height:1;opacity:.5;text-shadow:0 1px 0 #fff}.close:hover{color:#000;text-decoration:none}.close:not(:disabled):not(.disabled):focus,.close:not(:disabled):not(.disabled):hover{opacity:.75}button.close{background-color:transparent;border:0;padding:0}a.close.disabled{pointer-events:none}.toast{background-clip:padding-box;background-color:hsla(0,0%,100%,.85);border:1px solid rgba(0,0,0,.1);border-radius:.25rem;box-shadow:0 .25rem .75rem rgba(0,0,0,.1);flex-basis:350px;font-size:.875rem;max-width:350px;opacity:0}.toast:not(:last-child){margin-bottom:.75rem}.toast.showing{opacity:1}.toast.show{display:block;opacity:1}.toast.hide{display:none}.toast-header{align-items:center;background-clip:padding-box;background-color:hsla(0,0%,100%,.85);border-bottom:1px solid rgba(0,0,0,.05);border-top-left-radius:calc(.25rem - 1px);border-top-right-radius:calc(.25rem - 1px);color:#4b5563;display:flex;padding:.25rem .75rem}.toast-body{padding:.75rem}.modal-open{overflow:hidden}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal{display:none;height:100%;left:0;outline:0;overflow:hidden;position:fixed;top:0;width:100%;z-index:1050}.modal-dialog{margin:.5rem;pointer-events:none;position:relative;width:auto}.modal.fade .modal-dialog{transform:translateY(-50px);transition:transform .3s ease-out}@media (prefers-reduced-motion:reduce){.modal.fade .modal-dialog{transition:none}}.modal.show .modal-dialog{transform:none}.modal.modal-static .modal-dialog{transform:scale(1.02)}.modal-dialog-scrollable{display:flex;max-height:calc(100% - 1rem)}.modal-dialog-scrollable .modal-content{max-height:calc(100vh - 1rem);overflow:hidden}.modal-dialog-scrollable .modal-footer,.modal-dialog-scrollable .modal-header{flex-shrink:0}.modal-dialog-scrollable .modal-body{overflow-y:auto}.modal-dialog-centered{align-items:center;display:flex;min-height:calc(100% - 1rem)}.modal-dialog-centered:before{content:"";display:block;height:calc(100vh - 1rem);height:-moz-min-content;height:min-content}.modal-dialog-centered.modal-dialog-scrollable{flex-direction:column;height:100%;justify-content:center}.modal-dialog-centered.modal-dialog-scrollable .modal-content{max-height:none}.modal-dialog-centered.modal-dialog-scrollable:before{content:none}.modal-content{background-clip:padding-box;background-color:#fff;border:1px solid rgba(0,0,0,.2);border-radius:6px;display:flex;flex-direction:column;outline:0;pointer-events:auto;position:relative;width:100%}.modal-backdrop{background-color:#000;height:100vh;left:0;position:fixed;top:0;width:100vw;z-index:1040}.modal-backdrop.fade{opacity:0}.modal-backdrop.show{opacity:.5}.modal-header{align-items:flex-start;border-bottom:1px solid #d1d5db;border-top-left-radius:5px;border-top-right-radius:5px;display:flex;justify-content:space-between;padding:1rem}.modal-header .close{margin:-1rem -1rem -1rem auto;padding:1rem}.modal-title{line-height:1.5;margin-bottom:0}.modal-body{flex:1 1 auto;padding:1rem;position:relative}.modal-footer{align-items:center;border-bottom-left-radius:5px;border-bottom-right-radius:5px;border-top:1px solid #d1d5db;display:flex;flex-wrap:wrap;justify-content:flex-end;padding:.75rem}.modal-footer>*{margin:.25rem}.modal-scrollbar-measure{height:50px;overflow:scroll;position:absolute;top:-9999px;width:50px}@media (min-width:2px){.modal-dialog{margin:1.75rem auto;max-width:500px}.modal-dialog-scrollable{max-height:calc(100% - 3.5rem)}.modal-dialog-scrollable .modal-content{max-height:calc(100vh - 3.5rem)}.modal-dialog-centered{min-height:calc(100% - 3.5rem)}.modal-dialog-centered:before{height:calc(100vh - 3.5rem);height:-moz-min-content;height:min-content}.modal-sm{max-width:300px}}@media (min-width:9px){.modal-lg,.modal-xl{max-width:800px}}@media (min-width:10px){.modal-xl{max-width:1140px}}.tooltip{word-wrap:break-word;display:block;font-family:Figtree,sans-serif;font-size:.875rem;font-style:normal;font-weight:400;letter-spacing:normal;line-break:auto;line-height:1.5;margin:0;opacity:0;position:absolute;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;white-space:normal;word-break:normal;word-spacing:normal;z-index:1070}.tooltip.show{opacity:.9}.tooltip .arrow{display:block;height:.4rem;position:absolute;width:.8rem}.tooltip .arrow:before{border-color:transparent;border-style:solid;content:"";position:absolute}.bs-tooltip-auto[x-placement^=top],.bs-tooltip-top{padding:.4rem 0}.bs-tooltip-auto[x-placement^=top] .arrow,.bs-tooltip-top .arrow{bottom:0}.bs-tooltip-auto[x-placement^=top] .arrow:before,.bs-tooltip-top .arrow:before{border-top-color:#000;border-width:.4rem .4rem 0;top:0}.bs-tooltip-auto[x-placement^=right],.bs-tooltip-right{padding:0 .4rem}.bs-tooltip-auto[x-placement^=right] .arrow,.bs-tooltip-right .arrow{height:.8rem;left:0;width:.4rem}.bs-tooltip-auto[x-placement^=right] .arrow:before,.bs-tooltip-right .arrow:before{border-right-color:#000;border-width:.4rem .4rem .4rem 0;right:0}.bs-tooltip-auto[x-placement^=bottom],.bs-tooltip-bottom{padding:.4rem 0}.bs-tooltip-auto[x-placement^=bottom] .arrow,.bs-tooltip-bottom .arrow{top:0}.bs-tooltip-auto[x-placement^=bottom] .arrow:before,.bs-tooltip-bottom .arrow:before{border-bottom-color:#000;border-width:0 .4rem .4rem;bottom:0}.bs-tooltip-auto[x-placement^=left],.bs-tooltip-left{padding:0 .4rem}.bs-tooltip-auto[x-placement^=left] .arrow,.bs-tooltip-left .arrow{height:.8rem;right:0;width:.4rem}.bs-tooltip-auto[x-placement^=left] .arrow:before,.bs-tooltip-left .arrow:before{border-left-color:#000;border-width:.4rem 0 .4rem .4rem;left:0}.tooltip-inner{background-color:#000;border-radius:.25rem;color:#fff;max-width:200px;padding:.25rem .5rem;text-align:center}.popover{word-wrap:break-word;background-clip:padding-box;background-color:#fff;border:1px solid rgba(0,0,0,.2);border-radius:6px;font-family:Figtree,sans-serif;font-size:.875rem;font-style:normal;font-weight:400;left:0;letter-spacing:normal;line-break:auto;line-height:1.5;max-width:276px;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;top:0;white-space:normal;word-break:normal;word-spacing:normal;z-index:1060}.popover,.popover .arrow{display:block;position:absolute}.popover .arrow{height:.5rem;margin:0 6px;width:1rem}.popover .arrow:after,.popover .arrow:before{border-color:transparent;border-style:solid;content:"";display:block;position:absolute}.bs-popover-auto[x-placement^=top],.bs-popover-top{margin-bottom:.5rem}.bs-popover-auto[x-placement^=top]>.arrow,.bs-popover-top>.arrow{bottom:calc(-.5rem - 1px)}.bs-popover-auto[x-placement^=top]>.arrow:before,.bs-popover-top>.arrow:before{border-top-color:rgba(0,0,0,.25);border-width:.5rem .5rem 0;bottom:0}.bs-popover-auto[x-placement^=top]>.arrow:after,.bs-popover-top>.arrow:after{border-top-color:#fff;border-width:.5rem .5rem 0;bottom:1px}.bs-popover-auto[x-placement^=right],.bs-popover-right{margin-left:.5rem}.bs-popover-auto[x-placement^=right]>.arrow,.bs-popover-right>.arrow{height:1rem;left:calc(-.5rem - 1px);margin:6px 0;width:.5rem}.bs-popover-auto[x-placement^=right]>.arrow:before,.bs-popover-right>.arrow:before{border-right-color:rgba(0,0,0,.25);border-width:.5rem .5rem .5rem 0;left:0}.bs-popover-auto[x-placement^=right]>.arrow:after,.bs-popover-right>.arrow:after{border-right-color:#fff;border-width:.5rem .5rem .5rem 0;left:1px}.bs-popover-auto[x-placement^=bottom],.bs-popover-bottom{margin-top:.5rem}.bs-popover-auto[x-placement^=bottom]>.arrow,.bs-popover-bottom>.arrow{top:calc(-.5rem - 1px)}.bs-popover-auto[x-placement^=bottom]>.arrow:before,.bs-popover-bottom>.arrow:before{border-bottom-color:rgba(0,0,0,.25);border-width:0 .5rem .5rem;top:0}.bs-popover-auto[x-placement^=bottom]>.arrow:after,.bs-popover-bottom>.arrow:after{border-bottom-color:#fff;border-width:0 .5rem .5rem;top:1px}.bs-popover-auto[x-placement^=bottom] .popover-header:before,.bs-popover-bottom .popover-header:before{border-bottom:1px solid #f7f7f7;content:"";display:block;left:50%;margin-left:-.5rem;position:absolute;top:0;width:1rem}.bs-popover-auto[x-placement^=left],.bs-popover-left{margin-right:.5rem}.bs-popover-auto[x-placement^=left]>.arrow,.bs-popover-left>.arrow{height:1rem;margin:6px 0;right:calc(-.5rem - 1px);width:.5rem}.bs-popover-auto[x-placement^=left]>.arrow:before,.bs-popover-left>.arrow:before{border-left-color:rgba(0,0,0,.25);border-width:.5rem 0 .5rem .5rem;right:0}.bs-popover-auto[x-placement^=left]>.arrow:after,.bs-popover-left>.arrow:after{border-left-color:#fff;border-width:.5rem 0 .5rem .5rem;right:1px}.popover-header{background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-top-left-radius:5px;border-top-right-radius:5px;font-size:1rem;margin-bottom:0;padding:.5rem .75rem}.popover-header:empty{display:none}.popover-body{color:#111827;padding:.5rem .75rem}.carousel{position:relative}.carousel.pointer-event{touch-action:pan-y}.carousel-inner{overflow:hidden;position:relative;width:100%}.carousel-inner:after{clear:both;content:"";display:block}.carousel-item{backface-visibility:hidden;display:none;float:left;margin-right:-100%;position:relative;transition:transform .6s ease-in-out;width:100%}@media (prefers-reduced-motion:reduce){.carousel-item{transition:none}}.carousel-item-next,.carousel-item-prev,.carousel-item.active{display:block}.active.carousel-item-right,.carousel-item-next:not(.carousel-item-left){transform:translateX(100%)}.active.carousel-item-left,.carousel-item-prev:not(.carousel-item-right){transform:translateX(-100%)}.carousel-fade .carousel-item{opacity:0;transform:none;transition-property:opacity}.carousel-fade .carousel-item-next.carousel-item-left,.carousel-fade .carousel-item-prev.carousel-item-right,.carousel-fade .carousel-item.active{opacity:1;z-index:1}.carousel-fade .active.carousel-item-left,.carousel-fade .active.carousel-item-right{opacity:0;transition:opacity 0s .6s;z-index:0}@media (prefers-reduced-motion:reduce){.carousel-fade .active.carousel-item-left,.carousel-fade .active.carousel-item-right{transition:none}}.carousel-control-next,.carousel-control-prev{align-items:center;background:none;border:0;bottom:0;color:#fff;display:flex;justify-content:center;opacity:.5;padding:0;position:absolute;text-align:center;top:0;transition:opacity .15s ease;width:15%;z-index:1}@media (prefers-reduced-motion:reduce){.carousel-control-next,.carousel-control-prev{transition:none}}.carousel-control-next:focus,.carousel-control-next:hover,.carousel-control-prev:focus,.carousel-control-prev:hover{color:#fff;opacity:.9;outline:0;text-decoration:none}.carousel-control-prev{left:0}.carousel-control-next{right:0}.carousel-control-next-icon,.carousel-control-prev-icon{background:50%/100% 100% no-repeat;display:inline-block;height:20px;width:20px}.carousel-control-prev-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' width='8' height='8'%3E%3Cpath d='m5.25 0-4 4 4 4 1.5-1.5L4.25 4l2.5-2.5L5.25 0z'/%3E%3C/svg%3E")}.carousel-control-next-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' width='8' height='8'%3E%3Cpath d='m2.75 0-1.5 1.5L3.75 4l-2.5 2.5L2.75 8l4-4-4-4z'/%3E%3C/svg%3E")}.carousel-indicators{bottom:0;display:flex;justify-content:center;left:0;list-style:none;margin-left:15%;margin-right:15%;padding-left:0;position:absolute;right:0;z-index:15}.carousel-indicators li{background-clip:padding-box;background-color:#fff;border-bottom:10px solid transparent;border-top:10px solid transparent;box-sizing:content-box;cursor:pointer;flex:0 1 auto;height:3px;margin-left:3px;margin-right:3px;opacity:.5;text-indent:-999px;transition:opacity .6s ease;width:30px}@media (prefers-reduced-motion:reduce){.carousel-indicators li{transition:none}}.carousel-indicators .active{opacity:1}.carousel-caption{bottom:20px;color:#fff;left:15%;padding-bottom:20px;padding-top:20px;position:absolute;right:15%;text-align:center;z-index:10}@keyframes spinner-border{to{transform:rotate(1turn)}}.spinner-border{animation:spinner-border .75s linear infinite;border:.25em solid;border-radius:50%;border-right:.25em solid transparent;display:inline-block;height:2rem;vertical-align:-.125em;width:2rem}.spinner-border-sm{border-width:.2em;height:1rem;width:1rem}@keyframes spinner-grow{0%{transform:scale(0)}50%{opacity:1;transform:none}}.spinner-grow{animation:spinner-grow .75s linear infinite;background-color:currentcolor;border-radius:50%;display:inline-block;height:2rem;opacity:0;vertical-align:-.125em;width:2rem}.spinner-grow-sm{height:1rem;width:1rem}@media (prefers-reduced-motion:reduce){.spinner-border,.spinner-grow{animation-duration:1.5s}}.align-baseline{vertical-align:baseline!important}.align-top{vertical-align:top!important}.align-middle{vertical-align:middle!important}.align-bottom{vertical-align:bottom!important}.align-text-bottom{vertical-align:text-bottom!important}.align-text-top{vertical-align:text-top!important}.bg-primary{background-color:#4040c8!important}a.bg-primary:focus,a.bg-primary:hover,button.bg-primary:focus,button.bg-primary:hover{background-color:#3030a5!important}.bg-secondary{background-color:#4b5563!important}a.bg-secondary:focus,a.bg-secondary:hover,button.bg-secondary:focus,button.bg-secondary:hover{background-color:#353c46!important}.bg-success{background-color:#059669!important}a.bg-success:focus,a.bg-success:hover,button.bg-success:focus,button.bg-success:hover{background-color:#036546!important}.bg-info{background-color:#2563eb!important}a.bg-info:focus,a.bg-info:hover,button.bg-info:focus,button.bg-info:hover{background-color:#134cca!important}.bg-warning{background-color:#d97706!important}a.bg-warning:focus,a.bg-warning:hover,button.bg-warning:focus,button.bg-warning:hover{background-color:#a75c05!important}.bg-danger{background-color:#dc2626!important}a.bg-danger:focus,a.bg-danger:hover,button.bg-danger:focus,button.bg-danger:hover{background-color:#b21d1d!important}.bg-light{background-color:#f3f4f6!important}a.bg-light:focus,a.bg-light:hover,button.bg-light:focus,button.bg-light:hover{background-color:#d6d9e0!important}.bg-dark{background-color:#1f2937!important}a.bg-dark:focus,a.bg-dark:hover,button.bg-dark:focus,button.bg-dark:hover{background-color:#0d1116!important}.bg-white{background-color:#fff!important}.bg-transparent{background-color:transparent!important}.border{border:1px solid #d1d5db!important}.border-top{border-top:1px solid #d1d5db!important}.border-right{border-right:1px solid #d1d5db!important}.border-bottom{border-bottom:1px solid #d1d5db!important}.border-left{border-left:1px solid #d1d5db!important}.border-0{border:0!important}.border-top-0{border-top:0!important}.border-right-0{border-right:0!important}.border-bottom-0{border-bottom:0!important}.border-left-0{border-left:0!important}.border-primary{border-color:#4040c8!important}.border-secondary{border-color:#4b5563!important}.border-success{border-color:#059669!important}.border-info{border-color:#2563eb!important}.border-warning{border-color:#d97706!important}.border-danger{border-color:#dc2626!important}.border-light{border-color:#f3f4f6!important}.border-dark{border-color:#1f2937!important}.border-white{border-color:#fff!important}.rounded-sm{border-radius:.2rem!important}.rounded{border-radius:.25rem!important}.rounded-top{border-top-left-radius:.25rem!important}.rounded-right,.rounded-top{border-top-right-radius:.25rem!important}.rounded-bottom,.rounded-right{border-bottom-right-radius:.25rem!important}.rounded-bottom,.rounded-left{border-bottom-left-radius:.25rem!important}.rounded-left{border-top-left-radius:.25rem!important}.rounded-lg{border-radius:6px!important}.rounded-circle{border-radius:50%!important}.rounded-pill{border-radius:50rem!important}.rounded-0{border-radius:0!important}.clearfix:after{clear:both;content:"";display:block}.d-none{display:none!important}.d-inline{display:inline!important}.d-inline-block{display:inline-block!important}.d-block{display:block!important}.d-table{display:table!important}.d-table-row{display:table-row!important}.d-table-cell{display:table-cell!important}.d-flex{display:flex!important}.d-inline-flex{display:inline-flex!important}@media (min-width:2px){.d-sm-none{display:none!important}.d-sm-inline{display:inline!important}.d-sm-inline-block{display:inline-block!important}.d-sm-block{display:block!important}.d-sm-table{display:table!important}.d-sm-table-row{display:table-row!important}.d-sm-table-cell{display:table-cell!important}.d-sm-flex{display:flex!important}.d-sm-inline-flex{display:inline-flex!important}}@media (min-width:8px){.d-md-none{display:none!important}.d-md-inline{display:inline!important}.d-md-inline-block{display:inline-block!important}.d-md-block{display:block!important}.d-md-table{display:table!important}.d-md-table-row{display:table-row!important}.d-md-table-cell{display:table-cell!important}.d-md-flex{display:flex!important}.d-md-inline-flex{display:inline-flex!important}}@media (min-width:9px){.d-lg-none{display:none!important}.d-lg-inline{display:inline!important}.d-lg-inline-block{display:inline-block!important}.d-lg-block{display:block!important}.d-lg-table{display:table!important}.d-lg-table-row{display:table-row!important}.d-lg-table-cell{display:table-cell!important}.d-lg-flex{display:flex!important}.d-lg-inline-flex{display:inline-flex!important}}@media (min-width:10px){.d-xl-none{display:none!important}.d-xl-inline{display:inline!important}.d-xl-inline-block{display:inline-block!important}.d-xl-block{display:block!important}.d-xl-table{display:table!important}.d-xl-table-row{display:table-row!important}.d-xl-table-cell{display:table-cell!important}.d-xl-flex{display:flex!important}.d-xl-inline-flex{display:inline-flex!important}}@media print{.d-print-none{display:none!important}.d-print-inline{display:inline!important}.d-print-inline-block{display:inline-block!important}.d-print-block{display:block!important}.d-print-table{display:table!important}.d-print-table-row{display:table-row!important}.d-print-table-cell{display:table-cell!important}.d-print-flex{display:flex!important}.d-print-inline-flex{display:inline-flex!important}}.embed-responsive{display:block;overflow:hidden;padding:0;position:relative;width:100%}.embed-responsive:before{content:"";display:block}.embed-responsive .embed-responsive-item,.embed-responsive embed,.embed-responsive iframe,.embed-responsive object,.embed-responsive video{border:0;bottom:0;height:100%;left:0;position:absolute;top:0;width:100%}.embed-responsive-21by9:before{padding-top:42.85714286%}.embed-responsive-16by9:before{padding-top:56.25%}.embed-responsive-4by3:before{padding-top:75%}.embed-responsive-1by1:before{padding-top:100%}.flex-row{flex-direction:row!important}.flex-column{flex-direction:column!important}.flex-row-reverse{flex-direction:row-reverse!important}.flex-column-reverse{flex-direction:column-reverse!important}.flex-wrap{flex-wrap:wrap!important}.flex-nowrap{flex-wrap:nowrap!important}.flex-wrap-reverse{flex-wrap:wrap-reverse!important}.flex-fill{flex:1 1 auto!important}.flex-grow-0{flex-grow:0!important}.flex-grow-1{flex-grow:1!important}.flex-shrink-0{flex-shrink:0!important}.flex-shrink-1{flex-shrink:1!important}.justify-content-start{justify-content:flex-start!important}.justify-content-end{justify-content:flex-end!important}.justify-content-center{justify-content:center!important}.justify-content-between{justify-content:space-between!important}.justify-content-around{justify-content:space-around!important}.align-items-start{align-items:flex-start!important}.align-items-end{align-items:flex-end!important}.align-items-center{align-items:center!important}.align-items-baseline{align-items:baseline!important}.align-items-stretch{align-items:stretch!important}.align-content-start{align-content:flex-start!important}.align-content-end{align-content:flex-end!important}.align-content-center{align-content:center!important}.align-content-between{align-content:space-between!important}.align-content-around{align-content:space-around!important}.align-content-stretch{align-content:stretch!important}.align-self-auto{align-self:auto!important}.align-self-start{align-self:flex-start!important}.align-self-end{align-self:flex-end!important}.align-self-center{align-self:center!important}.align-self-baseline{align-self:baseline!important}.align-self-stretch{align-self:stretch!important}@media (min-width:2px){.flex-sm-row{flex-direction:row!important}.flex-sm-column{flex-direction:column!important}.flex-sm-row-reverse{flex-direction:row-reverse!important}.flex-sm-column-reverse{flex-direction:column-reverse!important}.flex-sm-wrap{flex-wrap:wrap!important}.flex-sm-nowrap{flex-wrap:nowrap!important}.flex-sm-wrap-reverse{flex-wrap:wrap-reverse!important}.flex-sm-fill{flex:1 1 auto!important}.flex-sm-grow-0{flex-grow:0!important}.flex-sm-grow-1{flex-grow:1!important}.flex-sm-shrink-0{flex-shrink:0!important}.flex-sm-shrink-1{flex-shrink:1!important}.justify-content-sm-start{justify-content:flex-start!important}.justify-content-sm-end{justify-content:flex-end!important}.justify-content-sm-center{justify-content:center!important}.justify-content-sm-between{justify-content:space-between!important}.justify-content-sm-around{justify-content:space-around!important}.align-items-sm-start{align-items:flex-start!important}.align-items-sm-end{align-items:flex-end!important}.align-items-sm-center{align-items:center!important}.align-items-sm-baseline{align-items:baseline!important}.align-items-sm-stretch{align-items:stretch!important}.align-content-sm-start{align-content:flex-start!important}.align-content-sm-end{align-content:flex-end!important}.align-content-sm-center{align-content:center!important}.align-content-sm-between{align-content:space-between!important}.align-content-sm-around{align-content:space-around!important}.align-content-sm-stretch{align-content:stretch!important}.align-self-sm-auto{align-self:auto!important}.align-self-sm-start{align-self:flex-start!important}.align-self-sm-end{align-self:flex-end!important}.align-self-sm-center{align-self:center!important}.align-self-sm-baseline{align-self:baseline!important}.align-self-sm-stretch{align-self:stretch!important}}@media (min-width:8px){.flex-md-row{flex-direction:row!important}.flex-md-column{flex-direction:column!important}.flex-md-row-reverse{flex-direction:row-reverse!important}.flex-md-column-reverse{flex-direction:column-reverse!important}.flex-md-wrap{flex-wrap:wrap!important}.flex-md-nowrap{flex-wrap:nowrap!important}.flex-md-wrap-reverse{flex-wrap:wrap-reverse!important}.flex-md-fill{flex:1 1 auto!important}.flex-md-grow-0{flex-grow:0!important}.flex-md-grow-1{flex-grow:1!important}.flex-md-shrink-0{flex-shrink:0!important}.flex-md-shrink-1{flex-shrink:1!important}.justify-content-md-start{justify-content:flex-start!important}.justify-content-md-end{justify-content:flex-end!important}.justify-content-md-center{justify-content:center!important}.justify-content-md-between{justify-content:space-between!important}.justify-content-md-around{justify-content:space-around!important}.align-items-md-start{align-items:flex-start!important}.align-items-md-end{align-items:flex-end!important}.align-items-md-center{align-items:center!important}.align-items-md-baseline{align-items:baseline!important}.align-items-md-stretch{align-items:stretch!important}.align-content-md-start{align-content:flex-start!important}.align-content-md-end{align-content:flex-end!important}.align-content-md-center{align-content:center!important}.align-content-md-between{align-content:space-between!important}.align-content-md-around{align-content:space-around!important}.align-content-md-stretch{align-content:stretch!important}.align-self-md-auto{align-self:auto!important}.align-self-md-start{align-self:flex-start!important}.align-self-md-end{align-self:flex-end!important}.align-self-md-center{align-self:center!important}.align-self-md-baseline{align-self:baseline!important}.align-self-md-stretch{align-self:stretch!important}}@media (min-width:9px){.flex-lg-row{flex-direction:row!important}.flex-lg-column{flex-direction:column!important}.flex-lg-row-reverse{flex-direction:row-reverse!important}.flex-lg-column-reverse{flex-direction:column-reverse!important}.flex-lg-wrap{flex-wrap:wrap!important}.flex-lg-nowrap{flex-wrap:nowrap!important}.flex-lg-wrap-reverse{flex-wrap:wrap-reverse!important}.flex-lg-fill{flex:1 1 auto!important}.flex-lg-grow-0{flex-grow:0!important}.flex-lg-grow-1{flex-grow:1!important}.flex-lg-shrink-0{flex-shrink:0!important}.flex-lg-shrink-1{flex-shrink:1!important}.justify-content-lg-start{justify-content:flex-start!important}.justify-content-lg-end{justify-content:flex-end!important}.justify-content-lg-center{justify-content:center!important}.justify-content-lg-between{justify-content:space-between!important}.justify-content-lg-around{justify-content:space-around!important}.align-items-lg-start{align-items:flex-start!important}.align-items-lg-end{align-items:flex-end!important}.align-items-lg-center{align-items:center!important}.align-items-lg-baseline{align-items:baseline!important}.align-items-lg-stretch{align-items:stretch!important}.align-content-lg-start{align-content:flex-start!important}.align-content-lg-end{align-content:flex-end!important}.align-content-lg-center{align-content:center!important}.align-content-lg-between{align-content:space-between!important}.align-content-lg-around{align-content:space-around!important}.align-content-lg-stretch{align-content:stretch!important}.align-self-lg-auto{align-self:auto!important}.align-self-lg-start{align-self:flex-start!important}.align-self-lg-end{align-self:flex-end!important}.align-self-lg-center{align-self:center!important}.align-self-lg-baseline{align-self:baseline!important}.align-self-lg-stretch{align-self:stretch!important}}@media (min-width:10px){.flex-xl-row{flex-direction:row!important}.flex-xl-column{flex-direction:column!important}.flex-xl-row-reverse{flex-direction:row-reverse!important}.flex-xl-column-reverse{flex-direction:column-reverse!important}.flex-xl-wrap{flex-wrap:wrap!important}.flex-xl-nowrap{flex-wrap:nowrap!important}.flex-xl-wrap-reverse{flex-wrap:wrap-reverse!important}.flex-xl-fill{flex:1 1 auto!important}.flex-xl-grow-0{flex-grow:0!important}.flex-xl-grow-1{flex-grow:1!important}.flex-xl-shrink-0{flex-shrink:0!important}.flex-xl-shrink-1{flex-shrink:1!important}.justify-content-xl-start{justify-content:flex-start!important}.justify-content-xl-end{justify-content:flex-end!important}.justify-content-xl-center{justify-content:center!important}.justify-content-xl-between{justify-content:space-between!important}.justify-content-xl-around{justify-content:space-around!important}.align-items-xl-start{align-items:flex-start!important}.align-items-xl-end{align-items:flex-end!important}.align-items-xl-center{align-items:center!important}.align-items-xl-baseline{align-items:baseline!important}.align-items-xl-stretch{align-items:stretch!important}.align-content-xl-start{align-content:flex-start!important}.align-content-xl-end{align-content:flex-end!important}.align-content-xl-center{align-content:center!important}.align-content-xl-between{align-content:space-between!important}.align-content-xl-around{align-content:space-around!important}.align-content-xl-stretch{align-content:stretch!important}.align-self-xl-auto{align-self:auto!important}.align-self-xl-start{align-self:flex-start!important}.align-self-xl-end{align-self:flex-end!important}.align-self-xl-center{align-self:center!important}.align-self-xl-baseline{align-self:baseline!important}.align-self-xl-stretch{align-self:stretch!important}}.float-left{float:left!important}.float-right{float:right!important}.float-none{float:none!important}@media (min-width:2px){.float-sm-left{float:left!important}.float-sm-right{float:right!important}.float-sm-none{float:none!important}}@media (min-width:8px){.float-md-left{float:left!important}.float-md-right{float:right!important}.float-md-none{float:none!important}}@media (min-width:9px){.float-lg-left{float:left!important}.float-lg-right{float:right!important}.float-lg-none{float:none!important}}@media (min-width:10px){.float-xl-left{float:left!important}.float-xl-right{float:right!important}.float-xl-none{float:none!important}}.user-select-all{-webkit-user-select:all!important;-moz-user-select:all!important;user-select:all!important}.user-select-auto{-webkit-user-select:auto!important;-moz-user-select:auto!important;user-select:auto!important}.user-select-none{-webkit-user-select:none!important;-moz-user-select:none!important;user-select:none!important}.overflow-auto{overflow:auto!important}.overflow-hidden{overflow:hidden!important}.position-static{position:static!important}.position-relative{position:relative!important}.position-absolute{position:absolute!important}.position-fixed{position:fixed!important}.position-sticky{position:sticky!important}.fixed-top{top:0}.fixed-bottom,.fixed-top{left:0;position:fixed;right:0;z-index:1030}.fixed-bottom{bottom:0}@supports (position:sticky){.sticky-top{position:sticky;top:0;z-index:1020}}.sr-only{clip:rect(0,0,0,0);border:0;height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;white-space:nowrap;width:1px}.sr-only-focusable:active,.sr-only-focusable:focus{clip:auto;height:auto;overflow:visible;position:static;white-space:normal;width:auto}.shadow-sm{box-shadow:0 .125rem .25rem rgba(0,0,0,.075)!important}.shadow{box-shadow:0 .5rem 1rem rgba(0,0,0,.15)!important}.shadow-lg{box-shadow:0 1rem 3rem rgba(0,0,0,.175)!important}.shadow-none{box-shadow:none!important}.w-25{width:25%!important}.w-50{width:50%!important}.w-75{width:75%!important}.w-100{width:100%!important}.w-auto{width:auto!important}.h-25{height:25%!important}.h-50{height:50%!important}.h-75{height:75%!important}.h-100{height:100%!important}.h-auto{height:auto!important}.mw-100{max-width:100%!important}.mh-100{max-height:100%!important}.min-vw-100{min-width:100vw!important}.min-vh-100{min-height:100vh!important}.vw-100{width:100vw!important}.vh-100{height:100vh!important}.m-0{margin:0!important}.mt-0,.my-0{margin-top:0!important}.mr-0,.mx-0{margin-right:0!important}.mb-0,.my-0{margin-bottom:0!important}.ml-0,.mx-0{margin-left:0!important}.m-1{margin:.25rem!important}.mt-1,.my-1{margin-top:.25rem!important}.mr-1,.mx-1{margin-right:.25rem!important}.mb-1,.my-1{margin-bottom:.25rem!important}.ml-1,.mx-1{margin-left:.25rem!important}.m-2{margin:.5rem!important}.mt-2,.my-2{margin-top:.5rem!important}.mr-2,.mx-2{margin-right:.5rem!important}.mb-2,.my-2{margin-bottom:.5rem!important}.ml-2,.mx-2{margin-left:.5rem!important}.m-3{margin:1rem!important}.mt-3,.my-3{margin-top:1rem!important}.mr-3,.mx-3{margin-right:1rem!important}.mb-3,.my-3{margin-bottom:1rem!important}.ml-3,.mx-3{margin-left:1rem!important}.m-4{margin:1.5rem!important}.mt-4,.my-4{margin-top:1.5rem!important}.mr-4,.mx-4{margin-right:1.5rem!important}.mb-4,.my-4{margin-bottom:1.5rem!important}.ml-4,.mx-4{margin-left:1.5rem!important}.m-5{margin:3rem!important}.mt-5,.my-5{margin-top:3rem!important}.mr-5,.mx-5{margin-right:3rem!important}.mb-5,.my-5{margin-bottom:3rem!important}.ml-5,.mx-5{margin-left:3rem!important}.p-0{padding:0!important}.pt-0,.py-0{padding-top:0!important}.pr-0,.px-0{padding-right:0!important}.pb-0,.py-0{padding-bottom:0!important}.pl-0,.px-0{padding-left:0!important}.p-1{padding:.25rem!important}.pt-1,.py-1{padding-top:.25rem!important}.pr-1,.px-1{padding-right:.25rem!important}.pb-1,.py-1{padding-bottom:.25rem!important}.pl-1,.px-1{padding-left:.25rem!important}.p-2{padding:.5rem!important}.pt-2,.py-2{padding-top:.5rem!important}.pr-2,.px-2{padding-right:.5rem!important}.pb-2,.py-2{padding-bottom:.5rem!important}.pl-2,.px-2{padding-left:.5rem!important}.p-3{padding:1rem!important}.pt-3,.py-3{padding-top:1rem!important}.pr-3,.px-3{padding-right:1rem!important}.pb-3,.py-3{padding-bottom:1rem!important}.pl-3,.px-3{padding-left:1rem!important}.p-4{padding:1.5rem!important}.pt-4,.py-4{padding-top:1.5rem!important}.pr-4,.px-4{padding-right:1.5rem!important}.pb-4,.py-4{padding-bottom:1.5rem!important}.pl-4,.px-4{padding-left:1.5rem!important}.p-5{padding:3rem!important}.pt-5,.py-5{padding-top:3rem!important}.pr-5,.px-5{padding-right:3rem!important}.pb-5,.py-5{padding-bottom:3rem!important}.pl-5,.px-5{padding-left:3rem!important}.m-n1{margin:-.25rem!important}.mt-n1,.my-n1{margin-top:-.25rem!important}.mr-n1,.mx-n1{margin-right:-.25rem!important}.mb-n1,.my-n1{margin-bottom:-.25rem!important}.ml-n1,.mx-n1{margin-left:-.25rem!important}.m-n2{margin:-.5rem!important}.mt-n2,.my-n2{margin-top:-.5rem!important}.mr-n2,.mx-n2{margin-right:-.5rem!important}.mb-n2,.my-n2{margin-bottom:-.5rem!important}.ml-n2,.mx-n2{margin-left:-.5rem!important}.m-n3{margin:-1rem!important}.mt-n3,.my-n3{margin-top:-1rem!important}.mr-n3,.mx-n3{margin-right:-1rem!important}.mb-n3,.my-n3{margin-bottom:-1rem!important}.ml-n3,.mx-n3{margin-left:-1rem!important}.m-n4{margin:-1.5rem!important}.mt-n4,.my-n4{margin-top:-1.5rem!important}.mr-n4,.mx-n4{margin-right:-1.5rem!important}.mb-n4,.my-n4{margin-bottom:-1.5rem!important}.ml-n4,.mx-n4{margin-left:-1.5rem!important}.m-n5{margin:-3rem!important}.mt-n5,.my-n5{margin-top:-3rem!important}.mr-n5,.mx-n5{margin-right:-3rem!important}.mb-n5,.my-n5{margin-bottom:-3rem!important}.ml-n5,.mx-n5{margin-left:-3rem!important}.m-auto{margin:auto!important}.mt-auto,.my-auto{margin-top:auto!important}.mr-auto,.mx-auto{margin-right:auto!important}.mb-auto,.my-auto{margin-bottom:auto!important}.ml-auto,.mx-auto{margin-left:auto!important}@media (min-width:2px){.m-sm-0{margin:0!important}.mt-sm-0,.my-sm-0{margin-top:0!important}.mr-sm-0,.mx-sm-0{margin-right:0!important}.mb-sm-0,.my-sm-0{margin-bottom:0!important}.ml-sm-0,.mx-sm-0{margin-left:0!important}.m-sm-1{margin:.25rem!important}.mt-sm-1,.my-sm-1{margin-top:.25rem!important}.mr-sm-1,.mx-sm-1{margin-right:.25rem!important}.mb-sm-1,.my-sm-1{margin-bottom:.25rem!important}.ml-sm-1,.mx-sm-1{margin-left:.25rem!important}.m-sm-2{margin:.5rem!important}.mt-sm-2,.my-sm-2{margin-top:.5rem!important}.mr-sm-2,.mx-sm-2{margin-right:.5rem!important}.mb-sm-2,.my-sm-2{margin-bottom:.5rem!important}.ml-sm-2,.mx-sm-2{margin-left:.5rem!important}.m-sm-3{margin:1rem!important}.mt-sm-3,.my-sm-3{margin-top:1rem!important}.mr-sm-3,.mx-sm-3{margin-right:1rem!important}.mb-sm-3,.my-sm-3{margin-bottom:1rem!important}.ml-sm-3,.mx-sm-3{margin-left:1rem!important}.m-sm-4{margin:1.5rem!important}.mt-sm-4,.my-sm-4{margin-top:1.5rem!important}.mr-sm-4,.mx-sm-4{margin-right:1.5rem!important}.mb-sm-4,.my-sm-4{margin-bottom:1.5rem!important}.ml-sm-4,.mx-sm-4{margin-left:1.5rem!important}.m-sm-5{margin:3rem!important}.mt-sm-5,.my-sm-5{margin-top:3rem!important}.mr-sm-5,.mx-sm-5{margin-right:3rem!important}.mb-sm-5,.my-sm-5{margin-bottom:3rem!important}.ml-sm-5,.mx-sm-5{margin-left:3rem!important}.p-sm-0{padding:0!important}.pt-sm-0,.py-sm-0{padding-top:0!important}.pr-sm-0,.px-sm-0{padding-right:0!important}.pb-sm-0,.py-sm-0{padding-bottom:0!important}.pl-sm-0,.px-sm-0{padding-left:0!important}.p-sm-1{padding:.25rem!important}.pt-sm-1,.py-sm-1{padding-top:.25rem!important}.pr-sm-1,.px-sm-1{padding-right:.25rem!important}.pb-sm-1,.py-sm-1{padding-bottom:.25rem!important}.pl-sm-1,.px-sm-1{padding-left:.25rem!important}.p-sm-2{padding:.5rem!important}.pt-sm-2,.py-sm-2{padding-top:.5rem!important}.pr-sm-2,.px-sm-2{padding-right:.5rem!important}.pb-sm-2,.py-sm-2{padding-bottom:.5rem!important}.pl-sm-2,.px-sm-2{padding-left:.5rem!important}.p-sm-3{padding:1rem!important}.pt-sm-3,.py-sm-3{padding-top:1rem!important}.pr-sm-3,.px-sm-3{padding-right:1rem!important}.pb-sm-3,.py-sm-3{padding-bottom:1rem!important}.pl-sm-3,.px-sm-3{padding-left:1rem!important}.p-sm-4{padding:1.5rem!important}.pt-sm-4,.py-sm-4{padding-top:1.5rem!important}.pr-sm-4,.px-sm-4{padding-right:1.5rem!important}.pb-sm-4,.py-sm-4{padding-bottom:1.5rem!important}.pl-sm-4,.px-sm-4{padding-left:1.5rem!important}.p-sm-5{padding:3rem!important}.pt-sm-5,.py-sm-5{padding-top:3rem!important}.pr-sm-5,.px-sm-5{padding-right:3rem!important}.pb-sm-5,.py-sm-5{padding-bottom:3rem!important}.pl-sm-5,.px-sm-5{padding-left:3rem!important}.m-sm-n1{margin:-.25rem!important}.mt-sm-n1,.my-sm-n1{margin-top:-.25rem!important}.mr-sm-n1,.mx-sm-n1{margin-right:-.25rem!important}.mb-sm-n1,.my-sm-n1{margin-bottom:-.25rem!important}.ml-sm-n1,.mx-sm-n1{margin-left:-.25rem!important}.m-sm-n2{margin:-.5rem!important}.mt-sm-n2,.my-sm-n2{margin-top:-.5rem!important}.mr-sm-n2,.mx-sm-n2{margin-right:-.5rem!important}.mb-sm-n2,.my-sm-n2{margin-bottom:-.5rem!important}.ml-sm-n2,.mx-sm-n2{margin-left:-.5rem!important}.m-sm-n3{margin:-1rem!important}.mt-sm-n3,.my-sm-n3{margin-top:-1rem!important}.mr-sm-n3,.mx-sm-n3{margin-right:-1rem!important}.mb-sm-n3,.my-sm-n3{margin-bottom:-1rem!important}.ml-sm-n3,.mx-sm-n3{margin-left:-1rem!important}.m-sm-n4{margin:-1.5rem!important}.mt-sm-n4,.my-sm-n4{margin-top:-1.5rem!important}.mr-sm-n4,.mx-sm-n4{margin-right:-1.5rem!important}.mb-sm-n4,.my-sm-n4{margin-bottom:-1.5rem!important}.ml-sm-n4,.mx-sm-n4{margin-left:-1.5rem!important}.m-sm-n5{margin:-3rem!important}.mt-sm-n5,.my-sm-n5{margin-top:-3rem!important}.mr-sm-n5,.mx-sm-n5{margin-right:-3rem!important}.mb-sm-n5,.my-sm-n5{margin-bottom:-3rem!important}.ml-sm-n5,.mx-sm-n5{margin-left:-3rem!important}.m-sm-auto{margin:auto!important}.mt-sm-auto,.my-sm-auto{margin-top:auto!important}.mr-sm-auto,.mx-sm-auto{margin-right:auto!important}.mb-sm-auto,.my-sm-auto{margin-bottom:auto!important}.ml-sm-auto,.mx-sm-auto{margin-left:auto!important}}@media (min-width:8px){.m-md-0{margin:0!important}.mt-md-0,.my-md-0{margin-top:0!important}.mr-md-0,.mx-md-0{margin-right:0!important}.mb-md-0,.my-md-0{margin-bottom:0!important}.ml-md-0,.mx-md-0{margin-left:0!important}.m-md-1{margin:.25rem!important}.mt-md-1,.my-md-1{margin-top:.25rem!important}.mr-md-1,.mx-md-1{margin-right:.25rem!important}.mb-md-1,.my-md-1{margin-bottom:.25rem!important}.ml-md-1,.mx-md-1{margin-left:.25rem!important}.m-md-2{margin:.5rem!important}.mt-md-2,.my-md-2{margin-top:.5rem!important}.mr-md-2,.mx-md-2{margin-right:.5rem!important}.mb-md-2,.my-md-2{margin-bottom:.5rem!important}.ml-md-2,.mx-md-2{margin-left:.5rem!important}.m-md-3{margin:1rem!important}.mt-md-3,.my-md-3{margin-top:1rem!important}.mr-md-3,.mx-md-3{margin-right:1rem!important}.mb-md-3,.my-md-3{margin-bottom:1rem!important}.ml-md-3,.mx-md-3{margin-left:1rem!important}.m-md-4{margin:1.5rem!important}.mt-md-4,.my-md-4{margin-top:1.5rem!important}.mr-md-4,.mx-md-4{margin-right:1.5rem!important}.mb-md-4,.my-md-4{margin-bottom:1.5rem!important}.ml-md-4,.mx-md-4{margin-left:1.5rem!important}.m-md-5{margin:3rem!important}.mt-md-5,.my-md-5{margin-top:3rem!important}.mr-md-5,.mx-md-5{margin-right:3rem!important}.mb-md-5,.my-md-5{margin-bottom:3rem!important}.ml-md-5,.mx-md-5{margin-left:3rem!important}.p-md-0{padding:0!important}.pt-md-0,.py-md-0{padding-top:0!important}.pr-md-0,.px-md-0{padding-right:0!important}.pb-md-0,.py-md-0{padding-bottom:0!important}.pl-md-0,.px-md-0{padding-left:0!important}.p-md-1{padding:.25rem!important}.pt-md-1,.py-md-1{padding-top:.25rem!important}.pr-md-1,.px-md-1{padding-right:.25rem!important}.pb-md-1,.py-md-1{padding-bottom:.25rem!important}.pl-md-1,.px-md-1{padding-left:.25rem!important}.p-md-2{padding:.5rem!important}.pt-md-2,.py-md-2{padding-top:.5rem!important}.pr-md-2,.px-md-2{padding-right:.5rem!important}.pb-md-2,.py-md-2{padding-bottom:.5rem!important}.pl-md-2,.px-md-2{padding-left:.5rem!important}.p-md-3{padding:1rem!important}.pt-md-3,.py-md-3{padding-top:1rem!important}.pr-md-3,.px-md-3{padding-right:1rem!important}.pb-md-3,.py-md-3{padding-bottom:1rem!important}.pl-md-3,.px-md-3{padding-left:1rem!important}.p-md-4{padding:1.5rem!important}.pt-md-4,.py-md-4{padding-top:1.5rem!important}.pr-md-4,.px-md-4{padding-right:1.5rem!important}.pb-md-4,.py-md-4{padding-bottom:1.5rem!important}.pl-md-4,.px-md-4{padding-left:1.5rem!important}.p-md-5{padding:3rem!important}.pt-md-5,.py-md-5{padding-top:3rem!important}.pr-md-5,.px-md-5{padding-right:3rem!important}.pb-md-5,.py-md-5{padding-bottom:3rem!important}.pl-md-5,.px-md-5{padding-left:3rem!important}.m-md-n1{margin:-.25rem!important}.mt-md-n1,.my-md-n1{margin-top:-.25rem!important}.mr-md-n1,.mx-md-n1{margin-right:-.25rem!important}.mb-md-n1,.my-md-n1{margin-bottom:-.25rem!important}.ml-md-n1,.mx-md-n1{margin-left:-.25rem!important}.m-md-n2{margin:-.5rem!important}.mt-md-n2,.my-md-n2{margin-top:-.5rem!important}.mr-md-n2,.mx-md-n2{margin-right:-.5rem!important}.mb-md-n2,.my-md-n2{margin-bottom:-.5rem!important}.ml-md-n2,.mx-md-n2{margin-left:-.5rem!important}.m-md-n3{margin:-1rem!important}.mt-md-n3,.my-md-n3{margin-top:-1rem!important}.mr-md-n3,.mx-md-n3{margin-right:-1rem!important}.mb-md-n3,.my-md-n3{margin-bottom:-1rem!important}.ml-md-n3,.mx-md-n3{margin-left:-1rem!important}.m-md-n4{margin:-1.5rem!important}.mt-md-n4,.my-md-n4{margin-top:-1.5rem!important}.mr-md-n4,.mx-md-n4{margin-right:-1.5rem!important}.mb-md-n4,.my-md-n4{margin-bottom:-1.5rem!important}.ml-md-n4,.mx-md-n4{margin-left:-1.5rem!important}.m-md-n5{margin:-3rem!important}.mt-md-n5,.my-md-n5{margin-top:-3rem!important}.mr-md-n5,.mx-md-n5{margin-right:-3rem!important}.mb-md-n5,.my-md-n5{margin-bottom:-3rem!important}.ml-md-n5,.mx-md-n5{margin-left:-3rem!important}.m-md-auto{margin:auto!important}.mt-md-auto,.my-md-auto{margin-top:auto!important}.mr-md-auto,.mx-md-auto{margin-right:auto!important}.mb-md-auto,.my-md-auto{margin-bottom:auto!important}.ml-md-auto,.mx-md-auto{margin-left:auto!important}}@media (min-width:9px){.m-lg-0{margin:0!important}.mt-lg-0,.my-lg-0{margin-top:0!important}.mr-lg-0,.mx-lg-0{margin-right:0!important}.mb-lg-0,.my-lg-0{margin-bottom:0!important}.ml-lg-0,.mx-lg-0{margin-left:0!important}.m-lg-1{margin:.25rem!important}.mt-lg-1,.my-lg-1{margin-top:.25rem!important}.mr-lg-1,.mx-lg-1{margin-right:.25rem!important}.mb-lg-1,.my-lg-1{margin-bottom:.25rem!important}.ml-lg-1,.mx-lg-1{margin-left:.25rem!important}.m-lg-2{margin:.5rem!important}.mt-lg-2,.my-lg-2{margin-top:.5rem!important}.mr-lg-2,.mx-lg-2{margin-right:.5rem!important}.mb-lg-2,.my-lg-2{margin-bottom:.5rem!important}.ml-lg-2,.mx-lg-2{margin-left:.5rem!important}.m-lg-3{margin:1rem!important}.mt-lg-3,.my-lg-3{margin-top:1rem!important}.mr-lg-3,.mx-lg-3{margin-right:1rem!important}.mb-lg-3,.my-lg-3{margin-bottom:1rem!important}.ml-lg-3,.mx-lg-3{margin-left:1rem!important}.m-lg-4{margin:1.5rem!important}.mt-lg-4,.my-lg-4{margin-top:1.5rem!important}.mr-lg-4,.mx-lg-4{margin-right:1.5rem!important}.mb-lg-4,.my-lg-4{margin-bottom:1.5rem!important}.ml-lg-4,.mx-lg-4{margin-left:1.5rem!important}.m-lg-5{margin:3rem!important}.mt-lg-5,.my-lg-5{margin-top:3rem!important}.mr-lg-5,.mx-lg-5{margin-right:3rem!important}.mb-lg-5,.my-lg-5{margin-bottom:3rem!important}.ml-lg-5,.mx-lg-5{margin-left:3rem!important}.p-lg-0{padding:0!important}.pt-lg-0,.py-lg-0{padding-top:0!important}.pr-lg-0,.px-lg-0{padding-right:0!important}.pb-lg-0,.py-lg-0{padding-bottom:0!important}.pl-lg-0,.px-lg-0{padding-left:0!important}.p-lg-1{padding:.25rem!important}.pt-lg-1,.py-lg-1{padding-top:.25rem!important}.pr-lg-1,.px-lg-1{padding-right:.25rem!important}.pb-lg-1,.py-lg-1{padding-bottom:.25rem!important}.pl-lg-1,.px-lg-1{padding-left:.25rem!important}.p-lg-2{padding:.5rem!important}.pt-lg-2,.py-lg-2{padding-top:.5rem!important}.pr-lg-2,.px-lg-2{padding-right:.5rem!important}.pb-lg-2,.py-lg-2{padding-bottom:.5rem!important}.pl-lg-2,.px-lg-2{padding-left:.5rem!important}.p-lg-3{padding:1rem!important}.pt-lg-3,.py-lg-3{padding-top:1rem!important}.pr-lg-3,.px-lg-3{padding-right:1rem!important}.pb-lg-3,.py-lg-3{padding-bottom:1rem!important}.pl-lg-3,.px-lg-3{padding-left:1rem!important}.p-lg-4{padding:1.5rem!important}.pt-lg-4,.py-lg-4{padding-top:1.5rem!important}.pr-lg-4,.px-lg-4{padding-right:1.5rem!important}.pb-lg-4,.py-lg-4{padding-bottom:1.5rem!important}.pl-lg-4,.px-lg-4{padding-left:1.5rem!important}.p-lg-5{padding:3rem!important}.pt-lg-5,.py-lg-5{padding-top:3rem!important}.pr-lg-5,.px-lg-5{padding-right:3rem!important}.pb-lg-5,.py-lg-5{padding-bottom:3rem!important}.pl-lg-5,.px-lg-5{padding-left:3rem!important}.m-lg-n1{margin:-.25rem!important}.mt-lg-n1,.my-lg-n1{margin-top:-.25rem!important}.mr-lg-n1,.mx-lg-n1{margin-right:-.25rem!important}.mb-lg-n1,.my-lg-n1{margin-bottom:-.25rem!important}.ml-lg-n1,.mx-lg-n1{margin-left:-.25rem!important}.m-lg-n2{margin:-.5rem!important}.mt-lg-n2,.my-lg-n2{margin-top:-.5rem!important}.mr-lg-n2,.mx-lg-n2{margin-right:-.5rem!important}.mb-lg-n2,.my-lg-n2{margin-bottom:-.5rem!important}.ml-lg-n2,.mx-lg-n2{margin-left:-.5rem!important}.m-lg-n3{margin:-1rem!important}.mt-lg-n3,.my-lg-n3{margin-top:-1rem!important}.mr-lg-n3,.mx-lg-n3{margin-right:-1rem!important}.mb-lg-n3,.my-lg-n3{margin-bottom:-1rem!important}.ml-lg-n3,.mx-lg-n3{margin-left:-1rem!important}.m-lg-n4{margin:-1.5rem!important}.mt-lg-n4,.my-lg-n4{margin-top:-1.5rem!important}.mr-lg-n4,.mx-lg-n4{margin-right:-1.5rem!important}.mb-lg-n4,.my-lg-n4{margin-bottom:-1.5rem!important}.ml-lg-n4,.mx-lg-n4{margin-left:-1.5rem!important}.m-lg-n5{margin:-3rem!important}.mt-lg-n5,.my-lg-n5{margin-top:-3rem!important}.mr-lg-n5,.mx-lg-n5{margin-right:-3rem!important}.mb-lg-n5,.my-lg-n5{margin-bottom:-3rem!important}.ml-lg-n5,.mx-lg-n5{margin-left:-3rem!important}.m-lg-auto{margin:auto!important}.mt-lg-auto,.my-lg-auto{margin-top:auto!important}.mr-lg-auto,.mx-lg-auto{margin-right:auto!important}.mb-lg-auto,.my-lg-auto{margin-bottom:auto!important}.ml-lg-auto,.mx-lg-auto{margin-left:auto!important}}@media (min-width:10px){.m-xl-0{margin:0!important}.mt-xl-0,.my-xl-0{margin-top:0!important}.mr-xl-0,.mx-xl-0{margin-right:0!important}.mb-xl-0,.my-xl-0{margin-bottom:0!important}.ml-xl-0,.mx-xl-0{margin-left:0!important}.m-xl-1{margin:.25rem!important}.mt-xl-1,.my-xl-1{margin-top:.25rem!important}.mr-xl-1,.mx-xl-1{margin-right:.25rem!important}.mb-xl-1,.my-xl-1{margin-bottom:.25rem!important}.ml-xl-1,.mx-xl-1{margin-left:.25rem!important}.m-xl-2{margin:.5rem!important}.mt-xl-2,.my-xl-2{margin-top:.5rem!important}.mr-xl-2,.mx-xl-2{margin-right:.5rem!important}.mb-xl-2,.my-xl-2{margin-bottom:.5rem!important}.ml-xl-2,.mx-xl-2{margin-left:.5rem!important}.m-xl-3{margin:1rem!important}.mt-xl-3,.my-xl-3{margin-top:1rem!important}.mr-xl-3,.mx-xl-3{margin-right:1rem!important}.mb-xl-3,.my-xl-3{margin-bottom:1rem!important}.ml-xl-3,.mx-xl-3{margin-left:1rem!important}.m-xl-4{margin:1.5rem!important}.mt-xl-4,.my-xl-4{margin-top:1.5rem!important}.mr-xl-4,.mx-xl-4{margin-right:1.5rem!important}.mb-xl-4,.my-xl-4{margin-bottom:1.5rem!important}.ml-xl-4,.mx-xl-4{margin-left:1.5rem!important}.m-xl-5{margin:3rem!important}.mt-xl-5,.my-xl-5{margin-top:3rem!important}.mr-xl-5,.mx-xl-5{margin-right:3rem!important}.mb-xl-5,.my-xl-5{margin-bottom:3rem!important}.ml-xl-5,.mx-xl-5{margin-left:3rem!important}.p-xl-0{padding:0!important}.pt-xl-0,.py-xl-0{padding-top:0!important}.pr-xl-0,.px-xl-0{padding-right:0!important}.pb-xl-0,.py-xl-0{padding-bottom:0!important}.pl-xl-0,.px-xl-0{padding-left:0!important}.p-xl-1{padding:.25rem!important}.pt-xl-1,.py-xl-1{padding-top:.25rem!important}.pr-xl-1,.px-xl-1{padding-right:.25rem!important}.pb-xl-1,.py-xl-1{padding-bottom:.25rem!important}.pl-xl-1,.px-xl-1{padding-left:.25rem!important}.p-xl-2{padding:.5rem!important}.pt-xl-2,.py-xl-2{padding-top:.5rem!important}.pr-xl-2,.px-xl-2{padding-right:.5rem!important}.pb-xl-2,.py-xl-2{padding-bottom:.5rem!important}.pl-xl-2,.px-xl-2{padding-left:.5rem!important}.p-xl-3{padding:1rem!important}.pt-xl-3,.py-xl-3{padding-top:1rem!important}.pr-xl-3,.px-xl-3{padding-right:1rem!important}.pb-xl-3,.py-xl-3{padding-bottom:1rem!important}.pl-xl-3,.px-xl-3{padding-left:1rem!important}.p-xl-4{padding:1.5rem!important}.pt-xl-4,.py-xl-4{padding-top:1.5rem!important}.pr-xl-4,.px-xl-4{padding-right:1.5rem!important}.pb-xl-4,.py-xl-4{padding-bottom:1.5rem!important}.pl-xl-4,.px-xl-4{padding-left:1.5rem!important}.p-xl-5{padding:3rem!important}.pt-xl-5,.py-xl-5{padding-top:3rem!important}.pr-xl-5,.px-xl-5{padding-right:3rem!important}.pb-xl-5,.py-xl-5{padding-bottom:3rem!important}.pl-xl-5,.px-xl-5{padding-left:3rem!important}.m-xl-n1{margin:-.25rem!important}.mt-xl-n1,.my-xl-n1{margin-top:-.25rem!important}.mr-xl-n1,.mx-xl-n1{margin-right:-.25rem!important}.mb-xl-n1,.my-xl-n1{margin-bottom:-.25rem!important}.ml-xl-n1,.mx-xl-n1{margin-left:-.25rem!important}.m-xl-n2{margin:-.5rem!important}.mt-xl-n2,.my-xl-n2{margin-top:-.5rem!important}.mr-xl-n2,.mx-xl-n2{margin-right:-.5rem!important}.mb-xl-n2,.my-xl-n2{margin-bottom:-.5rem!important}.ml-xl-n2,.mx-xl-n2{margin-left:-.5rem!important}.m-xl-n3{margin:-1rem!important}.mt-xl-n3,.my-xl-n3{margin-top:-1rem!important}.mr-xl-n3,.mx-xl-n3{margin-right:-1rem!important}.mb-xl-n3,.my-xl-n3{margin-bottom:-1rem!important}.ml-xl-n3,.mx-xl-n3{margin-left:-1rem!important}.m-xl-n4{margin:-1.5rem!important}.mt-xl-n4,.my-xl-n4{margin-top:-1.5rem!important}.mr-xl-n4,.mx-xl-n4{margin-right:-1.5rem!important}.mb-xl-n4,.my-xl-n4{margin-bottom:-1.5rem!important}.ml-xl-n4,.mx-xl-n4{margin-left:-1.5rem!important}.m-xl-n5{margin:-3rem!important}.mt-xl-n5,.my-xl-n5{margin-top:-3rem!important}.mr-xl-n5,.mx-xl-n5{margin-right:-3rem!important}.mb-xl-n5,.my-xl-n5{margin-bottom:-3rem!important}.ml-xl-n5,.mx-xl-n5{margin-left:-3rem!important}.m-xl-auto{margin:auto!important}.mt-xl-auto,.my-xl-auto{margin-top:auto!important}.mr-xl-auto,.mx-xl-auto{margin-right:auto!important}.mb-xl-auto,.my-xl-auto{margin-bottom:auto!important}.ml-xl-auto,.mx-xl-auto{margin-left:auto!important}}.stretched-link:after{background-color:transparent;bottom:0;content:"";left:0;pointer-events:auto;position:absolute;right:0;top:0;z-index:1}.text-monospace{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace!important}.text-justify{text-align:justify!important}.text-wrap{white-space:normal!important}.text-nowrap{white-space:nowrap!important}.text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.text-left{text-align:left!important}.text-right{text-align:right!important}.text-center{text-align:center!important}@media (min-width:2px){.text-sm-left{text-align:left!important}.text-sm-right{text-align:right!important}.text-sm-center{text-align:center!important}}@media (min-width:8px){.text-md-left{text-align:left!important}.text-md-right{text-align:right!important}.text-md-center{text-align:center!important}}@media (min-width:9px){.text-lg-left{text-align:left!important}.text-lg-right{text-align:right!important}.text-lg-center{text-align:center!important}}@media (min-width:10px){.text-xl-left{text-align:left!important}.text-xl-right{text-align:right!important}.text-xl-center{text-align:center!important}}.text-lowercase{text-transform:lowercase!important}.text-uppercase{text-transform:uppercase!important}.text-capitalize{text-transform:capitalize!important}.font-weight-light{font-weight:300!important}.font-weight-lighter{font-weight:lighter!important}.font-weight-normal{font-weight:400!important}.font-weight-bold{font-weight:600!important}.font-weight-bolder{font-weight:bolder!important}.font-italic{font-style:italic!important}.text-white{color:#fff!important}.text-primary{color:#4040c8!important}a.text-primary:focus,a.text-primary:hover{color:#2a2a92!important}.text-secondary{color:#4b5563!important}a.text-secondary:focus,a.text-secondary:hover{color:#2a3037!important}.text-success{color:#059669!important}a.text-success:focus,a.text-success:hover{color:#034c35!important}.text-info{color:#2563eb!important}a.text-info:focus,a.text-info:hover{color:#1043b3!important}.text-warning{color:#d97706!important}a.text-warning:focus,a.text-warning:hover{color:#8f4e04!important}.text-danger{color:#dc2626!important}a.text-danger:focus,a.text-danger:hover{color:#9c1919!important}.text-light{color:#f3f4f6!important}a.text-light:focus,a.text-light:hover{color:#c7ccd5!important}.text-dark{color:#1f2937!important}a.text-dark:focus,a.text-dark:hover{color:#030506!important}.text-body{color:#111827!important}.text-muted{color:#6b7280!important}.text-black-50{color:rgba(0,0,0,.5)!important}.text-white-50{color:hsla(0,0%,100%,.5)!important}.text-hide{background-color:transparent;border:0;color:transparent;font:0/0 a;text-shadow:none}.text-decoration-none{text-decoration:none!important}.text-break{word-wrap:break-word!important;word-break:break-word!important}.text-reset{color:inherit!important}.visible{visibility:visible!important}.invisible{visibility:hidden!important}@media print{*,:after,:before{box-shadow:none!important;text-shadow:none!important}a:not(.btn){text-decoration:underline}abbr[title]:after{content:" (" attr(title) ")"}pre{white-space:pre-wrap!important}blockquote,pre{border:1px solid #6b7280}blockquote,img,pre,tr{page-break-inside:avoid}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}@page{size:a3;}.container,body{min-width:9px!important}.navbar{display:none}.badge{border:1px solid #000}.table{border-collapse:collapse!important}.table td,.table th{background-color:#fff!important}.table-bordered td,.table-bordered th{border:1px solid #d1d5db!important}.table-dark{color:inherit}.table-dark tbody+tbody,.table-dark td,.table-dark th,.table-dark thead th{border-color:#e5e7eb}.table .thead-dark th{border-color:#e5e7eb;color:inherit}}.vjs-tree{color:#bfc7d5!important;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}.vjs-tree .vjs-tree__content{border-left:1px dotted hsla(0,0%,80%,.28)!important}.vjs-tree .vjs-tree__node{cursor:pointer}.vjs-tree .vjs-tree__node:hover{color:#20a0ff}.vjs-tree .vjs-checkbox{left:-30px;position:absolute}.vjs-tree .vjs-value__boolean,.vjs-tree .vjs-value__null,.vjs-tree .vjs-value__number{color:#a291f5!important}.vjs-tree .vjs-value__string{color:#c3e88d!important}.vjs-tree .vjs-key{color:#c3cbd3!important}.hljs-addition,.hljs-attr,.hljs-keyword,.hljs-selector-tag{color:#13ce66}.hljs-bullet,.hljs-meta,.hljs-name,.hljs-string,.hljs-symbol,.hljs-template-tag,.hljs-template-variable,.hljs-type,.hljs-variable{color:#c3e88d}.hljs-comment,.hljs-deletion,.hljs-quote{color:#bfcbd9}.hljs-literal,.hljs-number,.hljs-title{color:#a291f5!important}body{padding-bottom:20px}.container{max-width:1440px}html{min-width:1140px}[v-cloak]{display:none}svg.icon{height:1rem;width:1rem}.header{border-bottom:1px solid #e5e7eb}.header .logo{color:#374151;text-decoration:none}.header .logo svg{height:1.7rem;width:1.7rem}.sidebar .nav-item a{border-radius:6px;color:#4b5563;margin-bottom:4px;padding:.5rem .75rem}.sidebar .nav-item a svg{fill:#9ca3af;height:1.25rem;margin-right:15px;width:1.25rem}.sidebar .nav-item a.active,.sidebar .nav-item a:hover{background-color:#e5e7eb;color:#4040c8}.sidebar .nav-item a.active svg{fill:#4040c8}.card{border:none;box-shadow:0 4px 6px -1px rgba(0,0,0,.1),0 2px 4px -2px rgba(0,0,0,.1)}.card .bottom-radius{border-bottom-left-radius:6px;border-bottom-right-radius:6px}.card .card-header{background-color:#fff;border-bottom:none;min-height:60px;padding-bottom:.7rem;padding-top:.7rem}.card .card-header .btn-group .btn{padding:.2rem .5rem}.card .card-header .form-control-with-icon{position:relative}.card .card-header .form-control-with-icon .icon-wrapper{align-items:center;bottom:0;display:flex;justify-content:center;left:.75rem;position:absolute;top:0}.card .card-header .form-control-with-icon .icon-wrapper .icon{fill:#6b7280}.card .card-header .form-control-with-icon .form-control{border-radius:9999px;font-size:.875rem;padding-left:2.25rem}.card .table td,.card .table th{padding:.75rem 1.25rem}.card .table th{background-color:#f3f4f6;border-bottom:0;font-size:.875rem;padding:.5rem 1.25rem}.card .table:not(.table-borderless) td{border-top:1px solid #e5e7eb}.card .table.penultimate-column-right td:nth-last-child(2),.card .table.penultimate-column-right th:nth-last-child(2){text-align:right}.card .table td.table-fit,.card .table th.table-fit{white-space:nowrap;width:1%}.fill-text-color{fill:#111827}.fill-danger{fill:#dc2626}.fill-warning{fill:#d97706}.fill-info{fill:#2563eb}.fill-success{fill:#059669}.fill-primary{fill:#4040c8}button:hover .fill-primary{fill:#fff}.btn-outline-primary.active .fill-primary{fill:#f3f4f6}.btn-outline-primary:not(:disabled):not(.disabled).active:focus{box-shadow:none!important}.btn-muted{background:#e5e7eb;color:#4b5563}.btn-muted:focus,.btn-muted:hover{background:#d1d5db;color:#111827}.btn-muted.active{background:#4040c8;color:#fff}.badge-secondary{background:#e5e7eb;color:#4b5563}.badge-success{background:#d1fae5;color:#059669}.badge-info{background:#dbeafe;color:#2563eb}.badge-warning{background:#fef3c7;color:#d97706}.badge-danger{background:#fee2e2;color:#dc2626}.control-action svg{fill:#d1d5db;height:1.2rem;width:1.2rem}.control-action svg:hover{fill:#4f46e5}@keyframes spin{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.spin{animation:spin 2s linear infinite}.card .nav-pills{background:#fff}.card .nav-pills .nav-link{border-radius:0;color:#4b5563;font-size:.9rem;padding:.75rem 1.25rem}.card .nav-pills .nav-link:focus,.card .nav-pills .nav-link:hover{color:#1f2937}.card .nav-pills .nav-link.active{background:none;border-bottom:2px solid #4f46e5;color:#4f46e5}.list-enter-active:not(.dontanimate){transition:background 1s linear}.list-enter:not(.dontanimate),.list-leave-to:not(.dontanimate){background:#eef2ff}.code-bg .list-enter:not(.dontanimate),.code-bg .list-leave-to:not(.dontanimate){background:#4b5563}#indexScreen td{vertical-align:middle!important}.card-bg-secondary{background:#f3f4f6}.code-bg{background:#292d3e}.disabled-watcher{background:#dc2626;color:#fff;padding:.75rem}.copy-to-clipboard{--tw-text-opacity:1;color:rgb(231 232 242/var(--tw-text-opacity));opacity:.7;outline:2px solid transparent;outline-offset:2px;position:absolute;right:0;top:0;z-index:10} + */:root{--blue:#007bff;--indigo:#6610f2;--purple:#6f42c1;--pink:#e83e8c;--red:#dc3545;--orange:#fd7e14;--yellow:#ffc107;--green:#28a745;--teal:#20c997;--cyan:#17a2b8;--white:#fff;--gray:#4b5563;--gray-dark:#1f2937;--primary:#4040c8;--secondary:#4b5563;--success:#059669;--info:#2563eb;--warning:#d97706;--danger:#dc2626;--light:#f3f4f6;--dark:#1f2937;--breakpoint-xs:0;--breakpoint-sm:2px;--breakpoint-md:8px;--breakpoint-lg:9px;--breakpoint-xl:10px;--font-family-sans-serif:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans","Liberation Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--font-family-monospace:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace}*,:after,:before{box-sizing:border-box}html{-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:rgba(0,0,0,0);font-family:sans-serif;line-height:1.15}article,aside,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}body{background-color:#f3f4f6;color:#111827;font-family:Figtree,sans-serif;font-size:1rem;font-weight:400;line-height:1.5;margin:0;text-align:left}[tabindex="-1"]:focus:not(:focus-visible){outline:0!important}hr{box-sizing:content-box;height:0;overflow:visible}h1,h2,h3,h4,h5,h6{margin-bottom:.5rem;margin-top:0}p{margin-bottom:1rem;margin-top:0}abbr[data-original-title],abbr[title]{border-bottom:0;cursor:help;text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted;-webkit-text-decoration-skip-ink:none;text-decoration-skip-ink:none}address{font-style:normal;line-height:inherit}address,dl,ol,ul{margin-bottom:1rem}dl,ol,ul{margin-top:0}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:600}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}b,strong{font-weight:bolder}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{background-color:transparent;color:#6366f1;text-decoration:none}a:hover{color:#4f46e5;text-decoration:underline}a:not([href]):not([class]),a:not([href]):not([class]):hover{color:inherit;text-decoration:none}code,kbd,pre,samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-size:1em}pre{-ms-overflow-style:scrollbar;margin-bottom:1rem;margin-top:0;overflow:auto}figure{margin:0 0 1rem}img{border-style:none}img,svg{vertical-align:middle}svg{overflow:hidden}table{border-collapse:collapse}caption{caption-side:bottom;color:#6b7280;padding-bottom:.75rem;padding-top:.75rem;text-align:left}th{text-align:inherit;text-align:-webkit-match-parent}label{display:inline-block;margin-bottom:.5rem}button{border-radius:0}button:focus:not(:focus-visible){outline:0}button,input,optgroup,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit;margin:0}button,input{overflow:visible}button,select{text-transform:none}[role=button]{cursor:pointer}select{word-wrap:normal}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]:not(:disabled),[type=reset]:not(:disabled),[type=submit]:not(:disabled),button:not(:disabled){cursor:pointer}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}textarea{overflow:auto;resize:vertical}fieldset{border:0;margin:0;min-width:0;padding:0}legend{color:inherit;display:block;font-size:1.5rem;line-height:inherit;margin-bottom:.5rem;max-width:100%;padding:0;white-space:normal;width:100%}progress{vertical-align:baseline}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:none;outline-offset:-2px}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}output{display:inline-block}summary{cursor:pointer;display:list-item}template{display:none}[hidden]{display:none!important}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{font-weight:500;line-height:1.2;margin-bottom:.5rem}.h1,h1{font-size:2.5rem}.h2,h2{font-size:2rem}.h3,h3{font-size:1.75rem}.h4,h4{font-size:1.5rem}.h5,h5{font-size:1.25rem}.h6,h6{font-size:1rem}.lead{font-size:1.25rem;font-weight:300}.display-1{font-size:6rem}.display-1,.display-2{font-weight:300;line-height:1.2}.display-2{font-size:5.5rem}.display-3{font-size:4.5rem}.display-3,.display-4{font-weight:300;line-height:1.2}.display-4{font-size:3.5rem}hr{border:0;border-top:1px solid rgba(0,0,0,.1);margin-bottom:1rem;margin-top:1rem}.small,small{font-size:.875em;font-weight:400}.mark,mark{background-color:#fcf8e3;padding:.2em}.list-inline,.list-unstyled{list-style:none;padding-left:0}.list-inline-item{display:inline-block}.list-inline-item:not(:last-child){margin-right:.5rem}.initialism{font-size:90%;text-transform:uppercase}.blockquote{font-size:1.25rem;margin-bottom:1rem}.blockquote-footer{color:#4b5563;display:block;font-size:.875em}.blockquote-footer:before{content:"— "}.img-fluid,.img-thumbnail{height:auto;max-width:100%}.img-thumbnail{background-color:#f3f4f6;border:1px solid #d1d5db;border-radius:.25rem;padding:.25rem}.figure{display:inline-block}.figure-img{line-height:1;margin-bottom:.5rem}.figure-caption{color:#4b5563;font-size:90%}code{word-wrap:break-word;color:#e83e8c;font-size:87.5%}a>code{color:inherit}kbd{background-color:#111827;border-radius:.2rem;color:#fff;font-size:87.5%;padding:.2rem .4rem}kbd kbd{font-size:100%;font-weight:600;padding:0}pre{color:#111827;display:block;font-size:87.5%}pre code{color:inherit;font-size:inherit;word-break:normal}.pre-scrollable{max-height:340px;overflow-y:scroll}.container,.container-fluid,.container-lg,.container-md,.container-sm,.container-xl{margin-left:auto;margin-right:auto;padding-left:15px;padding-right:15px;width:100%}@media (min-width:2px){.container,.container-sm{max-width:1137px}}@media (min-width:8px){.container,.container-md,.container-sm{max-width:1138px}}@media (min-width:9px){.container,.container-lg,.container-md,.container-sm{max-width:1139px}}@media (min-width:10px){.container,.container-lg,.container-md,.container-sm,.container-xl{max-width:1140px}}.row{display:flex;flex-wrap:wrap;margin-left:-15px;margin-right:-15px}.no-gutters{margin-left:0;margin-right:0}.no-gutters>.col,.no-gutters>[class*=col-]{padding-left:0;padding-right:0}.col,.col-1,.col-10,.col-11,.col-12,.col-2,.col-3,.col-4,.col-5,.col-6,.col-7,.col-8,.col-9,.col-auto,.col-lg,.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-auto,.col-md,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-auto,.col-sm,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-auto,.col-xl,.col-xl-1,.col-xl-10,.col-xl-11,.col-xl-12,.col-xl-2,.col-xl-3,.col-xl-4,.col-xl-5,.col-xl-6,.col-xl-7,.col-xl-8,.col-xl-9,.col-xl-auto{padding-left:15px;padding-right:15px;position:relative;width:100%}.col{flex-basis:0;flex-grow:1;max-width:100%}.row-cols-1>*{flex:0 0 100%;max-width:100%}.row-cols-2>*{flex:0 0 50%;max-width:50%}.row-cols-3>*{flex:0 0 33.3333333333%;max-width:33.3333333333%}.row-cols-4>*{flex:0 0 25%;max-width:25%}.row-cols-5>*{flex:0 0 20%;max-width:20%}.row-cols-6>*{flex:0 0 16.6666666667%;max-width:16.6666666667%}.col-auto{flex:0 0 auto;max-width:100%;width:auto}.col-1{flex:0 0 8.33333333%;max-width:8.33333333%}.col-2{flex:0 0 16.66666667%;max-width:16.66666667%}.col-3{flex:0 0 25%;max-width:25%}.col-4{flex:0 0 33.33333333%;max-width:33.33333333%}.col-5{flex:0 0 41.66666667%;max-width:41.66666667%}.col-6{flex:0 0 50%;max-width:50%}.col-7{flex:0 0 58.33333333%;max-width:58.33333333%}.col-8{flex:0 0 66.66666667%;max-width:66.66666667%}.col-9{flex:0 0 75%;max-width:75%}.col-10{flex:0 0 83.33333333%;max-width:83.33333333%}.col-11{flex:0 0 91.66666667%;max-width:91.66666667%}.col-12{flex:0 0 100%;max-width:100%}.order-first{order:-1}.order-last{order:13}.order-0{order:0}.order-1{order:1}.order-2{order:2}.order-3{order:3}.order-4{order:4}.order-5{order:5}.order-6{order:6}.order-7{order:7}.order-8{order:8}.order-9{order:9}.order-10{order:10}.order-11{order:11}.order-12{order:12}.offset-1{margin-left:8.33333333%}.offset-2{margin-left:16.66666667%}.offset-3{margin-left:25%}.offset-4{margin-left:33.33333333%}.offset-5{margin-left:41.66666667%}.offset-6{margin-left:50%}.offset-7{margin-left:58.33333333%}.offset-8{margin-left:66.66666667%}.offset-9{margin-left:75%}.offset-10{margin-left:83.33333333%}.offset-11{margin-left:91.66666667%}@media (min-width:2px){.col-sm{flex-basis:0;flex-grow:1;max-width:100%}.row-cols-sm-1>*{flex:0 0 100%;max-width:100%}.row-cols-sm-2>*{flex:0 0 50%;max-width:50%}.row-cols-sm-3>*{flex:0 0 33.3333333333%;max-width:33.3333333333%}.row-cols-sm-4>*{flex:0 0 25%;max-width:25%}.row-cols-sm-5>*{flex:0 0 20%;max-width:20%}.row-cols-sm-6>*{flex:0 0 16.6666666667%;max-width:16.6666666667%}.col-sm-auto{flex:0 0 auto;max-width:100%;width:auto}.col-sm-1{flex:0 0 8.33333333%;max-width:8.33333333%}.col-sm-2{flex:0 0 16.66666667%;max-width:16.66666667%}.col-sm-3{flex:0 0 25%;max-width:25%}.col-sm-4{flex:0 0 33.33333333%;max-width:33.33333333%}.col-sm-5{flex:0 0 41.66666667%;max-width:41.66666667%}.col-sm-6{flex:0 0 50%;max-width:50%}.col-sm-7{flex:0 0 58.33333333%;max-width:58.33333333%}.col-sm-8{flex:0 0 66.66666667%;max-width:66.66666667%}.col-sm-9{flex:0 0 75%;max-width:75%}.col-sm-10{flex:0 0 83.33333333%;max-width:83.33333333%}.col-sm-11{flex:0 0 91.66666667%;max-width:91.66666667%}.col-sm-12{flex:0 0 100%;max-width:100%}.order-sm-first{order:-1}.order-sm-last{order:13}.order-sm-0{order:0}.order-sm-1{order:1}.order-sm-2{order:2}.order-sm-3{order:3}.order-sm-4{order:4}.order-sm-5{order:5}.order-sm-6{order:6}.order-sm-7{order:7}.order-sm-8{order:8}.order-sm-9{order:9}.order-sm-10{order:10}.order-sm-11{order:11}.order-sm-12{order:12}.offset-sm-0{margin-left:0}.offset-sm-1{margin-left:8.33333333%}.offset-sm-2{margin-left:16.66666667%}.offset-sm-3{margin-left:25%}.offset-sm-4{margin-left:33.33333333%}.offset-sm-5{margin-left:41.66666667%}.offset-sm-6{margin-left:50%}.offset-sm-7{margin-left:58.33333333%}.offset-sm-8{margin-left:66.66666667%}.offset-sm-9{margin-left:75%}.offset-sm-10{margin-left:83.33333333%}.offset-sm-11{margin-left:91.66666667%}}@media (min-width:8px){.col-md{flex-basis:0;flex-grow:1;max-width:100%}.row-cols-md-1>*{flex:0 0 100%;max-width:100%}.row-cols-md-2>*{flex:0 0 50%;max-width:50%}.row-cols-md-3>*{flex:0 0 33.3333333333%;max-width:33.3333333333%}.row-cols-md-4>*{flex:0 0 25%;max-width:25%}.row-cols-md-5>*{flex:0 0 20%;max-width:20%}.row-cols-md-6>*{flex:0 0 16.6666666667%;max-width:16.6666666667%}.col-md-auto{flex:0 0 auto;max-width:100%;width:auto}.col-md-1{flex:0 0 8.33333333%;max-width:8.33333333%}.col-md-2{flex:0 0 16.66666667%;max-width:16.66666667%}.col-md-3{flex:0 0 25%;max-width:25%}.col-md-4{flex:0 0 33.33333333%;max-width:33.33333333%}.col-md-5{flex:0 0 41.66666667%;max-width:41.66666667%}.col-md-6{flex:0 0 50%;max-width:50%}.col-md-7{flex:0 0 58.33333333%;max-width:58.33333333%}.col-md-8{flex:0 0 66.66666667%;max-width:66.66666667%}.col-md-9{flex:0 0 75%;max-width:75%}.col-md-10{flex:0 0 83.33333333%;max-width:83.33333333%}.col-md-11{flex:0 0 91.66666667%;max-width:91.66666667%}.col-md-12{flex:0 0 100%;max-width:100%}.order-md-first{order:-1}.order-md-last{order:13}.order-md-0{order:0}.order-md-1{order:1}.order-md-2{order:2}.order-md-3{order:3}.order-md-4{order:4}.order-md-5{order:5}.order-md-6{order:6}.order-md-7{order:7}.order-md-8{order:8}.order-md-9{order:9}.order-md-10{order:10}.order-md-11{order:11}.order-md-12{order:12}.offset-md-0{margin-left:0}.offset-md-1{margin-left:8.33333333%}.offset-md-2{margin-left:16.66666667%}.offset-md-3{margin-left:25%}.offset-md-4{margin-left:33.33333333%}.offset-md-5{margin-left:41.66666667%}.offset-md-6{margin-left:50%}.offset-md-7{margin-left:58.33333333%}.offset-md-8{margin-left:66.66666667%}.offset-md-9{margin-left:75%}.offset-md-10{margin-left:83.33333333%}.offset-md-11{margin-left:91.66666667%}}@media (min-width:9px){.col-lg{flex-basis:0;flex-grow:1;max-width:100%}.row-cols-lg-1>*{flex:0 0 100%;max-width:100%}.row-cols-lg-2>*{flex:0 0 50%;max-width:50%}.row-cols-lg-3>*{flex:0 0 33.3333333333%;max-width:33.3333333333%}.row-cols-lg-4>*{flex:0 0 25%;max-width:25%}.row-cols-lg-5>*{flex:0 0 20%;max-width:20%}.row-cols-lg-6>*{flex:0 0 16.6666666667%;max-width:16.6666666667%}.col-lg-auto{flex:0 0 auto;max-width:100%;width:auto}.col-lg-1{flex:0 0 8.33333333%;max-width:8.33333333%}.col-lg-2{flex:0 0 16.66666667%;max-width:16.66666667%}.col-lg-3{flex:0 0 25%;max-width:25%}.col-lg-4{flex:0 0 33.33333333%;max-width:33.33333333%}.col-lg-5{flex:0 0 41.66666667%;max-width:41.66666667%}.col-lg-6{flex:0 0 50%;max-width:50%}.col-lg-7{flex:0 0 58.33333333%;max-width:58.33333333%}.col-lg-8{flex:0 0 66.66666667%;max-width:66.66666667%}.col-lg-9{flex:0 0 75%;max-width:75%}.col-lg-10{flex:0 0 83.33333333%;max-width:83.33333333%}.col-lg-11{flex:0 0 91.66666667%;max-width:91.66666667%}.col-lg-12{flex:0 0 100%;max-width:100%}.order-lg-first{order:-1}.order-lg-last{order:13}.order-lg-0{order:0}.order-lg-1{order:1}.order-lg-2{order:2}.order-lg-3{order:3}.order-lg-4{order:4}.order-lg-5{order:5}.order-lg-6{order:6}.order-lg-7{order:7}.order-lg-8{order:8}.order-lg-9{order:9}.order-lg-10{order:10}.order-lg-11{order:11}.order-lg-12{order:12}.offset-lg-0{margin-left:0}.offset-lg-1{margin-left:8.33333333%}.offset-lg-2{margin-left:16.66666667%}.offset-lg-3{margin-left:25%}.offset-lg-4{margin-left:33.33333333%}.offset-lg-5{margin-left:41.66666667%}.offset-lg-6{margin-left:50%}.offset-lg-7{margin-left:58.33333333%}.offset-lg-8{margin-left:66.66666667%}.offset-lg-9{margin-left:75%}.offset-lg-10{margin-left:83.33333333%}.offset-lg-11{margin-left:91.66666667%}}@media (min-width:10px){.col-xl{flex-basis:0;flex-grow:1;max-width:100%}.row-cols-xl-1>*{flex:0 0 100%;max-width:100%}.row-cols-xl-2>*{flex:0 0 50%;max-width:50%}.row-cols-xl-3>*{flex:0 0 33.3333333333%;max-width:33.3333333333%}.row-cols-xl-4>*{flex:0 0 25%;max-width:25%}.row-cols-xl-5>*{flex:0 0 20%;max-width:20%}.row-cols-xl-6>*{flex:0 0 16.6666666667%;max-width:16.6666666667%}.col-xl-auto{flex:0 0 auto;max-width:100%;width:auto}.col-xl-1{flex:0 0 8.33333333%;max-width:8.33333333%}.col-xl-2{flex:0 0 16.66666667%;max-width:16.66666667%}.col-xl-3{flex:0 0 25%;max-width:25%}.col-xl-4{flex:0 0 33.33333333%;max-width:33.33333333%}.col-xl-5{flex:0 0 41.66666667%;max-width:41.66666667%}.col-xl-6{flex:0 0 50%;max-width:50%}.col-xl-7{flex:0 0 58.33333333%;max-width:58.33333333%}.col-xl-8{flex:0 0 66.66666667%;max-width:66.66666667%}.col-xl-9{flex:0 0 75%;max-width:75%}.col-xl-10{flex:0 0 83.33333333%;max-width:83.33333333%}.col-xl-11{flex:0 0 91.66666667%;max-width:91.66666667%}.col-xl-12{flex:0 0 100%;max-width:100%}.order-xl-first{order:-1}.order-xl-last{order:13}.order-xl-0{order:0}.order-xl-1{order:1}.order-xl-2{order:2}.order-xl-3{order:3}.order-xl-4{order:4}.order-xl-5{order:5}.order-xl-6{order:6}.order-xl-7{order:7}.order-xl-8{order:8}.order-xl-9{order:9}.order-xl-10{order:10}.order-xl-11{order:11}.order-xl-12{order:12}.offset-xl-0{margin-left:0}.offset-xl-1{margin-left:8.33333333%}.offset-xl-2{margin-left:16.66666667%}.offset-xl-3{margin-left:25%}.offset-xl-4{margin-left:33.33333333%}.offset-xl-5{margin-left:41.66666667%}.offset-xl-6{margin-left:50%}.offset-xl-7{margin-left:58.33333333%}.offset-xl-8{margin-left:66.66666667%}.offset-xl-9{margin-left:75%}.offset-xl-10{margin-left:83.33333333%}.offset-xl-11{margin-left:91.66666667%}}.table{color:#111827;margin-bottom:1rem;width:100%}.table td,.table th{border-top:1px solid #e5e7eb;padding:.75rem;vertical-align:top}.table thead th{border-bottom:2px solid #e5e7eb;vertical-align:bottom}.table tbody+tbody{border-top:2px solid #e5e7eb}.table-sm td,.table-sm th{padding:.3rem}.table-bordered,.table-bordered td,.table-bordered th{border:1px solid #e5e7eb}.table-bordered thead td,.table-bordered thead th{border-bottom-width:2px}.table-borderless tbody+tbody,.table-borderless td,.table-borderless th,.table-borderless thead th{border:0}.table-striped tbody tr:nth-of-type(odd){background-color:rgba(0,0,0,.05)}.table-hover tbody tr:hover{background-color:#f3f4f6;color:#111827}.table-primary,.table-primary>td,.table-primary>th{background-color:#cacaf0}.table-primary tbody+tbody,.table-primary td,.table-primary th,.table-primary thead th{border-color:#9c9ce2}.table-hover .table-primary:hover,.table-hover .table-primary:hover>td,.table-hover .table-primary:hover>th{background-color:#b6b6ea}.table-secondary,.table-secondary>td,.table-secondary>th{background-color:#cdcfd3}.table-secondary tbody+tbody,.table-secondary td,.table-secondary th,.table-secondary thead th{border-color:#a1a7ae}.table-hover .table-secondary:hover,.table-hover .table-secondary:hover>td,.table-hover .table-secondary:hover>th{background-color:#bfc2c7}.table-success,.table-success>td,.table-success>th{background-color:#b9e2d5}.table-success tbody+tbody,.table-success td,.table-success th,.table-success thead th{border-color:#7dc8b1}.table-hover .table-success:hover,.table-hover .table-success:hover>td,.table-hover .table-success:hover>th{background-color:#a7dbca}.table-info,.table-info>td,.table-info>th{background-color:#c2d3f9}.table-info tbody+tbody,.table-info td,.table-info th,.table-info thead th{border-color:#8eaef5}.table-hover .table-info:hover,.table-hover .table-info:hover>td,.table-hover .table-info:hover>th{background-color:#abc2f7}.table-warning,.table-warning>td,.table-warning>th{background-color:#f4d9b9}.table-warning tbody+tbody,.table-warning td,.table-warning th,.table-warning thead th{border-color:#ebb87e}.table-hover .table-warning:hover,.table-hover .table-warning:hover>td,.table-hover .table-warning:hover>th{background-color:#f1cda3}.table-danger,.table-danger>td,.table-danger>th{background-color:#f5c2c2}.table-danger tbody+tbody,.table-danger td,.table-danger th,.table-danger thead th{border-color:#ed8e8e}.table-hover .table-danger:hover,.table-hover .table-danger:hover>td,.table-hover .table-danger:hover>th{background-color:#f1acac}.table-light,.table-light>td,.table-light>th{background-color:#fcfcfc}.table-light tbody+tbody,.table-light td,.table-light th,.table-light thead th{border-color:#f9f9fa}.table-hover .table-light:hover,.table-hover .table-light:hover>td,.table-hover .table-light:hover>th{background-color:#efefef}.table-dark,.table-dark>td,.table-dark>th{background-color:#c0c3c7}.table-dark tbody+tbody,.table-dark td,.table-dark th,.table-dark thead th{border-color:#8b9097}.table-hover .table-dark:hover,.table-hover .table-dark:hover>td,.table-hover .table-dark:hover>th{background-color:#b3b6bb}.table-active,.table-active>td,.table-active>th{background-color:#f3f4f6}.table-hover .table-active:hover,.table-hover .table-active:hover>td,.table-hover .table-active:hover>th{background-color:#e4e7eb}.table .thead-dark th{background-color:#1f2937;border-color:#2d3b4f;color:#fff}.table .thead-light th{background-color:#e5e7eb;border-color:#e5e7eb;color:#374151}.table-dark{background-color:#1f2937;color:#fff}.table-dark td,.table-dark th,.table-dark thead th{border-color:#2d3b4f}.table-dark.table-bordered{border:0}.table-dark.table-striped tbody tr:nth-of-type(odd){background-color:hsla(0,0%,100%,.05)}.table-dark.table-hover tbody tr:hover{background-color:hsla(0,0%,100%,.075);color:#fff}@media (max-width:1.98px){.table-responsive-sm{-webkit-overflow-scrolling:touch;display:block;overflow-x:auto;width:100%}.table-responsive-sm>.table-bordered{border:0}}@media (max-width:7.98px){.table-responsive-md{-webkit-overflow-scrolling:touch;display:block;overflow-x:auto;width:100%}.table-responsive-md>.table-bordered{border:0}}@media (max-width:8.98px){.table-responsive-lg{-webkit-overflow-scrolling:touch;display:block;overflow-x:auto;width:100%}.table-responsive-lg>.table-bordered{border:0}}@media (max-width:9.98px){.table-responsive-xl{-webkit-overflow-scrolling:touch;display:block;overflow-x:auto;width:100%}.table-responsive-xl>.table-bordered{border:0}}.table-responsive{-webkit-overflow-scrolling:touch;display:block;overflow-x:auto;width:100%}.table-responsive>.table-bordered{border:0}.form-control{background-clip:padding-box;background-color:#fff;border:1px solid #d1d5db;border-radius:.25rem;color:#1f2937;display:block;font-size:1rem;font-weight:400;height:calc(1.5em + .75rem + 2px);line-height:1.5;padding:.375rem .75rem;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out;width:100%}@media (prefers-reduced-motion:reduce){.form-control{transition:none}}.form-control::-ms-expand{background-color:transparent;border:0}.form-control:focus{background-color:#fff;border-color:#a3a3e5;box-shadow:0 0 0 .2rem rgba(64,64,200,.25);color:#1f2937;outline:0}.form-control::-moz-placeholder{color:#4b5563;opacity:1}.form-control::placeholder{color:#4b5563;opacity:1}.form-control:disabled,.form-control[readonly]{background-color:#e5e7eb;opacity:1}input[type=date].form-control,input[type=datetime-local].form-control,input[type=month].form-control,input[type=time].form-control{-webkit-appearance:none;-moz-appearance:none;appearance:none}select.form-control:-moz-focusring{color:transparent;text-shadow:0 0 0 #1f2937}select.form-control:focus::-ms-value{background-color:#fff;color:#1f2937}.form-control-file,.form-control-range{display:block;width:100%}.col-form-label{font-size:inherit;line-height:1.5;margin-bottom:0;padding-bottom:calc(.375rem + 1px);padding-top:calc(.375rem + 1px)}.col-form-label-lg{font-size:1.25rem;line-height:1.5;padding-bottom:calc(.5rem + 1px);padding-top:calc(.5rem + 1px)}.col-form-label-sm{font-size:.875rem;line-height:1.5;padding-bottom:calc(.25rem + 1px);padding-top:calc(.25rem + 1px)}.form-control-plaintext{background-color:transparent;border:solid transparent;border-width:1px 0;color:#111827;display:block;font-size:1rem;line-height:1.5;margin-bottom:0;padding:.375rem 0;width:100%}.form-control-plaintext.form-control-lg,.form-control-plaintext.form-control-sm{padding-left:0;padding-right:0}.form-control-sm{border-radius:.2rem;font-size:.875rem;height:calc(1.5em + .5rem + 2px);line-height:1.5;padding:.25rem .5rem}.form-control-lg{border-radius:6px;font-size:1.25rem;height:calc(1.5em + 1rem + 2px);line-height:1.5;padding:.5rem 1rem}select.form-control[multiple],select.form-control[size],textarea.form-control{height:auto}.form-group{margin-bottom:1rem}.form-text{display:block;margin-top:.25rem}.form-row{display:flex;flex-wrap:wrap;margin-left:-5px;margin-right:-5px}.form-row>.col,.form-row>[class*=col-]{padding-left:5px;padding-right:5px}.form-check{display:block;padding-left:1.25rem;position:relative}.form-check-input{margin-left:-1.25rem;margin-top:.3rem;position:absolute}.form-check-input:disabled~.form-check-label,.form-check-input[disabled]~.form-check-label{color:#6b7280}.form-check-label{margin-bottom:0}.form-check-inline{align-items:center;display:inline-flex;margin-right:.75rem;padding-left:0}.form-check-inline .form-check-input{margin-left:0;margin-right:.3125rem;margin-top:0;position:static}.valid-feedback{color:#059669;display:none;font-size:.875em;margin-top:.25rem;width:100%}.valid-tooltip{background-color:rgba(5,150,105,.9);border-radius:.25rem;color:#fff;display:none;font-size:.875rem;left:0;line-height:1.5;margin-top:.1rem;max-width:100%;padding:.25rem .5rem;position:absolute;top:100%;z-index:5}.form-row>.col>.valid-tooltip,.form-row>[class*=col-]>.valid-tooltip{left:5px}.is-valid~.valid-feedback,.is-valid~.valid-tooltip,.was-validated :valid~.valid-feedback,.was-validated :valid~.valid-tooltip{display:block}.form-control.is-valid,.was-validated .form-control:valid{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8'%3E%3Cpath fill='%23059669' d='M2.3 6.73.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3E%3C/svg%3E");background-position:right calc(.375em + .1875rem) center;background-repeat:no-repeat;background-size:calc(.75em + .375rem) calc(.75em + .375rem);border-color:#059669;padding-right:calc(1.5em + .75rem)!important}.form-control.is-valid:focus,.was-validated .form-control:valid:focus{border-color:#059669;box-shadow:0 0 0 .2rem rgba(5,150,105,.25)}.was-validated select.form-control:valid,select.form-control.is-valid{background-position:right 1.5rem center;padding-right:3rem!important}.was-validated textarea.form-control:valid,textarea.form-control.is-valid{background-position:top calc(.375em + .1875rem) right calc(.375em + .1875rem);padding-right:calc(1.5em + .75rem)}.custom-select.is-valid,.was-validated .custom-select:valid{background:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='4' height='5'%3E%3Cpath fill='%231f2937' d='M2 0 0 2h4zm0 5L0 3h4z'/%3E%3C/svg%3E") right .75rem center/8px 10px no-repeat,#fff url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8'%3E%3Cpath fill='%23059669' d='M2.3 6.73.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1z'/%3E%3C/svg%3E") center right 1.75rem/calc(.75em + .375rem) calc(.75em + .375rem) no-repeat;border-color:#059669;padding-right:calc(.75em + 2.3125rem)!important}.custom-select.is-valid:focus,.was-validated .custom-select:valid:focus{border-color:#059669;box-shadow:0 0 0 .2rem rgba(5,150,105,.25)}.form-check-input.is-valid~.form-check-label,.was-validated .form-check-input:valid~.form-check-label{color:#059669}.form-check-input.is-valid~.valid-feedback,.form-check-input.is-valid~.valid-tooltip,.was-validated .form-check-input:valid~.valid-feedback,.was-validated .form-check-input:valid~.valid-tooltip{display:block}.custom-control-input.is-valid~.custom-control-label,.was-validated .custom-control-input:valid~.custom-control-label{color:#059669}.custom-control-input.is-valid~.custom-control-label:before,.was-validated .custom-control-input:valid~.custom-control-label:before{border-color:#059669}.custom-control-input.is-valid:checked~.custom-control-label:before,.was-validated .custom-control-input:valid:checked~.custom-control-label:before{background-color:#07c78c;border-color:#07c78c}.custom-control-input.is-valid:focus~.custom-control-label:before,.was-validated .custom-control-input:valid:focus~.custom-control-label:before{box-shadow:0 0 0 .2rem rgba(5,150,105,.25)}.custom-control-input.is-valid:focus:not(:checked)~.custom-control-label:before,.was-validated .custom-control-input:valid:focus:not(:checked)~.custom-control-label:before{border-color:#059669}.custom-file-input.is-valid~.custom-file-label,.was-validated .custom-file-input:valid~.custom-file-label{border-color:#059669}.custom-file-input.is-valid:focus~.custom-file-label,.was-validated .custom-file-input:valid:focus~.custom-file-label{border-color:#059669;box-shadow:0 0 0 .2rem rgba(5,150,105,.25)}.invalid-feedback{color:#dc2626;display:none;font-size:.875em;margin-top:.25rem;width:100%}.invalid-tooltip{background-color:rgba(220,38,38,.9);border-radius:.25rem;color:#fff;display:none;font-size:.875rem;left:0;line-height:1.5;margin-top:.1rem;max-width:100%;padding:.25rem .5rem;position:absolute;top:100%;z-index:5}.form-row>.col>.invalid-tooltip,.form-row>[class*=col-]>.invalid-tooltip{left:5px}.is-invalid~.invalid-feedback,.is-invalid~.invalid-tooltip,.was-validated :invalid~.invalid-feedback,.was-validated :invalid~.invalid-tooltip{display:block}.form-control.is-invalid,.was-validated .form-control:invalid{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' fill='none' stroke='%23dc2626'%3E%3Ccircle cx='6' cy='6' r='4.5'/%3E%3Cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3E%3Ccircle cx='6' cy='8.2' r='.6' fill='%23dc2626' stroke='none'/%3E%3C/svg%3E");background-position:right calc(.375em + .1875rem) center;background-repeat:no-repeat;background-size:calc(.75em + .375rem) calc(.75em + .375rem);border-color:#dc2626;padding-right:calc(1.5em + .75rem)!important}.form-control.is-invalid:focus,.was-validated .form-control:invalid:focus{border-color:#dc2626;box-shadow:0 0 0 .2rem rgba(220,38,38,.25)}.was-validated select.form-control:invalid,select.form-control.is-invalid{background-position:right 1.5rem center;padding-right:3rem!important}.was-validated textarea.form-control:invalid,textarea.form-control.is-invalid{background-position:top calc(.375em + .1875rem) right calc(.375em + .1875rem);padding-right:calc(1.5em + .75rem)}.custom-select.is-invalid,.was-validated .custom-select:invalid{background:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='4' height='5'%3E%3Cpath fill='%231f2937' d='M2 0 0 2h4zm0 5L0 3h4z'/%3E%3C/svg%3E") right .75rem center/8px 10px no-repeat,#fff url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' fill='none' stroke='%23dc2626'%3E%3Ccircle cx='6' cy='6' r='4.5'/%3E%3Cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3E%3Ccircle cx='6' cy='8.2' r='.6' fill='%23dc2626' stroke='none'/%3E%3C/svg%3E") center right 1.75rem/calc(.75em + .375rem) calc(.75em + .375rem) no-repeat;border-color:#dc2626;padding-right:calc(.75em + 2.3125rem)!important}.custom-select.is-invalid:focus,.was-validated .custom-select:invalid:focus{border-color:#dc2626;box-shadow:0 0 0 .2rem rgba(220,38,38,.25)}.form-check-input.is-invalid~.form-check-label,.was-validated .form-check-input:invalid~.form-check-label{color:#dc2626}.form-check-input.is-invalid~.invalid-feedback,.form-check-input.is-invalid~.invalid-tooltip,.was-validated .form-check-input:invalid~.invalid-feedback,.was-validated .form-check-input:invalid~.invalid-tooltip{display:block}.custom-control-input.is-invalid~.custom-control-label,.was-validated .custom-control-input:invalid~.custom-control-label{color:#dc2626}.custom-control-input.is-invalid~.custom-control-label:before,.was-validated .custom-control-input:invalid~.custom-control-label:before{border-color:#dc2626}.custom-control-input.is-invalid:checked~.custom-control-label:before,.was-validated .custom-control-input:invalid:checked~.custom-control-label:before{background-color:#e35252;border-color:#e35252}.custom-control-input.is-invalid:focus~.custom-control-label:before,.was-validated .custom-control-input:invalid:focus~.custom-control-label:before{box-shadow:0 0 0 .2rem rgba(220,38,38,.25)}.custom-control-input.is-invalid:focus:not(:checked)~.custom-control-label:before,.was-validated .custom-control-input:invalid:focus:not(:checked)~.custom-control-label:before{border-color:#dc2626}.custom-file-input.is-invalid~.custom-file-label,.was-validated .custom-file-input:invalid~.custom-file-label{border-color:#dc2626}.custom-file-input.is-invalid:focus~.custom-file-label,.was-validated .custom-file-input:invalid:focus~.custom-file-label{border-color:#dc2626;box-shadow:0 0 0 .2rem rgba(220,38,38,.25)}.form-inline{align-items:center;display:flex;flex-flow:row wrap}.form-inline .form-check{width:100%}@media (min-width:2px){.form-inline label{justify-content:center}.form-inline .form-group,.form-inline label{align-items:center;display:flex;margin-bottom:0}.form-inline .form-group{flex:0 0 auto;flex-flow:row wrap}.form-inline .form-control{display:inline-block;vertical-align:middle;width:auto}.form-inline .form-control-plaintext{display:inline-block}.form-inline .custom-select,.form-inline .input-group{width:auto}.form-inline .form-check{align-items:center;display:flex;justify-content:center;padding-left:0;width:auto}.form-inline .form-check-input{flex-shrink:0;margin-left:0;margin-right:.25rem;margin-top:0;position:relative}.form-inline .custom-control{align-items:center;justify-content:center}.form-inline .custom-control-label{margin-bottom:0}}.btn{background-color:transparent;border:1px solid transparent;border-radius:.25rem;color:#111827;display:inline-block;font-size:1rem;font-weight:400;line-height:1.5;padding:.375rem .75rem;text-align:center;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;-webkit-user-select:none;-moz-user-select:none;user-select:none;vertical-align:middle}@media (prefers-reduced-motion:reduce){.btn{transition:none}}.btn:hover{color:#111827;text-decoration:none}.btn.focus,.btn:focus{box-shadow:0 0 0 .2rem rgba(64,64,200,.25);outline:0}.btn.disabled,.btn:disabled{opacity:.65}.btn:not(:disabled):not(.disabled){cursor:pointer}a.btn.disabled,fieldset:disabled a.btn{pointer-events:none}.btn-primary{background-color:#4040c8;border-color:#4040c8;color:#fff}.btn-primary.focus,.btn-primary:focus,.btn-primary:hover{background-color:#3232af;border-color:#3030a5;color:#fff}.btn-primary.focus,.btn-primary:focus{box-shadow:0 0 0 0 rgba(93,93,208,.5)}.btn-primary.disabled,.btn-primary:disabled{background-color:#4040c8;border-color:#4040c8;color:#fff}.btn-primary:not(:disabled):not(.disabled).active,.btn-primary:not(:disabled):not(.disabled):active,.show>.btn-primary.dropdown-toggle{background-color:#3030a5;border-color:#2d2d9b;color:#fff}.btn-primary:not(:disabled):not(.disabled).active:focus,.btn-primary:not(:disabled):not(.disabled):active:focus,.show>.btn-primary.dropdown-toggle:focus{box-shadow:0 0 0 0 rgba(93,93,208,.5)}.btn-secondary{background-color:#4b5563;border-color:#4b5563;color:#fff}.btn-secondary.focus,.btn-secondary:focus,.btn-secondary:hover{background-color:#3b424d;border-color:#353c46;color:#fff}.btn-secondary.focus,.btn-secondary:focus{box-shadow:0 0 0 0 hsla(213,9%,44%,.5)}.btn-secondary.disabled,.btn-secondary:disabled{background-color:#4b5563;border-color:#4b5563;color:#fff}.btn-secondary:not(:disabled):not(.disabled).active,.btn-secondary:not(:disabled):not(.disabled):active,.show>.btn-secondary.dropdown-toggle{background-color:#353c46;border-color:#30363f;color:#fff}.btn-secondary:not(:disabled):not(.disabled).active:focus,.btn-secondary:not(:disabled):not(.disabled):active:focus,.show>.btn-secondary.dropdown-toggle:focus{box-shadow:0 0 0 0 hsla(213,9%,44%,.5)}.btn-success{background-color:#059669;border-color:#059669;color:#fff}.btn-success.focus,.btn-success:focus,.btn-success:hover{background-color:#04714f;border-color:#036546;color:#fff}.btn-success.focus,.btn-success:focus{box-shadow:0 0 0 0 rgba(43,166,128,.5)}.btn-success.disabled,.btn-success:disabled{background-color:#059669;border-color:#059669;color:#fff}.btn-success:not(:disabled):not(.disabled).active,.btn-success:not(:disabled):not(.disabled):active,.show>.btn-success.dropdown-toggle{background-color:#036546;border-color:#03583e;color:#fff}.btn-success:not(:disabled):not(.disabled).active:focus,.btn-success:not(:disabled):not(.disabled):active:focus,.show>.btn-success.dropdown-toggle:focus{box-shadow:0 0 0 0 rgba(43,166,128,.5)}.btn-info{background-color:#2563eb;border-color:#2563eb;color:#fff}.btn-info.focus,.btn-info:focus,.btn-info:hover{background-color:#1451d6;border-color:#134cca;color:#fff}.btn-info.focus,.btn-info:focus{box-shadow:0 0 0 0 rgba(70,122,238,.5)}.btn-info.disabled,.btn-info:disabled{background-color:#2563eb;border-color:#2563eb;color:#fff}.btn-info:not(:disabled):not(.disabled).active,.btn-info:not(:disabled):not(.disabled):active,.show>.btn-info.dropdown-toggle{background-color:#134cca;border-color:#1248bf;color:#fff}.btn-info:not(:disabled):not(.disabled).active:focus,.btn-info:not(:disabled):not(.disabled):active:focus,.show>.btn-info.dropdown-toggle:focus{box-shadow:0 0 0 0 rgba(70,122,238,.5)}.btn-warning{background-color:#d97706;border-color:#d97706;color:#fff}.btn-warning.focus,.btn-warning:focus,.btn-warning:hover{background-color:#b46305;border-color:#a75c05;color:#fff}.btn-warning.focus,.btn-warning:focus{box-shadow:0 0 0 0 rgba(223,139,43,.5)}.btn-warning.disabled,.btn-warning:disabled{background-color:#d97706;border-color:#d97706;color:#fff}.btn-warning:not(:disabled):not(.disabled).active,.btn-warning:not(:disabled):not(.disabled):active,.show>.btn-warning.dropdown-toggle{background-color:#a75c05;border-color:#9b5504;color:#fff}.btn-warning:not(:disabled):not(.disabled).active:focus,.btn-warning:not(:disabled):not(.disabled):active:focus,.show>.btn-warning.dropdown-toggle:focus{box-shadow:0 0 0 0 rgba(223,139,43,.5)}.btn-danger{background-color:#dc2626;border-color:#dc2626;color:#fff}.btn-danger.focus,.btn-danger:focus,.btn-danger:hover{background-color:#bd1f1f;border-color:#b21d1d;color:#fff}.btn-danger.focus,.btn-danger:focus{box-shadow:0 0 0 0 rgba(225,71,71,.5)}.btn-danger.disabled,.btn-danger:disabled{background-color:#dc2626;border-color:#dc2626;color:#fff}.btn-danger:not(:disabled):not(.disabled).active,.btn-danger:not(:disabled):not(.disabled):active,.show>.btn-danger.dropdown-toggle{background-color:#b21d1d;border-color:#a71b1b;color:#fff}.btn-danger:not(:disabled):not(.disabled).active:focus,.btn-danger:not(:disabled):not(.disabled):active:focus,.show>.btn-danger.dropdown-toggle:focus{box-shadow:0 0 0 0 rgba(225,71,71,.5)}.btn-light{background-color:#f3f4f6;border-color:#f3f4f6;color:#111827}.btn-light.focus,.btn-light:focus,.btn-light:hover{background-color:#dde0e6;border-color:#d6d9e0;color:#111827}.btn-light.focus,.btn-light:focus{box-shadow:0 0 0 0 hsla(220,7%,83%,.5)}.btn-light.disabled,.btn-light:disabled{background-color:#f3f4f6;border-color:#f3f4f6;color:#111827}.btn-light:not(:disabled):not(.disabled).active,.btn-light:not(:disabled):not(.disabled):active,.show>.btn-light.dropdown-toggle{background-color:#d6d9e0;border-color:#cfd3db;color:#111827}.btn-light:not(:disabled):not(.disabled).active:focus,.btn-light:not(:disabled):not(.disabled):active:focus,.show>.btn-light.dropdown-toggle:focus{box-shadow:0 0 0 0 hsla(220,7%,83%,.5)}.btn-dark{background-color:#1f2937;border-color:#1f2937;color:#fff}.btn-dark.focus,.btn-dark:focus,.btn-dark:hover{background-color:#11171f;border-color:#0d1116;color:#fff}.btn-dark.focus,.btn-dark:focus{box-shadow:0 0 0 0 rgba(65,73,85,.5)}.btn-dark.disabled,.btn-dark:disabled{background-color:#1f2937;border-color:#1f2937;color:#fff}.btn-dark:not(:disabled):not(.disabled).active,.btn-dark:not(:disabled):not(.disabled):active,.show>.btn-dark.dropdown-toggle{background-color:#0d1116;border-color:#080b0e;color:#fff}.btn-dark:not(:disabled):not(.disabled).active:focus,.btn-dark:not(:disabled):not(.disabled):active:focus,.show>.btn-dark.dropdown-toggle:focus{box-shadow:0 0 0 0 rgba(65,73,85,.5)}.btn-outline-primary{border-color:#4040c8;color:#4040c8}.btn-outline-primary:hover{background-color:#4040c8;border-color:#4040c8;color:#fff}.btn-outline-primary.focus,.btn-outline-primary:focus{box-shadow:0 0 0 0 rgba(64,64,200,.5)}.btn-outline-primary.disabled,.btn-outline-primary:disabled{background-color:transparent;color:#4040c8}.btn-outline-primary:not(:disabled):not(.disabled).active,.btn-outline-primary:not(:disabled):not(.disabled):active,.show>.btn-outline-primary.dropdown-toggle{background-color:#4040c8;border-color:#4040c8;color:#fff}.btn-outline-primary:not(:disabled):not(.disabled).active:focus,.btn-outline-primary:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-primary.dropdown-toggle:focus{box-shadow:0 0 0 0 rgba(64,64,200,.5)}.btn-outline-secondary{border-color:#4b5563;color:#4b5563}.btn-outline-secondary:hover{background-color:#4b5563;border-color:#4b5563;color:#fff}.btn-outline-secondary.focus,.btn-outline-secondary:focus{box-shadow:0 0 0 0 rgba(75,85,99,.5)}.btn-outline-secondary.disabled,.btn-outline-secondary:disabled{background-color:transparent;color:#4b5563}.btn-outline-secondary:not(:disabled):not(.disabled).active,.btn-outline-secondary:not(:disabled):not(.disabled):active,.show>.btn-outline-secondary.dropdown-toggle{background-color:#4b5563;border-color:#4b5563;color:#fff}.btn-outline-secondary:not(:disabled):not(.disabled).active:focus,.btn-outline-secondary:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-secondary.dropdown-toggle:focus{box-shadow:0 0 0 0 rgba(75,85,99,.5)}.btn-outline-success{border-color:#059669;color:#059669}.btn-outline-success:hover{background-color:#059669;border-color:#059669;color:#fff}.btn-outline-success.focus,.btn-outline-success:focus{box-shadow:0 0 0 0 rgba(5,150,105,.5)}.btn-outline-success.disabled,.btn-outline-success:disabled{background-color:transparent;color:#059669}.btn-outline-success:not(:disabled):not(.disabled).active,.btn-outline-success:not(:disabled):not(.disabled):active,.show>.btn-outline-success.dropdown-toggle{background-color:#059669;border-color:#059669;color:#fff}.btn-outline-success:not(:disabled):not(.disabled).active:focus,.btn-outline-success:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-success.dropdown-toggle:focus{box-shadow:0 0 0 0 rgba(5,150,105,.5)}.btn-outline-info{border-color:#2563eb;color:#2563eb}.btn-outline-info:hover{background-color:#2563eb;border-color:#2563eb;color:#fff}.btn-outline-info.focus,.btn-outline-info:focus{box-shadow:0 0 0 0 rgba(37,99,235,.5)}.btn-outline-info.disabled,.btn-outline-info:disabled{background-color:transparent;color:#2563eb}.btn-outline-info:not(:disabled):not(.disabled).active,.btn-outline-info:not(:disabled):not(.disabled):active,.show>.btn-outline-info.dropdown-toggle{background-color:#2563eb;border-color:#2563eb;color:#fff}.btn-outline-info:not(:disabled):not(.disabled).active:focus,.btn-outline-info:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-info.dropdown-toggle:focus{box-shadow:0 0 0 0 rgba(37,99,235,.5)}.btn-outline-warning{border-color:#d97706;color:#d97706}.btn-outline-warning:hover{background-color:#d97706;border-color:#d97706;color:#fff}.btn-outline-warning.focus,.btn-outline-warning:focus{box-shadow:0 0 0 0 rgba(217,119,6,.5)}.btn-outline-warning.disabled,.btn-outline-warning:disabled{background-color:transparent;color:#d97706}.btn-outline-warning:not(:disabled):not(.disabled).active,.btn-outline-warning:not(:disabled):not(.disabled):active,.show>.btn-outline-warning.dropdown-toggle{background-color:#d97706;border-color:#d97706;color:#fff}.btn-outline-warning:not(:disabled):not(.disabled).active:focus,.btn-outline-warning:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-warning.dropdown-toggle:focus{box-shadow:0 0 0 0 rgba(217,119,6,.5)}.btn-outline-danger{border-color:#dc2626;color:#dc2626}.btn-outline-danger:hover{background-color:#dc2626;border-color:#dc2626;color:#fff}.btn-outline-danger.focus,.btn-outline-danger:focus{box-shadow:0 0 0 0 rgba(220,38,38,.5)}.btn-outline-danger.disabled,.btn-outline-danger:disabled{background-color:transparent;color:#dc2626}.btn-outline-danger:not(:disabled):not(.disabled).active,.btn-outline-danger:not(:disabled):not(.disabled):active,.show>.btn-outline-danger.dropdown-toggle{background-color:#dc2626;border-color:#dc2626;color:#fff}.btn-outline-danger:not(:disabled):not(.disabled).active:focus,.btn-outline-danger:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-danger.dropdown-toggle:focus{box-shadow:0 0 0 0 rgba(220,38,38,.5)}.btn-outline-light{border-color:#f3f4f6;color:#f3f4f6}.btn-outline-light:hover{background-color:#f3f4f6;border-color:#f3f4f6;color:#111827}.btn-outline-light.focus,.btn-outline-light:focus{box-shadow:0 0 0 0 rgba(243,244,246,.5)}.btn-outline-light.disabled,.btn-outline-light:disabled{background-color:transparent;color:#f3f4f6}.btn-outline-light:not(:disabled):not(.disabled).active,.btn-outline-light:not(:disabled):not(.disabled):active,.show>.btn-outline-light.dropdown-toggle{background-color:#f3f4f6;border-color:#f3f4f6;color:#111827}.btn-outline-light:not(:disabled):not(.disabled).active:focus,.btn-outline-light:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-light.dropdown-toggle:focus{box-shadow:0 0 0 0 rgba(243,244,246,.5)}.btn-outline-dark{border-color:#1f2937;color:#1f2937}.btn-outline-dark:hover{background-color:#1f2937;border-color:#1f2937;color:#fff}.btn-outline-dark.focus,.btn-outline-dark:focus{box-shadow:0 0 0 0 rgba(31,41,55,.5)}.btn-outline-dark.disabled,.btn-outline-dark:disabled{background-color:transparent;color:#1f2937}.btn-outline-dark:not(:disabled):not(.disabled).active,.btn-outline-dark:not(:disabled):not(.disabled):active,.show>.btn-outline-dark.dropdown-toggle{background-color:#1f2937;border-color:#1f2937;color:#fff}.btn-outline-dark:not(:disabled):not(.disabled).active:focus,.btn-outline-dark:not(:disabled):not(.disabled):active:focus,.show>.btn-outline-dark.dropdown-toggle:focus{box-shadow:0 0 0 0 rgba(31,41,55,.5)}.btn-link{color:#6366f1;font-weight:400;text-decoration:none}.btn-link:hover{color:#4f46e5}.btn-link.focus,.btn-link:focus,.btn-link:hover{text-decoration:underline}.btn-link.disabled,.btn-link:disabled{color:#4b5563;pointer-events:none}.btn-group-lg>.btn,.btn-lg{border-radius:6px;font-size:1.25rem;line-height:1.5;padding:.5rem 1rem}.btn-group-sm>.btn,.btn-sm{border-radius:.2rem;font-size:.875rem;line-height:1.5;padding:.25rem .5rem}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:.5rem}input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%}.fade{transition:opacity .15s linear}@media (prefers-reduced-motion:reduce){.fade{transition:none}}.fade:not(.show){opacity:0}.collapse:not(.show){display:none}.collapsing{height:0;overflow:hidden;position:relative;transition:height .35s ease}@media (prefers-reduced-motion:reduce){.collapsing{transition:none}}.collapsing.width{height:auto;transition:width .35s ease;width:0}@media (prefers-reduced-motion:reduce){.collapsing.width{transition:none}}.dropdown,.dropleft,.dropright,.dropup{position:relative}.dropdown-toggle{white-space:nowrap}.dropdown-toggle:after{border-bottom:0;border-left:.3em solid transparent;border-right:.3em solid transparent;border-top:.3em solid;content:"";display:inline-block;margin-left:.255em;vertical-align:.255em}.dropdown-toggle:empty:after{margin-left:0}.dropdown-menu{background-clip:padding-box;background-color:#fff;border:1px solid rgba(0,0,0,.15);border-radius:.25rem;color:#111827;display:none;float:left;font-size:1rem;left:0;list-style:none;margin:.125rem 0 0;min-width:10rem;padding:.5rem 0;position:absolute;text-align:left;top:100%;z-index:1000}.dropdown-menu-left{left:0;right:auto}.dropdown-menu-right{left:auto;right:0}@media (min-width:2px){.dropdown-menu-sm-left{left:0;right:auto}.dropdown-menu-sm-right{left:auto;right:0}}@media (min-width:8px){.dropdown-menu-md-left{left:0;right:auto}.dropdown-menu-md-right{left:auto;right:0}}@media (min-width:9px){.dropdown-menu-lg-left{left:0;right:auto}.dropdown-menu-lg-right{left:auto;right:0}}@media (min-width:10px){.dropdown-menu-xl-left{left:0;right:auto}.dropdown-menu-xl-right{left:auto;right:0}}.dropup .dropdown-menu{bottom:100%;margin-bottom:.125rem;margin-top:0;top:auto}.dropup .dropdown-toggle:after{border-bottom:.3em solid;border-left:.3em solid transparent;border-right:.3em solid transparent;border-top:0;content:"";display:inline-block;margin-left:.255em;vertical-align:.255em}.dropup .dropdown-toggle:empty:after{margin-left:0}.dropright .dropdown-menu{left:100%;margin-left:.125rem;margin-top:0;right:auto;top:0}.dropright .dropdown-toggle:after{border-bottom:.3em solid transparent;border-left:.3em solid;border-right:0;border-top:.3em solid transparent;content:"";display:inline-block;margin-left:.255em;vertical-align:.255em}.dropright .dropdown-toggle:empty:after{margin-left:0}.dropright .dropdown-toggle:after{vertical-align:0}.dropleft .dropdown-menu{left:auto;margin-right:.125rem;margin-top:0;right:100%;top:0}.dropleft .dropdown-toggle:after{content:"";display:inline-block;display:none;margin-left:.255em;vertical-align:.255em}.dropleft .dropdown-toggle:before{border-bottom:.3em solid transparent;border-right:.3em solid;border-top:.3em solid transparent;content:"";display:inline-block;margin-right:.255em;vertical-align:.255em}.dropleft .dropdown-toggle:empty:after{margin-left:0}.dropleft .dropdown-toggle:before{vertical-align:0}.dropdown-menu[x-placement^=bottom],.dropdown-menu[x-placement^=left],.dropdown-menu[x-placement^=right],.dropdown-menu[x-placement^=top]{bottom:auto;right:auto}.dropdown-divider{border-top:1px solid #e5e7eb;height:0;margin:.5rem 0;overflow:hidden}.dropdown-item{background-color:transparent;border:0;clear:both;color:#374151;display:block;font-weight:400;padding:.25rem 1.5rem;text-align:inherit;white-space:nowrap;width:100%}.dropdown-item:focus,.dropdown-item:hover{background-color:#e5e7eb;color:#090d15;text-decoration:none}.dropdown-item.active,.dropdown-item:active{background-color:#4040c8;color:#fff;text-decoration:none}.dropdown-item.disabled,.dropdown-item:disabled{background-color:transparent;color:#6b7280;pointer-events:none}.dropdown-menu.show{display:block}.dropdown-header{color:#4b5563;display:block;font-size:.875rem;margin-bottom:0;padding:.5rem 1.5rem;white-space:nowrap}.dropdown-item-text{color:#374151;display:block;padding:.25rem 1.5rem}.btn-group,.btn-group-vertical{display:inline-flex;position:relative;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{flex:1 1 auto;position:relative}.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:hover,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus,.btn-group>.btn:hover{z-index:1}.btn-toolbar{display:flex;flex-wrap:wrap;justify-content:flex-start}.btn-toolbar .input-group{width:auto}.btn-group>.btn-group:not(:first-child),.btn-group>.btn:not(:first-child){margin-left:-1px}.btn-group>.btn-group:not(:last-child)>.btn,.btn-group>.btn:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-top-right-radius:0}.btn-group>.btn-group:not(:first-child)>.btn,.btn-group>.btn:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.dropdown-toggle-split{padding-left:.5625rem;padding-right:.5625rem}.dropdown-toggle-split:after,.dropright .dropdown-toggle-split:after,.dropup .dropdown-toggle-split:after{margin-left:0}.dropleft .dropdown-toggle-split:before{margin-right:0}.btn-group-sm>.btn+.dropdown-toggle-split,.btn-sm+.dropdown-toggle-split{padding-left:.375rem;padding-right:.375rem}.btn-group-lg>.btn+.dropdown-toggle-split,.btn-lg+.dropdown-toggle-split{padding-left:.75rem;padding-right:.75rem}.btn-group-vertical{align-items:flex-start;flex-direction:column;justify-content:center}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group{width:100%}.btn-group-vertical>.btn-group:not(:first-child),.btn-group-vertical>.btn:not(:first-child){margin-top:-1px}.btn-group-vertical>.btn-group:not(:last-child)>.btn,.btn-group-vertical>.btn:not(:last-child):not(.dropdown-toggle){border-bottom-left-radius:0;border-bottom-right-radius:0}.btn-group-vertical>.btn-group:not(:first-child)>.btn,.btn-group-vertical>.btn:not(:first-child){border-top-left-radius:0;border-top-right-radius:0}.btn-group-toggle>.btn,.btn-group-toggle>.btn-group>.btn{margin-bottom:0}.btn-group-toggle>.btn input[type=checkbox],.btn-group-toggle>.btn input[type=radio],.btn-group-toggle>.btn-group>.btn input[type=checkbox],.btn-group-toggle>.btn-group>.btn input[type=radio]{clip:rect(0,0,0,0);pointer-events:none;position:absolute}.input-group{align-items:stretch;display:flex;flex-wrap:wrap;position:relative;width:100%}.input-group>.custom-file,.input-group>.custom-select,.input-group>.form-control,.input-group>.form-control-plaintext{flex:1 1 auto;margin-bottom:0;min-width:0;position:relative;width:1%}.input-group>.custom-file+.custom-file,.input-group>.custom-file+.custom-select,.input-group>.custom-file+.form-control,.input-group>.custom-select+.custom-file,.input-group>.custom-select+.custom-select,.input-group>.custom-select+.form-control,.input-group>.form-control+.custom-file,.input-group>.form-control+.custom-select,.input-group>.form-control+.form-control,.input-group>.form-control-plaintext+.custom-file,.input-group>.form-control-plaintext+.custom-select,.input-group>.form-control-plaintext+.form-control{margin-left:-1px}.input-group>.custom-file .custom-file-input:focus~.custom-file-label,.input-group>.custom-select:focus,.input-group>.form-control:focus{z-index:3}.input-group>.custom-file .custom-file-input:focus{z-index:4}.input-group>.custom-select:not(:first-child),.input-group>.form-control:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.input-group>.custom-file{align-items:center;display:flex}.input-group>.custom-file:not(:last-child) .custom-file-label,.input-group>.custom-file:not(:last-child) .custom-file-label:after{border-bottom-right-radius:0;border-top-right-radius:0}.input-group>.custom-file:not(:first-child) .custom-file-label{border-bottom-left-radius:0;border-top-left-radius:0}.input-group.has-validation>.custom-file:nth-last-child(n+3) .custom-file-label,.input-group.has-validation>.custom-file:nth-last-child(n+3) .custom-file-label:after,.input-group.has-validation>.custom-select:nth-last-child(n+3),.input-group.has-validation>.form-control:nth-last-child(n+3),.input-group:not(.has-validation)>.custom-file:not(:last-child) .custom-file-label,.input-group:not(.has-validation)>.custom-file:not(:last-child) .custom-file-label:after,.input-group:not(.has-validation)>.custom-select:not(:last-child),.input-group:not(.has-validation)>.form-control:not(:last-child){border-bottom-right-radius:0;border-top-right-radius:0}.input-group-append,.input-group-prepend{display:flex}.input-group-append .btn,.input-group-prepend .btn{position:relative;z-index:2}.input-group-append .btn:focus,.input-group-prepend .btn:focus{z-index:3}.input-group-append .btn+.btn,.input-group-append .btn+.input-group-text,.input-group-append .input-group-text+.btn,.input-group-append .input-group-text+.input-group-text,.input-group-prepend .btn+.btn,.input-group-prepend .btn+.input-group-text,.input-group-prepend .input-group-text+.btn,.input-group-prepend .input-group-text+.input-group-text{margin-left:-1px}.input-group-prepend{margin-right:-1px}.input-group-append{margin-left:-1px}.input-group-text{align-items:center;background-color:#e5e7eb;border:1px solid #d1d5db;border-radius:.25rem;color:#1f2937;display:flex;font-size:1rem;font-weight:400;line-height:1.5;margin-bottom:0;padding:.375rem .75rem;text-align:center;white-space:nowrap}.input-group-text input[type=checkbox],.input-group-text input[type=radio]{margin-top:0}.input-group-lg>.custom-select,.input-group-lg>.form-control:not(textarea){height:calc(1.5em + 1rem + 2px)}.input-group-lg>.custom-select,.input-group-lg>.form-control,.input-group-lg>.input-group-append>.btn,.input-group-lg>.input-group-append>.input-group-text,.input-group-lg>.input-group-prepend>.btn,.input-group-lg>.input-group-prepend>.input-group-text{border-radius:6px;font-size:1.25rem;line-height:1.5;padding:.5rem 1rem}.input-group-sm>.custom-select,.input-group-sm>.form-control:not(textarea){height:calc(1.5em + .5rem + 2px)}.input-group-sm>.custom-select,.input-group-sm>.form-control,.input-group-sm>.input-group-append>.btn,.input-group-sm>.input-group-append>.input-group-text,.input-group-sm>.input-group-prepend>.btn,.input-group-sm>.input-group-prepend>.input-group-text{border-radius:.2rem;font-size:.875rem;line-height:1.5;padding:.25rem .5rem}.input-group-lg>.custom-select,.input-group-sm>.custom-select{padding-right:1.75rem}.input-group.has-validation>.input-group-append:nth-last-child(n+3)>.btn,.input-group.has-validation>.input-group-append:nth-last-child(n+3)>.input-group-text,.input-group:not(.has-validation)>.input-group-append:not(:last-child)>.btn,.input-group:not(.has-validation)>.input-group-append:not(:last-child)>.input-group-text,.input-group>.input-group-append:last-child>.btn:not(:last-child):not(.dropdown-toggle),.input-group>.input-group-append:last-child>.input-group-text:not(:last-child),.input-group>.input-group-prepend>.btn,.input-group>.input-group-prepend>.input-group-text{border-bottom-right-radius:0;border-top-right-radius:0}.input-group>.input-group-append>.btn,.input-group>.input-group-append>.input-group-text,.input-group>.input-group-prepend:first-child>.btn:not(:first-child),.input-group>.input-group-prepend:first-child>.input-group-text:not(:first-child),.input-group>.input-group-prepend:not(:first-child)>.btn,.input-group>.input-group-prepend:not(:first-child)>.input-group-text{border-bottom-left-radius:0;border-top-left-radius:0}.custom-control{display:block;min-height:1.5rem;padding-left:1.5rem;position:relative;-webkit-print-color-adjust:exact;print-color-adjust:exact;z-index:1}.custom-control-inline{display:inline-flex;margin-right:1rem}.custom-control-input{height:1.25rem;left:0;opacity:0;position:absolute;width:1rem;z-index:-1}.custom-control-input:checked~.custom-control-label:before{background-color:#4040c8;border-color:#4040c8;color:#fff}.custom-control-input:focus~.custom-control-label:before{box-shadow:0 0 0 .2rem rgba(64,64,200,.25)}.custom-control-input:focus:not(:checked)~.custom-control-label:before{border-color:#a3a3e5}.custom-control-input:not(:disabled):active~.custom-control-label:before{background-color:#cbcbf0;border-color:#cbcbf0;color:#fff}.custom-control-input:disabled~.custom-control-label,.custom-control-input[disabled]~.custom-control-label{color:#4b5563}.custom-control-input:disabled~.custom-control-label:before,.custom-control-input[disabled]~.custom-control-label:before{background-color:#e5e7eb}.custom-control-label{margin-bottom:0;position:relative;vertical-align:top}.custom-control-label:before{background-color:#fff;border:1px solid #6b7280;pointer-events:none}.custom-control-label:after,.custom-control-label:before{content:"";display:block;height:1rem;left:-1.5rem;position:absolute;top:.25rem;width:1rem}.custom-control-label:after{background:50%/50% 50% no-repeat}.custom-checkbox .custom-control-label:before{border-radius:.25rem}.custom-checkbox .custom-control-input:checked~.custom-control-label:after{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='8' height='8'%3E%3Cpath fill='%23fff' d='m6.564.75-3.59 3.612-1.538-1.55L0 4.26l2.974 2.99L8 2.193z'/%3E%3C/svg%3E")}.custom-checkbox .custom-control-input:indeterminate~.custom-control-label:before{background-color:#4040c8;border-color:#4040c8}.custom-checkbox .custom-control-input:indeterminate~.custom-control-label:after{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='4' height='4'%3E%3Cpath stroke='%23fff' d='M0 2h4'/%3E%3C/svg%3E")}.custom-checkbox .custom-control-input:disabled:checked~.custom-control-label:before{background-color:rgba(64,64,200,.5)}.custom-checkbox .custom-control-input:disabled:indeterminate~.custom-control-label:before{background-color:rgba(64,64,200,.5)}.custom-radio .custom-control-label:before{border-radius:50%}.custom-radio .custom-control-input:checked~.custom-control-label:after{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='-4 -4 8 8'%3E%3Ccircle r='3' fill='%23fff'/%3E%3C/svg%3E")}.custom-radio .custom-control-input:disabled:checked~.custom-control-label:before{background-color:rgba(64,64,200,.5)}.custom-switch{padding-left:2.25rem}.custom-switch .custom-control-label:before{border-radius:.5rem;left:-2.25rem;pointer-events:all;width:1.75rem}.custom-switch .custom-control-label:after{background-color:#6b7280;border-radius:.5rem;height:calc(1rem - 4px);left:calc(-2.25rem + 2px);top:calc(.25rem + 2px);transition:transform .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;width:calc(1rem - 4px)}@media (prefers-reduced-motion:reduce){.custom-switch .custom-control-label:after{transition:none}}.custom-switch .custom-control-input:checked~.custom-control-label:after{background-color:#fff;transform:translateX(.75rem)}.custom-switch .custom-control-input:disabled:checked~.custom-control-label:before{background-color:rgba(64,64,200,.5)}.custom-select{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:#fff url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='4' height='5'%3E%3Cpath fill='%231f2937' d='M2 0 0 2h4zm0 5L0 3h4z'/%3E%3C/svg%3E") right .75rem center/8px 10px no-repeat;border:1px solid #d1d5db;border-radius:.25rem;color:#1f2937;display:inline-block;font-size:1rem;font-weight:400;height:calc(1.5em + .75rem + 2px);line-height:1.5;padding:.375rem 1.75rem .375rem .75rem;vertical-align:middle;width:100%}.custom-select:focus{border-color:#a3a3e5;box-shadow:0 0 0 .2rem rgba(64,64,200,.25);outline:0}.custom-select:focus::-ms-value{background-color:#fff;color:#1f2937}.custom-select[multiple],.custom-select[size]:not([size="1"]){background-image:none;height:auto;padding-right:.75rem}.custom-select:disabled{background-color:#e5e7eb;color:#4b5563}.custom-select::-ms-expand{display:none}.custom-select:-moz-focusring{color:transparent;text-shadow:0 0 0 #1f2937}.custom-select-sm{font-size:.875rem;height:calc(1.5em + .5rem + 2px);padding-bottom:.25rem;padding-left:.5rem;padding-top:.25rem}.custom-select-lg{font-size:1.25rem;height:calc(1.5em + 1rem + 2px);padding-bottom:.5rem;padding-left:1rem;padding-top:.5rem}.custom-file{display:inline-block;margin-bottom:0}.custom-file,.custom-file-input{height:calc(1.5em + .75rem + 2px);position:relative;width:100%}.custom-file-input{margin:0;opacity:0;overflow:hidden;z-index:2}.custom-file-input:focus~.custom-file-label{border-color:#a3a3e5;box-shadow:0 0 0 .2rem rgba(64,64,200,.25)}.custom-file-input:disabled~.custom-file-label,.custom-file-input[disabled]~.custom-file-label{background-color:#e5e7eb}.custom-file-input:lang(en)~.custom-file-label:after{content:"Browse"}.custom-file-input~.custom-file-label[data-browse]:after{content:attr(data-browse)}.custom-file-label{background-color:#fff;border:1px solid #d1d5db;border-radius:.25rem;font-weight:400;height:calc(1.5em + .75rem + 2px);left:0;overflow:hidden;z-index:1}.custom-file-label,.custom-file-label:after{color:#1f2937;line-height:1.5;padding:.375rem .75rem;position:absolute;right:0;top:0}.custom-file-label:after{background-color:#e5e7eb;border-left:inherit;border-radius:0 .25rem .25rem 0;bottom:0;content:"Browse";display:block;height:calc(1.5em + .75rem);z-index:3}.custom-range{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:transparent;height:1.4rem;padding:0;width:100%}.custom-range:focus{outline:0}.custom-range:focus::-webkit-slider-thumb{box-shadow:0 0 0 1px #f3f4f6,0 0 0 .2rem rgba(64,64,200,.25)}.custom-range:focus::-moz-range-thumb{box-shadow:0 0 0 1px #f3f4f6,0 0 0 .2rem rgba(64,64,200,.25)}.custom-range:focus::-ms-thumb{box-shadow:0 0 0 1px #f3f4f6,0 0 0 .2rem rgba(64,64,200,.25)}.custom-range::-moz-focus-outer{border:0}.custom-range::-webkit-slider-thumb{-webkit-appearance:none;appearance:none;background-color:#4040c8;border:0;border-radius:1rem;height:1rem;margin-top:-.25rem;-webkit-transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;width:1rem}@media (prefers-reduced-motion:reduce){.custom-range::-webkit-slider-thumb{-webkit-transition:none;transition:none}}.custom-range::-webkit-slider-thumb:active{background-color:#cbcbf0}.custom-range::-webkit-slider-runnable-track{background-color:#d1d5db;border-color:transparent;border-radius:1rem;color:transparent;cursor:pointer;height:.5rem;width:100%}.custom-range::-moz-range-thumb{-moz-appearance:none;appearance:none;background-color:#4040c8;border:0;border-radius:1rem;height:1rem;-moz-transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;width:1rem}@media (prefers-reduced-motion:reduce){.custom-range::-moz-range-thumb{-moz-transition:none;transition:none}}.custom-range::-moz-range-thumb:active{background-color:#cbcbf0}.custom-range::-moz-range-track{background-color:#d1d5db;border-color:transparent;border-radius:1rem;color:transparent;cursor:pointer;height:.5rem;width:100%}.custom-range::-ms-thumb{appearance:none;background-color:#4040c8;border:0;border-radius:1rem;height:1rem;margin-left:.2rem;margin-right:.2rem;margin-top:0;-ms-transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;width:1rem}@media (prefers-reduced-motion:reduce){.custom-range::-ms-thumb{-ms-transition:none;transition:none}}.custom-range::-ms-thumb:active{background-color:#cbcbf0}.custom-range::-ms-track{background-color:transparent;border-color:transparent;border-width:.5rem;color:transparent;cursor:pointer;height:.5rem;width:100%}.custom-range::-ms-fill-lower,.custom-range::-ms-fill-upper{background-color:#d1d5db;border-radius:1rem}.custom-range::-ms-fill-upper{margin-right:15px}.custom-range:disabled::-webkit-slider-thumb{background-color:#6b7280}.custom-range:disabled::-webkit-slider-runnable-track{cursor:default}.custom-range:disabled::-moz-range-thumb{background-color:#6b7280}.custom-range:disabled::-moz-range-track{cursor:default}.custom-range:disabled::-ms-thumb{background-color:#6b7280}.custom-control-label:before,.custom-file-label,.custom-select{transition:background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out}@media (prefers-reduced-motion:reduce){.custom-control-label:before,.custom-file-label,.custom-select{transition:none}}.nav{display:flex;flex-wrap:wrap;list-style:none;margin-bottom:0;padding-left:0}.nav-link{display:block;padding:.5rem 1rem}.nav-link:focus,.nav-link:hover{text-decoration:none}.nav-link.disabled{color:#4b5563;cursor:default;pointer-events:none}.nav-tabs{border-bottom:1px solid #d1d5db}.nav-tabs .nav-link{background-color:transparent;border:1px solid transparent;border-top-left-radius:.25rem;border-top-right-radius:.25rem;margin-bottom:-1px}.nav-tabs .nav-link:focus,.nav-tabs .nav-link:hover{border-color:#e5e7eb #e5e7eb #d1d5db;isolation:isolate}.nav-tabs .nav-link.disabled{background-color:transparent;border-color:transparent;color:#4b5563}.nav-tabs .nav-item.show .nav-link,.nav-tabs .nav-link.active{background-color:#f3f4f6;border-color:#d1d5db #d1d5db #f3f4f6;color:#374151}.nav-tabs .dropdown-menu{border-top-left-radius:0;border-top-right-radius:0;margin-top:-1px}.nav-pills .nav-link{background:none;border:0;border-radius:.25rem}.nav-pills .nav-link.active,.nav-pills .show>.nav-link{background-color:#e5e7eb;color:#fff}.nav-fill .nav-item,.nav-fill>.nav-link{flex:1 1 auto;text-align:center}.nav-justified .nav-item,.nav-justified>.nav-link{flex-basis:0;flex-grow:1;text-align:center}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.navbar{padding:.5rem 1rem;position:relative}.navbar,.navbar .container,.navbar .container-fluid,.navbar .container-lg,.navbar .container-md,.navbar .container-sm,.navbar .container-xl{align-items:center;display:flex;flex-wrap:wrap;justify-content:space-between}.navbar-brand{display:inline-block;font-size:1.25rem;line-height:inherit;margin-right:1rem;padding-bottom:.3125rem;padding-top:.3125rem;white-space:nowrap}.navbar-brand:focus,.navbar-brand:hover{text-decoration:none}.navbar-nav{display:flex;flex-direction:column;list-style:none;margin-bottom:0;padding-left:0}.navbar-nav .nav-link{padding-left:0;padding-right:0}.navbar-nav .dropdown-menu{float:none;position:static}.navbar-text{display:inline-block;padding-bottom:.5rem;padding-top:.5rem}.navbar-collapse{align-items:center;flex-basis:100%;flex-grow:1}.navbar-toggler{background-color:transparent;border:1px solid transparent;border-radius:.25rem;font-size:1.25rem;line-height:1;padding:.25rem .75rem}.navbar-toggler:focus,.navbar-toggler:hover{text-decoration:none}.navbar-toggler-icon{background:50%/100% 100% no-repeat;content:"";display:inline-block;height:1.5em;vertical-align:middle;width:1.5em}.navbar-nav-scroll{max-height:75vh;overflow-y:auto}@media (max-width:1.98px){.navbar-expand-sm>.container,.navbar-expand-sm>.container-fluid,.navbar-expand-sm>.container-lg,.navbar-expand-sm>.container-md,.navbar-expand-sm>.container-sm,.navbar-expand-sm>.container-xl{padding-left:0;padding-right:0}}@media (min-width:2px){.navbar-expand-sm{flex-flow:row nowrap;justify-content:flex-start}.navbar-expand-sm .navbar-nav{flex-direction:row}.navbar-expand-sm .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-sm .navbar-nav .nav-link{padding-left:.5rem;padding-right:.5rem}.navbar-expand-sm>.container,.navbar-expand-sm>.container-fluid,.navbar-expand-sm>.container-lg,.navbar-expand-sm>.container-md,.navbar-expand-sm>.container-sm,.navbar-expand-sm>.container-xl{flex-wrap:nowrap}.navbar-expand-sm .navbar-nav-scroll{overflow:visible}.navbar-expand-sm .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-sm .navbar-toggler{display:none}}@media (max-width:7.98px){.navbar-expand-md>.container,.navbar-expand-md>.container-fluid,.navbar-expand-md>.container-lg,.navbar-expand-md>.container-md,.navbar-expand-md>.container-sm,.navbar-expand-md>.container-xl{padding-left:0;padding-right:0}}@media (min-width:8px){.navbar-expand-md{flex-flow:row nowrap;justify-content:flex-start}.navbar-expand-md .navbar-nav{flex-direction:row}.navbar-expand-md .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-md .navbar-nav .nav-link{padding-left:.5rem;padding-right:.5rem}.navbar-expand-md>.container,.navbar-expand-md>.container-fluid,.navbar-expand-md>.container-lg,.navbar-expand-md>.container-md,.navbar-expand-md>.container-sm,.navbar-expand-md>.container-xl{flex-wrap:nowrap}.navbar-expand-md .navbar-nav-scroll{overflow:visible}.navbar-expand-md .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-md .navbar-toggler{display:none}}@media (max-width:8.98px){.navbar-expand-lg>.container,.navbar-expand-lg>.container-fluid,.navbar-expand-lg>.container-lg,.navbar-expand-lg>.container-md,.navbar-expand-lg>.container-sm,.navbar-expand-lg>.container-xl{padding-left:0;padding-right:0}}@media (min-width:9px){.navbar-expand-lg{flex-flow:row nowrap;justify-content:flex-start}.navbar-expand-lg .navbar-nav{flex-direction:row}.navbar-expand-lg .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-lg .navbar-nav .nav-link{padding-left:.5rem;padding-right:.5rem}.navbar-expand-lg>.container,.navbar-expand-lg>.container-fluid,.navbar-expand-lg>.container-lg,.navbar-expand-lg>.container-md,.navbar-expand-lg>.container-sm,.navbar-expand-lg>.container-xl{flex-wrap:nowrap}.navbar-expand-lg .navbar-nav-scroll{overflow:visible}.navbar-expand-lg .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-lg .navbar-toggler{display:none}}@media (max-width:9.98px){.navbar-expand-xl>.container,.navbar-expand-xl>.container-fluid,.navbar-expand-xl>.container-lg,.navbar-expand-xl>.container-md,.navbar-expand-xl>.container-sm,.navbar-expand-xl>.container-xl{padding-left:0;padding-right:0}}@media (min-width:10px){.navbar-expand-xl{flex-flow:row nowrap;justify-content:flex-start}.navbar-expand-xl .navbar-nav{flex-direction:row}.navbar-expand-xl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xl .navbar-nav .nav-link{padding-left:.5rem;padding-right:.5rem}.navbar-expand-xl>.container,.navbar-expand-xl>.container-fluid,.navbar-expand-xl>.container-lg,.navbar-expand-xl>.container-md,.navbar-expand-xl>.container-sm,.navbar-expand-xl>.container-xl{flex-wrap:nowrap}.navbar-expand-xl .navbar-nav-scroll{overflow:visible}.navbar-expand-xl .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand-xl .navbar-toggler{display:none}}.navbar-expand{flex-flow:row nowrap;justify-content:flex-start}.navbar-expand>.container,.navbar-expand>.container-fluid,.navbar-expand>.container-lg,.navbar-expand>.container-md,.navbar-expand>.container-sm,.navbar-expand>.container-xl{padding-left:0;padding-right:0}.navbar-expand .navbar-nav{flex-direction:row}.navbar-expand .navbar-nav .dropdown-menu{position:absolute}.navbar-expand .navbar-nav .nav-link{padding-left:.5rem;padding-right:.5rem}.navbar-expand>.container,.navbar-expand>.container-fluid,.navbar-expand>.container-lg,.navbar-expand>.container-md,.navbar-expand>.container-sm,.navbar-expand>.container-xl{flex-wrap:nowrap}.navbar-expand .navbar-nav-scroll{overflow:visible}.navbar-expand .navbar-collapse{display:flex!important;flex-basis:auto}.navbar-expand .navbar-toggler{display:none}.navbar-light .navbar-brand,.navbar-light .navbar-brand:focus,.navbar-light .navbar-brand:hover{color:rgba(0,0,0,.9)}.navbar-light .navbar-nav .nav-link{color:rgba(0,0,0,.5)}.navbar-light .navbar-nav .nav-link:focus,.navbar-light .navbar-nav .nav-link:hover{color:rgba(0,0,0,.7)}.navbar-light .navbar-nav .nav-link.disabled{color:rgba(0,0,0,.3)}.navbar-light .navbar-nav .active>.nav-link,.navbar-light .navbar-nav .nav-link.active,.navbar-light .navbar-nav .nav-link.show,.navbar-light .navbar-nav .show>.nav-link{color:rgba(0,0,0,.9)}.navbar-light .navbar-toggler{border-color:rgba(0,0,0,.1);color:rgba(0,0,0,.5)}.navbar-light .navbar-toggler-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='30' height='30'%3E%3Cpath stroke='rgba(0, 0, 0, 0.5)' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3E%3C/svg%3E")}.navbar-light .navbar-text{color:rgba(0,0,0,.5)}.navbar-light .navbar-text a,.navbar-light .navbar-text a:focus,.navbar-light .navbar-text a:hover{color:rgba(0,0,0,.9)}.navbar-dark .navbar-brand,.navbar-dark .navbar-brand:focus,.navbar-dark .navbar-brand:hover{color:#fff}.navbar-dark .navbar-nav .nav-link{color:hsla(0,0%,100%,.5)}.navbar-dark .navbar-nav .nav-link:focus,.navbar-dark .navbar-nav .nav-link:hover{color:hsla(0,0%,100%,.75)}.navbar-dark .navbar-nav .nav-link.disabled{color:hsla(0,0%,100%,.25)}.navbar-dark .navbar-nav .active>.nav-link,.navbar-dark .navbar-nav .nav-link.active,.navbar-dark .navbar-nav .nav-link.show,.navbar-dark .navbar-nav .show>.nav-link{color:#fff}.navbar-dark .navbar-toggler{border-color:hsla(0,0%,100%,.1);color:hsla(0,0%,100%,.5)}.navbar-dark .navbar-toggler-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='30' height='30'%3E%3Cpath stroke='rgba(255, 255, 255, 0.5)' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3E%3C/svg%3E")}.navbar-dark .navbar-text{color:hsla(0,0%,100%,.5)}.navbar-dark .navbar-text a,.navbar-dark .navbar-text a:focus,.navbar-dark .navbar-text a:hover{color:#fff}.card{word-wrap:break-word;background-clip:border-box;background-color:#fff;border:1px solid rgba(0,0,0,.125);border-radius:6px;display:flex;flex-direction:column;min-width:0;position:relative}.card>hr{margin-left:0;margin-right:0}.card>.list-group{border-bottom:inherit;border-top:inherit}.card>.list-group:first-child{border-top-left-radius:5px;border-top-right-radius:5px;border-top-width:0}.card>.list-group:last-child{border-bottom-left-radius:5px;border-bottom-right-radius:5px;border-bottom-width:0}.card>.card-header+.list-group,.card>.list-group+.card-footer{border-top:0}.card-body{flex:1 1 auto;min-height:1px;padding:1.25rem}.card-title{margin-bottom:.75rem}.card-subtitle{margin-top:-.375rem}.card-subtitle,.card-text:last-child{margin-bottom:0}.card-link:hover{text-decoration:none}.card-link+.card-link{margin-left:1.25rem}.card-header{background-color:#fff;border-bottom:1px solid rgba(0,0,0,.125);margin-bottom:0;padding:.75rem 1.25rem}.card-header:first-child{border-radius:5px 5px 0 0}.card-footer{background-color:#fff;border-top:1px solid rgba(0,0,0,.125);padding:.75rem 1.25rem}.card-footer:last-child{border-radius:0 0 5px 5px}.card-header-tabs{border-bottom:0;margin-bottom:-.75rem}.card-header-pills,.card-header-tabs{margin-left:-.625rem;margin-right:-.625rem}.card-img-overlay{border-radius:5px;bottom:0;left:0;padding:1.25rem;position:absolute;right:0;top:0}.card-img,.card-img-bottom,.card-img-top{flex-shrink:0;width:100%}.card-img,.card-img-top{border-top-left-radius:5px;border-top-right-radius:5px}.card-img,.card-img-bottom{border-bottom-left-radius:5px;border-bottom-right-radius:5px}.card-deck .card{margin-bottom:15px}@media (min-width:2px){.card-deck{display:flex;flex-flow:row wrap;margin-left:-15px;margin-right:-15px}.card-deck .card{flex:1 0 0%;margin-bottom:0;margin-left:15px;margin-right:15px}}.card-group>.card{margin-bottom:15px}@media (min-width:2px){.card-group{display:flex;flex-flow:row wrap}.card-group>.card{flex:1 0 0%;margin-bottom:0}.card-group>.card+.card{border-left:0;margin-left:0}.card-group>.card:not(:last-child){border-bottom-right-radius:0;border-top-right-radius:0}.card-group>.card:not(:last-child) .card-header,.card-group>.card:not(:last-child) .card-img-top{border-top-right-radius:0}.card-group>.card:not(:last-child) .card-footer,.card-group>.card:not(:last-child) .card-img-bottom{border-bottom-right-radius:0}.card-group>.card:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.card-group>.card:not(:first-child) .card-header,.card-group>.card:not(:first-child) .card-img-top{border-top-left-radius:0}.card-group>.card:not(:first-child) .card-footer,.card-group>.card:not(:first-child) .card-img-bottom{border-bottom-left-radius:0}}.card-columns .card{margin-bottom:.75rem}@media (min-width:2px){.card-columns{-moz-column-count:3;column-count:3;-moz-column-gap:1.25rem;column-gap:1.25rem;orphans:1;widows:1}.card-columns .card{display:inline-block;width:100%}}.accordion{overflow-anchor:none}.accordion>.card{overflow:hidden}.accordion>.card:not(:last-of-type){border-bottom:0;border-bottom-left-radius:0;border-bottom-right-radius:0}.accordion>.card:not(:first-of-type){border-top-left-radius:0;border-top-right-radius:0}.accordion>.card>.card-header{border-radius:0;margin-bottom:-1px}.breadcrumb{background-color:#e5e7eb;border-radius:.25rem;display:flex;flex-wrap:wrap;list-style:none;margin-bottom:1rem;padding:.75rem 1rem}.breadcrumb-item+.breadcrumb-item{padding-left:.5rem}.breadcrumb-item+.breadcrumb-item:before{color:#4b5563;content:"/";float:left;padding-right:.5rem}.breadcrumb-item+.breadcrumb-item:hover:before{text-decoration:underline;text-decoration:none}.breadcrumb-item.active{color:#4b5563}.pagination{border-radius:.25rem;display:flex;list-style:none;padding-left:0}.page-link{background-color:#fff;border:1px solid #d1d5db;color:#6366f1;display:block;line-height:1.25;margin-left:-1px;padding:.5rem .75rem;position:relative}.page-link:hover{background-color:#e5e7eb;border-color:#d1d5db;color:#4f46e5;text-decoration:none;z-index:2}.page-link:focus{box-shadow:0 0 0 .2rem rgba(64,64,200,.25);outline:0;z-index:3}.page-item:first-child .page-link{border-bottom-left-radius:.25rem;border-top-left-radius:.25rem;margin-left:0}.page-item:last-child .page-link{border-bottom-right-radius:.25rem;border-top-right-radius:.25rem}.page-item.active .page-link{background-color:#4040c8;border-color:#4040c8;color:#fff;z-index:3}.page-item.disabled .page-link{background-color:#fff;border-color:#d1d5db;color:#4b5563;cursor:auto;pointer-events:none}.pagination-lg .page-link{font-size:1.25rem;line-height:1.5;padding:.75rem 1.5rem}.pagination-lg .page-item:first-child .page-link{border-bottom-left-radius:6px;border-top-left-radius:6px}.pagination-lg .page-item:last-child .page-link{border-bottom-right-radius:6px;border-top-right-radius:6px}.pagination-sm .page-link{font-size:.875rem;line-height:1.5;padding:.25rem .5rem}.pagination-sm .page-item:first-child .page-link{border-bottom-left-radius:.2rem;border-top-left-radius:.2rem}.pagination-sm .page-item:last-child .page-link{border-bottom-right-radius:.2rem;border-top-right-radius:.2rem}.badge{border-radius:.25rem;display:inline-block;font-size:.875rem;font-weight:600;line-height:1;padding:.25em .4em;text-align:center;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;vertical-align:baseline;white-space:nowrap}@media (prefers-reduced-motion:reduce){.badge{transition:none}}a.badge:focus,a.badge:hover{text-decoration:none}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.badge-pill{border-radius:10rem;padding-left:.6em;padding-right:.6em}.badge-primary{background-color:#4040c8;color:#fff}a.badge-primary:focus,a.badge-primary:hover{background-color:#3030a5;color:#fff}a.badge-primary.focus,a.badge-primary:focus{box-shadow:0 0 0 .2rem rgba(64,64,200,.5);outline:0}.badge-secondary{background-color:#4b5563;color:#fff}a.badge-secondary:focus,a.badge-secondary:hover{background-color:#353c46;color:#fff}a.badge-secondary.focus,a.badge-secondary:focus{box-shadow:0 0 0 .2rem rgba(75,85,99,.5);outline:0}.badge-success{background-color:#059669;color:#fff}a.badge-success:focus,a.badge-success:hover{background-color:#036546;color:#fff}a.badge-success.focus,a.badge-success:focus{box-shadow:0 0 0 .2rem rgba(5,150,105,.5);outline:0}.badge-info{background-color:#2563eb;color:#fff}a.badge-info:focus,a.badge-info:hover{background-color:#134cca;color:#fff}a.badge-info.focus,a.badge-info:focus{box-shadow:0 0 0 .2rem rgba(37,99,235,.5);outline:0}.badge-warning{background-color:#d97706;color:#fff}a.badge-warning:focus,a.badge-warning:hover{background-color:#a75c05;color:#fff}a.badge-warning.focus,a.badge-warning:focus{box-shadow:0 0 0 .2rem rgba(217,119,6,.5);outline:0}.badge-danger{background-color:#dc2626;color:#fff}a.badge-danger:focus,a.badge-danger:hover{background-color:#b21d1d;color:#fff}a.badge-danger.focus,a.badge-danger:focus{box-shadow:0 0 0 .2rem rgba(220,38,38,.5);outline:0}.badge-light{background-color:#f3f4f6;color:#111827}a.badge-light:focus,a.badge-light:hover{background-color:#d6d9e0;color:#111827}a.badge-light.focus,a.badge-light:focus{box-shadow:0 0 0 .2rem rgba(243,244,246,.5);outline:0}.badge-dark{background-color:#1f2937;color:#fff}a.badge-dark:focus,a.badge-dark:hover{background-color:#0d1116;color:#fff}a.badge-dark.focus,a.badge-dark:focus{box-shadow:0 0 0 .2rem rgba(31,41,55,.5);outline:0}.jumbotron{background-color:#e5e7eb;border-radius:6px;margin-bottom:2rem;padding:2rem 1rem}@media (min-width:2px){.jumbotron{padding:4rem 2rem}}.jumbotron-fluid{border-radius:0;padding-left:0;padding-right:0}.alert{border:1px solid transparent;border-radius:.25rem;margin-bottom:1rem;padding:.75rem 1.25rem;position:relative}.alert-heading{color:inherit}.alert-link{font-weight:600}.alert-dismissible{padding-right:4rem}.alert-dismissible .close{color:inherit;padding:.75rem 1.25rem;position:absolute;right:0;top:0;z-index:2}.alert-primary{background-color:#d9d9f4;border-color:#cacaf0;color:#212168}.alert-primary hr{border-top-color:#b6b6ea}.alert-primary .alert-link{color:#151541}.alert-secondary{background-color:#dbdde0;border-color:#cdcfd3;color:#272c33}.alert-secondary hr{border-top-color:#bfc2c7}.alert-secondary .alert-link{color:#111316}.alert-success{background-color:#cdeae1;border-color:#b9e2d5;color:#034e37}.alert-success hr{border-top-color:#a7dbca}.alert-success .alert-link{color:#011d14}.alert-info{background-color:#d3e0fb;border-color:#c2d3f9;color:#13337a}.alert-info hr{border-top-color:#abc2f7}.alert-info .alert-link{color:#0c214e}.alert-warning{background-color:#f7e4cd;border-color:#f4d9b9;color:#713e03}.alert-warning hr{border-top-color:#f1cda3}.alert-warning .alert-link{color:#3f2302}.alert-danger{background-color:#f8d4d4;border-color:#f5c2c2;color:#721414}.alert-danger hr{border-top-color:#f1acac}.alert-danger .alert-link{color:#470c0c}.alert-light{background-color:#fdfdfd;border-color:#fcfcfc;color:#7e7f80}.alert-light hr{border-top-color:#efefef}.alert-light .alert-link{color:#656666}.alert-dark{background-color:#d2d4d7;border-color:#c0c3c7;color:#10151d}.alert-dark hr{border-top-color:#b3b6bb}.alert-dark .alert-link{color:#000}@keyframes progress-bar-stripes{0%{background-position:1rem 0}to{background-position:0 0}}.progress{background-color:#e5e7eb;border-radius:.25rem;font-size:.75rem;height:1rem;line-height:0}.progress,.progress-bar{display:flex;overflow:hidden}.progress-bar{background-color:#4040c8;color:#fff;flex-direction:column;justify-content:center;text-align:center;transition:width .6s ease;white-space:nowrap}@media (prefers-reduced-motion:reduce){.progress-bar{transition:none}}.progress-bar-striped{background-image:linear-gradient(45deg,hsla(0,0%,100%,.15) 25%,transparent 0,transparent 50%,hsla(0,0%,100%,.15) 0,hsla(0,0%,100%,.15) 75%,transparent 0,transparent);background-size:1rem 1rem}.progress-bar-animated{animation:progress-bar-stripes 1s linear infinite}@media (prefers-reduced-motion:reduce){.progress-bar-animated{animation:none}}.media{align-items:flex-start;display:flex}.media-body{flex:1}.list-group{border-radius:.25rem;display:flex;flex-direction:column;margin-bottom:0;padding-left:0}.list-group-item-action{color:#374151;text-align:inherit;width:100%}.list-group-item-action:focus,.list-group-item-action:hover{background-color:#f3f4f6;color:#374151;text-decoration:none;z-index:1}.list-group-item-action:active{background-color:#e5e7eb;color:#111827}.list-group-item{background-color:#fff;border:1px solid rgba(0,0,0,.125);display:block;padding:.75rem 1.25rem;position:relative}.list-group-item:first-child{border-top-left-radius:inherit;border-top-right-radius:inherit}.list-group-item:last-child{border-bottom-left-radius:inherit;border-bottom-right-radius:inherit}.list-group-item.disabled,.list-group-item:disabled{background-color:#fff;color:#4b5563;pointer-events:none}.list-group-item.active{background-color:#4040c8;border-color:#4040c8;color:#fff;z-index:2}.list-group-item+.list-group-item{border-top-width:0}.list-group-item+.list-group-item.active{border-top-width:1px;margin-top:-1px}.list-group-horizontal{flex-direction:row}.list-group-horizontal>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal>.list-group-item:last-child{border-bottom-left-radius:0;border-top-right-radius:.25rem}.list-group-horizontal>.list-group-item.active{margin-top:0}.list-group-horizontal>.list-group-item+.list-group-item{border-left-width:0;border-top-width:1px}.list-group-horizontal>.list-group-item+.list-group-item.active{border-left-width:1px;margin-left:-1px}@media (min-width:2px){.list-group-horizontal-sm{flex-direction:row}.list-group-horizontal-sm>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-sm>.list-group-item:last-child{border-bottom-left-radius:0;border-top-right-radius:.25rem}.list-group-horizontal-sm>.list-group-item.active{margin-top:0}.list-group-horizontal-sm>.list-group-item+.list-group-item{border-left-width:0;border-top-width:1px}.list-group-horizontal-sm>.list-group-item+.list-group-item.active{border-left-width:1px;margin-left:-1px}}@media (min-width:8px){.list-group-horizontal-md{flex-direction:row}.list-group-horizontal-md>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-md>.list-group-item:last-child{border-bottom-left-radius:0;border-top-right-radius:.25rem}.list-group-horizontal-md>.list-group-item.active{margin-top:0}.list-group-horizontal-md>.list-group-item+.list-group-item{border-left-width:0;border-top-width:1px}.list-group-horizontal-md>.list-group-item+.list-group-item.active{border-left-width:1px;margin-left:-1px}}@media (min-width:9px){.list-group-horizontal-lg{flex-direction:row}.list-group-horizontal-lg>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-lg>.list-group-item:last-child{border-bottom-left-radius:0;border-top-right-radius:.25rem}.list-group-horizontal-lg>.list-group-item.active{margin-top:0}.list-group-horizontal-lg>.list-group-item+.list-group-item{border-left-width:0;border-top-width:1px}.list-group-horizontal-lg>.list-group-item+.list-group-item.active{border-left-width:1px;margin-left:-1px}}@media (min-width:10px){.list-group-horizontal-xl{flex-direction:row}.list-group-horizontal-xl>.list-group-item:first-child{border-bottom-left-radius:.25rem;border-top-right-radius:0}.list-group-horizontal-xl>.list-group-item:last-child{border-bottom-left-radius:0;border-top-right-radius:.25rem}.list-group-horizontal-xl>.list-group-item.active{margin-top:0}.list-group-horizontal-xl>.list-group-item+.list-group-item{border-left-width:0;border-top-width:1px}.list-group-horizontal-xl>.list-group-item+.list-group-item.active{border-left-width:1px;margin-left:-1px}}.list-group-flush{border-radius:0}.list-group-flush>.list-group-item{border-width:0 0 1px}.list-group-flush>.list-group-item:last-child{border-bottom-width:0}.list-group-item-primary{background-color:#cacaf0;color:#212168}.list-group-item-primary.list-group-item-action:focus,.list-group-item-primary.list-group-item-action:hover{background-color:#b6b6ea;color:#212168}.list-group-item-primary.list-group-item-action.active{background-color:#212168;border-color:#212168;color:#fff}.list-group-item-secondary{background-color:#cdcfd3;color:#272c33}.list-group-item-secondary.list-group-item-action:focus,.list-group-item-secondary.list-group-item-action:hover{background-color:#bfc2c7;color:#272c33}.list-group-item-secondary.list-group-item-action.active{background-color:#272c33;border-color:#272c33;color:#fff}.list-group-item-success{background-color:#b9e2d5;color:#034e37}.list-group-item-success.list-group-item-action:focus,.list-group-item-success.list-group-item-action:hover{background-color:#a7dbca;color:#034e37}.list-group-item-success.list-group-item-action.active{background-color:#034e37;border-color:#034e37;color:#fff}.list-group-item-info{background-color:#c2d3f9;color:#13337a}.list-group-item-info.list-group-item-action:focus,.list-group-item-info.list-group-item-action:hover{background-color:#abc2f7;color:#13337a}.list-group-item-info.list-group-item-action.active{background-color:#13337a;border-color:#13337a;color:#fff}.list-group-item-warning{background-color:#f4d9b9;color:#713e03}.list-group-item-warning.list-group-item-action:focus,.list-group-item-warning.list-group-item-action:hover{background-color:#f1cda3;color:#713e03}.list-group-item-warning.list-group-item-action.active{background-color:#713e03;border-color:#713e03;color:#fff}.list-group-item-danger{background-color:#f5c2c2;color:#721414}.list-group-item-danger.list-group-item-action:focus,.list-group-item-danger.list-group-item-action:hover{background-color:#f1acac;color:#721414}.list-group-item-danger.list-group-item-action.active{background-color:#721414;border-color:#721414;color:#fff}.list-group-item-light{background-color:#fcfcfc;color:#7e7f80}.list-group-item-light.list-group-item-action:focus,.list-group-item-light.list-group-item-action:hover{background-color:#efefef;color:#7e7f80}.list-group-item-light.list-group-item-action.active{background-color:#7e7f80;border-color:#7e7f80;color:#fff}.list-group-item-dark{background-color:#c0c3c7;color:#10151d}.list-group-item-dark.list-group-item-action:focus,.list-group-item-dark.list-group-item-action:hover{background-color:#b3b6bb;color:#10151d}.list-group-item-dark.list-group-item-action.active{background-color:#10151d;border-color:#10151d;color:#fff}.close{color:#000;float:right;font-size:1.5rem;font-weight:600;line-height:1;opacity:.5;text-shadow:0 1px 0 #fff}.close:hover{color:#000;text-decoration:none}.close:not(:disabled):not(.disabled):focus,.close:not(:disabled):not(.disabled):hover{opacity:.75}button.close{background-color:transparent;border:0;padding:0}a.close.disabled{pointer-events:none}.toast{background-clip:padding-box;background-color:hsla(0,0%,100%,.85);border:1px solid rgba(0,0,0,.1);border-radius:.25rem;box-shadow:0 .25rem .75rem rgba(0,0,0,.1);flex-basis:350px;font-size:.875rem;max-width:350px;opacity:0}.toast:not(:last-child){margin-bottom:.75rem}.toast.showing{opacity:1}.toast.show{display:block;opacity:1}.toast.hide{display:none}.toast-header{align-items:center;background-clip:padding-box;background-color:hsla(0,0%,100%,.85);border-bottom:1px solid rgba(0,0,0,.05);border-top-left-radius:calc(.25rem - 1px);border-top-right-radius:calc(.25rem - 1px);color:#4b5563;display:flex;padding:.25rem .75rem}.toast-body{padding:.75rem}.modal-open{overflow:hidden}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal{display:none;height:100%;left:0;outline:0;overflow:hidden;position:fixed;top:0;width:100%;z-index:1050}.modal-dialog{margin:.5rem;pointer-events:none;position:relative;width:auto}.modal.fade .modal-dialog{transform:translateY(-50px);transition:transform .3s ease-out}@media (prefers-reduced-motion:reduce){.modal.fade .modal-dialog{transition:none}}.modal.show .modal-dialog{transform:none}.modal.modal-static .modal-dialog{transform:scale(1.02)}.modal-dialog-scrollable{display:flex;max-height:calc(100% - 1rem)}.modal-dialog-scrollable .modal-content{max-height:calc(100vh - 1rem);overflow:hidden}.modal-dialog-scrollable .modal-footer,.modal-dialog-scrollable .modal-header{flex-shrink:0}.modal-dialog-scrollable .modal-body{overflow-y:auto}.modal-dialog-centered{align-items:center;display:flex;min-height:calc(100% - 1rem)}.modal-dialog-centered:before{content:"";display:block;height:calc(100vh - 1rem);height:-moz-min-content;height:min-content}.modal-dialog-centered.modal-dialog-scrollable{flex-direction:column;height:100%;justify-content:center}.modal-dialog-centered.modal-dialog-scrollable .modal-content{max-height:none}.modal-dialog-centered.modal-dialog-scrollable:before{content:none}.modal-content{background-clip:padding-box;background-color:#fff;border:1px solid rgba(0,0,0,.2);border-radius:6px;display:flex;flex-direction:column;outline:0;pointer-events:auto;position:relative;width:100%}.modal-backdrop{background-color:#000;height:100vh;left:0;position:fixed;top:0;width:100vw;z-index:1040}.modal-backdrop.fade{opacity:0}.modal-backdrop.show{opacity:.5}.modal-header{align-items:flex-start;border-bottom:1px solid #d1d5db;border-top-left-radius:5px;border-top-right-radius:5px;display:flex;justify-content:space-between;padding:1rem}.modal-header .close{margin:-1rem -1rem -1rem auto;padding:1rem}.modal-title{line-height:1.5;margin-bottom:0}.modal-body{flex:1 1 auto;padding:1rem;position:relative}.modal-footer{align-items:center;border-bottom-left-radius:5px;border-bottom-right-radius:5px;border-top:1px solid #d1d5db;display:flex;flex-wrap:wrap;justify-content:flex-end;padding:.75rem}.modal-footer>*{margin:.25rem}.modal-scrollbar-measure{height:50px;overflow:scroll;position:absolute;top:-9999px;width:50px}@media (min-width:2px){.modal-dialog{margin:1.75rem auto;max-width:500px}.modal-dialog-scrollable{max-height:calc(100% - 3.5rem)}.modal-dialog-scrollable .modal-content{max-height:calc(100vh - 3.5rem)}.modal-dialog-centered{min-height:calc(100% - 3.5rem)}.modal-dialog-centered:before{height:calc(100vh - 3.5rem);height:-moz-min-content;height:min-content}.modal-sm{max-width:300px}}@media (min-width:9px){.modal-lg,.modal-xl{max-width:800px}}@media (min-width:10px){.modal-xl{max-width:1140px}}.tooltip{word-wrap:break-word;display:block;font-family:Figtree,sans-serif;font-size:.875rem;font-style:normal;font-weight:400;letter-spacing:normal;line-break:auto;line-height:1.5;margin:0;opacity:0;position:absolute;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;white-space:normal;word-break:normal;word-spacing:normal;z-index:1070}.tooltip.show{opacity:.9}.tooltip .arrow{display:block;height:.4rem;position:absolute;width:.8rem}.tooltip .arrow:before{border-color:transparent;border-style:solid;content:"";position:absolute}.bs-tooltip-auto[x-placement^=top],.bs-tooltip-top{padding:.4rem 0}.bs-tooltip-auto[x-placement^=top] .arrow,.bs-tooltip-top .arrow{bottom:0}.bs-tooltip-auto[x-placement^=top] .arrow:before,.bs-tooltip-top .arrow:before{border-top-color:#000;border-width:.4rem .4rem 0;top:0}.bs-tooltip-auto[x-placement^=right],.bs-tooltip-right{padding:0 .4rem}.bs-tooltip-auto[x-placement^=right] .arrow,.bs-tooltip-right .arrow{height:.8rem;left:0;width:.4rem}.bs-tooltip-auto[x-placement^=right] .arrow:before,.bs-tooltip-right .arrow:before{border-right-color:#000;border-width:.4rem .4rem .4rem 0;right:0}.bs-tooltip-auto[x-placement^=bottom],.bs-tooltip-bottom{padding:.4rem 0}.bs-tooltip-auto[x-placement^=bottom] .arrow,.bs-tooltip-bottom .arrow{top:0}.bs-tooltip-auto[x-placement^=bottom] .arrow:before,.bs-tooltip-bottom .arrow:before{border-bottom-color:#000;border-width:0 .4rem .4rem;bottom:0}.bs-tooltip-auto[x-placement^=left],.bs-tooltip-left{padding:0 .4rem}.bs-tooltip-auto[x-placement^=left] .arrow,.bs-tooltip-left .arrow{height:.8rem;right:0;width:.4rem}.bs-tooltip-auto[x-placement^=left] .arrow:before,.bs-tooltip-left .arrow:before{border-left-color:#000;border-width:.4rem 0 .4rem .4rem;left:0}.tooltip-inner{background-color:#000;border-radius:.25rem;color:#fff;max-width:200px;padding:.25rem .5rem;text-align:center}.popover{word-wrap:break-word;background-clip:padding-box;background-color:#fff;border:1px solid rgba(0,0,0,.2);border-radius:6px;font-family:Figtree,sans-serif;font-size:.875rem;font-style:normal;font-weight:400;left:0;letter-spacing:normal;line-break:auto;line-height:1.5;max-width:276px;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;top:0;white-space:normal;word-break:normal;word-spacing:normal;z-index:1060}.popover,.popover .arrow{display:block;position:absolute}.popover .arrow{height:.5rem;margin:0 6px;width:1rem}.popover .arrow:after,.popover .arrow:before{border-color:transparent;border-style:solid;content:"";display:block;position:absolute}.bs-popover-auto[x-placement^=top],.bs-popover-top{margin-bottom:.5rem}.bs-popover-auto[x-placement^=top]>.arrow,.bs-popover-top>.arrow{bottom:calc(-.5rem - 1px)}.bs-popover-auto[x-placement^=top]>.arrow:before,.bs-popover-top>.arrow:before{border-top-color:rgba(0,0,0,.25);border-width:.5rem .5rem 0;bottom:0}.bs-popover-auto[x-placement^=top]>.arrow:after,.bs-popover-top>.arrow:after{border-top-color:#fff;border-width:.5rem .5rem 0;bottom:1px}.bs-popover-auto[x-placement^=right],.bs-popover-right{margin-left:.5rem}.bs-popover-auto[x-placement^=right]>.arrow,.bs-popover-right>.arrow{height:1rem;left:calc(-.5rem - 1px);margin:6px 0;width:.5rem}.bs-popover-auto[x-placement^=right]>.arrow:before,.bs-popover-right>.arrow:before{border-right-color:rgba(0,0,0,.25);border-width:.5rem .5rem .5rem 0;left:0}.bs-popover-auto[x-placement^=right]>.arrow:after,.bs-popover-right>.arrow:after{border-right-color:#fff;border-width:.5rem .5rem .5rem 0;left:1px}.bs-popover-auto[x-placement^=bottom],.bs-popover-bottom{margin-top:.5rem}.bs-popover-auto[x-placement^=bottom]>.arrow,.bs-popover-bottom>.arrow{top:calc(-.5rem - 1px)}.bs-popover-auto[x-placement^=bottom]>.arrow:before,.bs-popover-bottom>.arrow:before{border-bottom-color:rgba(0,0,0,.25);border-width:0 .5rem .5rem;top:0}.bs-popover-auto[x-placement^=bottom]>.arrow:after,.bs-popover-bottom>.arrow:after{border-bottom-color:#fff;border-width:0 .5rem .5rem;top:1px}.bs-popover-auto[x-placement^=bottom] .popover-header:before,.bs-popover-bottom .popover-header:before{border-bottom:1px solid #f7f7f7;content:"";display:block;left:50%;margin-left:-.5rem;position:absolute;top:0;width:1rem}.bs-popover-auto[x-placement^=left],.bs-popover-left{margin-right:.5rem}.bs-popover-auto[x-placement^=left]>.arrow,.bs-popover-left>.arrow{height:1rem;margin:6px 0;right:calc(-.5rem - 1px);width:.5rem}.bs-popover-auto[x-placement^=left]>.arrow:before,.bs-popover-left>.arrow:before{border-left-color:rgba(0,0,0,.25);border-width:.5rem 0 .5rem .5rem;right:0}.bs-popover-auto[x-placement^=left]>.arrow:after,.bs-popover-left>.arrow:after{border-left-color:#fff;border-width:.5rem 0 .5rem .5rem;right:1px}.popover-header{background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-top-left-radius:5px;border-top-right-radius:5px;font-size:1rem;margin-bottom:0;padding:.5rem .75rem}.popover-header:empty{display:none}.popover-body{color:#111827;padding:.5rem .75rem}.carousel{position:relative}.carousel.pointer-event{touch-action:pan-y}.carousel-inner{overflow:hidden;position:relative;width:100%}.carousel-inner:after{clear:both;content:"";display:block}.carousel-item{backface-visibility:hidden;display:none;float:left;margin-right:-100%;position:relative;transition:transform .6s ease-in-out;width:100%}@media (prefers-reduced-motion:reduce){.carousel-item{transition:none}}.carousel-item-next,.carousel-item-prev,.carousel-item.active{display:block}.active.carousel-item-right,.carousel-item-next:not(.carousel-item-left){transform:translateX(100%)}.active.carousel-item-left,.carousel-item-prev:not(.carousel-item-right){transform:translateX(-100%)}.carousel-fade .carousel-item{opacity:0;transform:none;transition-property:opacity}.carousel-fade .carousel-item-next.carousel-item-left,.carousel-fade .carousel-item-prev.carousel-item-right,.carousel-fade .carousel-item.active{opacity:1;z-index:1}.carousel-fade .active.carousel-item-left,.carousel-fade .active.carousel-item-right{opacity:0;transition:opacity 0s .6s;z-index:0}@media (prefers-reduced-motion:reduce){.carousel-fade .active.carousel-item-left,.carousel-fade .active.carousel-item-right{transition:none}}.carousel-control-next,.carousel-control-prev{align-items:center;background:none;border:0;bottom:0;color:#fff;display:flex;justify-content:center;opacity:.5;padding:0;position:absolute;text-align:center;top:0;transition:opacity .15s ease;width:15%;z-index:1}@media (prefers-reduced-motion:reduce){.carousel-control-next,.carousel-control-prev{transition:none}}.carousel-control-next:focus,.carousel-control-next:hover,.carousel-control-prev:focus,.carousel-control-prev:hover{color:#fff;opacity:.9;outline:0;text-decoration:none}.carousel-control-prev{left:0}.carousel-control-next{right:0}.carousel-control-next-icon,.carousel-control-prev-icon{background:50%/100% 100% no-repeat;display:inline-block;height:20px;width:20px}.carousel-control-prev-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' width='8' height='8'%3E%3Cpath d='m5.25 0-4 4 4 4 1.5-1.5L4.25 4l2.5-2.5L5.25 0z'/%3E%3C/svg%3E")}.carousel-control-next-icon{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' width='8' height='8'%3E%3Cpath d='m2.75 0-1.5 1.5L3.75 4l-2.5 2.5L2.75 8l4-4-4-4z'/%3E%3C/svg%3E")}.carousel-indicators{bottom:0;display:flex;justify-content:center;left:0;list-style:none;margin-left:15%;margin-right:15%;padding-left:0;position:absolute;right:0;z-index:15}.carousel-indicators li{background-clip:padding-box;background-color:#fff;border-bottom:10px solid transparent;border-top:10px solid transparent;box-sizing:content-box;cursor:pointer;flex:0 1 auto;height:3px;margin-left:3px;margin-right:3px;opacity:.5;text-indent:-999px;transition:opacity .6s ease;width:30px}@media (prefers-reduced-motion:reduce){.carousel-indicators li{transition:none}}.carousel-indicators .active{opacity:1}.carousel-caption{bottom:20px;color:#fff;left:15%;padding-bottom:20px;padding-top:20px;position:absolute;right:15%;text-align:center;z-index:10}@keyframes spinner-border{to{transform:rotate(1turn)}}.spinner-border{animation:spinner-border .75s linear infinite;border:.25em solid;border-radius:50%;border-right:.25em solid transparent;display:inline-block;height:2rem;vertical-align:-.125em;width:2rem}.spinner-border-sm{border-width:.2em;height:1rem;width:1rem}@keyframes spinner-grow{0%{transform:scale(0)}50%{opacity:1;transform:none}}.spinner-grow{animation:spinner-grow .75s linear infinite;background-color:currentcolor;border-radius:50%;display:inline-block;height:2rem;opacity:0;vertical-align:-.125em;width:2rem}.spinner-grow-sm{height:1rem;width:1rem}@media (prefers-reduced-motion:reduce){.spinner-border,.spinner-grow{animation-duration:1.5s}}.align-baseline{vertical-align:baseline!important}.align-top{vertical-align:top!important}.align-middle{vertical-align:middle!important}.align-bottom{vertical-align:bottom!important}.align-text-bottom{vertical-align:text-bottom!important}.align-text-top{vertical-align:text-top!important}.bg-primary{background-color:#4040c8!important}a.bg-primary:focus,a.bg-primary:hover,button.bg-primary:focus,button.bg-primary:hover{background-color:#3030a5!important}.bg-secondary{background-color:#4b5563!important}a.bg-secondary:focus,a.bg-secondary:hover,button.bg-secondary:focus,button.bg-secondary:hover{background-color:#353c46!important}.bg-success{background-color:#059669!important}a.bg-success:focus,a.bg-success:hover,button.bg-success:focus,button.bg-success:hover{background-color:#036546!important}.bg-info{background-color:#2563eb!important}a.bg-info:focus,a.bg-info:hover,button.bg-info:focus,button.bg-info:hover{background-color:#134cca!important}.bg-warning{background-color:#d97706!important}a.bg-warning:focus,a.bg-warning:hover,button.bg-warning:focus,button.bg-warning:hover{background-color:#a75c05!important}.bg-danger{background-color:#dc2626!important}a.bg-danger:focus,a.bg-danger:hover,button.bg-danger:focus,button.bg-danger:hover{background-color:#b21d1d!important}.bg-light{background-color:#f3f4f6!important}a.bg-light:focus,a.bg-light:hover,button.bg-light:focus,button.bg-light:hover{background-color:#d6d9e0!important}.bg-dark{background-color:#1f2937!important}a.bg-dark:focus,a.bg-dark:hover,button.bg-dark:focus,button.bg-dark:hover{background-color:#0d1116!important}.bg-white{background-color:#fff!important}.bg-transparent{background-color:transparent!important}.border{border:1px solid #d1d5db!important}.border-top{border-top:1px solid #d1d5db!important}.border-right{border-right:1px solid #d1d5db!important}.border-bottom{border-bottom:1px solid #d1d5db!important}.border-left{border-left:1px solid #d1d5db!important}.border-0{border:0!important}.border-top-0{border-top:0!important}.border-right-0{border-right:0!important}.border-bottom-0{border-bottom:0!important}.border-left-0{border-left:0!important}.border-primary{border-color:#4040c8!important}.border-secondary{border-color:#4b5563!important}.border-success{border-color:#059669!important}.border-info{border-color:#2563eb!important}.border-warning{border-color:#d97706!important}.border-danger{border-color:#dc2626!important}.border-light{border-color:#f3f4f6!important}.border-dark{border-color:#1f2937!important}.border-white{border-color:#fff!important}.rounded-sm{border-radius:.2rem!important}.rounded{border-radius:.25rem!important}.rounded-top{border-top-left-radius:.25rem!important}.rounded-right,.rounded-top{border-top-right-radius:.25rem!important}.rounded-bottom,.rounded-right{border-bottom-right-radius:.25rem!important}.rounded-bottom,.rounded-left{border-bottom-left-radius:.25rem!important}.rounded-left{border-top-left-radius:.25rem!important}.rounded-lg{border-radius:6px!important}.rounded-circle{border-radius:50%!important}.rounded-pill{border-radius:50rem!important}.rounded-0{border-radius:0!important}.clearfix:after{clear:both;content:"";display:block}.d-none{display:none!important}.d-inline{display:inline!important}.d-inline-block{display:inline-block!important}.d-block{display:block!important}.d-table{display:table!important}.d-table-row{display:table-row!important}.d-table-cell{display:table-cell!important}.d-flex{display:flex!important}.d-inline-flex{display:inline-flex!important}@media (min-width:2px){.d-sm-none{display:none!important}.d-sm-inline{display:inline!important}.d-sm-inline-block{display:inline-block!important}.d-sm-block{display:block!important}.d-sm-table{display:table!important}.d-sm-table-row{display:table-row!important}.d-sm-table-cell{display:table-cell!important}.d-sm-flex{display:flex!important}.d-sm-inline-flex{display:inline-flex!important}}@media (min-width:8px){.d-md-none{display:none!important}.d-md-inline{display:inline!important}.d-md-inline-block{display:inline-block!important}.d-md-block{display:block!important}.d-md-table{display:table!important}.d-md-table-row{display:table-row!important}.d-md-table-cell{display:table-cell!important}.d-md-flex{display:flex!important}.d-md-inline-flex{display:inline-flex!important}}@media (min-width:9px){.d-lg-none{display:none!important}.d-lg-inline{display:inline!important}.d-lg-inline-block{display:inline-block!important}.d-lg-block{display:block!important}.d-lg-table{display:table!important}.d-lg-table-row{display:table-row!important}.d-lg-table-cell{display:table-cell!important}.d-lg-flex{display:flex!important}.d-lg-inline-flex{display:inline-flex!important}}@media (min-width:10px){.d-xl-none{display:none!important}.d-xl-inline{display:inline!important}.d-xl-inline-block{display:inline-block!important}.d-xl-block{display:block!important}.d-xl-table{display:table!important}.d-xl-table-row{display:table-row!important}.d-xl-table-cell{display:table-cell!important}.d-xl-flex{display:flex!important}.d-xl-inline-flex{display:inline-flex!important}}@media print{.d-print-none{display:none!important}.d-print-inline{display:inline!important}.d-print-inline-block{display:inline-block!important}.d-print-block{display:block!important}.d-print-table{display:table!important}.d-print-table-row{display:table-row!important}.d-print-table-cell{display:table-cell!important}.d-print-flex{display:flex!important}.d-print-inline-flex{display:inline-flex!important}}.embed-responsive{display:block;overflow:hidden;padding:0;position:relative;width:100%}.embed-responsive:before{content:"";display:block}.embed-responsive .embed-responsive-item,.embed-responsive embed,.embed-responsive iframe,.embed-responsive object,.embed-responsive video{border:0;bottom:0;height:100%;left:0;position:absolute;top:0;width:100%}.embed-responsive-21by9:before{padding-top:42.85714286%}.embed-responsive-16by9:before{padding-top:56.25%}.embed-responsive-4by3:before{padding-top:75%}.embed-responsive-1by1:before{padding-top:100%}.flex-row{flex-direction:row!important}.flex-column{flex-direction:column!important}.flex-row-reverse{flex-direction:row-reverse!important}.flex-column-reverse{flex-direction:column-reverse!important}.flex-wrap{flex-wrap:wrap!important}.flex-nowrap{flex-wrap:nowrap!important}.flex-wrap-reverse{flex-wrap:wrap-reverse!important}.flex-fill{flex:1 1 auto!important}.flex-grow-0{flex-grow:0!important}.flex-grow-1{flex-grow:1!important}.flex-shrink-0{flex-shrink:0!important}.flex-shrink-1{flex-shrink:1!important}.justify-content-start{justify-content:flex-start!important}.justify-content-end{justify-content:flex-end!important}.justify-content-center{justify-content:center!important}.justify-content-between{justify-content:space-between!important}.justify-content-around{justify-content:space-around!important}.align-items-start{align-items:flex-start!important}.align-items-end{align-items:flex-end!important}.align-items-center{align-items:center!important}.align-items-baseline{align-items:baseline!important}.align-items-stretch{align-items:stretch!important}.align-content-start{align-content:flex-start!important}.align-content-end{align-content:flex-end!important}.align-content-center{align-content:center!important}.align-content-between{align-content:space-between!important}.align-content-around{align-content:space-around!important}.align-content-stretch{align-content:stretch!important}.align-self-auto{align-self:auto!important}.align-self-start{align-self:flex-start!important}.align-self-end{align-self:flex-end!important}.align-self-center{align-self:center!important}.align-self-baseline{align-self:baseline!important}.align-self-stretch{align-self:stretch!important}@media (min-width:2px){.flex-sm-row{flex-direction:row!important}.flex-sm-column{flex-direction:column!important}.flex-sm-row-reverse{flex-direction:row-reverse!important}.flex-sm-column-reverse{flex-direction:column-reverse!important}.flex-sm-wrap{flex-wrap:wrap!important}.flex-sm-nowrap{flex-wrap:nowrap!important}.flex-sm-wrap-reverse{flex-wrap:wrap-reverse!important}.flex-sm-fill{flex:1 1 auto!important}.flex-sm-grow-0{flex-grow:0!important}.flex-sm-grow-1{flex-grow:1!important}.flex-sm-shrink-0{flex-shrink:0!important}.flex-sm-shrink-1{flex-shrink:1!important}.justify-content-sm-start{justify-content:flex-start!important}.justify-content-sm-end{justify-content:flex-end!important}.justify-content-sm-center{justify-content:center!important}.justify-content-sm-between{justify-content:space-between!important}.justify-content-sm-around{justify-content:space-around!important}.align-items-sm-start{align-items:flex-start!important}.align-items-sm-end{align-items:flex-end!important}.align-items-sm-center{align-items:center!important}.align-items-sm-baseline{align-items:baseline!important}.align-items-sm-stretch{align-items:stretch!important}.align-content-sm-start{align-content:flex-start!important}.align-content-sm-end{align-content:flex-end!important}.align-content-sm-center{align-content:center!important}.align-content-sm-between{align-content:space-between!important}.align-content-sm-around{align-content:space-around!important}.align-content-sm-stretch{align-content:stretch!important}.align-self-sm-auto{align-self:auto!important}.align-self-sm-start{align-self:flex-start!important}.align-self-sm-end{align-self:flex-end!important}.align-self-sm-center{align-self:center!important}.align-self-sm-baseline{align-self:baseline!important}.align-self-sm-stretch{align-self:stretch!important}}@media (min-width:8px){.flex-md-row{flex-direction:row!important}.flex-md-column{flex-direction:column!important}.flex-md-row-reverse{flex-direction:row-reverse!important}.flex-md-column-reverse{flex-direction:column-reverse!important}.flex-md-wrap{flex-wrap:wrap!important}.flex-md-nowrap{flex-wrap:nowrap!important}.flex-md-wrap-reverse{flex-wrap:wrap-reverse!important}.flex-md-fill{flex:1 1 auto!important}.flex-md-grow-0{flex-grow:0!important}.flex-md-grow-1{flex-grow:1!important}.flex-md-shrink-0{flex-shrink:0!important}.flex-md-shrink-1{flex-shrink:1!important}.justify-content-md-start{justify-content:flex-start!important}.justify-content-md-end{justify-content:flex-end!important}.justify-content-md-center{justify-content:center!important}.justify-content-md-between{justify-content:space-between!important}.justify-content-md-around{justify-content:space-around!important}.align-items-md-start{align-items:flex-start!important}.align-items-md-end{align-items:flex-end!important}.align-items-md-center{align-items:center!important}.align-items-md-baseline{align-items:baseline!important}.align-items-md-stretch{align-items:stretch!important}.align-content-md-start{align-content:flex-start!important}.align-content-md-end{align-content:flex-end!important}.align-content-md-center{align-content:center!important}.align-content-md-between{align-content:space-between!important}.align-content-md-around{align-content:space-around!important}.align-content-md-stretch{align-content:stretch!important}.align-self-md-auto{align-self:auto!important}.align-self-md-start{align-self:flex-start!important}.align-self-md-end{align-self:flex-end!important}.align-self-md-center{align-self:center!important}.align-self-md-baseline{align-self:baseline!important}.align-self-md-stretch{align-self:stretch!important}}@media (min-width:9px){.flex-lg-row{flex-direction:row!important}.flex-lg-column{flex-direction:column!important}.flex-lg-row-reverse{flex-direction:row-reverse!important}.flex-lg-column-reverse{flex-direction:column-reverse!important}.flex-lg-wrap{flex-wrap:wrap!important}.flex-lg-nowrap{flex-wrap:nowrap!important}.flex-lg-wrap-reverse{flex-wrap:wrap-reverse!important}.flex-lg-fill{flex:1 1 auto!important}.flex-lg-grow-0{flex-grow:0!important}.flex-lg-grow-1{flex-grow:1!important}.flex-lg-shrink-0{flex-shrink:0!important}.flex-lg-shrink-1{flex-shrink:1!important}.justify-content-lg-start{justify-content:flex-start!important}.justify-content-lg-end{justify-content:flex-end!important}.justify-content-lg-center{justify-content:center!important}.justify-content-lg-between{justify-content:space-between!important}.justify-content-lg-around{justify-content:space-around!important}.align-items-lg-start{align-items:flex-start!important}.align-items-lg-end{align-items:flex-end!important}.align-items-lg-center{align-items:center!important}.align-items-lg-baseline{align-items:baseline!important}.align-items-lg-stretch{align-items:stretch!important}.align-content-lg-start{align-content:flex-start!important}.align-content-lg-end{align-content:flex-end!important}.align-content-lg-center{align-content:center!important}.align-content-lg-between{align-content:space-between!important}.align-content-lg-around{align-content:space-around!important}.align-content-lg-stretch{align-content:stretch!important}.align-self-lg-auto{align-self:auto!important}.align-self-lg-start{align-self:flex-start!important}.align-self-lg-end{align-self:flex-end!important}.align-self-lg-center{align-self:center!important}.align-self-lg-baseline{align-self:baseline!important}.align-self-lg-stretch{align-self:stretch!important}}@media (min-width:10px){.flex-xl-row{flex-direction:row!important}.flex-xl-column{flex-direction:column!important}.flex-xl-row-reverse{flex-direction:row-reverse!important}.flex-xl-column-reverse{flex-direction:column-reverse!important}.flex-xl-wrap{flex-wrap:wrap!important}.flex-xl-nowrap{flex-wrap:nowrap!important}.flex-xl-wrap-reverse{flex-wrap:wrap-reverse!important}.flex-xl-fill{flex:1 1 auto!important}.flex-xl-grow-0{flex-grow:0!important}.flex-xl-grow-1{flex-grow:1!important}.flex-xl-shrink-0{flex-shrink:0!important}.flex-xl-shrink-1{flex-shrink:1!important}.justify-content-xl-start{justify-content:flex-start!important}.justify-content-xl-end{justify-content:flex-end!important}.justify-content-xl-center{justify-content:center!important}.justify-content-xl-between{justify-content:space-between!important}.justify-content-xl-around{justify-content:space-around!important}.align-items-xl-start{align-items:flex-start!important}.align-items-xl-end{align-items:flex-end!important}.align-items-xl-center{align-items:center!important}.align-items-xl-baseline{align-items:baseline!important}.align-items-xl-stretch{align-items:stretch!important}.align-content-xl-start{align-content:flex-start!important}.align-content-xl-end{align-content:flex-end!important}.align-content-xl-center{align-content:center!important}.align-content-xl-between{align-content:space-between!important}.align-content-xl-around{align-content:space-around!important}.align-content-xl-stretch{align-content:stretch!important}.align-self-xl-auto{align-self:auto!important}.align-self-xl-start{align-self:flex-start!important}.align-self-xl-end{align-self:flex-end!important}.align-self-xl-center{align-self:center!important}.align-self-xl-baseline{align-self:baseline!important}.align-self-xl-stretch{align-self:stretch!important}}.float-left{float:left!important}.float-right{float:right!important}.float-none{float:none!important}@media (min-width:2px){.float-sm-left{float:left!important}.float-sm-right{float:right!important}.float-sm-none{float:none!important}}@media (min-width:8px){.float-md-left{float:left!important}.float-md-right{float:right!important}.float-md-none{float:none!important}}@media (min-width:9px){.float-lg-left{float:left!important}.float-lg-right{float:right!important}.float-lg-none{float:none!important}}@media (min-width:10px){.float-xl-left{float:left!important}.float-xl-right{float:right!important}.float-xl-none{float:none!important}}.user-select-all{-webkit-user-select:all!important;-moz-user-select:all!important;user-select:all!important}.user-select-auto{-webkit-user-select:auto!important;-moz-user-select:auto!important;user-select:auto!important}.user-select-none{-webkit-user-select:none!important;-moz-user-select:none!important;user-select:none!important}.overflow-auto{overflow:auto!important}.overflow-hidden{overflow:hidden!important}.position-static{position:static!important}.position-relative{position:relative!important}.position-absolute{position:absolute!important}.position-fixed{position:fixed!important}.position-sticky{position:sticky!important}.fixed-top{top:0}.fixed-bottom,.fixed-top{left:0;position:fixed;right:0;z-index:1030}.fixed-bottom{bottom:0}@supports (position:sticky){.sticky-top{position:sticky;top:0;z-index:1020}}.sr-only{clip:rect(0,0,0,0);border:0;height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;white-space:nowrap;width:1px}.sr-only-focusable:active,.sr-only-focusable:focus{clip:auto;height:auto;overflow:visible;position:static;white-space:normal;width:auto}.shadow-sm{box-shadow:0 .125rem .25rem rgba(0,0,0,.075)!important}.shadow{box-shadow:0 .5rem 1rem rgba(0,0,0,.15)!important}.shadow-lg{box-shadow:0 1rem 3rem rgba(0,0,0,.175)!important}.shadow-none{box-shadow:none!important}.w-25{width:25%!important}.w-50{width:50%!important}.w-75{width:75%!important}.w-100{width:100%!important}.w-auto{width:auto!important}.h-25{height:25%!important}.h-50{height:50%!important}.h-75{height:75%!important}.h-100{height:100%!important}.h-auto{height:auto!important}.mw-100{max-width:100%!important}.mh-100{max-height:100%!important}.min-vw-100{min-width:100vw!important}.min-vh-100{min-height:100vh!important}.vw-100{width:100vw!important}.vh-100{height:100vh!important}.m-0{margin:0!important}.mt-0,.my-0{margin-top:0!important}.mr-0,.mx-0{margin-right:0!important}.mb-0,.my-0{margin-bottom:0!important}.ml-0,.mx-0{margin-left:0!important}.m-1{margin:.25rem!important}.mt-1,.my-1{margin-top:.25rem!important}.mr-1,.mx-1{margin-right:.25rem!important}.mb-1,.my-1{margin-bottom:.25rem!important}.ml-1,.mx-1{margin-left:.25rem!important}.m-2{margin:.5rem!important}.mt-2,.my-2{margin-top:.5rem!important}.mr-2,.mx-2{margin-right:.5rem!important}.mb-2,.my-2{margin-bottom:.5rem!important}.ml-2,.mx-2{margin-left:.5rem!important}.m-3{margin:1rem!important}.mt-3,.my-3{margin-top:1rem!important}.mr-3,.mx-3{margin-right:1rem!important}.mb-3,.my-3{margin-bottom:1rem!important}.ml-3,.mx-3{margin-left:1rem!important}.m-4{margin:1.5rem!important}.mt-4,.my-4{margin-top:1.5rem!important}.mr-4,.mx-4{margin-right:1.5rem!important}.mb-4,.my-4{margin-bottom:1.5rem!important}.ml-4,.mx-4{margin-left:1.5rem!important}.m-5{margin:3rem!important}.mt-5,.my-5{margin-top:3rem!important}.mr-5,.mx-5{margin-right:3rem!important}.mb-5,.my-5{margin-bottom:3rem!important}.ml-5,.mx-5{margin-left:3rem!important}.p-0{padding:0!important}.pt-0,.py-0{padding-top:0!important}.pr-0,.px-0{padding-right:0!important}.pb-0,.py-0{padding-bottom:0!important}.pl-0,.px-0{padding-left:0!important}.p-1{padding:.25rem!important}.pt-1,.py-1{padding-top:.25rem!important}.pr-1,.px-1{padding-right:.25rem!important}.pb-1,.py-1{padding-bottom:.25rem!important}.pl-1,.px-1{padding-left:.25rem!important}.p-2{padding:.5rem!important}.pt-2,.py-2{padding-top:.5rem!important}.pr-2,.px-2{padding-right:.5rem!important}.pb-2,.py-2{padding-bottom:.5rem!important}.pl-2,.px-2{padding-left:.5rem!important}.p-3{padding:1rem!important}.pt-3,.py-3{padding-top:1rem!important}.pr-3,.px-3{padding-right:1rem!important}.pb-3,.py-3{padding-bottom:1rem!important}.pl-3,.px-3{padding-left:1rem!important}.p-4{padding:1.5rem!important}.pt-4,.py-4{padding-top:1.5rem!important}.pr-4,.px-4{padding-right:1.5rem!important}.pb-4,.py-4{padding-bottom:1.5rem!important}.pl-4,.px-4{padding-left:1.5rem!important}.p-5{padding:3rem!important}.pt-5,.py-5{padding-top:3rem!important}.pr-5,.px-5{padding-right:3rem!important}.pb-5,.py-5{padding-bottom:3rem!important}.pl-5,.px-5{padding-left:3rem!important}.m-n1{margin:-.25rem!important}.mt-n1,.my-n1{margin-top:-.25rem!important}.mr-n1,.mx-n1{margin-right:-.25rem!important}.mb-n1,.my-n1{margin-bottom:-.25rem!important}.ml-n1,.mx-n1{margin-left:-.25rem!important}.m-n2{margin:-.5rem!important}.mt-n2,.my-n2{margin-top:-.5rem!important}.mr-n2,.mx-n2{margin-right:-.5rem!important}.mb-n2,.my-n2{margin-bottom:-.5rem!important}.ml-n2,.mx-n2{margin-left:-.5rem!important}.m-n3{margin:-1rem!important}.mt-n3,.my-n3{margin-top:-1rem!important}.mr-n3,.mx-n3{margin-right:-1rem!important}.mb-n3,.my-n3{margin-bottom:-1rem!important}.ml-n3,.mx-n3{margin-left:-1rem!important}.m-n4{margin:-1.5rem!important}.mt-n4,.my-n4{margin-top:-1.5rem!important}.mr-n4,.mx-n4{margin-right:-1.5rem!important}.mb-n4,.my-n4{margin-bottom:-1.5rem!important}.ml-n4,.mx-n4{margin-left:-1.5rem!important}.m-n5{margin:-3rem!important}.mt-n5,.my-n5{margin-top:-3rem!important}.mr-n5,.mx-n5{margin-right:-3rem!important}.mb-n5,.my-n5{margin-bottom:-3rem!important}.ml-n5,.mx-n5{margin-left:-3rem!important}.m-auto{margin:auto!important}.mt-auto,.my-auto{margin-top:auto!important}.mr-auto,.mx-auto{margin-right:auto!important}.mb-auto,.my-auto{margin-bottom:auto!important}.ml-auto,.mx-auto{margin-left:auto!important}@media (min-width:2px){.m-sm-0{margin:0!important}.mt-sm-0,.my-sm-0{margin-top:0!important}.mr-sm-0,.mx-sm-0{margin-right:0!important}.mb-sm-0,.my-sm-0{margin-bottom:0!important}.ml-sm-0,.mx-sm-0{margin-left:0!important}.m-sm-1{margin:.25rem!important}.mt-sm-1,.my-sm-1{margin-top:.25rem!important}.mr-sm-1,.mx-sm-1{margin-right:.25rem!important}.mb-sm-1,.my-sm-1{margin-bottom:.25rem!important}.ml-sm-1,.mx-sm-1{margin-left:.25rem!important}.m-sm-2{margin:.5rem!important}.mt-sm-2,.my-sm-2{margin-top:.5rem!important}.mr-sm-2,.mx-sm-2{margin-right:.5rem!important}.mb-sm-2,.my-sm-2{margin-bottom:.5rem!important}.ml-sm-2,.mx-sm-2{margin-left:.5rem!important}.m-sm-3{margin:1rem!important}.mt-sm-3,.my-sm-3{margin-top:1rem!important}.mr-sm-3,.mx-sm-3{margin-right:1rem!important}.mb-sm-3,.my-sm-3{margin-bottom:1rem!important}.ml-sm-3,.mx-sm-3{margin-left:1rem!important}.m-sm-4{margin:1.5rem!important}.mt-sm-4,.my-sm-4{margin-top:1.5rem!important}.mr-sm-4,.mx-sm-4{margin-right:1.5rem!important}.mb-sm-4,.my-sm-4{margin-bottom:1.5rem!important}.ml-sm-4,.mx-sm-4{margin-left:1.5rem!important}.m-sm-5{margin:3rem!important}.mt-sm-5,.my-sm-5{margin-top:3rem!important}.mr-sm-5,.mx-sm-5{margin-right:3rem!important}.mb-sm-5,.my-sm-5{margin-bottom:3rem!important}.ml-sm-5,.mx-sm-5{margin-left:3rem!important}.p-sm-0{padding:0!important}.pt-sm-0,.py-sm-0{padding-top:0!important}.pr-sm-0,.px-sm-0{padding-right:0!important}.pb-sm-0,.py-sm-0{padding-bottom:0!important}.pl-sm-0,.px-sm-0{padding-left:0!important}.p-sm-1{padding:.25rem!important}.pt-sm-1,.py-sm-1{padding-top:.25rem!important}.pr-sm-1,.px-sm-1{padding-right:.25rem!important}.pb-sm-1,.py-sm-1{padding-bottom:.25rem!important}.pl-sm-1,.px-sm-1{padding-left:.25rem!important}.p-sm-2{padding:.5rem!important}.pt-sm-2,.py-sm-2{padding-top:.5rem!important}.pr-sm-2,.px-sm-2{padding-right:.5rem!important}.pb-sm-2,.py-sm-2{padding-bottom:.5rem!important}.pl-sm-2,.px-sm-2{padding-left:.5rem!important}.p-sm-3{padding:1rem!important}.pt-sm-3,.py-sm-3{padding-top:1rem!important}.pr-sm-3,.px-sm-3{padding-right:1rem!important}.pb-sm-3,.py-sm-3{padding-bottom:1rem!important}.pl-sm-3,.px-sm-3{padding-left:1rem!important}.p-sm-4{padding:1.5rem!important}.pt-sm-4,.py-sm-4{padding-top:1.5rem!important}.pr-sm-4,.px-sm-4{padding-right:1.5rem!important}.pb-sm-4,.py-sm-4{padding-bottom:1.5rem!important}.pl-sm-4,.px-sm-4{padding-left:1.5rem!important}.p-sm-5{padding:3rem!important}.pt-sm-5,.py-sm-5{padding-top:3rem!important}.pr-sm-5,.px-sm-5{padding-right:3rem!important}.pb-sm-5,.py-sm-5{padding-bottom:3rem!important}.pl-sm-5,.px-sm-5{padding-left:3rem!important}.m-sm-n1{margin:-.25rem!important}.mt-sm-n1,.my-sm-n1{margin-top:-.25rem!important}.mr-sm-n1,.mx-sm-n1{margin-right:-.25rem!important}.mb-sm-n1,.my-sm-n1{margin-bottom:-.25rem!important}.ml-sm-n1,.mx-sm-n1{margin-left:-.25rem!important}.m-sm-n2{margin:-.5rem!important}.mt-sm-n2,.my-sm-n2{margin-top:-.5rem!important}.mr-sm-n2,.mx-sm-n2{margin-right:-.5rem!important}.mb-sm-n2,.my-sm-n2{margin-bottom:-.5rem!important}.ml-sm-n2,.mx-sm-n2{margin-left:-.5rem!important}.m-sm-n3{margin:-1rem!important}.mt-sm-n3,.my-sm-n3{margin-top:-1rem!important}.mr-sm-n3,.mx-sm-n3{margin-right:-1rem!important}.mb-sm-n3,.my-sm-n3{margin-bottom:-1rem!important}.ml-sm-n3,.mx-sm-n3{margin-left:-1rem!important}.m-sm-n4{margin:-1.5rem!important}.mt-sm-n4,.my-sm-n4{margin-top:-1.5rem!important}.mr-sm-n4,.mx-sm-n4{margin-right:-1.5rem!important}.mb-sm-n4,.my-sm-n4{margin-bottom:-1.5rem!important}.ml-sm-n4,.mx-sm-n4{margin-left:-1.5rem!important}.m-sm-n5{margin:-3rem!important}.mt-sm-n5,.my-sm-n5{margin-top:-3rem!important}.mr-sm-n5,.mx-sm-n5{margin-right:-3rem!important}.mb-sm-n5,.my-sm-n5{margin-bottom:-3rem!important}.ml-sm-n5,.mx-sm-n5{margin-left:-3rem!important}.m-sm-auto{margin:auto!important}.mt-sm-auto,.my-sm-auto{margin-top:auto!important}.mr-sm-auto,.mx-sm-auto{margin-right:auto!important}.mb-sm-auto,.my-sm-auto{margin-bottom:auto!important}.ml-sm-auto,.mx-sm-auto{margin-left:auto!important}}@media (min-width:8px){.m-md-0{margin:0!important}.mt-md-0,.my-md-0{margin-top:0!important}.mr-md-0,.mx-md-0{margin-right:0!important}.mb-md-0,.my-md-0{margin-bottom:0!important}.ml-md-0,.mx-md-0{margin-left:0!important}.m-md-1{margin:.25rem!important}.mt-md-1,.my-md-1{margin-top:.25rem!important}.mr-md-1,.mx-md-1{margin-right:.25rem!important}.mb-md-1,.my-md-1{margin-bottom:.25rem!important}.ml-md-1,.mx-md-1{margin-left:.25rem!important}.m-md-2{margin:.5rem!important}.mt-md-2,.my-md-2{margin-top:.5rem!important}.mr-md-2,.mx-md-2{margin-right:.5rem!important}.mb-md-2,.my-md-2{margin-bottom:.5rem!important}.ml-md-2,.mx-md-2{margin-left:.5rem!important}.m-md-3{margin:1rem!important}.mt-md-3,.my-md-3{margin-top:1rem!important}.mr-md-3,.mx-md-3{margin-right:1rem!important}.mb-md-3,.my-md-3{margin-bottom:1rem!important}.ml-md-3,.mx-md-3{margin-left:1rem!important}.m-md-4{margin:1.5rem!important}.mt-md-4,.my-md-4{margin-top:1.5rem!important}.mr-md-4,.mx-md-4{margin-right:1.5rem!important}.mb-md-4,.my-md-4{margin-bottom:1.5rem!important}.ml-md-4,.mx-md-4{margin-left:1.5rem!important}.m-md-5{margin:3rem!important}.mt-md-5,.my-md-5{margin-top:3rem!important}.mr-md-5,.mx-md-5{margin-right:3rem!important}.mb-md-5,.my-md-5{margin-bottom:3rem!important}.ml-md-5,.mx-md-5{margin-left:3rem!important}.p-md-0{padding:0!important}.pt-md-0,.py-md-0{padding-top:0!important}.pr-md-0,.px-md-0{padding-right:0!important}.pb-md-0,.py-md-0{padding-bottom:0!important}.pl-md-0,.px-md-0{padding-left:0!important}.p-md-1{padding:.25rem!important}.pt-md-1,.py-md-1{padding-top:.25rem!important}.pr-md-1,.px-md-1{padding-right:.25rem!important}.pb-md-1,.py-md-1{padding-bottom:.25rem!important}.pl-md-1,.px-md-1{padding-left:.25rem!important}.p-md-2{padding:.5rem!important}.pt-md-2,.py-md-2{padding-top:.5rem!important}.pr-md-2,.px-md-2{padding-right:.5rem!important}.pb-md-2,.py-md-2{padding-bottom:.5rem!important}.pl-md-2,.px-md-2{padding-left:.5rem!important}.p-md-3{padding:1rem!important}.pt-md-3,.py-md-3{padding-top:1rem!important}.pr-md-3,.px-md-3{padding-right:1rem!important}.pb-md-3,.py-md-3{padding-bottom:1rem!important}.pl-md-3,.px-md-3{padding-left:1rem!important}.p-md-4{padding:1.5rem!important}.pt-md-4,.py-md-4{padding-top:1.5rem!important}.pr-md-4,.px-md-4{padding-right:1.5rem!important}.pb-md-4,.py-md-4{padding-bottom:1.5rem!important}.pl-md-4,.px-md-4{padding-left:1.5rem!important}.p-md-5{padding:3rem!important}.pt-md-5,.py-md-5{padding-top:3rem!important}.pr-md-5,.px-md-5{padding-right:3rem!important}.pb-md-5,.py-md-5{padding-bottom:3rem!important}.pl-md-5,.px-md-5{padding-left:3rem!important}.m-md-n1{margin:-.25rem!important}.mt-md-n1,.my-md-n1{margin-top:-.25rem!important}.mr-md-n1,.mx-md-n1{margin-right:-.25rem!important}.mb-md-n1,.my-md-n1{margin-bottom:-.25rem!important}.ml-md-n1,.mx-md-n1{margin-left:-.25rem!important}.m-md-n2{margin:-.5rem!important}.mt-md-n2,.my-md-n2{margin-top:-.5rem!important}.mr-md-n2,.mx-md-n2{margin-right:-.5rem!important}.mb-md-n2,.my-md-n2{margin-bottom:-.5rem!important}.ml-md-n2,.mx-md-n2{margin-left:-.5rem!important}.m-md-n3{margin:-1rem!important}.mt-md-n3,.my-md-n3{margin-top:-1rem!important}.mr-md-n3,.mx-md-n3{margin-right:-1rem!important}.mb-md-n3,.my-md-n3{margin-bottom:-1rem!important}.ml-md-n3,.mx-md-n3{margin-left:-1rem!important}.m-md-n4{margin:-1.5rem!important}.mt-md-n4,.my-md-n4{margin-top:-1.5rem!important}.mr-md-n4,.mx-md-n4{margin-right:-1.5rem!important}.mb-md-n4,.my-md-n4{margin-bottom:-1.5rem!important}.ml-md-n4,.mx-md-n4{margin-left:-1.5rem!important}.m-md-n5{margin:-3rem!important}.mt-md-n5,.my-md-n5{margin-top:-3rem!important}.mr-md-n5,.mx-md-n5{margin-right:-3rem!important}.mb-md-n5,.my-md-n5{margin-bottom:-3rem!important}.ml-md-n5,.mx-md-n5{margin-left:-3rem!important}.m-md-auto{margin:auto!important}.mt-md-auto,.my-md-auto{margin-top:auto!important}.mr-md-auto,.mx-md-auto{margin-right:auto!important}.mb-md-auto,.my-md-auto{margin-bottom:auto!important}.ml-md-auto,.mx-md-auto{margin-left:auto!important}}@media (min-width:9px){.m-lg-0{margin:0!important}.mt-lg-0,.my-lg-0{margin-top:0!important}.mr-lg-0,.mx-lg-0{margin-right:0!important}.mb-lg-0,.my-lg-0{margin-bottom:0!important}.ml-lg-0,.mx-lg-0{margin-left:0!important}.m-lg-1{margin:.25rem!important}.mt-lg-1,.my-lg-1{margin-top:.25rem!important}.mr-lg-1,.mx-lg-1{margin-right:.25rem!important}.mb-lg-1,.my-lg-1{margin-bottom:.25rem!important}.ml-lg-1,.mx-lg-1{margin-left:.25rem!important}.m-lg-2{margin:.5rem!important}.mt-lg-2,.my-lg-2{margin-top:.5rem!important}.mr-lg-2,.mx-lg-2{margin-right:.5rem!important}.mb-lg-2,.my-lg-2{margin-bottom:.5rem!important}.ml-lg-2,.mx-lg-2{margin-left:.5rem!important}.m-lg-3{margin:1rem!important}.mt-lg-3,.my-lg-3{margin-top:1rem!important}.mr-lg-3,.mx-lg-3{margin-right:1rem!important}.mb-lg-3,.my-lg-3{margin-bottom:1rem!important}.ml-lg-3,.mx-lg-3{margin-left:1rem!important}.m-lg-4{margin:1.5rem!important}.mt-lg-4,.my-lg-4{margin-top:1.5rem!important}.mr-lg-4,.mx-lg-4{margin-right:1.5rem!important}.mb-lg-4,.my-lg-4{margin-bottom:1.5rem!important}.ml-lg-4,.mx-lg-4{margin-left:1.5rem!important}.m-lg-5{margin:3rem!important}.mt-lg-5,.my-lg-5{margin-top:3rem!important}.mr-lg-5,.mx-lg-5{margin-right:3rem!important}.mb-lg-5,.my-lg-5{margin-bottom:3rem!important}.ml-lg-5,.mx-lg-5{margin-left:3rem!important}.p-lg-0{padding:0!important}.pt-lg-0,.py-lg-0{padding-top:0!important}.pr-lg-0,.px-lg-0{padding-right:0!important}.pb-lg-0,.py-lg-0{padding-bottom:0!important}.pl-lg-0,.px-lg-0{padding-left:0!important}.p-lg-1{padding:.25rem!important}.pt-lg-1,.py-lg-1{padding-top:.25rem!important}.pr-lg-1,.px-lg-1{padding-right:.25rem!important}.pb-lg-1,.py-lg-1{padding-bottom:.25rem!important}.pl-lg-1,.px-lg-1{padding-left:.25rem!important}.p-lg-2{padding:.5rem!important}.pt-lg-2,.py-lg-2{padding-top:.5rem!important}.pr-lg-2,.px-lg-2{padding-right:.5rem!important}.pb-lg-2,.py-lg-2{padding-bottom:.5rem!important}.pl-lg-2,.px-lg-2{padding-left:.5rem!important}.p-lg-3{padding:1rem!important}.pt-lg-3,.py-lg-3{padding-top:1rem!important}.pr-lg-3,.px-lg-3{padding-right:1rem!important}.pb-lg-3,.py-lg-3{padding-bottom:1rem!important}.pl-lg-3,.px-lg-3{padding-left:1rem!important}.p-lg-4{padding:1.5rem!important}.pt-lg-4,.py-lg-4{padding-top:1.5rem!important}.pr-lg-4,.px-lg-4{padding-right:1.5rem!important}.pb-lg-4,.py-lg-4{padding-bottom:1.5rem!important}.pl-lg-4,.px-lg-4{padding-left:1.5rem!important}.p-lg-5{padding:3rem!important}.pt-lg-5,.py-lg-5{padding-top:3rem!important}.pr-lg-5,.px-lg-5{padding-right:3rem!important}.pb-lg-5,.py-lg-5{padding-bottom:3rem!important}.pl-lg-5,.px-lg-5{padding-left:3rem!important}.m-lg-n1{margin:-.25rem!important}.mt-lg-n1,.my-lg-n1{margin-top:-.25rem!important}.mr-lg-n1,.mx-lg-n1{margin-right:-.25rem!important}.mb-lg-n1,.my-lg-n1{margin-bottom:-.25rem!important}.ml-lg-n1,.mx-lg-n1{margin-left:-.25rem!important}.m-lg-n2{margin:-.5rem!important}.mt-lg-n2,.my-lg-n2{margin-top:-.5rem!important}.mr-lg-n2,.mx-lg-n2{margin-right:-.5rem!important}.mb-lg-n2,.my-lg-n2{margin-bottom:-.5rem!important}.ml-lg-n2,.mx-lg-n2{margin-left:-.5rem!important}.m-lg-n3{margin:-1rem!important}.mt-lg-n3,.my-lg-n3{margin-top:-1rem!important}.mr-lg-n3,.mx-lg-n3{margin-right:-1rem!important}.mb-lg-n3,.my-lg-n3{margin-bottom:-1rem!important}.ml-lg-n3,.mx-lg-n3{margin-left:-1rem!important}.m-lg-n4{margin:-1.5rem!important}.mt-lg-n4,.my-lg-n4{margin-top:-1.5rem!important}.mr-lg-n4,.mx-lg-n4{margin-right:-1.5rem!important}.mb-lg-n4,.my-lg-n4{margin-bottom:-1.5rem!important}.ml-lg-n4,.mx-lg-n4{margin-left:-1.5rem!important}.m-lg-n5{margin:-3rem!important}.mt-lg-n5,.my-lg-n5{margin-top:-3rem!important}.mr-lg-n5,.mx-lg-n5{margin-right:-3rem!important}.mb-lg-n5,.my-lg-n5{margin-bottom:-3rem!important}.ml-lg-n5,.mx-lg-n5{margin-left:-3rem!important}.m-lg-auto{margin:auto!important}.mt-lg-auto,.my-lg-auto{margin-top:auto!important}.mr-lg-auto,.mx-lg-auto{margin-right:auto!important}.mb-lg-auto,.my-lg-auto{margin-bottom:auto!important}.ml-lg-auto,.mx-lg-auto{margin-left:auto!important}}@media (min-width:10px){.m-xl-0{margin:0!important}.mt-xl-0,.my-xl-0{margin-top:0!important}.mr-xl-0,.mx-xl-0{margin-right:0!important}.mb-xl-0,.my-xl-0{margin-bottom:0!important}.ml-xl-0,.mx-xl-0{margin-left:0!important}.m-xl-1{margin:.25rem!important}.mt-xl-1,.my-xl-1{margin-top:.25rem!important}.mr-xl-1,.mx-xl-1{margin-right:.25rem!important}.mb-xl-1,.my-xl-1{margin-bottom:.25rem!important}.ml-xl-1,.mx-xl-1{margin-left:.25rem!important}.m-xl-2{margin:.5rem!important}.mt-xl-2,.my-xl-2{margin-top:.5rem!important}.mr-xl-2,.mx-xl-2{margin-right:.5rem!important}.mb-xl-2,.my-xl-2{margin-bottom:.5rem!important}.ml-xl-2,.mx-xl-2{margin-left:.5rem!important}.m-xl-3{margin:1rem!important}.mt-xl-3,.my-xl-3{margin-top:1rem!important}.mr-xl-3,.mx-xl-3{margin-right:1rem!important}.mb-xl-3,.my-xl-3{margin-bottom:1rem!important}.ml-xl-3,.mx-xl-3{margin-left:1rem!important}.m-xl-4{margin:1.5rem!important}.mt-xl-4,.my-xl-4{margin-top:1.5rem!important}.mr-xl-4,.mx-xl-4{margin-right:1.5rem!important}.mb-xl-4,.my-xl-4{margin-bottom:1.5rem!important}.ml-xl-4,.mx-xl-4{margin-left:1.5rem!important}.m-xl-5{margin:3rem!important}.mt-xl-5,.my-xl-5{margin-top:3rem!important}.mr-xl-5,.mx-xl-5{margin-right:3rem!important}.mb-xl-5,.my-xl-5{margin-bottom:3rem!important}.ml-xl-5,.mx-xl-5{margin-left:3rem!important}.p-xl-0{padding:0!important}.pt-xl-0,.py-xl-0{padding-top:0!important}.pr-xl-0,.px-xl-0{padding-right:0!important}.pb-xl-0,.py-xl-0{padding-bottom:0!important}.pl-xl-0,.px-xl-0{padding-left:0!important}.p-xl-1{padding:.25rem!important}.pt-xl-1,.py-xl-1{padding-top:.25rem!important}.pr-xl-1,.px-xl-1{padding-right:.25rem!important}.pb-xl-1,.py-xl-1{padding-bottom:.25rem!important}.pl-xl-1,.px-xl-1{padding-left:.25rem!important}.p-xl-2{padding:.5rem!important}.pt-xl-2,.py-xl-2{padding-top:.5rem!important}.pr-xl-2,.px-xl-2{padding-right:.5rem!important}.pb-xl-2,.py-xl-2{padding-bottom:.5rem!important}.pl-xl-2,.px-xl-2{padding-left:.5rem!important}.p-xl-3{padding:1rem!important}.pt-xl-3,.py-xl-3{padding-top:1rem!important}.pr-xl-3,.px-xl-3{padding-right:1rem!important}.pb-xl-3,.py-xl-3{padding-bottom:1rem!important}.pl-xl-3,.px-xl-3{padding-left:1rem!important}.p-xl-4{padding:1.5rem!important}.pt-xl-4,.py-xl-4{padding-top:1.5rem!important}.pr-xl-4,.px-xl-4{padding-right:1.5rem!important}.pb-xl-4,.py-xl-4{padding-bottom:1.5rem!important}.pl-xl-4,.px-xl-4{padding-left:1.5rem!important}.p-xl-5{padding:3rem!important}.pt-xl-5,.py-xl-5{padding-top:3rem!important}.pr-xl-5,.px-xl-5{padding-right:3rem!important}.pb-xl-5,.py-xl-5{padding-bottom:3rem!important}.pl-xl-5,.px-xl-5{padding-left:3rem!important}.m-xl-n1{margin:-.25rem!important}.mt-xl-n1,.my-xl-n1{margin-top:-.25rem!important}.mr-xl-n1,.mx-xl-n1{margin-right:-.25rem!important}.mb-xl-n1,.my-xl-n1{margin-bottom:-.25rem!important}.ml-xl-n1,.mx-xl-n1{margin-left:-.25rem!important}.m-xl-n2{margin:-.5rem!important}.mt-xl-n2,.my-xl-n2{margin-top:-.5rem!important}.mr-xl-n2,.mx-xl-n2{margin-right:-.5rem!important}.mb-xl-n2,.my-xl-n2{margin-bottom:-.5rem!important}.ml-xl-n2,.mx-xl-n2{margin-left:-.5rem!important}.m-xl-n3{margin:-1rem!important}.mt-xl-n3,.my-xl-n3{margin-top:-1rem!important}.mr-xl-n3,.mx-xl-n3{margin-right:-1rem!important}.mb-xl-n3,.my-xl-n3{margin-bottom:-1rem!important}.ml-xl-n3,.mx-xl-n3{margin-left:-1rem!important}.m-xl-n4{margin:-1.5rem!important}.mt-xl-n4,.my-xl-n4{margin-top:-1.5rem!important}.mr-xl-n4,.mx-xl-n4{margin-right:-1.5rem!important}.mb-xl-n4,.my-xl-n4{margin-bottom:-1.5rem!important}.ml-xl-n4,.mx-xl-n4{margin-left:-1.5rem!important}.m-xl-n5{margin:-3rem!important}.mt-xl-n5,.my-xl-n5{margin-top:-3rem!important}.mr-xl-n5,.mx-xl-n5{margin-right:-3rem!important}.mb-xl-n5,.my-xl-n5{margin-bottom:-3rem!important}.ml-xl-n5,.mx-xl-n5{margin-left:-3rem!important}.m-xl-auto{margin:auto!important}.mt-xl-auto,.my-xl-auto{margin-top:auto!important}.mr-xl-auto,.mx-xl-auto{margin-right:auto!important}.mb-xl-auto,.my-xl-auto{margin-bottom:auto!important}.ml-xl-auto,.mx-xl-auto{margin-left:auto!important}}.stretched-link:after{background-color:transparent;bottom:0;content:"";left:0;pointer-events:auto;position:absolute;right:0;top:0;z-index:1}.text-monospace{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace!important}.text-justify{text-align:justify!important}.text-wrap{white-space:normal!important}.text-nowrap{white-space:nowrap!important}.text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.text-left{text-align:left!important}.text-right{text-align:right!important}.text-center{text-align:center!important}@media (min-width:2px){.text-sm-left{text-align:left!important}.text-sm-right{text-align:right!important}.text-sm-center{text-align:center!important}}@media (min-width:8px){.text-md-left{text-align:left!important}.text-md-right{text-align:right!important}.text-md-center{text-align:center!important}}@media (min-width:9px){.text-lg-left{text-align:left!important}.text-lg-right{text-align:right!important}.text-lg-center{text-align:center!important}}@media (min-width:10px){.text-xl-left{text-align:left!important}.text-xl-right{text-align:right!important}.text-xl-center{text-align:center!important}}.text-lowercase{text-transform:lowercase!important}.text-uppercase{text-transform:uppercase!important}.text-capitalize{text-transform:capitalize!important}.font-weight-light{font-weight:300!important}.font-weight-lighter{font-weight:lighter!important}.font-weight-normal{font-weight:400!important}.font-weight-bold{font-weight:600!important}.font-weight-bolder{font-weight:bolder!important}.font-italic{font-style:italic!important}.text-white{color:#fff!important}.text-primary{color:#4040c8!important}a.text-primary:focus,a.text-primary:hover{color:#2a2a92!important}.text-secondary{color:#4b5563!important}a.text-secondary:focus,a.text-secondary:hover{color:#2a3037!important}.text-success{color:#059669!important}a.text-success:focus,a.text-success:hover{color:#034c35!important}.text-info{color:#2563eb!important}a.text-info:focus,a.text-info:hover{color:#1043b3!important}.text-warning{color:#d97706!important}a.text-warning:focus,a.text-warning:hover{color:#8f4e04!important}.text-danger{color:#dc2626!important}a.text-danger:focus,a.text-danger:hover{color:#9c1919!important}.text-light{color:#f3f4f6!important}a.text-light:focus,a.text-light:hover{color:#c7ccd5!important}.text-dark{color:#1f2937!important}a.text-dark:focus,a.text-dark:hover{color:#030506!important}.text-body{color:#111827!important}.text-muted{color:#6b7280!important}.text-black-50{color:rgba(0,0,0,.5)!important}.text-white-50{color:hsla(0,0%,100%,.5)!important}.text-hide{background-color:transparent;border:0;color:transparent;font:0/0 a;text-shadow:none}.text-decoration-none{text-decoration:none!important}.text-break{word-wrap:break-word!important;word-break:break-word!important}.text-reset{color:inherit!important}.visible{visibility:visible!important}.invisible{visibility:hidden!important}@media print{*,:after,:before{box-shadow:none!important;text-shadow:none!important}a:not(.btn){text-decoration:underline}abbr[title]:after{content:" (" attr(title) ")"}pre{white-space:pre-wrap!important}blockquote,pre{border:1px solid #6b7280}blockquote,img,pre,tr{page-break-inside:avoid}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}@page{size:a3}.container,body{min-width:9px!important}.navbar{display:none}.badge{border:1px solid #000}.table{border-collapse:collapse!important}.table td,.table th{background-color:#fff!important}.table-bordered td,.table-bordered th{border:1px solid #d1d5db!important}.table-dark{color:inherit}.table-dark tbody+tbody,.table-dark td,.table-dark th,.table-dark thead th{border-color:#e5e7eb}.table .thead-dark th{border-color:#e5e7eb;color:inherit}}.vjs-tree{color:#bfc7d5!important;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}.vjs-tree .vjs-tree__content{border-left:1px dotted hsla(0,0%,80%,.28)!important}.vjs-tree .vjs-tree__node{cursor:pointer}.vjs-tree .vjs-tree__node:hover{color:#20a0ff}.vjs-tree .vjs-checkbox{left:-30px;position:absolute}.vjs-tree .vjs-value__boolean,.vjs-tree .vjs-value__null,.vjs-tree .vjs-value__number{color:#a291f5!important}.vjs-tree .vjs-value__string{color:#c3e88d!important}.vjs-tree .vjs-key{color:#c3cbd3!important}.hljs-addition,.hljs-attr,.hljs-keyword,.hljs-selector-tag{color:#13ce66}.hljs-bullet,.hljs-meta,.hljs-name,.hljs-string,.hljs-symbol,.hljs-template-tag,.hljs-template-variable,.hljs-type,.hljs-variable{color:#c3e88d}.hljs-comment,.hljs-deletion,.hljs-quote{color:#bfcbd9}.hljs-literal,.hljs-number,.hljs-title{color:#a291f5!important}body{padding-bottom:20px}.container{max-width:1440px}html{min-width:1140px}[v-cloak]{display:none}svg.icon{height:1rem;width:1rem}.header{border-bottom:1px solid #e5e7eb}.header .logo{color:#374151;text-decoration:none}.header .logo svg{height:1.7rem;width:1.7rem}.sidebar .nav-item a{border-radius:6px;color:#4b5563;margin-bottom:4px;padding:.5rem .75rem}.sidebar .nav-item a svg{fill:#9ca3af;height:1.25rem;margin-right:15px;width:1.25rem}.sidebar .nav-item a.active,.sidebar .nav-item a:hover{background-color:#e5e7eb;color:#4040c8}.sidebar .nav-item a.active svg{fill:#4040c8}.card{border:none;box-shadow:0 4px 6px -1px rgba(0,0,0,.1),0 2px 4px -2px rgba(0,0,0,.1)}.card .bottom-radius{border-bottom-left-radius:6px;border-bottom-right-radius:6px}.card .card-header{background-color:#fff;border-bottom:none;min-height:60px;padding-bottom:.7rem;padding-top:.7rem}.card .card-header .btn-group .btn{padding:.2rem .5rem}.card .card-header .form-control-with-icon{position:relative}.card .card-header .form-control-with-icon .icon-wrapper{align-items:center;bottom:0;display:flex;justify-content:center;left:.75rem;position:absolute;top:0}.card .card-header .form-control-with-icon .icon-wrapper .icon{fill:#6b7280}.card .card-header .form-control-with-icon .form-control{border-radius:9999px;font-size:.875rem;padding-left:2.25rem}.card .table td,.card .table th{padding:.75rem 1.25rem}.card .table th{background-color:#f3f4f6;border-bottom:0;font-size:.875rem;padding:.5rem 1.25rem}.card .table:not(.table-borderless) td{border-top:1px solid #e5e7eb}.card .table.penultimate-column-right td:nth-last-child(2),.card .table.penultimate-column-right th:nth-last-child(2){text-align:right}.card .table td.table-fit,.card .table th.table-fit{white-space:nowrap;width:1%}.fill-text-color{fill:#111827}.fill-danger{fill:#dc2626}.fill-warning{fill:#d97706}.fill-info{fill:#2563eb}.fill-success{fill:#059669}.fill-primary{fill:#4040c8}button:hover .fill-primary{fill:#fff}.btn-outline-primary.active .fill-primary{fill:#f3f4f6}.btn-outline-primary:not(:disabled):not(.disabled).active:focus{box-shadow:none!important}.btn-muted{background:#e5e7eb;color:#4b5563}.btn-muted:focus,.btn-muted:hover{background:#d1d5db;color:#111827}.btn-muted.active{background:#4040c8;color:#fff}.badge-secondary{background:#e5e7eb;color:#4b5563}.badge-success{background:#d1fae5;color:#059669}.badge-info{background:#dbeafe;color:#2563eb}.badge-warning{background:#fef3c7;color:#d97706}.badge-danger{background:#fee2e2;color:#dc2626}.control-action svg{fill:#d1d5db;height:1.2rem;width:1.2rem}.control-action svg:hover{fill:#4f46e5}@keyframes spin{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.spin{animation:spin 2s linear infinite}.card .nav-pills{background:#fff}.card .nav-pills .nav-link{border-radius:0;color:#4b5563;font-size:.9rem;padding:.75rem 1.25rem}.card .nav-pills .nav-link:focus,.card .nav-pills .nav-link:hover{color:#1f2937}.card .nav-pills .nav-link.active{background:none;border-bottom:2px solid #4f46e5;color:#4f46e5}.list-enter-active:not(.dontanimate){transition:background 1s linear}.list-enter:not(.dontanimate),.list-leave-to:not(.dontanimate){background:#eef2ff}.code-bg .list-enter:not(.dontanimate),.code-bg .list-leave-to:not(.dontanimate){background:#4b5563}#indexScreen td{vertical-align:middle!important}.card-bg-secondary{background:#f3f4f6}.code-bg{background:#292d3e}.disabled-watcher{background:#dc2626;color:#fff;padding:.75rem}.copy-to-clipboard{--tw-text-opacity:1;color:rgb(231 232 242/var(--tw-text-opacity));opacity:.7;outline:2px solid transparent;outline-offset:2px;position:absolute;right:0;top:0;z-index:10} diff --git a/public/vendor/telescope/app.js b/public/vendor/telescope/app.js index 778774921..e5d173afc 100644 --- a/public/vendor/telescope/app.js +++ b/public/vendor/telescope/app.js @@ -1,2 +1,2 @@ /*! For license information please see app.js.LICENSE.txt */ -(()=>{var t,e={2465:(t,e,n)=>{"use strict";var o=Object.freeze({}),p=Array.isArray;function M(t){return null==t}function b(t){return null!=t}function c(t){return!0===t}function r(t){return"string"==typeof t||"number"==typeof t||"symbol"==typeof t||"boolean"==typeof t}function z(t){return"function"==typeof t}function a(t){return null!==t&&"object"==typeof t}var i=Object.prototype.toString;function O(t){return"[object Object]"===i.call(t)}function s(t){return"[object RegExp]"===i.call(t)}function A(t){var e=parseFloat(String(t));return e>=0&&Math.floor(e)===e&&isFinite(t)}function u(t){return b(t)&&"function"==typeof t.then&&"function"==typeof t.catch}function l(t){return null==t?"":Array.isArray(t)||O(t)&&t.toString===i?JSON.stringify(t,null,2):String(t)}function d(t){var e=parseFloat(t);return isNaN(e)?t:e}function f(t,e){for(var n=Object.create(null),o=t.split(","),p=0;p-1)return t.splice(o,1)}}var v=Object.prototype.hasOwnProperty;function R(t,e){return v.call(t,e)}function m(t){var e=Object.create(null);return function(n){return e[n]||(e[n]=t(n))}}var g=/-(\w)/g,L=m((function(t){return t.replace(g,(function(t,e){return e?e.toUpperCase():""}))})),y=m((function(t){return t.charAt(0).toUpperCase()+t.slice(1)})),_=/\B([A-Z])/g,N=m((function(t){return t.replace(_,"-$1").toLowerCase()}));var E=Function.prototype.bind?function(t,e){return t.bind(e)}:function(t,e){function n(n){var o=arguments.length;return o?o>1?t.apply(e,arguments):t.call(e,n):t.call(e)}return n._length=t.length,n};function T(t,e){e=e||0;for(var n=t.length-e,o=new Array(n);n--;)o[n]=t[n+e];return o}function B(t,e){for(var n in e)t[n]=e[n];return t}function C(t){for(var e={},n=0;n0,tt=Q&&Q.indexOf("edge/")>0;Q&&Q.indexOf("android");var et=Q&&/iphone|ipad|ipod|ios/.test(Q);Q&&/chrome\/\d+/.test(Q),Q&&/phantomjs/.test(Q);var nt,ot=Q&&Q.match(/firefox\/(\d+)/),pt={}.watch,Mt=!1;if(K)try{var bt={};Object.defineProperty(bt,"passive",{get:function(){Mt=!0}}),window.addEventListener("test-passive",null,bt)}catch(t){}var ct=function(){return void 0===nt&&(nt=!K&&void 0!==n.g&&(n.g.process&&"server"===n.g.process.env.VUE_ENV)),nt},rt=K&&window.__VUE_DEVTOOLS_GLOBAL_HOOK__;function zt(t){return"function"==typeof t&&/native code/.test(t.toString())}var at,it="undefined"!=typeof Symbol&&zt(Symbol)&&"undefined"!=typeof Reflect&&zt(Reflect.ownKeys);at="undefined"!=typeof Set&&zt(Set)?Set:function(){function t(){this.set=Object.create(null)}return t.prototype.has=function(t){return!0===this.set[t]},t.prototype.add=function(t){this.set[t]=!0},t.prototype.clear=function(){this.set=Object.create(null)},t}();var Ot=null;function st(t){void 0===t&&(t=null),t||Ot&&Ot._scope.off(),Ot=t,t&&t._scope.on()}var At=function(){function t(t,e,n,o,p,M,b,c){this.tag=t,this.data=e,this.children=n,this.text=o,this.elm=p,this.ns=void 0,this.context=M,this.fnContext=void 0,this.fnOptions=void 0,this.fnScopeId=void 0,this.key=e&&e.key,this.componentOptions=b,this.componentInstance=void 0,this.parent=void 0,this.raw=!1,this.isStatic=!1,this.isRootInsert=!0,this.isComment=!1,this.isCloned=!1,this.isOnce=!1,this.asyncFactory=c,this.asyncMeta=void 0,this.isAsyncPlaceholder=!1}return Object.defineProperty(t.prototype,"child",{get:function(){return this.componentInstance},enumerable:!1,configurable:!0}),t}(),ut=function(t){void 0===t&&(t="");var e=new At;return e.text=t,e.isComment=!0,e};function lt(t){return new At(void 0,void 0,void 0,String(t))}function dt(t){var e=new At(t.tag,t.data,t.children&&t.children.slice(),t.text,t.elm,t.context,t.componentOptions,t.asyncFactory);return e.ns=t.ns,e.isStatic=t.isStatic,e.key=t.key,e.isComment=t.isComment,e.fnContext=t.fnContext,e.fnOptions=t.fnOptions,e.fnScopeId=t.fnScopeId,e.asyncMeta=t.asyncMeta,e.isCloned=!0,e}var ft=0,qt=[],ht=function(){for(var t=0;t0&&(Vt((o=Kt(o,"".concat(e||"","_").concat(n)))[0])&&Vt(a)&&(i[z]=lt(a.text+o[0].text),o.shift()),i.push.apply(i,o)):r(o)?Vt(a)?i[z]=lt(a.text+o):""!==o&&i.push(lt(o)):Vt(o)&&Vt(a)?i[z]=lt(a.text+o.text):(c(t._isVList)&&b(o.tag)&&M(o.key)&&b(e)&&(o.key="__vlist".concat(e,"_").concat(n,"__")),i.push(o)));return i}var Qt=1,Jt=2;function Zt(t,e,n,o,M,i){return(p(n)||r(n))&&(M=o,o=n,n=void 0),c(i)&&(M=Jt),function(t,e,n,o,M){if(b(n)&&b(n.__ob__))return ut();b(n)&&b(n.is)&&(e=n.is);if(!e)return ut();0;p(o)&&z(o[0])&&((n=n||{}).scopedSlots={default:o[0]},o.length=0);M===Jt?o=$t(o):M===Qt&&(o=function(t){for(var e=0;e0,c=e?!!e.$stable:!b,r=e&&e.$key;if(e){if(e._normalized)return e._normalized;if(c&&p&&p!==o&&r===p.$key&&!b&&!p.$hasNormal)return p;for(var z in M={},e)e[z]&&"$"!==z[0]&&(M[z]=he(t,n,z,e[z]))}else M={};for(var a in n)a in M||(M[a]=We(n,a));return e&&Object.isExtensible(e)&&(e._normalized=M),Y(M,"$stable",c),Y(M,"$key",r),Y(M,"$hasNormal",b),M}function he(t,e,n,o){var M=function(){var e=Ot;st(t);var n=arguments.length?o.apply(null,arguments):o({}),M=(n=n&&"object"==typeof n&&!p(n)?[n]:$t(n))&&n[0];return st(e),n&&(!M||1===n.length&&M.isComment&&!fe(M))?void 0:n};return o.proxy&&Object.defineProperty(e,n,{get:M,enumerable:!0,configurable:!0}),M}function We(t,e){return function(){return t[e]}}function ve(t){return{get attrs(){if(!t._attrsProxy){var e=t._attrsProxy={};Y(e,"_v_attr_proxy",!0),Re(e,t.$attrs,o,t,"$attrs")}return t._attrsProxy},get listeners(){t._listenersProxy||Re(t._listenersProxy={},t.$listeners,o,t,"$listeners");return t._listenersProxy},get slots(){return function(t){t._slotsProxy||ge(t._slotsProxy={},t.$scopedSlots);return t._slotsProxy}(t)},emit:E(t.$emit,t),expose:function(e){e&&Object.keys(e).forEach((function(n){return Ut(t,e,n)}))}}}function Re(t,e,n,o,p){var M=!1;for(var b in e)b in t?e[b]!==n[b]&&(M=!0):(M=!0,me(t,b,o,p));for(var b in t)b in e||(M=!0,delete t[b]);return M}function me(t,e,n,o){Object.defineProperty(t,e,{enumerable:!0,configurable:!0,get:function(){return n[o][e]}})}function ge(t,e){for(var n in e)t[n]=e[n];for(var n in t)n in e||delete t[n]}var Le,ye=null;function _e(t,e){return(t.__esModule||it&&"Module"===t[Symbol.toStringTag])&&(t=t.default),a(t)?e.extend(t):t}function Ne(t){if(p(t))for(var e=0;edocument.createEvent("Event").timeStamp&&(Ye=function(){return $e.now()})}var Ve=function(t,e){if(t.post){if(!e.post)return 1}else if(e.post)return-1;return t.id-e.id};function Ke(){var t,e;for(Ge=Ye(),He=!0,De.sort(Ve),Fe=0;FeFe&&De[n].id>t.id;)n--;De.splice(n+1,0,t)}else De.push(t);je||(je=!0,ln(Ke))}}var Je="watcher";"".concat(Je," callback"),"".concat(Je," getter"),"".concat(Je," cleanup");var Ze;var tn=function(){function t(t){void 0===t&&(t=!1),this.detached=t,this.active=!0,this.effects=[],this.cleanups=[],this.parent=Ze,!t&&Ze&&(this.index=(Ze.scopes||(Ze.scopes=[])).push(this)-1)}return t.prototype.run=function(t){if(this.active){var e=Ze;try{return Ze=this,t()}finally{Ze=e}}else 0},t.prototype.on=function(){Ze=this},t.prototype.off=function(){Ze=this.parent},t.prototype.stop=function(t){if(this.active){var e=void 0,n=void 0;for(e=0,n=this.effects.length;e-1)if(M&&!R(p,"default"))b=!1;else if(""===b||b===N(t)){var r=eo(String,p.type);(r<0||c-1:"string"==typeof t?t.split(",").indexOf(e)>-1:!!s(t)&&t.test(e)}function bo(t,e){var n=t.cache,o=t.keys,p=t._vnode;for(var M in n){var b=n[M];if(b){var c=b.name;c&&!e(c)&&co(n,M,o,p)}}}function co(t,e,n,o){var p=t[e];!p||o&&p.tag===o.tag||p.componentInstance.$destroy(),t[e]=null,W(n,e)}!function(t){t.prototype._init=function(t){var e=this;e._uid=Bn++,e._isVue=!0,e.__v_skip=!0,e._scope=new tn(!0),e._scope._vm=!0,t&&t._isComponent?function(t,e){var n=t.$options=Object.create(t.constructor.options),o=e._parentVnode;n.parent=e.parent,n._parentVnode=o;var p=o.componentOptions;n.propsData=p.propsData,n._parentListeners=p.listeners,n._renderChildren=p.children,n._componentTag=p.tag,e.render&&(n.render=e.render,n.staticRenderFns=e.staticRenderFns)}(e,t):e.$options=Vn(Cn(e.constructor),t||{},e),e._renderProxy=e,e._self=e,function(t){var e=t.$options,n=e.parent;if(n&&!e.abstract){for(;n.$options.abstract&&n.$parent;)n=n.$parent;n.$children.push(t)}t.$parent=n,t.$root=n?n.$root:t,t.$children=[],t.$refs={},t._provided=n?n._provided:Object.create(null),t._watcher=null,t._inactive=null,t._directInactive=!1,t._isMounted=!1,t._isDestroyed=!1,t._isBeingDestroyed=!1}(e),function(t){t._events=Object.create(null),t._hasHookEvent=!1;var e=t.$options._parentListeners;e&&Ce(t,e)}(e),function(t){t._vnode=null,t._staticTrees=null;var e=t.$options,n=t.$vnode=e._parentVnode,p=n&&n.context;t.$slots=le(e._renderChildren,p),t.$scopedSlots=n?qe(t.$parent,n.data.scopedSlots,t.$slots):o,t._c=function(e,n,o,p){return Zt(t,e,n,o,p,!1)},t.$createElement=function(e,n,o,p){return Zt(t,e,n,o,p,!0)};var M=n&&n.data;wt(t,"$attrs",M&&M.attrs||o,null,!0),wt(t,"$listeners",e._parentListeners||o,null,!0)}(e),Ie(e,"beforeCreate",void 0,!1),function(t){var e=Tn(t.$options.inject,t);e&&(Et(!1),Object.keys(e).forEach((function(n){wt(t,n,e[n])})),Et(!0))}(e),gn(e),function(t){var e=t.$options.provide;if(e){var n=z(e)?e.call(t):e;if(!a(n))return;for(var o=en(t),p=it?Reflect.ownKeys(n):Object.keys(n),M=0;M1?T(n):n;for(var o=T(arguments,1),p='event handler for "'.concat(t,'"'),M=0,b=n.length;MparseInt(this.max)&&co(e,n[0],n,this._vnode),this.vnodeToCache=null}}},created:function(){this.cache=Object.create(null),this.keys=[]},destroyed:function(){for(var t in this.cache)co(this.cache,t,this.keys)},mounted:function(){var t=this;this.cacheVNode(),this.$watch("include",(function(e){bo(t,(function(t){return Mo(e,t)}))})),this.$watch("exclude",(function(e){bo(t,(function(t){return!Mo(e,t)}))}))},updated:function(){this.cacheVNode()},render:function(){var t=this.$slots.default,e=Ne(t),n=e&&e.componentOptions;if(n){var o=po(n),p=this.include,M=this.exclude;if(p&&(!o||!Mo(p,o))||M&&o&&Mo(M,o))return e;var b=this.cache,c=this.keys,r=null==e.key?n.Ctor.cid+(n.tag?"::".concat(n.tag):""):e.key;b[r]?(e.componentInstance=b[r].componentInstance,W(c,r),c.push(r)):(this.vnodeToCache=e,this.keyToCache=r),e.data.keepAlive=!0}return e||t&&t[0]}},ao={KeepAlive:zo};!function(t){var e={get:function(){return H}};Object.defineProperty(t,"config",e),t.util={warn:Un,extend:B,mergeOptions:Vn,defineReactive:wt},t.set=St,t.delete=Xt,t.nextTick=ln,t.observable=function(t){return Ct(t),t},t.options=Object.create(null),U.forEach((function(e){t.options[e+"s"]=Object.create(null)})),t.options._base=t,B(t.options.components,ao),function(t){t.use=function(t){var e=this._installedPlugins||(this._installedPlugins=[]);if(e.indexOf(t)>-1)return this;var n=T(arguments,1);return n.unshift(this),z(t.install)?t.install.apply(t,n):z(t)&&t.apply(null,n),e.push(t),this}}(t),function(t){t.mixin=function(t){return this.options=Vn(this.options,t),this}}(t),oo(t),function(t){U.forEach((function(e){t[e]=function(t,n){return n?("component"===e&&O(n)&&(n.name=n.name||t,n=this.options._base.extend(n)),"directive"===e&&z(n)&&(n={bind:n,update:n}),this.options[e+"s"][t]=n,n):this.options[e+"s"][t]}}))}(t)}(no),Object.defineProperty(no.prototype,"$isServer",{get:ct}),Object.defineProperty(no.prototype,"$ssrContext",{get:function(){return this.$vnode&&this.$vnode.ssrContext}}),Object.defineProperty(no,"FunctionalRenderContext",{value:wn}),no.version="2.7.14";var io=f("style,class"),Oo=f("input,textarea,option,select,progress"),so=function(t,e,n){return"value"===n&&Oo(t)&&"button"!==e||"selected"===n&&"option"===t||"checked"===n&&"input"===t||"muted"===n&&"video"===t},Ao=f("contenteditable,draggable,spellcheck"),uo=f("events,caret,typing,plaintext-only"),lo=function(t,e){return vo(e)||"false"===e?"false":"contenteditable"===t&&uo(e)?e:"true"},fo=f("allowfullscreen,async,autofocus,autoplay,checked,compact,controls,declare,default,defaultchecked,defaultmuted,defaultselected,defer,disabled,enabled,formnovalidate,hidden,indeterminate,inert,ismap,itemscope,loop,multiple,muted,nohref,noresize,noshade,novalidate,nowrap,open,pauseonexit,readonly,required,reversed,scoped,seamless,selected,sortable,truespeed,typemustmatch,visible"),qo="http://www.w3.org/1999/xlink",ho=function(t){return":"===t.charAt(5)&&"xlink"===t.slice(0,5)},Wo=function(t){return ho(t)?t.slice(6,t.length):""},vo=function(t){return null==t||!1===t};function Ro(t){for(var e=t.data,n=t,o=t;b(o.componentInstance);)(o=o.componentInstance._vnode)&&o.data&&(e=mo(o.data,e));for(;b(n=n.parent);)n&&n.data&&(e=mo(e,n.data));return function(t,e){if(b(t)||b(e))return go(t,Lo(e));return""}(e.staticClass,e.class)}function mo(t,e){return{staticClass:go(t.staticClass,e.staticClass),class:b(t.class)?[t.class,e.class]:e.class}}function go(t,e){return t?e?t+" "+e:t:e||""}function Lo(t){return Array.isArray(t)?function(t){for(var e,n="",o=0,p=t.length;o-1?Jo(t,e,n):fo(e)?vo(n)?t.removeAttribute(e):(n="allowfullscreen"===e&&"EMBED"===t.tagName?"true":e,t.setAttribute(e,n)):Ao(e)?t.setAttribute(e,lo(e,n)):ho(e)?vo(n)?t.removeAttributeNS(qo,Wo(e)):t.setAttributeNS(qo,e,n):Jo(t,e,n)}function Jo(t,e,n){if(vo(n))t.removeAttribute(e);else{if(J&&!Z&&"TEXTAREA"===t.tagName&&"placeholder"===e&&""!==n&&!t.__ieph){var o=function(e){e.stopImmediatePropagation(),t.removeEventListener("input",o)};t.addEventListener("input",o),t.__ieph=!0}t.setAttribute(e,n)}}var Zo={create:Ko,update:Ko};function tp(t,e){var n=e.elm,o=e.data,p=t.data;if(!(M(o.staticClass)&&M(o.class)&&(M(p)||M(p.staticClass)&&M(p.class)))){var c=Ro(e),r=n._transitionClasses;b(r)&&(c=go(c,Lo(r))),c!==n._prevClass&&(n.setAttribute("class",c),n._prevClass=c)}}var ep,np,op,pp,Mp,bp,cp={create:tp,update:tp},rp=/[\w).+\-_$\]]/;function zp(t){var e,n,o,p,M,b=!1,c=!1,r=!1,z=!1,a=0,i=0,O=0,s=0;for(o=0;o=0&&" "===(u=t.charAt(A));A--);u&&rp.test(u)||(z=!0)}}else void 0===p?(s=o+1,p=t.slice(0,o).trim()):l();function l(){(M||(M=[])).push(t.slice(s,o).trim()),s=o+1}if(void 0===p?p=t.slice(0,o).trim():0!==s&&l(),M)for(o=0;o-1?{exp:t.slice(0,pp),key:'"'+t.slice(pp+1)+'"'}:{exp:t,key:null};np=t,pp=Mp=bp=0;for(;!Lp();)yp(op=gp())?Np(op):91===op&&_p(op);return{exp:t.slice(0,Mp),key:t.slice(Mp+1,bp)}}(t);return null===n.key?"".concat(t,"=").concat(e):"$set(".concat(n.exp,", ").concat(n.key,", ").concat(e,")")}function gp(){return np.charCodeAt(++pp)}function Lp(){return pp>=ep}function yp(t){return 34===t||39===t}function _p(t){var e=1;for(Mp=pp;!Lp();)if(yp(t=gp()))Np(t);else if(91===t&&e++,93===t&&e--,0===e){bp=pp;break}}function Np(t){for(var e=t;!Lp()&&(t=gp())!==e;);}var Ep,Tp="__r",Bp="__c";function Cp(t,e,n){var o=Ep;return function p(){null!==e.apply(null,arguments)&&Xp(t,p,n,o)}}var wp=cn&&!(ot&&Number(ot[1])<=53);function Sp(t,e,n,o){if(wp){var p=Ge,M=e;e=M._wrapper=function(t){if(t.target===t.currentTarget||t.timeStamp>=p||t.timeStamp<=0||t.target.ownerDocument!==document)return M.apply(this,arguments)}}Ep.addEventListener(t,e,Mt?{capture:n,passive:o}:n)}function Xp(t,e,n,o){(o||Ep).removeEventListener(t,e._wrapper||e,n)}function xp(t,e){if(!M(t.data.on)||!M(e.data.on)){var n=e.data.on||{},o=t.data.on||{};Ep=e.elm||t.elm,function(t){if(b(t[Tp])){var e=J?"change":"input";t[e]=[].concat(t[Tp],t[e]||[]),delete t[Tp]}b(t[Bp])&&(t.change=[].concat(t[Bp],t.change||[]),delete t[Bp])}(n),Ft(n,o,Sp,Xp,Cp,e.context),Ep=void 0}}var kp,Ip={create:xp,update:xp,destroy:function(t){return xp(t,Io)}};function Dp(t,e){if(!M(t.data.domProps)||!M(e.data.domProps)){var n,o,p=e.elm,r=t.data.domProps||{},z=e.data.domProps||{};for(n in(b(z.__ob__)||c(z._v_attr_proxy))&&(z=e.data.domProps=B({},z)),r)n in z||(p[n]="");for(n in z){if(o=z[n],"textContent"===n||"innerHTML"===n){if(e.children&&(e.children.length=0),o===r[n])continue;1===p.childNodes.length&&p.removeChild(p.childNodes[0])}if("value"===n&&"PROGRESS"!==p.tagName){p._value=o;var a=M(o)?"":String(o);Pp(p,a)&&(p.value=a)}else if("innerHTML"===n&&No(p.tagName)&&M(p.innerHTML)){(kp=kp||document.createElement("div")).innerHTML="".concat(o,"");for(var i=kp.firstChild;p.firstChild;)p.removeChild(p.firstChild);for(;i.firstChild;)p.appendChild(i.firstChild)}else if(o!==r[n])try{p[n]=o}catch(t){}}}}function Pp(t,e){return!t.composing&&("OPTION"===t.tagName||function(t,e){var n=!0;try{n=document.activeElement!==t}catch(t){}return n&&t.value!==e}(t,e)||function(t,e){var n=t.value,o=t._vModifiers;if(b(o)){if(o.number)return d(n)!==d(e);if(o.trim)return n.trim()!==e.trim()}return n!==e}(t,e))}var Up={create:Dp,update:Dp},jp=m((function(t){var e={},n=/:(.+)/;return t.split(/;(?![^(]*\))/g).forEach((function(t){if(t){var o=t.split(n);o.length>1&&(e[o[0].trim()]=o[1].trim())}})),e}));function Hp(t){var e=Fp(t.style);return t.staticStyle?B(t.staticStyle,e):e}function Fp(t){return Array.isArray(t)?C(t):"string"==typeof t?jp(t):t}var Gp,Yp=/^--/,$p=/\s*!important$/,Vp=function(t,e,n){if(Yp.test(e))t.style.setProperty(e,n);else if($p.test(n))t.style.setProperty(N(e),n.replace($p,""),"important");else{var o=Qp(e);if(Array.isArray(n))for(var p=0,M=n.length;p-1?e.split(tM).forEach((function(e){return t.classList.add(e)})):t.classList.add(e);else{var n=" ".concat(t.getAttribute("class")||""," ");n.indexOf(" "+e+" ")<0&&t.setAttribute("class",(n+e).trim())}}function nM(t,e){if(e&&(e=e.trim()))if(t.classList)e.indexOf(" ")>-1?e.split(tM).forEach((function(e){return t.classList.remove(e)})):t.classList.remove(e),t.classList.length||t.removeAttribute("class");else{for(var n=" ".concat(t.getAttribute("class")||""," "),o=" "+e+" ";n.indexOf(o)>=0;)n=n.replace(o," ");(n=n.trim())?t.setAttribute("class",n):t.removeAttribute("class")}}function oM(t){if(t){if("object"==typeof t){var e={};return!1!==t.css&&B(e,pM(t.name||"v")),B(e,t),e}return"string"==typeof t?pM(t):void 0}}var pM=m((function(t){return{enterClass:"".concat(t,"-enter"),enterToClass:"".concat(t,"-enter-to"),enterActiveClass:"".concat(t,"-enter-active"),leaveClass:"".concat(t,"-leave"),leaveToClass:"".concat(t,"-leave-to"),leaveActiveClass:"".concat(t,"-leave-active")}})),MM=K&&!Z,bM="transition",cM="animation",rM="transition",zM="transitionend",aM="animation",iM="animationend";MM&&(void 0===window.ontransitionend&&void 0!==window.onwebkittransitionend&&(rM="WebkitTransition",zM="webkitTransitionEnd"),void 0===window.onanimationend&&void 0!==window.onwebkitanimationend&&(aM="WebkitAnimation",iM="webkitAnimationEnd"));var OM=K?window.requestAnimationFrame?window.requestAnimationFrame.bind(window):setTimeout:function(t){return t()};function sM(t){OM((function(){OM(t)}))}function AM(t,e){var n=t._transitionClasses||(t._transitionClasses=[]);n.indexOf(e)<0&&(n.push(e),eM(t,e))}function uM(t,e){t._transitionClasses&&W(t._transitionClasses,e),nM(t,e)}function lM(t,e,n){var o=fM(t,e),p=o.type,M=o.timeout,b=o.propCount;if(!p)return n();var c=p===bM?zM:iM,r=0,z=function(){t.removeEventListener(c,a),n()},a=function(e){e.target===t&&++r>=b&&z()};setTimeout((function(){r0&&(n=bM,a=b,i=M.length):e===cM?z>0&&(n=cM,a=z,i=r.length):i=(n=(a=Math.max(b,z))>0?b>z?bM:cM:null)?n===bM?M.length:r.length:0,{type:n,timeout:a,propCount:i,hasTransform:n===bM&&dM.test(o[rM+"Property"])}}function qM(t,e){for(;t.length1}function gM(t,e){!0!==e.data.show&&WM(e)}var LM=function(t){var e,n,o={},z=t.modules,a=t.nodeOps;for(e=0;eA?h(t,M(n[d+1])?null:n[d+1].elm,n,s,d,o):s>d&&v(e,i,A)}(i,u,d,n,z):b(d)?(b(t.text)&&a.setTextContent(i,""),h(i,null,d,0,d.length-1,n)):b(u)?v(u,0,u.length-1):b(t.text)&&a.setTextContent(i,""):t.text!==e.text&&a.setTextContent(i,e.text),b(A)&&b(s=A.hook)&&b(s=s.postpatch)&&s(t,e)}}}function L(t,e,n){if(c(n)&&b(t.parent))t.parent.data.pendingInsert=e;else for(var o=0;o-1,b.selected!==M&&(b.selected=M);else if(x(TM(b),o))return void(t.selectedIndex!==c&&(t.selectedIndex=c));p||(t.selectedIndex=-1)}}function EM(t,e){return e.every((function(e){return!x(e,t)}))}function TM(t){return"_value"in t?t._value:t.value}function BM(t){t.target.composing=!0}function CM(t){t.target.composing&&(t.target.composing=!1,wM(t.target,"input"))}function wM(t,e){var n=document.createEvent("HTMLEvents");n.initEvent(e,!0,!0),t.dispatchEvent(n)}function SM(t){return!t.componentInstance||t.data&&t.data.transition?t:SM(t.componentInstance._vnode)}var XM={bind:function(t,e,n){var o=e.value,p=(n=SM(n)).data&&n.data.transition,M=t.__vOriginalDisplay="none"===t.style.display?"":t.style.display;o&&p?(n.data.show=!0,WM(n,(function(){t.style.display=M}))):t.style.display=o?M:"none"},update:function(t,e,n){var o=e.value;!o!=!e.oldValue&&((n=SM(n)).data&&n.data.transition?(n.data.show=!0,o?WM(n,(function(){t.style.display=t.__vOriginalDisplay})):vM(n,(function(){t.style.display="none"}))):t.style.display=o?t.__vOriginalDisplay:"none")},unbind:function(t,e,n,o,p){p||(t.style.display=t.__vOriginalDisplay)}},xM={model:yM,show:XM},kM={name:String,appear:Boolean,css:Boolean,mode:String,type:String,enterClass:String,leaveClass:String,enterToClass:String,leaveToClass:String,enterActiveClass:String,leaveActiveClass:String,appearClass:String,appearActiveClass:String,appearToClass:String,duration:[Number,String,Object]};function IM(t){var e=t&&t.componentOptions;return e&&e.Ctor.options.abstract?IM(Ne(e.children)):t}function DM(t){var e={},n=t.$options;for(var o in n.propsData)e[o]=t[o];var p=n._parentListeners;for(var o in p)e[L(o)]=p[o];return e}function PM(t,e){if(/\d-keep-alive$/.test(e.tag))return t("keep-alive",{props:e.componentOptions.propsData})}var UM=function(t){return t.tag||fe(t)},jM=function(t){return"show"===t.name},HM={name:"transition",props:kM,abstract:!0,render:function(t){var e=this,n=this.$slots.default;if(n&&(n=n.filter(UM)).length){0;var o=this.mode;0;var p=n[0];if(function(t){for(;t=t.parent;)if(t.data.transition)return!0}(this.$vnode))return p;var M=IM(p);if(!M)return p;if(this._leaving)return PM(t,p);var b="__transition-".concat(this._uid,"-");M.key=null==M.key?M.isComment?b+"comment":b+M.tag:r(M.key)?0===String(M.key).indexOf(b)?M.key:b+M.key:M.key;var c=(M.data||(M.data={})).transition=DM(this),z=this._vnode,a=IM(z);if(M.data.directives&&M.data.directives.some(jM)&&(M.data.show=!0),a&&a.data&&!function(t,e){return e.key===t.key&&e.tag===t.tag}(M,a)&&!fe(a)&&(!a.componentInstance||!a.componentInstance._vnode.isComment)){var i=a.data.transition=B({},c);if("out-in"===o)return this._leaving=!0,Gt(i,"afterLeave",(function(){e._leaving=!1,e.$forceUpdate()})),PM(t,p);if("in-out"===o){if(fe(M))return z;var O,s=function(){O()};Gt(c,"afterEnter",s),Gt(c,"enterCancelled",s),Gt(i,"delayLeave",(function(t){O=t}))}}return p}}},FM=B({tag:String,moveClass:String},kM);delete FM.mode;var GM={props:FM,beforeMount:function(){var t=this,e=this._update;this._update=function(n,o){var p=Se(t);t.__patch__(t._vnode,t.kept,!1,!0),t._vnode=t.kept,p(),e.call(t,n,o)}},render:function(t){for(var e=this.tag||this.$vnode.data.tag||"span",n=Object.create(null),o=this.prevChildren=this.children,p=this.$slots.default||[],M=this.children=[],b=DM(this),c=0;c-1?Bo[t]=e.constructor===window.HTMLUnknownElement||e.constructor===window.HTMLElement:Bo[t]=/HTMLUnknownElement/.test(e.toString())},B(no.options.directives,xM),B(no.options.components,KM),no.prototype.__patch__=K?LM:w,no.prototype.$mount=function(t,e){return function(t,e,n){var o;t.$el=e,t.$options.render||(t.$options.render=ut),Ie(t,"beforeMount"),o=function(){t._update(t._render(),n)},new vn(t,o,w,{before:function(){t._isMounted&&!t._isDestroyed&&Ie(t,"beforeUpdate")}},!0),n=!1;var p=t._preWatchers;if(p)for(var M=0;M\/=]+)(?:\s*(=)\s*(?:"([^"]*)"+|'([^']*)'+|([^\s"'=<>`]+)))?/,rb=/^\s*((?:v-[\w-]+:|@|:|#)\[[^=]+?\][^\s"'<>\/=]*)(?:\s*(=)\s*(?:"([^"]*)"+|'([^']*)'+|([^\s"'=<>`]+)))?/,zb="[a-zA-Z_][\\-\\.0-9_a-zA-Z".concat(F.source,"]*"),ab="((?:".concat(zb,"\\:)?").concat(zb,")"),ib=new RegExp("^<".concat(ab)),Ob=/^\s*(\/?)>/,sb=new RegExp("^<\\/".concat(ab,"[^>]*>")),Ab=/^]+>/i,ub=/^",""":'"',"&":"&"," ":"\n"," ":"\t","'":"'"},hb=/&(?:lt|gt|quot|amp|#39);/g,Wb=/&(?:lt|gt|quot|amp|#39|#10|#9);/g,vb=f("pre,textarea",!0),Rb=function(t,e){return t&&vb(t)&&"\n"===e[0]};function mb(t,e){var n=e?Wb:hb;return t.replace(n,(function(t){return qb[t]}))}function gb(t,e){for(var n,o,p=[],M=e.expectHTML,b=e.isUnaryTag||S,c=e.canBeLeftOpenTag||S,r=0,z=function(){if(n=t,o&&db(o)){var z=0,O=o.toLowerCase(),s=fb[O]||(fb[O]=new RegExp("([\\s\\S]*?)(]*>)","i"));v=t.replace(s,(function(t,n,o){return z=o.length,db(O)||"noscript"===O||(n=n.replace(//g,"$1").replace(//g,"$1")),Rb(O,n)&&(n=n.slice(1)),e.chars&&e.chars(n),""}));r+=t.length-v.length,t=v,i(O,r-z,r)}else{var A=t.indexOf("<");if(0===A){if(ub.test(t)){var u=t.indexOf("--\x3e");if(u>=0)return e.shouldKeepComment&&e.comment&&e.comment(t.substring(4,u),r,r+u+3),a(u+3),"continue"}if(lb.test(t)){var l=t.indexOf("]>");if(l>=0)return a(l+2),"continue"}var d=t.match(Ab);if(d)return a(d[0].length),"continue";var f=t.match(sb);if(f){var q=r;return a(f[0].length),i(f[1],q,r),"continue"}var h=function(){var e=t.match(ib);if(e){var n={tagName:e[1],attrs:[],start:r};a(e[0].length);for(var o=void 0,p=void 0;!(o=t.match(Ob))&&(p=t.match(rb)||t.match(cb));)p.start=r,a(p[0].length),p.end=r,n.attrs.push(p);if(o)return n.unarySlash=o[1],a(o[0].length),n.end=r,n}}();if(h)return function(t){var n=t.tagName,r=t.unarySlash;M&&("p"===o&&bb(n)&&i(o),c(n)&&o===n&&i(n));for(var z=b(n)||!!r,a=t.attrs.length,O=new Array(a),s=0;s=0){for(v=t.slice(A);!(sb.test(v)||ib.test(v)||ub.test(v)||lb.test(v)||(R=v.indexOf("<",1))<0);)A+=R,v=t.slice(A);W=t.substring(0,A)}A<0&&(W=t),W&&a(W.length),e.chars&&W&&e.chars(W,r-W.length,r)}if(t===n)return e.chars&&e.chars(t),"break"};t;){if("break"===z())break}function a(e){r+=e,t=t.substring(e)}function i(t,n,M){var b,c;if(null==n&&(n=r),null==M&&(M=r),t)for(c=t.toLowerCase(),b=p.length-1;b>=0&&p[b].lowerCasedTag!==c;b--);else b=0;if(b>=0){for(var z=p.length-1;z>=b;z--)e.end&&e.end(p[z].tag,n,M);p.length=b,o=b&&p[b-1].tag}else"br"===c?e.start&&e.start(t,[],!0,n,M):"p"===c&&(e.start&&e.start(t,[],!1,n,M),e.end&&e.end(t,n,M))}i()}var Lb,yb,_b,Nb,Eb,Tb,Bb,Cb,wb=/^@|^v-on:/,Sb=/^v-|^@|^:|^#/,Xb=/([\s\S]*?)\s+(?:in|of)\s+([\s\S]*)/,xb=/,([^,\}\]]*)(?:,([^,\}\]]*))?$/,kb=/^\(|\)$/g,Ib=/^\[.*\]$/,Db=/:(.*)$/,Pb=/^:|^\.|^v-bind:/,Ub=/\.[^.\]]+(?=[^\]]*$)/g,jb=/^v-slot(:|$)|^#/,Hb=/[\r\n]/,Fb=/[ \f\t\r\n]+/g,Gb=m(ob),Yb="_empty_";function $b(t,e,n){return{type:1,tag:t,attrsList:e,attrsMap:ec(e),rawAttrsMap:{},parent:n,children:[]}}function Vb(t,e){Lb=e.warn||ip,Tb=e.isPreTag||S,Bb=e.mustUseProp||S,Cb=e.getTagNamespace||S;var n=e.isReservedTag||S;_b=Op(e.modules,"transformNode"),Nb=Op(e.modules,"preTransformNode"),Eb=Op(e.modules,"postTransformNode"),yb=e.delimiters;var o,p,M=[],b=!1!==e.preserveWhitespace,c=e.whitespace,r=!1,z=!1;function a(t){if(i(t),r||t.processed||(t=Kb(t,e)),M.length||t===o||o.if&&(t.elseif||t.else)&&Jb(o,{exp:t.elseif,block:t}),p&&!t.forbidden)if(t.elseif||t.else)b=t,c=function(t){for(var e=t.length;e--;){if(1===t[e].type)return t[e];t.pop()}}(p.children),c&&c.if&&Jb(c,{exp:b.elseif,block:b});else{if(t.slotScope){var n=t.slotTarget||'"default"';(p.scopedSlots||(p.scopedSlots={}))[n]=t}p.children.push(t),t.parent=p}var b,c;t.children=t.children.filter((function(t){return!t.slotScope})),i(t),t.pre&&(r=!1),Tb(t.tag)&&(z=!1);for(var a=0;ar&&(c.push(M=t.slice(r,p)),b.push(JSON.stringify(M)));var z=zp(o[1].trim());b.push("_s(".concat(z,")")),c.push({"@binding":z}),r=p+o[0].length}return r-1")+("true"===M?":(".concat(e,")"):":_q(".concat(e,",").concat(M,")"))),fp(t,"change","var $$a=".concat(e,",")+"$$el=$event.target,"+"$$c=$$el.checked?(".concat(M,"):(").concat(b,");")+"if(Array.isArray($$a)){"+"var $$v=".concat(o?"_n("+p+")":p,",")+"$$i=_i($$a,$$v);"+"if($$el.checked){$$i<0&&(".concat(mp(e,"$$a.concat([$$v])"),")}")+"else{$$i>-1&&(".concat(mp(e,"$$a.slice(0,$$i).concat($$a.slice($$i+1))"),")}")+"}else{".concat(mp(e,"$$c"),"}"),null,!0)}(t,o,p);else if("input"===M&&"radio"===b)!function(t,e,n){var o=n&&n.number,p=qp(t,"value")||"null";p=o?"_n(".concat(p,")"):p,sp(t,"checked","_q(".concat(e,",").concat(p,")")),fp(t,"change",mp(e,p),null,!0)}(t,o,p);else if("input"===M||"textarea"===M)!function(t,e,n){var o=t.attrsMap.type;0;var p=n||{},M=p.lazy,b=p.number,c=p.trim,r=!M&&"range"!==o,z=M?"change":"range"===o?Tp:"input",a="$event.target.value";c&&(a="$event.target.value.trim()");b&&(a="_n(".concat(a,")"));var i=mp(e,a);r&&(i="if($event.target.composing)return;".concat(i));sp(t,"value","(".concat(e,")")),fp(t,z,i,null,!0),(c||b)&&fp(t,"blur","$forceUpdate()")}(t,o,p);else{if(!H.isReservedTag(M))return Rp(t,o,p),!1}return!0},text:function(t,e){e.value&&sp(t,"textContent","_s(".concat(e.value,")"),e)},html:function(t,e){e.value&&sp(t,"innerHTML","_s(".concat(e.value,")"),e)}},ac={expectHTML:!0,modules:bc,directives:zc,isPreTag:function(t){return"pre"===t},isUnaryTag:pb,mustUseProp:so,canBeLeftOpenTag:Mb,isReservedTag:Eo,getTagNamespace:To,staticKeys:function(t){return t.reduce((function(t,e){return t.concat(e.staticKeys||[])}),[]).join(",")}(bc)},ic=m((function(t){return f("type,tag,attrsList,attrsMap,plain,parent,children,attrs,start,end,rawAttrsMap"+(t?","+t:""))}));function Oc(t,e){t&&(cc=ic(e.staticKeys||""),rc=e.isReservedTag||S,sc(t),Ac(t,!1))}function sc(t){if(t.static=function(t){if(2===t.type)return!1;if(3===t.type)return!0;return!(!t.pre&&(t.hasBindings||t.if||t.for||q(t.tag)||!rc(t.tag)||function(t){for(;t.parent;){if("template"!==(t=t.parent).tag)return!1;if(t.for)return!0}return!1}(t)||!Object.keys(t).every(cc)))}(t),1===t.type){if(!rc(t.tag)&&"slot"!==t.tag&&null==t.attrsMap["inline-template"])return;for(var e=0,n=t.children.length;e|^function(?:\s+[\w$]+)?\s*\(/,lc=/\([^)]*?\);*$/,dc=/^[A-Za-z_$][\w$]*(?:\.[A-Za-z_$][\w$]*|\['[^']*?']|\["[^"]*?"]|\[\d+]|\[[A-Za-z_$][\w$]*])*$/,fc={esc:27,tab:9,enter:13,space:32,up:38,left:37,right:39,down:40,delete:[8,46]},qc={esc:["Esc","Escape"],tab:"Tab",enter:"Enter",space:[" ","Spacebar"],up:["Up","ArrowUp"],left:["Left","ArrowLeft"],right:["Right","ArrowRight"],down:["Down","ArrowDown"],delete:["Backspace","Delete","Del"]},hc=function(t){return"if(".concat(t,")return null;")},Wc={stop:"$event.stopPropagation();",prevent:"$event.preventDefault();",self:hc("$event.target !== $event.currentTarget"),ctrl:hc("!$event.ctrlKey"),shift:hc("!$event.shiftKey"),alt:hc("!$event.altKey"),meta:hc("!$event.metaKey"),left:hc("'button' in $event && $event.button !== 0"),middle:hc("'button' in $event && $event.button !== 1"),right:hc("'button' in $event && $event.button !== 2")};function vc(t,e){var n=e?"nativeOn:":"on:",o="",p="";for(var M in t){var b=Rc(t[M]);t[M]&&t[M].dynamic?p+="".concat(M,",").concat(b,","):o+='"'.concat(M,'":').concat(b,",")}return o="{".concat(o.slice(0,-1),"}"),p?n+"_d(".concat(o,",[").concat(p.slice(0,-1),"])"):n+o}function Rc(t){if(!t)return"function(){}";if(Array.isArray(t))return"[".concat(t.map((function(t){return Rc(t)})).join(","),"]");var e=dc.test(t.value),n=uc.test(t.value),o=dc.test(t.value.replace(lc,""));if(t.modifiers){var p="",M="",b=[],c=function(e){if(Wc[e])M+=Wc[e],fc[e]&&b.push(e);else if("exact"===e){var n=t.modifiers;M+=hc(["ctrl","shift","alt","meta"].filter((function(t){return!n[t]})).map((function(t){return"$event.".concat(t,"Key")})).join("||"))}else b.push(e)};for(var r in t.modifiers)c(r);b.length&&(p+=function(t){return"if(!$event.type.indexOf('key')&&"+"".concat(t.map(mc).join("&&"),")return null;")}(b)),M&&(p+=M);var z=e?"return ".concat(t.value,".apply(null, arguments)"):n?"return (".concat(t.value,").apply(null, arguments)"):o?"return ".concat(t.value):t.value;return"function($event){".concat(p).concat(z,"}")}return e||n?t.value:"function($event){".concat(o?"return ".concat(t.value):t.value,"}")}function mc(t){var e=parseInt(t,10);if(e)return"$event.keyCode!==".concat(e);var n=fc[t],o=qc[t];return"_k($event.keyCode,"+"".concat(JSON.stringify(t),",")+"".concat(JSON.stringify(n),",")+"$event.key,"+"".concat(JSON.stringify(o))+")"}var gc={on:function(t,e){t.wrapListeners=function(t){return"_g(".concat(t,",").concat(e.value,")")}},bind:function(t,e){t.wrapData=function(n){return"_b(".concat(n,",'").concat(t.tag,"',").concat(e.value,",").concat(e.modifiers&&e.modifiers.prop?"true":"false").concat(e.modifiers&&e.modifiers.sync?",true":"",")")}},cloak:w},Lc=function(t){this.options=t,this.warn=t.warn||ip,this.transforms=Op(t.modules,"transformCode"),this.dataGenFns=Op(t.modules,"genData"),this.directives=B(B({},gc),t.directives);var e=t.isReservedTag||S;this.maybeComponent=function(t){return!!t.component||!e(t.tag)},this.onceId=0,this.staticRenderFns=[],this.pre=!1};function yc(t,e){var n=new Lc(e),o=t?"script"===t.tag?"null":_c(t,n):'_c("div")';return{render:"with(this){return ".concat(o,"}"),staticRenderFns:n.staticRenderFns}}function _c(t,e){if(t.parent&&(t.pre=t.pre||t.parent.pre),t.staticRoot&&!t.staticProcessed)return Nc(t,e);if(t.once&&!t.onceProcessed)return Ec(t,e);if(t.for&&!t.forProcessed)return Cc(t,e);if(t.if&&!t.ifProcessed)return Tc(t,e);if("template"!==t.tag||t.slotTarget||e.pre){if("slot"===t.tag)return function(t,e){var n=t.slotName||'"default"',o=xc(t,e),p="_t(".concat(n).concat(o?",function(){return ".concat(o,"}"):""),M=t.attrs||t.dynamicAttrs?Dc((t.attrs||[]).concat(t.dynamicAttrs||[]).map((function(t){return{name:L(t.name),value:t.value,dynamic:t.dynamic}}))):null,b=t.attrsMap["v-bind"];!M&&!b||o||(p+=",null");M&&(p+=",".concat(M));b&&(p+="".concat(M?"":",null",",").concat(b));return p+")"}(t,e);var n=void 0;if(t.component)n=function(t,e,n){var o=e.inlineTemplate?null:xc(e,n,!0);return"_c(".concat(t,",").concat(wc(e,n)).concat(o?",".concat(o):"",")")}(t.component,t,e);else{var o=void 0,p=e.maybeComponent(t);(!t.plain||t.pre&&p)&&(o=wc(t,e));var M=void 0,b=e.options.bindings;p&&b&&!1!==b.__isScriptSetup&&(M=function(t,e){var n=L(e),o=y(n),p=function(p){return t[e]===p?e:t[n]===p?n:t[o]===p?o:void 0},M=p("setup-const")||p("setup-reactive-const");if(M)return M;var b=p("setup-let")||p("setup-ref")||p("setup-maybe-ref");if(b)return b}(b,t.tag)),M||(M="'".concat(t.tag,"'"));var c=t.inlineTemplate?null:xc(t,e,!0);n="_c(".concat(M).concat(o?",".concat(o):"").concat(c?",".concat(c):"",")")}for(var r=0;r>>0}(b)):"",")")}(t,t.scopedSlots,e),",")),t.model&&(n+="model:{value:".concat(t.model.value,",callback:").concat(t.model.callback,",expression:").concat(t.model.expression,"},")),t.inlineTemplate){var M=function(t,e){var n=t.children[0];0;if(n&&1===n.type){var o=yc(n,e.options);return"inlineTemplate:{render:function(){".concat(o.render,"},staticRenderFns:[").concat(o.staticRenderFns.map((function(t){return"function(){".concat(t,"}")})).join(","),"]}")}}(t,e);M&&(n+="".concat(M,","))}return n=n.replace(/,$/,"")+"}",t.dynamicAttrs&&(n="_b(".concat(n,',"').concat(t.tag,'",').concat(Dc(t.dynamicAttrs),")")),t.wrapData&&(n=t.wrapData(n)),t.wrapListeners&&(n=t.wrapListeners(n)),n}function Sc(t){return 1===t.type&&("slot"===t.tag||t.children.some(Sc))}function Xc(t,e){var n=t.attrsMap["slot-scope"];if(t.if&&!t.ifProcessed&&!n)return Tc(t,e,Xc,"null");if(t.for&&!t.forProcessed)return Cc(t,e,Xc);var o=t.slotScope===Yb?"":String(t.slotScope),p="function(".concat(o,"){")+"return ".concat("template"===t.tag?t.if&&n?"(".concat(t.if,")?").concat(xc(t,e)||"undefined",":undefined"):xc(t,e)||"undefined":_c(t,e),"}"),M=o?"":",proxy:true";return"{key:".concat(t.slotTarget||'"default"',",fn:").concat(p).concat(M,"}")}function xc(t,e,n,o,p){var M=t.children;if(M.length){var b=M[0];if(1===M.length&&b.for&&"template"!==b.tag&&"slot"!==b.tag){var c=n?e.maybeComponent(b)?",1":",0":"";return"".concat((o||_c)(b,e)).concat(c)}var r=n?function(t,e){for(var n=0,o=0;o':'
',Fc.innerHTML.indexOf(" ")>0}var Vc=!!K&&$c(!1),Kc=!!K&&$c(!0),Qc=m((function(t){var e=wo(t);return e&&e.innerHTML})),Jc=no.prototype.$mount;no.prototype.$mount=function(t,e){if((t=t&&wo(t))===document.body||t===document.documentElement)return this;var n=this.$options;if(!n.render){var o=n.template;if(o)if("string"==typeof o)"#"===o.charAt(0)&&(o=Qc(o));else{if(!o.nodeType)return this;o=o.innerHTML}else t&&(o=function(t){if(t.outerHTML)return t.outerHTML;var e=document.createElement("div");return e.appendChild(t.cloneNode(!0)),e.innerHTML}(t));if(o){0;var p=Yc(o,{outputSourceRange:!1,shouldDecodeNewlines:Vc,shouldDecodeNewlinesForHref:Kc,delimiters:n.delimiters,comments:n.comments},this),M=p.render,b=p.staticRenderFns;n.render=M,n.staticRenderFns=b}}return Jc.call(this,t,e)},no.compile=Yc;var Zc=n(2543),tr=n.n(Zc),er=n(4743),nr=n.n(er);const or={computed:{Telescope:function(t){function e(){return t.apply(this,arguments)}return e.toString=function(){return t.toString()},e}((function(){return Telescope}))},methods:{timeAgo:function(t){nr().updateLocale("en",{relativeTime:{future:"in %s",past:"%s ago",s:function(t){return t+"s ago"},ss:"%ds ago",m:"1m ago",mm:"%dm ago",h:"1h ago",hh:"%dh ago",d:"1d ago",dd:"%dd ago",M:"a month ago",MM:"%d months ago",y:"a year ago",yy:"%d years ago"}});var e=nr()().diff(t,"seconds"),n=nr()("2018-01-01").startOf("day").seconds(e);return e>300?nr()(t).fromNow(!0):e<60?n.format("s")+"s ago":n.format("m:ss")+"m ago"},localTime:function(t){return nr()(t).local().format("MMMM Do YYYY, h:mm:ss A")},truncate:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:70;return tr().truncate(t,{length:e,separator:/,? +/})},debouncer:tr().debounce((function(t){return t()}),500),alertError:function(t){this.$root.alert.type="error",this.$root.alert.autoClose=!1,this.$root.alert.message=t},alertSuccess:function(t,e){this.$root.alert.type="success",this.$root.alert.autoClose=e,this.$root.alert.message=t},alertConfirm:function(t,e,n){this.$root.alert.type="confirmation",this.$root.alert.autoClose=!1,this.$root.alert.message=t,this.$root.alert.confirmationProceed=e,this.$root.alert.confirmationCancel=n}}};var pr=n(4335);const Mr=[{path:"/",redirect:"/requests"},{path:"/mail/:id",name:"mail-preview",component:n(583).A},{path:"/mail",name:"mail",component:n(1574).A},{path:"/exceptions/:id",name:"exception-preview",component:n(3781).A},{path:"/exceptions",name:"exceptions",component:n(2977).A},{path:"/dumps",name:"dumps",component:n(93).A},{path:"/logs/:id",name:"log-preview",component:n(5356).A},{path:"/logs",name:"logs",component:n(8170).A},{path:"/notifications/:id",name:"notification-preview",component:n(5841).A},{path:"/notifications",name:"notifications",component:n(4969).A},{path:"/jobs/:id",name:"job-preview",component:n(8813).A},{path:"/jobs",name:"jobs",component:n(1202).A},{path:"/batches/:id",name:"batch-preview",component:n(9622).A},{path:"/batches",name:"batches",component:n(8888).A},{path:"/events/:id",name:"event-preview",component:n(1119).A},{path:"/events",name:"events",component:n(7380).A},{path:"/cache/:id",name:"cache-preview",component:n(7362).A},{path:"/cache",name:"cache",component:n(8613).A},{path:"/queries/:id",name:"query-preview",component:n(1891).A},{path:"/queries",name:"queries",component:n(5873).A},{path:"/models/:id",name:"model-preview",component:n(5333).A},{path:"/models",name:"models",component:n(9440).A},{path:"/requests/:id",name:"request-preview",component:n(8827).A},{path:"/requests",name:"requests",component:n(2806).A},{path:"/commands/:id",name:"command-preview",component:n(4145).A},{path:"/commands",name:"commands",component:n(346).A},{path:"/schedule/:id",name:"schedule-preview",component:n(9655).A},{path:"/schedule",name:"schedule",component:n(3524).A},{path:"/redis/:id",name:"redis-preview",component:n(6393).A},{path:"/redis",name:"redis",component:n(8872).A},{path:"/monitored-tags",name:"monitored-tags",component:n(5441).A},{path:"/gates/:id",name:"gate-preview",component:n(1905).A},{path:"/gates",name:"gates",component:n(2707).A},{path:"/views/:id",name:"view-preview",component:n(6703).A},{path:"/views",name:"views",component:n(3308).A},{path:"/client-requests/:id",name:"client-request-preview",component:n(6204).A},{path:"/client-requests",name:"client-requests",component:n(5899).A}];function br(t,e){for(var n in e)t[n]=e[n];return t}var cr=/[!'()*]/g,rr=function(t){return"%"+t.charCodeAt(0).toString(16)},zr=/%2C/g,ar=function(t){return encodeURIComponent(t).replace(cr,rr).replace(zr,",")};function ir(t){try{return decodeURIComponent(t)}catch(t){0}return t}var Or=function(t){return null==t||"object"==typeof t?t:String(t)};function sr(t){var e={};return(t=t.trim().replace(/^(\?|#|&)/,""))?(t.split("&").forEach((function(t){var n=t.replace(/\+/g," ").split("="),o=ir(n.shift()),p=n.length>0?ir(n.join("=")):null;void 0===e[o]?e[o]=p:Array.isArray(e[o])?e[o].push(p):e[o]=[e[o],p]})),e):e}function Ar(t){var e=t?Object.keys(t).map((function(e){var n=t[e];if(void 0===n)return"";if(null===n)return ar(e);if(Array.isArray(n)){var o=[];return n.forEach((function(t){void 0!==t&&(null===t?o.push(ar(e)):o.push(ar(e)+"="+ar(t)))})),o.join("&")}return ar(e)+"="+ar(n)})).filter((function(t){return t.length>0})).join("&"):null;return e?"?"+e:""}var ur=/\/?$/;function lr(t,e,n,o){var p=o&&o.options.stringifyQuery,M=e.query||{};try{M=dr(M)}catch(t){}var b={name:e.name||t&&t.name,meta:t&&t.meta||{},path:e.path||"/",hash:e.hash||"",query:M,params:e.params||{},fullPath:hr(e,p),matched:t?qr(t):[]};return n&&(b.redirectedFrom=hr(n,p)),Object.freeze(b)}function dr(t){if(Array.isArray(t))return t.map(dr);if(t&&"object"==typeof t){var e={};for(var n in t)e[n]=dr(t[n]);return e}return t}var fr=lr(null,{path:"/"});function qr(t){for(var e=[];t;)e.unshift(t),t=t.parent;return e}function hr(t,e){var n=t.path,o=t.query;void 0===o&&(o={});var p=t.hash;return void 0===p&&(p=""),(n||"/")+(e||Ar)(o)+p}function Wr(t,e,n){return e===fr?t===e:!!e&&(t.path&&e.path?t.path.replace(ur,"")===e.path.replace(ur,"")&&(n||t.hash===e.hash&&vr(t.query,e.query)):!(!t.name||!e.name)&&(t.name===e.name&&(n||t.hash===e.hash&&vr(t.query,e.query)&&vr(t.params,e.params))))}function vr(t,e){if(void 0===t&&(t={}),void 0===e&&(e={}),!t||!e)return t===e;var n=Object.keys(t).sort(),o=Object.keys(e).sort();return n.length===o.length&&n.every((function(n,p){var M=t[n];if(o[p]!==n)return!1;var b=e[n];return null==M||null==b?M===b:"object"==typeof M&&"object"==typeof b?vr(M,b):String(M)===String(b)}))}function Rr(t){for(var e=0;e=0&&(e=t.slice(o),t=t.slice(0,o));var p=t.indexOf("?");return p>=0&&(n=t.slice(p+1),t=t.slice(0,p)),{path:t,query:n,hash:e}}(p.path||""),z=e&&e.path||"/",a=r.path?Lr(r.path,z,n||p.append):z,i=function(t,e,n){void 0===e&&(e={});var o,p=n||sr;try{o=p(t||"")}catch(t){o={}}for(var M in e){var b=e[M];o[M]=Array.isArray(b)?b.map(Or):Or(b)}return o}(r.query,p.query,o&&o.options.parseQuery),O=p.hash||r.hash;return O&&"#"!==O.charAt(0)&&(O="#"+O),{_normalized:!0,path:a,query:i,hash:O}}var $r,Vr=function(){},Kr={name:"RouterLink",props:{to:{type:[String,Object],required:!0},tag:{type:String,default:"a"},custom:Boolean,exact:Boolean,exactPath:Boolean,append:Boolean,replace:Boolean,activeClass:String,exactActiveClass:String,ariaCurrentValue:{type:String,default:"page"},event:{type:[String,Array],default:"click"}},render:function(t){var e=this,n=this.$router,o=this.$route,p=n.resolve(this.to,o,this.append),M=p.location,b=p.route,c=p.href,r={},z=n.options.linkActiveClass,a=n.options.linkExactActiveClass,i=null==z?"router-link-active":z,O=null==a?"router-link-exact-active":a,s=null==this.activeClass?i:this.activeClass,A=null==this.exactActiveClass?O:this.exactActiveClass,u=b.redirectedFrom?lr(null,Yr(b.redirectedFrom),null,n):b;r[A]=Wr(o,u,this.exactPath),r[s]=this.exact||this.exactPath?r[A]:function(t,e){return 0===t.path.replace(ur,"/").indexOf(e.path.replace(ur,"/"))&&(!e.hash||t.hash===e.hash)&&function(t,e){for(var n in e)if(!(n in t))return!1;return!0}(t.query,e.query)}(o,u);var l=r[A]?this.ariaCurrentValue:null,d=function(t){Qr(t)&&(e.replace?n.replace(M,Vr):n.push(M,Vr))},f={click:Qr};Array.isArray(this.event)?this.event.forEach((function(t){f[t]=d})):f[this.event]=d;var q={class:r},h=!this.$scopedSlots.$hasNormal&&this.$scopedSlots.default&&this.$scopedSlots.default({href:c,route:b,navigate:d,isActive:r[s],isExactActive:r[A]});if(h){if(1===h.length)return h[0];if(h.length>1||!h.length)return 0===h.length?t():t("span",{},h)}if("a"===this.tag)q.on=f,q.attrs={href:c,"aria-current":l};else{var W=Jr(this.$slots.default);if(W){W.isStatic=!1;var v=W.data=br({},W.data);for(var R in v.on=v.on||{},v.on){var m=v.on[R];R in f&&(v.on[R]=Array.isArray(m)?m:[m])}for(var g in f)g in v.on?v.on[g].push(f[g]):v.on[g]=d;var L=W.data.attrs=br({},W.data.attrs);L.href=c,L["aria-current"]=l}else q.on=f}return t(this.tag,q,this.$slots.default)}};function Qr(t){if(!(t.metaKey||t.altKey||t.ctrlKey||t.shiftKey||t.defaultPrevented||void 0!==t.button&&0!==t.button)){if(t.currentTarget&&t.currentTarget.getAttribute){var e=t.currentTarget.getAttribute("target");if(/\b_blank\b/i.test(e))return}return t.preventDefault&&t.preventDefault(),!0}}function Jr(t){if(t)for(var e,n=0;n-1&&(c.params[O]=n.params[O]);return c.path=Gr(a.path,c.params),r(a,c,b)}if(c.path){c.params={};for(var s=0;s-1}function Ez(t,e){return Nz(t)&&t._isRouter&&(null==e||t.type===e)}function Tz(t,e,n){var o=function(p){p>=t.length?n():t[p]?e(t[p],(function(){o(p+1)})):o(p+1)};o(0)}function Bz(t){return function(e,n,o){var p=!1,M=0,b=null;Cz(t,(function(t,e,n,c){if("function"==typeof t&&void 0===t.cid){p=!0,M++;var r,z=Xz((function(e){var p;((p=e).__esModule||Sz&&"Module"===p[Symbol.toStringTag])&&(e=e.default),t.resolved="function"==typeof e?e:$r.extend(e),n.components[c]=e,--M<=0&&o()})),a=Xz((function(t){var e="Failed to resolve async component "+c+": "+t;b||(b=Nz(t)?t:new Error(e),o(b))}));try{r=t(z,a)}catch(t){a(t)}if(r)if("function"==typeof r.then)r.then(z,a);else{var i=r.component;i&&"function"==typeof i.then&&i.then(z,a)}}})),p||o()}}function Cz(t,e){return wz(t.map((function(t){return Object.keys(t.components).map((function(n){return e(t.components[n],t.instances[n],t,n)}))})))}function wz(t){return Array.prototype.concat.apply([],t)}var Sz="function"==typeof Symbol&&"symbol"==typeof Symbol.toStringTag;function Xz(t){var e=!1;return function(){for(var n=[],o=arguments.length;o--;)n[o]=arguments[o];if(!e)return e=!0,t.apply(this,n)}}var xz=function(t,e){this.router=t,this.base=function(t){if(!t)if(Zr){var e=document.querySelector("base");t=(t=e&&e.getAttribute("href")||"/").replace(/^https?:\/\/[^\/]+/,"")}else t="/";"/"!==t.charAt(0)&&(t="/"+t);return t.replace(/\/$/,"")}(e),this.current=fr,this.pending=null,this.ready=!1,this.readyCbs=[],this.readyErrorCbs=[],this.errorCbs=[],this.listeners=[]};function kz(t,e,n,o){var p=Cz(t,(function(t,o,p,M){var b=function(t,e){"function"!=typeof t&&(t=$r.extend(t));return t.options[e]}(t,e);if(b)return Array.isArray(b)?b.map((function(t){return n(t,o,p,M)})):n(b,o,p,M)}));return wz(o?p.reverse():p)}function Iz(t,e){if(e)return function(){return t.apply(e,arguments)}}xz.prototype.listen=function(t){this.cb=t},xz.prototype.onReady=function(t,e){this.ready?t():(this.readyCbs.push(t),e&&this.readyErrorCbs.push(e))},xz.prototype.onError=function(t){this.errorCbs.push(t)},xz.prototype.transitionTo=function(t,e,n){var o,p=this;try{o=this.router.match(t,this.current)}catch(t){throw this.errorCbs.forEach((function(e){e(t)})),t}var M=this.current;this.confirmTransition(o,(function(){p.updateRoute(o),e&&e(o),p.ensureURL(),p.router.afterHooks.forEach((function(t){t&&t(o,M)})),p.ready||(p.ready=!0,p.readyCbs.forEach((function(t){t(o)})))}),(function(t){n&&n(t),t&&!p.ready&&(Ez(t,mz.redirected)&&M===fr||(p.ready=!0,p.readyErrorCbs.forEach((function(e){e(t)}))))}))},xz.prototype.confirmTransition=function(t,e,n){var o=this,p=this.current;this.pending=t;var M,b,c=function(t){!Ez(t)&&Nz(t)&&o.errorCbs.length&&o.errorCbs.forEach((function(e){e(t)})),n&&n(t)},r=t.matched.length-1,z=p.matched.length-1;if(Wr(t,p)&&r===z&&t.matched[r]===p.matched[z])return this.ensureURL(),t.hash&&Oz(this.router,p,t,!1),c(((b=yz(M=p,t,mz.duplicated,'Avoided redundant navigation to current location: "'+M.fullPath+'".')).name="NavigationDuplicated",b));var a=function(t,e){var n,o=Math.max(t.length,e.length);for(n=0;n0)){var e=this.router,n=e.options.scrollBehavior,o=Wz&&n;o&&this.listeners.push(iz());var p=function(){var n=t.current,p=Pz(t.base);t.current===fr&&p===t._startLocation||t.transitionTo(p,(function(t){o&&Oz(e,t,n,!0)}))};window.addEventListener("popstate",p),this.listeners.push((function(){window.removeEventListener("popstate",p)}))}},e.prototype.go=function(t){window.history.go(t)},e.prototype.push=function(t,e,n){var o=this,p=this.current;this.transitionTo(t,(function(t){vz(yr(o.base+t.fullPath)),Oz(o.router,t,p,!1),e&&e(t)}),n)},e.prototype.replace=function(t,e,n){var o=this,p=this.current;this.transitionTo(t,(function(t){Rz(yr(o.base+t.fullPath)),Oz(o.router,t,p,!1),e&&e(t)}),n)},e.prototype.ensureURL=function(t){if(Pz(this.base)!==this.current.fullPath){var e=yr(this.base+this.current.fullPath);t?vz(e):Rz(e)}},e.prototype.getCurrentLocation=function(){return Pz(this.base)},e}(xz);function Pz(t){var e=window.location.pathname,n=e.toLowerCase(),o=t.toLowerCase();return!t||n!==o&&0!==n.indexOf(yr(o+"/"))||(e=e.slice(t.length)),(e||"/")+window.location.search+window.location.hash}var Uz=function(t){function e(e,n,o){t.call(this,e,n),o&&function(t){var e=Pz(t);if(!/^\/#/.test(e))return window.location.replace(yr(t+"/#"+e)),!0}(this.base)||jz()}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype.setupListeners=function(){var t=this;if(!(this.listeners.length>0)){var e=this.router.options.scrollBehavior,n=Wz&&e;n&&this.listeners.push(iz());var o=function(){var e=t.current;jz()&&t.transitionTo(Hz(),(function(o){n&&Oz(t.router,o,e,!0),Wz||Yz(o.fullPath)}))},p=Wz?"popstate":"hashchange";window.addEventListener(p,o),this.listeners.push((function(){window.removeEventListener(p,o)}))}},e.prototype.push=function(t,e,n){var o=this,p=this.current;this.transitionTo(t,(function(t){Gz(t.fullPath),Oz(o.router,t,p,!1),e&&e(t)}),n)},e.prototype.replace=function(t,e,n){var o=this,p=this.current;this.transitionTo(t,(function(t){Yz(t.fullPath),Oz(o.router,t,p,!1),e&&e(t)}),n)},e.prototype.go=function(t){window.history.go(t)},e.prototype.ensureURL=function(t){var e=this.current.fullPath;Hz()!==e&&(t?Gz(e):Yz(e))},e.prototype.getCurrentLocation=function(){return Hz()},e}(xz);function jz(){var t=Hz();return"/"===t.charAt(0)||(Yz("/"+t),!1)}function Hz(){var t=window.location.href,e=t.indexOf("#");return e<0?"":t=t.slice(e+1)}function Fz(t){var e=window.location.href,n=e.indexOf("#");return(n>=0?e.slice(0,n):e)+"#"+t}function Gz(t){Wz?vz(Fz(t)):window.location.hash=t}function Yz(t){Wz?Rz(Fz(t)):window.location.replace(Fz(t))}var $z=function(t){function e(e,n){t.call(this,e,n),this.stack=[],this.index=-1}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype.push=function(t,e,n){var o=this;this.transitionTo(t,(function(t){o.stack=o.stack.slice(0,o.index+1).concat(t),o.index++,e&&e(t)}),n)},e.prototype.replace=function(t,e,n){var o=this;this.transitionTo(t,(function(t){o.stack=o.stack.slice(0,o.index).concat(t),e&&e(t)}),n)},e.prototype.go=function(t){var e=this,n=this.index+t;if(!(n<0||n>=this.stack.length)){var o=this.stack[n];this.confirmTransition(o,(function(){var t=e.current;e.index=n,e.updateRoute(o),e.router.afterHooks.forEach((function(e){e&&e(o,t)}))}),(function(t){Ez(t,mz.duplicated)&&(e.index=n)}))}},e.prototype.getCurrentLocation=function(){var t=this.stack[this.stack.length-1];return t?t.fullPath:"/"},e.prototype.ensureURL=function(){},e}(xz),Vz=function(t){void 0===t&&(t={}),this.app=null,this.apps=[],this.options=t,this.beforeHooks=[],this.resolveHooks=[],this.afterHooks=[],this.matcher=oz(t.routes||[],this);var e=t.mode||"hash";switch(this.fallback="history"===e&&!Wz&&!1!==t.fallback,this.fallback&&(e="hash"),Zr||(e="abstract"),this.mode=e,e){case"history":this.history=new Dz(this,t.base);break;case"hash":this.history=new Uz(this,t.base,this.fallback);break;case"abstract":this.history=new $z(this,t.base)}},Kz={currentRoute:{configurable:!0}};Vz.prototype.match=function(t,e,n){return this.matcher.match(t,e,n)},Kz.currentRoute.get=function(){return this.history&&this.history.current},Vz.prototype.init=function(t){var e=this;if(this.apps.push(t),t.$once("hook:destroyed",(function(){var n=e.apps.indexOf(t);n>-1&&e.apps.splice(n,1),e.app===t&&(e.app=e.apps[0]||null),e.app||e.history.teardown()})),!this.app){this.app=t;var n=this.history;if(n instanceof Dz||n instanceof Uz){var o=function(t){n.setupListeners(),function(t){var o=n.current,p=e.options.scrollBehavior;Wz&&p&&"fullPath"in t&&Oz(e,t,o,!1)}(t)};n.transitionTo(n.getCurrentLocation(),o,o)}n.listen((function(t){e.apps.forEach((function(e){e._route=t}))}))}},Vz.prototype.beforeEach=function(t){return Jz(this.beforeHooks,t)},Vz.prototype.beforeResolve=function(t){return Jz(this.resolveHooks,t)},Vz.prototype.afterEach=function(t){return Jz(this.afterHooks,t)},Vz.prototype.onReady=function(t,e){this.history.onReady(t,e)},Vz.prototype.onError=function(t){this.history.onError(t)},Vz.prototype.push=function(t,e,n){var o=this;if(!e&&!n&&"undefined"!=typeof Promise)return new Promise((function(e,n){o.history.push(t,e,n)}));this.history.push(t,e,n)},Vz.prototype.replace=function(t,e,n){var o=this;if(!e&&!n&&"undefined"!=typeof Promise)return new Promise((function(e,n){o.history.replace(t,e,n)}));this.history.replace(t,e,n)},Vz.prototype.go=function(t){this.history.go(t)},Vz.prototype.back=function(){this.go(-1)},Vz.prototype.forward=function(){this.go(1)},Vz.prototype.getMatchedComponents=function(t){var e=t?t.matched?t:this.resolve(t).route:this.currentRoute;return e?[].concat.apply([],e.matched.map((function(t){return Object.keys(t.components).map((function(e){return t.components[e]}))}))):[]},Vz.prototype.resolve=function(t,e,n){var o=Yr(t,e=e||this.history.current,n,this),p=this.match(o,e),M=p.redirectedFrom||p.fullPath,b=function(t,e,n){var o="hash"===n?"#"+e:e;return t?yr(t+"/"+o):o}(this.history.base,M,this.mode);return{location:o,route:p,href:b,normalizedTo:o,resolved:p}},Vz.prototype.getRoutes=function(){return this.matcher.getRoutes()},Vz.prototype.addRoute=function(t,e){this.matcher.addRoute(t,e),this.history.current!==fr&&this.history.transitionTo(this.history.getCurrentLocation())},Vz.prototype.addRoutes=function(t){this.matcher.addRoutes(t),this.history.current!==fr&&this.history.transitionTo(this.history.getCurrentLocation())},Object.defineProperties(Vz.prototype,Kz);var Qz=Vz;function Jz(t,e){return t.push(e),function(){var n=t.indexOf(e);n>-1&&t.splice(n,1)}}Vz.install=function t(e){if(!t.installed||$r!==e){t.installed=!0,$r=e;var n=function(t){return void 0!==t},o=function(t,e){var o=t.$options._parentVnode;n(o)&&n(o=o.data)&&n(o=o.registerRouteInstance)&&o(t,e)};e.mixin({beforeCreate:function(){n(this.$options.router)?(this._routerRoot=this,this._router=this.$options.router,this._router.init(this),e.util.defineReactive(this,"_route",this._router.history.current)):this._routerRoot=this.$parent&&this.$parent._routerRoot||this,o(this,this)},destroyed:function(){o(this)}}),Object.defineProperty(e.prototype,"$router",{get:function(){return this._routerRoot._router}}),Object.defineProperty(e.prototype,"$route",{get:function(){return this._routerRoot._route}}),e.component("RouterView",mr),e.component("RouterLink",Kr);var p=e.config.optionMergeStrategies;p.beforeRouteEnter=p.beforeRouteLeave=p.beforeRouteUpdate=p.created}},Vz.version="3.6.5",Vz.isNavigationFailure=Ez,Vz.NavigationFailureType=mz,Vz.START_LOCATION=fr,Zr&&window.Vue&&window.Vue.use(Vz);var Zz=n(7551),ta=n.n(Zz),ea=n(5072),na=n.n(ea),oa=n(2930),pa={insert:"head",singleton:!1};na()(oa.A,pa);oa.A.locals;n(2754);var Ma=document.head.querySelector('meta[name="csrf-token"]');Ma&&(pr.A.defaults.headers.common["X-CSRF-TOKEN"]=Ma.content),no.use(Qz),window.Popper=n(8851).default,nr().tz.setDefault(Telescope.timezone),window.Telescope.basePath="/"+window.Telescope.path;var ba=window.Telescope.basePath+"/";""!==window.Telescope.path&&"/"!==window.Telescope.path||(ba="/",window.Telescope.basePath="");var ca=new Qz({routes:Mr,mode:"history",base:ba});no.component("vue-json-pretty",ta()),no.component("related-entries",n(8117).A),no.component("index-screen",n(4980).A),no.component("preview-screen",n(9416).A),no.component("alert",n(4445).A),no.component("copy-clipboard",n(1858).A),no.mixin(or),new no({el:"#telescope",router:ca,data:function(){return{alert:{type:null,autoClose:0,message:"",confirmationProceed:null,confirmationCancel:null},autoLoadsNewEntries:"1"===localStorage.autoLoadsNewEntries,recording:Telescope.recording}},created:function(){window.addEventListener("keydown",this.keydownListener)},destroyed:function(){window.removeEventListener("keydown",this.keydownListener)},methods:{autoLoadNewEntries:function(){this.autoLoadsNewEntries?(this.autoLoadsNewEntries=!1,localStorage.autoLoadsNewEntries=0):(this.autoLoadsNewEntries=!0,localStorage.autoLoadsNewEntries=1)},toggleRecording:function(){pr.A.post(Telescope.basePath+"/telescope-api/toggle-recording"),window.Telescope.recording=!Telescope.recording,this.recording=!this.recording},clearEntries:function(){(!(arguments.length>0&&void 0!==arguments[0])||arguments[0])&&!confirm("Are you sure you want to delete all Telescope data?")||pr.A.delete(Telescope.basePath+"/telescope-api/entries").then((function(t){return location.reload()}))},keydownListener:function(t){t.metaKey&&"k"===t.key&&this.clearEntries(!1)}}})},8217:(t,e,n)=>{"use strict";n.d(e,{A:()=>o});const o={methods:{cacheActionTypeClass:function(t){return"hit"===t?"success":"set"===t?"info":"forget"===t?"warning":"missed"===t?"danger":void 0},composerTypeClass:function(t){return"composer"===t?"info":"creator"===t?"success":void 0},gateResultClass:function(t){return"allowed"===t?"success":"denied"===t?"danger":void 0},jobStatusClass:function(t){return"pending"===t?"secondary":"processed"===t?"success":"failed"===t?"danger":void 0},logLevelClass:function(t){return"debug"===t?"success":"info"===t?"info":"notice"===t?"secondary":"warning"===t?"warning":"error"===t||"critical"===t||"alert"===t||"emergency"===t?"danger":void 0},modelActionClass:function(t){return"created"==t?"success":"updated"==t?"info":"retrieved"==t?"secondary":"deleted"==t||"forceDeleted"==t?"danger":void 0},requestStatusClass:function(t){return t?t<300?"success":t<400?"info":t<500?"warning":t>=500?"danger":void 0:"danger"},requestMethodClass:function(t){return"GET"==t||"OPTIONS"==t?"secondary":"POST"==t||"PATCH"==t||"PUT"==t?"info":"DELETE"==t?"danger":void 0}}}},7526:(t,e)=>{"use strict";e.byteLength=function(t){var e=c(t),n=e[0],o=e[1];return 3*(n+o)/4-o},e.toByteArray=function(t){var e,n,M=c(t),b=M[0],r=M[1],z=new p(function(t,e,n){return 3*(e+n)/4-n}(0,b,r)),a=0,i=r>0?b-4:b;for(n=0;n>16&255,z[a++]=e>>8&255,z[a++]=255&e;2===r&&(e=o[t.charCodeAt(n)]<<2|o[t.charCodeAt(n+1)]>>4,z[a++]=255&e);1===r&&(e=o[t.charCodeAt(n)]<<10|o[t.charCodeAt(n+1)]<<4|o[t.charCodeAt(n+2)]>>2,z[a++]=e>>8&255,z[a++]=255&e);return z},e.fromByteArray=function(t){for(var e,o=t.length,p=o%3,M=[],b=16383,c=0,z=o-p;cz?z:c+b));1===p?(e=t[o-1],M.push(n[e>>2]+n[e<<4&63]+"==")):2===p&&(e=(t[o-2]<<8)+t[o-1],M.push(n[e>>10]+n[e>>4&63]+n[e<<2&63]+"="));return M.join("")};for(var n=[],o=[],p="undefined"!=typeof Uint8Array?Uint8Array:Array,M="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",b=0;b<64;++b)n[b]=M[b],o[M.charCodeAt(b)]=b;function c(t){var e=t.length;if(e%4>0)throw new Error("Invalid string. Length must be a multiple of 4");var n=t.indexOf("=");return-1===n&&(n=e),[n,n===e?0:4-n%4]}function r(t,e,o){for(var p,M,b=[],c=e;c>18&63]+n[M>>12&63]+n[M>>6&63]+n[63&M]);return b.join("")}o["-".charCodeAt(0)]=62,o["_".charCodeAt(0)]=63},2754:function(t,e,n){!function(t,e,n){"use strict";function o(t){return t&&"object"==typeof t&&"default"in t?t:{default:t}}var p=o(e),M=o(n);function b(t,e){for(var n=0;n=b)throw new Error("Bootstrap's JavaScript requires at least jQuery v1.9.1 but less than v4.0.0")}};f.jQueryDetection(),d();var q="alert",h="4.6.2",W="bs.alert",v="."+W,R=".data-api",m=p.default.fn[q],g="alert",L="fade",y="show",_="close"+v,N="closed"+v,E="click"+v+R,T='[data-dismiss="alert"]',B=function(){function t(t){this._element=t}var e=t.prototype;return e.close=function(t){var e=this._element;t&&(e=this._getRootElement(t)),this._triggerCloseEvent(e).isDefaultPrevented()||this._removeElement(e)},e.dispose=function(){p.default.removeData(this._element,W),this._element=null},e._getRootElement=function(t){var e=f.getSelectorFromElement(t),n=!1;return e&&(n=document.querySelector(e)),n||(n=p.default(t).closest("."+g)[0]),n},e._triggerCloseEvent=function(t){var e=p.default.Event(_);return p.default(t).trigger(e),e},e._removeElement=function(t){var e=this;if(p.default(t).removeClass(y),p.default(t).hasClass(L)){var n=f.getTransitionDurationFromElement(t);p.default(t).one(f.TRANSITION_END,(function(n){return e._destroyElement(t,n)})).emulateTransitionEnd(n)}else this._destroyElement(t)},e._destroyElement=function(t){p.default(t).detach().trigger(N).remove()},t._jQueryInterface=function(e){return this.each((function(){var n=p.default(this),o=n.data(W);o||(o=new t(this),n.data(W,o)),"close"===e&&o[e](this)}))},t._handleDismiss=function(t){return function(e){e&&e.preventDefault(),t.close(this)}},c(t,null,[{key:"VERSION",get:function(){return h}}]),t}();p.default(document).on(E,T,B._handleDismiss(new B)),p.default.fn[q]=B._jQueryInterface,p.default.fn[q].Constructor=B,p.default.fn[q].noConflict=function(){return p.default.fn[q]=m,B._jQueryInterface};var C="button",w="4.6.2",S="bs.button",X="."+S,x=".data-api",k=p.default.fn[C],I="active",D="btn",P="focus",U="click"+X+x,j="focus"+X+x+" blur"+X+x,H="load"+X+x,F='[data-toggle^="button"]',G='[data-toggle="buttons"]',Y='[data-toggle="button"]',$='[data-toggle="buttons"] .btn',V='input:not([type="hidden"])',K=".active",Q=".btn",J=function(){function t(t){this._element=t,this.shouldAvoidTriggerChange=!1}var e=t.prototype;return e.toggle=function(){var t=!0,e=!0,n=p.default(this._element).closest(G)[0];if(n){var o=this._element.querySelector(V);if(o){if("radio"===o.type)if(o.checked&&this._element.classList.contains(I))t=!1;else{var M=n.querySelector(K);M&&p.default(M).removeClass(I)}t&&("checkbox"!==o.type&&"radio"!==o.type||(o.checked=!this._element.classList.contains(I)),this.shouldAvoidTriggerChange||p.default(o).trigger("change")),o.focus(),e=!1}}this._element.hasAttribute("disabled")||this._element.classList.contains("disabled")||(e&&this._element.setAttribute("aria-pressed",!this._element.classList.contains(I)),t&&p.default(this._element).toggleClass(I))},e.dispose=function(){p.default.removeData(this._element,S),this._element=null},t._jQueryInterface=function(e,n){return this.each((function(){var o=p.default(this),M=o.data(S);M||(M=new t(this),o.data(S,M)),M.shouldAvoidTriggerChange=n,"toggle"===e&&M[e]()}))},c(t,null,[{key:"VERSION",get:function(){return w}}]),t}();p.default(document).on(U,F,(function(t){var e=t.target,n=e;if(p.default(e).hasClass(D)||(e=p.default(e).closest(Q)[0]),!e||e.hasAttribute("disabled")||e.classList.contains("disabled"))t.preventDefault();else{var o=e.querySelector(V);if(o&&(o.hasAttribute("disabled")||o.classList.contains("disabled")))return void t.preventDefault();"INPUT"!==n.tagName&&"LABEL"===e.tagName||J._jQueryInterface.call(p.default(e),"toggle","INPUT"===n.tagName)}})).on(j,F,(function(t){var e=p.default(t.target).closest(Q)[0];p.default(e).toggleClass(P,/^focus(in)?$/.test(t.type))})),p.default(window).on(H,(function(){for(var t=[].slice.call(document.querySelectorAll($)),e=0,n=t.length;e0,this._pointerEvent=Boolean(window.PointerEvent||window.MSPointerEvent),this._addEventListeners()}var e=t.prototype;return e.next=function(){this._isSliding||this._slide(dt)},e.nextWhenVisible=function(){var t=p.default(this._element);!document.hidden&&t.is(":visible")&&"hidden"!==t.css("visibility")&&this.next()},e.prev=function(){this._isSliding||this._slide(ft)},e.pause=function(t){t||(this._isPaused=!0),this._element.querySelector(kt)&&(f.triggerTransitionEnd(this._element),this.cycle(!0)),clearInterval(this._interval),this._interval=null},e.cycle=function(t){t||(this._isPaused=!1),this._interval&&(clearInterval(this._interval),this._interval=null),this._config.interval&&!this._isPaused&&(this._updateInterval(),this._interval=setInterval((document.visibilityState?this.nextWhenVisible:this.next).bind(this),this._config.interval))},e.to=function(t){var e=this;this._activeElement=this._element.querySelector(St);var n=this._getItemIndex(this._activeElement);if(!(t>this._items.length-1||t<0))if(this._isSliding)p.default(this._element).one(vt,(function(){return e.to(t)}));else{if(n===t)return this.pause(),void this.cycle();var o=t>n?dt:ft;this._slide(o,this._items[t])}},e.dispose=function(){p.default(this._element).off(nt),p.default.removeData(this._element,et),this._items=null,this._config=null,this._element=null,this._interval=null,this._isPaused=null,this._isSliding=null,this._activeElement=null,this._indicatorsElement=null},e._getConfig=function(t){return t=r({},Ut,t),f.typeCheckConfig(Z,t,jt),t},e._handleSwipe=function(){var t=Math.abs(this.touchDeltaX);if(!(t<=rt)){var e=t/this.touchDeltaX;this.touchDeltaX=0,e>0&&this.prev(),e<0&&this.next()}},e._addEventListeners=function(){var t=this;this._config.keyboard&&p.default(this._element).on(Rt,(function(e){return t._keydown(e)})),"hover"===this._config.pause&&p.default(this._element).on(mt,(function(e){return t.pause(e)})).on(gt,(function(e){return t.cycle(e)})),this._config.touch&&this._addTouchEventListeners()},e._addTouchEventListeners=function(){var t=this;if(this._touchSupported){var e=function(e){t._pointerEvent&&Ht[e.originalEvent.pointerType.toUpperCase()]?t.touchStartX=e.originalEvent.clientX:t._pointerEvent||(t.touchStartX=e.originalEvent.touches[0].clientX)},n=function(e){t.touchDeltaX=e.originalEvent.touches&&e.originalEvent.touches.length>1?0:e.originalEvent.touches[0].clientX-t.touchStartX},o=function(e){t._pointerEvent&&Ht[e.originalEvent.pointerType.toUpperCase()]&&(t.touchDeltaX=e.originalEvent.clientX-t.touchStartX),t._handleSwipe(),"hover"===t._config.pause&&(t.pause(),t.touchTimeout&&clearTimeout(t.touchTimeout),t.touchTimeout=setTimeout((function(e){return t.cycle(e)}),ct+t._config.interval))};p.default(this._element.querySelectorAll(xt)).on(Tt,(function(t){return t.preventDefault()})),this._pointerEvent?(p.default(this._element).on(Nt,(function(t){return e(t)})),p.default(this._element).on(Et,(function(t){return o(t)})),this._element.classList.add(lt)):(p.default(this._element).on(Lt,(function(t){return e(t)})),p.default(this._element).on(yt,(function(t){return n(t)})),p.default(this._element).on(_t,(function(t){return o(t)})))}},e._keydown=function(t){if(!/input|textarea/i.test(t.target.tagName))switch(t.which){case Mt:t.preventDefault(),this.prev();break;case bt:t.preventDefault(),this.next()}},e._getItemIndex=function(t){return this._items=t&&t.parentNode?[].slice.call(t.parentNode.querySelectorAll(Xt)):[],this._items.indexOf(t)},e._getItemByDirection=function(t,e){var n=t===dt,o=t===ft,p=this._getItemIndex(e),M=this._items.length-1;if((o&&0===p||n&&p===M)&&!this._config.wrap)return e;var b=(p+(t===ft?-1:1))%this._items.length;return-1===b?this._items[this._items.length-1]:this._items[b]},e._triggerSlideEvent=function(t,e){var n=this._getItemIndex(t),o=this._getItemIndex(this._element.querySelector(St)),M=p.default.Event(Wt,{relatedTarget:t,direction:e,from:o,to:n});return p.default(this._element).trigger(M),M},e._setActiveIndicatorElement=function(t){if(this._indicatorsElement){var e=[].slice.call(this._indicatorsElement.querySelectorAll(wt));p.default(e).removeClass(at);var n=this._indicatorsElement.children[this._getItemIndex(t)];n&&p.default(n).addClass(at)}},e._updateInterval=function(){var t=this._activeElement||this._element.querySelector(St);if(t){var e=parseInt(t.getAttribute("data-interval"),10);e?(this._config.defaultInterval=this._config.defaultInterval||this._config.interval,this._config.interval=e):this._config.interval=this._config.defaultInterval||this._config.interval}},e._slide=function(t,e){var n,o,M,b=this,c=this._element.querySelector(St),r=this._getItemIndex(c),z=e||c&&this._getItemByDirection(t,c),a=this._getItemIndex(z),i=Boolean(this._interval);if(t===dt?(n=st,o=At,M=qt):(n=Ot,o=ut,M=ht),z&&p.default(z).hasClass(at))this._isSliding=!1;else if(!this._triggerSlideEvent(z,M).isDefaultPrevented()&&c&&z){this._isSliding=!0,i&&this.pause(),this._setActiveIndicatorElement(z),this._activeElement=z;var O=p.default.Event(vt,{relatedTarget:z,direction:M,from:r,to:a});if(p.default(this._element).hasClass(it)){p.default(z).addClass(o),f.reflow(z),p.default(c).addClass(n),p.default(z).addClass(n);var s=f.getTransitionDurationFromElement(c);p.default(c).one(f.TRANSITION_END,(function(){p.default(z).removeClass(n+" "+o).addClass(at),p.default(c).removeClass(at+" "+o+" "+n),b._isSliding=!1,setTimeout((function(){return p.default(b._element).trigger(O)}),0)})).emulateTransitionEnd(s)}else p.default(c).removeClass(at),p.default(z).addClass(at),this._isSliding=!1,p.default(this._element).trigger(O);i&&this.cycle()}},t._jQueryInterface=function(e){return this.each((function(){var n=p.default(this).data(et),o=r({},Ut,p.default(this).data());"object"==typeof e&&(o=r({},o,e));var M="string"==typeof e?e:o.slide;if(n||(n=new t(this,o),p.default(this).data(et,n)),"number"==typeof e)n.to(e);else if("string"==typeof M){if(void 0===n[M])throw new TypeError('No method named "'+M+'"');n[M]()}else o.interval&&o.ride&&(n.pause(),n.cycle())}))},t._dataApiClickHandler=function(e){var n=f.getSelectorFromElement(this);if(n){var o=p.default(n)[0];if(o&&p.default(o).hasClass(zt)){var M=r({},p.default(o).data(),p.default(this).data()),b=this.getAttribute("data-slide-to");b&&(M.interval=!1),t._jQueryInterface.call(p.default(o),M),b&&p.default(o).data(et).to(b),e.preventDefault()}}},c(t,null,[{key:"VERSION",get:function(){return tt}},{key:"Default",get:function(){return Ut}}]),t}();p.default(document).on(Ct,Dt,Ft._dataApiClickHandler),p.default(window).on(Bt,(function(){for(var t=[].slice.call(document.querySelectorAll(Pt)),e=0,n=t.length;e0&&(this._selector=b,this._triggerArray.push(M))}this._parent=this._config.parent?this._getParent():null,this._config.parent||this._addAriaAndCollapsedClass(this._element,this._triggerArray),this._config.toggle&&this.toggle()}var e=t.prototype;return e.toggle=function(){p.default(this._element).hasClass(Jt)?this.hide():this.show()},e.show=function(){var e,n,o=this;if(!(this._isTransitioning||p.default(this._element).hasClass(Jt)||(this._parent&&0===(e=[].slice.call(this._parent.querySelectorAll(ze)).filter((function(t){return"string"==typeof o._config.parent?t.getAttribute("data-parent")===o._config.parent:t.classList.contains(Zt)}))).length&&(e=null),e&&(n=p.default(e).not(this._selector).data($t))&&n._isTransitioning))){var M=p.default.Event(pe);if(p.default(this._element).trigger(M),!M.isDefaultPrevented()){e&&(t._jQueryInterface.call(p.default(e).not(this._selector),"hide"),n||p.default(e).data($t,null));var b=this._getDimension();p.default(this._element).removeClass(Zt).addClass(te),this._element.style[b]=0,this._triggerArray.length&&p.default(this._triggerArray).removeClass(ee).attr("aria-expanded",!0),this.setTransitioning(!0);var c=function(){p.default(o._element).removeClass(te).addClass(Zt+" "+Jt),o._element.style[b]="",o.setTransitioning(!1),p.default(o._element).trigger(Me)},r="scroll"+(b[0].toUpperCase()+b.slice(1)),z=f.getTransitionDurationFromElement(this._element);p.default(this._element).one(f.TRANSITION_END,c).emulateTransitionEnd(z),this._element.style[b]=this._element[r]+"px"}}},e.hide=function(){var t=this;if(!this._isTransitioning&&p.default(this._element).hasClass(Jt)){var e=p.default.Event(be);if(p.default(this._element).trigger(e),!e.isDefaultPrevented()){var n=this._getDimension();this._element.style[n]=this._element.getBoundingClientRect()[n]+"px",f.reflow(this._element),p.default(this._element).addClass(te).removeClass(Zt+" "+Jt);var o=this._triggerArray.length;if(o>0)for(var M=0;M0},e._getOffset=function(){var t=this,e={};return"function"==typeof this._config.offset?e.fn=function(e){return e.offsets=r({},e.offsets,t._config.offset(e.offsets,t._element)),e}:e.offset=this._config.offset,e},e._getPopperConfig=function(){var t={placement:this._getPlacement(),modifiers:{offset:this._getOffset(),flip:{enabled:this._config.flip},preventOverflow:{boundariesElement:this._config.boundary}}};return"static"===this._config.display&&(t.modifiers.applyStyle={enabled:!1}),r({},t,this._config.popperConfig)},t._jQueryInterface=function(e){return this.each((function(){var n=p.default(this).data(le);if(n||(n=new t(this,"object"==typeof e?e:null),p.default(this).data(le,n)),"string"==typeof e){if(void 0===n[e])throw new TypeError('No method named "'+e+'"');n[e]()}}))},t._clearMenus=function(e){if(!e||e.which!==ge&&("keyup"!==e.type||e.which===ve))for(var n=[].slice.call(document.querySelectorAll(Ue)),o=0,M=n.length;o0&&b--,e.which===me&&bdocument.documentElement.clientHeight;n||(this._element.style.overflowY="hidden"),this._element.classList.add(ln);var o=f.getTransitionDurationFromElement(this._dialog);p.default(this._element).off(f.TRANSITION_END),p.default(this._element).one(f.TRANSITION_END,(function(){t._element.classList.remove(ln),n||p.default(t._element).one(f.TRANSITION_END,(function(){t._element.style.overflowY=""})).emulateTransitionEnd(t._element,o)})).emulateTransitionEnd(o),this._element.focus()}},e._showElement=function(t){var e=this,n=p.default(this._element).hasClass(An),o=this._dialog?this._dialog.querySelector(En):null;this._element.parentNode&&this._element.parentNode.nodeType===Node.ELEMENT_NODE||document.body.appendChild(this._element),this._element.style.display="block",this._element.removeAttribute("aria-hidden"),this._element.setAttribute("aria-modal",!0),this._element.setAttribute("role","dialog"),p.default(this._dialog).hasClass(zn)&&o?o.scrollTop=0:this._element.scrollTop=0,n&&f.reflow(this._element),p.default(this._element).addClass(un),this._config.focus&&this._enforceFocus();var M=p.default.Event(Wn,{relatedTarget:t}),b=function(){e._config.focus&&e._element.focus(),e._isTransitioning=!1,p.default(e._element).trigger(M)};if(n){var c=f.getTransitionDurationFromElement(this._dialog);p.default(this._dialog).one(f.TRANSITION_END,b).emulateTransitionEnd(c)}else b()},e._enforceFocus=function(){var t=this;p.default(document).off(vn).on(vn,(function(e){document!==e.target&&t._element!==e.target&&0===p.default(t._element).has(e.target).length&&t._element.focus()}))},e._setEscapeEvent=function(){var t=this;this._isShown?p.default(this._element).on(gn,(function(e){t._config.keyboard&&e.which===rn?(e.preventDefault(),t.hide()):t._config.keyboard||e.which!==rn||t._triggerBackdropTransition()})):this._isShown||p.default(this._element).off(gn)},e._setResizeEvent=function(){var t=this;this._isShown?p.default(window).on(Rn,(function(e){return t.handleUpdate(e)})):p.default(window).off(Rn)},e._hideModal=function(){var t=this;this._element.style.display="none",this._element.setAttribute("aria-hidden",!0),this._element.removeAttribute("aria-modal"),this._element.removeAttribute("role"),this._isTransitioning=!1,this._showBackdrop((function(){p.default(document.body).removeClass(sn),t._resetAdjustments(),t._resetScrollbar(),p.default(t._element).trigger(qn)}))},e._removeBackdrop=function(){this._backdrop&&(p.default(this._backdrop).remove(),this._backdrop=null)},e._showBackdrop=function(t){var e=this,n=p.default(this._element).hasClass(An)?An:"";if(this._isShown&&this._config.backdrop){if(this._backdrop=document.createElement("div"),this._backdrop.className=On,n&&this._backdrop.classList.add(n),p.default(this._backdrop).appendTo(document.body),p.default(this._element).on(mn,(function(t){e._ignoreBackdropClick?e._ignoreBackdropClick=!1:t.target===t.currentTarget&&("static"===e._config.backdrop?e._triggerBackdropTransition():e.hide())})),n&&f.reflow(this._backdrop),p.default(this._backdrop).addClass(un),!t)return;if(!n)return void t();var o=f.getTransitionDurationFromElement(this._backdrop);p.default(this._backdrop).one(f.TRANSITION_END,t).emulateTransitionEnd(o)}else if(!this._isShown&&this._backdrop){p.default(this._backdrop).removeClass(un);var M=function(){e._removeBackdrop(),t&&t()};if(p.default(this._element).hasClass(An)){var b=f.getTransitionDurationFromElement(this._backdrop);p.default(this._backdrop).one(f.TRANSITION_END,M).emulateTransitionEnd(b)}else M()}else t&&t()},e._adjustDialog=function(){var t=this._element.scrollHeight>document.documentElement.clientHeight;!this._isBodyOverflowing&&t&&(this._element.style.paddingLeft=this._scrollbarWidth+"px"),this._isBodyOverflowing&&!t&&(this._element.style.paddingRight=this._scrollbarWidth+"px")},e._resetAdjustments=function(){this._element.style.paddingLeft="",this._element.style.paddingRight=""},e._checkScrollbar=function(){var t=document.body.getBoundingClientRect();this._isBodyOverflowing=Math.round(t.left+t.right)
',trigger:"hover focus",title:"",delay:0,html:!1,selector:!1,placement:"top",offset:0,container:!1,fallbackPlacement:"flip",boundary:"scrollParent",customClass:"",sanitize:!0,sanitizeFn:null,whiteList:In,popperConfig:null},ao={animation:"boolean",template:"string",title:"(string|element|function)",trigger:"string",delay:"(number|object)",html:"boolean",selector:"(string|boolean)",placement:"(string|function)",offset:"(number|string|function)",container:"(string|element|boolean)",fallbackPlacement:"(string|array)",boundary:"(string|element)",customClass:"(string|function)",sanitize:"boolean",sanitizeFn:"(null|function)",whiteList:"object",popperConfig:"(null|object)"},io={HIDE:"hide"+Yn,HIDDEN:"hidden"+Yn,SHOW:"show"+Yn,SHOWN:"shown"+Yn,INSERTED:"inserted"+Yn,CLICK:"click"+Yn,FOCUSIN:"focusin"+Yn,FOCUSOUT:"focusout"+Yn,MOUSEENTER:"mouseenter"+Yn,MOUSELEAVE:"mouseleave"+Yn},Oo=function(){function t(t,e){if(void 0===M.default)throw new TypeError("Bootstrap's tooltips require Popper (https://popper.js.org)");this._isEnabled=!0,this._timeout=0,this._hoverState="",this._activeTrigger={},this._popper=null,this.element=t,this.config=this._getConfig(e),this.tip=null,this._setListeners()}var e=t.prototype;return e.enable=function(){this._isEnabled=!0},e.disable=function(){this._isEnabled=!1},e.toggleEnabled=function(){this._isEnabled=!this._isEnabled},e.toggle=function(t){if(this._isEnabled)if(t){var e=this.constructor.DATA_KEY,n=p.default(t.currentTarget).data(e);n||(n=new this.constructor(t.currentTarget,this._getDelegateConfig()),p.default(t.currentTarget).data(e,n)),n._activeTrigger.click=!n._activeTrigger.click,n._isWithActiveTrigger()?n._enter(null,n):n._leave(null,n)}else{if(p.default(this.getTipElement()).hasClass(Zn))return void this._leave(null,this);this._enter(null,this)}},e.dispose=function(){clearTimeout(this._timeout),p.default.removeData(this.element,this.constructor.DATA_KEY),p.default(this.element).off(this.constructor.EVENT_KEY),p.default(this.element).closest(".modal").off("hide.bs.modal",this._hideModalHandler),this.tip&&p.default(this.tip).remove(),this._isEnabled=null,this._timeout=null,this._hoverState=null,this._activeTrigger=null,this._popper&&this._popper.destroy(),this._popper=null,this.element=null,this.config=null,this.tip=null},e.show=function(){var t=this;if("none"===p.default(this.element).css("display"))throw new Error("Please use show on visible elements");var e=p.default.Event(this.constructor.Event.SHOW);if(this.isWithContent()&&this._isEnabled){p.default(this.element).trigger(e);var n=f.findShadowRoot(this.element),o=p.default.contains(null!==n?n:this.element.ownerDocument.documentElement,this.element);if(e.isDefaultPrevented()||!o)return;var b=this.getTipElement(),c=f.getUID(this.constructor.NAME);b.setAttribute("id",c),this.element.setAttribute("aria-describedby",c),this.setContent(),this.config.animation&&p.default(b).addClass(Jn);var r="function"==typeof this.config.placement?this.config.placement.call(this,b,this.element):this.config.placement,z=this._getAttachment(r);this.addAttachmentClass(z);var a=this._getContainer();p.default(b).data(this.constructor.DATA_KEY,this),p.default.contains(this.element.ownerDocument.documentElement,this.tip)||p.default(b).appendTo(a),p.default(this.element).trigger(this.constructor.Event.INSERTED),this._popper=new M.default(this.element,b,this._getPopperConfig(z)),p.default(b).addClass(Zn),p.default(b).addClass(this.config.customClass),"ontouchstart"in document.documentElement&&p.default(document.body).children().on("mouseover",null,p.default.noop);var i=function(){t.config.animation&&t._fixTransition();var e=t._hoverState;t._hoverState=null,p.default(t.element).trigger(t.constructor.Event.SHOWN),e===eo&&t._leave(null,t)};if(p.default(this.tip).hasClass(Jn)){var O=f.getTransitionDurationFromElement(this.tip);p.default(this.tip).one(f.TRANSITION_END,i).emulateTransitionEnd(O)}else i()}},e.hide=function(t){var e=this,n=this.getTipElement(),o=p.default.Event(this.constructor.Event.HIDE),M=function(){e._hoverState!==to&&n.parentNode&&n.parentNode.removeChild(n),e._cleanTipClass(),e.element.removeAttribute("aria-describedby"),p.default(e.element).trigger(e.constructor.Event.HIDDEN),null!==e._popper&&e._popper.destroy(),t&&t()};if(p.default(this.element).trigger(o),!o.isDefaultPrevented()){if(p.default(n).removeClass(Zn),"ontouchstart"in document.documentElement&&p.default(document.body).children().off("mouseover",null,p.default.noop),this._activeTrigger[bo]=!1,this._activeTrigger[Mo]=!1,this._activeTrigger[po]=!1,p.default(this.tip).hasClass(Jn)){var b=f.getTransitionDurationFromElement(n);p.default(n).one(f.TRANSITION_END,M).emulateTransitionEnd(b)}else M();this._hoverState=""}},e.update=function(){null!==this._popper&&this._popper.scheduleUpdate()},e.isWithContent=function(){return Boolean(this.getTitle())},e.addAttachmentClass=function(t){p.default(this.getTipElement()).addClass(Vn+"-"+t)},e.getTipElement=function(){return this.tip=this.tip||p.default(this.config.template)[0],this.tip},e.setContent=function(){var t=this.getTipElement();this.setElementContent(p.default(t.querySelectorAll(no)),this.getTitle()),p.default(t).removeClass(Jn+" "+Zn)},e.setElementContent=function(t,e){"object"!=typeof e||!e.nodeType&&!e.jquery?this.config.html?(this.config.sanitize&&(e=jn(e,this.config.whiteList,this.config.sanitizeFn)),t.html(e)):t.text(e):this.config.html?p.default(e).parent().is(t)||t.empty().append(e):t.text(p.default(e).text())},e.getTitle=function(){var t=this.element.getAttribute("data-original-title");return t||(t="function"==typeof this.config.title?this.config.title.call(this.element):this.config.title),t},e._getPopperConfig=function(t){var e=this;return r({},{placement:t,modifiers:{offset:this._getOffset(),flip:{behavior:this.config.fallbackPlacement},arrow:{element:oo},preventOverflow:{boundariesElement:this.config.boundary}},onCreate:function(t){t.originalPlacement!==t.placement&&e._handlePopperPlacementChange(t)},onUpdate:function(t){return e._handlePopperPlacementChange(t)}},this.config.popperConfig)},e._getOffset=function(){var t=this,e={};return"function"==typeof this.config.offset?e.fn=function(e){return e.offsets=r({},e.offsets,t.config.offset(e.offsets,t.element)),e}:e.offset=this.config.offset,e},e._getContainer=function(){return!1===this.config.container?document.body:f.isElement(this.config.container)?p.default(this.config.container):p.default(document).find(this.config.container)},e._getAttachment=function(t){return ro[t.toUpperCase()]},e._setListeners=function(){var t=this;this.config.trigger.split(" ").forEach((function(e){if("click"===e)p.default(t.element).on(t.constructor.Event.CLICK,t.config.selector,(function(e){return t.toggle(e)}));else if(e!==co){var n=e===po?t.constructor.Event.MOUSEENTER:t.constructor.Event.FOCUSIN,o=e===po?t.constructor.Event.MOUSELEAVE:t.constructor.Event.FOCUSOUT;p.default(t.element).on(n,t.config.selector,(function(e){return t._enter(e)})).on(o,t.config.selector,(function(e){return t._leave(e)}))}})),this._hideModalHandler=function(){t.element&&t.hide()},p.default(this.element).closest(".modal").on("hide.bs.modal",this._hideModalHandler),this.config.selector?this.config=r({},this.config,{trigger:"manual",selector:""}):this._fixTitle()},e._fixTitle=function(){var t=typeof this.element.getAttribute("data-original-title");(this.element.getAttribute("title")||"string"!==t)&&(this.element.setAttribute("data-original-title",this.element.getAttribute("title")||""),this.element.setAttribute("title",""))},e._enter=function(t,e){var n=this.constructor.DATA_KEY;(e=e||p.default(t.currentTarget).data(n))||(e=new this.constructor(t.currentTarget,this._getDelegateConfig()),p.default(t.currentTarget).data(n,e)),t&&(e._activeTrigger["focusin"===t.type?Mo:po]=!0),p.default(e.getTipElement()).hasClass(Zn)||e._hoverState===to?e._hoverState=to:(clearTimeout(e._timeout),e._hoverState=to,e.config.delay&&e.config.delay.show?e._timeout=setTimeout((function(){e._hoverState===to&&e.show()}),e.config.delay.show):e.show())},e._leave=function(t,e){var n=this.constructor.DATA_KEY;(e=e||p.default(t.currentTarget).data(n))||(e=new this.constructor(t.currentTarget,this._getDelegateConfig()),p.default(t.currentTarget).data(n,e)),t&&(e._activeTrigger["focusout"===t.type?Mo:po]=!1),e._isWithActiveTrigger()||(clearTimeout(e._timeout),e._hoverState=eo,e.config.delay&&e.config.delay.hide?e._timeout=setTimeout((function(){e._hoverState===eo&&e.hide()}),e.config.delay.hide):e.hide())},e._isWithActiveTrigger=function(){for(var t in this._activeTrigger)if(this._activeTrigger[t])return!0;return!1},e._getConfig=function(t){var e=p.default(this.element).data();return Object.keys(e).forEach((function(t){-1!==Qn.indexOf(t)&&delete e[t]})),"number"==typeof(t=r({},this.constructor.Default,e,"object"==typeof t&&t?t:{})).delay&&(t.delay={show:t.delay,hide:t.delay}),"number"==typeof t.title&&(t.title=t.title.toString()),"number"==typeof t.content&&(t.content=t.content.toString()),f.typeCheckConfig(Hn,t,this.constructor.DefaultType),t.sanitize&&(t.template=jn(t.template,t.whiteList,t.sanitizeFn)),t},e._getDelegateConfig=function(){var t={};if(this.config)for(var e in this.config)this.constructor.Default[e]!==this.config[e]&&(t[e]=this.config[e]);return t},e._cleanTipClass=function(){var t=p.default(this.getTipElement()),e=t.attr("class").match(Kn);null!==e&&e.length&&t.removeClass(e.join(""))},e._handlePopperPlacementChange=function(t){this.tip=t.instance.popper,this._cleanTipClass(),this.addAttachmentClass(this._getAttachment(t.placement))},e._fixTransition=function(){var t=this.getTipElement(),e=this.config.animation;null===t.getAttribute("x-placement")&&(p.default(t).removeClass(Jn),this.config.animation=!1,this.hide(),this.show(),this.config.animation=e)},t._jQueryInterface=function(e){return this.each((function(){var n=p.default(this),o=n.data(Gn),M="object"==typeof e&&e;if((o||!/dispose|hide/.test(e))&&(o||(o=new t(this,M),n.data(Gn,o)),"string"==typeof e)){if(void 0===o[e])throw new TypeError('No method named "'+e+'"');o[e]()}}))},c(t,null,[{key:"VERSION",get:function(){return Fn}},{key:"Default",get:function(){return zo}},{key:"NAME",get:function(){return Hn}},{key:"DATA_KEY",get:function(){return Gn}},{key:"Event",get:function(){return io}},{key:"EVENT_KEY",get:function(){return Yn}},{key:"DefaultType",get:function(){return ao}}]),t}();p.default.fn[Hn]=Oo._jQueryInterface,p.default.fn[Hn].Constructor=Oo,p.default.fn[Hn].noConflict=function(){return p.default.fn[Hn]=$n,Oo._jQueryInterface};var so="popover",Ao="4.6.2",uo="bs.popover",lo="."+uo,fo=p.default.fn[so],qo="bs-popover",ho=new RegExp("(^|\\s)"+qo+"\\S+","g"),Wo="fade",vo="show",Ro=".popover-header",mo=".popover-body",go=r({},Oo.Default,{placement:"right",trigger:"click",content:"",template:''}),Lo=r({},Oo.DefaultType,{content:"(string|element|function)"}),yo={HIDE:"hide"+lo,HIDDEN:"hidden"+lo,SHOW:"show"+lo,SHOWN:"shown"+lo,INSERTED:"inserted"+lo,CLICK:"click"+lo,FOCUSIN:"focusin"+lo,FOCUSOUT:"focusout"+lo,MOUSEENTER:"mouseenter"+lo,MOUSELEAVE:"mouseleave"+lo},_o=function(t){function e(){return t.apply(this,arguments)||this}z(e,t);var n=e.prototype;return n.isWithContent=function(){return this.getTitle()||this._getContent()},n.addAttachmentClass=function(t){p.default(this.getTipElement()).addClass(qo+"-"+t)},n.getTipElement=function(){return this.tip=this.tip||p.default(this.config.template)[0],this.tip},n.setContent=function(){var t=p.default(this.getTipElement());this.setElementContent(t.find(Ro),this.getTitle());var e=this._getContent();"function"==typeof e&&(e=e.call(this.element)),this.setElementContent(t.find(mo),e),t.removeClass(Wo+" "+vo)},n._getContent=function(){return this.element.getAttribute("data-content")||this.config.content},n._cleanTipClass=function(){var t=p.default(this.getTipElement()),e=t.attr("class").match(ho);null!==e&&e.length>0&&t.removeClass(e.join(""))},e._jQueryInterface=function(t){return this.each((function(){var n=p.default(this).data(uo),o="object"==typeof t?t:null;if((n||!/dispose|hide/.test(t))&&(n||(n=new e(this,o),p.default(this).data(uo,n)),"string"==typeof t)){if(void 0===n[t])throw new TypeError('No method named "'+t+'"');n[t]()}}))},c(e,null,[{key:"VERSION",get:function(){return Ao}},{key:"Default",get:function(){return go}},{key:"NAME",get:function(){return so}},{key:"DATA_KEY",get:function(){return uo}},{key:"Event",get:function(){return yo}},{key:"EVENT_KEY",get:function(){return lo}},{key:"DefaultType",get:function(){return Lo}}]),e}(Oo);p.default.fn[so]=_o._jQueryInterface,p.default.fn[so].Constructor=_o,p.default.fn[so].noConflict=function(){return p.default.fn[so]=fo,_o._jQueryInterface};var No="scrollspy",Eo="4.6.2",To="bs.scrollspy",Bo="."+To,Co=".data-api",wo=p.default.fn[No],So="dropdown-item",Xo="active",xo="activate"+Bo,ko="scroll"+Bo,Io="load"+Bo+Co,Do="offset",Po="position",Uo='[data-spy="scroll"]',jo=".nav, .list-group",Ho=".nav-link",Fo=".nav-item",Go=".list-group-item",Yo=".dropdown",$o=".dropdown-item",Vo=".dropdown-toggle",Ko={offset:10,method:"auto",target:""},Qo={offset:"number",method:"string",target:"(string|element)"},Jo=function(){function t(t,e){var n=this;this._element=t,this._scrollElement="BODY"===t.tagName?window:t,this._config=this._getConfig(e),this._selector=this._config.target+" "+Ho+","+this._config.target+" "+Go+","+this._config.target+" "+$o,this._offsets=[],this._targets=[],this._activeTarget=null,this._scrollHeight=0,p.default(this._scrollElement).on(ko,(function(t){return n._process(t)})),this.refresh(),this._process()}var e=t.prototype;return e.refresh=function(){var t=this,e=this._scrollElement===this._scrollElement.window?Do:Po,n="auto"===this._config.method?e:this._config.method,o=n===Po?this._getScrollTop():0;this._offsets=[],this._targets=[],this._scrollHeight=this._getScrollHeight(),[].slice.call(document.querySelectorAll(this._selector)).map((function(t){var e,M=f.getSelectorFromElement(t);if(M&&(e=document.querySelector(M)),e){var b=e.getBoundingClientRect();if(b.width||b.height)return[p.default(e)[n]().top+o,M]}return null})).filter(Boolean).sort((function(t,e){return t[0]-e[0]})).forEach((function(e){t._offsets.push(e[0]),t._targets.push(e[1])}))},e.dispose=function(){p.default.removeData(this._element,To),p.default(this._scrollElement).off(Bo),this._element=null,this._scrollElement=null,this._config=null,this._selector=null,this._offsets=null,this._targets=null,this._activeTarget=null,this._scrollHeight=null},e._getConfig=function(t){if("string"!=typeof(t=r({},Ko,"object"==typeof t&&t?t:{})).target&&f.isElement(t.target)){var e=p.default(t.target).attr("id");e||(e=f.getUID(No),p.default(t.target).attr("id",e)),t.target="#"+e}return f.typeCheckConfig(No,t,Qo),t},e._getScrollTop=function(){return this._scrollElement===window?this._scrollElement.pageYOffset:this._scrollElement.scrollTop},e._getScrollHeight=function(){return this._scrollElement.scrollHeight||Math.max(document.body.scrollHeight,document.documentElement.scrollHeight)},e._getOffsetHeight=function(){return this._scrollElement===window?window.innerHeight:this._scrollElement.getBoundingClientRect().height},e._process=function(){var t=this._getScrollTop()+this._config.offset,e=this._getScrollHeight(),n=this._config.offset+e-this._getOffsetHeight();if(this._scrollHeight!==e&&this.refresh(),t>=n){var o=this._targets[this._targets.length-1];this._activeTarget!==o&&this._activate(o)}else{if(this._activeTarget&&t0)return this._activeTarget=null,void this._clear();for(var p=this._offsets.length;p--;)this._activeTarget!==this._targets[p]&&t>=this._offsets[p]&&(void 0===this._offsets[p+1]||t{"use strict";var o=n(7526),p=n(251),M=n(4634);function b(){return r.TYPED_ARRAY_SUPPORT?2147483647:1073741823}function c(t,e){if(b()=b())throw new RangeError("Attempt to allocate Buffer larger than maximum size: 0x"+b().toString(16)+" bytes");return 0|t}function A(t,e){if(r.isBuffer(t))return t.length;if("undefined"!=typeof ArrayBuffer&&"function"==typeof ArrayBuffer.isView&&(ArrayBuffer.isView(t)||t instanceof ArrayBuffer))return t.byteLength;"string"!=typeof t&&(t=""+t);var n=t.length;if(0===n)return 0;for(var o=!1;;)switch(e){case"ascii":case"latin1":case"binary":return n;case"utf8":case"utf-8":case void 0:return P(t).length;case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return 2*n;case"hex":return n>>>1;case"base64":return U(t).length;default:if(o)return P(t).length;e=(""+e).toLowerCase(),o=!0}}function u(t,e,n){var o=!1;if((void 0===e||e<0)&&(e=0),e>this.length)return"";if((void 0===n||n>this.length)&&(n=this.length),n<=0)return"";if((n>>>=0)<=(e>>>=0))return"";for(t||(t="utf8");;)switch(t){case"hex":return E(this,e,n);case"utf8":case"utf-8":return L(this,e,n);case"ascii":return _(this,e,n);case"latin1":case"binary":return N(this,e,n);case"base64":return g(this,e,n);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return T(this,e,n);default:if(o)throw new TypeError("Unknown encoding: "+t);t=(t+"").toLowerCase(),o=!0}}function l(t,e,n){var o=t[e];t[e]=t[n],t[n]=o}function d(t,e,n,o,p){if(0===t.length)return-1;if("string"==typeof n?(o=n,n=0):n>2147483647?n=2147483647:n<-2147483648&&(n=-2147483648),n=+n,isNaN(n)&&(n=p?0:t.length-1),n<0&&(n=t.length+n),n>=t.length){if(p)return-1;n=t.length-1}else if(n<0){if(!p)return-1;n=0}if("string"==typeof e&&(e=r.from(e,o)),r.isBuffer(e))return 0===e.length?-1:f(t,e,n,o,p);if("number"==typeof e)return e&=255,r.TYPED_ARRAY_SUPPORT&&"function"==typeof Uint8Array.prototype.indexOf?p?Uint8Array.prototype.indexOf.call(t,e,n):Uint8Array.prototype.lastIndexOf.call(t,e,n):f(t,[e],n,o,p);throw new TypeError("val must be string, number or Buffer")}function f(t,e,n,o,p){var M,b=1,c=t.length,r=e.length;if(void 0!==o&&("ucs2"===(o=String(o).toLowerCase())||"ucs-2"===o||"utf16le"===o||"utf-16le"===o)){if(t.length<2||e.length<2)return-1;b=2,c/=2,r/=2,n/=2}function z(t,e){return 1===b?t[e]:t.readUInt16BE(e*b)}if(p){var a=-1;for(M=n;Mc&&(n=c-r),M=n;M>=0;M--){for(var i=!0,O=0;Op&&(o=p):o=p;var M=e.length;if(M%2!=0)throw new TypeError("Invalid hex string");o>M/2&&(o=M/2);for(var b=0;b>8,p=n%256,M.push(p),M.push(o);return M}(e,t.length-n),t,n,o)}function g(t,e,n){return 0===e&&n===t.length?o.fromByteArray(t):o.fromByteArray(t.slice(e,n))}function L(t,e,n){n=Math.min(t.length,n);for(var o=[],p=e;p239?4:z>223?3:z>191?2:1;if(p+i<=n)switch(i){case 1:z<128&&(a=z);break;case 2:128==(192&(M=t[p+1]))&&(r=(31&z)<<6|63&M)>127&&(a=r);break;case 3:M=t[p+1],b=t[p+2],128==(192&M)&&128==(192&b)&&(r=(15&z)<<12|(63&M)<<6|63&b)>2047&&(r<55296||r>57343)&&(a=r);break;case 4:M=t[p+1],b=t[p+2],c=t[p+3],128==(192&M)&&128==(192&b)&&128==(192&c)&&(r=(15&z)<<18|(63&M)<<12|(63&b)<<6|63&c)>65535&&r<1114112&&(a=r)}null===a?(a=65533,i=1):a>65535&&(a-=65536,o.push(a>>>10&1023|55296),a=56320|1023&a),o.push(a),p+=i}return function(t){var e=t.length;if(e<=y)return String.fromCharCode.apply(String,t);var n="",o=0;for(;o0&&(t=this.toString("hex",0,n).match(/.{2}/g).join(" "),this.length>n&&(t+=" ... ")),""},r.prototype.compare=function(t,e,n,o,p){if(!r.isBuffer(t))throw new TypeError("Argument must be a Buffer");if(void 0===e&&(e=0),void 0===n&&(n=t?t.length:0),void 0===o&&(o=0),void 0===p&&(p=this.length),e<0||n>t.length||o<0||p>this.length)throw new RangeError("out of range index");if(o>=p&&e>=n)return 0;if(o>=p)return-1;if(e>=n)return 1;if(this===t)return 0;for(var M=(p>>>=0)-(o>>>=0),b=(n>>>=0)-(e>>>=0),c=Math.min(M,b),z=this.slice(o,p),a=t.slice(e,n),i=0;ip)&&(n=p),t.length>0&&(n<0||e<0)||e>this.length)throw new RangeError("Attempt to write outside buffer bounds");o||(o="utf8");for(var M=!1;;)switch(o){case"hex":return q(this,t,e,n);case"utf8":case"utf-8":return h(this,t,e,n);case"ascii":return W(this,t,e,n);case"latin1":case"binary":return v(this,t,e,n);case"base64":return R(this,t,e,n);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return m(this,t,e,n);default:if(M)throw new TypeError("Unknown encoding: "+o);o=(""+o).toLowerCase(),M=!0}},r.prototype.toJSON=function(){return{type:"Buffer",data:Array.prototype.slice.call(this._arr||this,0)}};var y=4096;function _(t,e,n){var o="";n=Math.min(t.length,n);for(var p=e;po)&&(n=o);for(var p="",M=e;Mn)throw new RangeError("Trying to access beyond buffer length")}function C(t,e,n,o,p,M){if(!r.isBuffer(t))throw new TypeError('"buffer" argument must be a Buffer instance');if(e>p||et.length)throw new RangeError("Index out of range")}function w(t,e,n,o){e<0&&(e=65535+e+1);for(var p=0,M=Math.min(t.length-n,2);p>>8*(o?p:1-p)}function S(t,e,n,o){e<0&&(e=4294967295+e+1);for(var p=0,M=Math.min(t.length-n,4);p>>8*(o?p:3-p)&255}function X(t,e,n,o,p,M){if(n+o>t.length)throw new RangeError("Index out of range");if(n<0)throw new RangeError("Index out of range")}function x(t,e,n,o,M){return M||X(t,0,n,4),p.write(t,e,n,o,23,4),n+4}function k(t,e,n,o,M){return M||X(t,0,n,8),p.write(t,e,n,o,52,8),n+8}r.prototype.slice=function(t,e){var n,o=this.length;if((t=~~t)<0?(t+=o)<0&&(t=0):t>o&&(t=o),(e=void 0===e?o:~~e)<0?(e+=o)<0&&(e=0):e>o&&(e=o),e0&&(p*=256);)o+=this[t+--e]*p;return o},r.prototype.readUInt8=function(t,e){return e||B(t,1,this.length),this[t]},r.prototype.readUInt16LE=function(t,e){return e||B(t,2,this.length),this[t]|this[t+1]<<8},r.prototype.readUInt16BE=function(t,e){return e||B(t,2,this.length),this[t]<<8|this[t+1]},r.prototype.readUInt32LE=function(t,e){return e||B(t,4,this.length),(this[t]|this[t+1]<<8|this[t+2]<<16)+16777216*this[t+3]},r.prototype.readUInt32BE=function(t,e){return e||B(t,4,this.length),16777216*this[t]+(this[t+1]<<16|this[t+2]<<8|this[t+3])},r.prototype.readIntLE=function(t,e,n){t|=0,e|=0,n||B(t,e,this.length);for(var o=this[t],p=1,M=0;++M=(p*=128)&&(o-=Math.pow(2,8*e)),o},r.prototype.readIntBE=function(t,e,n){t|=0,e|=0,n||B(t,e,this.length);for(var o=e,p=1,M=this[t+--o];o>0&&(p*=256);)M+=this[t+--o]*p;return M>=(p*=128)&&(M-=Math.pow(2,8*e)),M},r.prototype.readInt8=function(t,e){return e||B(t,1,this.length),128&this[t]?-1*(255-this[t]+1):this[t]},r.prototype.readInt16LE=function(t,e){e||B(t,2,this.length);var n=this[t]|this[t+1]<<8;return 32768&n?4294901760|n:n},r.prototype.readInt16BE=function(t,e){e||B(t,2,this.length);var n=this[t+1]|this[t]<<8;return 32768&n?4294901760|n:n},r.prototype.readInt32LE=function(t,e){return e||B(t,4,this.length),this[t]|this[t+1]<<8|this[t+2]<<16|this[t+3]<<24},r.prototype.readInt32BE=function(t,e){return e||B(t,4,this.length),this[t]<<24|this[t+1]<<16|this[t+2]<<8|this[t+3]},r.prototype.readFloatLE=function(t,e){return e||B(t,4,this.length),p.read(this,t,!0,23,4)},r.prototype.readFloatBE=function(t,e){return e||B(t,4,this.length),p.read(this,t,!1,23,4)},r.prototype.readDoubleLE=function(t,e){return e||B(t,8,this.length),p.read(this,t,!0,52,8)},r.prototype.readDoubleBE=function(t,e){return e||B(t,8,this.length),p.read(this,t,!1,52,8)},r.prototype.writeUIntLE=function(t,e,n,o){(t=+t,e|=0,n|=0,o)||C(this,t,e,n,Math.pow(2,8*n)-1,0);var p=1,M=0;for(this[e]=255&t;++M=0&&(M*=256);)this[e+p]=t/M&255;return e+n},r.prototype.writeUInt8=function(t,e,n){return t=+t,e|=0,n||C(this,t,e,1,255,0),r.TYPED_ARRAY_SUPPORT||(t=Math.floor(t)),this[e]=255&t,e+1},r.prototype.writeUInt16LE=function(t,e,n){return t=+t,e|=0,n||C(this,t,e,2,65535,0),r.TYPED_ARRAY_SUPPORT?(this[e]=255&t,this[e+1]=t>>>8):w(this,t,e,!0),e+2},r.prototype.writeUInt16BE=function(t,e,n){return t=+t,e|=0,n||C(this,t,e,2,65535,0),r.TYPED_ARRAY_SUPPORT?(this[e]=t>>>8,this[e+1]=255&t):w(this,t,e,!1),e+2},r.prototype.writeUInt32LE=function(t,e,n){return t=+t,e|=0,n||C(this,t,e,4,4294967295,0),r.TYPED_ARRAY_SUPPORT?(this[e+3]=t>>>24,this[e+2]=t>>>16,this[e+1]=t>>>8,this[e]=255&t):S(this,t,e,!0),e+4},r.prototype.writeUInt32BE=function(t,e,n){return t=+t,e|=0,n||C(this,t,e,4,4294967295,0),r.TYPED_ARRAY_SUPPORT?(this[e]=t>>>24,this[e+1]=t>>>16,this[e+2]=t>>>8,this[e+3]=255&t):S(this,t,e,!1),e+4},r.prototype.writeIntLE=function(t,e,n,o){if(t=+t,e|=0,!o){var p=Math.pow(2,8*n-1);C(this,t,e,n,p-1,-p)}var M=0,b=1,c=0;for(this[e]=255&t;++M=0&&(b*=256);)t<0&&0===c&&0!==this[e+M+1]&&(c=1),this[e+M]=(t/b|0)-c&255;return e+n},r.prototype.writeInt8=function(t,e,n){return t=+t,e|=0,n||C(this,t,e,1,127,-128),r.TYPED_ARRAY_SUPPORT||(t=Math.floor(t)),t<0&&(t=255+t+1),this[e]=255&t,e+1},r.prototype.writeInt16LE=function(t,e,n){return t=+t,e|=0,n||C(this,t,e,2,32767,-32768),r.TYPED_ARRAY_SUPPORT?(this[e]=255&t,this[e+1]=t>>>8):w(this,t,e,!0),e+2},r.prototype.writeInt16BE=function(t,e,n){return t=+t,e|=0,n||C(this,t,e,2,32767,-32768),r.TYPED_ARRAY_SUPPORT?(this[e]=t>>>8,this[e+1]=255&t):w(this,t,e,!1),e+2},r.prototype.writeInt32LE=function(t,e,n){return t=+t,e|=0,n||C(this,t,e,4,2147483647,-2147483648),r.TYPED_ARRAY_SUPPORT?(this[e]=255&t,this[e+1]=t>>>8,this[e+2]=t>>>16,this[e+3]=t>>>24):S(this,t,e,!0),e+4},r.prototype.writeInt32BE=function(t,e,n){return t=+t,e|=0,n||C(this,t,e,4,2147483647,-2147483648),t<0&&(t=4294967295+t+1),r.TYPED_ARRAY_SUPPORT?(this[e]=t>>>24,this[e+1]=t>>>16,this[e+2]=t>>>8,this[e+3]=255&t):S(this,t,e,!1),e+4},r.prototype.writeFloatLE=function(t,e,n){return x(this,t,e,!0,n)},r.prototype.writeFloatBE=function(t,e,n){return x(this,t,e,!1,n)},r.prototype.writeDoubleLE=function(t,e,n){return k(this,t,e,!0,n)},r.prototype.writeDoubleBE=function(t,e,n){return k(this,t,e,!1,n)},r.prototype.copy=function(t,e,n,o){if(n||(n=0),o||0===o||(o=this.length),e>=t.length&&(e=t.length),e||(e=0),o>0&&o=this.length)throw new RangeError("sourceStart out of bounds");if(o<0)throw new RangeError("sourceEnd out of bounds");o>this.length&&(o=this.length),t.length-e=0;--p)t[p+e]=this[p+n];else if(M<1e3||!r.TYPED_ARRAY_SUPPORT)for(p=0;p>>=0,n=void 0===n?this.length:n>>>0,t||(t=0),"number"==typeof t)for(M=e;M55295&&n<57344){if(!p){if(n>56319){(e-=3)>-1&&M.push(239,191,189);continue}if(b+1===o){(e-=3)>-1&&M.push(239,191,189);continue}p=n;continue}if(n<56320){(e-=3)>-1&&M.push(239,191,189),p=n;continue}n=65536+(p-55296<<10|n-56320)}else p&&(e-=3)>-1&&M.push(239,191,189);if(p=null,n<128){if((e-=1)<0)break;M.push(n)}else if(n<2048){if((e-=2)<0)break;M.push(n>>6|192,63&n|128)}else if(n<65536){if((e-=3)<0)break;M.push(n>>12|224,n>>6&63|128,63&n|128)}else{if(!(n<1114112))throw new Error("Invalid code point");if((e-=4)<0)break;M.push(n>>18|240,n>>12&63|128,n>>6&63|128,63&n|128)}}return M}function U(t){return o.toByteArray(function(t){if((t=function(t){return t.trim?t.trim():t.replace(/^\s+|\s+$/g,"")}(t).replace(I,"")).length<2)return"";for(;t.length%4!=0;)t+="=";return t}(t))}function j(t,e,n,o){for(var p=0;p=e.length||p>=t.length);++p)e[p+n]=t[p];return p}},7965:(t,e,n)=>{"use strict";var o=n(6426),p={"text/plain":"Text","text/html":"Url",default:"Text"};t.exports=function(t,e){var n,M,b,c,r,z=!1;e||(e={}),e.debug;try{if(M=o(),b=document.createRange(),c=document.getSelection(),(r=document.createElement("span")).textContent=t,r.ariaHidden="true",r.style.all="unset",r.style.position="fixed",r.style.top=0,r.style.clip="rect(0, 0, 0, 0)",r.style.whiteSpace="pre",r.style.webkitUserSelect="text",r.style.MozUserSelect="text",r.style.msUserSelect="text",r.style.userSelect="text",r.addEventListener("copy",(function(n){if(n.stopPropagation(),e.format)if(n.preventDefault(),void 0===n.clipboardData){window.clipboardData.clearData();var o=p[e.format]||p.default;window.clipboardData.setData(o,t)}else n.clipboardData.clearData(),n.clipboardData.setData(e.format,t);e.onCopy&&(n.preventDefault(),e.onCopy(n.clipboardData))})),document.body.appendChild(r),b.selectNodeContents(r),c.addRange(b),!document.execCommand("copy"))throw new Error("copy command was unsuccessful");z=!0}catch(o){try{window.clipboardData.setData(e.format||"text",t),e.onCopy&&e.onCopy(window.clipboardData),z=!0}catch(o){n=function(t){var e=(/mac os x/i.test(navigator.userAgent)?"⌘":"Ctrl")+"+C";return t.replace(/#{\s*key\s*}/g,e)}("message"in e?e.message:"Copy to clipboard: #{key}, Enter"),window.prompt(n,t)}}finally{c&&("function"==typeof c.removeRange?c.removeRange(b):c.removeAllRanges()),r&&document.body.removeChild(r),M()}return z}},251:(t,e)=>{e.read=function(t,e,n,o,p){var M,b,c=8*p-o-1,r=(1<>1,a=-7,i=n?p-1:0,O=n?-1:1,s=t[e+i];for(i+=O,M=s&(1<<-a)-1,s>>=-a,a+=c;a>0;M=256*M+t[e+i],i+=O,a-=8);for(b=M&(1<<-a)-1,M>>=-a,a+=o;a>0;b=256*b+t[e+i],i+=O,a-=8);if(0===M)M=1-z;else{if(M===r)return b?NaN:1/0*(s?-1:1);b+=Math.pow(2,o),M-=z}return(s?-1:1)*b*Math.pow(2,M-o)},e.write=function(t,e,n,o,p,M){var b,c,r,z=8*M-p-1,a=(1<>1,O=23===p?Math.pow(2,-24)-Math.pow(2,-77):0,s=o?0:M-1,A=o?1:-1,u=e<0||0===e&&1/e<0?1:0;for(e=Math.abs(e),isNaN(e)||e===1/0?(c=isNaN(e)?1:0,b=a):(b=Math.floor(Math.log(e)/Math.LN2),e*(r=Math.pow(2,-b))<1&&(b--,r*=2),(e+=b+i>=1?O/r:O*Math.pow(2,1-i))*r>=2&&(b++,r/=2),b+i>=a?(c=0,b=a):b+i>=1?(c=(e*r-1)*Math.pow(2,p),b+=i):(c=e*Math.pow(2,i-1)*Math.pow(2,p),b=0));p>=8;t[n+s]=255&c,s+=A,c/=256,p-=8);for(b=b<0;t[n+s]=255&b,s+=A,b/=256,z-=8);t[n+s-A]|=128*u}},4634:t=>{var e={}.toString;t.exports=Array.isArray||function(t){return"[object Array]"==e.call(t)}},4692:function(t,e){var n;!function(e,n){"use strict";"object"==typeof t.exports?t.exports=e.document?n(e,!0):function(t){if(!t.document)throw new Error("jQuery requires a window with a document");return n(t)}:n(e)}("undefined"!=typeof window?window:this,(function(o,p){"use strict";var M=[],b=Object.getPrototypeOf,c=M.slice,r=M.flat?function(t){return M.flat.call(t)}:function(t){return M.concat.apply([],t)},z=M.push,a=M.indexOf,i={},O=i.toString,s=i.hasOwnProperty,A=s.toString,u=A.call(Object),l={},d=function(t){return"function"==typeof t&&"number"!=typeof t.nodeType&&"function"!=typeof t.item},f=function(t){return null!=t&&t===t.window},q=o.document,h={type:!0,src:!0,nonce:!0,noModule:!0};function W(t,e,n){var o,p,M=(n=n||q).createElement("script");if(M.text=t,e)for(o in h)(p=e[o]||e.getAttribute&&e.getAttribute(o))&&M.setAttribute(o,p);n.head.appendChild(M).parentNode.removeChild(M)}function v(t){return null==t?t+"":"object"==typeof t||"function"==typeof t?i[O.call(t)]||"object":typeof t}var R="3.7.1",m=/HTML$/i,g=function(t,e){return new g.fn.init(t,e)};function L(t){var e=!!t&&"length"in t&&t.length,n=v(t);return!d(t)&&!f(t)&&("array"===n||0===e||"number"==typeof e&&e>0&&e-1 in t)}function y(t,e){return t.nodeName&&t.nodeName.toLowerCase()===e.toLowerCase()}g.fn=g.prototype={jquery:R,constructor:g,length:0,toArray:function(){return c.call(this)},get:function(t){return null==t?c.call(this):t<0?this[t+this.length]:this[t]},pushStack:function(t){var e=g.merge(this.constructor(),t);return e.prevObject=this,e},each:function(t){return g.each(this,t)},map:function(t){return this.pushStack(g.map(this,(function(e,n){return t.call(e,n,e)})))},slice:function(){return this.pushStack(c.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},even:function(){return this.pushStack(g.grep(this,(function(t,e){return(e+1)%2})))},odd:function(){return this.pushStack(g.grep(this,(function(t,e){return e%2})))},eq:function(t){var e=this.length,n=+t+(t<0?e:0);return this.pushStack(n>=0&&n+~]|"+T+")"+T+"*"),P=new RegExp(T+"|>"),U=new RegExp(x),j=new RegExp("^"+C+"$"),H={ID:new RegExp("^#("+C+")"),CLASS:new RegExp("^\\.("+C+")"),TAG:new RegExp("^("+C+"|[*])"),ATTR:new RegExp("^"+w),PSEUDO:new RegExp("^"+x),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+T+"*(even|odd|(([+-]|)(\\d*)n|)"+T+"*(?:([+-]|)"+T+"*(\\d+)|))"+T+"*\\)|)","i"),bool:new RegExp("^(?:"+L+")$","i"),needsContext:new RegExp("^"+T+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+T+"*((?:-\\d)?\\d*)"+T+"*\\)|)(?=[^-]|$)","i")},F=/^(?:input|select|textarea|button)$/i,G=/^h\d$/i,Y=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,$=/[+~]/,V=new RegExp("\\\\[\\da-fA-F]{1,6}"+T+"?|\\\\([^\\r\\n\\f])","g"),K=function(t,e){var n="0x"+t.slice(1)-65536;return e||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},Q=function(){rt()},J=Ot((function(t){return!0===t.disabled&&y(t,"fieldset")}),{dir:"parentNode",next:"legend"});try{u.apply(M=c.call(S.childNodes),S.childNodes),M[S.childNodes.length].nodeType}catch(t){u={apply:function(t,e){X.apply(t,c.call(e))},call:function(t){X.apply(t,c.call(arguments,1))}}}function Z(t,e,n,o){var p,M,b,c,z,a,s,A=e&&e.ownerDocument,f=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==f&&9!==f&&11!==f)return n;if(!o&&(rt(e),e=e||r,i)){if(11!==f&&(z=Y.exec(t)))if(p=z[1]){if(9===f){if(!(b=e.getElementById(p)))return n;if(b.id===p)return u.call(n,b),n}else if(A&&(b=A.getElementById(p))&&Z.contains(e,b)&&b.id===p)return u.call(n,b),n}else{if(z[2])return u.apply(n,e.getElementsByTagName(t)),n;if((p=z[3])&&e.getElementsByClassName)return u.apply(n,e.getElementsByClassName(p)),n}if(!(R[t+" "]||O&&O.test(t))){if(s=t,A=e,1===f&&(P.test(t)||D.test(t))){for((A=$.test(t)&&ct(e.parentNode)||e)==e&&l.scope||((c=e.getAttribute("id"))?c=g.escapeSelector(c):e.setAttribute("id",c=d)),M=(a=at(t)).length;M--;)a[M]=(c?"#"+c:":scope")+" "+it(a[M]);s=a.join(",")}try{return u.apply(n,A.querySelectorAll(s)),n}catch(e){R(t,!0)}finally{c===d&&e.removeAttribute("id")}}}return ft(t.replace(B,"$1"),e,n,o)}function tt(){var t=[];return function n(o,p){return t.push(o+" ")>e.cacheLength&&delete n[t.shift()],n[o+" "]=p}}function et(t){return t[d]=!0,t}function nt(t){var e=r.createElement("fieldset");try{return!!t(e)}catch(t){return!1}finally{e.parentNode&&e.parentNode.removeChild(e),e=null}}function ot(t){return function(e){return y(e,"input")&&e.type===t}}function pt(t){return function(e){return(y(e,"input")||y(e,"button"))&&e.type===t}}function Mt(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&J(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function bt(t){return et((function(e){return e=+e,et((function(n,o){for(var p,M=t([],n.length,e),b=M.length;b--;)n[p=M[b]]&&(n[p]=!(o[p]=n[p]))}))}))}function ct(t){return t&&void 0!==t.getElementsByTagName&&t}function rt(t){var n,o=t?t.ownerDocument||t:S;return o!=r&&9===o.nodeType&&o.documentElement?(z=(r=o).documentElement,i=!g.isXMLDoc(r),A=z.matches||z.webkitMatchesSelector||z.msMatchesSelector,z.msMatchesSelector&&S!=r&&(n=r.defaultView)&&n.top!==n&&n.addEventListener("unload",Q),l.getById=nt((function(t){return z.appendChild(t).id=g.expando,!r.getElementsByName||!r.getElementsByName(g.expando).length})),l.disconnectedMatch=nt((function(t){return A.call(t,"*")})),l.scope=nt((function(){return r.querySelectorAll(":scope")})),l.cssHas=nt((function(){try{return r.querySelector(":has(*,:jqfake)"),!1}catch(t){return!0}})),l.getById?(e.filter.ID=function(t){var e=t.replace(V,K);return function(t){return t.getAttribute("id")===e}},e.find.ID=function(t,e){if(void 0!==e.getElementById&&i){var n=e.getElementById(t);return n?[n]:[]}}):(e.filter.ID=function(t){var e=t.replace(V,K);return function(t){var n=void 0!==t.getAttributeNode&&t.getAttributeNode("id");return n&&n.value===e}},e.find.ID=function(t,e){if(void 0!==e.getElementById&&i){var n,o,p,M=e.getElementById(t);if(M){if((n=M.getAttributeNode("id"))&&n.value===t)return[M];for(p=e.getElementsByName(t),o=0;M=p[o++];)if((n=M.getAttributeNode("id"))&&n.value===t)return[M]}return[]}}),e.find.TAG=function(t,e){return void 0!==e.getElementsByTagName?e.getElementsByTagName(t):e.querySelectorAll(t)},e.find.CLASS=function(t,e){if(void 0!==e.getElementsByClassName&&i)return e.getElementsByClassName(t)},O=[],nt((function(t){var e;z.appendChild(t).innerHTML="",t.querySelectorAll("[selected]").length||O.push("\\["+T+"*(?:value|"+L+")"),t.querySelectorAll("[id~="+d+"-]").length||O.push("~="),t.querySelectorAll("a#"+d+"+*").length||O.push(".#.+[+~]"),t.querySelectorAll(":checked").length||O.push(":checked"),(e=r.createElement("input")).setAttribute("type","hidden"),t.appendChild(e).setAttribute("name","D"),z.appendChild(t).disabled=!0,2!==t.querySelectorAll(":disabled").length&&O.push(":enabled",":disabled"),(e=r.createElement("input")).setAttribute("name",""),t.appendChild(e),t.querySelectorAll("[name='']").length||O.push("\\["+T+"*name"+T+"*="+T+"*(?:''|\"\")")})),l.cssHas||O.push(":has"),O=O.length&&new RegExp(O.join("|")),m=function(t,e){if(t===e)return b=!0,0;var n=!t.compareDocumentPosition-!e.compareDocumentPosition;return n||(1&(n=(t.ownerDocument||t)==(e.ownerDocument||e)?t.compareDocumentPosition(e):1)||!l.sortDetached&&e.compareDocumentPosition(t)===n?t===r||t.ownerDocument==S&&Z.contains(S,t)?-1:e===r||e.ownerDocument==S&&Z.contains(S,e)?1:p?a.call(p,t)-a.call(p,e):0:4&n?-1:1)},r):r}for(t in Z.matches=function(t,e){return Z(t,null,null,e)},Z.matchesSelector=function(t,e){if(rt(t),i&&!R[e+" "]&&(!O||!O.test(e)))try{var n=A.call(t,e);if(n||l.disconnectedMatch||t.document&&11!==t.document.nodeType)return n}catch(t){R(e,!0)}return Z(e,r,null,[t]).length>0},Z.contains=function(t,e){return(t.ownerDocument||t)!=r&&rt(t),g.contains(t,e)},Z.attr=function(t,n){(t.ownerDocument||t)!=r&&rt(t);var o=e.attrHandle[n.toLowerCase()],p=o&&s.call(e.attrHandle,n.toLowerCase())?o(t,n,!i):void 0;return void 0!==p?p:t.getAttribute(n)},Z.error=function(t){throw new Error("Syntax error, unrecognized expression: "+t)},g.uniqueSort=function(t){var e,n=[],o=0,M=0;if(b=!l.sortStable,p=!l.sortStable&&c.call(t,0),N.call(t,m),b){for(;e=t[M++];)e===t[M]&&(o=n.push(M));for(;o--;)E.call(t,n[o],1)}return p=null,t},g.fn.uniqueSort=function(){return this.pushStack(g.uniqueSort(c.apply(this)))},e=g.expr={cacheLength:50,createPseudo:et,match:H,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(t){return t[1]=t[1].replace(V,K),t[3]=(t[3]||t[4]||t[5]||"").replace(V,K),"~="===t[2]&&(t[3]=" "+t[3]+" "),t.slice(0,4)},CHILD:function(t){return t[1]=t[1].toLowerCase(),"nth"===t[1].slice(0,3)?(t[3]||Z.error(t[0]),t[4]=+(t[4]?t[5]+(t[6]||1):2*("even"===t[3]||"odd"===t[3])),t[5]=+(t[7]+t[8]||"odd"===t[3])):t[3]&&Z.error(t[0]),t},PSEUDO:function(t){var e,n=!t[6]&&t[2];return H.CHILD.test(t[0])?null:(t[3]?t[2]=t[4]||t[5]||"":n&&U.test(n)&&(e=at(n,!0))&&(e=n.indexOf(")",n.length-e)-n.length)&&(t[0]=t[0].slice(0,e),t[2]=n.slice(0,e)),t.slice(0,3))}},filter:{TAG:function(t){var e=t.replace(V,K).toLowerCase();return"*"===t?function(){return!0}:function(t){return y(t,e)}},CLASS:function(t){var e=h[t+" "];return e||(e=new RegExp("(^|"+T+")"+t+"("+T+"|$)"))&&h(t,(function(t){return e.test("string"==typeof t.className&&t.className||void 0!==t.getAttribute&&t.getAttribute("class")||"")}))},ATTR:function(t,e,n){return function(o){var p=Z.attr(o,t);return null==p?"!="===e:!e||(p+="","="===e?p===n:"!="===e?p!==n:"^="===e?n&&0===p.indexOf(n):"*="===e?n&&p.indexOf(n)>-1:"$="===e?n&&p.slice(-n.length)===n:"~="===e?(" "+p.replace(k," ")+" ").indexOf(n)>-1:"|="===e&&(p===n||p.slice(0,n.length+1)===n+"-"))}},CHILD:function(t,e,n,o,p){var M="nth"!==t.slice(0,3),b="last"!==t.slice(-4),c="of-type"===e;return 1===o&&0===p?function(t){return!!t.parentNode}:function(e,n,r){var z,a,i,O,s,A=M!==b?"nextSibling":"previousSibling",u=e.parentNode,l=c&&e.nodeName.toLowerCase(),q=!r&&!c,h=!1;if(u){if(M){for(;A;){for(i=e;i=i[A];)if(c?y(i,l):1===i.nodeType)return!1;s=A="only"===t&&!s&&"nextSibling"}return!0}if(s=[b?u.firstChild:u.lastChild],b&&q){for(h=(O=(z=(a=u[d]||(u[d]={}))[t]||[])[0]===f&&z[1])&&z[2],i=O&&u.childNodes[O];i=++O&&i&&i[A]||(h=O=0)||s.pop();)if(1===i.nodeType&&++h&&i===e){a[t]=[f,O,h];break}}else if(q&&(h=O=(z=(a=e[d]||(e[d]={}))[t]||[])[0]===f&&z[1]),!1===h)for(;(i=++O&&i&&i[A]||(h=O=0)||s.pop())&&(!(c?y(i,l):1===i.nodeType)||!++h||(q&&((a=i[d]||(i[d]={}))[t]=[f,h]),i!==e)););return(h-=p)===o||h%o==0&&h/o>=0}}},PSEUDO:function(t,n){var o,p=e.pseudos[t]||e.setFilters[t.toLowerCase()]||Z.error("unsupported pseudo: "+t);return p[d]?p(n):p.length>1?(o=[t,t,"",n],e.setFilters.hasOwnProperty(t.toLowerCase())?et((function(t,e){for(var o,M=p(t,n),b=M.length;b--;)t[o=a.call(t,M[b])]=!(e[o]=M[b])})):function(t){return p(t,0,o)}):p}},pseudos:{not:et((function(t){var e=[],n=[],o=dt(t.replace(B,"$1"));return o[d]?et((function(t,e,n,p){for(var M,b=o(t,null,p,[]),c=t.length;c--;)(M=b[c])&&(t[c]=!(e[c]=M))})):function(t,p,M){return e[0]=t,o(e,null,M,n),e[0]=null,!n.pop()}})),has:et((function(t){return function(e){return Z(t,e).length>0}})),contains:et((function(t){return t=t.replace(V,K),function(e){return(e.textContent||g.text(e)).indexOf(t)>-1}})),lang:et((function(t){return j.test(t||"")||Z.error("unsupported lang: "+t),t=t.replace(V,K).toLowerCase(),function(e){var n;do{if(n=i?e.lang:e.getAttribute("xml:lang")||e.getAttribute("lang"))return(n=n.toLowerCase())===t||0===n.indexOf(t+"-")}while((e=e.parentNode)&&1===e.nodeType);return!1}})),target:function(t){var e=o.location&&o.location.hash;return e&&e.slice(1)===t.id},root:function(t){return t===z},focus:function(t){return t===function(){try{return r.activeElement}catch(t){}}()&&r.hasFocus()&&!!(t.type||t.href||~t.tabIndex)},enabled:Mt(!1),disabled:Mt(!0),checked:function(t){return y(t,"input")&&!!t.checked||y(t,"option")&&!!t.selected},selected:function(t){return t.parentNode&&t.parentNode.selectedIndex,!0===t.selected},empty:function(t){for(t=t.firstChild;t;t=t.nextSibling)if(t.nodeType<6)return!1;return!0},parent:function(t){return!e.pseudos.empty(t)},header:function(t){return G.test(t.nodeName)},input:function(t){return F.test(t.nodeName)},button:function(t){return y(t,"input")&&"button"===t.type||y(t,"button")},text:function(t){var e;return y(t,"input")&&"text"===t.type&&(null==(e=t.getAttribute("type"))||"text"===e.toLowerCase())},first:bt((function(){return[0]})),last:bt((function(t,e){return[e-1]})),eq:bt((function(t,e,n){return[n<0?n+e:n]})),even:bt((function(t,e){for(var n=0;ne?e:n;--o>=0;)t.push(o);return t})),gt:bt((function(t,e,n){for(var o=n<0?n+e:n;++o1?function(e,n,o){for(var p=t.length;p--;)if(!t[p](e,n,o))return!1;return!0}:t[0]}function At(t,e,n,o,p){for(var M,b=[],c=0,r=t.length,z=null!=e;c-1&&(M[z]=!(b[z]=O))}}else s=At(s===b?s.splice(d,s.length):s),p?p(null,b,s,r):u.apply(b,s)}))}function lt(t){for(var o,p,M,b=t.length,c=e.relative[t[0].type],r=c||e.relative[" "],z=c?1:0,i=Ot((function(t){return t===o}),r,!0),O=Ot((function(t){return a.call(o,t)>-1}),r,!0),s=[function(t,e,p){var M=!c&&(p||e!=n)||((o=e).nodeType?i(t,e,p):O(t,e,p));return o=null,M}];z1&&st(s),z>1&&it(t.slice(0,z-1).concat({value:" "===t[z-2].type?"*":""})).replace(B,"$1"),p,z0,M=t.length>0,b=function(b,c,z,a,O){var s,A,l,d=0,q="0",h=b&&[],W=[],v=n,R=b||M&&e.find.TAG("*",O),m=f+=null==v?1:Math.random()||.1,L=R.length;for(O&&(n=c==r||c||O);q!==L&&null!=(s=R[q]);q++){if(M&&s){for(A=0,c||s.ownerDocument==r||(rt(s),z=!i);l=t[A++];)if(l(s,c||r,z)){u.call(a,s);break}O&&(f=m)}p&&((s=!l&&s)&&d--,b&&h.push(s))}if(d+=q,p&&q!==d){for(A=0;l=o[A++];)l(h,W,c,z);if(b){if(d>0)for(;q--;)h[q]||W[q]||(W[q]=_.call(a));W=At(W)}u.apply(a,W),O&&!b&&W.length>0&&d+o.length>1&&g.uniqueSort(a)}return O&&(f=m,n=v),h};return p?et(b):b}(b,M)),c.selector=t}return c}function ft(t,n,o,p){var M,b,c,r,z,a="function"==typeof t&&t,O=!p&&at(t=a.selector||t);if(o=o||[],1===O.length){if((b=O[0]=O[0].slice(0)).length>2&&"ID"===(c=b[0]).type&&9===n.nodeType&&i&&e.relative[b[1].type]){if(!(n=(e.find.ID(c.matches[0].replace(V,K),n)||[])[0]))return o;a&&(n=n.parentNode),t=t.slice(b.shift().value.length)}for(M=H.needsContext.test(t)?0:b.length;M--&&(c=b[M],!e.relative[r=c.type]);)if((z=e.find[r])&&(p=z(c.matches[0].replace(V,K),$.test(b[0].type)&&ct(n.parentNode)||n))){if(b.splice(M,1),!(t=p.length&&it(b)))return u.apply(o,p),o;break}}return(a||dt(t,O))(p,n,!i,o,!n||$.test(t)&&ct(n.parentNode)||n),o}zt.prototype=e.filters=e.pseudos,e.setFilters=new zt,l.sortStable=d.split("").sort(m).join("")===d,rt(),l.sortDetached=nt((function(t){return 1&t.compareDocumentPosition(r.createElement("fieldset"))})),g.find=Z,g.expr[":"]=g.expr.pseudos,g.unique=g.uniqueSort,Z.compile=dt,Z.select=ft,Z.setDocument=rt,Z.tokenize=at,Z.escape=g.escapeSelector,Z.getText=g.text,Z.isXML=g.isXMLDoc,Z.selectors=g.expr,Z.support=g.support,Z.uniqueSort=g.uniqueSort}();var x=function(t,e,n){for(var o=[],p=void 0!==n;(t=t[e])&&9!==t.nodeType;)if(1===t.nodeType){if(p&&g(t).is(n))break;o.push(t)}return o},k=function(t,e){for(var n=[];t;t=t.nextSibling)1===t.nodeType&&t!==e&&n.push(t);return n},I=g.expr.match.needsContext,D=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function P(t,e,n){return d(e)?g.grep(t,(function(t,o){return!!e.call(t,o,t)!==n})):e.nodeType?g.grep(t,(function(t){return t===e!==n})):"string"!=typeof e?g.grep(t,(function(t){return a.call(e,t)>-1!==n})):g.filter(e,t,n)}g.filter=function(t,e,n){var o=e[0];return n&&(t=":not("+t+")"),1===e.length&&1===o.nodeType?g.find.matchesSelector(o,t)?[o]:[]:g.find.matches(t,g.grep(e,(function(t){return 1===t.nodeType})))},g.fn.extend({find:function(t){var e,n,o=this.length,p=this;if("string"!=typeof t)return this.pushStack(g(t).filter((function(){for(e=0;e1?g.uniqueSort(n):n},filter:function(t){return this.pushStack(P(this,t||[],!1))},not:function(t){return this.pushStack(P(this,t||[],!0))},is:function(t){return!!P(this,"string"==typeof t&&I.test(t)?g(t):t||[],!1).length}});var U,j=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/;(g.fn.init=function(t,e,n){var o,p;if(!t)return this;if(n=n||U,"string"==typeof t){if(!(o="<"===t[0]&&">"===t[t.length-1]&&t.length>=3?[null,t,null]:j.exec(t))||!o[1]&&e)return!e||e.jquery?(e||n).find(t):this.constructor(e).find(t);if(o[1]){if(e=e instanceof g?e[0]:e,g.merge(this,g.parseHTML(o[1],e&&e.nodeType?e.ownerDocument||e:q,!0)),D.test(o[1])&&g.isPlainObject(e))for(o in e)d(this[o])?this[o](e[o]):this.attr(o,e[o]);return this}return(p=q.getElementById(o[2]))&&(this[0]=p,this.length=1),this}return t.nodeType?(this[0]=t,this.length=1,this):d(t)?void 0!==n.ready?n.ready(t):t(g):g.makeArray(t,this)}).prototype=g.fn,U=g(q);var H=/^(?:parents|prev(?:Until|All))/,F={children:!0,contents:!0,next:!0,prev:!0};function G(t,e){for(;(t=t[e])&&1!==t.nodeType;);return t}g.fn.extend({has:function(t){var e=g(t,this),n=e.length;return this.filter((function(){for(var t=0;t-1:1===n.nodeType&&g.find.matchesSelector(n,t))){M.push(n);break}return this.pushStack(M.length>1?g.uniqueSort(M):M)},index:function(t){return t?"string"==typeof t?a.call(g(t),this[0]):a.call(this,t.jquery?t[0]:t):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(t,e){return this.pushStack(g.uniqueSort(g.merge(this.get(),g(t,e))))},addBack:function(t){return this.add(null==t?this.prevObject:this.prevObject.filter(t))}}),g.each({parent:function(t){var e=t.parentNode;return e&&11!==e.nodeType?e:null},parents:function(t){return x(t,"parentNode")},parentsUntil:function(t,e,n){return x(t,"parentNode",n)},next:function(t){return G(t,"nextSibling")},prev:function(t){return G(t,"previousSibling")},nextAll:function(t){return x(t,"nextSibling")},prevAll:function(t){return x(t,"previousSibling")},nextUntil:function(t,e,n){return x(t,"nextSibling",n)},prevUntil:function(t,e,n){return x(t,"previousSibling",n)},siblings:function(t){return k((t.parentNode||{}).firstChild,t)},children:function(t){return k(t.firstChild)},contents:function(t){return null!=t.contentDocument&&b(t.contentDocument)?t.contentDocument:(y(t,"template")&&(t=t.content||t),g.merge([],t.childNodes))}},(function(t,e){g.fn[t]=function(n,o){var p=g.map(this,e,n);return"Until"!==t.slice(-5)&&(o=n),o&&"string"==typeof o&&(p=g.filter(o,p)),this.length>1&&(F[t]||g.uniqueSort(p),H.test(t)&&p.reverse()),this.pushStack(p)}}));var Y=/[^\x20\t\r\n\f]+/g;function $(t){return t}function V(t){throw t}function K(t,e,n,o){var p;try{t&&d(p=t.promise)?p.call(t).done(e).fail(n):t&&d(p=t.then)?p.call(t,e,n):e.apply(void 0,[t].slice(o))}catch(t){n.apply(void 0,[t])}}g.Callbacks=function(t){t="string"==typeof t?function(t){var e={};return g.each(t.match(Y)||[],(function(t,n){e[n]=!0})),e}(t):g.extend({},t);var e,n,o,p,M=[],b=[],c=-1,r=function(){for(p=p||t.once,o=e=!0;b.length;c=-1)for(n=b.shift();++c-1;)M.splice(n,1),n<=c&&c--})),this},has:function(t){return t?g.inArray(t,M)>-1:M.length>0},empty:function(){return M&&(M=[]),this},disable:function(){return p=b=[],M=n="",this},disabled:function(){return!M},lock:function(){return p=b=[],n||e||(M=n=""),this},locked:function(){return!!p},fireWith:function(t,n){return p||(n=[t,(n=n||[]).slice?n.slice():n],b.push(n),e||r()),this},fire:function(){return z.fireWith(this,arguments),this},fired:function(){return!!o}};return z},g.extend({Deferred:function(t){var e=[["notify","progress",g.Callbacks("memory"),g.Callbacks("memory"),2],["resolve","done",g.Callbacks("once memory"),g.Callbacks("once memory"),0,"resolved"],["reject","fail",g.Callbacks("once memory"),g.Callbacks("once memory"),1,"rejected"]],n="pending",p={state:function(){return n},always:function(){return M.done(arguments).fail(arguments),this},catch:function(t){return p.then(null,t)},pipe:function(){var t=arguments;return g.Deferred((function(n){g.each(e,(function(e,o){var p=d(t[o[4]])&&t[o[4]];M[o[1]]((function(){var t=p&&p.apply(this,arguments);t&&d(t.promise)?t.promise().progress(n.notify).done(n.resolve).fail(n.reject):n[o[0]+"With"](this,p?[t]:arguments)}))})),t=null})).promise()},then:function(t,n,p){var M=0;function b(t,e,n,p){return function(){var c=this,r=arguments,z=function(){var o,z;if(!(t=M&&(n!==V&&(c=void 0,r=[o]),e.rejectWith(c,r))}};t?a():(g.Deferred.getErrorHook?a.error=g.Deferred.getErrorHook():g.Deferred.getStackHook&&(a.error=g.Deferred.getStackHook()),o.setTimeout(a))}}return g.Deferred((function(o){e[0][3].add(b(0,o,d(p)?p:$,o.notifyWith)),e[1][3].add(b(0,o,d(t)?t:$)),e[2][3].add(b(0,o,d(n)?n:V))})).promise()},promise:function(t){return null!=t?g.extend(t,p):p}},M={};return g.each(e,(function(t,o){var b=o[2],c=o[5];p[o[1]]=b.add,c&&b.add((function(){n=c}),e[3-t][2].disable,e[3-t][3].disable,e[0][2].lock,e[0][3].lock),b.add(o[3].fire),M[o[0]]=function(){return M[o[0]+"With"](this===M?void 0:this,arguments),this},M[o[0]+"With"]=b.fireWith})),p.promise(M),t&&t.call(M,M),M},when:function(t){var e=arguments.length,n=e,o=Array(n),p=c.call(arguments),M=g.Deferred(),b=function(t){return function(n){o[t]=this,p[t]=arguments.length>1?c.call(arguments):n,--e||M.resolveWith(o,p)}};if(e<=1&&(K(t,M.done(b(n)).resolve,M.reject,!e),"pending"===M.state()||d(p[n]&&p[n].then)))return M.then();for(;n--;)K(p[n],b(n),M.reject);return M.promise()}});var Q=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;g.Deferred.exceptionHook=function(t,e){o.console&&o.console.warn&&t&&Q.test(t.name)&&o.console.warn("jQuery.Deferred exception: "+t.message,t.stack,e)},g.readyException=function(t){o.setTimeout((function(){throw t}))};var J=g.Deferred();function Z(){q.removeEventListener("DOMContentLoaded",Z),o.removeEventListener("load",Z),g.ready()}g.fn.ready=function(t){return J.then(t).catch((function(t){g.readyException(t)})),this},g.extend({isReady:!1,readyWait:1,ready:function(t){(!0===t?--g.readyWait:g.isReady)||(g.isReady=!0,!0!==t&&--g.readyWait>0||J.resolveWith(q,[g]))}}),g.ready.then=J.then,"complete"===q.readyState||"loading"!==q.readyState&&!q.documentElement.doScroll?o.setTimeout(g.ready):(q.addEventListener("DOMContentLoaded",Z),o.addEventListener("load",Z));var tt=function(t,e,n,o,p,M,b){var c=0,r=t.length,z=null==n;if("object"===v(n))for(c in p=!0,n)tt(t,e,c,n[c],!0,M,b);else if(void 0!==o&&(p=!0,d(o)||(b=!0),z&&(b?(e.call(t,o),e=null):(z=e,e=function(t,e,n){return z.call(g(t),n)})),e))for(;c1,null,!0)},removeData:function(t){return this.each((function(){rt.remove(this,t)}))}}),g.extend({queue:function(t,e,n){var o;if(t)return e=(e||"fx")+"queue",o=ct.get(t,e),n&&(!o||Array.isArray(n)?o=ct.access(t,e,g.makeArray(n)):o.push(n)),o||[]},dequeue:function(t,e){e=e||"fx";var n=g.queue(t,e),o=n.length,p=n.shift(),M=g._queueHooks(t,e);"inprogress"===p&&(p=n.shift(),o--),p&&("fx"===e&&n.unshift("inprogress"),delete M.stop,p.call(t,(function(){g.dequeue(t,e)}),M)),!o&&M&&M.empty.fire()},_queueHooks:function(t,e){var n=e+"queueHooks";return ct.get(t,n)||ct.access(t,n,{empty:g.Callbacks("once memory").add((function(){ct.remove(t,[e+"queue",n])}))})}}),g.fn.extend({queue:function(t,e){var n=2;return"string"!=typeof t&&(e=t,t="fx",n--),arguments.length\x20\t\r\n\f]*)/i,yt=/^$|^module$|\/(?:java|ecma)script/i;Rt=q.createDocumentFragment().appendChild(q.createElement("div")),(mt=q.createElement("input")).setAttribute("type","radio"),mt.setAttribute("checked","checked"),mt.setAttribute("name","t"),Rt.appendChild(mt),l.checkClone=Rt.cloneNode(!0).cloneNode(!0).lastChild.checked,Rt.innerHTML="",l.noCloneChecked=!!Rt.cloneNode(!0).lastChild.defaultValue,Rt.innerHTML="",l.option=!!Rt.lastChild;var _t={thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};function Nt(t,e){var n;return n=void 0!==t.getElementsByTagName?t.getElementsByTagName(e||"*"):void 0!==t.querySelectorAll?t.querySelectorAll(e||"*"):[],void 0===e||e&&y(t,e)?g.merge([t],n):n}function Et(t,e){for(var n=0,o=t.length;n",""]);var Tt=/<|&#?\w+;/;function Bt(t,e,n,o,p){for(var M,b,c,r,z,a,i=e.createDocumentFragment(),O=[],s=0,A=t.length;s-1)p&&p.push(M);else if(z=lt(M),b=Nt(i.appendChild(M),"script"),z&&Et(b),n)for(a=0;M=b[a++];)yt.test(M.type||"")&&n.push(M);return i}var Ct=/^([^.]*)(?:\.(.+)|)/;function wt(){return!0}function St(){return!1}function Xt(t,e,n,o,p,M){var b,c;if("object"==typeof e){for(c in"string"!=typeof n&&(o=o||n,n=void 0),e)Xt(t,c,n,o,e[c],M);return t}if(null==o&&null==p?(p=n,o=n=void 0):null==p&&("string"==typeof n?(p=o,o=void 0):(p=o,o=n,n=void 0)),!1===p)p=St;else if(!p)return t;return 1===M&&(b=p,p=function(t){return g().off(t),b.apply(this,arguments)},p.guid=b.guid||(b.guid=g.guid++)),t.each((function(){g.event.add(this,e,p,o,n)}))}function xt(t,e,n){n?(ct.set(t,e,!1),g.event.add(t,e,{namespace:!1,handler:function(t){var n,o=ct.get(this,e);if(1&t.isTrigger&&this[e]){if(o)(g.event.special[e]||{}).delegateType&&t.stopPropagation();else if(o=c.call(arguments),ct.set(this,e,o),this[e](),n=ct.get(this,e),ct.set(this,e,!1),o!==n)return t.stopImmediatePropagation(),t.preventDefault(),n}else o&&(ct.set(this,e,g.event.trigger(o[0],o.slice(1),this)),t.stopPropagation(),t.isImmediatePropagationStopped=wt)}})):void 0===ct.get(t,e)&&g.event.add(t,e,wt)}g.event={global:{},add:function(t,e,n,o,p){var M,b,c,r,z,a,i,O,s,A,u,l=ct.get(t);if(Mt(t))for(n.handler&&(n=(M=n).handler,p=M.selector),p&&g.find.matchesSelector(ut,p),n.guid||(n.guid=g.guid++),(r=l.events)||(r=l.events=Object.create(null)),(b=l.handle)||(b=l.handle=function(e){return void 0!==g&&g.event.triggered!==e.type?g.event.dispatch.apply(t,arguments):void 0}),z=(e=(e||"").match(Y)||[""]).length;z--;)s=u=(c=Ct.exec(e[z])||[])[1],A=(c[2]||"").split(".").sort(),s&&(i=g.event.special[s]||{},s=(p?i.delegateType:i.bindType)||s,i=g.event.special[s]||{},a=g.extend({type:s,origType:u,data:o,handler:n,guid:n.guid,selector:p,needsContext:p&&g.expr.match.needsContext.test(p),namespace:A.join(".")},M),(O=r[s])||((O=r[s]=[]).delegateCount=0,i.setup&&!1!==i.setup.call(t,o,A,b)||t.addEventListener&&t.addEventListener(s,b)),i.add&&(i.add.call(t,a),a.handler.guid||(a.handler.guid=n.guid)),p?O.splice(O.delegateCount++,0,a):O.push(a),g.event.global[s]=!0)},remove:function(t,e,n,o,p){var M,b,c,r,z,a,i,O,s,A,u,l=ct.hasData(t)&&ct.get(t);if(l&&(r=l.events)){for(z=(e=(e||"").match(Y)||[""]).length;z--;)if(s=u=(c=Ct.exec(e[z])||[])[1],A=(c[2]||"").split(".").sort(),s){for(i=g.event.special[s]||{},O=r[s=(o?i.delegateType:i.bindType)||s]||[],c=c[2]&&new RegExp("(^|\\.)"+A.join("\\.(?:.*\\.|)")+"(\\.|$)"),b=M=O.length;M--;)a=O[M],!p&&u!==a.origType||n&&n.guid!==a.guid||c&&!c.test(a.namespace)||o&&o!==a.selector&&("**"!==o||!a.selector)||(O.splice(M,1),a.selector&&O.delegateCount--,i.remove&&i.remove.call(t,a));b&&!O.length&&(i.teardown&&!1!==i.teardown.call(t,A,l.handle)||g.removeEvent(t,s,l.handle),delete r[s])}else for(s in r)g.event.remove(t,s+e[z],n,o,!0);g.isEmptyObject(r)&&ct.remove(t,"handle events")}},dispatch:function(t){var e,n,o,p,M,b,c=new Array(arguments.length),r=g.event.fix(t),z=(ct.get(this,"events")||Object.create(null))[r.type]||[],a=g.event.special[r.type]||{};for(c[0]=r,e=1;e=1))for(;z!==this;z=z.parentNode||this)if(1===z.nodeType&&("click"!==t.type||!0!==z.disabled)){for(M=[],b={},n=0;n-1:g.find(p,this,null,[z]).length),b[p]&&M.push(o);M.length&&c.push({elem:z,handlers:M})}return z=this,r\s*$/g;function Pt(t,e){return y(t,"table")&&y(11!==e.nodeType?e:e.firstChild,"tr")&&g(t).children("tbody")[0]||t}function Ut(t){return t.type=(null!==t.getAttribute("type"))+"/"+t.type,t}function jt(t){return"true/"===(t.type||"").slice(0,5)?t.type=t.type.slice(5):t.removeAttribute("type"),t}function Ht(t,e){var n,o,p,M,b,c;if(1===e.nodeType){if(ct.hasData(t)&&(c=ct.get(t).events))for(p in ct.remove(e,"handle events"),c)for(n=0,o=c[p].length;n1&&"string"==typeof A&&!l.checkClone&&It.test(A))return t.each((function(p){var M=t.eq(p);u&&(e[0]=A.call(this,p,M.html())),Gt(M,e,n,o)}));if(O&&(M=(p=Bt(e,t[0].ownerDocument,!1,t,o)).firstChild,1===p.childNodes.length&&(p=M),M||o)){for(c=(b=g.map(Nt(p,"script"),Ut)).length;i0&&Et(b,!r&&Nt(t,"script")),c},cleanData:function(t){for(var e,n,o,p=g.event.special,M=0;void 0!==(n=t[M]);M++)if(Mt(n)){if(e=n[ct.expando]){if(e.events)for(o in e.events)p[o]?g.event.remove(n,o):g.removeEvent(n,o,e.handle);n[ct.expando]=void 0}n[rt.expando]&&(n[rt.expando]=void 0)}}}),g.fn.extend({detach:function(t){return Yt(this,t,!0)},remove:function(t){return Yt(this,t)},text:function(t){return tt(this,(function(t){return void 0===t?g.text(this):this.empty().each((function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=t)}))}),null,t,arguments.length)},append:function(){return Gt(this,arguments,(function(t){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||Pt(this,t).appendChild(t)}))},prepend:function(){return Gt(this,arguments,(function(t){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var e=Pt(this,t);e.insertBefore(t,e.firstChild)}}))},before:function(){return Gt(this,arguments,(function(t){this.parentNode&&this.parentNode.insertBefore(t,this)}))},after:function(){return Gt(this,arguments,(function(t){this.parentNode&&this.parentNode.insertBefore(t,this.nextSibling)}))},empty:function(){for(var t,e=0;null!=(t=this[e]);e++)1===t.nodeType&&(g.cleanData(Nt(t,!1)),t.textContent="");return this},clone:function(t,e){return t=null!=t&&t,e=null==e?t:e,this.map((function(){return g.clone(this,t,e)}))},html:function(t){return tt(this,(function(t){var e=this[0]||{},n=0,o=this.length;if(void 0===t&&1===e.nodeType)return e.innerHTML;if("string"==typeof t&&!kt.test(t)&&!_t[(Lt.exec(t)||["",""])[1].toLowerCase()]){t=g.htmlPrefilter(t);try{for(;n=0&&(r+=Math.max(0,Math.ceil(t["offset"+e[0].toUpperCase()+e.slice(1)]-M-r-c-.5))||0),r+z}function ae(t,e,n){var o=Kt(t),p=(!l.boxSizingReliable()||n)&&"border-box"===g.css(t,"boxSizing",!1,o),M=p,b=Zt(t,e,o),c="offset"+e[0].toUpperCase()+e.slice(1);if($t.test(b)){if(!n)return b;b="auto"}return(!l.boxSizingReliable()&&p||!l.reliableTrDimensions()&&y(t,"tr")||"auto"===b||!parseFloat(b)&&"inline"===g.css(t,"display",!1,o))&&t.getClientRects().length&&(p="border-box"===g.css(t,"boxSizing",!1,o),(M=c in t)&&(b=t[c])),(b=parseFloat(b)||0)+ze(t,e,n||(p?"border":"content"),M,o,b)+"px"}function ie(t,e,n,o,p){return new ie.prototype.init(t,e,n,o,p)}g.extend({cssHooks:{opacity:{get:function(t,e){if(e){var n=Zt(t,"opacity");return""===n?"1":n}}}},cssNumber:{animationIterationCount:!0,aspectRatio:!0,borderImageSlice:!0,columnCount:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,gridArea:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnStart:!0,gridRow:!0,gridRowEnd:!0,gridRowStart:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,scale:!0,widows:!0,zIndex:!0,zoom:!0,fillOpacity:!0,floodOpacity:!0,stopOpacity:!0,strokeMiterlimit:!0,strokeOpacity:!0},cssProps:{},style:function(t,e,n,o){if(t&&3!==t.nodeType&&8!==t.nodeType&&t.style){var p,M,b,c=pt(e),r=Vt.test(e),z=t.style;if(r||(e=pe(c)),b=g.cssHooks[e]||g.cssHooks[c],void 0===n)return b&&"get"in b&&void 0!==(p=b.get(t,!1,o))?p:z[e];"string"===(M=typeof n)&&(p=st.exec(n))&&p[1]&&(n=qt(t,e,p),M="number"),null!=n&&n==n&&("number"!==M||r||(n+=p&&p[3]||(g.cssNumber[c]?"":"px")),l.clearCloneStyle||""!==n||0!==e.indexOf("background")||(z[e]="inherit"),b&&"set"in b&&void 0===(n=b.set(t,n,o))||(r?z.setProperty(e,n):z[e]=n))}},css:function(t,e,n,o){var p,M,b,c=pt(e);return Vt.test(e)||(e=pe(c)),(b=g.cssHooks[e]||g.cssHooks[c])&&"get"in b&&(p=b.get(t,!0,n)),void 0===p&&(p=Zt(t,e,o)),"normal"===p&&e in ce&&(p=ce[e]),""===n||n?(M=parseFloat(p),!0===n||isFinite(M)?M||0:p):p}}),g.each(["height","width"],(function(t,e){g.cssHooks[e]={get:function(t,n,o){if(n)return!Me.test(g.css(t,"display"))||t.getClientRects().length&&t.getBoundingClientRect().width?ae(t,e,o):Qt(t,be,(function(){return ae(t,e,o)}))},set:function(t,n,o){var p,M=Kt(t),b=!l.scrollboxSize()&&"absolute"===M.position,c=(b||o)&&"border-box"===g.css(t,"boxSizing",!1,M),r=o?ze(t,e,o,c,M):0;return c&&b&&(r-=Math.ceil(t["offset"+e[0].toUpperCase()+e.slice(1)]-parseFloat(M[e])-ze(t,e,"border",!1,M)-.5)),r&&(p=st.exec(n))&&"px"!==(p[3]||"px")&&(t.style[e]=n,n=g.css(t,e)),re(0,n,r)}}})),g.cssHooks.marginLeft=te(l.reliableMarginLeft,(function(t,e){if(e)return(parseFloat(Zt(t,"marginLeft"))||t.getBoundingClientRect().left-Qt(t,{marginLeft:0},(function(){return t.getBoundingClientRect().left})))+"px"})),g.each({margin:"",padding:"",border:"Width"},(function(t,e){g.cssHooks[t+e]={expand:function(n){for(var o=0,p={},M="string"==typeof n?n.split(" "):[n];o<4;o++)p[t+At[o]+e]=M[o]||M[o-2]||M[0];return p}},"margin"!==t&&(g.cssHooks[t+e].set=re)})),g.fn.extend({css:function(t,e){return tt(this,(function(t,e,n){var o,p,M={},b=0;if(Array.isArray(e)){for(o=Kt(t),p=e.length;b1)}}),g.Tween=ie,ie.prototype={constructor:ie,init:function(t,e,n,o,p,M){this.elem=t,this.prop=n,this.easing=p||g.easing._default,this.options=e,this.start=this.now=this.cur(),this.end=o,this.unit=M||(g.cssNumber[n]?"":"px")},cur:function(){var t=ie.propHooks[this.prop];return t&&t.get?t.get(this):ie.propHooks._default.get(this)},run:function(t){var e,n=ie.propHooks[this.prop];return this.options.duration?this.pos=e=g.easing[this.easing](t,this.options.duration*t,0,1,this.options.duration):this.pos=e=t,this.now=(this.end-this.start)*e+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):ie.propHooks._default.set(this),this}},ie.prototype.init.prototype=ie.prototype,ie.propHooks={_default:{get:function(t){var e;return 1!==t.elem.nodeType||null!=t.elem[t.prop]&&null==t.elem.style[t.prop]?t.elem[t.prop]:(e=g.css(t.elem,t.prop,""))&&"auto"!==e?e:0},set:function(t){g.fx.step[t.prop]?g.fx.step[t.prop](t):1!==t.elem.nodeType||!g.cssHooks[t.prop]&&null==t.elem.style[pe(t.prop)]?t.elem[t.prop]=t.now:g.style(t.elem,t.prop,t.now+t.unit)}}},ie.propHooks.scrollTop=ie.propHooks.scrollLeft={set:function(t){t.elem.nodeType&&t.elem.parentNode&&(t.elem[t.prop]=t.now)}},g.easing={linear:function(t){return t},swing:function(t){return.5-Math.cos(t*Math.PI)/2},_default:"swing"},g.fx=ie.prototype.init,g.fx.step={};var Oe,se,Ae=/^(?:toggle|show|hide)$/,ue=/queueHooks$/;function le(){se&&(!1===q.hidden&&o.requestAnimationFrame?o.requestAnimationFrame(le):o.setTimeout(le,g.fx.interval),g.fx.tick())}function de(){return o.setTimeout((function(){Oe=void 0})),Oe=Date.now()}function fe(t,e){var n,o=0,p={height:t};for(e=e?1:0;o<4;o+=2-e)p["margin"+(n=At[o])]=p["padding"+n]=t;return e&&(p.opacity=p.width=t),p}function qe(t,e,n){for(var o,p=(he.tweeners[e]||[]).concat(he.tweeners["*"]),M=0,b=p.length;M1)},removeAttr:function(t){return this.each((function(){g.removeAttr(this,t)}))}}),g.extend({attr:function(t,e,n){var o,p,M=t.nodeType;if(3!==M&&8!==M&&2!==M)return void 0===t.getAttribute?g.prop(t,e,n):(1===M&&g.isXMLDoc(t)||(p=g.attrHooks[e.toLowerCase()]||(g.expr.match.bool.test(e)?We:void 0)),void 0!==n?null===n?void g.removeAttr(t,e):p&&"set"in p&&void 0!==(o=p.set(t,n,e))?o:(t.setAttribute(e,n+""),n):p&&"get"in p&&null!==(o=p.get(t,e))?o:null==(o=g.find.attr(t,e))?void 0:o)},attrHooks:{type:{set:function(t,e){if(!l.radioValue&&"radio"===e&&y(t,"input")){var n=t.value;return t.setAttribute("type",e),n&&(t.value=n),e}}}},removeAttr:function(t,e){var n,o=0,p=e&&e.match(Y);if(p&&1===t.nodeType)for(;n=p[o++];)t.removeAttribute(n)}}),We={set:function(t,e,n){return!1===e?g.removeAttr(t,n):t.setAttribute(n,n),n}},g.each(g.expr.match.bool.source.match(/\w+/g),(function(t,e){var n=ve[e]||g.find.attr;ve[e]=function(t,e,o){var p,M,b=e.toLowerCase();return o||(M=ve[b],ve[b]=p,p=null!=n(t,e,o)?b:null,ve[b]=M),p}}));var Re=/^(?:input|select|textarea|button)$/i,me=/^(?:a|area)$/i;function ge(t){return(t.match(Y)||[]).join(" ")}function Le(t){return t.getAttribute&&t.getAttribute("class")||""}function ye(t){return Array.isArray(t)?t:"string"==typeof t&&t.match(Y)||[]}g.fn.extend({prop:function(t,e){return tt(this,g.prop,t,e,arguments.length>1)},removeProp:function(t){return this.each((function(){delete this[g.propFix[t]||t]}))}}),g.extend({prop:function(t,e,n){var o,p,M=t.nodeType;if(3!==M&&8!==M&&2!==M)return 1===M&&g.isXMLDoc(t)||(e=g.propFix[e]||e,p=g.propHooks[e]),void 0!==n?p&&"set"in p&&void 0!==(o=p.set(t,n,e))?o:t[e]=n:p&&"get"in p&&null!==(o=p.get(t,e))?o:t[e]},propHooks:{tabIndex:{get:function(t){var e=g.find.attr(t,"tabindex");return e?parseInt(e,10):Re.test(t.nodeName)||me.test(t.nodeName)&&t.href?0:-1}}},propFix:{for:"htmlFor",class:"className"}}),l.optSelected||(g.propHooks.selected={get:function(t){var e=t.parentNode;return e&&e.parentNode&&e.parentNode.selectedIndex,null},set:function(t){var e=t.parentNode;e&&(e.selectedIndex,e.parentNode&&e.parentNode.selectedIndex)}}),g.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],(function(){g.propFix[this.toLowerCase()]=this})),g.fn.extend({addClass:function(t){var e,n,o,p,M,b;return d(t)?this.each((function(e){g(this).addClass(t.call(this,e,Le(this)))})):(e=ye(t)).length?this.each((function(){if(o=Le(this),n=1===this.nodeType&&" "+ge(o)+" "){for(M=0;M-1;)n=n.replace(" "+p+" "," ");b=ge(n),o!==b&&this.setAttribute("class",b)}})):this:this.attr("class","")},toggleClass:function(t,e){var n,o,p,M,b=typeof t,c="string"===b||Array.isArray(t);return d(t)?this.each((function(n){g(this).toggleClass(t.call(this,n,Le(this),e),e)})):"boolean"==typeof e&&c?e?this.addClass(t):this.removeClass(t):(n=ye(t),this.each((function(){if(c)for(M=g(this),p=0;p-1)return!0;return!1}});var _e=/\r/g;g.fn.extend({val:function(t){var e,n,o,p=this[0];return arguments.length?(o=d(t),this.each((function(n){var p;1===this.nodeType&&(null==(p=o?t.call(this,n,g(this).val()):t)?p="":"number"==typeof p?p+="":Array.isArray(p)&&(p=g.map(p,(function(t){return null==t?"":t+""}))),(e=g.valHooks[this.type]||g.valHooks[this.nodeName.toLowerCase()])&&"set"in e&&void 0!==e.set(this,p,"value")||(this.value=p))}))):p?(e=g.valHooks[p.type]||g.valHooks[p.nodeName.toLowerCase()])&&"get"in e&&void 0!==(n=e.get(p,"value"))?n:"string"==typeof(n=p.value)?n.replace(_e,""):null==n?"":n:void 0}}),g.extend({valHooks:{option:{get:function(t){var e=g.find.attr(t,"value");return null!=e?e:ge(g.text(t))}},select:{get:function(t){var e,n,o,p=t.options,M=t.selectedIndex,b="select-one"===t.type,c=b?null:[],r=b?M+1:p.length;for(o=M<0?r:b?M:0;o-1)&&(n=!0);return n||(t.selectedIndex=-1),M}}}}),g.each(["radio","checkbox"],(function(){g.valHooks[this]={set:function(t,e){if(Array.isArray(e))return t.checked=g.inArray(g(t).val(),e)>-1}},l.checkOn||(g.valHooks[this].get=function(t){return null===t.getAttribute("value")?"on":t.value})}));var Ne=o.location,Ee={guid:Date.now()},Te=/\?/;g.parseXML=function(t){var e,n;if(!t||"string"!=typeof t)return null;try{e=(new o.DOMParser).parseFromString(t,"text/xml")}catch(t){}return n=e&&e.getElementsByTagName("parsererror")[0],e&&!n||g.error("Invalid XML: "+(n?g.map(n.childNodes,(function(t){return t.textContent})).join("\n"):t)),e};var Be=/^(?:focusinfocus|focusoutblur)$/,Ce=function(t){t.stopPropagation()};g.extend(g.event,{trigger:function(t,e,n,p){var M,b,c,r,z,a,i,O,A=[n||q],u=s.call(t,"type")?t.type:t,l=s.call(t,"namespace")?t.namespace.split("."):[];if(b=O=c=n=n||q,3!==n.nodeType&&8!==n.nodeType&&!Be.test(u+g.event.triggered)&&(u.indexOf(".")>-1&&(l=u.split("."),u=l.shift(),l.sort()),z=u.indexOf(":")<0&&"on"+u,(t=t[g.expando]?t:new g.Event(u,"object"==typeof t&&t)).isTrigger=p?2:3,t.namespace=l.join("."),t.rnamespace=t.namespace?new RegExp("(^|\\.)"+l.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,t.result=void 0,t.target||(t.target=n),e=null==e?[t]:g.makeArray(e,[t]),i=g.event.special[u]||{},p||!i.trigger||!1!==i.trigger.apply(n,e))){if(!p&&!i.noBubble&&!f(n)){for(r=i.delegateType||u,Be.test(r+u)||(b=b.parentNode);b;b=b.parentNode)A.push(b),c=b;c===(n.ownerDocument||q)&&A.push(c.defaultView||c.parentWindow||o)}for(M=0;(b=A[M++])&&!t.isPropagationStopped();)O=b,t.type=M>1?r:i.bindType||u,(a=(ct.get(b,"events")||Object.create(null))[t.type]&&ct.get(b,"handle"))&&a.apply(b,e),(a=z&&b[z])&&a.apply&&Mt(b)&&(t.result=a.apply(b,e),!1===t.result&&t.preventDefault());return t.type=u,p||t.isDefaultPrevented()||i._default&&!1!==i._default.apply(A.pop(),e)||!Mt(n)||z&&d(n[u])&&!f(n)&&((c=n[z])&&(n[z]=null),g.event.triggered=u,t.isPropagationStopped()&&O.addEventListener(u,Ce),n[u](),t.isPropagationStopped()&&O.removeEventListener(u,Ce),g.event.triggered=void 0,c&&(n[z]=c)),t.result}},simulate:function(t,e,n){var o=g.extend(new g.Event,n,{type:t,isSimulated:!0});g.event.trigger(o,null,e)}}),g.fn.extend({trigger:function(t,e){return this.each((function(){g.event.trigger(t,e,this)}))},triggerHandler:function(t,e){var n=this[0];if(n)return g.event.trigger(t,e,n,!0)}});var we=/\[\]$/,Se=/\r?\n/g,Xe=/^(?:submit|button|image|reset|file)$/i,xe=/^(?:input|select|textarea|keygen)/i;function ke(t,e,n,o){var p;if(Array.isArray(e))g.each(e,(function(e,p){n||we.test(t)?o(t,p):ke(t+"["+("object"==typeof p&&null!=p?e:"")+"]",p,n,o)}));else if(n||"object"!==v(e))o(t,e);else for(p in e)ke(t+"["+p+"]",e[p],n,o)}g.param=function(t,e){var n,o=[],p=function(t,e){var n=d(e)?e():e;o[o.length]=encodeURIComponent(t)+"="+encodeURIComponent(null==n?"":n)};if(null==t)return"";if(Array.isArray(t)||t.jquery&&!g.isPlainObject(t))g.each(t,(function(){p(this.name,this.value)}));else for(n in t)ke(n,t[n],e,p);return o.join("&")},g.fn.extend({serialize:function(){return g.param(this.serializeArray())},serializeArray:function(){return this.map((function(){var t=g.prop(this,"elements");return t?g.makeArray(t):this})).filter((function(){var t=this.type;return this.name&&!g(this).is(":disabled")&&xe.test(this.nodeName)&&!Xe.test(t)&&(this.checked||!gt.test(t))})).map((function(t,e){var n=g(this).val();return null==n?null:Array.isArray(n)?g.map(n,(function(t){return{name:e.name,value:t.replace(Se,"\r\n")}})):{name:e.name,value:n.replace(Se,"\r\n")}})).get()}});var Ie=/%20/g,De=/#.*$/,Pe=/([?&])_=[^&]*/,Ue=/^(.*?):[ \t]*([^\r\n]*)$/gm,je=/^(?:GET|HEAD)$/,He=/^\/\//,Fe={},Ge={},Ye="*/".concat("*"),$e=q.createElement("a");function Ve(t){return function(e,n){"string"!=typeof e&&(n=e,e="*");var o,p=0,M=e.toLowerCase().match(Y)||[];if(d(n))for(;o=M[p++];)"+"===o[0]?(o=o.slice(1)||"*",(t[o]=t[o]||[]).unshift(n)):(t[o]=t[o]||[]).push(n)}}function Ke(t,e,n,o){var p={},M=t===Ge;function b(c){var r;return p[c]=!0,g.each(t[c]||[],(function(t,c){var z=c(e,n,o);return"string"!=typeof z||M||p[z]?M?!(r=z):void 0:(e.dataTypes.unshift(z),b(z),!1)})),r}return b(e.dataTypes[0])||!p["*"]&&b("*")}function Qe(t,e){var n,o,p=g.ajaxSettings.flatOptions||{};for(n in e)void 0!==e[n]&&((p[n]?t:o||(o={}))[n]=e[n]);return o&&g.extend(!0,t,o),t}$e.href=Ne.href,g.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:Ne.href,type:"GET",isLocal:/^(?:about|app|app-storage|.+-extension|file|res|widget):$/.test(Ne.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Ye,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":JSON.parse,"text xml":g.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(t,e){return e?Qe(Qe(t,g.ajaxSettings),e):Qe(g.ajaxSettings,t)},ajaxPrefilter:Ve(Fe),ajaxTransport:Ve(Ge),ajax:function(t,e){"object"==typeof t&&(e=t,t=void 0),e=e||{};var n,p,M,b,c,r,z,a,i,O,s=g.ajaxSetup({},e),A=s.context||s,u=s.context&&(A.nodeType||A.jquery)?g(A):g.event,l=g.Deferred(),d=g.Callbacks("once memory"),f=s.statusCode||{},h={},W={},v="canceled",R={readyState:0,getResponseHeader:function(t){var e;if(z){if(!b)for(b={};e=Ue.exec(M);)b[e[1].toLowerCase()+" "]=(b[e[1].toLowerCase()+" "]||[]).concat(e[2]);e=b[t.toLowerCase()+" "]}return null==e?null:e.join(", ")},getAllResponseHeaders:function(){return z?M:null},setRequestHeader:function(t,e){return null==z&&(t=W[t.toLowerCase()]=W[t.toLowerCase()]||t,h[t]=e),this},overrideMimeType:function(t){return null==z&&(s.mimeType=t),this},statusCode:function(t){var e;if(t)if(z)R.always(t[R.status]);else for(e in t)f[e]=[f[e],t[e]];return this},abort:function(t){var e=t||v;return n&&n.abort(e),m(0,e),this}};if(l.promise(R),s.url=((t||s.url||Ne.href)+"").replace(He,Ne.protocol+"//"),s.type=e.method||e.type||s.method||s.type,s.dataTypes=(s.dataType||"*").toLowerCase().match(Y)||[""],null==s.crossDomain){r=q.createElement("a");try{r.href=s.url,r.href=r.href,s.crossDomain=$e.protocol+"//"+$e.host!=r.protocol+"//"+r.host}catch(t){s.crossDomain=!0}}if(s.data&&s.processData&&"string"!=typeof s.data&&(s.data=g.param(s.data,s.traditional)),Ke(Fe,s,e,R),z)return R;for(i in(a=g.event&&s.global)&&0==g.active++&&g.event.trigger("ajaxStart"),s.type=s.type.toUpperCase(),s.hasContent=!je.test(s.type),p=s.url.replace(De,""),s.hasContent?s.data&&s.processData&&0===(s.contentType||"").indexOf("application/x-www-form-urlencoded")&&(s.data=s.data.replace(Ie,"+")):(O=s.url.slice(p.length),s.data&&(s.processData||"string"==typeof s.data)&&(p+=(Te.test(p)?"&":"?")+s.data,delete s.data),!1===s.cache&&(p=p.replace(Pe,"$1"),O=(Te.test(p)?"&":"?")+"_="+Ee.guid+++O),s.url=p+O),s.ifModified&&(g.lastModified[p]&&R.setRequestHeader("If-Modified-Since",g.lastModified[p]),g.etag[p]&&R.setRequestHeader("If-None-Match",g.etag[p])),(s.data&&s.hasContent&&!1!==s.contentType||e.contentType)&&R.setRequestHeader("Content-Type",s.contentType),R.setRequestHeader("Accept",s.dataTypes[0]&&s.accepts[s.dataTypes[0]]?s.accepts[s.dataTypes[0]]+("*"!==s.dataTypes[0]?", "+Ye+"; q=0.01":""):s.accepts["*"]),s.headers)R.setRequestHeader(i,s.headers[i]);if(s.beforeSend&&(!1===s.beforeSend.call(A,R,s)||z))return R.abort();if(v="abort",d.add(s.complete),R.done(s.success),R.fail(s.error),n=Ke(Ge,s,e,R)){if(R.readyState=1,a&&u.trigger("ajaxSend",[R,s]),z)return R;s.async&&s.timeout>0&&(c=o.setTimeout((function(){R.abort("timeout")}),s.timeout));try{z=!1,n.send(h,m)}catch(t){if(z)throw t;m(-1,t)}}else m(-1,"No Transport");function m(t,e,b,r){var i,O,q,h,W,v=e;z||(z=!0,c&&o.clearTimeout(c),n=void 0,M=r||"",R.readyState=t>0?4:0,i=t>=200&&t<300||304===t,b&&(h=function(t,e,n){for(var o,p,M,b,c=t.contents,r=t.dataTypes;"*"===r[0];)r.shift(),void 0===o&&(o=t.mimeType||e.getResponseHeader("Content-Type"));if(o)for(p in c)if(c[p]&&c[p].test(o)){r.unshift(p);break}if(r[0]in n)M=r[0];else{for(p in n){if(!r[0]||t.converters[p+" "+r[0]]){M=p;break}b||(b=p)}M=M||b}if(M)return M!==r[0]&&r.unshift(M),n[M]}(s,R,b)),!i&&g.inArray("script",s.dataTypes)>-1&&g.inArray("json",s.dataTypes)<0&&(s.converters["text script"]=function(){}),h=function(t,e,n,o){var p,M,b,c,r,z={},a=t.dataTypes.slice();if(a[1])for(b in t.converters)z[b.toLowerCase()]=t.converters[b];for(M=a.shift();M;)if(t.responseFields[M]&&(n[t.responseFields[M]]=e),!r&&o&&t.dataFilter&&(e=t.dataFilter(e,t.dataType)),r=M,M=a.shift())if("*"===M)M=r;else if("*"!==r&&r!==M){if(!(b=z[r+" "+M]||z["* "+M]))for(p in z)if((c=p.split(" "))[1]===M&&(b=z[r+" "+c[0]]||z["* "+c[0]])){!0===b?b=z[p]:!0!==z[p]&&(M=c[0],a.unshift(c[1]));break}if(!0!==b)if(b&&t.throws)e=b(e);else try{e=b(e)}catch(t){return{state:"parsererror",error:b?t:"No conversion from "+r+" to "+M}}}return{state:"success",data:e}}(s,h,R,i),i?(s.ifModified&&((W=R.getResponseHeader("Last-Modified"))&&(g.lastModified[p]=W),(W=R.getResponseHeader("etag"))&&(g.etag[p]=W)),204===t||"HEAD"===s.type?v="nocontent":304===t?v="notmodified":(v=h.state,O=h.data,i=!(q=h.error))):(q=v,!t&&v||(v="error",t<0&&(t=0))),R.status=t,R.statusText=(e||v)+"",i?l.resolveWith(A,[O,v,R]):l.rejectWith(A,[R,v,q]),R.statusCode(f),f=void 0,a&&u.trigger(i?"ajaxSuccess":"ajaxError",[R,s,i?O:q]),d.fireWith(A,[R,v]),a&&(u.trigger("ajaxComplete",[R,s]),--g.active||g.event.trigger("ajaxStop")))}return R},getJSON:function(t,e,n){return g.get(t,e,n,"json")},getScript:function(t,e){return g.get(t,void 0,e,"script")}}),g.each(["get","post"],(function(t,e){g[e]=function(t,n,o,p){return d(n)&&(p=p||o,o=n,n=void 0),g.ajax(g.extend({url:t,type:e,dataType:p,data:n,success:o},g.isPlainObject(t)&&t))}})),g.ajaxPrefilter((function(t){var e;for(e in t.headers)"content-type"===e.toLowerCase()&&(t.contentType=t.headers[e]||"")})),g._evalUrl=function(t,e,n){return g.ajax({url:t,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,converters:{"text script":function(){}},dataFilter:function(t){g.globalEval(t,e,n)}})},g.fn.extend({wrapAll:function(t){var e;return this[0]&&(d(t)&&(t=t.call(this[0])),e=g(t,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&e.insertBefore(this[0]),e.map((function(){for(var t=this;t.firstElementChild;)t=t.firstElementChild;return t})).append(this)),this},wrapInner:function(t){return d(t)?this.each((function(e){g(this).wrapInner(t.call(this,e))})):this.each((function(){var e=g(this),n=e.contents();n.length?n.wrapAll(t):e.append(t)}))},wrap:function(t){var e=d(t);return this.each((function(n){g(this).wrapAll(e?t.call(this,n):t)}))},unwrap:function(t){return this.parent(t).not("body").each((function(){g(this).replaceWith(this.childNodes)})),this}}),g.expr.pseudos.hidden=function(t){return!g.expr.pseudos.visible(t)},g.expr.pseudos.visible=function(t){return!!(t.offsetWidth||t.offsetHeight||t.getClientRects().length)},g.ajaxSettings.xhr=function(){try{return new o.XMLHttpRequest}catch(t){}};var Je={0:200,1223:204},Ze=g.ajaxSettings.xhr();l.cors=!!Ze&&"withCredentials"in Ze,l.ajax=Ze=!!Ze,g.ajaxTransport((function(t){var e,n;if(l.cors||Ze&&!t.crossDomain)return{send:function(p,M){var b,c=t.xhr();if(c.open(t.type,t.url,t.async,t.username,t.password),t.xhrFields)for(b in t.xhrFields)c[b]=t.xhrFields[b];for(b in t.mimeType&&c.overrideMimeType&&c.overrideMimeType(t.mimeType),t.crossDomain||p["X-Requested-With"]||(p["X-Requested-With"]="XMLHttpRequest"),p)c.setRequestHeader(b,p[b]);e=function(t){return function(){e&&(e=n=c.onload=c.onerror=c.onabort=c.ontimeout=c.onreadystatechange=null,"abort"===t?c.abort():"error"===t?"number"!=typeof c.status?M(0,"error"):M(c.status,c.statusText):M(Je[c.status]||c.status,c.statusText,"text"!==(c.responseType||"text")||"string"!=typeof c.responseText?{binary:c.response}:{text:c.responseText},c.getAllResponseHeaders()))}},c.onload=e(),n=c.onerror=c.ontimeout=e("error"),void 0!==c.onabort?c.onabort=n:c.onreadystatechange=function(){4===c.readyState&&o.setTimeout((function(){e&&n()}))},e=e("abort");try{c.send(t.hasContent&&t.data||null)}catch(t){if(e)throw t}},abort:function(){e&&e()}}})),g.ajaxPrefilter((function(t){t.crossDomain&&(t.contents.script=!1)})),g.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(t){return g.globalEval(t),t}}}),g.ajaxPrefilter("script",(function(t){void 0===t.cache&&(t.cache=!1),t.crossDomain&&(t.type="GET")})),g.ajaxTransport("script",(function(t){var e,n;if(t.crossDomain||t.scriptAttrs)return{send:function(o,p){e=g(" + @endscript +
+

Manual

+ + @endif +
+
+ + diff --git a/resources/views/livewire/server/cloudflare-tunnels.blade.php b/resources/views/livewire/server/cloudflare-tunnels.blade.php deleted file mode 100644 index b09b29163..000000000 --- a/resources/views/livewire/server/cloudflare-tunnels.blade.php +++ /dev/null @@ -1,53 +0,0 @@ -
- - {{ data_get_str($server, 'name')->limit(10) }} > Cloudflare Tunnels | Coolify - - -
- -
-
-
-

Cloudflare Tunnels

- -
-
Secure your servers with Cloudflare Tunnels.
-
-
- @if ($isCloudflareTunnelsEnabled) -
- -
- @elseif (!$server->isFunctional()) -
- To automatically configure Cloudflare Tunnels, please - validate your server first. Then you will need a Cloudflare token and an SSH - domain configured. -
- To manually configure Cloudflare Tunnels, please - click here, - then you should validate the server. -

- For more information, please read our documentation. -
- @endif - @if (!$isCloudflareTunnelsEnabled && $server->isFunctional()) -

Configuration

-
- - - - - Manual - -
- @endif -
-
-
-
diff --git a/resources/views/livewire/server/configure-cloudflare-tunnels.blade.php b/resources/views/livewire/server/configure-cloudflare-tunnels.blade.php deleted file mode 100644 index 1219d0e03..000000000 --- a/resources/views/livewire/server/configure-cloudflare-tunnels.blade.php +++ /dev/null @@ -1,6 +0,0 @@ -
- - - Continue - diff --git a/resources/views/livewire/server/delete.blade.php b/resources/views/livewire/server/delete.blade.php index 1b56b35c9..c93fc9470 100644 --- a/resources/views/livewire/server/delete.blade.php +++ b/resources/views/livewire/server/delete.blade.php @@ -2,7 +2,7 @@ {{ data_get_str($server, 'name')->limit(10) }} > Delete Server | Coolify - +
diff --git a/resources/views/livewire/server/destinations.blade.php b/resources/views/livewire/server/destinations.blade.php index 88503f62d..d7d7e7641 100644 --- a/resources/views/livewire/server/destinations.blade.php +++ b/resources/views/livewire/server/destinations.blade.php @@ -2,7 +2,7 @@ {{ data_get_str($server, 'name')->limit(10) }} > Destinations | Coolify - +
diff --git a/resources/views/livewire/server/docker-cleanup.blade.php b/resources/views/livewire/server/docker-cleanup.blade.php index 8151b5358..2c000d327 100644 --- a/resources/views/livewire/server/docker-cleanup.blade.php +++ b/resources/views/livewire/server/docker-cleanup.blade.php @@ -2,7 +2,7 @@ {{ data_get_str($server, 'name')->limit(10) }} > Docker Cleanup | Coolify - +
@@ -34,8 +34,8 @@ label="Docker cleanup frequency" required helper="Cron expression for Docker Cleanup.
You can use every_minute, hourly, daily, weekly, monthly, yearly.

Default is every night at midnight." /> @if (!$forceDockerCleanup) - + @endif
-

Recent executions (click to check output)

+

Recent executions (click to check + output)

diff --git a/resources/views/livewire/server/log-drains.blade.php b/resources/views/livewire/server/log-drains.blade.php index a16993e96..1f7c654d5 100644 --- a/resources/views/livewire/server/log-drains.blade.php +++ b/resources/views/livewire/server/log-drains.blade.php @@ -2,7 +2,7 @@ {{ data_get_str($server, 'name')->limit(10) }} > Log Drains | Coolify - +
diff --git a/resources/views/livewire/server/navbar.blade.php b/resources/views/livewire/server/navbar.blade.php new file mode 100644 index 000000000..d620d7e8f --- /dev/null +++ b/resources/views/livewire/server/navbar.blade.php @@ -0,0 +1,178 @@ +
+ + + + + + + Close + + + +
+

Server

+ @if ($server->proxySet()) +
+ @if (data_get($server, 'proxy.force_stop', false) === false) + + Refresh + Checking... + + @endif + +
+ @if (data_get($server, 'proxy.status') === 'running') + + @elseif (data_get($server, 'proxy.status') === 'restarting') + + @elseif (data_get($server, 'proxy.force_stop')) + + @elseif (data_get($server, 'proxy.status') === 'exited') + + @else + + @endif +
+
+ + @endif +
+
{{ data_get($server, 'name') }}
+ +
diff --git a/resources/views/livewire/server/private-key/show.blade.php b/resources/views/livewire/server/private-key/show.blade.php index 53e9ed002..f8022ccd9 100644 --- a/resources/views/livewire/server/private-key/show.blade.php +++ b/resources/views/livewire/server/private-key/show.blade.php @@ -2,7 +2,7 @@ {{ data_get_str($server, 'name')->limit(10) }} > Private Key | Coolify - +
diff --git a/resources/views/livewire/server/proxy/deploy.blade.php b/resources/views/livewire/server/proxy/deploy.blade.php deleted file mode 100644 index 367820491..000000000 --- a/resources/views/livewire/server/proxy/deploy.blade.php +++ /dev/null @@ -1,93 +0,0 @@ -@php use App\Enums\ProxyTypes; @endphp -
- @if ($server->proxySet()) - - Proxy Status - - - - - @if (data_get($server, 'proxy.status') === 'running') -
- @if ( - $currentRoute === 'server.proxy' && - $traefikDashboardAvailable && - $server->proxyType() === ProxyTypes::TRAEFIK->value) - - @endif - - - - - - - - - Restart Proxy - - - - - - - - - - - - Stop Proxy - - -
- @else - - @endif - @endif - @script - - @endscript -
diff --git a/resources/views/livewire/server/proxy/dynamic-configurations.blade.php b/resources/views/livewire/server/proxy/dynamic-configurations.blade.php index 1dddbe433..ba9f84770 100644 --- a/resources/views/livewire/server/proxy/dynamic-configurations.blade.php +++ b/resources/views/livewire/server/proxy/dynamic-configurations.blade.php @@ -2,7 +2,7 @@ Proxy Dynamic Configuration | Coolify - +
diff --git a/resources/views/livewire/server/proxy/logs.blade.php b/resources/views/livewire/server/proxy/logs.blade.php index 4556d67bd..81cc8280b 100644 --- a/resources/views/livewire/server/proxy/logs.blade.php +++ b/resources/views/livewire/server/proxy/logs.blade.php @@ -2,7 +2,7 @@ Proxy Logs | Coolify - +
diff --git a/resources/views/livewire/server/proxy/show.blade.php b/resources/views/livewire/server/proxy/show.blade.php index 2370ab797..3f335099e 100644 --- a/resources/views/livewire/server/proxy/show.blade.php +++ b/resources/views/livewire/server/proxy/show.blade.php @@ -2,7 +2,7 @@ Proxy Configuration | Coolify - + @if ($server->isFunctional())
diff --git a/resources/views/livewire/server/proxy/status.blade.php b/resources/views/livewire/server/proxy/status.blade.php deleted file mode 100644 index 472625dd6..000000000 --- a/resources/views/livewire/server/proxy/status.blade.php +++ /dev/null @@ -1,17 +0,0 @@ -
- @if (data_get($server, 'proxy.force_stop', false) === false) - Refresh - @endif - @if (data_get($server, 'proxy.status') === 'running') - - @elseif (data_get($server, 'proxy.status') === 'restarting') - - @elseif (data_get($server, 'proxy.force_stop')) - - @elseif (data_get($server, 'proxy.status') === 'exited') - - @else - - @endif - -
diff --git a/resources/views/livewire/server/resources.blade.php b/resources/views/livewire/server/resources.blade.php index 5968b53f0..91ab5fe80 100644 --- a/resources/views/livewire/server/resources.blade.php +++ b/resources/views/livewire/server/resources.blade.php @@ -2,7 +2,7 @@ {{ data_get_str($server, 'name')->limit(10) }} > Server Resources | Coolify - +
diff --git a/resources/views/livewire/server/security/patches.blade.php b/resources/views/livewire/server/security/patches.blade.php index 3bff421dd..bea189edf 100644 --- a/resources/views/livewire/server/security/patches.blade.php +++ b/resources/views/livewire/server/security/patches.blade.php @@ -2,7 +2,7 @@ {{ data_get_str($server, 'name')->limit(10) }} > Security | Coolify - + Updating Packages diff --git a/resources/views/livewire/server/show.blade.php b/resources/views/livewire/server/show.blade.php index 072516772..de12b73f8 100644 --- a/resources/views/livewire/server/show.blade.php +++ b/resources/views/livewire/server/show.blade.php @@ -2,7 +2,7 @@ {{ data_get_str($server, 'name')->limit(10) }} > General | Coolify - +
diff --git a/routes/web.php b/routes/web.php index 948e828b1..d04d93db0 100644 --- a/routes/web.php +++ b/routes/web.php @@ -39,7 +39,7 @@ use App\Livewire\Server\Advanced as ServerAdvanced; use App\Livewire\Server\CaCertificate\Show as CaCertificateShow; use App\Livewire\Server\Charts as ServerCharts; -use App\Livewire\Server\CloudflareTunnels; +use App\Livewire\Server\CloudflareTunnel; use App\Livewire\Server\Delete as DeleteServer; use App\Livewire\Server\Destinations as ServerDestinations; use App\Livewire\Server\DockerCleanup; @@ -245,7 +245,7 @@ Route::get('/private-key', PrivateKeyShow::class)->name('server.private-key'); Route::get('/ca-certificate', CaCertificateShow::class)->name('server.ca-certificate'); Route::get('/resources', ResourcesShow::class)->name('server.resources'); - Route::get('/cloudflare-tunnels', CloudflareTunnels::class)->name('server.cloudflare-tunnels'); + Route::get('/cloudflare-tunnel', CloudflareTunnel::class)->name('server.cloudflare-tunnel'); Route::get('/destinations', ServerDestinations::class)->name('server.destinations'); Route::get('/log-drains', LogDrains::class)->name('server.log-drains'); Route::get('/metrics', ServerCharts::class)->name('server.charts'); From 2576e868b528e5b812ed4e701a0238e8f3971edc Mon Sep 17 00:00:00 2001 From: Andras Bacsai <5845193+andrasbacsai@users.noreply.github.com> Date: Fri, 6 Jun 2025 18:50:32 +0200 Subject: [PATCH 0099/1232] feat(navbar): add Traefik dashboard availability check and server IP handling; refactor dynamic configurations loading --- app/Livewire/Server/Navbar.php | 20 +++++++++++++++++++ app/Livewire/Server/Proxy.php | 5 ----- .../Server/Proxy/DynamicConfigurations.php | 6 ++++++ .../views/livewire/server/navbar.blade.php | 10 +++++----- .../views/livewire/server/proxy.blade.php | 6 +++--- .../proxy/dynamic-configurations.blade.php | 15 +++++++------- 6 files changed, 42 insertions(+), 20 deletions(-) diff --git a/app/Livewire/Server/Navbar.php b/app/Livewire/Server/Navbar.php index b5e7f928a..6d4b88d7d 100644 --- a/app/Livewire/Server/Navbar.php +++ b/app/Livewire/Server/Navbar.php @@ -2,6 +2,7 @@ namespace App\Livewire\Server; +use App\Actions\Proxy\CheckConfiguration; use App\Actions\Proxy\CheckProxy; use App\Actions\Proxy\StartProxy; use App\Actions\Proxy\StopProxy; @@ -17,6 +18,10 @@ class Navbar extends Component public ?string $currentRoute = null; + public bool $traefikDashboardAvailable = false; + + public ?string $serverIp = null; + public function getListeners() { $teamId = auth()->user()->currentTeam()->id; @@ -30,6 +35,21 @@ public function mount(Server $server) { $this->server = $server; $this->currentRoute = request()->route()->getName(); + $this->serverIp = $this->server->id === 0 ? base_ip() : $this->server->ip; + } + + public function loadProxyConfiguration() + { + try { + $proxy_settings = CheckConfiguration::run($this->server); + if (str($proxy_settings)->contains('--api.dashboard=true') && str($proxy_settings)->contains('--api.insecure=true')) { + $this->traefikDashboardAvailable = true; + } else { + $this->traefikDashboardAvailable = false; + } + } catch (\Throwable $e) { + return handleError($e, $this); + } } public function restart() diff --git a/app/Livewire/Server/Proxy.php b/app/Livewire/Server/Proxy.php index 266e6fd0b..b3dada4ab 100644 --- a/app/Livewire/Server/Proxy.php +++ b/app/Livewire/Server/Proxy.php @@ -107,11 +107,6 @@ public function loadProxyConfiguration() { try { $this->proxy_settings = CheckConfiguration::run($this->server); - if (str($this->proxy_settings)->contains('--api.dashboard=true') && str($this->proxy_settings)->contains('--api.insecure=true')) { - $this->dispatch('traefikDashboardAvailable', true); - } else { - $this->dispatch('traefikDashboardAvailable', false); - } } catch (\Throwable $e) { return handleError($e, $this); } diff --git a/app/Livewire/Server/Proxy/DynamicConfigurations.php b/app/Livewire/Server/Proxy/DynamicConfigurations.php index bb9d0f673..6ea9e7c3d 100644 --- a/app/Livewire/Server/Proxy/DynamicConfigurations.php +++ b/app/Livewire/Server/Proxy/DynamicConfigurations.php @@ -28,6 +28,11 @@ public function getListeners() 'contents.*' => 'nullable|string', ]; + public function initLoadDynamicConfigurations() + { + $this->loadDynamicConfigurations(); + } + public function loadDynamicConfigurations() { $proxy_path = $this->server->proxyPath(); @@ -43,6 +48,7 @@ public function loadDynamicConfigurations() } $this->contents = $contents; $this->dispatch('$refresh'); + $this->dispatch('success', 'Dynamic configurations loaded.'); } public function mount() diff --git a/resources/views/livewire/server/navbar.blade.php b/resources/views/livewire/server/navbar.blade.php index d620d7e8f..09920b803 100644 --- a/resources/views/livewire/server/navbar.blade.php +++ b/resources/views/livewire/server/navbar.blade.php @@ -87,11 +87,11 @@ class="flex items-center gap-6 overflow-x-scroll sm:overflow-x-hidden scrollbar @if (data_get($server, 'proxy.status') === 'running') -
- @if ( - $currentRoute === 'server.proxy' && - $traefikDashboardAvailable && - $server->proxyType() === ProxyTypes::TRAEFIK->value) + -

Advanced

+

Advanced

@if ($server->proxyType() === ProxyTypes::TRAEFIK->value) -

Traefik

+

Traefik

@elseif ($server->proxyType() === 'CADDY') -

Caddy

+

Caddy

@endif @if ( $server->proxy->last_applied_settings && diff --git a/resources/views/livewire/server/proxy/dynamic-configurations.blade.php b/resources/views/livewire/server/proxy/dynamic-configurations.blade.php index ba9f84770..7c1e31bd9 100644 --- a/resources/views/livewire/server/proxy/dynamic-configurations.blade.php +++ b/resources/views/livewire/server/proxy/dynamic-configurations.blade.php @@ -5,13 +5,14 @@
-
- @if ($server->isFunctional()) + @if ($server->isFunctional()) +
+

Dynamic Configurations

- Reload + Reload @@ -19,10 +20,10 @@
You can add dynamic proxy configurations here.
-
+
-
+
@if ($contents?->isNotEmpty()) @foreach ($contents as $fileName => $value)
@@ -49,7 +50,7 @@
No dynamic configurations found.
@endif
- @endif -
+
+ @endif
From dcb793f9f4dd09b0863f86812b6df42106b5a47a Mon Sep 17 00:00:00 2001 From: Andras Bacsai <5845193+andrasbacsai@users.noreply.github.com> Date: Fri, 6 Jun 2025 18:52:57 +0200 Subject: [PATCH 0100/1232] refactor(cloudflare-tunnel): enhance layout and structure of Cloudflare Tunnel documentation and confirmation modal --- .../server/cloudflare-tunnel.blade.php | 27 ++++++++++--------- 1 file changed, 15 insertions(+), 12 deletions(-) diff --git a/resources/views/livewire/server/cloudflare-tunnel.blade.php b/resources/views/livewire/server/cloudflare-tunnel.blade.php index b4c70ac2a..795193576 100644 --- a/resources/views/livewire/server/cloudflare-tunnel.blade.php +++ b/resources/views/livewire/server/cloudflare-tunnel.blade.php @@ -78,10 +78,11 @@ class="underline ">documentation.
@endif @if (!$isCloudflareTunnelsEnabled && $server->isFunctional()) -

Automated Docs

- +
+

Automated

+ Docs +
Cloudflare Tunnel Configuration @@ -107,14 +108,16 @@ class="flex flex-col gap-2 w-full"> @endscript

Manual

- +
+ +
@endif
From b8bffc1507e7875f3f8778399c52b6af4b918d27 Mon Sep 17 00:00:00 2001 From: Andras Bacsai <5845193+andrasbacsai@users.noreply.github.com> Date: Fri, 6 Jun 2025 19:18:20 +0200 Subject: [PATCH 0101/1232] fix(navbar): remove unnecessary x-init directive for loading proxy configuration --- resources/views/livewire/server/navbar.blade.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/views/livewire/server/navbar.blade.php b/resources/views/livewire/server/navbar.blade.php index 09920b803..b58d8d954 100644 --- a/resources/views/livewire/server/navbar.blade.php +++ b/resources/views/livewire/server/navbar.blade.php @@ -87,7 +87,7 @@ class="flex items-center gap-6 overflow-x-scroll sm:overflow-x-hidden scrollbar @if (data_get($server, 'proxy.status') === 'running') -
+
From 7cc91e7a04dd97fdf3e0a903eb13a3135e434957 Mon Sep 17 00:00:00 2001 From: Andras Bacsai <5845193+andrasbacsai@users.noreply.github.com> Date: Fri, 6 Jun 2025 19:18:28 +0200 Subject: [PATCH 0102/1232] fix(patches): add padding to loading message for better visibility during update checks --- resources/views/livewire/server/security/patches.blade.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/views/livewire/server/security/patches.blade.php b/resources/views/livewire/server/security/patches.blade.php index bea189edf..560d512bf 100644 --- a/resources/views/livewire/server/security/patches.blade.php +++ b/resources/views/livewire/server/security/patches.blade.php @@ -28,7 +28,7 @@
-
+
Checking for updates. It may take a few minutes.
@if ($error) From 1cdc01194b03cd62cc427e79c2f6a13190fecb0b Mon Sep 17 00:00:00 2001 From: Andras Bacsai <5845193+andrasbacsai@users.noreply.github.com> Date: Fri, 6 Jun 2025 19:18:32 +0200 Subject: [PATCH 0103/1232] feat(proxy-dashboard): implement ProxyDashboardCacheService to manage Traefik dashboard cache; clear cache on configuration changes and proxy actions --- app/Actions/Proxy/SaveConfiguration.php | 4 ++ app/Actions/Proxy/StartProxy.php | 5 ++ app/Actions/Proxy/StopProxy.php | 4 ++ app/Jobs/RestartProxyJob.php | 4 ++ app/Livewire/Server/Navbar.php | 14 ++-- app/Livewire/Server/Proxy.php | 9 +++ app/Services/ProxyDashboardCacheService.php | 67 +++++++++++++++++++ .../execute-container-command.blade.php | 2 +- 8 files changed, 100 insertions(+), 9 deletions(-) create mode 100644 app/Services/ProxyDashboardCacheService.php diff --git a/app/Actions/Proxy/SaveConfiguration.php b/app/Actions/Proxy/SaveConfiguration.php index f2de2b3f5..f0a31aa1b 100644 --- a/app/Actions/Proxy/SaveConfiguration.php +++ b/app/Actions/Proxy/SaveConfiguration.php @@ -3,6 +3,7 @@ namespace App\Actions\Proxy; use App\Models\Server; +use App\Services\ProxyDashboardCacheService; use Lorisleiva\Actions\Concerns\AsAction; class SaveConfiguration @@ -20,6 +21,9 @@ public function handle(Server $server, ?string $proxy_settings = null) $server->proxy->last_saved_settings = str($docker_compose_yml_base64)->pipe('md5')->value; $server->save(); + // Clear Traefik dashboard cache when configuration is saved + ProxyDashboardCacheService::clearCache($server); + return instant_remote_process([ "mkdir -p $proxy_path", "echo '$docker_compose_yml_base64' | base64 -d | tee $proxy_path/docker-compose.yml > /dev/null", diff --git a/app/Actions/Proxy/StartProxy.php b/app/Actions/Proxy/StartProxy.php index e685adbdf..f98c0d8c2 100644 --- a/app/Actions/Proxy/StartProxy.php +++ b/app/Actions/Proxy/StartProxy.php @@ -5,6 +5,7 @@ use App\Enums\ProxyTypes; use App\Events\ProxyStatusChanged; use App\Models\Server; +use App\Services\ProxyDashboardCacheService; use Lorisleiva\Actions\Concerns\AsAction; use Spatie\Activitylog\Models\Activity; @@ -28,6 +29,10 @@ public function handle(Server $server, bool $async = true, bool $force = false): $docker_compose_yml_base64 = base64_encode($configuration); $server->proxy->last_applied_settings = str($docker_compose_yml_base64)->pipe('md5')->value(); $server->save(); + + // Clear Traefik dashboard cache when proxy configuration changes + ProxyDashboardCacheService::clearCache($server); + if ($server->isSwarmManager()) { $commands = $commands->merge([ "mkdir -p $proxy_path/dynamic", diff --git a/app/Actions/Proxy/StopProxy.php b/app/Actions/Proxy/StopProxy.php index 7072c846f..de3ed58a5 100644 --- a/app/Actions/Proxy/StopProxy.php +++ b/app/Actions/Proxy/StopProxy.php @@ -4,6 +4,7 @@ use App\Events\ProxyStatusChanged; use App\Models\Server; +use App\Services\ProxyDashboardCacheService; use Lorisleiva\Actions\Concerns\AsAction; class StopProxy @@ -23,6 +24,9 @@ public function handle(Server $server, bool $forceStop = true, int $timeout = 30 $server->proxy->force_stop = $forceStop; $server->proxy->status = 'exited'; $server->save(); + + // Clear Traefik dashboard cache when proxy stops + ProxyDashboardCacheService::clearCache($server); } catch (\Throwable $e) { return handleError($e); } finally { diff --git a/app/Jobs/RestartProxyJob.php b/app/Jobs/RestartProxyJob.php index 5e862236b..7e867f853 100644 --- a/app/Jobs/RestartProxyJob.php +++ b/app/Jobs/RestartProxyJob.php @@ -6,6 +6,7 @@ use App\Actions\Proxy\StartProxy; use App\Actions\Proxy\StopProxy; use App\Models\Server; +use App\Services\ProxyDashboardCacheService; use Illuminate\Bus\Queueable; use Illuminate\Contracts\Queue\ShouldBeEncrypted; use Illuminate\Contracts\Queue\ShouldQueue; @@ -39,6 +40,9 @@ public function handle() StartProxy::run($this->server, force: true); + // Clear Traefik dashboard cache after proxy restart + ProxyDashboardCacheService::clearCache($this->server); + // CheckProxy::run($this->server, true); } catch (\Throwable $e) { return handleError($e); diff --git a/app/Livewire/Server/Navbar.php b/app/Livewire/Server/Navbar.php index 6d4b88d7d..222cca9cd 100644 --- a/app/Livewire/Server/Navbar.php +++ b/app/Livewire/Server/Navbar.php @@ -2,12 +2,12 @@ namespace App\Livewire\Server; -use App\Actions\Proxy\CheckConfiguration; use App\Actions\Proxy\CheckProxy; use App\Actions\Proxy\StartProxy; use App\Actions\Proxy\StopProxy; use App\Jobs\RestartProxyJob; use App\Models\Server; +use App\Services\ProxyDashboardCacheService; use Livewire\Component; class Navbar extends Component @@ -36,17 +36,13 @@ public function mount(Server $server) $this->server = $server; $this->currentRoute = request()->route()->getName(); $this->serverIp = $this->server->id === 0 ? base_ip() : $this->server->ip; + $this->loadProxyConfiguration(); } public function loadProxyConfiguration() { try { - $proxy_settings = CheckConfiguration::run($this->server); - if (str($proxy_settings)->contains('--api.dashboard=true') && str($proxy_settings)->contains('--api.insecure=true')) { - $this->traefikDashboardAvailable = true; - } else { - $this->traefikDashboardAvailable = false; - } + $this->traefikDashboardAvailable = ProxyDashboardCacheService::isTraefikDashboardAvailable($this->server); } catch (\Throwable $e) { return handleError($e, $this); } @@ -55,6 +51,8 @@ public function loadProxyConfiguration() public function restart() { try { + // Clear cache before restarting proxy + ProxyDashboardCacheService::clearCache($this->server); RestartProxyJob::dispatch($this->server); } catch (\Throwable $e) { return handleError($e, $this); @@ -123,7 +121,7 @@ public function showNotification() if ($forceStop) { $this->dispatch('info', 'Proxy is stopped manually.'); } else { - $this->dispatch('info', 'Proxy is stopped manually. Starting in a moment.'); + $this->dispatch('info', 'Proxy is stopped manually.
Starting in a moment.'); } break; default: diff --git a/app/Livewire/Server/Proxy.php b/app/Livewire/Server/Proxy.php index b3dada4ab..d1e414c7b 100644 --- a/app/Livewire/Server/Proxy.php +++ b/app/Livewire/Server/Proxy.php @@ -5,6 +5,7 @@ use App\Actions\Proxy\CheckConfiguration; use App\Actions\Proxy\SaveConfiguration; use App\Models\Server; +use App\Services\ProxyDashboardCacheService; use Livewire\Component; class Proxy extends Component @@ -41,6 +42,10 @@ public function changeProxy() { $this->server->proxy = null; $this->server->save(); + + // Clear Traefik dashboard cache when proxy type changes + ProxyDashboardCacheService::clearCache($this->server); + $this->dispatch('reloadWindow'); } @@ -49,6 +54,10 @@ public function selectProxy($proxy_type) try { $this->server->changeProxy($proxy_type, async: false); $this->selectedProxy = $this->server->proxy->type; + + // Clear Traefik dashboard cache when proxy type is selected + ProxyDashboardCacheService::clearCache($this->server); + $this->dispatch('reloadWindow'); } catch (\Throwable $e) { return handleError($e, $this); diff --git a/app/Services/ProxyDashboardCacheService.php b/app/Services/ProxyDashboardCacheService.php new file mode 100644 index 000000000..2b7aaef62 --- /dev/null +++ b/app/Services/ProxyDashboardCacheService.php @@ -0,0 +1,67 @@ +id}:traefik:dashboard_available"; + } + + /** + * Check if Traefik dashboard is available (from cache or compute) + */ + public static function isTraefikDashboardAvailable(Server $server): bool + { + $cacheKey = static::getCacheKey($server); + + // Try to get from cache first + $cachedValue = Cache::get($cacheKey); + + if ($cachedValue !== null) { + return $cachedValue; + } + + // If not in cache, compute the value + try { + $proxy_settings = \App\Actions\Proxy\CheckConfiguration::run($server); + $dashboardAvailable = str($proxy_settings)->contains('--api.dashboard=true') && + str($proxy_settings)->contains('--api.insecure=true'); + + // Cache the result (cache indefinitely until proxy restart) + Cache::forever($cacheKey, $dashboardAvailable); + + return $dashboardAvailable; + } catch (\Throwable $e) { + // If there's an error checking configuration, default to false and don't cache + return false; + } + } + + /** + * Clear Traefik dashboard cache for a server + */ + public static function clearCache(Server $server): void + { + $cacheKey = static::getCacheKey($server); + Cache::forget($cacheKey); + } + + /** + * Clear Traefik dashboard cache for multiple servers + */ + public static function clearCacheForServers(array $serverIds): void + { + foreach ($serverIds as $serverId) { + $cacheKey = "server:{$serverId}:traefik:dashboard_available"; + Cache::forget($cacheKey); + } + } +} diff --git a/resources/views/livewire/project/shared/execute-container-command.blade.php b/resources/views/livewire/project/shared/execute-container-command.blade.php index f9a0403a6..16b6ac015 100644 --- a/resources/views/livewire/project/shared/execute-container-command.blade.php +++ b/resources/views/livewire/project/shared/execute-container-command.blade.php @@ -17,7 +17,7 @@ @endif -

Terminal

+

Terminal

@if (!$hasShell)
From ba970d909cce9be39559ad7bb97724548ffc8f5c Mon Sep 17 00:00:00 2001 From: Andras Bacsai <5845193+andrasbacsai@users.noreply.github.com> Date: Fri, 6 Jun 2025 21:15:50 +0200 Subject: [PATCH 0104/1232] feat(terminal-connection): enhance terminal connection handling with auto-connect feature and improved status messaging --- .../Shared/ExecuteContainerCommand.php | 68 +++++++++++++++++ resources/js/terminal.js | 39 +++++++++- .../execute-container-command.blade.php | 76 +++++++++++++++++-- 3 files changed, 174 insertions(+), 9 deletions(-) diff --git a/app/Livewire/Project/Shared/ExecuteContainerCommand.php b/app/Livewire/Project/Shared/ExecuteContainerCommand.php index ce6314d63..9891808b3 100644 --- a/app/Livewire/Project/Shared/ExecuteContainerCommand.php +++ b/app/Livewire/Project/Shared/ExecuteContainerCommand.php @@ -29,6 +29,16 @@ class ExecuteContainerCommand extends Component public bool $hasShell = true; + public bool $containersLoaded = false; + + public bool $autoConnectAttempted = false; + + public bool $isConnecting = false; + + public bool $isConnected = false; + + public string $connectionStatus = 'Loading containers...'; + protected $rules = [ 'server' => 'required', 'container' => 'required', @@ -87,6 +97,8 @@ public function mount() $this->type = 'server'; $this->resource = Server::ownedByCurrentTeam()->whereUuid($this->parameters['server_uuid'])->firstOrFail(); $this->server = $this->resource; + $this->containersLoaded = true; // Server doesn't need container loading + $this->connectionStatus = 'Waiting for terminal to be ready...'; } } @@ -151,6 +163,49 @@ public function loadContainers() if ($this->containers->count() === 1) { $this->selected_container = data_get($this->containers->first(), 'container.Names'); } + + $this->containersLoaded = true; + $this->connectionStatus = 'Waiting for terminal to be ready...'; + } + + #[On('initializeTerminalConnection')] + public function initializeTerminalConnection() + { + // Only auto-connect if containers are loaded and we haven't attempted before + if (! $this->containersLoaded || $this->autoConnectAttempted) { + return; + } + + $this->autoConnectAttempted = true; + $this->isConnecting = true; + + if ($this->type === 'server') { + $this->connectionStatus = 'Establishing connection to server terminal...'; + $this->connectToServer(); + } elseif ($this->containers->count() === 1) { + $this->connectionStatus = 'Establishing connection to container terminal...'; + $this->connectToContainer(); + } else { + $this->isConnecting = false; + $this->connectionStatus = ''; + } + } + + #[On('terminalConnected')] + public function terminalConnected() + { + $this->isConnected = true; + $this->isConnecting = false; + $this->connectionStatus = ''; + } + + #[On('terminalDisconnected')] + public function terminalDisconnected() + { + $this->isConnected = false; + $this->isConnecting = false; + $this->autoConnectAttempted = false; + $this->connectionStatus = 'Connection lost. Click Reconnect to try again.'; } private function checkShellAvailability(Server $server, string $container): bool @@ -179,6 +234,8 @@ public function connectToServer() throw new \RuntimeException('Terminal access is disabled on this server.'); } $this->hasShell = true; + $this->isConnecting = true; + $this->connectionStatus = 'Establishing connection to server terminal...'; $this->dispatch( 'send-terminal-command', false, @@ -186,6 +243,9 @@ public function connectToServer() data_get($this->server, 'uuid') ); } catch (\Throwable $e) { + $this->isConnecting = false; + $this->connectionStatus = 'Connection failed.'; + return handleError($e, $this); } } @@ -234,9 +294,14 @@ public function connectToContainer() $this->hasShell = $this->checkShellAvailability($server, data_get($container, 'container.Names')); if (! $this->hasShell) { + $this->isConnecting = false; + $this->connectionStatus = 'Shell not available in container.'; + return; } + $this->isConnecting = true; + $this->connectionStatus = 'Establishing connection to container terminal...'; $this->dispatch( 'send-terminal-command', true, @@ -244,6 +309,9 @@ public function connectToContainer() data_get($container, 'server.uuid') ); } catch (\Throwable $e) { + $this->isConnecting = false; + $this->connectionStatus = 'Connection failed.'; + return handleError($e, $this); } } diff --git a/resources/js/terminal.js b/resources/js/terminal.js index 3161a0f32..1c7c7af1d 100644 --- a/resources/js/terminal.js +++ b/resources/js/terminal.js @@ -42,7 +42,7 @@ export function initializeTerminalComponent() { this.setupTerminalEventListeners(); this.$wire.on('send-back-command', (command) => { - this.sendMessage({ command: command }); + this.sendCommandWhenReady({ command: command }); }); this.keepAliveInterval = setInterval(this.keepAlive.bind(this), 30000); @@ -99,6 +99,9 @@ export function initializeTerminalComponent() { this.paused = false; this.commandBuffer = ''; + // Notify parent component that terminal disconnected + this.$wire.dispatch('terminalDisconnected'); + // Force a refresh this.$nextTick(() => { this.resizeTerminal(); @@ -205,6 +208,9 @@ export function initializeTerminalComponent() { // Start ping timeout monitoring this.resetPingTimeout(); + + // Notify that WebSocket is ready for auto-connection + this.dispatchEvent('terminal-websocket-ready'); }, handleSocketError(error) { @@ -277,6 +283,12 @@ export function initializeTerminalComponent() { } }, + sendCommandWhenReady(message) { + if (this.isWebSocketReady()) { + this.sendMessage(message); + } + }, + handleSocketMessage(event) { // Handle pong responses if (event.data === 'pong') { @@ -297,14 +309,23 @@ export function initializeTerminalComponent() { this.term.focus(); document.querySelector('.xterm-viewport').classList.add('scrollbar', 'rounded-sm'); this.resizeTerminal(); + + // Notify parent component that terminal is connected + this.$wire.dispatch('terminalConnected'); } else if (event.data === 'unprocessable') { if (this.term) this.term.reset(); this.terminalActive = false; this.message = '(sorry, something went wrong, please try again)'; + + // Notify parent component that terminal connection failed + this.$wire.dispatch('terminalDisconnected'); } else if (event.data === 'pty-exited') { this.terminalActive = false; this.term.reset(); this.commandBuffer = ''; + + // Notify parent component that terminal disconnected + this.$wire.dispatch('terminalDisconnected'); } else { try { this.pendingWrites++; @@ -441,6 +462,22 @@ export function initializeTerminalComponent() { lastPingTime: this.lastPingTime, heartbeatMissed: this.heartbeatMissed }; + }, + + // Helper method to dispatch custom events + dispatchEvent(eventName, detail = null) { + const event = new CustomEvent(eventName, { + detail: detail, + bubbles: true + }); + this.$el.dispatchEvent(event); + }, + + // Check if WebSocket is ready for commands + isWebSocketReady() { + return this.connectionState === 'connected' && + this.socket && + this.socket.readyState === WebSocket.OPEN; } }; } diff --git a/resources/views/livewire/project/shared/execute-container-command.blade.php b/resources/views/livewire/project/shared/execute-container-command.blade.php index 16b6ac015..f40a1c82f 100644 --- a/resources/views/livewire/project/shared/execute-container-command.blade.php +++ b/resources/views/livewire/project/shared/execute-container-command.blade.php @@ -17,7 +17,6 @@ @endif -

Terminal

@if (!$hasShell)
@@ -37,10 +36,19 @@ @else @if ($type === 'server') @if ($server->isTerminalEnabled()) -
- Reconnect + +

Terminal

+ + Reconnect +
+ + {{-- Loading indicator for all connection states --}} + @if (!$containersLoaded || $isConnecting || $connectionStatus) + {{ $connectionStatus }} + @endif +
@@ -52,10 +60,18 @@
No containers are running on this server or terminal access is disabled.
@else @if (count($containers) === 1) -
- Reconnect + +

Terminal

+ + Reconnect +
+ + {{-- Loading indicator for all connection states --}} + @if (!$containersLoaded || $isConnecting || $connectionStatus) + {{ $connectionStatus }} + @endif @else
@@ -69,8 +85,15 @@ @endforeach - Connect + + {{ $isConnecting ? 'Connecting...' : 'Connect' }} +
+ + {{-- Loading indicator for manual connection --}} + @if ($isConnecting || $connectionStatus) + {{ $connectionStatus }} + @endif @endif
@@ -78,4 +101,41 @@ @endif @endif @endif + + @script + + @endscript
From 7df6890920e2a002d8e5161ba90b598b2b6a8f34 Mon Sep 17 00:00:00 2001 From: Andras Bacsai <5845193+andrasbacsai@users.noreply.github.com> Date: Fri, 6 Jun 2025 21:34:27 +0200 Subject: [PATCH 0105/1232] refactor(terminal-connection): streamline auto-connection logic and improve component readiness checks --- .../Shared/ExecuteContainerCommand.php | 3 +- .../execute-container-command.blade.php | 41 ++++++++----------- 2 files changed, 17 insertions(+), 27 deletions(-) diff --git a/app/Livewire/Project/Shared/ExecuteContainerCommand.php b/app/Livewire/Project/Shared/ExecuteContainerCommand.php index 9891808b3..40004354f 100644 --- a/app/Livewire/Project/Shared/ExecuteContainerCommand.php +++ b/app/Livewire/Project/Shared/ExecuteContainerCommand.php @@ -168,11 +168,10 @@ public function loadContainers() $this->connectionStatus = 'Waiting for terminal to be ready...'; } - #[On('initializeTerminalConnection')] public function initializeTerminalConnection() { // Only auto-connect if containers are loaded and we haven't attempted before - if (! $this->containersLoaded || $this->autoConnectAttempted) { + if (! $this->containersLoaded || $this->autoConnectAttempted || $this->isConnecting) { return; } diff --git a/resources/views/livewire/project/shared/execute-container-command.blade.php b/resources/views/livewire/project/shared/execute-container-command.blade.php index f40a1c82f..768680ec3 100644 --- a/resources/views/livewire/project/shared/execute-container-command.blade.php +++ b/resources/views/livewire/project/shared/execute-container-command.blade.php @@ -106,36 +106,27 @@ @endscript
From 8e70b2907f26f5b67850af63120735af1919b534 Mon Sep 17 00:00:00 2001 From: Andras Bacsai <5845193+andrasbacsai@users.noreply.github.com> Date: Fri, 6 Jun 2025 21:40:52 +0200 Subject: [PATCH 0106/1232] fix(terminal-connection): improve error handling and stability for auto-connection; enhance component readiness checks and retry logic --- .../Shared/ExecuteContainerCommand.php | 46 +++++--- .../execute-container-command.blade.php | 109 +++++++++++++++--- 2 files changed, 128 insertions(+), 27 deletions(-) diff --git a/app/Livewire/Project/Shared/ExecuteContainerCommand.php b/app/Livewire/Project/Shared/ExecuteContainerCommand.php index 40004354f..2c16c1cfa 100644 --- a/app/Livewire/Project/Shared/ExecuteContainerCommand.php +++ b/app/Livewire/Project/Shared/ExecuteContainerCommand.php @@ -170,23 +170,41 @@ public function loadContainers() public function initializeTerminalConnection() { - // Only auto-connect if containers are loaded and we haven't attempted before - if (! $this->containersLoaded || $this->autoConnectAttempted || $this->isConnecting) { - return; - } + try { + // Only auto-connect if containers are loaded and we haven't attempted before + if (! $this->containersLoaded || $this->autoConnectAttempted || $this->isConnecting) { + return; + } - $this->autoConnectAttempted = true; - $this->isConnecting = true; + $this->autoConnectAttempted = true; - if ($this->type === 'server') { - $this->connectionStatus = 'Establishing connection to server terminal...'; - $this->connectToServer(); - } elseif ($this->containers->count() === 1) { - $this->connectionStatus = 'Establishing connection to container terminal...'; - $this->connectToContainer(); - } else { + // Ensure component is in a stable state before proceeding + $this->skipRender(); + + $this->isConnecting = true; + + if ($this->type === 'server') { + $this->connectionStatus = 'Establishing connection to server terminal...'; + $this->connectToServer(); + } elseif ($this->containers->count() === 1) { + $this->connectionStatus = 'Establishing connection to container terminal...'; + $this->connectToContainer(); + } else { + $this->isConnecting = false; + $this->connectionStatus = ''; + } + } catch (\Throwable $e) { + // Log the error but don't let it bubble up to cause snapshot issues + logger()->error('Terminal auto-connection failed', [ + 'error' => $e->getMessage(), + 'trace' => $e->getTraceAsString(), + 'component_id' => $this->getId(), + ]); + + // Reset state to allow manual connection + $this->autoConnectAttempted = false; $this->isConnecting = false; - $this->connectionStatus = ''; + $this->connectionStatus = 'Auto-connection failed. Please use the reconnect button.'; } } diff --git a/resources/views/livewire/project/shared/execute-container-command.blade.php b/resources/views/livewire/project/shared/execute-container-command.blade.php index 768680ec3..b804ebe47 100644 --- a/resources/views/livewire/project/shared/execute-container-command.blade.php +++ b/resources/views/livewire/project/shared/execute-container-command.blade.php @@ -105,28 +105,111 @@ @script @endscript
From 6aa82817df2a8ba28886a117b4cb38c11d6a70bf Mon Sep 17 00:00:00 2001 From: Andras Bacsai <5845193+andrasbacsai@users.noreply.github.com> Date: Fri, 6 Jun 2025 21:51:42 +0200 Subject: [PATCH 0107/1232] fix(terminal): add unique wire:key to terminal component for improved reactivity and state management --- .../livewire/project/shared/execute-container-command.blade.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/views/livewire/project/shared/execute-container-command.blade.php b/resources/views/livewire/project/shared/execute-container-command.blade.php index b804ebe47..04c81db24 100644 --- a/resources/views/livewire/project/shared/execute-container-command.blade.php +++ b/resources/views/livewire/project/shared/execute-container-command.blade.php @@ -50,7 +50,7 @@ @endif
- +
@else
Terminal access is disabled on this server.
From 6e85419adb718bfc324c18dbee1fa8e71c61bf33 Mon Sep 17 00:00:00 2001 From: Andras Bacsai <5845193+andrasbacsai@users.noreply.github.com> Date: Fri, 6 Jun 2025 22:05:16 +0200 Subject: [PATCH 0108/1232] feat(terminal): implement resize handling with ResizeObserver for improved terminal responsiveness --- resources/js/terminal.js | 99 ++++++++++++++++--- .../project/shared/terminal.blade.php | 19 ++-- 2 files changed, 99 insertions(+), 19 deletions(-) diff --git a/resources/js/terminal.js b/resources/js/terminal.js index 1c7c7af1d..d556baaf1 100644 --- a/resources/js/terminal.js +++ b/resources/js/terminal.js @@ -30,6 +30,9 @@ export function initializeTerminalComponent() { pingTimeoutId: null, heartbeatMissed: 0, maxHeartbeatMisses: 3, + // Resize handling + resizeObserver: null, + resizeTimeout: null, init() { this.setupTerminal(); @@ -55,8 +58,18 @@ export function initializeTerminalComponent() { if (active) { this.$refs.terminalWrapper.style.display = 'block'; this.resizeTerminal(); + + // Start observing terminal wrapper for resize changes + if (this.resizeObserver && this.$refs.terminalWrapper) { + this.resizeObserver.observe(this.$refs.terminalWrapper); + } } else { this.$refs.terminalWrapper.style.display = 'none'; + + // Stop observing when terminal is inactive + if (this.resizeObserver) { + this.resizeObserver.disconnect(); + } } }); }); @@ -70,6 +83,17 @@ export function initializeTerminalComponent() { window.onresize = () => { this.resizeTerminal() }; + + // Set up ResizeObserver for more reliable terminal resizing + if (window.ResizeObserver) { + this.resizeObserver = new ResizeObserver(() => { + // Debounce resize calls to avoid performance issues + clearTimeout(this.resizeTimeout); + this.resizeTimeout = setTimeout(() => { + this.resizeTerminal(); + }, 50); + }); + } }, cleanup() { @@ -79,15 +103,27 @@ export function initializeTerminalComponent() { if (this.socket) { this.socket.close(1000, 'Client cleanup'); } + + // Clean up resize observer + if (this.resizeObserver) { + this.resizeObserver.disconnect(); + this.resizeObserver = null; + } + + // Clear resize timeout + if (this.resizeTimeout) { + clearTimeout(this.resizeTimeout); + } }, clearAllTimers() { - [this.keepAliveInterval, this.reconnectInterval, this.connectionTimeoutId, this.pingTimeoutId] + [this.keepAliveInterval, this.reconnectInterval, this.connectionTimeoutId, this.pingTimeoutId, this.resizeTimeout] .forEach(timer => timer && clearInterval(timer)); this.keepAliveInterval = null; this.reconnectInterval = null; this.connectionTimeoutId = null; this.pingTimeoutId = null; + this.resizeTimeout = null; }, resetTerminal() { @@ -308,8 +344,15 @@ export function initializeTerminalComponent() { this.terminalActive = true; this.term.focus(); document.querySelector('.xterm-viewport').classList.add('scrollbar', 'rounded-sm'); + + // Initial resize after terminal is ready this.resizeTerminal(); + // Additional resize after a short delay to ensure proper sizing + setTimeout(() => { + this.resizeTerminal(); + }, 200); + // Notify parent component that terminal is connected this.$wire.dispatch('terminalConnected'); } else if (event.data === 'unprocessable') { @@ -418,7 +461,13 @@ export function initializeTerminalComponent() { makeFullscreen() { this.fullscreen = !this.fullscreen; this.$nextTick(() => { - this.resizeTerminal(); + // Force a layout reflow to ensure DOM changes are applied + this.$refs.terminalWrapper.offsetHeight; + + // Add a small delay to ensure CSS transitions complete + setTimeout(() => { + this.resizeTerminal(); + }, 100); }); }, @@ -426,25 +475,53 @@ export function initializeTerminalComponent() { if (!this.terminalActive || !this.term || !this.fitAddon) return; try { + // Force a refresh of the fit addon dimensions this.fitAddon.fit(); - const height = this.$refs.terminalWrapper.clientHeight; - const width = this.$refs.terminalWrapper.clientWidth; - const charSize = this.term._core._renderService._charSizeService; - if (!charSize.height || !charSize.width) { - // Fallback values if char size not available yet + // Get fresh dimensions after fit + const wrapperHeight = this.$refs.terminalWrapper.clientHeight; + const wrapperWidth = this.$refs.terminalWrapper.clientWidth; + + // Account for terminal container padding (px-2 py-1 = 8px left/right, 4px top/bottom) + const horizontalPadding = 16; // 8px * 2 (left + right) + const verticalPadding = 8; // 4px * 2 (top + bottom) + const height = wrapperHeight - verticalPadding; + const width = wrapperWidth - horizontalPadding; + + // Check if dimensions are valid + if (height <= 0 || width <= 0) { + console.warn('[Terminal] Invalid wrapper dimensions, retrying...', { height, width }); setTimeout(() => this.resizeTerminal(), 100); return; } + const charSize = this.term._core._renderService._charSizeService; + + if (!charSize.height || !charSize.width) { + // Fallback values if char size not available yet + console.warn('[Terminal] Character size not available, retrying...'); + setTimeout(() => this.resizeTerminal(), 100); + return; + } + + // Calculate new dimensions with padding considerations const rows = Math.floor(height / charSize.height) - 1; const cols = Math.floor(width / charSize.width) - 1; if (rows > 0 && cols > 0) { - this.term.resize(cols, rows); - this.sendMessage({ - resize: { cols: cols, rows: rows } - }); + // Check if dimensions actually changed to avoid unnecessary resizes + const currentCols = this.term.cols; + const currentRows = this.term.rows; + + if (cols !== currentCols || rows !== currentRows) { + console.log(`[Terminal] Resizing terminal: ${currentCols}x${currentRows} -> ${cols}x${rows}`); + this.term.resize(cols, rows); + this.sendMessage({ + resize: { cols: cols, rows: rows } + }); + } + } else { + console.warn('[Terminal] Invalid calculated dimensions:', { rows, cols, height, width, charSize }); } } catch (error) { console.error('[Terminal] Resize error:', error); diff --git a/resources/views/livewire/project/shared/terminal.blade.php b/resources/views/livewire/project/shared/terminal.blade.php index 3f930f4fd..47965522e 100644 --- a/resources/views/livewire/project/shared/terminal.blade.php +++ b/resources/views/livewire/project/shared/terminal.blade.php @@ -17,17 +17,20 @@
@else
-
- -
+
+ Checking Ports Availability... +
+ @if ($proxyStatus !== 'exited') + + @endif
From b447c26ad236970e0fa2d6e1e53d45b0fe6413f9 Mon Sep 17 00:00:00 2001 From: Slava Abakumov <282234+slaFFik@users.noreply.github.com> Date: Fri, 13 Jun 2025 11:36:17 +0200 Subject: [PATCH 0126/1232] Capitalize "WordPress" properly (#5958) * Update wordpress-with-mysql.yaml Use the correct naming for WordPress. It's "WordPress", not "Wordpress". * replace Wordpress with WordPress in templates * change slogans for templates * fix in a livewire template file --- CHANGELOG.md | 10 +++++----- .../livewire/project/service/stack-form.blade.php | 2 +- templates/compose/wordpress-with-mariadb.yaml | 2 +- templates/compose/wordpress-with-mysql.yaml | 2 +- templates/compose/wordpress-without-database.yaml | 2 +- templates/service-templates.json | 6 +++--- 6 files changed, 12 insertions(+), 12 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9fdf59683..999713bfd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3856,7 +3856,7 @@ ### 🐛 Bug Fixes - Bitbucket manual deployments - Webhooks for multiple apps - Unhealthy deployments should be failed -- Add env variables for wordpress template without database +- Add env variables for WordPress template without database - Service deletion function - Service deletion fix - Dns validation + duplicated fqdns @@ -4365,7 +4365,7 @@ ### 🐛 Bug Fixes ### 💼 Other -- Wordpress +- WordPress ## [4.0.0-beta.89] - 2023-10-17 @@ -6280,7 +6280,7 @@ ### 🐛 Bug Fixes - Gitpod updates - Gitpod - Gitpod -- Wordpress FTP permission issues +- WordPress FTP permission issues - GitLab search fields - GitHub App button - GitLab loop on misconfigured source @@ -6644,7 +6644,7 @@ ### 🐛 Bug Fixes - Switch from bitnami/redis to normal redis - Use redis-alpine -- Wordpress extra config +- WordPress extra config - Stop sFTP connection on wp stop - Change user's id in sftp wp instance - Use arm based certbot on arm @@ -6789,7 +6789,7 @@ ## [2.4.0] - 2022-04-08 ### 🚀 Features -- Wordpress on-demand SFTP +- WordPress on-demand SFTP - Finalize on-demand sftp for wp - PHP Composer support - Working on-demand sftp to wp data diff --git a/resources/views/livewire/project/service/stack-form.blade.php b/resources/views/livewire/project/service/stack-form.blade.php index 4252da19e..8f86d4340 100644 --- a/resources/views/livewire/project/service/stack-form.blade.php +++ b/resources/views/livewire/project/service/stack-form.blade.php @@ -10,7 +10,7 @@
Configuration
- +
diff --git a/templates/compose/wordpress-with-mariadb.yaml b/templates/compose/wordpress-with-mariadb.yaml index b83cb7356..7077853d5 100644 --- a/templates/compose/wordpress-with-mariadb.yaml +++ b/templates/compose/wordpress-with-mariadb.yaml @@ -1,5 +1,5 @@ # documentation: https://wordpress.org -# slogan: Wordpress is open source software you can use to create a beautiful website, blog, or app. +# slogan: WordPress is open source software you can use to create a beautiful website, blog, or app. # tags: cms, blog, content, management, mariadb # logo: svgs/wordpress.svg diff --git a/templates/compose/wordpress-with-mysql.yaml b/templates/compose/wordpress-with-mysql.yaml index ad6e203fa..bcd3460eb 100644 --- a/templates/compose/wordpress-with-mysql.yaml +++ b/templates/compose/wordpress-with-mysql.yaml @@ -1,5 +1,5 @@ # documentation: https://wordpress.org -# slogan: Wordpress is open source software you can use to create a beautiful website, blog, or app. +# slogan: WordPress is open source software you can use to create a beautiful website, blog, or app. # tags: cms, blog, content, management, mysql # logo: svgs/wordpress.svg diff --git a/templates/compose/wordpress-without-database.yaml b/templates/compose/wordpress-without-database.yaml index 288ff7796..e9908854e 100644 --- a/templates/compose/wordpress-without-database.yaml +++ b/templates/compose/wordpress-without-database.yaml @@ -1,5 +1,5 @@ # documentation: https://wordpress.org -# slogan: Wordpress is open source software you can use to create a beautiful website, blog, or app. +# slogan: WordPress is open source software you can use to create a beautiful website, blog, or app. # tags: cms, blog, content, management # logo: svgs/wordpress.svg diff --git a/templates/service-templates.json b/templates/service-templates.json index 262e0f5dc..b372b6bcf 100644 --- a/templates/service-templates.json +++ b/templates/service-templates.json @@ -3627,7 +3627,7 @@ }, "wordpress-with-mariadb": { "documentation": "https://wordpress.org?utm_source=coolify.io", - "slogan": "Wordpress is open source software you can use to create a beautiful website, blog, or app.", + "slogan": "WordPress is open source software you can use to create a beautiful website, blog, or app.", "compose": "c2VydmljZXM6CiAgd29yZHByZXNzOgogICAgaW1hZ2U6ICd3b3JkcHJlc3M6bGF0ZXN0JwogICAgdm9sdW1lczoKICAgICAgLSAnd29yZHByZXNzLWZpbGVzOi92YXIvd3d3L2h0bWwnCiAgICBlbnZpcm9ubWVudDoKICAgICAgLSBTRVJWSUNFX0ZRRE5fV09SRFBSRVNTCiAgICAgIC0gV09SRFBSRVNTX0RCX0hPU1Q9bWFyaWFkYgogICAgICAtIFdPUkRQUkVTU19EQl9VU0VSPSRTRVJWSUNFX1VTRVJfV09SRFBSRVNTCiAgICAgIC0gV09SRFBSRVNTX0RCX1BBU1NXT1JEPSRTRVJWSUNFX1BBU1NXT1JEX1dPUkRQUkVTUwogICAgICAtIFdPUkRQUkVTU19EQl9OQU1FPXdvcmRwcmVzcwogICAgZGVwZW5kc19vbjoKICAgICAgLSBtYXJpYWRiCiAgICBoZWFsdGhjaGVjazoKICAgICAgdGVzdDoKICAgICAgICAtIENNRAogICAgICAgIC0gY3VybAogICAgICAgIC0gJy1mJwogICAgICAgIC0gJ2h0dHA6Ly8xMjcuMC4wLjEnCiAgICAgIGludGVydmFsOiAycwogICAgICB0aW1lb3V0OiAxMHMKICAgICAgcmV0cmllczogMTAKICBtYXJpYWRiOgogICAgaW1hZ2U6ICdtYXJpYWRiOjExJwogICAgdm9sdW1lczoKICAgICAgLSAnbWFyaWFkYi1kYXRhOi92YXIvbGliL215c3FsJwogICAgZW52aXJvbm1lbnQ6CiAgICAgIC0gTVlTUUxfUk9PVF9QQVNTV09SRD0kU0VSVklDRV9QQVNTV09SRF9ST09UCiAgICAgIC0gTVlTUUxfREFUQUJBU0U9d29yZHByZXNzCiAgICAgIC0gTVlTUUxfVVNFUj0kU0VSVklDRV9VU0VSX1dPUkRQUkVTUwogICAgICAtIE1ZU1FMX1BBU1NXT1JEPSRTRVJWSUNFX1BBU1NXT1JEX1dPUkRQUkVTUwogICAgaGVhbHRoY2hlY2s6CiAgICAgIHRlc3Q6CiAgICAgICAgLSBDTUQKICAgICAgICAtIGhlYWx0aGNoZWNrLnNoCiAgICAgICAgLSAnLS1jb25uZWN0JwogICAgICAgIC0gJy0taW5ub2RiX2luaXRpYWxpemVkJwogICAgICBpbnRlcnZhbDogNXMKICAgICAgdGltZW91dDogMjBzCiAgICAgIHJldHJpZXM6IDEwCg==", "tags": [ "cms", @@ -3641,7 +3641,7 @@ }, "wordpress-with-mysql": { "documentation": "https://wordpress.org?utm_source=coolify.io", - "slogan": "Wordpress is open source software you can use to create a beautiful website, blog, or app.", + "slogan": "WordPress is open source software you can use to create a beautiful website, blog, or app.", "compose": "c2VydmljZXM6CiAgd29yZHByZXNzOgogICAgaW1hZ2U6ICd3b3JkcHJlc3M6bGF0ZXN0JwogICAgdm9sdW1lczoKICAgICAgLSAnd29yZHByZXNzLWZpbGVzOi92YXIvd3d3L2h0bWwnCiAgICBlbnZpcm9ubWVudDoKICAgICAgLSBTRVJWSUNFX0ZRRE5fV09SRFBSRVNTCiAgICAgIC0gV09SRFBSRVNTX0RCX0hPU1Q9bXlzcWwKICAgICAgLSBXT1JEUFJFU1NfREJfVVNFUj0kU0VSVklDRV9VU0VSX1dPUkRQUkVTUwogICAgICAtIFdPUkRQUkVTU19EQl9QQVNTV09SRD0kU0VSVklDRV9QQVNTV09SRF9XT1JEUFJFU1MKICAgICAgLSBXT1JEUFJFU1NfREJfTkFNRT13b3JkcHJlc3MKICAgIGRlcGVuZHNfb246CiAgICAgIC0gbXlzcWwKICAgIGhlYWx0aGNoZWNrOgogICAgICB0ZXN0OgogICAgICAgIC0gQ01ECiAgICAgICAgLSBjdXJsCiAgICAgICAgLSAnLWYnCiAgICAgICAgLSAnaHR0cDovLzEyNy4wLjAuMScKICAgICAgaW50ZXJ2YWw6IDJzCiAgICAgIHRpbWVvdXQ6IDEwcwogICAgICByZXRyaWVzOiAxMAogIG15c3FsOgogICAgaW1hZ2U6ICdteXNxbDo4JwogICAgdm9sdW1lczoKICAgICAgLSAnbXlzcWwtZGF0YTovdmFyL2xpYi9teXNxbCcKICAgIGVudmlyb25tZW50OgogICAgICAtIE1ZU1FMX1JPT1RfUEFTU1dPUkQ9JFNFUlZJQ0VfUEFTU1dPUkRfUk9PVAogICAgICAtIE1ZU1FMX0RBVEFCQVNFPXdvcmRwcmVzcwogICAgICAtIE1ZU1FMX1VTRVI9JFNFUlZJQ0VfVVNFUl9XT1JEUFJFU1MKICAgICAgLSBNWVNRTF9QQVNTV09SRD0kU0VSVklDRV9QQVNTV09SRF9XT1JEUFJFU1MKICAgIGhlYWx0aGNoZWNrOgogICAgICB0ZXN0OgogICAgICAgIC0gQ01ECiAgICAgICAgLSBteXNxbGFkbWluCiAgICAgICAgLSBwaW5nCiAgICAgICAgLSAnLWgnCiAgICAgICAgLSAxMjcuMC4wLjEKICAgICAgaW50ZXJ2YWw6IDVzCiAgICAgIHRpbWVvdXQ6IDIwcwogICAgICByZXRyaWVzOiAxMAo=", "tags": [ "cms", @@ -3655,7 +3655,7 @@ }, "wordpress-without-database": { "documentation": "https://wordpress.org?utm_source=coolify.io", - "slogan": "Wordpress is open source software you can use to create a beautiful website, blog, or app.", + "slogan": "WordPress is open source software you can use to create a beautiful website, blog, or app.", "compose": "c2VydmljZXM6CiAgd29yZHByZXNzOgogICAgaW1hZ2U6ICd3b3JkcHJlc3M6bGF0ZXN0JwogICAgdm9sdW1lczoKICAgICAgLSAnd29yZHByZXNzLWZpbGVzOi92YXIvd3d3L2h0bWwnCiAgICBlbnZpcm9ubWVudDoKICAgICAgLSBTRVJWSUNFX0ZRRE5fV09SRFBSRVNTCiAgICBoZWFsdGhjaGVjazoKICAgICAgdGVzdDoKICAgICAgICAtIENNRAogICAgICAgIC0gY3VybAogICAgICAgIC0gJy1mJwogICAgICAgIC0gJ2h0dHA6Ly8xMjcuMC4wLjEnCiAgICAgIGludGVydmFsOiAycwogICAgICB0aW1lb3V0OiAxMHMKICAgICAgcmV0cmllczogMTAK", "tags": [ "cms", From f72567fc2d8af779114c27f6fa84b6d23d04f1f7 Mon Sep 17 00:00:00 2001 From: Andras Bacsai <5845193+andrasbacsai@users.noreply.github.com> Date: Fri, 13 Jun 2025 11:40:13 +0200 Subject: [PATCH 0127/1232] chore(dependencies): update package versions in package.json and package-lock.json for improved stability and features --- package-lock.json | 580 +++++++++++++++++++++++++++++----------------- package.json | 28 +-- 2 files changed, 384 insertions(+), 224 deletions(-) diff --git a/package-lock.json b/package-lock.json index 7996a3653..d86caea87 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,22 +8,22 @@ "dependencies": { "@tailwindcss/forms": "0.5.10", "@tailwindcss/typography": "0.5.16", - "@xterm/addon-fit": "^0.10.0", - "@xterm/xterm": "^5.5.0", - "ioredis": "5.6.0" + "@xterm/addon-fit": "0.10.0", + "@xterm/xterm": "5.5.0", + "ioredis": "5.6.1" }, "devDependencies": { - "@tailwindcss/postcss": "^4.1.4", - "@vitejs/plugin-vue": "5.2.3", - "axios": "1.8.4", - "laravel-echo": "2.0.2", - "laravel-vite-plugin": "^1.2.0", - "postcss": "8.5.3", + "@tailwindcss/postcss": "4.1.10", + "@vitejs/plugin-vue": "5.2.4", + "axios": "1.9.0", + "laravel-echo": "2.1.5", + "laravel-vite-plugin": "1.3.0", + "postcss": "8.5.5", "pusher-js": "8.4.0", - "tailwind-scrollbar": "^4.0.2", - "tailwindcss": "^4.1.4", - "vite": "^6.2.6", - "vue": "3.5.13" + "tailwind-scrollbar": "4.0.2", + "tailwindcss": "4.1.10", + "vite": "6.3.5", + "vue": "3.5.16" } }, "node_modules/@alloc/quick-lru": { @@ -74,13 +74,13 @@ } }, "node_modules/@babel/parser": { - "version": "7.27.2", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.27.2.tgz", - "integrity": "sha512-QYLs8299NA7WM/bZAdp+CviYYkVoYXlDW2rzliy3chxd1PQjej7JORuMJDJXJUb9g0TT+B99EwaVLKmX+sPXWw==", + "version": "7.27.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.27.5.tgz", + "integrity": "sha512-OsQd175SxWkGlzbny8J3K8TnnDD0N3lrIUtB92xwyRpzaenGZhxDvxN/JgU00U3CDZNj9tPuDJ5H0WS4Nt3vKg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/types": "^7.27.1" + "@babel/types": "^7.27.3" }, "bin": { "parser": "bin/babel-parser.js" @@ -90,9 +90,9 @@ } }, "node_modules/@babel/types": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.27.1.tgz", - "integrity": "sha512-+EzkxvLNfiUeKMgy/3luqfsCWFRXLb7U6wNQTk60tovuckwB15B191tJWvpp4HjiQWdJkCxO3Wbvc6jlk3Xb2Q==", + "version": "7.27.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.27.6.tgz", + "integrity": "sha512-ETyHEk2VHHvl9b9jZP5IHPavHYk57EhanlRRuae9XCpb/j5bDCbPPMOBfCWhnl/7EDJz0jEMCi/RhccCE8r1+Q==", "dev": true, "license": "MIT", "dependencies": { @@ -880,6 +880,14 @@ "win32" ] }, + "node_modules/@socket.io/component-emitter": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.2.tgz", + "integrity": "sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==", + "dev": true, + "license": "MIT", + "peer": true + }, "node_modules/@tailwindcss/forms": { "version": "0.5.10", "resolved": "https://registry.npmjs.org/@tailwindcss/forms/-/forms-0.5.10.tgz", @@ -893,25 +901,25 @@ } }, "node_modules/@tailwindcss/node": { - "version": "4.1.6", - "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.1.6.tgz", - "integrity": "sha512-ed6zQbgmKsjsVvodAS1q1Ld2BolEuxJOSyyNc+vhkjdmfNUDCmQnlXBfQkHrlzNmslxHsQU/bFmzcEbv4xXsLg==", + "version": "4.1.10", + "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.1.10.tgz", + "integrity": "sha512-2ACf1znY5fpRBwRhMgj9ZXvb2XZW8qs+oTfotJ2C5xR0/WNL7UHZ7zXl6s+rUqedL1mNi+0O+WQr5awGowS3PQ==", "dev": true, "license": "MIT", "dependencies": { "@ampproject/remapping": "^2.3.0", "enhanced-resolve": "^5.18.1", "jiti": "^2.4.2", - "lightningcss": "1.29.2", + "lightningcss": "1.30.1", "magic-string": "^0.30.17", "source-map-js": "^1.2.1", - "tailwindcss": "4.1.6" + "tailwindcss": "4.1.10" } }, "node_modules/@tailwindcss/oxide": { - "version": "4.1.6", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.1.6.tgz", - "integrity": "sha512-0bpEBQiGx+227fW4G0fLQ8vuvyy5rsB1YIYNapTq3aRsJ9taF3f5cCaovDjN5pUGKKzcpMrZst/mhNaKAPOHOA==", + "version": "4.1.10", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.1.10.tgz", + "integrity": "sha512-v0C43s7Pjw+B9w21htrQwuFObSkio2aV/qPx/mhrRldbqxbWJK6KizM+q7BF1/1CmuLqZqX3CeYF7s7P9fbA8Q==", "dev": true, "hasInstallScript": true, "license": "MIT", @@ -923,24 +931,24 @@ "node": ">= 10" }, "optionalDependencies": { - "@tailwindcss/oxide-android-arm64": "4.1.6", - "@tailwindcss/oxide-darwin-arm64": "4.1.6", - "@tailwindcss/oxide-darwin-x64": "4.1.6", - "@tailwindcss/oxide-freebsd-x64": "4.1.6", - "@tailwindcss/oxide-linux-arm-gnueabihf": "4.1.6", - "@tailwindcss/oxide-linux-arm64-gnu": "4.1.6", - "@tailwindcss/oxide-linux-arm64-musl": "4.1.6", - "@tailwindcss/oxide-linux-x64-gnu": "4.1.6", - "@tailwindcss/oxide-linux-x64-musl": "4.1.6", - "@tailwindcss/oxide-wasm32-wasi": "4.1.6", - "@tailwindcss/oxide-win32-arm64-msvc": "4.1.6", - "@tailwindcss/oxide-win32-x64-msvc": "4.1.6" + "@tailwindcss/oxide-android-arm64": "4.1.10", + "@tailwindcss/oxide-darwin-arm64": "4.1.10", + "@tailwindcss/oxide-darwin-x64": "4.1.10", + "@tailwindcss/oxide-freebsd-x64": "4.1.10", + "@tailwindcss/oxide-linux-arm-gnueabihf": "4.1.10", + "@tailwindcss/oxide-linux-arm64-gnu": "4.1.10", + "@tailwindcss/oxide-linux-arm64-musl": "4.1.10", + "@tailwindcss/oxide-linux-x64-gnu": "4.1.10", + "@tailwindcss/oxide-linux-x64-musl": "4.1.10", + "@tailwindcss/oxide-wasm32-wasi": "4.1.10", + "@tailwindcss/oxide-win32-arm64-msvc": "4.1.10", + "@tailwindcss/oxide-win32-x64-msvc": "4.1.10" } }, "node_modules/@tailwindcss/oxide-android-arm64": { - "version": "4.1.6", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.1.6.tgz", - "integrity": "sha512-VHwwPiwXtdIvOvqT/0/FLH/pizTVu78FOnI9jQo64kSAikFSZT7K4pjyzoDpSMaveJTGyAKvDjuhxJxKfmvjiQ==", + "version": "4.1.10", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.1.10.tgz", + "integrity": "sha512-VGLazCoRQ7rtsCzThaI1UyDu/XRYVyH4/EWiaSX6tFglE+xZB5cvtC5Omt0OQ+FfiIVP98su16jDVHDEIuH4iQ==", "cpu": [ "arm64" ], @@ -955,9 +963,9 @@ } }, "node_modules/@tailwindcss/oxide-darwin-arm64": { - "version": "4.1.6", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.1.6.tgz", - "integrity": "sha512-weINOCcqv1HVBIGptNrk7c6lWgSFFiQMcCpKM4tnVi5x8OY2v1FrV76jwLukfT6pL1hyajc06tyVmZFYXoxvhQ==", + "version": "4.1.10", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.1.10.tgz", + "integrity": "sha512-ZIFqvR1irX2yNjWJzKCqTCcHZbgkSkSkZKbRM3BPzhDL/18idA8uWCoopYA2CSDdSGFlDAxYdU2yBHwAwx8euQ==", "cpu": [ "arm64" ], @@ -972,9 +980,9 @@ } }, "node_modules/@tailwindcss/oxide-darwin-x64": { - "version": "4.1.6", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.1.6.tgz", - "integrity": "sha512-3FzekhHG0ww1zQjQ1lPoq0wPrAIVXAbUkWdWM8u5BnYFZgb9ja5ejBqyTgjpo5mfy0hFOoMnMuVDI+7CXhXZaQ==", + "version": "4.1.10", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.1.10.tgz", + "integrity": "sha512-eCA4zbIhWUFDXoamNztmS0MjXHSEJYlvATzWnRiTqJkcUteSjO94PoRHJy1Xbwp9bptjeIxxBHh+zBWFhttbrQ==", "cpu": [ "x64" ], @@ -989,9 +997,9 @@ } }, "node_modules/@tailwindcss/oxide-freebsd-x64": { - "version": "4.1.6", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.1.6.tgz", - "integrity": "sha512-4m5F5lpkBZhVQJq53oe5XgJ+aFYWdrgkMwViHjRsES3KEu2m1udR21B1I77RUqie0ZYNscFzY1v9aDssMBZ/1w==", + "version": "4.1.10", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.1.10.tgz", + "integrity": "sha512-8/392Xu12R0cc93DpiJvNpJ4wYVSiciUlkiOHOSOQNH3adq9Gi/dtySK7dVQjXIOzlpSHjeCL89RUUI8/GTI6g==", "cpu": [ "x64" ], @@ -1006,9 +1014,9 @@ } }, "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": { - "version": "4.1.6", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.1.6.tgz", - "integrity": "sha512-qU0rHnA9P/ZoaDKouU1oGPxPWzDKtIfX7eOGi5jOWJKdxieUJdVV+CxWZOpDWlYTd4N3sFQvcnVLJWJ1cLP5TA==", + "version": "4.1.10", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.1.10.tgz", + "integrity": "sha512-t9rhmLT6EqeuPT+MXhWhlRYIMSfh5LZ6kBrC4FS6/+M1yXwfCtp24UumgCWOAJVyjQwG+lYva6wWZxrfvB+NhQ==", "cpu": [ "arm" ], @@ -1023,9 +1031,9 @@ } }, "node_modules/@tailwindcss/oxide-linux-arm64-gnu": { - "version": "4.1.6", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.1.6.tgz", - "integrity": "sha512-jXy3TSTrbfgyd3UxPQeXC3wm8DAgmigzar99Km9Sf6L2OFfn/k+u3VqmpgHQw5QNfCpPe43em6Q7V76Wx7ogIQ==", + "version": "4.1.10", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.1.10.tgz", + "integrity": "sha512-3oWrlNlxLRxXejQ8zImzrVLuZ/9Z2SeKoLhtCu0hpo38hTO2iL86eFOu4sVR8cZc6n3z7eRXXqtHJECa6mFOvA==", "cpu": [ "arm64" ], @@ -1040,9 +1048,9 @@ } }, "node_modules/@tailwindcss/oxide-linux-arm64-musl": { - "version": "4.1.6", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.1.6.tgz", - "integrity": "sha512-8kjivE5xW0qAQ9HX9reVFmZj3t+VmljDLVRJpVBEoTR+3bKMnvC7iLcoSGNIUJGOZy1mLVq7x/gerVg0T+IsYw==", + "version": "4.1.10", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.1.10.tgz", + "integrity": "sha512-saScU0cmWvg/Ez4gUmQWr9pvY9Kssxt+Xenfx1LG7LmqjcrvBnw4r9VjkFcqmbBb7GCBwYNcZi9X3/oMda9sqQ==", "cpu": [ "arm64" ], @@ -1057,9 +1065,9 @@ } }, "node_modules/@tailwindcss/oxide-linux-x64-gnu": { - "version": "4.1.6", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.1.6.tgz", - "integrity": "sha512-A4spQhwnWVpjWDLXnOW9PSinO2PTKJQNRmL/aIl2U/O+RARls8doDfs6R41+DAXK0ccacvRyDpR46aVQJJCoCg==", + "version": "4.1.10", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.1.10.tgz", + "integrity": "sha512-/G3ao/ybV9YEEgAXeEg28dyH6gs1QG8tvdN9c2MNZdUXYBaIY/Gx0N6RlJzfLy/7Nkdok4kaxKPHKJUlAaoTdA==", "cpu": [ "x64" ], @@ -1074,9 +1082,9 @@ } }, "node_modules/@tailwindcss/oxide-linux-x64-musl": { - "version": "4.1.6", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.1.6.tgz", - "integrity": "sha512-YRee+6ZqdzgiQAHVSLfl3RYmqeeaWVCk796MhXhLQu2kJu2COHBkqlqsqKYx3p8Hmk5pGCQd2jTAoMWWFeyG2A==", + "version": "4.1.10", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.1.10.tgz", + "integrity": "sha512-LNr7X8fTiKGRtQGOerSayc2pWJp/9ptRYAa4G+U+cjw9kJZvkopav1AQc5HHD+U364f71tZv6XamaHKgrIoVzA==", "cpu": [ "x64" ], @@ -1091,9 +1099,9 @@ } }, "node_modules/@tailwindcss/oxide-wasm32-wasi": { - "version": "4.1.6", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.1.6.tgz", - "integrity": "sha512-qAp4ooTYrBQ5pk5jgg54/U1rCJ/9FLYOkkQ/nTE+bVMseMfB6O7J8zb19YTpWuu4UdfRf5zzOrNKfl6T64MNrQ==", + "version": "4.1.10", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.1.10.tgz", + "integrity": "sha512-d6ekQpopFQJAcIK2i7ZzWOYGZ+A6NzzvQ3ozBvWFdeyqfOZdYHU66g5yr+/HC4ipP1ZgWsqa80+ISNILk+ae/Q==", "bundleDependencies": [ "@napi-rs/wasm-runtime", "@emnapi/core", @@ -1112,7 +1120,7 @@ "@emnapi/core": "^1.4.3", "@emnapi/runtime": "^1.4.3", "@emnapi/wasi-threads": "^1.0.2", - "@napi-rs/wasm-runtime": "^0.2.9", + "@napi-rs/wasm-runtime": "^0.2.10", "@tybys/wasm-util": "^0.9.0", "tslib": "^2.8.0" }, @@ -1121,9 +1129,9 @@ } }, "node_modules/@tailwindcss/oxide-win32-arm64-msvc": { - "version": "4.1.6", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.1.6.tgz", - "integrity": "sha512-nqpDWk0Xr8ELO/nfRUDjk1pc9wDJ3ObeDdNMHLaymc4PJBWj11gdPCWZFKSK2AVKjJQC7J2EfmSmf47GN7OuLg==", + "version": "4.1.10", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.1.10.tgz", + "integrity": "sha512-i1Iwg9gRbwNVOCYmnigWCCgow8nDWSFmeTUU5nbNx3rqbe4p0kRbEqLwLJbYZKmSSp23g4N6rCDmm7OuPBXhDA==", "cpu": [ "arm64" ], @@ -1138,9 +1146,9 @@ } }, "node_modules/@tailwindcss/oxide-win32-x64-msvc": { - "version": "4.1.6", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.1.6.tgz", - "integrity": "sha512-5k9xF33xkfKpo9wCvYcegQ21VwIBU1/qEbYlVukfEIyQbEA47uK8AAwS7NVjNE3vHzcmxMYwd0l6L4pPjjm1rQ==", + "version": "4.1.10", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.1.10.tgz", + "integrity": "sha512-sGiJTjcBSfGq2DVRtaSljq5ZgZS2SDHSIfhOylkBvHVjwOsodBhnb3HdmiKkVuUGKD0I7G63abMOVaskj1KpOA==", "cpu": [ "x64" ], @@ -1155,17 +1163,17 @@ } }, "node_modules/@tailwindcss/postcss": { - "version": "4.1.6", - "resolved": "https://registry.npmjs.org/@tailwindcss/postcss/-/postcss-4.1.6.tgz", - "integrity": "sha512-ELq+gDMBuRXPJlpE3PEen+1MhnHAQQrh2zF0dI1NXOlEWfr2qWf2CQdr5jl9yANv8RErQaQ2l6nIFO9OSCVq/g==", + "version": "4.1.10", + "resolved": "https://registry.npmjs.org/@tailwindcss/postcss/-/postcss-4.1.10.tgz", + "integrity": "sha512-B+7r7ABZbkXJwpvt2VMnS6ujcDoR2OOcFaqrLIo1xbcdxje4Vf+VgJdBzNNbrAjBj/rLZ66/tlQ1knIGNLKOBQ==", "dev": true, "license": "MIT", "dependencies": { "@alloc/quick-lru": "^5.2.0", - "@tailwindcss/node": "4.1.6", - "@tailwindcss/oxide": "4.1.6", + "@tailwindcss/node": "4.1.10", + "@tailwindcss/oxide": "4.1.10", "postcss": "^8.4.41", - "tailwindcss": "4.1.6" + "tailwindcss": "4.1.10" } }, "node_modules/@tailwindcss/typography": { @@ -1198,9 +1206,9 @@ "license": "MIT" }, "node_modules/@vitejs/plugin-vue": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-5.2.3.tgz", - "integrity": "sha512-IYSLEQj4LgZZuoVpdSUCw3dIynTWQgPlaRP6iAvMle4My0HdYwr5g5wQAfwOeHQBmYwEkqF70nRpSilr6PoUDg==", + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-5.2.4.tgz", + "integrity": "sha512-7Yx/SXSOcQq5HiiV3orevHUFn+pmMB4cgbEkDYgnkUWb0WfeQ/wa2yFv6D5ICiCQOVpjA7vYDXrC7AGO8yjDHA==", "dev": true, "license": "MIT", "engines": { @@ -1212,111 +1220,111 @@ } }, "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==", + "version": "3.5.16", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.16.tgz", + "integrity": "sha512-AOQS2eaQOaaZQoL1u+2rCJIKDruNXVBZSiUD3chnUrsoX5ZTQMaCvXlWNIfxBJuU15r1o7+mpo5223KVtIhAgQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/parser": "^7.25.3", - "@vue/shared": "3.5.13", + "@babel/parser": "^7.27.2", + "@vue/shared": "3.5.16", "entities": "^4.5.0", "estree-walker": "^2.0.2", - "source-map-js": "^1.2.0" + "source-map-js": "^1.2.1" } }, "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==", + "version": "3.5.16", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.16.tgz", + "integrity": "sha512-SSJIhBr/teipXiXjmWOVWLnxjNGo65Oj/8wTEQz0nqwQeP75jWZ0n4sF24Zxoht1cuJoWopwj0J0exYwCJ0dCQ==", "dev": true, "license": "MIT", "dependencies": { - "@vue/compiler-core": "3.5.13", - "@vue/shared": "3.5.13" + "@vue/compiler-core": "3.5.16", + "@vue/shared": "3.5.16" } }, "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==", + "version": "3.5.16", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.16.tgz", + "integrity": "sha512-rQR6VSFNpiinDy/DVUE0vHoIDUF++6p910cgcZoaAUm3POxgNOOdS/xgoll3rNdKYTYPnnbARDCZOyZ+QSe6Pw==", "dev": true, "license": "MIT", "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", + "@babel/parser": "^7.27.2", + "@vue/compiler-core": "3.5.16", + "@vue/compiler-dom": "3.5.16", + "@vue/compiler-ssr": "3.5.16", + "@vue/shared": "3.5.16", "estree-walker": "^2.0.2", - "magic-string": "^0.30.11", - "postcss": "^8.4.48", - "source-map-js": "^1.2.0" + "magic-string": "^0.30.17", + "postcss": "^8.5.3", + "source-map-js": "^1.2.1" } }, "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==", + "version": "3.5.16", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.16.tgz", + "integrity": "sha512-d2V7kfxbdsjrDSGlJE7my1ZzCXViEcqN6w14DOsDrUCHEA6vbnVCpRFfrc4ryCP/lCKzX2eS1YtnLE/BuC9f/A==", "dev": true, "license": "MIT", "dependencies": { - "@vue/compiler-dom": "3.5.13", - "@vue/shared": "3.5.13" + "@vue/compiler-dom": "3.5.16", + "@vue/shared": "3.5.16" } }, "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==", + "version": "3.5.16", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.16.tgz", + "integrity": "sha512-FG5Q5ee/kxhIm1p2bykPpPwqiUBV3kFySsHEQha5BJvjXdZTUfmya7wP7zC39dFuZAcf/PD5S4Lni55vGLMhvA==", "dev": true, "license": "MIT", "dependencies": { - "@vue/shared": "3.5.13" + "@vue/shared": "3.5.16" } }, "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==", + "version": "3.5.16", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.16.tgz", + "integrity": "sha512-bw5Ykq6+JFHYxrQa7Tjr+VSzw7Dj4ldR/udyBZbq73fCdJmyy5MPIFR9IX/M5Qs+TtTjuyUTCnmK3lWWwpAcFQ==", "dev": true, "license": "MIT", "dependencies": { - "@vue/reactivity": "3.5.13", - "@vue/shared": "3.5.13" + "@vue/reactivity": "3.5.16", + "@vue/shared": "3.5.16" } }, "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==", + "version": "3.5.16", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.16.tgz", + "integrity": "sha512-T1qqYJsG2xMGhImRUV9y/RseB9d0eCYZQ4CWca9ztCuiPj/XWNNN+lkNBuzVbia5z4/cgxdL28NoQCvC0Xcfww==", "dev": true, "license": "MIT", "dependencies": { - "@vue/reactivity": "3.5.13", - "@vue/runtime-core": "3.5.13", - "@vue/shared": "3.5.13", + "@vue/reactivity": "3.5.16", + "@vue/runtime-core": "3.5.16", + "@vue/shared": "3.5.16", "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==", + "version": "3.5.16", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.16.tgz", + "integrity": "sha512-BrX0qLiv/WugguGsnQUJiYOE0Fe5mZTwi6b7X/ybGB0vfrPH9z0gD/Y6WOR1sGCgX4gc25L1RYS5eYQKDMoNIg==", "dev": true, "license": "MIT", "dependencies": { - "@vue/compiler-ssr": "3.5.13", - "@vue/shared": "3.5.13" + "@vue/compiler-ssr": "3.5.16", + "@vue/shared": "3.5.16" }, "peerDependencies": { - "vue": "3.5.13" + "vue": "3.5.16" } }, "node_modules/@vue/shared": { - "version": "3.5.13", - "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.13.tgz", - "integrity": "sha512-/hnE/qP5ZoGpol0a5mDi45bOd7t3tjYJBjsgCsivow7D48cJeV5l05RD82lPqi7gRiphZM37rnhW1l6ZoCNNnQ==", + "version": "3.5.16", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.16.tgz", + "integrity": "sha512-c/0fWy3Jw6Z8L9FmTyYfkpM5zklnqqa9+a6dz3DvONRKW2NEbh46BP0FHuLFSWi2TnQEtp91Z6zOWNrU6QiyPg==", "dev": true, "license": "MIT" }, @@ -1343,9 +1351,9 @@ "license": "MIT" }, "node_modules/axios": { - "version": "1.8.4", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.8.4.tgz", - "integrity": "sha512-eBSYY4Y68NNlHbHBMdeDmKNtDgXWhQsJcGqzO3iLUM0GraQFSS9cVgPX5I9b3lbdFKyYoAEGAZF1DwhTaljNAw==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.9.0.tgz", + "integrity": "sha512-re4CqKTJaURpzbLHtIi6XpDv20/CnpXOtjRY5/CU32L8gU8ek9UIivcfvSWvmKEngmVbrUtPpdDwWDWL7DNHvg==", "dev": true, "license": "MIT", "dependencies": { @@ -1490,6 +1498,51 @@ "node": ">= 0.4" } }, + "node_modules/engine.io-client": { + "version": "6.6.3", + "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-6.6.3.tgz", + "integrity": "sha512-T0iLjnyNWahNyv/lcjS2y4oE358tVS/SYQNxYXGAJ9/GLgH4VCvOQ/mhTjqU88mLZCQgiG8RIegFHYCdVC+j5w==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@socket.io/component-emitter": "~3.1.0", + "debug": "~4.3.1", + "engine.io-parser": "~5.2.1", + "ws": "~8.17.1", + "xmlhttprequest-ssl": "~2.1.1" + } + }, + "node_modules/engine.io-client/node_modules/debug": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/engine.io-parser": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.2.3.tgz", + "integrity": "sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=10.0.0" + } + }, "node_modules/enhanced-resolve": { "version": "5.18.1", "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.1.tgz", @@ -1793,9 +1846,9 @@ } }, "node_modules/ioredis": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/ioredis/-/ioredis-5.6.0.tgz", - "integrity": "sha512-tBZlIIWbndeWBWCXWZiqtOF/yxf6yZX3tAlTJ7nfo5jhd6dctNxF7QnYlZLZ1a0o0pDoen7CgZqO+zjNaFbJAg==", + "version": "5.6.1", + "resolved": "https://registry.npmjs.org/ioredis/-/ioredis-5.6.1.tgz", + "integrity": "sha512-UxC0Yv1Y4WRJiGQxQkP0hfdL0/5/6YvdfOOClRgJ0qppSarkhneSa6UvkMkms0AkdGimSH3Ikqm+6mkMmX7vGA==", "license": "MIT", "dependencies": { "@ioredis/commands": "^1.1.1", @@ -1827,19 +1880,23 @@ } }, "node_modules/laravel-echo": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/laravel-echo/-/laravel-echo-2.0.2.tgz", - "integrity": "sha512-Ciai6hA7r35MFqNRb8G034cvm9WiveSTFQQKRGJhWtZGbng7C8BBa5QvqDxk/Mw5GeJ+q19jrEwQhf7r1b1lcg==", + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/laravel-echo/-/laravel-echo-2.1.5.tgz", + "integrity": "sha512-xIlV7AYjfIXv9KGiDa3qqc7JOEJUqNl+6Nx/I6bdxnSAMqnNZT5Nc1rwjOYfoYEI6030QkKF8BhPuU6Roakebw==", "dev": true, "license": "MIT", "engines": { "node": ">=20" + }, + "peerDependencies": { + "pusher-js": "*", + "socket.io-client": "*" } }, "node_modules/laravel-vite-plugin": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/laravel-vite-plugin/-/laravel-vite-plugin-1.2.0.tgz", - "integrity": "sha512-R0pJ+IcTVeqEMoKz/B2Ij57QVq3sFTABiFmb06gAwFdivbOgsUtuhX6N2MGLEArajrS3U5JbberzwOe7uXHMHQ==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/laravel-vite-plugin/-/laravel-vite-plugin-1.3.0.tgz", + "integrity": "sha512-P5qyG56YbYxM8OuYmK2OkhcKe0AksNVJUjq9LUZ5tOekU9fBn9LujYyctI4t9XoLjuMvHJXXpCoPntY1oKltuA==", "dev": true, "license": "MIT", "dependencies": { @@ -1857,9 +1914,9 @@ } }, "node_modules/lightningcss": { - "version": "1.29.2", - "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.29.2.tgz", - "integrity": "sha512-6b6gd/RUXKaw5keVdSEtqFVdzWnU5jMxTUjA2bVcMNPLwSQ08Sv/UodBVtETLCn7k4S1Ibxwh7k68IwLZPgKaA==", + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.30.1.tgz", + "integrity": "sha512-xi6IyHML+c9+Q3W0S4fCQJOym42pyurFiJUHEcEyHS0CeKzia4yZDEsLlqOFykxOdHpNy0NmvVO31vcSqAxJCg==", "dev": true, "license": "MPL-2.0", "dependencies": { @@ -1873,22 +1930,22 @@ "url": "https://opencollective.com/parcel" }, "optionalDependencies": { - "lightningcss-darwin-arm64": "1.29.2", - "lightningcss-darwin-x64": "1.29.2", - "lightningcss-freebsd-x64": "1.29.2", - "lightningcss-linux-arm-gnueabihf": "1.29.2", - "lightningcss-linux-arm64-gnu": "1.29.2", - "lightningcss-linux-arm64-musl": "1.29.2", - "lightningcss-linux-x64-gnu": "1.29.2", - "lightningcss-linux-x64-musl": "1.29.2", - "lightningcss-win32-arm64-msvc": "1.29.2", - "lightningcss-win32-x64-msvc": "1.29.2" + "lightningcss-darwin-arm64": "1.30.1", + "lightningcss-darwin-x64": "1.30.1", + "lightningcss-freebsd-x64": "1.30.1", + "lightningcss-linux-arm-gnueabihf": "1.30.1", + "lightningcss-linux-arm64-gnu": "1.30.1", + "lightningcss-linux-arm64-musl": "1.30.1", + "lightningcss-linux-x64-gnu": "1.30.1", + "lightningcss-linux-x64-musl": "1.30.1", + "lightningcss-win32-arm64-msvc": "1.30.1", + "lightningcss-win32-x64-msvc": "1.30.1" } }, "node_modules/lightningcss-darwin-arm64": { - "version": "1.29.2", - "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.29.2.tgz", - "integrity": "sha512-cK/eMabSViKn/PG8U/a7aCorpeKLMlK0bQeNHmdb7qUnBkNPnL+oV5DjJUo0kqWsJUapZsM4jCfYItbqBDvlcA==", + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.30.1.tgz", + "integrity": "sha512-c8JK7hyE65X1MHMN+Viq9n11RRC7hgin3HhYKhrMyaXflk5GVplZ60IxyoVtzILeKr+xAJwg6zK6sjTBJ0FKYQ==", "cpu": [ "arm64" ], @@ -1907,9 +1964,9 @@ } }, "node_modules/lightningcss-darwin-x64": { - "version": "1.29.2", - "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.29.2.tgz", - "integrity": "sha512-j5qYxamyQw4kDXX5hnnCKMf3mLlHvG44f24Qyi2965/Ycz829MYqjrVg2H8BidybHBp9kom4D7DR5VqCKDXS0w==", + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.30.1.tgz", + "integrity": "sha512-k1EvjakfumAQoTfcXUcHQZhSpLlkAuEkdMBsI/ivWw9hL+7FtilQc0Cy3hrx0AAQrVtQAbMI7YjCgYgvn37PzA==", "cpu": [ "x64" ], @@ -1928,9 +1985,9 @@ } }, "node_modules/lightningcss-freebsd-x64": { - "version": "1.29.2", - "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.29.2.tgz", - "integrity": "sha512-wDk7M2tM78Ii8ek9YjnY8MjV5f5JN2qNVO+/0BAGZRvXKtQrBC4/cn4ssQIpKIPP44YXw6gFdpUF+Ps+RGsCwg==", + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.30.1.tgz", + "integrity": "sha512-kmW6UGCGg2PcyUE59K5r0kWfKPAVy4SltVeut+umLCFoJ53RdCUWxcRDzO1eTaxf/7Q2H7LTquFHPL5R+Gjyig==", "cpu": [ "x64" ], @@ -1949,9 +2006,9 @@ } }, "node_modules/lightningcss-linux-arm-gnueabihf": { - "version": "1.29.2", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.29.2.tgz", - "integrity": "sha512-IRUrOrAF2Z+KExdExe3Rz7NSTuuJ2HvCGlMKoquK5pjvo2JY4Rybr+NrKnq0U0hZnx5AnGsuFHjGnNT14w26sg==", + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.30.1.tgz", + "integrity": "sha512-MjxUShl1v8pit+6D/zSPq9S9dQ2NPFSQwGvxBCYaBYLPlCWuPh9/t1MRS8iUaR8i+a6w7aps+B4N0S1TYP/R+Q==", "cpu": [ "arm" ], @@ -1970,9 +2027,9 @@ } }, "node_modules/lightningcss-linux-arm64-gnu": { - "version": "1.29.2", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.29.2.tgz", - "integrity": "sha512-KKCpOlmhdjvUTX/mBuaKemp0oeDIBBLFiU5Fnqxh1/DZ4JPZi4evEH7TKoSBFOSOV3J7iEmmBaw/8dpiUvRKlQ==", + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.30.1.tgz", + "integrity": "sha512-gB72maP8rmrKsnKYy8XUuXi/4OctJiuQjcuqWNlJQ6jZiWqtPvqFziskH3hnajfvKB27ynbVCucKSm2rkQp4Bw==", "cpu": [ "arm64" ], @@ -1991,9 +2048,9 @@ } }, "node_modules/lightningcss-linux-arm64-musl": { - "version": "1.29.2", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.29.2.tgz", - "integrity": "sha512-Q64eM1bPlOOUgxFmoPUefqzY1yV3ctFPE6d/Vt7WzLW4rKTv7MyYNky+FWxRpLkNASTnKQUaiMJ87zNODIrrKQ==", + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.30.1.tgz", + "integrity": "sha512-jmUQVx4331m6LIX+0wUhBbmMX7TCfjF5FoOH6SD1CttzuYlGNVpA7QnrmLxrsub43ClTINfGSYyHe2HWeLl5CQ==", "cpu": [ "arm64" ], @@ -2012,9 +2069,9 @@ } }, "node_modules/lightningcss-linux-x64-gnu": { - "version": "1.29.2", - "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.29.2.tgz", - "integrity": "sha512-0v6idDCPG6epLXtBH/RPkHvYx74CVziHo6TMYga8O2EiQApnUPZsbR9nFNrg2cgBzk1AYqEd95TlrsL7nYABQg==", + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.30.1.tgz", + "integrity": "sha512-piWx3z4wN8J8z3+O5kO74+yr6ze/dKmPnI7vLqfSqI8bccaTGY5xiSGVIJBDd5K5BHlvVLpUB3S2YCfelyJ1bw==", "cpu": [ "x64" ], @@ -2033,9 +2090,9 @@ } }, "node_modules/lightningcss-linux-x64-musl": { - "version": "1.29.2", - "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.29.2.tgz", - "integrity": "sha512-rMpz2yawkgGT8RULc5S4WiZopVMOFWjiItBT7aSfDX4NQav6M44rhn5hjtkKzB+wMTRlLLqxkeYEtQ3dd9696w==", + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.30.1.tgz", + "integrity": "sha512-rRomAK7eIkL+tHY0YPxbc5Dra2gXlI63HL+v1Pdi1a3sC+tJTcFrHX+E86sulgAXeI7rSzDYhPSeHHjqFhqfeQ==", "cpu": [ "x64" ], @@ -2054,9 +2111,9 @@ } }, "node_modules/lightningcss-win32-arm64-msvc": { - "version": "1.29.2", - "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.29.2.tgz", - "integrity": "sha512-nL7zRW6evGQqYVu/bKGK+zShyz8OVzsCotFgc7judbt6wnB2KbiKKJwBE4SGoDBQ1O94RjW4asrCjQL4i8Fhbw==", + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.30.1.tgz", + "integrity": "sha512-mSL4rqPi4iXq5YVqzSsJgMVFENoa4nGTT/GjO2c0Yl9OuQfPsIfncvLrEW6RbbB24WtZ3xP/2CCmI3tNkNV4oA==", "cpu": [ "arm64" ], @@ -2075,9 +2132,9 @@ } }, "node_modules/lightningcss-win32-x64-msvc": { - "version": "1.29.2", - "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.29.2.tgz", - "integrity": "sha512-EdIUW3B2vLuHmv7urfzMI/h2fmlnOQBk1xlsDxkN1tCWKjNFjfLhGxYk8C8mzpSfr+A6jFFIi8fU6LbQGsRWjA==", + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.30.1.tgz", + "integrity": "sha512-PVqXh48wh4T53F/1CCu8PIPCxLzWyCnn/9T5W1Jpmdy5h9Cwd+0YQS6/LwhHXSafuc61/xg9Lv5OrCby6a++jg==", "cpu": [ "x64" ], @@ -2262,9 +2319,9 @@ } }, "node_modules/postcss": { - "version": "8.5.3", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.3.tgz", - "integrity": "sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==", + "version": "8.5.5", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.5.tgz", + "integrity": "sha512-d/jtm+rdNT8tpXuHY5MMtcbJFBkhXE6593XVR9UoGCH8jSFGci7jGvMGH5RYd5PBJW+00NZQt6gf7CbagJCrhg==", "dev": true, "funding": [ { @@ -2282,7 +2339,7 @@ ], "license": "MIT", "dependencies": { - "nanoid": "^3.3.8", + "nanoid": "^3.3.11", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" }, @@ -2406,6 +2463,76 @@ "fsevents": "~2.3.2" } }, + "node_modules/socket.io-client": { + "version": "4.8.1", + "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-4.8.1.tgz", + "integrity": "sha512-hJVXfu3E28NmzGk8o1sHhN3om52tRvwYeidbj7xKy2eIIse5IoKX3USlS6Tqt3BHAtflLIkCQBkzVrEEfWUyYQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@socket.io/component-emitter": "~3.1.0", + "debug": "~4.3.2", + "engine.io-client": "~6.6.1", + "socket.io-parser": "~4.2.4" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/socket.io-client/node_modules/debug": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/socket.io-parser": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.4.tgz", + "integrity": "sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@socket.io/component-emitter": "~3.1.0", + "debug": "~4.3.1" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/socket.io-parser/node_modules/debug": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, "node_modules/source-map-js": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", @@ -2439,15 +2566,15 @@ } }, "node_modules/tailwindcss": { - "version": "4.1.6", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.1.6.tgz", - "integrity": "sha512-j0cGLTreM6u4OWzBeLBpycK0WIh8w7kSwcUsQZoGLHZ7xDTdM69lN64AgoIEEwFi0tnhs4wSykUa5YWxAzgFYg==", + "version": "4.1.10", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.1.10.tgz", + "integrity": "sha512-P3nr6WkvKV/ONsTzj6Gb57sWPMX29EPNPopo7+FcpkQaNsrNpZ1pv8QmrYI2RqEKD7mlGqLnGovlcYnBK0IqUA==", "license": "MIT" }, "node_modules/tapable": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", - "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.2.tgz", + "integrity": "sha512-Re10+NauLTMCudc7T5WLFLAwDhQ0JWdrMK+9B2M8zR5hRExKmsRDCBA7/aV/pNJFltmBFO5BAMlQFi/vq3nKOg==", "dev": true, "license": "MIT", "engines": { @@ -2602,17 +2729,17 @@ } }, "node_modules/vue": { - "version": "3.5.13", - "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.13.tgz", - "integrity": "sha512-wmeiSMxkZCSc+PM2w2VRsOYAZC8GdipNFRTsLSfodVqI9mbejKeXEGr8SckuLnrQPGe3oJN5c3K0vpoU9q/wCQ==", + "version": "3.5.16", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.16.tgz", + "integrity": "sha512-rjOV2ecxMd5SiAmof2xzh2WxntRcigkX/He4YFJ6WdRvVUrbt6DxC1Iujh10XLl8xCDRDtGKMeO3D+pRQ1PP9w==", "dev": true, "license": "MIT", "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" + "@vue/compiler-dom": "3.5.16", + "@vue/compiler-sfc": "3.5.16", + "@vue/runtime-dom": "3.5.16", + "@vue/server-renderer": "3.5.16", + "@vue/shared": "3.5.16" }, "peerDependencies": { "typescript": "*" @@ -2623,6 +2750,39 @@ } } }, + "node_modules/ws": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz", + "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==", + "dev": true, + "license": "MIT", + "peer": true, + "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/xmlhttprequest-ssl": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-2.1.2.tgz", + "integrity": "sha512-TEU+nJVUUnA4CYJFLvK5X9AOeH4KvDvhIfm0vV1GaQRtchnG0hgK5p8hw/xjv8cunWYCsiPCSDzObPyhEwq3KQ==", + "dev": true, + "peer": true, + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/yallist": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz", diff --git a/package.json b/package.json index 7e1a85c70..10ec71415 100644 --- a/package.json +++ b/package.json @@ -7,23 +7,23 @@ "build": "vite build" }, "devDependencies": { - "@tailwindcss/postcss": "^4.1.4", - "@vitejs/plugin-vue": "5.2.3", - "axios": "1.8.4", - "laravel-echo": "2.0.2", - "laravel-vite-plugin": "^1.2.0", - "postcss": "8.5.3", + "@tailwindcss/postcss": "4.1.10", + "@vitejs/plugin-vue": "5.2.4", + "axios": "1.9.0", + "laravel-echo": "2.1.5", + "laravel-vite-plugin": "1.3.0", + "postcss": "8.5.5", "pusher-js": "8.4.0", - "tailwind-scrollbar": "^4.0.2", - "tailwindcss": "^4.1.4", - "vite": "^6.2.6", - "vue": "3.5.13" + "tailwind-scrollbar": "4.0.2", + "tailwindcss": "4.1.10", + "vite": "6.3.5", + "vue": "3.5.16" }, "dependencies": { "@tailwindcss/forms": "0.5.10", "@tailwindcss/typography": "0.5.16", - "@xterm/addon-fit": "^0.10.0", - "@xterm/xterm": "^5.5.0", - "ioredis": "5.6.0" + "@xterm/addon-fit": "0.10.0", + "@xterm/xterm": "5.5.0", + "ioredis": "5.6.1" } -} +} \ No newline at end of file From ac66e857c9b3b3535c680d87af4c7696afe50dd5 Mon Sep 17 00:00:00 2001 From: Andras Bacsai <5845193+andrasbacsai@users.noreply.github.com> Date: Fri, 13 Jun 2025 15:25:45 +0200 Subject: [PATCH 0128/1232] fix(service): update service template for affine and add migration service for improved deployment process --- templates/compose/affine.yaml | 23 ++++++++++++++++++----- templates/service-templates.json | 2 +- 2 files changed, 19 insertions(+), 6 deletions(-) diff --git a/templates/compose/affine.yaml b/templates/compose/affine.yaml index 0bac71e63..bde23429b 100644 --- a/templates/compose/affine.yaml +++ b/templates/compose/affine.yaml @@ -7,10 +7,6 @@ services: affine: image: ghcr.io/toeverything/affine-graphql:stable - command: - - sh - - '-c' - - 'node ./scripts/self-host-predeploy && node ./dist/index.js' depends_on: redis: condition: service_healthy @@ -25,7 +21,6 @@ services: max-size: 1000m environment: - SERVICE_FQDN_AFFINE_3010 - - NODE_OPTIONS=--import=./scripts/register.js - AFFINE_CONFIG_PATH=/root/.affine/config - REDIS_SERVER_HOST=redis - DATABASE_URL=postgres://${SERVICE_USER_POSTGRES}:${SERVICE_PASSWORD_POSTGRES}@postgres:5432/${POSTGRES_DB:-affine} @@ -46,6 +41,24 @@ services: timeout: 20s retries: 3 + affine_migration: + exclude_from_hc: true + image: ghcr.io/toeverything/affine-graphql:${AFFINE_REVISION:-stable} + restart: on-failure + volumes: + - affine-storage:/root/.affine/storage + - affine-config:/root/.affine/config + command: ['sh', '-c', 'node ./scripts/self-host-predeploy.js'] + environment: + - REDIS_SERVER_HOST=redis + - DATABASE_URL=postgres://${SERVICE_USER_POSTGRES}:${SERVICE_PASSWORD_POSTGRES}@postgres:5432/${POSTGRES_DB:-affine} + - AFFINE_INDEXER_ENABLED=false + depends_on: + postgres: + condition: service_healthy + redis: + condition: service_healthy + redis: image: redis volumes: diff --git a/templates/service-templates.json b/templates/service-templates.json index b372b6bcf..9ffe9c10f 100644 --- a/templates/service-templates.json +++ b/templates/service-templates.json @@ -33,7 +33,7 @@ "affine": { "documentation": "https://docs.affine.pro/docs/self-host-affine?utm_source=coolify.io", "slogan": "Affine is an open-source, all-in-one workspace and OS for knowledge management, a Notion/Miro alternative.", - "compose": "c2VydmljZXM6CiAgYWZmaW5lOgogICAgaW1hZ2U6ICdnaGNyLmlvL3RvZXZlcnl0aGluZy9hZmZpbmUtZ3JhcGhxbDpzdGFibGUnCiAgICBjb21tYW5kOgogICAgICAtIHNoCiAgICAgIC0gJy1jJwogICAgICAtICdub2RlIC4vc2NyaXB0cy9zZWxmLWhvc3QtcHJlZGVwbG95ICYmIG5vZGUgLi9kaXN0L2luZGV4LmpzJwogICAgZGVwZW5kc19vbjoKICAgICAgcmVkaXM6CiAgICAgICAgY29uZGl0aW9uOiBzZXJ2aWNlX2hlYWx0aHkKICAgICAgcG9zdGdyZXM6CiAgICAgICAgY29uZGl0aW9uOiBzZXJ2aWNlX2hlYWx0aHkKICAgIHZvbHVtZXM6CiAgICAgIC0gJ2FmZmluZS1jb25maWc6L3Jvb3QvLmFmZmluZS9jb25maWcnCiAgICAgIC0gJ2FmZmluZS1zdG9yYWdlOi9yb290Ly5hZmZpbmUvc3RvcmFnZScKICAgIGxvZ2dpbmc6CiAgICAgIGRyaXZlcjoganNvbi1maWxlCiAgICAgIG9wdGlvbnM6CiAgICAgICAgbWF4LXNpemU6IDEwMDBtCiAgICBlbnZpcm9ubWVudDoKICAgICAgLSBTRVJWSUNFX0ZRRE5fQUZGSU5FXzMwMTAKICAgICAgLSBOT0RFX09QVElPTlM9LS1pbXBvcnQ9Li9zY3JpcHRzL3JlZ2lzdGVyLmpzCiAgICAgIC0gQUZGSU5FX0NPTkZJR19QQVRIPS9yb290Ly5hZmZpbmUvY29uZmlnCiAgICAgIC0gUkVESVNfU0VSVkVSX0hPU1Q9cmVkaXMKICAgICAgLSAnREFUQUJBU0VfVVJMPXBvc3RncmVzOi8vJHtTRVJWSUNFX1VTRVJfUE9TVEdSRVN9OiR7U0VSVklDRV9QQVNTV09SRF9QT1NUR1JFU31AcG9zdGdyZXM6NTQzMi8ke1BPU1RHUkVTX0RCOi1hZmZpbmV9JwogICAgICAtIE5PREVfRU5WPXByb2R1Y3Rpb24KICAgICAgLSBBRkZJTkVfU0VSVkVSX0hPU1Q9JFNFUlZJQ0VfRlFETl9BRkZJTkUKICAgICAgLSBBRkZJTkVfU0VSVkVSX0VYVEVSTkFMX1VSTD0kU0VSVklDRV9GUUROX0FGRklORQogICAgICAtICdNQUlMRVJfSE9TVD0ke01BSUxFUl9IT1NUfScKICAgICAgLSAnTUFJTEVSX1BPUlQ9JHtNQUlMRVJfUE9SVH0nCiAgICAgIC0gJ01BSUxFUl9VU0VSPSR7TUFJTEVSX1VTRVJ9JwogICAgICAtICdNQUlMRVJfUEFTU1dPUkQ9JHtNQUlMRVJfUEFTU1dPUkR9JwogICAgICAtICdNQUlMRVJfU0VOREVSPSR7TUFJTEVSX1NFTkRFUn0nCiAgICAgIC0gJ0NPUElMT1RfRkFMX0FQSV9LRVk9JHtDT1BJTE9UX0ZBTF9BUElfS0VZfScKICAgICAgLSAnQ09QSUxPVF9QRVJQTEVYSVRZX0FQSV9LRVk9JHtDT1BJTE9UX1BFUlBMRVhJVFlfQVBJX0tFWX0nCiAgICAgIC0gJ0NPUElMT1RfT1BFTkFJX0FQSV9LRVk9JHtDT1BJTE9UX09QRU5BSV9BUElfS0VZfScKICAgIGhlYWx0aGNoZWNrOgogICAgICB0ZXN0OgogICAgICAgIC0gQ01ELVNIRUxMCiAgICAgICAgLSAiYmFzaCAtYyAnOj4gL2Rldi90Y3AvMTI3LjAuMC4xLzMwMTAnIHx8IGV4aXQgMSIKICAgICAgaW50ZXJ2YWw6IDVzCiAgICAgIHRpbWVvdXQ6IDIwcwogICAgICByZXRyaWVzOiAzCiAgcmVkaXM6CiAgICBpbWFnZTogcmVkaXMKICAgIHZvbHVtZXM6CiAgICAgIC0gJ2FmZmluZS1yZWRpcy1kYXRhOi9kYXRhJwogICAgaGVhbHRoY2hlY2s6CiAgICAgIHRlc3Q6CiAgICAgICAgLSBDTUQKICAgICAgICAtIHJlZGlzLWNsaQogICAgICAgIC0gJy0tcmF3JwogICAgICAgIC0gaW5jcgogICAgICAgIC0gcGluZwogICAgICBpbnRlcnZhbDogMTBzCiAgICAgIHRpbWVvdXQ6IDVzCiAgICAgIHJldHJpZXM6IDUKICBwb3N0Z3JlczoKICAgIGltYWdlOiAncG9zdGdyZXM6MTYnCiAgICB2b2x1bWVzOgogICAgICAtICdhZmZpbmUtcG9zdGdyZXMtZGF0YTovdmFyL2xpYi9wb3N0Z3Jlc3FsL2RhdGEnCiAgICBoZWFsdGhjaGVjazoKICAgICAgdGVzdDoKICAgICAgICAtIENNRC1TSEVMTAogICAgICAgIC0gJ3BnX2lzcmVhZHkgLVUgYWZmaW5lJwogICAgICBpbnRlcnZhbDogMTBzCiAgICAgIHRpbWVvdXQ6IDVzCiAgICAgIHJldHJpZXM6IDUKICAgIGVudmlyb25tZW50OgogICAgICAtICdQT1NUR1JFU19VU0VSPSR7U0VSVklDRV9VU0VSX1BPU1RHUkVTfScKICAgICAgLSAnUE9TVEdSRVNfUEFTU1dPUkQ9JHtTRVJWSUNFX1BBU1NXT1JEX1BPU1RHUkVTfScKICAgICAgLSAnUE9TVEdSRVNfREI9JHtQT1NUR1JFU19EQjotYWZmaW5lfScKICAgICAgLSBQR0RBVEE9L3Zhci9saWIvcG9zdGdyZXNxbC9kYXRhL3BnZGF0YQo=", + "compose": "c2VydmljZXM6CiAgYWZmaW5lOgogICAgaW1hZ2U6ICdnaGNyLmlvL3RvZXZlcnl0aGluZy9hZmZpbmUtZ3JhcGhxbDpzdGFibGUnCiAgICBkZXBlbmRzX29uOgogICAgICByZWRpczoKICAgICAgICBjb25kaXRpb246IHNlcnZpY2VfaGVhbHRoeQogICAgICBwb3N0Z3JlczoKICAgICAgICBjb25kaXRpb246IHNlcnZpY2VfaGVhbHRoeQogICAgdm9sdW1lczoKICAgICAgLSAnYWZmaW5lLWNvbmZpZzovcm9vdC8uYWZmaW5lL2NvbmZpZycKICAgICAgLSAnYWZmaW5lLXN0b3JhZ2U6L3Jvb3QvLmFmZmluZS9zdG9yYWdlJwogICAgbG9nZ2luZzoKICAgICAgZHJpdmVyOiBqc29uLWZpbGUKICAgICAgb3B0aW9uczoKICAgICAgICBtYXgtc2l6ZTogMTAwMG0KICAgIGVudmlyb25tZW50OgogICAgICAtIFNFUlZJQ0VfRlFETl9BRkZJTkVfMzAxMAogICAgICAtIEFGRklORV9DT05GSUdfUEFUSD0vcm9vdC8uYWZmaW5lL2NvbmZpZwogICAgICAtIFJFRElTX1NFUlZFUl9IT1NUPXJlZGlzCiAgICAgIC0gJ0RBVEFCQVNFX1VSTD1wb3N0Z3JlczovLyR7U0VSVklDRV9VU0VSX1BPU1RHUkVTfToke1NFUlZJQ0VfUEFTU1dPUkRfUE9TVEdSRVN9QHBvc3RncmVzOjU0MzIvJHtQT1NUR1JFU19EQjotYWZmaW5lfScKICAgICAgLSBOT0RFX0VOVj1wcm9kdWN0aW9uCiAgICAgIC0gQUZGSU5FX1NFUlZFUl9IT1NUPSRTRVJWSUNFX0ZRRE5fQUZGSU5FCiAgICAgIC0gQUZGSU5FX1NFUlZFUl9FWFRFUk5BTF9VUkw9JFNFUlZJQ0VfRlFETl9BRkZJTkUKICAgICAgLSAnTUFJTEVSX0hPU1Q9JHtNQUlMRVJfSE9TVH0nCiAgICAgIC0gJ01BSUxFUl9QT1JUPSR7TUFJTEVSX1BPUlR9JwogICAgICAtICdNQUlMRVJfVVNFUj0ke01BSUxFUl9VU0VSfScKICAgICAgLSAnTUFJTEVSX1BBU1NXT1JEPSR7TUFJTEVSX1BBU1NXT1JEfScKICAgICAgLSAnTUFJTEVSX1NFTkRFUj0ke01BSUxFUl9TRU5ERVJ9JwogICAgICAtICdDT1BJTE9UX0ZBTF9BUElfS0VZPSR7Q09QSUxPVF9GQUxfQVBJX0tFWX0nCiAgICAgIC0gJ0NPUElMT1RfUEVSUExFWElUWV9BUElfS0VZPSR7Q09QSUxPVF9QRVJQTEVYSVRZX0FQSV9LRVl9JwogICAgICAtICdDT1BJTE9UX09QRU5BSV9BUElfS0VZPSR7Q09QSUxPVF9PUEVOQUlfQVBJX0tFWX0nCiAgICBoZWFsdGhjaGVjazoKICAgICAgdGVzdDoKICAgICAgICAtIENNRC1TSEVMTAogICAgICAgIC0gImJhc2ggLWMgJzo+IC9kZXYvdGNwLzEyNy4wLjAuMS8zMDEwJyB8fCBleGl0IDEiCiAgICAgIGludGVydmFsOiA1cwogICAgICB0aW1lb3V0OiAyMHMKICAgICAgcmV0cmllczogMwogIGFmZmluZV9taWdyYXRpb246CiAgICBleGNsdWRlX2Zyb21faGM6IHRydWUKICAgIGltYWdlOiAnZ2hjci5pby90b2V2ZXJ5dGhpbmcvYWZmaW5lLWdyYXBocWw6JHtBRkZJTkVfUkVWSVNJT046LXN0YWJsZX0nCiAgICByZXN0YXJ0OiBvbi1mYWlsdXJlCiAgICB2b2x1bWVzOgogICAgICAtICdhZmZpbmUtc3RvcmFnZTovcm9vdC8uYWZmaW5lL3N0b3JhZ2UnCiAgICAgIC0gJ2FmZmluZS1jb25maWc6L3Jvb3QvLmFmZmluZS9jb25maWcnCiAgICBjb21tYW5kOgogICAgICAtIHNoCiAgICAgIC0gJy1jJwogICAgICAtICdub2RlIC4vc2NyaXB0cy9zZWxmLWhvc3QtcHJlZGVwbG95LmpzJwogICAgZW52aXJvbm1lbnQ6CiAgICAgIC0gUkVESVNfU0VSVkVSX0hPU1Q9cmVkaXMKICAgICAgLSAnREFUQUJBU0VfVVJMPXBvc3RncmVzOi8vJHtTRVJWSUNFX1VTRVJfUE9TVEdSRVN9OiR7U0VSVklDRV9QQVNTV09SRF9QT1NUR1JFU31AcG9zdGdyZXM6NTQzMi8ke1BPU1RHUkVTX0RCOi1hZmZpbmV9JwogICAgICAtIEFGRklORV9JTkRFWEVSX0VOQUJMRUQ9ZmFsc2UKICAgIGRlcGVuZHNfb246CiAgICAgIHBvc3RncmVzOgogICAgICAgIGNvbmRpdGlvbjogc2VydmljZV9oZWFsdGh5CiAgICAgIHJlZGlzOgogICAgICAgIGNvbmRpdGlvbjogc2VydmljZV9oZWFsdGh5CiAgcmVkaXM6CiAgICBpbWFnZTogcmVkaXMKICAgIHZvbHVtZXM6CiAgICAgIC0gJ2FmZmluZS1yZWRpcy1kYXRhOi9kYXRhJwogICAgaGVhbHRoY2hlY2s6CiAgICAgIHRlc3Q6CiAgICAgICAgLSBDTUQKICAgICAgICAtIHJlZGlzLWNsaQogICAgICAgIC0gJy0tcmF3JwogICAgICAgIC0gaW5jcgogICAgICAgIC0gcGluZwogICAgICBpbnRlcnZhbDogMTBzCiAgICAgIHRpbWVvdXQ6IDVzCiAgICAgIHJldHJpZXM6IDUKICBwb3N0Z3JlczoKICAgIGltYWdlOiAncG9zdGdyZXM6MTYnCiAgICB2b2x1bWVzOgogICAgICAtICdhZmZpbmUtcG9zdGdyZXMtZGF0YTovdmFyL2xpYi9wb3N0Z3Jlc3FsL2RhdGEnCiAgICBoZWFsdGhjaGVjazoKICAgICAgdGVzdDoKICAgICAgICAtIENNRC1TSEVMTAogICAgICAgIC0gJ3BnX2lzcmVhZHkgLVUgYWZmaW5lJwogICAgICBpbnRlcnZhbDogMTBzCiAgICAgIHRpbWVvdXQ6IDVzCiAgICAgIHJldHJpZXM6IDUKICAgIGVudmlyb25tZW50OgogICAgICAtICdQT1NUR1JFU19VU0VSPSR7U0VSVklDRV9VU0VSX1BPU1RHUkVTfScKICAgICAgLSAnUE9TVEdSRVNfUEFTU1dPUkQ9JHtTRVJWSUNFX1BBU1NXT1JEX1BPU1RHUkVTfScKICAgICAgLSAnUE9TVEdSRVNfREI9JHtQT1NUR1JFU19EQjotYWZmaW5lfScKICAgICAgLSBQR0RBVEE9L3Zhci9saWIvcG9zdGdyZXNxbC9kYXRhL3BnZGF0YQo=", "tags": [ "knowledge-management", "notion", From 581151bb118d743b0af83aeb958f1df3de48f18a Mon Sep 17 00:00:00 2001 From: Andras Bacsai <5845193+andrasbacsai@users.noreply.github.com> Date: Fri, 13 Jun 2025 16:49:27 +0200 Subject: [PATCH 0129/1232] refactor(resource-operations): filter out build servers from the server list and clean up commented-out code in the resource operations view --- .../Project/Shared/ResourceOperations.php | 2 +- .../shared/resource-operations.blade.php | 71 +++---------------- 2 files changed, 12 insertions(+), 61 deletions(-) diff --git a/app/Livewire/Project/Shared/ResourceOperations.php b/app/Livewire/Project/Shared/ResourceOperations.php index e19f1272d..fb19acb55 100644 --- a/app/Livewire/Project/Shared/ResourceOperations.php +++ b/app/Livewire/Project/Shared/ResourceOperations.php @@ -35,7 +35,7 @@ public function mount() $this->projectUuid = data_get($parameters, 'project_uuid'); $this->environmentUuid = data_get($parameters, 'environment_uuid'); $this->projects = Project::ownedByCurrentTeam()->get(); - $this->servers = currentTeam()->servers; + $this->servers = currentTeam()->servers->filter(fn ($server) => ! $server->isBuildServer()); } public function toggleVolumeCloning(bool $value) diff --git a/resources/views/livewire/project/shared/resource-operations.blade.php b/resources/views/livewire/project/shared/resource-operations.blade.php index 4bbc28c75..f23c6eb4e 100644 --- a/resources/views/livewire/project/shared/resource-operations.blade.php +++ b/resources/views/livewire/project/shared/resource-operations.blade.php @@ -1,38 +1,6 @@

Resource Operations

You can easily make different kind of operations on this resource.
-{{-- -
-

Clone Volume Data

-
- Clone your volume data to the new resources volumes. This process requires a brief container downtime to ensure data consistency. -
-
- @if(!$cloneVolumeData) -
- -
- @else -
- -
- @endif -
-
--}} -

Clone

To another project / environment on a different / same server.
@@ -40,20 +8,12 @@ @foreach ($servers->sortBy('id') as $server)
Server: {{ $server->name }}
@foreach ($server->destinations() as $destination) - +
@@ -80,20 +40,11 @@ class="font-bold dark:text-warning">{{ $resource->environment->project->name }}
Project: {{ $project->name }}
@foreach ($project->environments as $environment) - + dispatchEventMessage="Resource moved to {{ $environment->name }} environment.">
@@ -101,7 +52,7 @@ class="font-bold dark:text-warning">{{ $resource->environment->project->name }}
{{ $environment->name }}
- +
@endforeach @empty From 2cc0133a7aebcc9fdfc33404dc515c2b14c5dc63 Mon Sep 17 00:00:00 2001 From: Andras Bacsai <5845193+andrasbacsai@users.noreply.github.com> Date: Fri, 13 Jun 2025 17:30:03 +0200 Subject: [PATCH 0130/1232] fix(supabase): update Supabase service images and healthcheck methods for improved reliability --- templates/compose/supabase.yaml | 16 ++++++++-------- templates/service-templates.json | 2 +- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/templates/compose/supabase.yaml b/templates/compose/supabase.yaml index 9ec7c1dea..361f4f467 100644 --- a/templates/compose/supabase.yaml +++ b/templates/compose/supabase.yaml @@ -279,14 +279,14 @@ services: config: hide_credentials: true supabase-studio: - image: supabase/studio:20241202-71e5240 + image: supabase/studio:2025.06.02-sha-8f2993d healthcheck: test: [ "CMD", "node", "-e", - "require('http').get('http://127.0.0.1:3000/api/profile', (r) => {if (r.statusCode !== 200) process.exit(1); else process.exit(0); }).on('error', () => process.exit(1))", + "fetch('http://127.0.0.1:3000/api/platform/profile').then((r) => {if (r.status !== 200) throw new Error(r.status)})" ] timeout: 5s interval: 5s @@ -913,7 +913,7 @@ services: command: ["--config", "etc/vector/vector.yml"] supabase-rest: - image: postgrest/postgrest:v12.2.0 + image: postgrest/postgrest:v12.2.12 depends_on: supabase-db: # Disable this if you are using an external Postgres database @@ -931,7 +931,7 @@ services: command: "postgrest" exclude_from_hc: true supabase-auth: - image: supabase/gotrue:v2.164.0 + image: supabase/gotrue:v2.174.0 depends_on: supabase-db: # Disable this if you are using an external Postgres database @@ -1022,7 +1022,7 @@ services: realtime-dev: # This container name looks inconsistent but is correct because realtime constructs tenant id by parsing the subdomain - image: supabase/realtime:v2.33.70 + image: supabase/realtime:v2.34.47 container_name: realtime-dev.supabase-realtime depends_on: supabase-db: @@ -1191,7 +1191,7 @@ services: - ./volumes/storage:/var/lib/storage supabase-meta: - image: supabase/postgres-meta:v0.84.2 + image: supabase/postgres-meta:v0.89.3 depends_on: supabase-db: # Disable this if you are using an external Postgres database @@ -1207,7 +1207,7 @@ services: - PG_META_DB_PASSWORD=${SERVICE_PASSWORD_POSTGRES} supabase-edge-functions: - image: supabase/edge-runtime:v1.65.3 + image: supabase/edge-runtime:v1.67.4 depends_on: supabase-analytics: condition: service_healthy @@ -1351,7 +1351,7 @@ services: - /home/deno/functions/main supabase-supavisor: - image: 'supabase/supavisor:1.1.56' + image: 'supabase/supavisor:2.5.1' healthcheck: test: - CMD diff --git a/templates/service-templates.json b/templates/service-templates.json index 9ffe9c10f..88647063c 100644 --- a/templates/service-templates.json +++ b/templates/service-templates.json @@ -3107,7 +3107,7 @@ "supabase": { "documentation": "https://supabase.io?utm_source=coolify.io", "slogan": "The open source Firebase alternative.", - "compose": "c2VydmljZXM6CiAgc3VwYWJhc2Uta29uZzoKICAgIGltYWdlOiAna29uZzoyLjguMScKICAgIGVudHJ5cG9pbnQ6ICdiYXNoIC1jICcnZXZhbCAiZWNobyBcIiQkKGNhdCB+L3RlbXAueW1sKVwiIiA+IH4va29uZy55bWwgJiYgL2RvY2tlci1lbnRyeXBvaW50LnNoIGtvbmcgZG9ja2VyLXN0YXJ0JycnCiAgICBkZXBlbmRzX29uOgogICAgICBzdXBhYmFzZS1hbmFseXRpY3M6CiAgICAgICAgY29uZGl0aW9uOiBzZXJ2aWNlX2hlYWx0aHkKICAgIGVudmlyb25tZW50OgogICAgICAtIFNFUlZJQ0VfRlFETl9TVVBBQkFTRUtPTkdfODAwMAogICAgICAtICdLT05HX1BPUlRfTUFQUz00NDM6ODAwMCcKICAgICAgLSAnSldUX1NFQ1JFVD0ke1NFUlZJQ0VfUEFTU1dPUkRfSldUfScKICAgICAgLSBLT05HX0RBVEFCQVNFPW9mZgogICAgICAtIEtPTkdfREVDTEFSQVRJVkVfQ09ORklHPS9ob21lL2tvbmcva29uZy55bWwKICAgICAgLSAnS09OR19ETlNfT1JERVI9TEFTVCxBLENOQU1FJwogICAgICAtICdLT05HX1BMVUdJTlM9cmVxdWVzdC10cmFuc2Zvcm1lcixjb3JzLGtleS1hdXRoLGFjbCxiYXNpYy1hdXRoJwogICAgICAtIEtPTkdfTkdJTlhfUFJPWFlfUFJPWFlfQlVGRkVSX1NJWkU9MTYwawogICAgICAtICdLT05HX05HSU5YX1BST1hZX1BST1hZX0JVRkZFUlM9NjQgMTYwaycKICAgICAgLSAnU1VQQUJBU0VfQU5PTl9LRVk9JHtTRVJWSUNFX1NVUEFCQVNFQU5PTl9LRVl9JwogICAgICAtICdTVVBBQkFTRV9TRVJWSUNFX0tFWT0ke1NFUlZJQ0VfU1VQQUJBU0VTRVJWSUNFX0tFWX0nCiAgICAgIC0gJ0RBU0hCT0FSRF9VU0VSTkFNRT0ke1NFUlZJQ0VfVVNFUl9BRE1JTn0nCiAgICAgIC0gJ0RBU0hCT0FSRF9QQVNTV09SRD0ke1NFUlZJQ0VfUEFTU1dPUkRfQURNSU59JwogICAgdm9sdW1lczoKICAgICAgLQogICAgICAgIHR5cGU6IGJpbmQKICAgICAgICBzb3VyY2U6IC4vdm9sdW1lcy9hcGkva29uZy55bWwKICAgICAgICB0YXJnZXQ6IC9ob21lL2tvbmcvdGVtcC55bWwKICAgICAgICBjb250ZW50OiAiX2Zvcm1hdF92ZXJzaW9uOiAnMi4xJ1xuX3RyYW5zZm9ybTogdHJ1ZVxuXG4jIyNcbiMjIyBDb25zdW1lcnMgLyBVc2Vyc1xuIyMjXG5jb25zdW1lcnM6XG4gIC0gdXNlcm5hbWU6IERBU0hCT0FSRFxuICAtIHVzZXJuYW1lOiBhbm9uXG4gICAga2V5YXV0aF9jcmVkZW50aWFsczpcbiAgICAgIC0ga2V5OiAkU1VQQUJBU0VfQU5PTl9LRVlcbiAgLSB1c2VybmFtZTogc2VydmljZV9yb2xlXG4gICAga2V5YXV0aF9jcmVkZW50aWFsczpcbiAgICAgIC0ga2V5OiAkU1VQQUJBU0VfU0VSVklDRV9LRVlcblxuIyMjXG4jIyMgQWNjZXNzIENvbnRyb2wgTGlzdFxuIyMjXG5hY2xzOlxuICAtIGNvbnN1bWVyOiBhbm9uXG4gICAgZ3JvdXA6IGFub25cbiAgLSBjb25zdW1lcjogc2VydmljZV9yb2xlXG4gICAgZ3JvdXA6IGFkbWluXG5cbiMjI1xuIyMjIERhc2hib2FyZCBjcmVkZW50aWFsc1xuIyMjXG5iYXNpY2F1dGhfY3JlZGVudGlhbHM6XG4tIGNvbnN1bWVyOiBEQVNIQk9BUkRcbiAgdXNlcm5hbWU6ICREQVNIQk9BUkRfVVNFUk5BTUVcbiAgcGFzc3dvcmQ6ICREQVNIQk9BUkRfUEFTU1dPUkRcblxuXG4jIyNcbiMjIyBBUEkgUm91dGVzXG4jIyNcbnNlcnZpY2VzOlxuXG4gICMjIE9wZW4gQXV0aCByb3V0ZXNcbiAgLSBuYW1lOiBhdXRoLXYxLW9wZW5cbiAgICB1cmw6IGh0dHA6Ly9zdXBhYmFzZS1hdXRoOjk5OTkvdmVyaWZ5XG4gICAgcm91dGVzOlxuICAgICAgLSBuYW1lOiBhdXRoLXYxLW9wZW5cbiAgICAgICAgc3RyaXBfcGF0aDogdHJ1ZVxuICAgICAgICBwYXRoczpcbiAgICAgICAgICAtIC9hdXRoL3YxL3ZlcmlmeVxuICAgIHBsdWdpbnM6XG4gICAgICAtIG5hbWU6IGNvcnNcbiAgLSBuYW1lOiBhdXRoLXYxLW9wZW4tY2FsbGJhY2tcbiAgICB1cmw6IGh0dHA6Ly9zdXBhYmFzZS1hdXRoOjk5OTkvY2FsbGJhY2tcbiAgICByb3V0ZXM6XG4gICAgICAtIG5hbWU6IGF1dGgtdjEtb3Blbi1jYWxsYmFja1xuICAgICAgICBzdHJpcF9wYXRoOiB0cnVlXG4gICAgICAgIHBhdGhzOlxuICAgICAgICAgIC0gL2F1dGgvdjEvY2FsbGJhY2tcbiAgICBwbHVnaW5zOlxuICAgICAgLSBuYW1lOiBjb3JzXG4gIC0gbmFtZTogYXV0aC12MS1vcGVuLWF1dGhvcml6ZVxuICAgIHVybDogaHR0cDovL3N1cGFiYXNlLWF1dGg6OTk5OS9hdXRob3JpemVcbiAgICByb3V0ZXM6XG4gICAgICAtIG5hbWU6IGF1dGgtdjEtb3Blbi1hdXRob3JpemVcbiAgICAgICAgc3RyaXBfcGF0aDogdHJ1ZVxuICAgICAgICBwYXRoczpcbiAgICAgICAgICAtIC9hdXRoL3YxL2F1dGhvcml6ZVxuICAgIHBsdWdpbnM6XG4gICAgICAtIG5hbWU6IGNvcnNcblxuICAjIyBTZWN1cmUgQXV0aCByb3V0ZXNcbiAgLSBuYW1lOiBhdXRoLXYxXG4gICAgX2NvbW1lbnQ6ICdHb1RydWU6IC9hdXRoL3YxLyogLT4gaHR0cDovL3N1cGFiYXNlLWF1dGg6OTk5OS8qJ1xuICAgIHVybDogaHR0cDovL3N1cGFiYXNlLWF1dGg6OTk5OS9cbiAgICByb3V0ZXM6XG4gICAgICAtIG5hbWU6IGF1dGgtdjEtYWxsXG4gICAgICAgIHN0cmlwX3BhdGg6IHRydWVcbiAgICAgICAgcGF0aHM6XG4gICAgICAgICAgLSAvYXV0aC92MS9cbiAgICBwbHVnaW5zOlxuICAgICAgLSBuYW1lOiBjb3JzXG4gICAgICAtIG5hbWU6IGtleS1hdXRoXG4gICAgICAgIGNvbmZpZzpcbiAgICAgICAgICBoaWRlX2NyZWRlbnRpYWxzOiBmYWxzZVxuICAgICAgLSBuYW1lOiBhY2xcbiAgICAgICAgY29uZmlnOlxuICAgICAgICAgIGhpZGVfZ3JvdXBzX2hlYWRlcjogdHJ1ZVxuICAgICAgICAgIGFsbG93OlxuICAgICAgICAgICAgLSBhZG1pblxuICAgICAgICAgICAgLSBhbm9uXG5cbiAgIyMgU2VjdXJlIFJFU1Qgcm91dGVzXG4gIC0gbmFtZTogcmVzdC12MVxuICAgIF9jb21tZW50OiAnUG9zdGdSRVNUOiAvcmVzdC92MS8qIC0+IGh0dHA6Ly9zdXBhYmFzZS1yZXN0OjMwMDAvKidcbiAgICB1cmw6IGh0dHA6Ly9zdXBhYmFzZS1yZXN0OjMwMDAvXG4gICAgcm91dGVzOlxuICAgICAgLSBuYW1lOiByZXN0LXYxLWFsbFxuICAgICAgICBzdHJpcF9wYXRoOiB0cnVlXG4gICAgICAgIHBhdGhzOlxuICAgICAgICAgIC0gL3Jlc3QvdjEvXG4gICAgcGx1Z2luczpcbiAgICAgIC0gbmFtZTogY29yc1xuICAgICAgLSBuYW1lOiBrZXktYXV0aFxuICAgICAgICBjb25maWc6XG4gICAgICAgICAgaGlkZV9jcmVkZW50aWFsczogdHJ1ZVxuICAgICAgLSBuYW1lOiBhY2xcbiAgICAgICAgY29uZmlnOlxuICAgICAgICAgIGhpZGVfZ3JvdXBzX2hlYWRlcjogdHJ1ZVxuICAgICAgICAgIGFsbG93OlxuICAgICAgICAgICAgLSBhZG1pblxuICAgICAgICAgICAgLSBhbm9uXG5cbiAgIyMgU2VjdXJlIEdyYXBoUUwgcm91dGVzXG4gIC0gbmFtZTogZ3JhcGhxbC12MVxuICAgIF9jb21tZW50OiAnUG9zdGdSRVNUOiAvZ3JhcGhxbC92MS8qIC0+IGh0dHA6Ly9zdXBhYmFzZS1yZXN0OjMwMDAvcnBjL2dyYXBocWwnXG4gICAgdXJsOiBodHRwOi8vc3VwYWJhc2UtcmVzdDozMDAwL3JwYy9ncmFwaHFsXG4gICAgcm91dGVzOlxuICAgICAgLSBuYW1lOiBncmFwaHFsLXYxLWFsbFxuICAgICAgICBzdHJpcF9wYXRoOiB0cnVlXG4gICAgICAgIHBhdGhzOlxuICAgICAgICAgIC0gL2dyYXBocWwvdjFcbiAgICBwbHVnaW5zOlxuICAgICAgLSBuYW1lOiBjb3JzXG4gICAgICAtIG5hbWU6IGtleS1hdXRoXG4gICAgICAgIGNvbmZpZzpcbiAgICAgICAgICBoaWRlX2NyZWRlbnRpYWxzOiB0cnVlXG4gICAgICAtIG5hbWU6IHJlcXVlc3QtdHJhbnNmb3JtZXJcbiAgICAgICAgY29uZmlnOlxuICAgICAgICAgIGFkZDpcbiAgICAgICAgICAgIGhlYWRlcnM6XG4gICAgICAgICAgICAgIC0gQ29udGVudC1Qcm9maWxlOmdyYXBocWxfcHVibGljXG4gICAgICAtIG5hbWU6IGFjbFxuICAgICAgICBjb25maWc6XG4gICAgICAgICAgaGlkZV9ncm91cHNfaGVhZGVyOiB0cnVlXG4gICAgICAgICAgYWxsb3c6XG4gICAgICAgICAgICAtIGFkbWluXG4gICAgICAgICAgICAtIGFub25cblxuICAjIyBTZWN1cmUgUmVhbHRpbWUgcm91dGVzXG4gIC0gbmFtZTogcmVhbHRpbWUtdjEtd3NcbiAgICBfY29tbWVudDogJ1JlYWx0aW1lOiAvcmVhbHRpbWUvdjEvKiAtPiB3czovL3JlYWx0aW1lOjQwMDAvc29ja2V0LyonXG4gICAgdXJsOiBodHRwOi8vcmVhbHRpbWUtZGV2OjQwMDAvc29ja2V0XG4gICAgcHJvdG9jb2w6IHdzXG4gICAgcm91dGVzOlxuICAgICAgLSBuYW1lOiByZWFsdGltZS12MS13c1xuICAgICAgICBzdHJpcF9wYXRoOiB0cnVlXG4gICAgICAgIHBhdGhzOlxuICAgICAgICAgIC0gL3JlYWx0aW1lL3YxL1xuICAgIHBsdWdpbnM6XG4gICAgICAtIG5hbWU6IGNvcnNcbiAgICAgIC0gbmFtZToga2V5LWF1dGhcbiAgICAgICAgY29uZmlnOlxuICAgICAgICAgIGhpZGVfY3JlZGVudGlhbHM6IGZhbHNlXG4gICAgICAtIG5hbWU6IGFjbFxuICAgICAgICBjb25maWc6XG4gICAgICAgICAgaGlkZV9ncm91cHNfaGVhZGVyOiB0cnVlXG4gICAgICAgICAgYWxsb3c6XG4gICAgICAgICAgICAtIGFkbWluXG4gICAgICAgICAgICAtIGFub25cbiAgLSBuYW1lOiByZWFsdGltZS12MS1yZXN0XG4gICAgX2NvbW1lbnQ6ICdSZWFsdGltZTogL3JlYWx0aW1lL3YxLyogLT4gd3M6Ly9yZWFsdGltZTo0MDAwL3NvY2tldC8qJ1xuICAgIHVybDogaHR0cDovL3JlYWx0aW1lLWRldjo0MDAwL2FwaVxuICAgIHByb3RvY29sOiBodHRwXG4gICAgcm91dGVzOlxuICAgICAgLSBuYW1lOiByZWFsdGltZS12MS1yZXN0XG4gICAgICAgIHN0cmlwX3BhdGg6IHRydWVcbiAgICAgICAgcGF0aHM6XG4gICAgICAgICAgLSAvcmVhbHRpbWUvdjEvYXBpXG4gICAgcGx1Z2luczpcbiAgICAgIC0gbmFtZTogY29yc1xuICAgICAgLSBuYW1lOiBrZXktYXV0aFxuICAgICAgICBjb25maWc6XG4gICAgICAgICAgaGlkZV9jcmVkZW50aWFsczogZmFsc2VcbiAgICAgIC0gbmFtZTogYWNsXG4gICAgICAgIGNvbmZpZzpcbiAgICAgICAgICBoaWRlX2dyb3Vwc19oZWFkZXI6IHRydWVcbiAgICAgICAgICBhbGxvdzpcbiAgICAgICAgICAgIC0gYWRtaW5cbiAgICAgICAgICAgIC0gYW5vblxuXG4gICMjIFN0b3JhZ2Ugcm91dGVzOiB0aGUgc3RvcmFnZSBzZXJ2ZXIgbWFuYWdlcyBpdHMgb3duIGF1dGhcbiAgLSBuYW1lOiBzdG9yYWdlLXYxXG4gICAgX2NvbW1lbnQ6ICdTdG9yYWdlOiAvc3RvcmFnZS92MS8qIC0+IGh0dHA6Ly9zdXBhYmFzZS1zdG9yYWdlOjUwMDAvKidcbiAgICB1cmw6IGh0dHA6Ly9zdXBhYmFzZS1zdG9yYWdlOjUwMDAvXG4gICAgcm91dGVzOlxuICAgICAgLSBuYW1lOiBzdG9yYWdlLXYxLWFsbFxuICAgICAgICBzdHJpcF9wYXRoOiB0cnVlXG4gICAgICAgIHBhdGhzOlxuICAgICAgICAgIC0gL3N0b3JhZ2UvdjEvXG4gICAgcGx1Z2luczpcbiAgICAgIC0gbmFtZTogY29yc1xuXG4gICMjIEVkZ2UgRnVuY3Rpb25zIHJvdXRlc1xuICAtIG5hbWU6IGZ1bmN0aW9ucy12MVxuICAgIF9jb21tZW50OiAnRWRnZSBGdW5jdGlvbnM6IC9mdW5jdGlvbnMvdjEvKiAtPiBodHRwOi8vc3VwYWJhc2UtZWRnZS1mdW5jdGlvbnM6OTAwMC8qJ1xuICAgIHVybDogaHR0cDovL3N1cGFiYXNlLWVkZ2UtZnVuY3Rpb25zOjkwMDAvXG4gICAgcm91dGVzOlxuICAgICAgLSBuYW1lOiBmdW5jdGlvbnMtdjEtYWxsXG4gICAgICAgIHN0cmlwX3BhdGg6IHRydWVcbiAgICAgICAgcGF0aHM6XG4gICAgICAgICAgLSAvZnVuY3Rpb25zL3YxL1xuICAgIHBsdWdpbnM6XG4gICAgICAtIG5hbWU6IGNvcnNcblxuICAjIyBBbmFseXRpY3Mgcm91dGVzXG4gIC0gbmFtZTogYW5hbHl0aWNzLXYxXG4gICAgX2NvbW1lbnQ6ICdBbmFseXRpY3M6IC9hbmFseXRpY3MvdjEvKiAtPiBodHRwOi8vbG9nZmxhcmU6NDAwMC8qJ1xuICAgIHVybDogaHR0cDovL3N1cGFiYXNlLWFuYWx5dGljczo0MDAwL1xuICAgIHJvdXRlczpcbiAgICAgIC0gbmFtZTogYW5hbHl0aWNzLXYxLWFsbFxuICAgICAgICBzdHJpcF9wYXRoOiB0cnVlXG4gICAgICAgIHBhdGhzOlxuICAgICAgICAgIC0gL2FuYWx5dGljcy92MS9cblxuICAjIyBTZWN1cmUgRGF0YWJhc2Ugcm91dGVzXG4gIC0gbmFtZTogbWV0YVxuICAgIF9jb21tZW50OiAncGctbWV0YTogL3BnLyogLT4gaHR0cDovL3N1cGFiYXNlLW1ldGE6ODA4MC8qJ1xuICAgIHVybDogaHR0cDovL3N1cGFiYXNlLW1ldGE6ODA4MC9cbiAgICByb3V0ZXM6XG4gICAgICAtIG5hbWU6IG1ldGEtYWxsXG4gICAgICAgIHN0cmlwX3BhdGg6IHRydWVcbiAgICAgICAgcGF0aHM6XG4gICAgICAgICAgLSAvcGcvXG4gICAgcGx1Z2luczpcbiAgICAgIC0gbmFtZToga2V5LWF1dGhcbiAgICAgICAgY29uZmlnOlxuICAgICAgICAgIGhpZGVfY3JlZGVudGlhbHM6IGZhbHNlXG4gICAgICAtIG5hbWU6IGFjbFxuICAgICAgICBjb25maWc6XG4gICAgICAgICAgaGlkZV9ncm91cHNfaGVhZGVyOiB0cnVlXG4gICAgICAgICAgYWxsb3c6XG4gICAgICAgICAgICAtIGFkbWluXG5cbiAgIyMgUHJvdGVjdGVkIERhc2hib2FyZCAtIGNhdGNoIGFsbCByZW1haW5pbmcgcm91dGVzXG4gIC0gbmFtZTogZGFzaGJvYXJkXG4gICAgX2NvbW1lbnQ6ICdTdHVkaW86IC8qIC0+IGh0dHA6Ly9zdHVkaW86MzAwMC8qJ1xuICAgIHVybDogaHR0cDovL3N1cGFiYXNlLXN0dWRpbzozMDAwL1xuICAgIHJvdXRlczpcbiAgICAgIC0gbmFtZTogZGFzaGJvYXJkLWFsbFxuICAgICAgICBzdHJpcF9wYXRoOiB0cnVlXG4gICAgICAgIHBhdGhzOlxuICAgICAgICAgIC0gL1xuICAgIHBsdWdpbnM6XG4gICAgICAtIG5hbWU6IGNvcnNcbiAgICAgIC0gbmFtZTogYmFzaWMtYXV0aFxuICAgICAgICBjb25maWc6XG4gICAgICAgICAgaGlkZV9jcmVkZW50aWFsczogdHJ1ZVxuIgogIHN1cGFiYXNlLXN0dWRpbzoKICAgIGltYWdlOiAnc3VwYWJhc2Uvc3R1ZGlvOjIwMjQxMjAyLTcxZTUyNDAnCiAgICBoZWFsdGhjaGVjazoKICAgICAgdGVzdDoKICAgICAgICAtIENNRAogICAgICAgIC0gbm9kZQogICAgICAgIC0gJy1lJwogICAgICAgIC0gInJlcXVpcmUoJ2h0dHAnKS5nZXQoJ2h0dHA6Ly8xMjcuMC4wLjE6MzAwMC9hcGkvcHJvZmlsZScsIChyKSA9PiB7aWYgKHIuc3RhdHVzQ29kZSAhPT0gMjAwKSBwcm9jZXNzLmV4aXQoMSk7IGVsc2UgcHJvY2Vzcy5leGl0KDApOyB9KS5vbignZXJyb3InLCAoKSA9PiBwcm9jZXNzLmV4aXQoMSkpIgogICAgICB0aW1lb3V0OiA1cwogICAgICBpbnRlcnZhbDogNXMKICAgICAgcmV0cmllczogMwogICAgZGVwZW5kc19vbjoKICAgICAgc3VwYWJhc2UtYW5hbHl0aWNzOgogICAgICAgIGNvbmRpdGlvbjogc2VydmljZV9oZWFsdGh5CiAgICBlbnZpcm9ubWVudDoKICAgICAgLSBIT1NUTkFNRT0wLjAuMC4wCiAgICAgIC0gJ1NUVURJT19QR19NRVRBX1VSTD1odHRwOi8vc3VwYWJhc2UtbWV0YTo4MDgwJwogICAgICAtICdQT1NUR1JFU19QQVNTV09SRD0ke1NFUlZJQ0VfUEFTU1dPUkRfUE9TVEdSRVN9JwogICAgICAtICdERUZBVUxUX09SR0FOSVpBVElPTl9OQU1FPSR7U1RVRElPX0RFRkFVTFRfT1JHQU5JWkFUSU9OOi1EZWZhdWx0IE9yZ2FuaXphdGlvbn0nCiAgICAgIC0gJ0RFRkFVTFRfUFJPSkVDVF9OQU1FPSR7U1RVRElPX0RFRkFVTFRfUFJPSkVDVDotRGVmYXVsdCBQcm9qZWN0fScKICAgICAgLSAnU1VQQUJBU0VfVVJMPWh0dHA6Ly9zdXBhYmFzZS1rb25nOjgwMDAnCiAgICAgIC0gJ1NVUEFCQVNFX1BVQkxJQ19VUkw9JHtTRVJWSUNFX0ZRRE5fU1VQQUJBU0VLT05HfScKICAgICAgLSAnU1VQQUJBU0VfQU5PTl9LRVk9JHtTRVJWSUNFX1NVUEFCQVNFQU5PTl9LRVl9JwogICAgICAtICdTVVBBQkFTRV9TRVJWSUNFX0tFWT0ke1NFUlZJQ0VfU1VQQUJBU0VTRVJWSUNFX0tFWX0nCiAgICAgIC0gJ0FVVEhfSldUX1NFQ1JFVD0ke1NFUlZJQ0VfUEFTU1dPUkRfSldUfScKICAgICAgLSAnTE9HRkxBUkVfQVBJX0tFWT0ke1NFUlZJQ0VfUEFTU1dPUkRfTE9HRkxBUkV9JwogICAgICAtICdMT0dGTEFSRV9VUkw9aHR0cDovL3N1cGFiYXNlLWFuYWx5dGljczo0MDAwJwogICAgICAtICdTVVBBQkFTRV9QVUJMSUNfQVBJPSR7U0VSVklDRV9GUUROX1NVUEFCQVNFS09OR30nCiAgICAgIC0gTkVYVF9QVUJMSUNfRU5BQkxFX0xPR1M9dHJ1ZQogICAgICAtIE5FWFRfQU5BTFlUSUNTX0JBQ0tFTkRfUFJPVklERVI9cG9zdGdyZXMKICAgICAgLSAnT1BFTkFJX0FQSV9LRVk9JHtPUEVOQUlfQVBJX0tFWX0nCiAgc3VwYWJhc2UtZGI6CiAgICBpbWFnZTogJ3N1cGFiYXNlL3Bvc3RncmVzOjE1LjguMS4wNDgnCiAgICBoZWFsdGhjaGVjazoKICAgICAgdGVzdDogJ3BnX2lzcmVhZHkgLVUgcG9zdGdyZXMgLWggMTI3LjAuMC4xJwogICAgICBpbnRlcnZhbDogNXMKICAgICAgdGltZW91dDogNXMKICAgICAgcmV0cmllczogMTAKICAgIGRlcGVuZHNfb246CiAgICAgIHN1cGFiYXNlLXZlY3RvcjoKICAgICAgICBjb25kaXRpb246IHNlcnZpY2VfaGVhbHRoeQogICAgY29tbWFuZDoKICAgICAgLSBwb3N0Z3JlcwogICAgICAtICctYycKICAgICAgLSBjb25maWdfZmlsZT0vZXRjL3Bvc3RncmVzcWwvcG9zdGdyZXNxbC5jb25mCiAgICAgIC0gJy1jJwogICAgICAtIGxvZ19taW5fbWVzc2FnZXM9ZmF0YWwKICAgIGVudmlyb25tZW50OgogICAgICAtIFBPU1RHUkVTX0hPU1Q9L3Zhci9ydW4vcG9zdGdyZXNxbAogICAgICAtICdQR1BPUlQ9JHtQT1NUR1JFU19QT1JUOi01NDMyfScKICAgICAgLSAnUE9TVEdSRVNfUE9SVD0ke1BPU1RHUkVTX1BPUlQ6LTU0MzJ9JwogICAgICAtICdQR1BBU1NXT1JEPSR7U0VSVklDRV9QQVNTV09SRF9QT1NUR1JFU30nCiAgICAgIC0gJ1BPU1RHUkVTX1BBU1NXT1JEPSR7U0VSVklDRV9QQVNTV09SRF9QT1NUR1JFU30nCiAgICAgIC0gJ1BHREFUQUJBU0U9JHtQT1NUR1JFU19EQjotcG9zdGdyZXN9JwogICAgICAtICdQT1NUR1JFU19EQj0ke1BPU1RHUkVTX0RCOi1wb3N0Z3Jlc30nCiAgICAgIC0gJ0pXVF9TRUNSRVQ9JHtTRVJWSUNFX1BBU1NXT1JEX0pXVH0nCiAgICAgIC0gJ0pXVF9FWFA9JHtKV1RfRVhQSVJZOi0zNjAwfScKICAgIHZvbHVtZXM6CiAgICAgIC0gJ3N1cGFiYXNlLWRiLWRhdGE6L3Zhci9saWIvcG9zdGdyZXNxbC9kYXRhJwogICAgICAtCiAgICAgICAgdHlwZTogYmluZAogICAgICAgIHNvdXJjZTogLi92b2x1bWVzL2RiL3JlYWx0aW1lLnNxbAogICAgICAgIHRhcmdldDogL2RvY2tlci1lbnRyeXBvaW50LWluaXRkYi5kL21pZ3JhdGlvbnMvOTktcmVhbHRpbWUuc3FsCiAgICAgICAgY29udGVudDogIlxcc2V0IHBndXNlciBgZWNobyBcInN1cGFiYXNlX2FkbWluXCJgXG5cbmNyZWF0ZSBzY2hlbWEgaWYgbm90IGV4aXN0cyBfcmVhbHRpbWU7XG5hbHRlciBzY2hlbWEgX3JlYWx0aW1lIG93bmVyIHRvIDpwZ3VzZXI7XG4iCiAgICAgIC0KICAgICAgICB0eXBlOiBiaW5kCiAgICAgICAgc291cmNlOiAuL3ZvbHVtZXMvZGIvX3N1cGFiYXNlLnNxbAogICAgICAgIHRhcmdldDogL2RvY2tlci1lbnRyeXBvaW50LWluaXRkYi5kL21pZ3JhdGlvbnMvOTctX3N1cGFiYXNlLnNxbAogICAgICAgIGNvbnRlbnQ6ICJcXHNldCBwZ3VzZXIgYGVjaG8gXCIkUE9TVEdSRVNfVVNFUlwiYFxuXG5DUkVBVEUgREFUQUJBU0UgX3N1cGFiYXNlIFdJVEggT1dORVIgOnBndXNlcjtcbiIKICAgICAgLQogICAgICAgIHR5cGU6IGJpbmQKICAgICAgICBzb3VyY2U6IC4vdm9sdW1lcy9kYi9wb29sZXIuc3FsCiAgICAgICAgdGFyZ2V0OiAvZG9ja2VyLWVudHJ5cG9pbnQtaW5pdGRiLmQvbWlncmF0aW9ucy85OS1wb29sZXIuc3FsCiAgICAgICAgY29udGVudDogIlxcc2V0IHBndXNlciBgZWNobyBcInN1cGFiYXNlX2FkbWluXCJgXG5cXGMgX3N1cGFiYXNlXG5jcmVhdGUgc2NoZW1hIGlmIG5vdCBleGlzdHMgX3N1cGF2aXNvcjtcbmFsdGVyIHNjaGVtYSBfc3VwYXZpc29yIG93bmVyIHRvIDpwZ3VzZXI7XG5cXGMgcG9zdGdyZXNcbiIKICAgICAgLQogICAgICAgIHR5cGU6IGJpbmQKICAgICAgICBzb3VyY2U6IC4vdm9sdW1lcy9kYi93ZWJob29rcy5zcWwKICAgICAgICB0YXJnZXQ6IC9kb2NrZXItZW50cnlwb2ludC1pbml0ZGIuZC9pbml0LXNjcmlwdHMvOTgtd2ViaG9va3Muc3FsCiAgICAgICAgY29udGVudDogIkJFR0lOO1xuLS0gQ3JlYXRlIHBnX25ldCBleHRlbnNpb25cbkNSRUFURSBFWFRFTlNJT04gSUYgTk9UIEVYSVNUUyBwZ19uZXQgU0NIRU1BIGV4dGVuc2lvbnM7XG4tLSBDcmVhdGUgc3VwYWJhc2VfZnVuY3Rpb25zIHNjaGVtYVxuQ1JFQVRFIFNDSEVNQSBzdXBhYmFzZV9mdW5jdGlvbnMgQVVUSE9SSVpBVElPTiBzdXBhYmFzZV9hZG1pbjtcbkdSQU5UIFVTQUdFIE9OIFNDSEVNQSBzdXBhYmFzZV9mdW5jdGlvbnMgVE8gcG9zdGdyZXMsIGFub24sIGF1dGhlbnRpY2F0ZWQsIHNlcnZpY2Vfcm9sZTtcbkFMVEVSIERFRkFVTFQgUFJJVklMRUdFUyBJTiBTQ0hFTUEgc3VwYWJhc2VfZnVuY3Rpb25zIEdSQU5UIEFMTCBPTiBUQUJMRVMgVE8gcG9zdGdyZXMsIGFub24sIGF1dGhlbnRpY2F0ZWQsIHNlcnZpY2Vfcm9sZTtcbkFMVEVSIERFRkFVTFQgUFJJVklMRUdFUyBJTiBTQ0hFTUEgc3VwYWJhc2VfZnVuY3Rpb25zIEdSQU5UIEFMTCBPTiBGVU5DVElPTlMgVE8gcG9zdGdyZXMsIGFub24sIGF1dGhlbnRpY2F0ZWQsIHNlcnZpY2Vfcm9sZTtcbkFMVEVSIERFRkFVTFQgUFJJVklMRUdFUyBJTiBTQ0hFTUEgc3VwYWJhc2VfZnVuY3Rpb25zIEdSQU5UIEFMTCBPTiBTRVFVRU5DRVMgVE8gcG9zdGdyZXMsIGFub24sIGF1dGhlbnRpY2F0ZWQsIHNlcnZpY2Vfcm9sZTtcbi0tIHN1cGFiYXNlX2Z1bmN0aW9ucy5taWdyYXRpb25zIGRlZmluaXRpb25cbkNSRUFURSBUQUJMRSBzdXBhYmFzZV9mdW5jdGlvbnMubWlncmF0aW9ucyAoXG4gIHZlcnNpb24gdGV4dCBQUklNQVJZIEtFWSxcbiAgaW5zZXJ0ZWRfYXQgdGltZXN0YW1wdHogTk9UIE5VTEwgREVGQVVMVCBOT1coKVxuKTtcbi0tIEluaXRpYWwgc3VwYWJhc2VfZnVuY3Rpb25zIG1pZ3JhdGlvblxuSU5TRVJUIElOVE8gc3VwYWJhc2VfZnVuY3Rpb25zLm1pZ3JhdGlvbnMgKHZlcnNpb24pIFZBTFVFUyAoJ2luaXRpYWwnKTtcbi0tIHN1cGFiYXNlX2Z1bmN0aW9ucy5ob29rcyBkZWZpbml0aW9uXG5DUkVBVEUgVEFCTEUgc3VwYWJhc2VfZnVuY3Rpb25zLmhvb2tzIChcbiAgaWQgYmlnc2VyaWFsIFBSSU1BUlkgS0VZLFxuICBob29rX3RhYmxlX2lkIGludGVnZXIgTk9UIE5VTEwsXG4gIGhvb2tfbmFtZSB0ZXh0IE5PVCBOVUxMLFxuICBjcmVhdGVkX2F0IHRpbWVzdGFtcHR6IE5PVCBOVUxMIERFRkFVTFQgTk9XKCksXG4gIHJlcXVlc3RfaWQgYmlnaW50XG4pO1xuQ1JFQVRFIElOREVYIHN1cGFiYXNlX2Z1bmN0aW9uc19ob29rc19yZXF1ZXN0X2lkX2lkeCBPTiBzdXBhYmFzZV9mdW5jdGlvbnMuaG9va3MgVVNJTkcgYnRyZWUgKHJlcXVlc3RfaWQpO1xuQ1JFQVRFIElOREVYIHN1cGFiYXNlX2Z1bmN0aW9uc19ob29rc19oX3RhYmxlX2lkX2hfbmFtZV9pZHggT04gc3VwYWJhc2VfZnVuY3Rpb25zLmhvb2tzIFVTSU5HIGJ0cmVlIChob29rX3RhYmxlX2lkLCBob29rX25hbWUpO1xuQ09NTUVOVCBPTiBUQUJMRSBzdXBhYmFzZV9mdW5jdGlvbnMuaG9va3MgSVMgJ1N1cGFiYXNlIEZ1bmN0aW9ucyBIb29rczogQXVkaXQgdHJhaWwgZm9yIHRyaWdnZXJlZCBob29rcy4nO1xuQ1JFQVRFIEZVTkNUSU9OIHN1cGFiYXNlX2Z1bmN0aW9ucy5odHRwX3JlcXVlc3QoKVxuICBSRVRVUk5TIHRyaWdnZXJcbiAgTEFOR1VBR0UgcGxwZ3NxbFxuICBBUyAkZnVuY3Rpb24kXG4gIERFQ0xBUkVcbiAgICByZXF1ZXN0X2lkIGJpZ2ludDtcbiAgICBwYXlsb2FkIGpzb25iO1xuICAgIHVybCB0ZXh0IDo9IFRHX0FSR1ZbMF06OnRleHQ7XG4gICAgbWV0aG9kIHRleHQgOj0gVEdfQVJHVlsxXTo6dGV4dDtcbiAgICBoZWFkZXJzIGpzb25iIERFRkFVTFQgJ3t9Jzo6anNvbmI7XG4gICAgcGFyYW1zIGpzb25iIERFRkFVTFQgJ3t9Jzo6anNvbmI7XG4gICAgdGltZW91dF9tcyBpbnRlZ2VyIERFRkFVTFQgMTAwMDtcbiAgQkVHSU5cbiAgICBJRiB1cmwgSVMgTlVMTCBPUiB1cmwgPSAnbnVsbCcgVEhFTlxuICAgICAgUkFJU0UgRVhDRVBUSU9OICd1cmwgYXJndW1lbnQgaXMgbWlzc2luZyc7XG4gICAgRU5EIElGO1xuXG4gICAgSUYgbWV0aG9kIElTIE5VTEwgT1IgbWV0aG9kID0gJ251bGwnIFRIRU5cbiAgICAgIFJBSVNFIEVYQ0VQVElPTiAnbWV0aG9kIGFyZ3VtZW50IGlzIG1pc3NpbmcnO1xuICAgIEVORCBJRjtcblxuICAgIElGIFRHX0FSR1ZbMl0gSVMgTlVMTCBPUiBUR19BUkdWWzJdID0gJ251bGwnIFRIRU5cbiAgICAgIGhlYWRlcnMgPSAne1wiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwifSc6Ompzb25iO1xuICAgIEVMU0VcbiAgICAgIGhlYWRlcnMgPSBUR19BUkdWWzJdOjpqc29uYjtcbiAgICBFTkQgSUY7XG5cbiAgICBJRiBUR19BUkdWWzNdIElTIE5VTEwgT1IgVEdfQVJHVlszXSA9ICdudWxsJyBUSEVOXG4gICAgICBwYXJhbXMgPSAne30nOjpqc29uYjtcbiAgICBFTFNFXG4gICAgICBwYXJhbXMgPSBUR19BUkdWWzNdOjpqc29uYjtcbiAgICBFTkQgSUY7XG5cbiAgICBJRiBUR19BUkdWWzRdIElTIE5VTEwgT1IgVEdfQVJHVls0XSA9ICdudWxsJyBUSEVOXG4gICAgICB0aW1lb3V0X21zID0gMTAwMDtcbiAgICBFTFNFXG4gICAgICB0aW1lb3V0X21zID0gVEdfQVJHVls0XTo6aW50ZWdlcjtcbiAgICBFTkQgSUY7XG5cbiAgICBDQVNFXG4gICAgICBXSEVOIG1ldGhvZCA9ICdHRVQnIFRIRU5cbiAgICAgICAgU0VMRUNUIGh0dHBfZ2V0IElOVE8gcmVxdWVzdF9pZCBGUk9NIG5ldC5odHRwX2dldChcbiAgICAgICAgICB1cmwsXG4gICAgICAgICAgcGFyYW1zLFxuICAgICAgICAgIGhlYWRlcnMsXG4gICAgICAgICAgdGltZW91dF9tc1xuICAgICAgICApO1xuICAgICAgV0hFTiBtZXRob2QgPSAnUE9TVCcgVEhFTlxuICAgICAgICBwYXlsb2FkID0ganNvbmJfYnVpbGRfb2JqZWN0KFxuICAgICAgICAgICdvbGRfcmVjb3JkJywgT0xELFxuICAgICAgICAgICdyZWNvcmQnLCBORVcsXG4gICAgICAgICAgJ3R5cGUnLCBUR19PUCxcbiAgICAgICAgICAndGFibGUnLCBUR19UQUJMRV9OQU1FLFxuICAgICAgICAgICdzY2hlbWEnLCBUR19UQUJMRV9TQ0hFTUFcbiAgICAgICAgKTtcblxuICAgICAgICBTRUxFQ1QgaHR0cF9wb3N0IElOVE8gcmVxdWVzdF9pZCBGUk9NIG5ldC5odHRwX3Bvc3QoXG4gICAgICAgICAgdXJsLFxuICAgICAgICAgIHBheWxvYWQsXG4gICAgICAgICAgcGFyYW1zLFxuICAgICAgICAgIGhlYWRlcnMsXG4gICAgICAgICAgdGltZW91dF9tc1xuICAgICAgICApO1xuICAgICAgRUxTRVxuICAgICAgICBSQUlTRSBFWENFUFRJT04gJ21ldGhvZCBhcmd1bWVudCAlIGlzIGludmFsaWQnLCBtZXRob2Q7XG4gICAgRU5EIENBU0U7XG5cbiAgICBJTlNFUlQgSU5UTyBzdXBhYmFzZV9mdW5jdGlvbnMuaG9va3NcbiAgICAgIChob29rX3RhYmxlX2lkLCBob29rX25hbWUsIHJlcXVlc3RfaWQpXG4gICAgVkFMVUVTXG4gICAgICAoVEdfUkVMSUQsIFRHX05BTUUsIHJlcXVlc3RfaWQpO1xuXG4gICAgUkVUVVJOIE5FVztcbiAgRU5EXG4kZnVuY3Rpb24kO1xuLS0gU3VwYWJhc2Ugc3VwZXIgYWRtaW5cbkRPXG4kJFxuQkVHSU5cbiAgSUYgTk9UIEVYSVNUUyAoXG4gICAgU0VMRUNUIDFcbiAgICBGUk9NIHBnX3JvbGVzXG4gICAgV0hFUkUgcm9sbmFtZSA9ICdzdXBhYmFzZV9mdW5jdGlvbnNfYWRtaW4nXG4gIClcbiAgVEhFTlxuICAgIENSRUFURSBVU0VSIHN1cGFiYXNlX2Z1bmN0aW9uc19hZG1pbiBOT0lOSEVSSVQgQ1JFQVRFUk9MRSBMT0dJTiBOT1JFUExJQ0FUSU9OO1xuICBFTkQgSUY7XG5FTkRcbiQkO1xuR1JBTlQgQUxMIFBSSVZJTEVHRVMgT04gU0NIRU1BIHN1cGFiYXNlX2Z1bmN0aW9ucyBUTyBzdXBhYmFzZV9mdW5jdGlvbnNfYWRtaW47XG5HUkFOVCBBTEwgUFJJVklMRUdFUyBPTiBBTEwgVEFCTEVTIElOIFNDSEVNQSBzdXBhYmFzZV9mdW5jdGlvbnMgVE8gc3VwYWJhc2VfZnVuY3Rpb25zX2FkbWluO1xuR1JBTlQgQUxMIFBSSVZJTEVHRVMgT04gQUxMIFNFUVVFTkNFUyBJTiBTQ0hFTUEgc3VwYWJhc2VfZnVuY3Rpb25zIFRPIHN1cGFiYXNlX2Z1bmN0aW9uc19hZG1pbjtcbkFMVEVSIFVTRVIgc3VwYWJhc2VfZnVuY3Rpb25zX2FkbWluIFNFVCBzZWFyY2hfcGF0aCA9IFwic3VwYWJhc2VfZnVuY3Rpb25zXCI7XG5BTFRFUiB0YWJsZSBcInN1cGFiYXNlX2Z1bmN0aW9uc1wiLm1pZ3JhdGlvbnMgT1dORVIgVE8gc3VwYWJhc2VfZnVuY3Rpb25zX2FkbWluO1xuQUxURVIgdGFibGUgXCJzdXBhYmFzZV9mdW5jdGlvbnNcIi5ob29rcyBPV05FUiBUTyBzdXBhYmFzZV9mdW5jdGlvbnNfYWRtaW47XG5BTFRFUiBmdW5jdGlvbiBcInN1cGFiYXNlX2Z1bmN0aW9uc1wiLmh0dHBfcmVxdWVzdCgpIE9XTkVSIFRPIHN1cGFiYXNlX2Z1bmN0aW9uc19hZG1pbjtcbkdSQU5UIHN1cGFiYXNlX2Z1bmN0aW9uc19hZG1pbiBUTyBwb3N0Z3Jlcztcbi0tIFJlbW92ZSB1bnVzZWQgc3VwYWJhc2VfcGdfbmV0X2FkbWluIHJvbGVcbkRPXG4kJFxuQkVHSU5cbiAgSUYgRVhJU1RTIChcbiAgICBTRUxFQ1QgMVxuICAgIEZST00gcGdfcm9sZXNcbiAgICBXSEVSRSByb2xuYW1lID0gJ3N1cGFiYXNlX3BnX25ldF9hZG1pbidcbiAgKVxuICBUSEVOXG4gICAgUkVBU1NJR04gT1dORUQgQlkgc3VwYWJhc2VfcGdfbmV0X2FkbWluIFRPIHN1cGFiYXNlX2FkbWluO1xuICAgIERST1AgT1dORUQgQlkgc3VwYWJhc2VfcGdfbmV0X2FkbWluO1xuICAgIERST1AgUk9MRSBzdXBhYmFzZV9wZ19uZXRfYWRtaW47XG4gIEVORCBJRjtcbkVORFxuJCQ7XG4tLSBwZ19uZXQgZ3JhbnRzIHdoZW4gZXh0ZW5zaW9uIGlzIGFscmVhZHkgZW5hYmxlZFxuRE9cbiQkXG5CRUdJTlxuICBJRiBFWElTVFMgKFxuICAgIFNFTEVDVCAxXG4gICAgRlJPTSBwZ19leHRlbnNpb25cbiAgICBXSEVSRSBleHRuYW1lID0gJ3BnX25ldCdcbiAgKVxuICBUSEVOXG4gICAgR1JBTlQgVVNBR0UgT04gU0NIRU1BIG5ldCBUTyBzdXBhYmFzZV9mdW5jdGlvbnNfYWRtaW4sIHBvc3RncmVzLCBhbm9uLCBhdXRoZW50aWNhdGVkLCBzZXJ2aWNlX3JvbGU7XG4gICAgQUxURVIgZnVuY3Rpb24gbmV0Lmh0dHBfZ2V0KHVybCB0ZXh0LCBwYXJhbXMganNvbmIsIGhlYWRlcnMganNvbmIsIHRpbWVvdXRfbWlsbGlzZWNvbmRzIGludGVnZXIpIFNFQ1VSSVRZIERFRklORVI7XG4gICAgQUxURVIgZnVuY3Rpb24gbmV0Lmh0dHBfcG9zdCh1cmwgdGV4dCwgYm9keSBqc29uYiwgcGFyYW1zIGpzb25iLCBoZWFkZXJzIGpzb25iLCB0aW1lb3V0X21pbGxpc2Vjb25kcyBpbnRlZ2VyKSBTRUNVUklUWSBERUZJTkVSO1xuICAgIEFMVEVSIGZ1bmN0aW9uIG5ldC5odHRwX2dldCh1cmwgdGV4dCwgcGFyYW1zIGpzb25iLCBoZWFkZXJzIGpzb25iLCB0aW1lb3V0X21pbGxpc2Vjb25kcyBpbnRlZ2VyKSBTRVQgc2VhcmNoX3BhdGggPSBuZXQ7XG4gICAgQUxURVIgZnVuY3Rpb24gbmV0Lmh0dHBfcG9zdCh1cmwgdGV4dCwgYm9keSBqc29uYiwgcGFyYW1zIGpzb25iLCBoZWFkZXJzIGpzb25iLCB0aW1lb3V0X21pbGxpc2Vjb25kcyBpbnRlZ2VyKSBTRVQgc2VhcmNoX3BhdGggPSBuZXQ7XG4gICAgUkVWT0tFIEFMTCBPTiBGVU5DVElPTiBuZXQuaHR0cF9nZXQodXJsIHRleHQsIHBhcmFtcyBqc29uYiwgaGVhZGVycyBqc29uYiwgdGltZW91dF9taWxsaXNlY29uZHMgaW50ZWdlcikgRlJPTSBQVUJMSUM7XG4gICAgUkVWT0tFIEFMTCBPTiBGVU5DVElPTiBuZXQuaHR0cF9wb3N0KHVybCB0ZXh0LCBib2R5IGpzb25iLCBwYXJhbXMganNvbmIsIGhlYWRlcnMganNvbmIsIHRpbWVvdXRfbWlsbGlzZWNvbmRzIGludGVnZXIpIEZST00gUFVCTElDO1xuICAgIEdSQU5UIEVYRUNVVEUgT04gRlVOQ1RJT04gbmV0Lmh0dHBfZ2V0KHVybCB0ZXh0LCBwYXJhbXMganNvbmIsIGhlYWRlcnMganNvbmIsIHRpbWVvdXRfbWlsbGlzZWNvbmRzIGludGVnZXIpIFRPIHN1cGFiYXNlX2Z1bmN0aW9uc19hZG1pbiwgcG9zdGdyZXMsIGFub24sIGF1dGhlbnRpY2F0ZWQsIHNlcnZpY2Vfcm9sZTtcbiAgICBHUkFOVCBFWEVDVVRFIE9OIEZVTkNUSU9OIG5ldC5odHRwX3Bvc3QodXJsIHRleHQsIGJvZHkganNvbmIsIHBhcmFtcyBqc29uYiwgaGVhZGVycyBqc29uYiwgdGltZW91dF9taWxsaXNlY29uZHMgaW50ZWdlcikgVE8gc3VwYWJhc2VfZnVuY3Rpb25zX2FkbWluLCBwb3N0Z3JlcywgYW5vbiwgYXV0aGVudGljYXRlZCwgc2VydmljZV9yb2xlO1xuICBFTkQgSUY7XG5FTkRcbiQkO1xuLS0gRXZlbnQgdHJpZ2dlciBmb3IgcGdfbmV0XG5DUkVBVEUgT1IgUkVQTEFDRSBGVU5DVElPTiBleHRlbnNpb25zLmdyYW50X3BnX25ldF9hY2Nlc3MoKVxuUkVUVVJOUyBldmVudF90cmlnZ2VyXG5MQU5HVUFHRSBwbHBnc3FsXG5BUyAkJFxuQkVHSU5cbiAgSUYgRVhJU1RTIChcbiAgICBTRUxFQ1QgMVxuICAgIEZST00gcGdfZXZlbnRfdHJpZ2dlcl9kZGxfY29tbWFuZHMoKSBBUyBldlxuICAgIEpPSU4gcGdfZXh0ZW5zaW9uIEFTIGV4dFxuICAgIE9OIGV2Lm9iamlkID0gZXh0Lm9pZFxuICAgIFdIRVJFIGV4dC5leHRuYW1lID0gJ3BnX25ldCdcbiAgKVxuICBUSEVOXG4gICAgR1JBTlQgVVNBR0UgT04gU0NIRU1BIG5ldCBUTyBzdXBhYmFzZV9mdW5jdGlvbnNfYWRtaW4sIHBvc3RncmVzLCBhbm9uLCBhdXRoZW50aWNhdGVkLCBzZXJ2aWNlX3JvbGU7XG4gICAgQUxURVIgZnVuY3Rpb24gbmV0Lmh0dHBfZ2V0KHVybCB0ZXh0LCBwYXJhbXMganNvbmIsIGhlYWRlcnMganNvbmIsIHRpbWVvdXRfbWlsbGlzZWNvbmRzIGludGVnZXIpIFNFQ1VSSVRZIERFRklORVI7XG4gICAgQUxURVIgZnVuY3Rpb24gbmV0Lmh0dHBfcG9zdCh1cmwgdGV4dCwgYm9keSBqc29uYiwgcGFyYW1zIGpzb25iLCBoZWFkZXJzIGpzb25iLCB0aW1lb3V0X21pbGxpc2Vjb25kcyBpbnRlZ2VyKSBTRUNVUklUWSBERUZJTkVSO1xuICAgIEFMVEVSIGZ1bmN0aW9uIG5ldC5odHRwX2dldCh1cmwgdGV4dCwgcGFyYW1zIGpzb25iLCBoZWFkZXJzIGpzb25iLCB0aW1lb3V0X21pbGxpc2Vjb25kcyBpbnRlZ2VyKSBTRVQgc2VhcmNoX3BhdGggPSBuZXQ7XG4gICAgQUxURVIgZnVuY3Rpb24gbmV0Lmh0dHBfcG9zdCh1cmwgdGV4dCwgYm9keSBqc29uYiwgcGFyYW1zIGpzb25iLCBoZWFkZXJzIGpzb25iLCB0aW1lb3V0X21pbGxpc2Vjb25kcyBpbnRlZ2VyKSBTRVQgc2VhcmNoX3BhdGggPSBuZXQ7XG4gICAgUkVWT0tFIEFMTCBPTiBGVU5DVElPTiBuZXQuaHR0cF9nZXQodXJsIHRleHQsIHBhcmFtcyBqc29uYiwgaGVhZGVycyBqc29uYiwgdGltZW91dF9taWxsaXNlY29uZHMgaW50ZWdlcikgRlJPTSBQVUJMSUM7XG4gICAgUkVWT0tFIEFMTCBPTiBGVU5DVElPTiBuZXQuaHR0cF9wb3N0KHVybCB0ZXh0LCBib2R5IGpzb25iLCBwYXJhbXMganNvbmIsIGhlYWRlcnMganNvbmIsIHRpbWVvdXRfbWlsbGlzZWNvbmRzIGludGVnZXIpIEZST00gUFVCTElDO1xuICAgIEdSQU5UIEVYRUNVVEUgT04gRlVOQ1RJT04gbmV0Lmh0dHBfZ2V0KHVybCB0ZXh0LCBwYXJhbXMganNvbmIsIGhlYWRlcnMganNvbmIsIHRpbWVvdXRfbWlsbGlzZWNvbmRzIGludGVnZXIpIFRPIHN1cGFiYXNlX2Z1bmN0aW9uc19hZG1pbiwgcG9zdGdyZXMsIGFub24sIGF1dGhlbnRpY2F0ZWQsIHNlcnZpY2Vfcm9sZTtcbiAgICBHUkFOVCBFWEVDVVRFIE9OIEZVTkNUSU9OIG5ldC5odHRwX3Bvc3QodXJsIHRleHQsIGJvZHkganNvbmIsIHBhcmFtcyBqc29uYiwgaGVhZGVycyBqc29uYiwgdGltZW91dF9taWxsaXNlY29uZHMgaW50ZWdlcikgVE8gc3VwYWJhc2VfZnVuY3Rpb25zX2FkbWluLCBwb3N0Z3JlcywgYW5vbiwgYXV0aGVudGljYXRlZCwgc2VydmljZV9yb2xlO1xuICBFTkQgSUY7XG5FTkQ7XG4kJDtcbkNPTU1FTlQgT04gRlVOQ1RJT04gZXh0ZW5zaW9ucy5ncmFudF9wZ19uZXRfYWNjZXNzIElTICdHcmFudHMgYWNjZXNzIHRvIHBnX25ldCc7XG5ET1xuJCRcbkJFR0lOXG4gIElGIE5PVCBFWElTVFMgKFxuICAgIFNFTEVDVCAxXG4gICAgRlJPTSBwZ19ldmVudF90cmlnZ2VyXG4gICAgV0hFUkUgZXZ0bmFtZSA9ICdpc3N1ZV9wZ19uZXRfYWNjZXNzJ1xuICApIFRIRU5cbiAgICBDUkVBVEUgRVZFTlQgVFJJR0dFUiBpc3N1ZV9wZ19uZXRfYWNjZXNzIE9OIGRkbF9jb21tYW5kX2VuZCBXSEVOIFRBRyBJTiAoJ0NSRUFURSBFWFRFTlNJT04nKVxuICAgIEVYRUNVVEUgUFJPQ0VEVVJFIGV4dGVuc2lvbnMuZ3JhbnRfcGdfbmV0X2FjY2VzcygpO1xuICBFTkQgSUY7XG5FTkRcbiQkO1xuSU5TRVJUIElOVE8gc3VwYWJhc2VfZnVuY3Rpb25zLm1pZ3JhdGlvbnMgKHZlcnNpb24pIFZBTFVFUyAoJzIwMjEwODA5MTgzNDIzX3VwZGF0ZV9ncmFudHMnKTtcbkFMVEVSIGZ1bmN0aW9uIHN1cGFiYXNlX2Z1bmN0aW9ucy5odHRwX3JlcXVlc3QoKSBTRUNVUklUWSBERUZJTkVSO1xuQUxURVIgZnVuY3Rpb24gc3VwYWJhc2VfZnVuY3Rpb25zLmh0dHBfcmVxdWVzdCgpIFNFVCBzZWFyY2hfcGF0aCA9IHN1cGFiYXNlX2Z1bmN0aW9ucztcblJFVk9LRSBBTEwgT04gRlVOQ1RJT04gc3VwYWJhc2VfZnVuY3Rpb25zLmh0dHBfcmVxdWVzdCgpIEZST00gUFVCTElDO1xuR1JBTlQgRVhFQ1VURSBPTiBGVU5DVElPTiBzdXBhYmFzZV9mdW5jdGlvbnMuaHR0cF9yZXF1ZXN0KCkgVE8gcG9zdGdyZXMsIGFub24sIGF1dGhlbnRpY2F0ZWQsIHNlcnZpY2Vfcm9sZTtcbkNPTU1JVDtcbiIKICAgICAgLQogICAgICAgIHR5cGU6IGJpbmQKICAgICAgICBzb3VyY2U6IC4vdm9sdW1lcy9kYi9yb2xlcy5zcWwKICAgICAgICB0YXJnZXQ6IC9kb2NrZXItZW50cnlwb2ludC1pbml0ZGIuZC9pbml0LXNjcmlwdHMvOTktcm9sZXMuc3FsCiAgICAgICAgY29udGVudDogIi0tIE5PVEU6IGNoYW5nZSB0byB5b3VyIG93biBwYXNzd29yZHMgZm9yIHByb2R1Y3Rpb24gZW52aXJvbm1lbnRzXG4gXFxzZXQgcGdwYXNzIGBlY2hvIFwiJFBPU1RHUkVTX1BBU1NXT1JEXCJgXG5cbiBBTFRFUiBVU0VSIGF1dGhlbnRpY2F0b3IgV0lUSCBQQVNTV09SRCA6J3BncGFzcyc7XG4gQUxURVIgVVNFUiBwZ2JvdW5jZXIgV0lUSCBQQVNTV09SRCA6J3BncGFzcyc7XG4gQUxURVIgVVNFUiBzdXBhYmFzZV9hdXRoX2FkbWluIFdJVEggUEFTU1dPUkQgOidwZ3Bhc3MnO1xuIEFMVEVSIFVTRVIgc3VwYWJhc2VfZnVuY3Rpb25zX2FkbWluIFdJVEggUEFTU1dPUkQgOidwZ3Bhc3MnO1xuIEFMVEVSIFVTRVIgc3VwYWJhc2Vfc3RvcmFnZV9hZG1pbiBXSVRIIFBBU1NXT1JEIDoncGdwYXNzJztcbiIKICAgICAgLQogICAgICAgIHR5cGU6IGJpbmQKICAgICAgICBzb3VyY2U6IC4vdm9sdW1lcy9kYi9qd3Quc3FsCiAgICAgICAgdGFyZ2V0OiAvZG9ja2VyLWVudHJ5cG9pbnQtaW5pdGRiLmQvaW5pdC1zY3JpcHRzLzk5LWp3dC5zcWwKICAgICAgICBjb250ZW50OiAiXFxzZXQgand0X3NlY3JldCBgZWNobyBcIiRKV1RfU0VDUkVUXCJgXG5cXHNldCBqd3RfZXhwIGBlY2hvIFwiJEpXVF9FWFBcImBcblxcc2V0IGRiX25hbWUgYGVjaG8gXCIke1BPU1RHUkVTX0RCOi1wb3N0Z3Jlc31cImBcblxuQUxURVIgREFUQUJBU0UgOmRiX25hbWUgU0VUIFwiYXBwLnNldHRpbmdzLmp3dF9zZWNyZXRcIiBUTyA6J2p3dF9zZWNyZXQnO1xuQUxURVIgREFUQUJBU0UgOmRiX25hbWUgU0VUIFwiYXBwLnNldHRpbmdzLmp3dF9leHBcIiBUTyA6J2p3dF9leHAnO1xuIgogICAgICAtCiAgICAgICAgdHlwZTogYmluZAogICAgICAgIHNvdXJjZTogLi92b2x1bWVzL2RiL2xvZ3Muc3FsCiAgICAgICAgdGFyZ2V0OiAvZG9ja2VyLWVudHJ5cG9pbnQtaW5pdGRiLmQvbWlncmF0aW9ucy85OS1sb2dzLnNxbAogICAgICAgIGNvbnRlbnQ6ICJcXHNldCBwZ3VzZXIgYGVjaG8gXCJzdXBhYmFzZV9hZG1pblwiYFxuXFxjIF9zdXBhYmFzZVxuY3JlYXRlIHNjaGVtYSBpZiBub3QgZXhpc3RzIF9hbmFseXRpY3M7XG5hbHRlciBzY2hlbWEgX2FuYWx5dGljcyBvd25lciB0byA6cGd1c2VyO1xuXFxjIHBvc3RncmVzXG4iCiAgICAgIC0gJ3N1cGFiYXNlLWRiLWNvbmZpZzovZXRjL3Bvc3RncmVzcWwtY3VzdG9tJwogIHN1cGFiYXNlLWFuYWx5dGljczoKICAgIGltYWdlOiAnc3VwYWJhc2UvbG9nZmxhcmU6MS40LjAnCiAgICBoZWFsdGhjaGVjazoKICAgICAgdGVzdDoKICAgICAgICAtIENNRAogICAgICAgIC0gY3VybAogICAgICAgIC0gJ2h0dHA6Ly8xMjcuMC4wLjE6NDAwMC9oZWFsdGgnCiAgICAgIHRpbWVvdXQ6IDVzCiAgICAgIGludGVydmFsOiA1cwogICAgICByZXRyaWVzOiAxMAogICAgZGVwZW5kc19vbjoKICAgICAgc3VwYWJhc2UtZGI6CiAgICAgICAgY29uZGl0aW9uOiBzZXJ2aWNlX2hlYWx0aHkKICAgIGVudmlyb25tZW50OgogICAgICAtIExPR0ZMQVJFX05PREVfSE9TVD0xMjcuMC4wLjEKICAgICAgLSBEQl9VU0VSTkFNRT1zdXBhYmFzZV9hZG1pbgogICAgICAtIERCX0RBVEFCQVNFPV9zdXBhYmFzZQogICAgICAtICdEQl9IT1NUTkFNRT0ke1BPU1RHUkVTX0hPU1ROQU1FOi1zdXBhYmFzZS1kYn0nCiAgICAgIC0gJ0RCX1BPUlQ9JHtQT1NUR1JFU19QT1JUOi01NDMyfScKICAgICAgLSAnREJfUEFTU1dPUkQ9JHtTRVJWSUNFX1BBU1NXT1JEX1BPU1RHUkVTfScKICAgICAgLSBEQl9TQ0hFTUE9X2FuYWx5dGljcwogICAgICAtICdMT0dGTEFSRV9BUElfS0VZPSR7U0VSVklDRV9QQVNTV09SRF9MT0dGTEFSRX0nCiAgICAgIC0gTE9HRkxBUkVfU0lOR0xFX1RFTkFOVD10cnVlCiAgICAgIC0gTE9HRkxBUkVfU0lOR0xFX1RFTkFOVF9NT0RFPXRydWUKICAgICAgLSBMT0dGTEFSRV9TVVBBQkFTRV9NT0RFPXRydWUKICAgICAgLSBMT0dGTEFSRV9NSU5fQ0xVU1RFUl9TSVpFPTEKICAgICAgLSAnUE9TVEdSRVNfQkFDS0VORF9VUkw9cG9zdGdyZXNxbDovL3N1cGFiYXNlX2FkbWluOiR7U0VSVklDRV9QQVNTV09SRF9QT1NUR1JFU31AJHtQT1NUR1JFU19IT1NUTkFNRTotc3VwYWJhc2UtZGJ9OiR7UE9TVEdSRVNfUE9SVDotNTQzMn0vX3N1cGFiYXNlJwogICAgICAtIFBPU1RHUkVTX0JBQ0tFTkRfU0NIRU1BPV9hbmFseXRpY3MKICAgICAgLSBMT0dGTEFSRV9GRUFUVVJFX0ZMQUdfT1ZFUlJJREU9bXVsdGliYWNrZW5kPXRydWUKICBzdXBhYmFzZS12ZWN0b3I6CiAgICBpbWFnZTogJ3RpbWJlcmlvL3ZlY3RvcjowLjI4LjEtYWxwaW5lJwogICAgaGVhbHRoY2hlY2s6CiAgICAgIHRlc3Q6CiAgICAgICAgLSBDTUQKICAgICAgICAtIHdnZXQKICAgICAgICAtICctLW5vLXZlcmJvc2UnCiAgICAgICAgLSAnLS10cmllcz0xJwogICAgICAgIC0gJy0tc3BpZGVyJwogICAgICAgIC0gJ2h0dHA6Ly9zdXBhYmFzZS12ZWN0b3I6OTAwMS9oZWFsdGgnCiAgICAgIHRpbWVvdXQ6IDVzCiAgICAgIGludGVydmFsOiA1cwogICAgICByZXRyaWVzOiAzCiAgICB2b2x1bWVzOgogICAgICAtCiAgICAgICAgdHlwZTogYmluZAogICAgICAgIHNvdXJjZTogLi92b2x1bWVzL2xvZ3MvdmVjdG9yLnltbAogICAgICAgIHRhcmdldDogL2V0Yy92ZWN0b3IvdmVjdG9yLnltbAogICAgICAgIHJlYWRfb25seTogdHJ1ZQogICAgICAgIGNvbnRlbnQ6ICJhcGk6XG4gIGVuYWJsZWQ6IHRydWVcbiAgYWRkcmVzczogMC4wLjAuMDo5MDAxXG5cbnNvdXJjZXM6XG4gIGRvY2tlcl9ob3N0OlxuICAgIHR5cGU6IGRvY2tlcl9sb2dzXG4gICAgZXhjbHVkZV9jb250YWluZXJzOlxuICAgICAgLSBzdXBhYmFzZS12ZWN0b3JcblxudHJhbnNmb3JtczpcbiAgcHJvamVjdF9sb2dzOlxuICAgIHR5cGU6IHJlbWFwXG4gICAgaW5wdXRzOlxuICAgICAgLSBkb2NrZXJfaG9zdFxuICAgIHNvdXJjZTogfC1cbiAgICAgIC5wcm9qZWN0ID0gXCJkZWZhdWx0XCJcbiAgICAgIC5ldmVudF9tZXNzYWdlID0gZGVsKC5tZXNzYWdlKVxuICAgICAgLmFwcG5hbWUgPSBkZWwoLmNvbnRhaW5lcl9uYW1lKVxuICAgICAgZGVsKC5jb250YWluZXJfY3JlYXRlZF9hdClcbiAgICAgIGRlbCguY29udGFpbmVyX2lkKVxuICAgICAgZGVsKC5zb3VyY2VfdHlwZSlcbiAgICAgIGRlbCguc3RyZWFtKVxuICAgICAgZGVsKC5sYWJlbClcbiAgICAgIGRlbCguaW1hZ2UpXG4gICAgICBkZWwoLmhvc3QpXG4gICAgICBkZWwoLnN0cmVhbSlcbiAgcm91dGVyOlxuICAgIHR5cGU6IHJvdXRlXG4gICAgaW5wdXRzOlxuICAgICAgLSBwcm9qZWN0X2xvZ3NcbiAgICByb3V0ZTpcbiAgICAgIGtvbmc6ICdzdGFydHNfd2l0aChzdHJpbmchKC5hcHBuYW1lKSwgXCJzdXBhYmFzZS1rb25nXCIpJ1xuICAgICAgYXV0aDogJ3N0YXJ0c193aXRoKHN0cmluZyEoLmFwcG5hbWUpLCBcInN1cGFiYXNlLWF1dGhcIiknXG4gICAgICByZXN0OiAnc3RhcnRzX3dpdGgoc3RyaW5nISguYXBwbmFtZSksIFwic3VwYWJhc2UtcmVzdFwiKSdcbiAgICAgIHJlYWx0aW1lOiAnc3RhcnRzX3dpdGgoc3RyaW5nISguYXBwbmFtZSksIFwicmVhbHRpbWUtZGV2XCIpJ1xuICAgICAgc3RvcmFnZTogJ3N0YXJ0c193aXRoKHN0cmluZyEoLmFwcG5hbWUpLCBcInN1cGFiYXNlLXN0b3JhZ2VcIiknXG4gICAgICBmdW5jdGlvbnM6ICdzdGFydHNfd2l0aChzdHJpbmchKC5hcHBuYW1lKSwgXCJzdXBhYmFzZS1mdW5jdGlvbnNcIiknXG4gICAgICBkYjogJ3N0YXJ0c193aXRoKHN0cmluZyEoLmFwcG5hbWUpLCBcInN1cGFiYXNlLWRiXCIpJ1xuICAjIElnbm9yZXMgbm9uIG5naW54IGVycm9ycyBzaW5jZSB0aGV5IGFyZSByZWxhdGVkIHdpdGgga29uZyBib290aW5nIHVwXG4gIGtvbmdfbG9nczpcbiAgICB0eXBlOiByZW1hcFxuICAgIGlucHV0czpcbiAgICAgIC0gcm91dGVyLmtvbmdcbiAgICBzb3VyY2U6IHwtXG4gICAgICByZXEsIGVyciA9IHBhcnNlX25naW54X2xvZyguZXZlbnRfbWVzc2FnZSwgXCJjb21iaW5lZFwiKVxuICAgICAgaWYgZXJyID09IG51bGwge1xuICAgICAgICAgIC50aW1lc3RhbXAgPSByZXEudGltZXN0YW1wXG4gICAgICAgICAgLm1ldGFkYXRhLnJlcXVlc3QuaGVhZGVycy5yZWZlcmVyID0gcmVxLnJlZmVyZXJcbiAgICAgICAgICAubWV0YWRhdGEucmVxdWVzdC5oZWFkZXJzLnVzZXJfYWdlbnQgPSByZXEuYWdlbnRcbiAgICAgICAgICAubWV0YWRhdGEucmVxdWVzdC5oZWFkZXJzLmNmX2Nvbm5lY3RpbmdfaXAgPSByZXEuY2xpZW50XG4gICAgICAgICAgLm1ldGFkYXRhLnJlcXVlc3QubWV0aG9kID0gcmVxLm1ldGhvZFxuICAgICAgICAgIC5tZXRhZGF0YS5yZXF1ZXN0LnBhdGggPSByZXEucGF0aFxuICAgICAgICAgIC5tZXRhZGF0YS5yZXF1ZXN0LnByb3RvY29sID0gcmVxLnByb3RvY29sXG4gICAgICAgICAgLm1ldGFkYXRhLnJlc3BvbnNlLnN0YXR1c19jb2RlID0gcmVxLnN0YXR1c1xuICAgICAgfVxuICAgICAgaWYgZXJyICE9IG51bGwge1xuICAgICAgICBhYm9ydFxuICAgICAgfVxuICAjIElnbm9yZXMgbm9uIG5naW54IGVycm9ycyBzaW5jZSB0aGV5IGFyZSByZWxhdGVkIHdpdGgga29uZyBib290aW5nIHVwXG4gIGtvbmdfZXJyOlxuICAgIHR5cGU6IHJlbWFwXG4gICAgaW5wdXRzOlxuICAgICAgLSByb3V0ZXIua29uZ1xuICAgIHNvdXJjZTogfC1cbiAgICAgIC5tZXRhZGF0YS5yZXF1ZXN0Lm1ldGhvZCA9IFwiR0VUXCJcbiAgICAgIC5tZXRhZGF0YS5yZXNwb25zZS5zdGF0dXNfY29kZSA9IDIwMFxuICAgICAgcGFyc2VkLCBlcnIgPSBwYXJzZV9uZ2lueF9sb2coLmV2ZW50X21lc3NhZ2UsIFwiZXJyb3JcIilcbiAgICAgIGlmIGVyciA9PSBudWxsIHtcbiAgICAgICAgICAudGltZXN0YW1wID0gcGFyc2VkLnRpbWVzdGFtcFxuICAgICAgICAgIC5zZXZlcml0eSA9IHBhcnNlZC5zZXZlcml0eVxuICAgICAgICAgIC5tZXRhZGF0YS5yZXF1ZXN0Lmhvc3QgPSBwYXJzZWQuaG9zdFxuICAgICAgICAgIC5tZXRhZGF0YS5yZXF1ZXN0LmhlYWRlcnMuY2ZfY29ubmVjdGluZ19pcCA9IHBhcnNlZC5jbGllbnRcbiAgICAgICAgICB1cmwsIGVyciA9IHNwbGl0KHBhcnNlZC5yZXF1ZXN0LCBcIiBcIilcbiAgICAgICAgICBpZiBlcnIgPT0gbnVsbCB7XG4gICAgICAgICAgICAgIC5tZXRhZGF0YS5yZXF1ZXN0Lm1ldGhvZCA9IHVybFswXVxuICAgICAgICAgICAgICAubWV0YWRhdGEucmVxdWVzdC5wYXRoID0gdXJsWzFdXG4gICAgICAgICAgICAgIC5tZXRhZGF0YS5yZXF1ZXN0LnByb3RvY29sID0gdXJsWzJdXG4gICAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgZXJyICE9IG51bGwge1xuICAgICAgICBhYm9ydFxuICAgICAgfVxuICAjIEdvdHJ1ZSBsb2dzIGFyZSBzdHJ1Y3R1cmVkIGpzb24gc3RyaW5ncyB3aGljaCBmcm9udGVuZCBwYXJzZXMgZGlyZWN0bHkuIEJ1dCB3ZSBrZWVwIG1ldGFkYXRhIGZvciBjb25zaXN0ZW5jeS5cbiAgYXV0aF9sb2dzOlxuICAgIHR5cGU6IHJlbWFwXG4gICAgaW5wdXRzOlxuICAgICAgLSByb3V0ZXIuYXV0aFxuICAgIHNvdXJjZTogfC1cbiAgICAgIHBhcnNlZCwgZXJyID0gcGFyc2VfanNvbiguZXZlbnRfbWVzc2FnZSlcbiAgICAgIGlmIGVyciA9PSBudWxsIHtcbiAgICAgICAgICAubWV0YWRhdGEudGltZXN0YW1wID0gcGFyc2VkLnRpbWVcbiAgICAgICAgICAubWV0YWRhdGEgPSBtZXJnZSEoLm1ldGFkYXRhLCBwYXJzZWQpXG4gICAgICB9XG4gICMgUG9zdGdSRVNUIGxvZ3MgYXJlIHN0cnVjdHVyZWQgc28gd2Ugc2VwYXJhdGUgdGltZXN0YW1wIGZyb20gbWVzc2FnZSB1c2luZyByZWdleFxuICByZXN0X2xvZ3M6XG4gICAgdHlwZTogcmVtYXBcbiAgICBpbnB1dHM6XG4gICAgICAtIHJvdXRlci5yZXN0XG4gICAgc291cmNlOiB8LVxuICAgICAgcGFyc2VkLCBlcnIgPSBwYXJzZV9yZWdleCguZXZlbnRfbWVzc2FnZSwgcideKD9QPHRpbWU+LiopOiAoP1A8bXNnPi4qKSQnKVxuICAgICAgaWYgZXJyID09IG51bGwge1xuICAgICAgICAgIC5ldmVudF9tZXNzYWdlID0gcGFyc2VkLm1zZ1xuICAgICAgICAgIC50aW1lc3RhbXAgPSB0b190aW1lc3RhbXAhKHBhcnNlZC50aW1lKVxuICAgICAgICAgIC5tZXRhZGF0YS5ob3N0ID0gLnByb2plY3RcbiAgICAgIH1cbiAgIyBSZWFsdGltZSBsb2dzIGFyZSBzdHJ1Y3R1cmVkIHNvIHdlIHBhcnNlIHRoZSBzZXZlcml0eSBsZXZlbCB1c2luZyByZWdleCAoaWdub3JlIHRpbWUgYmVjYXVzZSBpdCBoYXMgbm8gZGF0ZSlcbiAgcmVhbHRpbWVfbG9nczpcbiAgICB0eXBlOiByZW1hcFxuICAgIGlucHV0czpcbiAgICAgIC0gcm91dGVyLnJlYWx0aW1lXG4gICAgc291cmNlOiB8LVxuICAgICAgLm1ldGFkYXRhLnByb2plY3QgPSBkZWwoLnByb2plY3QpXG4gICAgICAubWV0YWRhdGEuZXh0ZXJuYWxfaWQgPSAubWV0YWRhdGEucHJvamVjdFxuICAgICAgcGFyc2VkLCBlcnIgPSBwYXJzZV9yZWdleCguZXZlbnRfbWVzc2FnZSwgcideKD9QPHRpbWU+XFxkKzpcXGQrOlxcZCtcXC5cXGQrKSBcXFsoP1A8bGV2ZWw+XFx3KylcXF0gKD9QPG1zZz4uKikkJylcbiAgICAgIGlmIGVyciA9PSBudWxsIHtcbiAgICAgICAgICAuZXZlbnRfbWVzc2FnZSA9IHBhcnNlZC5tc2dcbiAgICAgICAgICAubWV0YWRhdGEubGV2ZWwgPSBwYXJzZWQubGV2ZWxcbiAgICAgIH1cbiAgIyBTdG9yYWdlIGxvZ3MgbWF5IGNvbnRhaW4ganNvbiBvYmplY3RzIHNvIHdlIHBhcnNlIHRoZW0gZm9yIGNvbXBsZXRlbmVzc1xuICBzdG9yYWdlX2xvZ3M6XG4gICAgdHlwZTogcmVtYXBcbiAgICBpbnB1dHM6XG4gICAgICAtIHJvdXRlci5zdG9yYWdlXG4gICAgc291cmNlOiB8LVxuICAgICAgLm1ldGFkYXRhLnByb2plY3QgPSBkZWwoLnByb2plY3QpXG4gICAgICAubWV0YWRhdGEudGVuYW50SWQgPSAubWV0YWRhdGEucHJvamVjdFxuICAgICAgcGFyc2VkLCBlcnIgPSBwYXJzZV9qc29uKC5ldmVudF9tZXNzYWdlKVxuICAgICAgaWYgZXJyID09IG51bGwge1xuICAgICAgICAgIC5ldmVudF9tZXNzYWdlID0gcGFyc2VkLm1zZ1xuICAgICAgICAgIC5tZXRhZGF0YS5sZXZlbCA9IHBhcnNlZC5sZXZlbFxuICAgICAgICAgIC5tZXRhZGF0YS50aW1lc3RhbXAgPSBwYXJzZWQudGltZVxuICAgICAgICAgIC5tZXRhZGF0YS5jb250ZXh0WzBdLmhvc3QgPSBwYXJzZWQuaG9zdG5hbWVcbiAgICAgICAgICAubWV0YWRhdGEuY29udGV4dFswXS5waWQgPSBwYXJzZWQucGlkXG4gICAgICB9XG4gICMgUG9zdGdyZXMgbG9ncyBzb21lIG1lc3NhZ2VzIHRvIHN0ZGVyciB3aGljaCB3ZSBtYXAgdG8gd2FybmluZyBzZXZlcml0eSBsZXZlbFxuICBkYl9sb2dzOlxuICAgIHR5cGU6IHJlbWFwXG4gICAgaW5wdXRzOlxuICAgICAgLSByb3V0ZXIuZGJcbiAgICBzb3VyY2U6IHwtXG4gICAgICAubWV0YWRhdGEuaG9zdCA9IFwiZGItZGVmYXVsdFwiXG4gICAgICAubWV0YWRhdGEucGFyc2VkLnRpbWVzdGFtcCA9IC50aW1lc3RhbXBcblxuICAgICAgcGFyc2VkLCBlcnIgPSBwYXJzZV9yZWdleCguZXZlbnRfbWVzc2FnZSwgcicuKig/UDxsZXZlbD5JTkZPfE5PVElDRXxXQVJOSU5HfEVSUk9SfExPR3xGQVRBTHxQQU5JQz8pOi4qJywgbnVtZXJpY19ncm91cHM6IHRydWUpXG5cbiAgICAgIGlmIGVyciAhPSBudWxsIHx8IHBhcnNlZCA9PSBudWxsIHtcbiAgICAgICAgLm1ldGFkYXRhLnBhcnNlZC5lcnJvcl9zZXZlcml0eSA9IFwiaW5mb1wiXG4gICAgICB9XG4gICAgICBpZiBwYXJzZWQgIT0gbnVsbCB7XG4gICAgICAubWV0YWRhdGEucGFyc2VkLmVycm9yX3NldmVyaXR5ID0gcGFyc2VkLmxldmVsXG4gICAgICB9XG4gICAgICBpZiAubWV0YWRhdGEucGFyc2VkLmVycm9yX3NldmVyaXR5ID09IFwiaW5mb1wiIHtcbiAgICAgICAgICAubWV0YWRhdGEucGFyc2VkLmVycm9yX3NldmVyaXR5ID0gXCJsb2dcIlxuICAgICAgfVxuICAgICAgLm1ldGFkYXRhLnBhcnNlZC5lcnJvcl9zZXZlcml0eSA9IHVwY2FzZSEoLm1ldGFkYXRhLnBhcnNlZC5lcnJvcl9zZXZlcml0eSlcblxuc2lua3M6XG4gIGxvZ2ZsYXJlX2F1dGg6XG4gICAgdHlwZTogJ2h0dHAnXG4gICAgaW5wdXRzOlxuICAgICAgLSBhdXRoX2xvZ3NcbiAgICBlbmNvZGluZzpcbiAgICAgIGNvZGVjOiAnanNvbidcbiAgICBtZXRob2Q6ICdwb3N0J1xuICAgIHJlcXVlc3Q6XG4gICAgICByZXRyeV9tYXhfZHVyYXRpb25fc2VjczogMTBcbiAgICB1cmk6ICdodHRwOi8vc3VwYWJhc2UtYW5hbHl0aWNzOjQwMDAvYXBpL2xvZ3M/c291cmNlX25hbWU9Z290cnVlLmxvZ3MucHJvZCZhcGlfa2V5PSR7TE9HRkxBUkVfQVBJX0tFWT9MT0dGTEFSRV9BUElfS0VZIGlzIHJlcXVpcmVkfSdcbiAgbG9nZmxhcmVfcmVhbHRpbWU6XG4gICAgdHlwZTogJ2h0dHAnXG4gICAgaW5wdXRzOlxuICAgICAgLSByZWFsdGltZV9sb2dzXG4gICAgZW5jb2Rpbmc6XG4gICAgICBjb2RlYzogJ2pzb24nXG4gICAgbWV0aG9kOiAncG9zdCdcbiAgICByZXF1ZXN0OlxuICAgICAgcmV0cnlfbWF4X2R1cmF0aW9uX3NlY3M6IDEwXG4gICAgdXJpOiAnaHR0cDovL3N1cGFiYXNlLWFuYWx5dGljczo0MDAwL2FwaS9sb2dzP3NvdXJjZV9uYW1lPXJlYWx0aW1lLmxvZ3MucHJvZCZhcGlfa2V5PSR7TE9HRkxBUkVfQVBJX0tFWT9MT0dGTEFSRV9BUElfS0VZIGlzIHJlcXVpcmVkfSdcbiAgbG9nZmxhcmVfcmVzdDpcbiAgICB0eXBlOiAnaHR0cCdcbiAgICBpbnB1dHM6XG4gICAgICAtIHJlc3RfbG9nc1xuICAgIGVuY29kaW5nOlxuICAgICAgY29kZWM6ICdqc29uJ1xuICAgIG1ldGhvZDogJ3Bvc3QnXG4gICAgcmVxdWVzdDpcbiAgICAgIHJldHJ5X21heF9kdXJhdGlvbl9zZWNzOiAxMFxuICAgIHVyaTogJ2h0dHA6Ly9zdXBhYmFzZS1hbmFseXRpY3M6NDAwMC9hcGkvbG9ncz9zb3VyY2VfbmFtZT1wb3N0Z1JFU1QubG9ncy5wcm9kJmFwaV9rZXk9JHtMT0dGTEFSRV9BUElfS0VZP0xPR0ZMQVJFX0FQSV9LRVkgaXMgcmVxdWlyZWR9J1xuICBsb2dmbGFyZV9kYjpcbiAgICB0eXBlOiAnaHR0cCdcbiAgICBpbnB1dHM6XG4gICAgICAtIGRiX2xvZ3NcbiAgICBlbmNvZGluZzpcbiAgICAgIGNvZGVjOiAnanNvbidcbiAgICBtZXRob2Q6ICdwb3N0J1xuICAgIHJlcXVlc3Q6XG4gICAgICByZXRyeV9tYXhfZHVyYXRpb25fc2VjczogMTBcbiAgICAjIFdlIG11c3Qgcm91dGUgdGhlIHNpbmsgdGhyb3VnaCBrb25nIGJlY2F1c2UgaW5nZXN0aW5nIGxvZ3MgYmVmb3JlIGxvZ2ZsYXJlIGlzIGZ1bGx5IGluaXRpYWxpc2VkIHdpbGxcbiAgICAjIGxlYWQgdG8gYnJva2VuIHF1ZXJpZXMgZnJvbSBzdHVkaW8uIFRoaXMgd29ya3MgYnkgdGhlIGFzc3VtcHRpb24gdGhhdCBjb250YWluZXJzIGFyZSBzdGFydGVkIGluIHRoZVxuICAgICMgZm9sbG93aW5nIG9yZGVyOiB2ZWN0b3IgPiBkYiA+IGxvZ2ZsYXJlID4ga29uZ1xuICAgIHVyaTogJ2h0dHA6Ly9zdXBhYmFzZS1rb25nOjgwMDAvYW5hbHl0aWNzL3YxL2FwaS9sb2dzP3NvdXJjZV9uYW1lPXBvc3RncmVzLmxvZ3MmYXBpX2tleT0ke0xPR0ZMQVJFX0FQSV9LRVk/TE9HRkxBUkVfQVBJX0tFWSBpcyByZXF1aXJlZH0nXG4gIGxvZ2ZsYXJlX2Z1bmN0aW9uczpcbiAgICB0eXBlOiAnaHR0cCdcbiAgICBpbnB1dHM6XG4gICAgICAtIHJvdXRlci5mdW5jdGlvbnNcbiAgICBlbmNvZGluZzpcbiAgICAgIGNvZGVjOiAnanNvbidcbiAgICBtZXRob2Q6ICdwb3N0J1xuICAgIHJlcXVlc3Q6XG4gICAgICByZXRyeV9tYXhfZHVyYXRpb25fc2VjczogMTBcbiAgICB1cmk6ICdodHRwOi8vc3VwYWJhc2UtYW5hbHl0aWNzOjQwMDAvYXBpL2xvZ3M/c291cmNlX25hbWU9ZGVuby1yZWxheS1sb2dzJmFwaV9rZXk9JHtMT0dGTEFSRV9BUElfS0VZP0xPR0ZMQVJFX0FQSV9LRVkgaXMgcmVxdWlyZWR9J1xuICBsb2dmbGFyZV9zdG9yYWdlOlxuICAgIHR5cGU6ICdodHRwJ1xuICAgIGlucHV0czpcbiAgICAgIC0gc3RvcmFnZV9sb2dzXG4gICAgZW5jb2Rpbmc6XG4gICAgICBjb2RlYzogJ2pzb24nXG4gICAgbWV0aG9kOiAncG9zdCdcbiAgICByZXF1ZXN0OlxuICAgICAgcmV0cnlfbWF4X2R1cmF0aW9uX3NlY3M6IDEwXG4gICAgdXJpOiAnaHR0cDovL3N1cGFiYXNlLWFuYWx5dGljczo0MDAwL2FwaS9sb2dzP3NvdXJjZV9uYW1lPXN0b3JhZ2UubG9ncy5wcm9kLjImYXBpX2tleT0ke0xPR0ZMQVJFX0FQSV9LRVk/TE9HRkxBUkVfQVBJX0tFWSBpcyByZXF1aXJlZH0nXG4gIGxvZ2ZsYXJlX2tvbmc6XG4gICAgdHlwZTogJ2h0dHAnXG4gICAgaW5wdXRzOlxuICAgICAgLSBrb25nX2xvZ3NcbiAgICAgIC0ga29uZ19lcnJcbiAgICBlbmNvZGluZzpcbiAgICAgIGNvZGVjOiAnanNvbidcbiAgICBtZXRob2Q6ICdwb3N0J1xuICAgIHJlcXVlc3Q6XG4gICAgICByZXRyeV9tYXhfZHVyYXRpb25fc2VjczogMTBcbiAgICB1cmk6ICdodHRwOi8vc3VwYWJhc2UtYW5hbHl0aWNzOjQwMDAvYXBpL2xvZ3M/c291cmNlX25hbWU9Y2xvdWRmbGFyZS5sb2dzLnByb2QmYXBpX2tleT0ke0xPR0ZMQVJFX0FQSV9LRVk/TE9HRkxBUkVfQVBJX0tFWSBpcyByZXF1aXJlZH0nXG4iCiAgICAgIC0gJy92YXIvcnVuL2RvY2tlci5zb2NrOi92YXIvcnVuL2RvY2tlci5zb2NrOnJvJwogICAgZW52aXJvbm1lbnQ6CiAgICAgIC0gJ0xPR0ZMQVJFX0FQSV9LRVk9JHtTRVJWSUNFX1BBU1NXT1JEX0xPR0ZMQVJFfScKICAgIGNvbW1hbmQ6CiAgICAgIC0gJy0tY29uZmlnJwogICAgICAtIGV0Yy92ZWN0b3IvdmVjdG9yLnltbAogIHN1cGFiYXNlLXJlc3Q6CiAgICBpbWFnZTogJ3Bvc3RncmVzdC9wb3N0Z3Jlc3Q6djEyLjIuMCcKICAgIGRlcGVuZHNfb246CiAgICAgIHN1cGFiYXNlLWRiOgogICAgICAgIGNvbmRpdGlvbjogc2VydmljZV9oZWFsdGh5CiAgICAgIHN1cGFiYXNlLWFuYWx5dGljczoKICAgICAgICBjb25kaXRpb246IHNlcnZpY2VfaGVhbHRoeQogICAgZW52aXJvbm1lbnQ6CiAgICAgIC0gJ1BHUlNUX0RCX1VSST1wb3N0Z3JlczovL2F1dGhlbnRpY2F0b3I6JHtTRVJWSUNFX1BBU1NXT1JEX1BPU1RHUkVTfUAke1BPU1RHUkVTX0hPU1ROQU1FOi1zdXBhYmFzZS1kYn06JHtQT1NUR1JFU19QT1JUOi01NDMyfS8ke1BPU1RHUkVTX0RCOi1wb3N0Z3Jlc30nCiAgICAgIC0gJ1BHUlNUX0RCX1NDSEVNQVM9JHtQR1JTVF9EQl9TQ0hFTUFTOi1wdWJsaWMsc3RvcmFnZSxncmFwaHFsX3B1YmxpY30nCiAgICAgIC0gUEdSU1RfREJfQU5PTl9ST0xFPWFub24KICAgICAgLSAnUEdSU1RfSldUX1NFQ1JFVD0ke1NFUlZJQ0VfUEFTU1dPUkRfSldUfScKICAgICAgLSBQR1JTVF9EQl9VU0VfTEVHQUNZX0dVQ1M9ZmFsc2UKICAgICAgLSAnUEdSU1RfQVBQX1NFVFRJTkdTX0pXVF9TRUNSRVQ9JHtTRVJWSUNFX1BBU1NXT1JEX0pXVH0nCiAgICAgIC0gJ1BHUlNUX0FQUF9TRVRUSU5HU19KV1RfRVhQPSR7SldUX0VYUElSWTotMzYwMH0nCiAgICBjb21tYW5kOiBwb3N0Z3Jlc3QKICAgIGV4Y2x1ZGVfZnJvbV9oYzogdHJ1ZQogIHN1cGFiYXNlLWF1dGg6CiAgICBpbWFnZTogJ3N1cGFiYXNlL2dvdHJ1ZTp2Mi4xNjQuMCcKICAgIGRlcGVuZHNfb246CiAgICAgIHN1cGFiYXNlLWRiOgogICAgICAgIGNvbmRpdGlvbjogc2VydmljZV9oZWFsdGh5CiAgICAgIHN1cGFiYXNlLWFuYWx5dGljczoKICAgICAgICBjb25kaXRpb246IHNlcnZpY2VfaGVhbHRoeQogICAgaGVhbHRoY2hlY2s6CiAgICAgIHRlc3Q6CiAgICAgICAgLSBDTUQKICAgICAgICAtIHdnZXQKICAgICAgICAtICctLW5vLXZlcmJvc2UnCiAgICAgICAgLSAnLS10cmllcz0xJwogICAgICAgIC0gJy0tc3BpZGVyJwogICAgICAgIC0gJ2h0dHA6Ly8xMjcuMC4wLjE6OTk5OS9oZWFsdGgnCiAgICAgIHRpbWVvdXQ6IDVzCiAgICAgIGludGVydmFsOiA1cwogICAgICByZXRyaWVzOiAzCiAgICBlbnZpcm9ubWVudDoKICAgICAgLSBHT1RSVUVfQVBJX0hPU1Q9MC4wLjAuMAogICAgICAtIEdPVFJVRV9BUElfUE9SVD05OTk5CiAgICAgIC0gJ0FQSV9FWFRFUk5BTF9VUkw9JHtBUElfRVhURVJOQUxfVVJMOi1odHRwOi8vc3VwYWJhc2Uta29uZzo4MDAwfScKICAgICAgLSBHT1RSVUVfREJfRFJJVkVSPXBvc3RncmVzCiAgICAgIC0gJ0dPVFJVRV9EQl9EQVRBQkFTRV9VUkw9cG9zdGdyZXM6Ly9zdXBhYmFzZV9hdXRoX2FkbWluOiR7U0VSVklDRV9QQVNTV09SRF9QT1NUR1JFU31AJHtQT1NUR1JFU19IT1NUTkFNRTotc3VwYWJhc2UtZGJ9OiR7UE9TVEdSRVNfUE9SVDotNTQzMn0vJHtQT1NUR1JFU19EQjotcG9zdGdyZXN9JwogICAgICAtICdHT1RSVUVfU0lURV9VUkw9JHtTRVJWSUNFX0ZRRE5fU1VQQUJBU0VLT05HfScKICAgICAgLSAnR09UUlVFX1VSSV9BTExPV19MSVNUPSR7QURESVRJT05BTF9SRURJUkVDVF9VUkxTfScKICAgICAgLSAnR09UUlVFX0RJU0FCTEVfU0lHTlVQPSR7RElTQUJMRV9TSUdOVVA6LWZhbHNlfScKICAgICAgLSBHT1RSVUVfSldUX0FETUlOX1JPTEVTPXNlcnZpY2Vfcm9sZQogICAgICAtIEdPVFJVRV9KV1RfQVVEPWF1dGhlbnRpY2F0ZWQKICAgICAgLSBHT1RSVUVfSldUX0RFRkFVTFRfR1JPVVBfTkFNRT1hdXRoZW50aWNhdGVkCiAgICAgIC0gJ0dPVFJVRV9KV1RfRVhQPSR7SldUX0VYUElSWTotMzYwMH0nCiAgICAgIC0gJ0dPVFJVRV9KV1RfU0VDUkVUPSR7U0VSVklDRV9QQVNTV09SRF9KV1R9JwogICAgICAtICdHT1RSVUVfRVhURVJOQUxfRU1BSUxfRU5BQkxFRD0ke0VOQUJMRV9FTUFJTF9TSUdOVVA6LXRydWV9JwogICAgICAtICdHT1RSVUVfRVhURVJOQUxfQU5PTllNT1VTX1VTRVJTX0VOQUJMRUQ9JHtFTkFCTEVfQU5PTllNT1VTX1VTRVJTOi1mYWxzZX0nCiAgICAgIC0gJ0dPVFJVRV9NQUlMRVJfQVVUT0NPTkZJUk09JHtFTkFCTEVfRU1BSUxfQVVUT0NPTkZJUk06LWZhbHNlfScKICAgICAgLSAnR09UUlVFX1NNVFBfQURNSU5fRU1BSUw9JHtTTVRQX0FETUlOX0VNQUlMfScKICAgICAgLSAnR09UUlVFX1NNVFBfSE9TVD0ke1NNVFBfSE9TVH0nCiAgICAgIC0gJ0dPVFJVRV9TTVRQX1BPUlQ9JHtTTVRQX1BPUlQ6LTU4N30nCiAgICAgIC0gJ0dPVFJVRV9TTVRQX1VTRVI9JHtTTVRQX1VTRVJ9JwogICAgICAtICdHT1RSVUVfU01UUF9QQVNTPSR7U01UUF9QQVNTfScKICAgICAgLSAnR09UUlVFX1NNVFBfU0VOREVSX05BTUU9JHtTTVRQX1NFTkRFUl9OQU1FfScKICAgICAgLSAnR09UUlVFX01BSUxFUl9VUkxQQVRIU19JTlZJVEU9JHtNQUlMRVJfVVJMUEFUSFNfSU5WSVRFOi0vYXV0aC92MS92ZXJpZnl9JwogICAgICAtICdHT1RSVUVfTUFJTEVSX1VSTFBBVEhTX0NPTkZJUk1BVElPTj0ke01BSUxFUl9VUkxQQVRIU19DT05GSVJNQVRJT046LS9hdXRoL3YxL3ZlcmlmeX0nCiAgICAgIC0gJ0dPVFJVRV9NQUlMRVJfVVJMUEFUSFNfUkVDT1ZFUlk9JHtNQUlMRVJfVVJMUEFUSFNfUkVDT1ZFUlk6LS9hdXRoL3YxL3ZlcmlmeX0nCiAgICAgIC0gJ0dPVFJVRV9NQUlMRVJfVVJMUEFUSFNfRU1BSUxfQ0hBTkdFPSR7TUFJTEVSX1VSTFBBVEhTX0VNQUlMX0NIQU5HRTotL2F1dGgvdjEvdmVyaWZ5fScKICAgICAgLSAnR09UUlVFX01BSUxFUl9URU1QTEFURVNfSU5WSVRFPSR7TUFJTEVSX1RFTVBMQVRFU19JTlZJVEV9JwogICAgICAtICdHT1RSVUVfTUFJTEVSX1RFTVBMQVRFU19DT05GSVJNQVRJT049JHtNQUlMRVJfVEVNUExBVEVTX0NPTkZJUk1BVElPTn0nCiAgICAgIC0gJ0dPVFJVRV9NQUlMRVJfVEVNUExBVEVTX1JFQ09WRVJZPSR7TUFJTEVSX1RFTVBMQVRFU19SRUNPVkVSWX0nCiAgICAgIC0gJ0dPVFJVRV9NQUlMRVJfVEVNUExBVEVTX01BR0lDX0xJTks9JHtNQUlMRVJfVEVNUExBVEVTX01BR0lDX0xJTkt9JwogICAgICAtICdHT1RSVUVfTUFJTEVSX1RFTVBMQVRFU19FTUFJTF9DSEFOR0U9JHtNQUlMRVJfVEVNUExBVEVTX0VNQUlMX0NIQU5HRX0nCiAgICAgIC0gJ0dPVFJVRV9NQUlMRVJfU1VCSkVDVFNfQ09ORklSTUFUSU9OPSR7TUFJTEVSX1NVQkpFQ1RTX0NPTkZJUk1BVElPTn0nCiAgICAgIC0gJ0dPVFJVRV9NQUlMRVJfU1VCSkVDVFNfUkVDT1ZFUlk9JHtNQUlMRVJfU1VCSkVDVFNfUkVDT1ZFUll9JwogICAgICAtICdHT1RSVUVfTUFJTEVSX1NVQkpFQ1RTX01BR0lDX0xJTks9JHtNQUlMRVJfU1VCSkVDVFNfTUFHSUNfTElOS30nCiAgICAgIC0gJ0dPVFJVRV9NQUlMRVJfU1VCSkVDVFNfRU1BSUxfQ0hBTkdFPSR7TUFJTEVSX1NVQkpFQ1RTX0VNQUlMX0NIQU5HRX0nCiAgICAgIC0gJ0dPVFJVRV9NQUlMRVJfU1VCSkVDVFNfSU5WSVRFPSR7TUFJTEVSX1NVQkpFQ1RTX0lOVklURX0nCiAgICAgIC0gJ0dPVFJVRV9FWFRFUk5BTF9QSE9ORV9FTkFCTEVEPSR7RU5BQkxFX1BIT05FX1NJR05VUDotdHJ1ZX0nCiAgICAgIC0gJ0dPVFJVRV9TTVNfQVVUT0NPTkZJUk09JHtFTkFCTEVfUEhPTkVfQVVUT0NPTkZJUk06LXRydWV9JwogIHJlYWx0aW1lLWRldjoKICAgIGltYWdlOiAnc3VwYWJhc2UvcmVhbHRpbWU6djIuMzMuNzAnCiAgICBjb250YWluZXJfbmFtZTogcmVhbHRpbWUtZGV2LnN1cGFiYXNlLXJlYWx0aW1lCiAgICBkZXBlbmRzX29uOgogICAgICBzdXBhYmFzZS1kYjoKICAgICAgICBjb25kaXRpb246IHNlcnZpY2VfaGVhbHRoeQogICAgICBzdXBhYmFzZS1hbmFseXRpY3M6CiAgICAgICAgY29uZGl0aW9uOiBzZXJ2aWNlX2hlYWx0aHkKICAgIGhlYWx0aGNoZWNrOgogICAgICB0ZXN0OgogICAgICAgIC0gQ01ECiAgICAgICAgLSBjdXJsCiAgICAgICAgLSAnLXNTZkwnCiAgICAgICAgLSAnLS1oZWFkJwogICAgICAgIC0gJy1vJwogICAgICAgIC0gL2Rldi9udWxsCiAgICAgICAgLSAnLUgnCiAgICAgICAgLSAnQXV0aG9yaXphdGlvbjogQmVhcmVyICR7U0VSVklDRV9TVVBBQkFTRUFOT05fS0VZfScKICAgICAgICAtICdodHRwOi8vMTI3LjAuMC4xOjQwMDAvYXBpL3RlbmFudHMvcmVhbHRpbWUtZGV2L2hlYWx0aCcKICAgICAgdGltZW91dDogNXMKICAgICAgaW50ZXJ2YWw6IDVzCiAgICAgIHJldHJpZXM6IDMKICAgIGVudmlyb25tZW50OgogICAgICAtIFBPUlQ9NDAwMAogICAgICAtICdEQl9IT1NUPSR7UE9TVEdSRVNfSE9TVE5BTUU6LXN1cGFiYXNlLWRifScKICAgICAgLSAnREJfUE9SVD0ke1BPU1RHUkVTX1BPUlQ6LTU0MzJ9JwogICAgICAtIERCX1VTRVI9c3VwYWJhc2VfYWRtaW4KICAgICAgLSAnREJfUEFTU1dPUkQ9JHtTRVJWSUNFX1BBU1NXT1JEX1BPU1RHUkVTfScKICAgICAgLSAnREJfTkFNRT0ke1BPU1RHUkVTX0RCOi1wb3N0Z3Jlc30nCiAgICAgIC0gJ0RCX0FGVEVSX0NPTk5FQ1RfUVVFUlk9U0VUIHNlYXJjaF9wYXRoIFRPIF9yZWFsdGltZScKICAgICAgLSBEQl9FTkNfS0VZPXN1cGFiYXNlcmVhbHRpbWUKICAgICAgLSAnQVBJX0pXVF9TRUNSRVQ9JHtTRVJWSUNFX1BBU1NXT1JEX0pXVH0nCiAgICAgIC0gRkxZX0FMTE9DX0lEPWZseTEyMwogICAgICAtIEZMWV9BUFBfTkFNRT1yZWFsdGltZQogICAgICAtICdTRUNSRVRfS0VZX0JBU0U9JHtTRUNSRVRfUEFTU1dPUkRfUkVBTFRJTUV9JwogICAgICAtICdFUkxfQUZMQUdTPS1wcm90b19kaXN0IGluZXRfdGNwJwogICAgICAtIEVOQUJMRV9UQUlMU0NBTEU9ZmFsc2UKICAgICAgLSAiRE5TX05PREVTPScnIgogICAgICAtIFJMSU1JVF9OT0ZJTEU9MTAwMDAKICAgICAgLSBBUFBfTkFNRT1yZWFsdGltZQogICAgICAtIFNFRURfU0VMRl9IT1NUPXRydWUKICAgICAgLSBMT0dfTEVWRUw9ZXJyb3IKICAgICAgLSBSVU5fSkFOSVRPUj10cnVlCiAgICAgIC0gSkFOSVRPUl9JTlRFUlZBTD02MDAwMAogICAgY29tbWFuZDogInNoIC1jIFwiL2FwcC9iaW4vbWlncmF0ZSAmJiAvYXBwL2Jpbi9yZWFsdGltZSBldmFsICdSZWFsdGltZS5SZWxlYXNlLnNlZWRzKFJlYWx0aW1lLlJlcG8pJyAmJiAvYXBwL2Jpbi9zZXJ2ZXJcIlxuIgogIHN1cGFiYXNlLW1pbmlvOgogICAgaW1hZ2U6IG1pbmlvL21pbmlvCiAgICBlbnZpcm9ubWVudDoKICAgICAgLSAnTUlOSU9fUk9PVF9VU0VSPSR7U0VSVklDRV9VU0VSX01JTklPfScKICAgICAgLSAnTUlOSU9fUk9PVF9QQVNTV09SRD0ke1NFUlZJQ0VfUEFTU1dPUkRfTUlOSU99JwogICAgY29tbWFuZDogJ3NlcnZlciAtLWNvbnNvbGUtYWRkcmVzcyAiOjkwMDEiIC9kYXRhJwogICAgaGVhbHRoY2hlY2s6CiAgICAgIHRlc3Q6ICdzbGVlcCA1ICYmIGV4aXQgMCcKICAgICAgaW50ZXJ2YWw6IDJzCiAgICAgIHRpbWVvdXQ6IDEwcwogICAgICByZXRyaWVzOiA1CiAgICB2b2x1bWVzOgogICAgICAtICcuL3ZvbHVtZXMvc3RvcmFnZTovZGF0YScKICBtaW5pby1jcmVhdGVidWNrZXQ6CiAgICBpbWFnZTogbWluaW8vbWMKICAgIHJlc3RhcnQ6ICdubycKICAgIGVudmlyb25tZW50OgogICAgICAtICdNSU5JT19ST09UX1VTRVI9JHtTRVJWSUNFX1VTRVJfTUlOSU99JwogICAgICAtICdNSU5JT19ST09UX1BBU1NXT1JEPSR7U0VSVklDRV9QQVNTV09SRF9NSU5JT30nCiAgICBkZXBlbmRzX29uOgogICAgICBzdXBhYmFzZS1taW5pbzoKICAgICAgICBjb25kaXRpb246IHNlcnZpY2VfaGVhbHRoeQogICAgZW50cnlwb2ludDoKICAgICAgLSAvZW50cnlwb2ludC5zaAogICAgdm9sdW1lczoKICAgICAgLQogICAgICAgIHR5cGU6IGJpbmQKICAgICAgICBzb3VyY2U6IC4vZW50cnlwb2ludC5zaAogICAgICAgIHRhcmdldDogL2VudHJ5cG9pbnQuc2gKICAgICAgICBjb250ZW50OiAiIyEvYmluL3NoXG4vdXNyL2Jpbi9tYyBhbGlhcyBzZXQgc3VwYWJhc2UtbWluaW8gaHR0cDovL3N1cGFiYXNlLW1pbmlvOjkwMDAgJHtNSU5JT19ST09UX1VTRVJ9ICR7TUlOSU9fUk9PVF9QQVNTV09SRH07XG4vdXNyL2Jpbi9tYyBtYiAtLWlnbm9yZS1leGlzdGluZyBzdXBhYmFzZS1taW5pby9zdHViO1xuZXhpdCAwXG4iCiAgc3VwYWJhc2Utc3RvcmFnZToKICAgIGltYWdlOiAnc3VwYWJhc2Uvc3RvcmFnZS1hcGk6djEuMTQuNicKICAgIGRlcGVuZHNfb246CiAgICAgIHN1cGFiYXNlLWRiOgogICAgICAgIGNvbmRpdGlvbjogc2VydmljZV9oZWFsdGh5CiAgICAgIHN1cGFiYXNlLXJlc3Q6CiAgICAgICAgY29uZGl0aW9uOiBzZXJ2aWNlX3N0YXJ0ZWQKICAgICAgaW1ncHJveHk6CiAgICAgICAgY29uZGl0aW9uOiBzZXJ2aWNlX3N0YXJ0ZWQKICAgIGhlYWx0aGNoZWNrOgogICAgICB0ZXN0OgogICAgICAgIC0gQ01ECiAgICAgICAgLSB3Z2V0CiAgICAgICAgLSAnLS1uby12ZXJib3NlJwogICAgICAgIC0gJy0tdHJpZXM9MScKICAgICAgICAtICctLXNwaWRlcicKICAgICAgICAtICdodHRwOi8vMTI3LjAuMC4xOjUwMDAvc3RhdHVzJwogICAgICB0aW1lb3V0OiA1cwogICAgICBpbnRlcnZhbDogNXMKICAgICAgcmV0cmllczogMwogICAgZW52aXJvbm1lbnQ6CiAgICAgIC0gU0VSVkVSX1BPUlQ9NTAwMAogICAgICAtIFNFUlZFUl9SRUdJT049bG9jYWwKICAgICAgLSBNVUxUSV9URU5BTlQ9ZmFsc2UKICAgICAgLSAnQVVUSF9KV1RfU0VDUkVUPSR7U0VSVklDRV9QQVNTV09SRF9KV1R9JwogICAgICAtICdEQVRBQkFTRV9VUkw9cG9zdGdyZXM6Ly9zdXBhYmFzZV9zdG9yYWdlX2FkbWluOiR7U0VSVklDRV9QQVNTV09SRF9QT1NUR1JFU31AJHtQT1NUR1JFU19IT1NUTkFNRTotc3VwYWJhc2UtZGJ9OiR7UE9TVEdSRVNfUE9SVDotNTQzMn0vJHtQT1NUR1JFU19EQjotcG9zdGdyZXN9JwogICAgICAtIERCX0lOU1RBTExfUk9MRVM9ZmFsc2UKICAgICAgLSBTVE9SQUdFX0JBQ0tFTkQ9czMKICAgICAgLSBTVE9SQUdFX1MzX0JVQ0tFVD1zdHViCiAgICAgIC0gJ1NUT1JBR0VfUzNfRU5EUE9JTlQ9aHR0cDovL3N1cGFiYXNlLW1pbmlvOjkwMDAnCiAgICAgIC0gU1RPUkFHRV9TM19GT1JDRV9QQVRIX1NUWUxFPXRydWUKICAgICAgLSBTVE9SQUdFX1MzX1JFR0lPTj11cy1lYXN0LTEKICAgICAgLSAnQVdTX0FDQ0VTU19LRVlfSUQ9JHtTRVJWSUNFX1VTRVJfTUlOSU99JwogICAgICAtICdBV1NfU0VDUkVUX0FDQ0VTU19LRVk9JHtTRVJWSUNFX1BBU1NXT1JEX01JTklPfScKICAgICAgLSBVUExPQURfRklMRV9TSVpFX0xJTUlUPTUyNDI4ODAwMAogICAgICAtIFVQTE9BRF9GSUxFX1NJWkVfTElNSVRfU1RBTkRBUkQ9NTI0Mjg4MDAwCiAgICAgIC0gVVBMT0FEX1NJR05FRF9VUkxfRVhQSVJBVElPTl9USU1FPTEyMAogICAgICAtIFRVU19VUkxfUEFUSD11cGxvYWQvcmVzdW1hYmxlCiAgICAgIC0gVFVTX01BWF9TSVpFPTM2MDAwMDAKICAgICAgLSBFTkFCTEVfSU1BR0VfVFJBTlNGT1JNQVRJT049dHJ1ZQogICAgICAtICdJTUdQUk9YWV9VUkw9aHR0cDovL2ltZ3Byb3h5OjgwODAnCiAgICAgIC0gSU1HUFJPWFlfUkVRVUVTVF9USU1FT1VUPTE1CiAgICAgIC0gREFUQUJBU0VfU0VBUkNIX1BBVEg9c3RvcmFnZQogICAgICAtIE5PREVfRU5WPXByb2R1Y3Rpb24KICAgICAgLSBSRVFVRVNUX0FMTE9XX1hfRk9SV0FSREVEX1BBVEg9dHJ1ZQogICAgdm9sdW1lczoKICAgICAgLSAnLi92b2x1bWVzL3N0b3JhZ2U6L3Zhci9saWIvc3RvcmFnZScKICBpbWdwcm94eToKICAgIGltYWdlOiAnZGFydGhzaW0vaW1ncHJveHk6djMuOC4wJwogICAgaGVhbHRoY2hlY2s6CiAgICAgIHRlc3Q6CiAgICAgICAgLSBDTUQKICAgICAgICAtIGltZ3Byb3h5CiAgICAgICAgLSBoZWFsdGgKICAgICAgdGltZW91dDogNXMKICAgICAgaW50ZXJ2YWw6IDVzCiAgICAgIHJldHJpZXM6IDMKICAgIGVudmlyb25tZW50OgogICAgICAtIElNR1BST1hZX0xPQ0FMX0ZJTEVTWVNURU1fUk9PVD0vCiAgICAgIC0gSU1HUFJPWFlfVVNFX0VUQUc9dHJ1ZQogICAgICAtICdJTUdQUk9YWV9FTkFCTEVfV0VCUF9ERVRFQ1RJT049JHtJTUdQUk9YWV9FTkFCTEVfV0VCUF9ERVRFQ1RJT046LXRydWV9JwogICAgdm9sdW1lczoKICAgICAgLSAnLi92b2x1bWVzL3N0b3JhZ2U6L3Zhci9saWIvc3RvcmFnZScKICBzdXBhYmFzZS1tZXRhOgogICAgaW1hZ2U6ICdzdXBhYmFzZS9wb3N0Z3Jlcy1tZXRhOnYwLjg0LjInCiAgICBkZXBlbmRzX29uOgogICAgICBzdXBhYmFzZS1kYjoKICAgICAgICBjb25kaXRpb246IHNlcnZpY2VfaGVhbHRoeQogICAgICBzdXBhYmFzZS1hbmFseXRpY3M6CiAgICAgICAgY29uZGl0aW9uOiBzZXJ2aWNlX2hlYWx0aHkKICAgIGVudmlyb25tZW50OgogICAgICAtIFBHX01FVEFfUE9SVD04MDgwCiAgICAgIC0gJ1BHX01FVEFfREJfSE9TVD0ke1BPU1RHUkVTX0hPU1ROQU1FOi1zdXBhYmFzZS1kYn0nCiAgICAgIC0gJ1BHX01FVEFfREJfUE9SVD0ke1BPU1RHUkVTX1BPUlQ6LTU0MzJ9JwogICAgICAtICdQR19NRVRBX0RCX05BTUU9JHtQT1NUR1JFU19EQjotcG9zdGdyZXN9JwogICAgICAtIFBHX01FVEFfREJfVVNFUj1zdXBhYmFzZV9hZG1pbgogICAgICAtICdQR19NRVRBX0RCX1BBU1NXT1JEPSR7U0VSVklDRV9QQVNTV09SRF9QT1NUR1JFU30nCiAgc3VwYWJhc2UtZWRnZS1mdW5jdGlvbnM6CiAgICBpbWFnZTogJ3N1cGFiYXNlL2VkZ2UtcnVudGltZTp2MS42NS4zJwogICAgZGVwZW5kc19vbjoKICAgICAgc3VwYWJhc2UtYW5hbHl0aWNzOgogICAgICAgIGNvbmRpdGlvbjogc2VydmljZV9oZWFsdGh5CiAgICBoZWFsdGhjaGVjazoKICAgICAgdGVzdDoKICAgICAgICAtIENNRAogICAgICAgIC0gZWNobwogICAgICAgIC0gJ0VkZ2UgRnVuY3Rpb25zIGlzIGhlYWx0aHknCiAgICAgIHRpbWVvdXQ6IDVzCiAgICAgIGludGVydmFsOiA1cwogICAgICByZXRyaWVzOiAzCiAgICBlbnZpcm9ubWVudDoKICAgICAgLSAnSldUX1NFQ1JFVD0ke1NFUlZJQ0VfUEFTU1dPUkRfSldUfScKICAgICAgLSAnU1VQQUJBU0VfVVJMPSR7U0VSVklDRV9GUUROX1NVUEFCQVNFS09OR30nCiAgICAgIC0gJ1NVUEFCQVNFX0FOT05fS0VZPSR7U0VSVklDRV9TVVBBQkFTRUFOT05fS0VZfScKICAgICAgLSAnU1VQQUJBU0VfU0VSVklDRV9ST0xFX0tFWT0ke1NFUlZJQ0VfU1VQQUJBU0VTRVJWSUNFX0tFWX0nCiAgICAgIC0gJ1NVUEFCQVNFX0RCX1VSTD1wb3N0Z3Jlc3FsOi8vcG9zdGdyZXM6JHtTRVJWSUNFX1BBU1NXT1JEX1BPU1RHUkVTfUAke1BPU1RHUkVTX0hPU1ROQU1FOi1zdXBhYmFzZS1kYn06JHtQT1NUR1JFU19QT1JUOi01NDMyfS8ke1BPU1RHUkVTX0RCOi1wb3N0Z3Jlc30nCiAgICAgIC0gJ1ZFUklGWV9KV1Q9JHtGVU5DVElPTlNfVkVSSUZZX0pXVDotZmFsc2V9JwogICAgdm9sdW1lczoKICAgICAgLSAnLi92b2x1bWVzL2Z1bmN0aW9uczovaG9tZS9kZW5vL2Z1bmN0aW9ucycKICAgICAgLQogICAgICAgIHR5cGU6IGJpbmQKICAgICAgICBzb3VyY2U6IC4vdm9sdW1lcy9mdW5jdGlvbnMvbWFpbi9pbmRleC50cwogICAgICAgIHRhcmdldDogL2hvbWUvZGVuby9mdW5jdGlvbnMvbWFpbi9pbmRleC50cwogICAgICAgIGNvbnRlbnQ6ICJpbXBvcnQgeyBzZXJ2ZSB9IGZyb20gJ2h0dHBzOi8vZGVuby5sYW5kL3N0ZEAwLjEzMS4wL2h0dHAvc2VydmVyLnRzJ1xuaW1wb3J0ICogYXMgam9zZSBmcm9tICdodHRwczovL2Rlbm8ubGFuZC94L2pvc2VAdjQuMTQuNC9pbmRleC50cydcblxuY29uc29sZS5sb2coJ21haW4gZnVuY3Rpb24gc3RhcnRlZCcpXG5cbmNvbnN0IEpXVF9TRUNSRVQgPSBEZW5vLmVudi5nZXQoJ0pXVF9TRUNSRVQnKVxuY29uc3QgVkVSSUZZX0pXVCA9IERlbm8uZW52LmdldCgnVkVSSUZZX0pXVCcpID09PSAndHJ1ZSdcblxuZnVuY3Rpb24gZ2V0QXV0aFRva2VuKHJlcTogUmVxdWVzdCkge1xuICBjb25zdCBhdXRoSGVhZGVyID0gcmVxLmhlYWRlcnMuZ2V0KCdhdXRob3JpemF0aW9uJylcbiAgaWYgKCFhdXRoSGVhZGVyKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdNaXNzaW5nIGF1dGhvcml6YXRpb24gaGVhZGVyJylcbiAgfVxuICBjb25zdCBbYmVhcmVyLCB0b2tlbl0gPSBhdXRoSGVhZGVyLnNwbGl0KCcgJylcbiAgaWYgKGJlYXJlciAhPT0gJ0JlYXJlcicpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEF1dGggaGVhZGVyIGlzIG5vdCAnQmVhcmVyIHt0b2tlbn0nYClcbiAgfVxuICByZXR1cm4gdG9rZW5cbn1cblxuYXN5bmMgZnVuY3Rpb24gdmVyaWZ5SldUKGp3dDogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIGNvbnN0IGVuY29kZXIgPSBuZXcgVGV4dEVuY29kZXIoKVxuICBjb25zdCBzZWNyZXRLZXkgPSBlbmNvZGVyLmVuY29kZShKV1RfU0VDUkVUKVxuICB0cnkge1xuICAgIGF3YWl0IGpvc2Uuand0VmVyaWZ5KGp3dCwgc2VjcmV0S2V5KVxuICB9IGNhdGNoIChlcnIpIHtcbiAgICBjb25zb2xlLmVycm9yKGVycilcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuICByZXR1cm4gdHJ1ZVxufVxuXG5zZXJ2ZShhc3luYyAocmVxOiBSZXF1ZXN0KSA9PiB7XG4gIGlmIChyZXEubWV0aG9kICE9PSAnT1BUSU9OUycgJiYgVkVSSUZZX0pXVCkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB0b2tlbiA9IGdldEF1dGhUb2tlbihyZXEpXG4gICAgICBjb25zdCBpc1ZhbGlkSldUID0gYXdhaXQgdmVyaWZ5SldUKHRva2VuKVxuXG4gICAgICBpZiAoIWlzVmFsaWRKV1QpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBSZXNwb25zZShKU09OLnN0cmluZ2lmeSh7IG1zZzogJ0ludmFsaWQgSldUJyB9KSwge1xuICAgICAgICAgIHN0YXR1czogNDAxLFxuICAgICAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgICB9KVxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoZSlcbiAgICAgIHJldHVybiBuZXcgUmVzcG9uc2UoSlNPTi5zdHJpbmdpZnkoeyBtc2c6IGUudG9TdHJpbmcoKSB9KSwge1xuICAgICAgICBzdGF0dXM6IDQwMSxcbiAgICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHVybCA9IG5ldyBVUkwocmVxLnVybClcbiAgY29uc3QgeyBwYXRobmFtZSB9ID0gdXJsXG4gIGNvbnN0IHBhdGhfcGFydHMgPSBwYXRobmFtZS5zcGxpdCgnLycpXG4gIGNvbnN0IHNlcnZpY2VfbmFtZSA9IHBhdGhfcGFydHNbMV1cblxuICBpZiAoIXNlcnZpY2VfbmFtZSB8fCBzZXJ2aWNlX25hbWUgPT09ICcnKSB7XG4gICAgY29uc3QgZXJyb3IgPSB7IG1zZzogJ21pc3NpbmcgZnVuY3Rpb24gbmFtZSBpbiByZXF1ZXN0JyB9XG4gICAgcmV0dXJuIG5ldyBSZXNwb25zZShKU09OLnN0cmluZ2lmeShlcnJvciksIHtcbiAgICAgIHN0YXR1czogNDAwLFxuICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgfSlcbiAgfVxuXG4gIGNvbnN0IHNlcnZpY2VQYXRoID0gYC9ob21lL2Rlbm8vZnVuY3Rpb25zLyR7c2VydmljZV9uYW1lfWBcbiAgY29uc29sZS5lcnJvcihgc2VydmluZyB0aGUgcmVxdWVzdCB3aXRoICR7c2VydmljZVBhdGh9YClcblxuICBjb25zdCBtZW1vcnlMaW1pdE1iID0gMTUwXG4gIGNvbnN0IHdvcmtlclRpbWVvdXRNcyA9IDEgKiA2MCAqIDEwMDBcbiAgY29uc3Qgbm9Nb2R1bGVDYWNoZSA9IGZhbHNlXG4gIGNvbnN0IGltcG9ydE1hcFBhdGggPSBudWxsXG4gIGNvbnN0IGVudlZhcnNPYmogPSBEZW5vLmVudi50b09iamVjdCgpXG4gIGNvbnN0IGVudlZhcnMgPSBPYmplY3Qua2V5cyhlbnZWYXJzT2JqKS5tYXAoKGspID0+IFtrLCBlbnZWYXJzT2JqW2tdXSlcblxuICB0cnkge1xuICAgIGNvbnN0IHdvcmtlciA9IGF3YWl0IEVkZ2VSdW50aW1lLnVzZXJXb3JrZXJzLmNyZWF0ZSh7XG4gICAgICBzZXJ2aWNlUGF0aCxcbiAgICAgIG1lbW9yeUxpbWl0TWIsXG4gICAgICB3b3JrZXJUaW1lb3V0TXMsXG4gICAgICBub01vZHVsZUNhY2hlLFxuICAgICAgaW1wb3J0TWFwUGF0aCxcbiAgICAgIGVudlZhcnMsXG4gICAgfSlcbiAgICByZXR1cm4gYXdhaXQgd29ya2VyLmZldGNoKHJlcSlcbiAgfSBjYXRjaCAoZSkge1xuICAgIGNvbnN0IGVycm9yID0geyBtc2c6IGUudG9TdHJpbmcoKSB9XG4gICAgcmV0dXJuIG5ldyBSZXNwb25zZShKU09OLnN0cmluZ2lmeShlcnJvciksIHtcbiAgICAgIHN0YXR1czogNTAwLFxuICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgfSlcbiAgfVxufSlcbiIKICAgICAgLQogICAgICAgIHR5cGU6IGJpbmQKICAgICAgICBzb3VyY2U6IC4vdm9sdW1lcy9mdW5jdGlvbnMvaGVsbG8vaW5kZXgudHMKICAgICAgICB0YXJnZXQ6IC9ob21lL2Rlbm8vZnVuY3Rpb25zL2hlbGxvL2luZGV4LnRzCiAgICAgICAgY29udGVudDogIi8vIEZvbGxvdyB0aGlzIHNldHVwIGd1aWRlIHRvIGludGVncmF0ZSB0aGUgRGVubyBsYW5ndWFnZSBzZXJ2ZXIgd2l0aCB5b3VyIGVkaXRvcjpcbi8vIGh0dHBzOi8vZGVuby5sYW5kL21hbnVhbC9nZXR0aW5nX3N0YXJ0ZWQvc2V0dXBfeW91cl9lbnZpcm9ubWVudFxuLy8gVGhpcyBlbmFibGVzIGF1dG9jb21wbGV0ZSwgZ28gdG8gZGVmaW5pdGlvbiwgZXRjLlxuXG5pbXBvcnQgeyBzZXJ2ZSB9IGZyb20gXCJodHRwczovL2Rlbm8ubGFuZC9zdGRAMC4xNzcuMS9odHRwL3NlcnZlci50c1wiXG5cbnNlcnZlKGFzeW5jICgpID0+IHtcbiAgcmV0dXJuIG5ldyBSZXNwb25zZShcbiAgICBgXCJIZWxsbyBmcm9tIEVkZ2UgRnVuY3Rpb25zIVwiYCxcbiAgICB7IGhlYWRlcnM6IHsgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIgfSB9LFxuICApXG59KVxuXG4vLyBUbyBpbnZva2U6XG4vLyBjdXJsICdodHRwOi8vbG9jYWxob3N0OjxLT05HX0hUVFBfUE9SVD4vZnVuY3Rpb25zL3YxL2hlbGxvJyBcXFxuLy8gICAtLWhlYWRlciAnQXV0aG9yaXphdGlvbjogQmVhcmVyIDxhbm9uL3NlcnZpY2Vfcm9sZSBBUEkga2V5PidcbiIKICAgIGNvbW1hbmQ6CiAgICAgIC0gc3RhcnQKICAgICAgLSAnLS1tYWluLXNlcnZpY2UnCiAgICAgIC0gL2hvbWUvZGVuby9mdW5jdGlvbnMvbWFpbgogIHN1cGFiYXNlLXN1cGF2aXNvcjoKICAgIGltYWdlOiAnc3VwYWJhc2Uvc3VwYXZpc29yOjEuMS41NicKICAgIGhlYWx0aGNoZWNrOgogICAgICB0ZXN0OgogICAgICAgIC0gQ01ECiAgICAgICAgLSBjdXJsCiAgICAgICAgLSAnLXNTZkwnCiAgICAgICAgLSAnLW8nCiAgICAgICAgLSAvZGV2L251bGwKICAgICAgICAtICdodHRwOi8vMTI3LjAuMC4xOjQwMDAvYXBpL2hlYWx0aCcKICAgICAgdGltZW91dDogNXMKICAgICAgaW50ZXJ2YWw6IDVzCiAgICAgIHJldHJpZXM6IDEwCiAgICBkZXBlbmRzX29uOgogICAgICBzdXBhYmFzZS1kYjoKICAgICAgICBjb25kaXRpb246IHNlcnZpY2VfaGVhbHRoeQogICAgICBzdXBhYmFzZS1hbmFseXRpY3M6CiAgICAgICAgY29uZGl0aW9uOiBzZXJ2aWNlX2hlYWx0aHkKICAgIGVudmlyb25tZW50OgogICAgICAtIFBPT0xFUl9URU5BTlRfSUQ9ZGV2X3RlbmFudAogICAgICAtIFBPT0xFUl9QT09MX01PREU9dHJhbnNhY3Rpb24KICAgICAgLSAnUE9PTEVSX0RFRkFVTFRfUE9PTF9TSVpFPSR7UE9PTEVSX0RFRkFVTFRfUE9PTF9TSVpFOi0yMH0nCiAgICAgIC0gJ1BPT0xFUl9NQVhfQ0xJRU5UX0NPTk49JHtQT09MRVJfTUFYX0NMSUVOVF9DT05OOi0xMDB9JwogICAgICAtIFBPUlQ9NDAwMAogICAgICAtICdQT1NUR1JFU19QT1JUPSR7UE9TVEdSRVNfUE9SVDotNTQzMn0nCiAgICAgIC0gJ1BPU1RHUkVTX0hPU1ROQU1FPSR7UE9TVEdSRVNfSE9TVE5BTUU6LXN1cGFiYXNlLWRifScKICAgICAgLSAnUE9TVEdSRVNfREI9JHtQT1NUR1JFU19EQjotcG9zdGdyZXN9JwogICAgICAtICdQT1NUR1JFU19QQVNTV09SRD0ke1NFUlZJQ0VfUEFTU1dPUkRfUE9TVEdSRVN9JwogICAgICAtICdEQVRBQkFTRV9VUkw9ZWN0bzovL3N1cGFiYXNlX2FkbWluOiR7U0VSVklDRV9QQVNTV09SRF9QT1NUR1JFU31AJHtQT1NUR1JFU19IT1NUTkFNRTotc3VwYWJhc2UtZGJ9OiR7UE9TVEdSRVNfUE9SVDotNTQzMn0vX3N1cGFiYXNlJwogICAgICAtIENMVVNURVJfUE9TVEdSRVM9dHJ1ZQogICAgICAtICdTRUNSRVRfS0VZX0JBU0U9JHtTRVJWSUNFX1BBU1NXT1JEX1NVUEFWSVNPUlNFQ1JFVH0nCiAgICAgIC0gJ1ZBVUxUX0VOQ19LRVk9JHtTRVJWSUNFX1BBU1NXT1JEX1ZBVUxURU5DfScKICAgICAgLSAnQVBJX0pXVF9TRUNSRVQ9JHtTRVJWSUNFX1BBU1NXT1JEX0pXVH0nCiAgICAgIC0gJ01FVFJJQ1NfSldUX1NFQ1JFVD0ke1NFUlZJQ0VfUEFTU1dPUkRfSldUfScKICAgICAgLSBSRUdJT049bG9jYWwKICAgICAgLSAnRVJMX0FGTEFHUz0tcHJvdG9fZGlzdCBpbmV0X3RjcCcKICAgIGNvbW1hbmQ6CiAgICAgIC0gL2Jpbi9zaAogICAgICAtICctYycKICAgICAgLSAnL2FwcC9iaW4vbWlncmF0ZSAmJiAvYXBwL2Jpbi9zdXBhdmlzb3IgZXZhbCAiJCQoY2F0IC9ldGMvcG9vbGVyL3Bvb2xlci5leHMpIiAmJiAvYXBwL2Jpbi9zZXJ2ZXInCiAgICB2b2x1bWVzOgogICAgICAtCiAgICAgICAgdHlwZTogYmluZAogICAgICAgIHNvdXJjZTogLi92b2x1bWVzL3Bvb2xlci9wb29sZXIuZXhzCiAgICAgICAgdGFyZ2V0OiAvZXRjL3Bvb2xlci9wb29sZXIuZXhzCiAgICAgICAgY29udGVudDogIns6b2ssIF99ID0gQXBwbGljYXRpb24uZW5zdXJlX2FsbF9zdGFydGVkKDpzdXBhdmlzb3IpXG57Om9rLCB2ZXJzaW9ufSA9XG4gICAgY2FzZSBTdXBhdmlzb3IuUmVwby5xdWVyeSEoXCJzZWxlY3QgdmVyc2lvbigpXCIpIGRvXG4gICAgJXtyb3dzOiBbW3Zlcl1dfSAtPiBTdXBhdmlzb3IuSGVscGVycy5wYXJzZV9wZ192ZXJzaW9uKHZlcilcbiAgICBfIC0+IG5pbFxuICAgIGVuZFxucGFyYW1zID0gJXtcbiAgICBcImV4dGVybmFsX2lkXCIgPT4gU3lzdGVtLmdldF9lbnYoXCJQT09MRVJfVEVOQU5UX0lEXCIpLFxuICAgIFwiZGJfaG9zdFwiID0+IFN5c3RlbS5nZXRfZW52KFwiUE9TVEdSRVNfSE9TVE5BTUVcIiksXG4gICAgXCJkYl9wb3J0XCIgPT4gU3lzdGVtLmdldF9lbnYoXCJQT1NUR1JFU19QT1JUXCIpIHw+IFN0cmluZy50b19pbnRlZ2VyKCksXG4gICAgXCJkYl9kYXRhYmFzZVwiID0+IFN5c3RlbS5nZXRfZW52KFwiUE9TVEdSRVNfREJcIiksXG4gICAgXCJyZXF1aXJlX3VzZXJcIiA9PiBmYWxzZSxcbiAgICBcImF1dGhfcXVlcnlcIiA9PiBcIlNFTEVDVCAqIEZST00gcGdib3VuY2VyLmdldF9hdXRoKCQxKVwiLFxuICAgIFwiZGVmYXVsdF9tYXhfY2xpZW50c1wiID0+IFN5c3RlbS5nZXRfZW52KFwiUE9PTEVSX01BWF9DTElFTlRfQ09OTlwiKSxcbiAgICBcImRlZmF1bHRfcG9vbF9zaXplXCIgPT4gU3lzdGVtLmdldF9lbnYoXCJQT09MRVJfREVGQVVMVF9QT09MX1NJWkVcIiksXG4gICAgXCJkZWZhdWx0X3BhcmFtZXRlcl9zdGF0dXNcIiA9PiAle1wic2VydmVyX3ZlcnNpb25cIiA9PiB2ZXJzaW9ufSxcbiAgICBcInVzZXJzXCIgPT4gWyV7XG4gICAgXCJkYl91c2VyXCIgPT4gXCJwZ2JvdW5jZXJcIixcbiAgICBcImRiX3Bhc3N3b3JkXCIgPT4gU3lzdGVtLmdldF9lbnYoXCJQT1NUR1JFU19QQVNTV09SRFwiKSxcbiAgICBcIm1vZGVfdHlwZVwiID0+IFN5c3RlbS5nZXRfZW52KFwiUE9PTEVSX1BPT0xfTU9ERVwiKSxcbiAgICBcInBvb2xfc2l6ZVwiID0+IFN5c3RlbS5nZXRfZW52KFwiUE9PTEVSX0RFRkFVTFRfUE9PTF9TSVpFXCIpLFxuICAgIFwiaXNfbWFuYWdlclwiID0+IHRydWVcbiAgICB9XVxufVxuXG50ZW5hbnQgPSBTdXBhdmlzb3IuVGVuYW50cy5nZXRfdGVuYW50X2J5X2V4dGVybmFsX2lkKHBhcmFtc1tcImV4dGVybmFsX2lkXCJdKVxuXG5pZiB0ZW5hbnQgZG9cbiAgezpvaywgX30gPSBTdXBhdmlzb3IuVGVuYW50cy51cGRhdGVfdGVuYW50KHRlbmFudCwgcGFyYW1zKVxuZWxzZVxuICB7Om9rLCBffSA9IFN1cGF2aXNvci5UZW5hbnRzLmNyZWF0ZV90ZW5hbnQocGFyYW1zKVxuZW5kXG4iCg==", + "compose": "c2VydmljZXM6CiAgc3VwYWJhc2Uta29uZzoKICAgIGltYWdlOiAna29uZzoyLjguMScKICAgIGVudHJ5cG9pbnQ6ICdiYXNoIC1jICcnZXZhbCAiZWNobyBcIiQkKGNhdCB+L3RlbXAueW1sKVwiIiA+IH4va29uZy55bWwgJiYgL2RvY2tlci1lbnRyeXBvaW50LnNoIGtvbmcgZG9ja2VyLXN0YXJ0JycnCiAgICBkZXBlbmRzX29uOgogICAgICBzdXBhYmFzZS1hbmFseXRpY3M6CiAgICAgICAgY29uZGl0aW9uOiBzZXJ2aWNlX2hlYWx0aHkKICAgIGVudmlyb25tZW50OgogICAgICAtIFNFUlZJQ0VfRlFETl9TVVBBQkFTRUtPTkdfODAwMAogICAgICAtICdLT05HX1BPUlRfTUFQUz00NDM6ODAwMCcKICAgICAgLSAnSldUX1NFQ1JFVD0ke1NFUlZJQ0VfUEFTU1dPUkRfSldUfScKICAgICAgLSBLT05HX0RBVEFCQVNFPW9mZgogICAgICAtIEtPTkdfREVDTEFSQVRJVkVfQ09ORklHPS9ob21lL2tvbmcva29uZy55bWwKICAgICAgLSAnS09OR19ETlNfT1JERVI9TEFTVCxBLENOQU1FJwogICAgICAtICdLT05HX1BMVUdJTlM9cmVxdWVzdC10cmFuc2Zvcm1lcixjb3JzLGtleS1hdXRoLGFjbCxiYXNpYy1hdXRoJwogICAgICAtIEtPTkdfTkdJTlhfUFJPWFlfUFJPWFlfQlVGRkVSX1NJWkU9MTYwawogICAgICAtICdLT05HX05HSU5YX1BST1hZX1BST1hZX0JVRkZFUlM9NjQgMTYwaycKICAgICAgLSAnU1VQQUJBU0VfQU5PTl9LRVk9JHtTRVJWSUNFX1NVUEFCQVNFQU5PTl9LRVl9JwogICAgICAtICdTVVBBQkFTRV9TRVJWSUNFX0tFWT0ke1NFUlZJQ0VfU1VQQUJBU0VTRVJWSUNFX0tFWX0nCiAgICAgIC0gJ0RBU0hCT0FSRF9VU0VSTkFNRT0ke1NFUlZJQ0VfVVNFUl9BRE1JTn0nCiAgICAgIC0gJ0RBU0hCT0FSRF9QQVNTV09SRD0ke1NFUlZJQ0VfUEFTU1dPUkRfQURNSU59JwogICAgdm9sdW1lczoKICAgICAgLQogICAgICAgIHR5cGU6IGJpbmQKICAgICAgICBzb3VyY2U6IC4vdm9sdW1lcy9hcGkva29uZy55bWwKICAgICAgICB0YXJnZXQ6IC9ob21lL2tvbmcvdGVtcC55bWwKICAgICAgICBjb250ZW50OiAiX2Zvcm1hdF92ZXJzaW9uOiAnMi4xJ1xuX3RyYW5zZm9ybTogdHJ1ZVxuXG4jIyNcbiMjIyBDb25zdW1lcnMgLyBVc2Vyc1xuIyMjXG5jb25zdW1lcnM6XG4gIC0gdXNlcm5hbWU6IERBU0hCT0FSRFxuICAtIHVzZXJuYW1lOiBhbm9uXG4gICAga2V5YXV0aF9jcmVkZW50aWFsczpcbiAgICAgIC0ga2V5OiAkU1VQQUJBU0VfQU5PTl9LRVlcbiAgLSB1c2VybmFtZTogc2VydmljZV9yb2xlXG4gICAga2V5YXV0aF9jcmVkZW50aWFsczpcbiAgICAgIC0ga2V5OiAkU1VQQUJBU0VfU0VSVklDRV9LRVlcblxuIyMjXG4jIyMgQWNjZXNzIENvbnRyb2wgTGlzdFxuIyMjXG5hY2xzOlxuICAtIGNvbnN1bWVyOiBhbm9uXG4gICAgZ3JvdXA6IGFub25cbiAgLSBjb25zdW1lcjogc2VydmljZV9yb2xlXG4gICAgZ3JvdXA6IGFkbWluXG5cbiMjI1xuIyMjIERhc2hib2FyZCBjcmVkZW50aWFsc1xuIyMjXG5iYXNpY2F1dGhfY3JlZGVudGlhbHM6XG4tIGNvbnN1bWVyOiBEQVNIQk9BUkRcbiAgdXNlcm5hbWU6ICREQVNIQk9BUkRfVVNFUk5BTUVcbiAgcGFzc3dvcmQ6ICREQVNIQk9BUkRfUEFTU1dPUkRcblxuXG4jIyNcbiMjIyBBUEkgUm91dGVzXG4jIyNcbnNlcnZpY2VzOlxuXG4gICMjIE9wZW4gQXV0aCByb3V0ZXNcbiAgLSBuYW1lOiBhdXRoLXYxLW9wZW5cbiAgICB1cmw6IGh0dHA6Ly9zdXBhYmFzZS1hdXRoOjk5OTkvdmVyaWZ5XG4gICAgcm91dGVzOlxuICAgICAgLSBuYW1lOiBhdXRoLXYxLW9wZW5cbiAgICAgICAgc3RyaXBfcGF0aDogdHJ1ZVxuICAgICAgICBwYXRoczpcbiAgICAgICAgICAtIC9hdXRoL3YxL3ZlcmlmeVxuICAgIHBsdWdpbnM6XG4gICAgICAtIG5hbWU6IGNvcnNcbiAgLSBuYW1lOiBhdXRoLXYxLW9wZW4tY2FsbGJhY2tcbiAgICB1cmw6IGh0dHA6Ly9zdXBhYmFzZS1hdXRoOjk5OTkvY2FsbGJhY2tcbiAgICByb3V0ZXM6XG4gICAgICAtIG5hbWU6IGF1dGgtdjEtb3Blbi1jYWxsYmFja1xuICAgICAgICBzdHJpcF9wYXRoOiB0cnVlXG4gICAgICAgIHBhdGhzOlxuICAgICAgICAgIC0gL2F1dGgvdjEvY2FsbGJhY2tcbiAgICBwbHVnaW5zOlxuICAgICAgLSBuYW1lOiBjb3JzXG4gIC0gbmFtZTogYXV0aC12MS1vcGVuLWF1dGhvcml6ZVxuICAgIHVybDogaHR0cDovL3N1cGFiYXNlLWF1dGg6OTk5OS9hdXRob3JpemVcbiAgICByb3V0ZXM6XG4gICAgICAtIG5hbWU6IGF1dGgtdjEtb3Blbi1hdXRob3JpemVcbiAgICAgICAgc3RyaXBfcGF0aDogdHJ1ZVxuICAgICAgICBwYXRoczpcbiAgICAgICAgICAtIC9hdXRoL3YxL2F1dGhvcml6ZVxuICAgIHBsdWdpbnM6XG4gICAgICAtIG5hbWU6IGNvcnNcblxuICAjIyBTZWN1cmUgQXV0aCByb3V0ZXNcbiAgLSBuYW1lOiBhdXRoLXYxXG4gICAgX2NvbW1lbnQ6ICdHb1RydWU6IC9hdXRoL3YxLyogLT4gaHR0cDovL3N1cGFiYXNlLWF1dGg6OTk5OS8qJ1xuICAgIHVybDogaHR0cDovL3N1cGFiYXNlLWF1dGg6OTk5OS9cbiAgICByb3V0ZXM6XG4gICAgICAtIG5hbWU6IGF1dGgtdjEtYWxsXG4gICAgICAgIHN0cmlwX3BhdGg6IHRydWVcbiAgICAgICAgcGF0aHM6XG4gICAgICAgICAgLSAvYXV0aC92MS9cbiAgICBwbHVnaW5zOlxuICAgICAgLSBuYW1lOiBjb3JzXG4gICAgICAtIG5hbWU6IGtleS1hdXRoXG4gICAgICAgIGNvbmZpZzpcbiAgICAgICAgICBoaWRlX2NyZWRlbnRpYWxzOiBmYWxzZVxuICAgICAgLSBuYW1lOiBhY2xcbiAgICAgICAgY29uZmlnOlxuICAgICAgICAgIGhpZGVfZ3JvdXBzX2hlYWRlcjogdHJ1ZVxuICAgICAgICAgIGFsbG93OlxuICAgICAgICAgICAgLSBhZG1pblxuICAgICAgICAgICAgLSBhbm9uXG5cbiAgIyMgU2VjdXJlIFJFU1Qgcm91dGVzXG4gIC0gbmFtZTogcmVzdC12MVxuICAgIF9jb21tZW50OiAnUG9zdGdSRVNUOiAvcmVzdC92MS8qIC0+IGh0dHA6Ly9zdXBhYmFzZS1yZXN0OjMwMDAvKidcbiAgICB1cmw6IGh0dHA6Ly9zdXBhYmFzZS1yZXN0OjMwMDAvXG4gICAgcm91dGVzOlxuICAgICAgLSBuYW1lOiByZXN0LXYxLWFsbFxuICAgICAgICBzdHJpcF9wYXRoOiB0cnVlXG4gICAgICAgIHBhdGhzOlxuICAgICAgICAgIC0gL3Jlc3QvdjEvXG4gICAgcGx1Z2luczpcbiAgICAgIC0gbmFtZTogY29yc1xuICAgICAgLSBuYW1lOiBrZXktYXV0aFxuICAgICAgICBjb25maWc6XG4gICAgICAgICAgaGlkZV9jcmVkZW50aWFsczogdHJ1ZVxuICAgICAgLSBuYW1lOiBhY2xcbiAgICAgICAgY29uZmlnOlxuICAgICAgICAgIGhpZGVfZ3JvdXBzX2hlYWRlcjogdHJ1ZVxuICAgICAgICAgIGFsbG93OlxuICAgICAgICAgICAgLSBhZG1pblxuICAgICAgICAgICAgLSBhbm9uXG5cbiAgIyMgU2VjdXJlIEdyYXBoUUwgcm91dGVzXG4gIC0gbmFtZTogZ3JhcGhxbC12MVxuICAgIF9jb21tZW50OiAnUG9zdGdSRVNUOiAvZ3JhcGhxbC92MS8qIC0+IGh0dHA6Ly9zdXBhYmFzZS1yZXN0OjMwMDAvcnBjL2dyYXBocWwnXG4gICAgdXJsOiBodHRwOi8vc3VwYWJhc2UtcmVzdDozMDAwL3JwYy9ncmFwaHFsXG4gICAgcm91dGVzOlxuICAgICAgLSBuYW1lOiBncmFwaHFsLXYxLWFsbFxuICAgICAgICBzdHJpcF9wYXRoOiB0cnVlXG4gICAgICAgIHBhdGhzOlxuICAgICAgICAgIC0gL2dyYXBocWwvdjFcbiAgICBwbHVnaW5zOlxuICAgICAgLSBuYW1lOiBjb3JzXG4gICAgICAtIG5hbWU6IGtleS1hdXRoXG4gICAgICAgIGNvbmZpZzpcbiAgICAgICAgICBoaWRlX2NyZWRlbnRpYWxzOiB0cnVlXG4gICAgICAtIG5hbWU6IHJlcXVlc3QtdHJhbnNmb3JtZXJcbiAgICAgICAgY29uZmlnOlxuICAgICAgICAgIGFkZDpcbiAgICAgICAgICAgIGhlYWRlcnM6XG4gICAgICAgICAgICAgIC0gQ29udGVudC1Qcm9maWxlOmdyYXBocWxfcHVibGljXG4gICAgICAtIG5hbWU6IGFjbFxuICAgICAgICBjb25maWc6XG4gICAgICAgICAgaGlkZV9ncm91cHNfaGVhZGVyOiB0cnVlXG4gICAgICAgICAgYWxsb3c6XG4gICAgICAgICAgICAtIGFkbWluXG4gICAgICAgICAgICAtIGFub25cblxuICAjIyBTZWN1cmUgUmVhbHRpbWUgcm91dGVzXG4gIC0gbmFtZTogcmVhbHRpbWUtdjEtd3NcbiAgICBfY29tbWVudDogJ1JlYWx0aW1lOiAvcmVhbHRpbWUvdjEvKiAtPiB3czovL3JlYWx0aW1lOjQwMDAvc29ja2V0LyonXG4gICAgdXJsOiBodHRwOi8vcmVhbHRpbWUtZGV2OjQwMDAvc29ja2V0XG4gICAgcHJvdG9jb2w6IHdzXG4gICAgcm91dGVzOlxuICAgICAgLSBuYW1lOiByZWFsdGltZS12MS13c1xuICAgICAgICBzdHJpcF9wYXRoOiB0cnVlXG4gICAgICAgIHBhdGhzOlxuICAgICAgICAgIC0gL3JlYWx0aW1lL3YxL1xuICAgIHBsdWdpbnM6XG4gICAgICAtIG5hbWU6IGNvcnNcbiAgICAgIC0gbmFtZToga2V5LWF1dGhcbiAgICAgICAgY29uZmlnOlxuICAgICAgICAgIGhpZGVfY3JlZGVudGlhbHM6IGZhbHNlXG4gICAgICAtIG5hbWU6IGFjbFxuICAgICAgICBjb25maWc6XG4gICAgICAgICAgaGlkZV9ncm91cHNfaGVhZGVyOiB0cnVlXG4gICAgICAgICAgYWxsb3c6XG4gICAgICAgICAgICAtIGFkbWluXG4gICAgICAgICAgICAtIGFub25cbiAgLSBuYW1lOiByZWFsdGltZS12MS1yZXN0XG4gICAgX2NvbW1lbnQ6ICdSZWFsdGltZTogL3JlYWx0aW1lL3YxLyogLT4gd3M6Ly9yZWFsdGltZTo0MDAwL3NvY2tldC8qJ1xuICAgIHVybDogaHR0cDovL3JlYWx0aW1lLWRldjo0MDAwL2FwaVxuICAgIHByb3RvY29sOiBodHRwXG4gICAgcm91dGVzOlxuICAgICAgLSBuYW1lOiByZWFsdGltZS12MS1yZXN0XG4gICAgICAgIHN0cmlwX3BhdGg6IHRydWVcbiAgICAgICAgcGF0aHM6XG4gICAgICAgICAgLSAvcmVhbHRpbWUvdjEvYXBpXG4gICAgcGx1Z2luczpcbiAgICAgIC0gbmFtZTogY29yc1xuICAgICAgLSBuYW1lOiBrZXktYXV0aFxuICAgICAgICBjb25maWc6XG4gICAgICAgICAgaGlkZV9jcmVkZW50aWFsczogZmFsc2VcbiAgICAgIC0gbmFtZTogYWNsXG4gICAgICAgIGNvbmZpZzpcbiAgICAgICAgICBoaWRlX2dyb3Vwc19oZWFkZXI6IHRydWVcbiAgICAgICAgICBhbGxvdzpcbiAgICAgICAgICAgIC0gYWRtaW5cbiAgICAgICAgICAgIC0gYW5vblxuXG4gICMjIFN0b3JhZ2Ugcm91dGVzOiB0aGUgc3RvcmFnZSBzZXJ2ZXIgbWFuYWdlcyBpdHMgb3duIGF1dGhcbiAgLSBuYW1lOiBzdG9yYWdlLXYxXG4gICAgX2NvbW1lbnQ6ICdTdG9yYWdlOiAvc3RvcmFnZS92MS8qIC0+IGh0dHA6Ly9zdXBhYmFzZS1zdG9yYWdlOjUwMDAvKidcbiAgICB1cmw6IGh0dHA6Ly9zdXBhYmFzZS1zdG9yYWdlOjUwMDAvXG4gICAgcm91dGVzOlxuICAgICAgLSBuYW1lOiBzdG9yYWdlLXYxLWFsbFxuICAgICAgICBzdHJpcF9wYXRoOiB0cnVlXG4gICAgICAgIHBhdGhzOlxuICAgICAgICAgIC0gL3N0b3JhZ2UvdjEvXG4gICAgcGx1Z2luczpcbiAgICAgIC0gbmFtZTogY29yc1xuXG4gICMjIEVkZ2UgRnVuY3Rpb25zIHJvdXRlc1xuICAtIG5hbWU6IGZ1bmN0aW9ucy12MVxuICAgIF9jb21tZW50OiAnRWRnZSBGdW5jdGlvbnM6IC9mdW5jdGlvbnMvdjEvKiAtPiBodHRwOi8vc3VwYWJhc2UtZWRnZS1mdW5jdGlvbnM6OTAwMC8qJ1xuICAgIHVybDogaHR0cDovL3N1cGFiYXNlLWVkZ2UtZnVuY3Rpb25zOjkwMDAvXG4gICAgcm91dGVzOlxuICAgICAgLSBuYW1lOiBmdW5jdGlvbnMtdjEtYWxsXG4gICAgICAgIHN0cmlwX3BhdGg6IHRydWVcbiAgICAgICAgcGF0aHM6XG4gICAgICAgICAgLSAvZnVuY3Rpb25zL3YxL1xuICAgIHBsdWdpbnM6XG4gICAgICAtIG5hbWU6IGNvcnNcblxuICAjIyBBbmFseXRpY3Mgcm91dGVzXG4gIC0gbmFtZTogYW5hbHl0aWNzLXYxXG4gICAgX2NvbW1lbnQ6ICdBbmFseXRpY3M6IC9hbmFseXRpY3MvdjEvKiAtPiBodHRwOi8vbG9nZmxhcmU6NDAwMC8qJ1xuICAgIHVybDogaHR0cDovL3N1cGFiYXNlLWFuYWx5dGljczo0MDAwL1xuICAgIHJvdXRlczpcbiAgICAgIC0gbmFtZTogYW5hbHl0aWNzLXYxLWFsbFxuICAgICAgICBzdHJpcF9wYXRoOiB0cnVlXG4gICAgICAgIHBhdGhzOlxuICAgICAgICAgIC0gL2FuYWx5dGljcy92MS9cblxuICAjIyBTZWN1cmUgRGF0YWJhc2Ugcm91dGVzXG4gIC0gbmFtZTogbWV0YVxuICAgIF9jb21tZW50OiAncGctbWV0YTogL3BnLyogLT4gaHR0cDovL3N1cGFiYXNlLW1ldGE6ODA4MC8qJ1xuICAgIHVybDogaHR0cDovL3N1cGFiYXNlLW1ldGE6ODA4MC9cbiAgICByb3V0ZXM6XG4gICAgICAtIG5hbWU6IG1ldGEtYWxsXG4gICAgICAgIHN0cmlwX3BhdGg6IHRydWVcbiAgICAgICAgcGF0aHM6XG4gICAgICAgICAgLSAvcGcvXG4gICAgcGx1Z2luczpcbiAgICAgIC0gbmFtZToga2V5LWF1dGhcbiAgICAgICAgY29uZmlnOlxuICAgICAgICAgIGhpZGVfY3JlZGVudGlhbHM6IGZhbHNlXG4gICAgICAtIG5hbWU6IGFjbFxuICAgICAgICBjb25maWc6XG4gICAgICAgICAgaGlkZV9ncm91cHNfaGVhZGVyOiB0cnVlXG4gICAgICAgICAgYWxsb3c6XG4gICAgICAgICAgICAtIGFkbWluXG5cbiAgIyMgUHJvdGVjdGVkIERhc2hib2FyZCAtIGNhdGNoIGFsbCByZW1haW5pbmcgcm91dGVzXG4gIC0gbmFtZTogZGFzaGJvYXJkXG4gICAgX2NvbW1lbnQ6ICdTdHVkaW86IC8qIC0+IGh0dHA6Ly9zdHVkaW86MzAwMC8qJ1xuICAgIHVybDogaHR0cDovL3N1cGFiYXNlLXN0dWRpbzozMDAwL1xuICAgIHJvdXRlczpcbiAgICAgIC0gbmFtZTogZGFzaGJvYXJkLWFsbFxuICAgICAgICBzdHJpcF9wYXRoOiB0cnVlXG4gICAgICAgIHBhdGhzOlxuICAgICAgICAgIC0gL1xuICAgIHBsdWdpbnM6XG4gICAgICAtIG5hbWU6IGNvcnNcbiAgICAgIC0gbmFtZTogYmFzaWMtYXV0aFxuICAgICAgICBjb25maWc6XG4gICAgICAgICAgaGlkZV9jcmVkZW50aWFsczogdHJ1ZVxuIgogIHN1cGFiYXNlLXN0dWRpbzoKICAgIGltYWdlOiAnc3VwYWJhc2Uvc3R1ZGlvOjIwMjUuMDYuMDItc2hhLThmMjk5M2QnCiAgICBoZWFsdGhjaGVjazoKICAgICAgdGVzdDoKICAgICAgICAtIENNRAogICAgICAgIC0gbm9kZQogICAgICAgIC0gJy1lJwogICAgICAgIC0gImZldGNoKCdodHRwOi8vMTI3LjAuMC4xOjMwMDAvYXBpL3BsYXRmb3JtL3Byb2ZpbGUnKS50aGVuKChyKSA9PiB7aWYgKHIuc3RhdHVzICE9PSAyMDApIHRocm93IG5ldyBFcnJvcihyLnN0YXR1cyl9KSIKICAgICAgdGltZW91dDogNXMKICAgICAgaW50ZXJ2YWw6IDVzCiAgICAgIHJldHJpZXM6IDMKICAgIGRlcGVuZHNfb246CiAgICAgIHN1cGFiYXNlLWFuYWx5dGljczoKICAgICAgICBjb25kaXRpb246IHNlcnZpY2VfaGVhbHRoeQogICAgZW52aXJvbm1lbnQ6CiAgICAgIC0gSE9TVE5BTUU9MC4wLjAuMAogICAgICAtICdTVFVESU9fUEdfTUVUQV9VUkw9aHR0cDovL3N1cGFiYXNlLW1ldGE6ODA4MCcKICAgICAgLSAnUE9TVEdSRVNfUEFTU1dPUkQ9JHtTRVJWSUNFX1BBU1NXT1JEX1BPU1RHUkVTfScKICAgICAgLSAnREVGQVVMVF9PUkdBTklaQVRJT05fTkFNRT0ke1NUVURJT19ERUZBVUxUX09SR0FOSVpBVElPTjotRGVmYXVsdCBPcmdhbml6YXRpb259JwogICAgICAtICdERUZBVUxUX1BST0pFQ1RfTkFNRT0ke1NUVURJT19ERUZBVUxUX1BST0pFQ1Q6LURlZmF1bHQgUHJvamVjdH0nCiAgICAgIC0gJ1NVUEFCQVNFX1VSTD1odHRwOi8vc3VwYWJhc2Uta29uZzo4MDAwJwogICAgICAtICdTVVBBQkFTRV9QVUJMSUNfVVJMPSR7U0VSVklDRV9GUUROX1NVUEFCQVNFS09OR30nCiAgICAgIC0gJ1NVUEFCQVNFX0FOT05fS0VZPSR7U0VSVklDRV9TVVBBQkFTRUFOT05fS0VZfScKICAgICAgLSAnU1VQQUJBU0VfU0VSVklDRV9LRVk9JHtTRVJWSUNFX1NVUEFCQVNFU0VSVklDRV9LRVl9JwogICAgICAtICdBVVRIX0pXVF9TRUNSRVQ9JHtTRVJWSUNFX1BBU1NXT1JEX0pXVH0nCiAgICAgIC0gJ0xPR0ZMQVJFX0FQSV9LRVk9JHtTRVJWSUNFX1BBU1NXT1JEX0xPR0ZMQVJFfScKICAgICAgLSAnTE9HRkxBUkVfVVJMPWh0dHA6Ly9zdXBhYmFzZS1hbmFseXRpY3M6NDAwMCcKICAgICAgLSAnU1VQQUJBU0VfUFVCTElDX0FQST0ke1NFUlZJQ0VfRlFETl9TVVBBQkFTRUtPTkd9JwogICAgICAtIE5FWFRfUFVCTElDX0VOQUJMRV9MT0dTPXRydWUKICAgICAgLSBORVhUX0FOQUxZVElDU19CQUNLRU5EX1BST1ZJREVSPXBvc3RncmVzCiAgICAgIC0gJ09QRU5BSV9BUElfS0VZPSR7T1BFTkFJX0FQSV9LRVl9JwogIHN1cGFiYXNlLWRiOgogICAgaW1hZ2U6ICdzdXBhYmFzZS9wb3N0Z3JlczoxNS44LjEuMDQ4JwogICAgaGVhbHRoY2hlY2s6CiAgICAgIHRlc3Q6ICdwZ19pc3JlYWR5IC1VIHBvc3RncmVzIC1oIDEyNy4wLjAuMScKICAgICAgaW50ZXJ2YWw6IDVzCiAgICAgIHRpbWVvdXQ6IDVzCiAgICAgIHJldHJpZXM6IDEwCiAgICBkZXBlbmRzX29uOgogICAgICBzdXBhYmFzZS12ZWN0b3I6CiAgICAgICAgY29uZGl0aW9uOiBzZXJ2aWNlX2hlYWx0aHkKICAgIGNvbW1hbmQ6CiAgICAgIC0gcG9zdGdyZXMKICAgICAgLSAnLWMnCiAgICAgIC0gY29uZmlnX2ZpbGU9L2V0Yy9wb3N0Z3Jlc3FsL3Bvc3RncmVzcWwuY29uZgogICAgICAtICctYycKICAgICAgLSBsb2dfbWluX21lc3NhZ2VzPWZhdGFsCiAgICBlbnZpcm9ubWVudDoKICAgICAgLSBQT1NUR1JFU19IT1NUPS92YXIvcnVuL3Bvc3RncmVzcWwKICAgICAgLSAnUEdQT1JUPSR7UE9TVEdSRVNfUE9SVDotNTQzMn0nCiAgICAgIC0gJ1BPU1RHUkVTX1BPUlQ9JHtQT1NUR1JFU19QT1JUOi01NDMyfScKICAgICAgLSAnUEdQQVNTV09SRD0ke1NFUlZJQ0VfUEFTU1dPUkRfUE9TVEdSRVN9JwogICAgICAtICdQT1NUR1JFU19QQVNTV09SRD0ke1NFUlZJQ0VfUEFTU1dPUkRfUE9TVEdSRVN9JwogICAgICAtICdQR0RBVEFCQVNFPSR7UE9TVEdSRVNfREI6LXBvc3RncmVzfScKICAgICAgLSAnUE9TVEdSRVNfREI9JHtQT1NUR1JFU19EQjotcG9zdGdyZXN9JwogICAgICAtICdKV1RfU0VDUkVUPSR7U0VSVklDRV9QQVNTV09SRF9KV1R9JwogICAgICAtICdKV1RfRVhQPSR7SldUX0VYUElSWTotMzYwMH0nCiAgICB2b2x1bWVzOgogICAgICAtICdzdXBhYmFzZS1kYi1kYXRhOi92YXIvbGliL3Bvc3RncmVzcWwvZGF0YScKICAgICAgLQogICAgICAgIHR5cGU6IGJpbmQKICAgICAgICBzb3VyY2U6IC4vdm9sdW1lcy9kYi9yZWFsdGltZS5zcWwKICAgICAgICB0YXJnZXQ6IC9kb2NrZXItZW50cnlwb2ludC1pbml0ZGIuZC9taWdyYXRpb25zLzk5LXJlYWx0aW1lLnNxbAogICAgICAgIGNvbnRlbnQ6ICJcXHNldCBwZ3VzZXIgYGVjaG8gXCJzdXBhYmFzZV9hZG1pblwiYFxuXG5jcmVhdGUgc2NoZW1hIGlmIG5vdCBleGlzdHMgX3JlYWx0aW1lO1xuYWx0ZXIgc2NoZW1hIF9yZWFsdGltZSBvd25lciB0byA6cGd1c2VyO1xuIgogICAgICAtCiAgICAgICAgdHlwZTogYmluZAogICAgICAgIHNvdXJjZTogLi92b2x1bWVzL2RiL19zdXBhYmFzZS5zcWwKICAgICAgICB0YXJnZXQ6IC9kb2NrZXItZW50cnlwb2ludC1pbml0ZGIuZC9taWdyYXRpb25zLzk3LV9zdXBhYmFzZS5zcWwKICAgICAgICBjb250ZW50OiAiXFxzZXQgcGd1c2VyIGBlY2hvIFwiJFBPU1RHUkVTX1VTRVJcImBcblxuQ1JFQVRFIERBVEFCQVNFIF9zdXBhYmFzZSBXSVRIIE9XTkVSIDpwZ3VzZXI7XG4iCiAgICAgIC0KICAgICAgICB0eXBlOiBiaW5kCiAgICAgICAgc291cmNlOiAuL3ZvbHVtZXMvZGIvcG9vbGVyLnNxbAogICAgICAgIHRhcmdldDogL2RvY2tlci1lbnRyeXBvaW50LWluaXRkYi5kL21pZ3JhdGlvbnMvOTktcG9vbGVyLnNxbAogICAgICAgIGNvbnRlbnQ6ICJcXHNldCBwZ3VzZXIgYGVjaG8gXCJzdXBhYmFzZV9hZG1pblwiYFxuXFxjIF9zdXBhYmFzZVxuY3JlYXRlIHNjaGVtYSBpZiBub3QgZXhpc3RzIF9zdXBhdmlzb3I7XG5hbHRlciBzY2hlbWEgX3N1cGF2aXNvciBvd25lciB0byA6cGd1c2VyO1xuXFxjIHBvc3RncmVzXG4iCiAgICAgIC0KICAgICAgICB0eXBlOiBiaW5kCiAgICAgICAgc291cmNlOiAuL3ZvbHVtZXMvZGIvd2ViaG9va3Muc3FsCiAgICAgICAgdGFyZ2V0OiAvZG9ja2VyLWVudHJ5cG9pbnQtaW5pdGRiLmQvaW5pdC1zY3JpcHRzLzk4LXdlYmhvb2tzLnNxbAogICAgICAgIGNvbnRlbnQ6ICJCRUdJTjtcbi0tIENyZWF0ZSBwZ19uZXQgZXh0ZW5zaW9uXG5DUkVBVEUgRVhURU5TSU9OIElGIE5PVCBFWElTVFMgcGdfbmV0IFNDSEVNQSBleHRlbnNpb25zO1xuLS0gQ3JlYXRlIHN1cGFiYXNlX2Z1bmN0aW9ucyBzY2hlbWFcbkNSRUFURSBTQ0hFTUEgc3VwYWJhc2VfZnVuY3Rpb25zIEFVVEhPUklaQVRJT04gc3VwYWJhc2VfYWRtaW47XG5HUkFOVCBVU0FHRSBPTiBTQ0hFTUEgc3VwYWJhc2VfZnVuY3Rpb25zIFRPIHBvc3RncmVzLCBhbm9uLCBhdXRoZW50aWNhdGVkLCBzZXJ2aWNlX3JvbGU7XG5BTFRFUiBERUZBVUxUIFBSSVZJTEVHRVMgSU4gU0NIRU1BIHN1cGFiYXNlX2Z1bmN0aW9ucyBHUkFOVCBBTEwgT04gVEFCTEVTIFRPIHBvc3RncmVzLCBhbm9uLCBhdXRoZW50aWNhdGVkLCBzZXJ2aWNlX3JvbGU7XG5BTFRFUiBERUZBVUxUIFBSSVZJTEVHRVMgSU4gU0NIRU1BIHN1cGFiYXNlX2Z1bmN0aW9ucyBHUkFOVCBBTEwgT04gRlVOQ1RJT05TIFRPIHBvc3RncmVzLCBhbm9uLCBhdXRoZW50aWNhdGVkLCBzZXJ2aWNlX3JvbGU7XG5BTFRFUiBERUZBVUxUIFBSSVZJTEVHRVMgSU4gU0NIRU1BIHN1cGFiYXNlX2Z1bmN0aW9ucyBHUkFOVCBBTEwgT04gU0VRVUVOQ0VTIFRPIHBvc3RncmVzLCBhbm9uLCBhdXRoZW50aWNhdGVkLCBzZXJ2aWNlX3JvbGU7XG4tLSBzdXBhYmFzZV9mdW5jdGlvbnMubWlncmF0aW9ucyBkZWZpbml0aW9uXG5DUkVBVEUgVEFCTEUgc3VwYWJhc2VfZnVuY3Rpb25zLm1pZ3JhdGlvbnMgKFxuICB2ZXJzaW9uIHRleHQgUFJJTUFSWSBLRVksXG4gIGluc2VydGVkX2F0IHRpbWVzdGFtcHR6IE5PVCBOVUxMIERFRkFVTFQgTk9XKClcbik7XG4tLSBJbml0aWFsIHN1cGFiYXNlX2Z1bmN0aW9ucyBtaWdyYXRpb25cbklOU0VSVCBJTlRPIHN1cGFiYXNlX2Z1bmN0aW9ucy5taWdyYXRpb25zICh2ZXJzaW9uKSBWQUxVRVMgKCdpbml0aWFsJyk7XG4tLSBzdXBhYmFzZV9mdW5jdGlvbnMuaG9va3MgZGVmaW5pdGlvblxuQ1JFQVRFIFRBQkxFIHN1cGFiYXNlX2Z1bmN0aW9ucy5ob29rcyAoXG4gIGlkIGJpZ3NlcmlhbCBQUklNQVJZIEtFWSxcbiAgaG9va190YWJsZV9pZCBpbnRlZ2VyIE5PVCBOVUxMLFxuICBob29rX25hbWUgdGV4dCBOT1QgTlVMTCxcbiAgY3JlYXRlZF9hdCB0aW1lc3RhbXB0eiBOT1QgTlVMTCBERUZBVUxUIE5PVygpLFxuICByZXF1ZXN0X2lkIGJpZ2ludFxuKTtcbkNSRUFURSBJTkRFWCBzdXBhYmFzZV9mdW5jdGlvbnNfaG9va3NfcmVxdWVzdF9pZF9pZHggT04gc3VwYWJhc2VfZnVuY3Rpb25zLmhvb2tzIFVTSU5HIGJ0cmVlIChyZXF1ZXN0X2lkKTtcbkNSRUFURSBJTkRFWCBzdXBhYmFzZV9mdW5jdGlvbnNfaG9va3NfaF90YWJsZV9pZF9oX25hbWVfaWR4IE9OIHN1cGFiYXNlX2Z1bmN0aW9ucy5ob29rcyBVU0lORyBidHJlZSAoaG9va190YWJsZV9pZCwgaG9va19uYW1lKTtcbkNPTU1FTlQgT04gVEFCTEUgc3VwYWJhc2VfZnVuY3Rpb25zLmhvb2tzIElTICdTdXBhYmFzZSBGdW5jdGlvbnMgSG9va3M6IEF1ZGl0IHRyYWlsIGZvciB0cmlnZ2VyZWQgaG9va3MuJztcbkNSRUFURSBGVU5DVElPTiBzdXBhYmFzZV9mdW5jdGlvbnMuaHR0cF9yZXF1ZXN0KClcbiAgUkVUVVJOUyB0cmlnZ2VyXG4gIExBTkdVQUdFIHBscGdzcWxcbiAgQVMgJGZ1bmN0aW9uJFxuICBERUNMQVJFXG4gICAgcmVxdWVzdF9pZCBiaWdpbnQ7XG4gICAgcGF5bG9hZCBqc29uYjtcbiAgICB1cmwgdGV4dCA6PSBUR19BUkdWWzBdOjp0ZXh0O1xuICAgIG1ldGhvZCB0ZXh0IDo9IFRHX0FSR1ZbMV06OnRleHQ7XG4gICAgaGVhZGVycyBqc29uYiBERUZBVUxUICd7fSc6Ompzb25iO1xuICAgIHBhcmFtcyBqc29uYiBERUZBVUxUICd7fSc6Ompzb25iO1xuICAgIHRpbWVvdXRfbXMgaW50ZWdlciBERUZBVUxUIDEwMDA7XG4gIEJFR0lOXG4gICAgSUYgdXJsIElTIE5VTEwgT1IgdXJsID0gJ251bGwnIFRIRU5cbiAgICAgIFJBSVNFIEVYQ0VQVElPTiAndXJsIGFyZ3VtZW50IGlzIG1pc3NpbmcnO1xuICAgIEVORCBJRjtcblxuICAgIElGIG1ldGhvZCBJUyBOVUxMIE9SIG1ldGhvZCA9ICdudWxsJyBUSEVOXG4gICAgICBSQUlTRSBFWENFUFRJT04gJ21ldGhvZCBhcmd1bWVudCBpcyBtaXNzaW5nJztcbiAgICBFTkQgSUY7XG5cbiAgICBJRiBUR19BUkdWWzJdIElTIE5VTEwgT1IgVEdfQVJHVlsyXSA9ICdudWxsJyBUSEVOXG4gICAgICBoZWFkZXJzID0gJ3tcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIn0nOjpqc29uYjtcbiAgICBFTFNFXG4gICAgICBoZWFkZXJzID0gVEdfQVJHVlsyXTo6anNvbmI7XG4gICAgRU5EIElGO1xuXG4gICAgSUYgVEdfQVJHVlszXSBJUyBOVUxMIE9SIFRHX0FSR1ZbM10gPSAnbnVsbCcgVEhFTlxuICAgICAgcGFyYW1zID0gJ3t9Jzo6anNvbmI7XG4gICAgRUxTRVxuICAgICAgcGFyYW1zID0gVEdfQVJHVlszXTo6anNvbmI7XG4gICAgRU5EIElGO1xuXG4gICAgSUYgVEdfQVJHVls0XSBJUyBOVUxMIE9SIFRHX0FSR1ZbNF0gPSAnbnVsbCcgVEhFTlxuICAgICAgdGltZW91dF9tcyA9IDEwMDA7XG4gICAgRUxTRVxuICAgICAgdGltZW91dF9tcyA9IFRHX0FSR1ZbNF06OmludGVnZXI7XG4gICAgRU5EIElGO1xuXG4gICAgQ0FTRVxuICAgICAgV0hFTiBtZXRob2QgPSAnR0VUJyBUSEVOXG4gICAgICAgIFNFTEVDVCBodHRwX2dldCBJTlRPIHJlcXVlc3RfaWQgRlJPTSBuZXQuaHR0cF9nZXQoXG4gICAgICAgICAgdXJsLFxuICAgICAgICAgIHBhcmFtcyxcbiAgICAgICAgICBoZWFkZXJzLFxuICAgICAgICAgIHRpbWVvdXRfbXNcbiAgICAgICAgKTtcbiAgICAgIFdIRU4gbWV0aG9kID0gJ1BPU1QnIFRIRU5cbiAgICAgICAgcGF5bG9hZCA9IGpzb25iX2J1aWxkX29iamVjdChcbiAgICAgICAgICAnb2xkX3JlY29yZCcsIE9MRCxcbiAgICAgICAgICAncmVjb3JkJywgTkVXLFxuICAgICAgICAgICd0eXBlJywgVEdfT1AsXG4gICAgICAgICAgJ3RhYmxlJywgVEdfVEFCTEVfTkFNRSxcbiAgICAgICAgICAnc2NoZW1hJywgVEdfVEFCTEVfU0NIRU1BXG4gICAgICAgICk7XG5cbiAgICAgICAgU0VMRUNUIGh0dHBfcG9zdCBJTlRPIHJlcXVlc3RfaWQgRlJPTSBuZXQuaHR0cF9wb3N0KFxuICAgICAgICAgIHVybCxcbiAgICAgICAgICBwYXlsb2FkLFxuICAgICAgICAgIHBhcmFtcyxcbiAgICAgICAgICBoZWFkZXJzLFxuICAgICAgICAgIHRpbWVvdXRfbXNcbiAgICAgICAgKTtcbiAgICAgIEVMU0VcbiAgICAgICAgUkFJU0UgRVhDRVBUSU9OICdtZXRob2QgYXJndW1lbnQgJSBpcyBpbnZhbGlkJywgbWV0aG9kO1xuICAgIEVORCBDQVNFO1xuXG4gICAgSU5TRVJUIElOVE8gc3VwYWJhc2VfZnVuY3Rpb25zLmhvb2tzXG4gICAgICAoaG9va190YWJsZV9pZCwgaG9va19uYW1lLCByZXF1ZXN0X2lkKVxuICAgIFZBTFVFU1xuICAgICAgKFRHX1JFTElELCBUR19OQU1FLCByZXF1ZXN0X2lkKTtcblxuICAgIFJFVFVSTiBORVc7XG4gIEVORFxuJGZ1bmN0aW9uJDtcbi0tIFN1cGFiYXNlIHN1cGVyIGFkbWluXG5ET1xuJCRcbkJFR0lOXG4gIElGIE5PVCBFWElTVFMgKFxuICAgIFNFTEVDVCAxXG4gICAgRlJPTSBwZ19yb2xlc1xuICAgIFdIRVJFIHJvbG5hbWUgPSAnc3VwYWJhc2VfZnVuY3Rpb25zX2FkbWluJ1xuICApXG4gIFRIRU5cbiAgICBDUkVBVEUgVVNFUiBzdXBhYmFzZV9mdW5jdGlvbnNfYWRtaW4gTk9JTkhFUklUIENSRUFURVJPTEUgTE9HSU4gTk9SRVBMSUNBVElPTjtcbiAgRU5EIElGO1xuRU5EXG4kJDtcbkdSQU5UIEFMTCBQUklWSUxFR0VTIE9OIFNDSEVNQSBzdXBhYmFzZV9mdW5jdGlvbnMgVE8gc3VwYWJhc2VfZnVuY3Rpb25zX2FkbWluO1xuR1JBTlQgQUxMIFBSSVZJTEVHRVMgT04gQUxMIFRBQkxFUyBJTiBTQ0hFTUEgc3VwYWJhc2VfZnVuY3Rpb25zIFRPIHN1cGFiYXNlX2Z1bmN0aW9uc19hZG1pbjtcbkdSQU5UIEFMTCBQUklWSUxFR0VTIE9OIEFMTCBTRVFVRU5DRVMgSU4gU0NIRU1BIHN1cGFiYXNlX2Z1bmN0aW9ucyBUTyBzdXBhYmFzZV9mdW5jdGlvbnNfYWRtaW47XG5BTFRFUiBVU0VSIHN1cGFiYXNlX2Z1bmN0aW9uc19hZG1pbiBTRVQgc2VhcmNoX3BhdGggPSBcInN1cGFiYXNlX2Z1bmN0aW9uc1wiO1xuQUxURVIgdGFibGUgXCJzdXBhYmFzZV9mdW5jdGlvbnNcIi5taWdyYXRpb25zIE9XTkVSIFRPIHN1cGFiYXNlX2Z1bmN0aW9uc19hZG1pbjtcbkFMVEVSIHRhYmxlIFwic3VwYWJhc2VfZnVuY3Rpb25zXCIuaG9va3MgT1dORVIgVE8gc3VwYWJhc2VfZnVuY3Rpb25zX2FkbWluO1xuQUxURVIgZnVuY3Rpb24gXCJzdXBhYmFzZV9mdW5jdGlvbnNcIi5odHRwX3JlcXVlc3QoKSBPV05FUiBUTyBzdXBhYmFzZV9mdW5jdGlvbnNfYWRtaW47XG5HUkFOVCBzdXBhYmFzZV9mdW5jdGlvbnNfYWRtaW4gVE8gcG9zdGdyZXM7XG4tLSBSZW1vdmUgdW51c2VkIHN1cGFiYXNlX3BnX25ldF9hZG1pbiByb2xlXG5ET1xuJCRcbkJFR0lOXG4gIElGIEVYSVNUUyAoXG4gICAgU0VMRUNUIDFcbiAgICBGUk9NIHBnX3JvbGVzXG4gICAgV0hFUkUgcm9sbmFtZSA9ICdzdXBhYmFzZV9wZ19uZXRfYWRtaW4nXG4gIClcbiAgVEhFTlxuICAgIFJFQVNTSUdOIE9XTkVEIEJZIHN1cGFiYXNlX3BnX25ldF9hZG1pbiBUTyBzdXBhYmFzZV9hZG1pbjtcbiAgICBEUk9QIE9XTkVEIEJZIHN1cGFiYXNlX3BnX25ldF9hZG1pbjtcbiAgICBEUk9QIFJPTEUgc3VwYWJhc2VfcGdfbmV0X2FkbWluO1xuICBFTkQgSUY7XG5FTkRcbiQkO1xuLS0gcGdfbmV0IGdyYW50cyB3aGVuIGV4dGVuc2lvbiBpcyBhbHJlYWR5IGVuYWJsZWRcbkRPXG4kJFxuQkVHSU5cbiAgSUYgRVhJU1RTIChcbiAgICBTRUxFQ1QgMVxuICAgIEZST00gcGdfZXh0ZW5zaW9uXG4gICAgV0hFUkUgZXh0bmFtZSA9ICdwZ19uZXQnXG4gIClcbiAgVEhFTlxuICAgIEdSQU5UIFVTQUdFIE9OIFNDSEVNQSBuZXQgVE8gc3VwYWJhc2VfZnVuY3Rpb25zX2FkbWluLCBwb3N0Z3JlcywgYW5vbiwgYXV0aGVudGljYXRlZCwgc2VydmljZV9yb2xlO1xuICAgIEFMVEVSIGZ1bmN0aW9uIG5ldC5odHRwX2dldCh1cmwgdGV4dCwgcGFyYW1zIGpzb25iLCBoZWFkZXJzIGpzb25iLCB0aW1lb3V0X21pbGxpc2Vjb25kcyBpbnRlZ2VyKSBTRUNVUklUWSBERUZJTkVSO1xuICAgIEFMVEVSIGZ1bmN0aW9uIG5ldC5odHRwX3Bvc3QodXJsIHRleHQsIGJvZHkganNvbmIsIHBhcmFtcyBqc29uYiwgaGVhZGVycyBqc29uYiwgdGltZW91dF9taWxsaXNlY29uZHMgaW50ZWdlcikgU0VDVVJJVFkgREVGSU5FUjtcbiAgICBBTFRFUiBmdW5jdGlvbiBuZXQuaHR0cF9nZXQodXJsIHRleHQsIHBhcmFtcyBqc29uYiwgaGVhZGVycyBqc29uYiwgdGltZW91dF9taWxsaXNlY29uZHMgaW50ZWdlcikgU0VUIHNlYXJjaF9wYXRoID0gbmV0O1xuICAgIEFMVEVSIGZ1bmN0aW9uIG5ldC5odHRwX3Bvc3QodXJsIHRleHQsIGJvZHkganNvbmIsIHBhcmFtcyBqc29uYiwgaGVhZGVycyBqc29uYiwgdGltZW91dF9taWxsaXNlY29uZHMgaW50ZWdlcikgU0VUIHNlYXJjaF9wYXRoID0gbmV0O1xuICAgIFJFVk9LRSBBTEwgT04gRlVOQ1RJT04gbmV0Lmh0dHBfZ2V0KHVybCB0ZXh0LCBwYXJhbXMganNvbmIsIGhlYWRlcnMganNvbmIsIHRpbWVvdXRfbWlsbGlzZWNvbmRzIGludGVnZXIpIEZST00gUFVCTElDO1xuICAgIFJFVk9LRSBBTEwgT04gRlVOQ1RJT04gbmV0Lmh0dHBfcG9zdCh1cmwgdGV4dCwgYm9keSBqc29uYiwgcGFyYW1zIGpzb25iLCBoZWFkZXJzIGpzb25iLCB0aW1lb3V0X21pbGxpc2Vjb25kcyBpbnRlZ2VyKSBGUk9NIFBVQkxJQztcbiAgICBHUkFOVCBFWEVDVVRFIE9OIEZVTkNUSU9OIG5ldC5odHRwX2dldCh1cmwgdGV4dCwgcGFyYW1zIGpzb25iLCBoZWFkZXJzIGpzb25iLCB0aW1lb3V0X21pbGxpc2Vjb25kcyBpbnRlZ2VyKSBUTyBzdXBhYmFzZV9mdW5jdGlvbnNfYWRtaW4sIHBvc3RncmVzLCBhbm9uLCBhdXRoZW50aWNhdGVkLCBzZXJ2aWNlX3JvbGU7XG4gICAgR1JBTlQgRVhFQ1VURSBPTiBGVU5DVElPTiBuZXQuaHR0cF9wb3N0KHVybCB0ZXh0LCBib2R5IGpzb25iLCBwYXJhbXMganNvbmIsIGhlYWRlcnMganNvbmIsIHRpbWVvdXRfbWlsbGlzZWNvbmRzIGludGVnZXIpIFRPIHN1cGFiYXNlX2Z1bmN0aW9uc19hZG1pbiwgcG9zdGdyZXMsIGFub24sIGF1dGhlbnRpY2F0ZWQsIHNlcnZpY2Vfcm9sZTtcbiAgRU5EIElGO1xuRU5EXG4kJDtcbi0tIEV2ZW50IHRyaWdnZXIgZm9yIHBnX25ldFxuQ1JFQVRFIE9SIFJFUExBQ0UgRlVOQ1RJT04gZXh0ZW5zaW9ucy5ncmFudF9wZ19uZXRfYWNjZXNzKClcblJFVFVSTlMgZXZlbnRfdHJpZ2dlclxuTEFOR1VBR0UgcGxwZ3NxbFxuQVMgJCRcbkJFR0lOXG4gIElGIEVYSVNUUyAoXG4gICAgU0VMRUNUIDFcbiAgICBGUk9NIHBnX2V2ZW50X3RyaWdnZXJfZGRsX2NvbW1hbmRzKCkgQVMgZXZcbiAgICBKT0lOIHBnX2V4dGVuc2lvbiBBUyBleHRcbiAgICBPTiBldi5vYmppZCA9IGV4dC5vaWRcbiAgICBXSEVSRSBleHQuZXh0bmFtZSA9ICdwZ19uZXQnXG4gIClcbiAgVEhFTlxuICAgIEdSQU5UIFVTQUdFIE9OIFNDSEVNQSBuZXQgVE8gc3VwYWJhc2VfZnVuY3Rpb25zX2FkbWluLCBwb3N0Z3JlcywgYW5vbiwgYXV0aGVudGljYXRlZCwgc2VydmljZV9yb2xlO1xuICAgIEFMVEVSIGZ1bmN0aW9uIG5ldC5odHRwX2dldCh1cmwgdGV4dCwgcGFyYW1zIGpzb25iLCBoZWFkZXJzIGpzb25iLCB0aW1lb3V0X21pbGxpc2Vjb25kcyBpbnRlZ2VyKSBTRUNVUklUWSBERUZJTkVSO1xuICAgIEFMVEVSIGZ1bmN0aW9uIG5ldC5odHRwX3Bvc3QodXJsIHRleHQsIGJvZHkganNvbmIsIHBhcmFtcyBqc29uYiwgaGVhZGVycyBqc29uYiwgdGltZW91dF9taWxsaXNlY29uZHMgaW50ZWdlcikgU0VDVVJJVFkgREVGSU5FUjtcbiAgICBBTFRFUiBmdW5jdGlvbiBuZXQuaHR0cF9nZXQodXJsIHRleHQsIHBhcmFtcyBqc29uYiwgaGVhZGVycyBqc29uYiwgdGltZW91dF9taWxsaXNlY29uZHMgaW50ZWdlcikgU0VUIHNlYXJjaF9wYXRoID0gbmV0O1xuICAgIEFMVEVSIGZ1bmN0aW9uIG5ldC5odHRwX3Bvc3QodXJsIHRleHQsIGJvZHkganNvbmIsIHBhcmFtcyBqc29uYiwgaGVhZGVycyBqc29uYiwgdGltZW91dF9taWxsaXNlY29uZHMgaW50ZWdlcikgU0VUIHNlYXJjaF9wYXRoID0gbmV0O1xuICAgIFJFVk9LRSBBTEwgT04gRlVOQ1RJT04gbmV0Lmh0dHBfZ2V0KHVybCB0ZXh0LCBwYXJhbXMganNvbmIsIGhlYWRlcnMganNvbmIsIHRpbWVvdXRfbWlsbGlzZWNvbmRzIGludGVnZXIpIEZST00gUFVCTElDO1xuICAgIFJFVk9LRSBBTEwgT04gRlVOQ1RJT04gbmV0Lmh0dHBfcG9zdCh1cmwgdGV4dCwgYm9keSBqc29uYiwgcGFyYW1zIGpzb25iLCBoZWFkZXJzIGpzb25iLCB0aW1lb3V0X21pbGxpc2Vjb25kcyBpbnRlZ2VyKSBGUk9NIFBVQkxJQztcbiAgICBHUkFOVCBFWEVDVVRFIE9OIEZVTkNUSU9OIG5ldC5odHRwX2dldCh1cmwgdGV4dCwgcGFyYW1zIGpzb25iLCBoZWFkZXJzIGpzb25iLCB0aW1lb3V0X21pbGxpc2Vjb25kcyBpbnRlZ2VyKSBUTyBzdXBhYmFzZV9mdW5jdGlvbnNfYWRtaW4sIHBvc3RncmVzLCBhbm9uLCBhdXRoZW50aWNhdGVkLCBzZXJ2aWNlX3JvbGU7XG4gICAgR1JBTlQgRVhFQ1VURSBPTiBGVU5DVElPTiBuZXQuaHR0cF9wb3N0KHVybCB0ZXh0LCBib2R5IGpzb25iLCBwYXJhbXMganNvbmIsIGhlYWRlcnMganNvbmIsIHRpbWVvdXRfbWlsbGlzZWNvbmRzIGludGVnZXIpIFRPIHN1cGFiYXNlX2Z1bmN0aW9uc19hZG1pbiwgcG9zdGdyZXMsIGFub24sIGF1dGhlbnRpY2F0ZWQsIHNlcnZpY2Vfcm9sZTtcbiAgRU5EIElGO1xuRU5EO1xuJCQ7XG5DT01NRU5UIE9OIEZVTkNUSU9OIGV4dGVuc2lvbnMuZ3JhbnRfcGdfbmV0X2FjY2VzcyBJUyAnR3JhbnRzIGFjY2VzcyB0byBwZ19uZXQnO1xuRE9cbiQkXG5CRUdJTlxuICBJRiBOT1QgRVhJU1RTIChcbiAgICBTRUxFQ1QgMVxuICAgIEZST00gcGdfZXZlbnRfdHJpZ2dlclxuICAgIFdIRVJFIGV2dG5hbWUgPSAnaXNzdWVfcGdfbmV0X2FjY2VzcydcbiAgKSBUSEVOXG4gICAgQ1JFQVRFIEVWRU5UIFRSSUdHRVIgaXNzdWVfcGdfbmV0X2FjY2VzcyBPTiBkZGxfY29tbWFuZF9lbmQgV0hFTiBUQUcgSU4gKCdDUkVBVEUgRVhURU5TSU9OJylcbiAgICBFWEVDVVRFIFBST0NFRFVSRSBleHRlbnNpb25zLmdyYW50X3BnX25ldF9hY2Nlc3MoKTtcbiAgRU5EIElGO1xuRU5EXG4kJDtcbklOU0VSVCBJTlRPIHN1cGFiYXNlX2Z1bmN0aW9ucy5taWdyYXRpb25zICh2ZXJzaW9uKSBWQUxVRVMgKCcyMDIxMDgwOTE4MzQyM191cGRhdGVfZ3JhbnRzJyk7XG5BTFRFUiBmdW5jdGlvbiBzdXBhYmFzZV9mdW5jdGlvbnMuaHR0cF9yZXF1ZXN0KCkgU0VDVVJJVFkgREVGSU5FUjtcbkFMVEVSIGZ1bmN0aW9uIHN1cGFiYXNlX2Z1bmN0aW9ucy5odHRwX3JlcXVlc3QoKSBTRVQgc2VhcmNoX3BhdGggPSBzdXBhYmFzZV9mdW5jdGlvbnM7XG5SRVZPS0UgQUxMIE9OIEZVTkNUSU9OIHN1cGFiYXNlX2Z1bmN0aW9ucy5odHRwX3JlcXVlc3QoKSBGUk9NIFBVQkxJQztcbkdSQU5UIEVYRUNVVEUgT04gRlVOQ1RJT04gc3VwYWJhc2VfZnVuY3Rpb25zLmh0dHBfcmVxdWVzdCgpIFRPIHBvc3RncmVzLCBhbm9uLCBhdXRoZW50aWNhdGVkLCBzZXJ2aWNlX3JvbGU7XG5DT01NSVQ7XG4iCiAgICAgIC0KICAgICAgICB0eXBlOiBiaW5kCiAgICAgICAgc291cmNlOiAuL3ZvbHVtZXMvZGIvcm9sZXMuc3FsCiAgICAgICAgdGFyZ2V0OiAvZG9ja2VyLWVudHJ5cG9pbnQtaW5pdGRiLmQvaW5pdC1zY3JpcHRzLzk5LXJvbGVzLnNxbAogICAgICAgIGNvbnRlbnQ6ICItLSBOT1RFOiBjaGFuZ2UgdG8geW91ciBvd24gcGFzc3dvcmRzIGZvciBwcm9kdWN0aW9uIGVudmlyb25tZW50c1xuIFxcc2V0IHBncGFzcyBgZWNobyBcIiRQT1NUR1JFU19QQVNTV09SRFwiYFxuXG4gQUxURVIgVVNFUiBhdXRoZW50aWNhdG9yIFdJVEggUEFTU1dPUkQgOidwZ3Bhc3MnO1xuIEFMVEVSIFVTRVIgcGdib3VuY2VyIFdJVEggUEFTU1dPUkQgOidwZ3Bhc3MnO1xuIEFMVEVSIFVTRVIgc3VwYWJhc2VfYXV0aF9hZG1pbiBXSVRIIFBBU1NXT1JEIDoncGdwYXNzJztcbiBBTFRFUiBVU0VSIHN1cGFiYXNlX2Z1bmN0aW9uc19hZG1pbiBXSVRIIFBBU1NXT1JEIDoncGdwYXNzJztcbiBBTFRFUiBVU0VSIHN1cGFiYXNlX3N0b3JhZ2VfYWRtaW4gV0lUSCBQQVNTV09SRCA6J3BncGFzcyc7XG4iCiAgICAgIC0KICAgICAgICB0eXBlOiBiaW5kCiAgICAgICAgc291cmNlOiAuL3ZvbHVtZXMvZGIvand0LnNxbAogICAgICAgIHRhcmdldDogL2RvY2tlci1lbnRyeXBvaW50LWluaXRkYi5kL2luaXQtc2NyaXB0cy85OS1qd3Quc3FsCiAgICAgICAgY29udGVudDogIlxcc2V0IGp3dF9zZWNyZXQgYGVjaG8gXCIkSldUX1NFQ1JFVFwiYFxuXFxzZXQgand0X2V4cCBgZWNobyBcIiRKV1RfRVhQXCJgXG5cXHNldCBkYl9uYW1lIGBlY2hvIFwiJHtQT1NUR1JFU19EQjotcG9zdGdyZXN9XCJgXG5cbkFMVEVSIERBVEFCQVNFIDpkYl9uYW1lIFNFVCBcImFwcC5zZXR0aW5ncy5qd3Rfc2VjcmV0XCIgVE8gOidqd3Rfc2VjcmV0JztcbkFMVEVSIERBVEFCQVNFIDpkYl9uYW1lIFNFVCBcImFwcC5zZXR0aW5ncy5qd3RfZXhwXCIgVE8gOidqd3RfZXhwJztcbiIKICAgICAgLQogICAgICAgIHR5cGU6IGJpbmQKICAgICAgICBzb3VyY2U6IC4vdm9sdW1lcy9kYi9sb2dzLnNxbAogICAgICAgIHRhcmdldDogL2RvY2tlci1lbnRyeXBvaW50LWluaXRkYi5kL21pZ3JhdGlvbnMvOTktbG9ncy5zcWwKICAgICAgICBjb250ZW50OiAiXFxzZXQgcGd1c2VyIGBlY2hvIFwic3VwYWJhc2VfYWRtaW5cImBcblxcYyBfc3VwYWJhc2VcbmNyZWF0ZSBzY2hlbWEgaWYgbm90IGV4aXN0cyBfYW5hbHl0aWNzO1xuYWx0ZXIgc2NoZW1hIF9hbmFseXRpY3Mgb3duZXIgdG8gOnBndXNlcjtcblxcYyBwb3N0Z3Jlc1xuIgogICAgICAtICdzdXBhYmFzZS1kYi1jb25maWc6L2V0Yy9wb3N0Z3Jlc3FsLWN1c3RvbScKICBzdXBhYmFzZS1hbmFseXRpY3M6CiAgICBpbWFnZTogJ3N1cGFiYXNlL2xvZ2ZsYXJlOjEuNC4wJwogICAgaGVhbHRoY2hlY2s6CiAgICAgIHRlc3Q6CiAgICAgICAgLSBDTUQKICAgICAgICAtIGN1cmwKICAgICAgICAtICdodHRwOi8vMTI3LjAuMC4xOjQwMDAvaGVhbHRoJwogICAgICB0aW1lb3V0OiA1cwogICAgICBpbnRlcnZhbDogNXMKICAgICAgcmV0cmllczogMTAKICAgIGRlcGVuZHNfb246CiAgICAgIHN1cGFiYXNlLWRiOgogICAgICAgIGNvbmRpdGlvbjogc2VydmljZV9oZWFsdGh5CiAgICBlbnZpcm9ubWVudDoKICAgICAgLSBMT0dGTEFSRV9OT0RFX0hPU1Q9MTI3LjAuMC4xCiAgICAgIC0gREJfVVNFUk5BTUU9c3VwYWJhc2VfYWRtaW4KICAgICAgLSBEQl9EQVRBQkFTRT1fc3VwYWJhc2UKICAgICAgLSAnREJfSE9TVE5BTUU9JHtQT1NUR1JFU19IT1NUTkFNRTotc3VwYWJhc2UtZGJ9JwogICAgICAtICdEQl9QT1JUPSR7UE9TVEdSRVNfUE9SVDotNTQzMn0nCiAgICAgIC0gJ0RCX1BBU1NXT1JEPSR7U0VSVklDRV9QQVNTV09SRF9QT1NUR1JFU30nCiAgICAgIC0gREJfU0NIRU1BPV9hbmFseXRpY3MKICAgICAgLSAnTE9HRkxBUkVfQVBJX0tFWT0ke1NFUlZJQ0VfUEFTU1dPUkRfTE9HRkxBUkV9JwogICAgICAtIExPR0ZMQVJFX1NJTkdMRV9URU5BTlQ9dHJ1ZQogICAgICAtIExPR0ZMQVJFX1NJTkdMRV9URU5BTlRfTU9ERT10cnVlCiAgICAgIC0gTE9HRkxBUkVfU1VQQUJBU0VfTU9ERT10cnVlCiAgICAgIC0gTE9HRkxBUkVfTUlOX0NMVVNURVJfU0laRT0xCiAgICAgIC0gJ1BPU1RHUkVTX0JBQ0tFTkRfVVJMPXBvc3RncmVzcWw6Ly9zdXBhYmFzZV9hZG1pbjoke1NFUlZJQ0VfUEFTU1dPUkRfUE9TVEdSRVN9QCR7UE9TVEdSRVNfSE9TVE5BTUU6LXN1cGFiYXNlLWRifToke1BPU1RHUkVTX1BPUlQ6LTU0MzJ9L19zdXBhYmFzZScKICAgICAgLSBQT1NUR1JFU19CQUNLRU5EX1NDSEVNQT1fYW5hbHl0aWNzCiAgICAgIC0gTE9HRkxBUkVfRkVBVFVSRV9GTEFHX09WRVJSSURFPW11bHRpYmFja2VuZD10cnVlCiAgc3VwYWJhc2UtdmVjdG9yOgogICAgaW1hZ2U6ICd0aW1iZXJpby92ZWN0b3I6MC4yOC4xLWFscGluZScKICAgIGhlYWx0aGNoZWNrOgogICAgICB0ZXN0OgogICAgICAgIC0gQ01ECiAgICAgICAgLSB3Z2V0CiAgICAgICAgLSAnLS1uby12ZXJib3NlJwogICAgICAgIC0gJy0tdHJpZXM9MScKICAgICAgICAtICctLXNwaWRlcicKICAgICAgICAtICdodHRwOi8vc3VwYWJhc2UtdmVjdG9yOjkwMDEvaGVhbHRoJwogICAgICB0aW1lb3V0OiA1cwogICAgICBpbnRlcnZhbDogNXMKICAgICAgcmV0cmllczogMwogICAgdm9sdW1lczoKICAgICAgLQogICAgICAgIHR5cGU6IGJpbmQKICAgICAgICBzb3VyY2U6IC4vdm9sdW1lcy9sb2dzL3ZlY3Rvci55bWwKICAgICAgICB0YXJnZXQ6IC9ldGMvdmVjdG9yL3ZlY3Rvci55bWwKICAgICAgICByZWFkX29ubHk6IHRydWUKICAgICAgICBjb250ZW50OiAiYXBpOlxuICBlbmFibGVkOiB0cnVlXG4gIGFkZHJlc3M6IDAuMC4wLjA6OTAwMVxuXG5zb3VyY2VzOlxuICBkb2NrZXJfaG9zdDpcbiAgICB0eXBlOiBkb2NrZXJfbG9nc1xuICAgIGV4Y2x1ZGVfY29udGFpbmVyczpcbiAgICAgIC0gc3VwYWJhc2UtdmVjdG9yXG5cbnRyYW5zZm9ybXM6XG4gIHByb2plY3RfbG9nczpcbiAgICB0eXBlOiByZW1hcFxuICAgIGlucHV0czpcbiAgICAgIC0gZG9ja2VyX2hvc3RcbiAgICBzb3VyY2U6IHwtXG4gICAgICAucHJvamVjdCA9IFwiZGVmYXVsdFwiXG4gICAgICAuZXZlbnRfbWVzc2FnZSA9IGRlbCgubWVzc2FnZSlcbiAgICAgIC5hcHBuYW1lID0gZGVsKC5jb250YWluZXJfbmFtZSlcbiAgICAgIGRlbCguY29udGFpbmVyX2NyZWF0ZWRfYXQpXG4gICAgICBkZWwoLmNvbnRhaW5lcl9pZClcbiAgICAgIGRlbCguc291cmNlX3R5cGUpXG4gICAgICBkZWwoLnN0cmVhbSlcbiAgICAgIGRlbCgubGFiZWwpXG4gICAgICBkZWwoLmltYWdlKVxuICAgICAgZGVsKC5ob3N0KVxuICAgICAgZGVsKC5zdHJlYW0pXG4gIHJvdXRlcjpcbiAgICB0eXBlOiByb3V0ZVxuICAgIGlucHV0czpcbiAgICAgIC0gcHJvamVjdF9sb2dzXG4gICAgcm91dGU6XG4gICAgICBrb25nOiAnc3RhcnRzX3dpdGgoc3RyaW5nISguYXBwbmFtZSksIFwic3VwYWJhc2Uta29uZ1wiKSdcbiAgICAgIGF1dGg6ICdzdGFydHNfd2l0aChzdHJpbmchKC5hcHBuYW1lKSwgXCJzdXBhYmFzZS1hdXRoXCIpJ1xuICAgICAgcmVzdDogJ3N0YXJ0c193aXRoKHN0cmluZyEoLmFwcG5hbWUpLCBcInN1cGFiYXNlLXJlc3RcIiknXG4gICAgICByZWFsdGltZTogJ3N0YXJ0c193aXRoKHN0cmluZyEoLmFwcG5hbWUpLCBcInJlYWx0aW1lLWRldlwiKSdcbiAgICAgIHN0b3JhZ2U6ICdzdGFydHNfd2l0aChzdHJpbmchKC5hcHBuYW1lKSwgXCJzdXBhYmFzZS1zdG9yYWdlXCIpJ1xuICAgICAgZnVuY3Rpb25zOiAnc3RhcnRzX3dpdGgoc3RyaW5nISguYXBwbmFtZSksIFwic3VwYWJhc2UtZnVuY3Rpb25zXCIpJ1xuICAgICAgZGI6ICdzdGFydHNfd2l0aChzdHJpbmchKC5hcHBuYW1lKSwgXCJzdXBhYmFzZS1kYlwiKSdcbiAgIyBJZ25vcmVzIG5vbiBuZ2lueCBlcnJvcnMgc2luY2UgdGhleSBhcmUgcmVsYXRlZCB3aXRoIGtvbmcgYm9vdGluZyB1cFxuICBrb25nX2xvZ3M6XG4gICAgdHlwZTogcmVtYXBcbiAgICBpbnB1dHM6XG4gICAgICAtIHJvdXRlci5rb25nXG4gICAgc291cmNlOiB8LVxuICAgICAgcmVxLCBlcnIgPSBwYXJzZV9uZ2lueF9sb2coLmV2ZW50X21lc3NhZ2UsIFwiY29tYmluZWRcIilcbiAgICAgIGlmIGVyciA9PSBudWxsIHtcbiAgICAgICAgICAudGltZXN0YW1wID0gcmVxLnRpbWVzdGFtcFxuICAgICAgICAgIC5tZXRhZGF0YS5yZXF1ZXN0LmhlYWRlcnMucmVmZXJlciA9IHJlcS5yZWZlcmVyXG4gICAgICAgICAgLm1ldGFkYXRhLnJlcXVlc3QuaGVhZGVycy51c2VyX2FnZW50ID0gcmVxLmFnZW50XG4gICAgICAgICAgLm1ldGFkYXRhLnJlcXVlc3QuaGVhZGVycy5jZl9jb25uZWN0aW5nX2lwID0gcmVxLmNsaWVudFxuICAgICAgICAgIC5tZXRhZGF0YS5yZXF1ZXN0Lm1ldGhvZCA9IHJlcS5tZXRob2RcbiAgICAgICAgICAubWV0YWRhdGEucmVxdWVzdC5wYXRoID0gcmVxLnBhdGhcbiAgICAgICAgICAubWV0YWRhdGEucmVxdWVzdC5wcm90b2NvbCA9IHJlcS5wcm90b2NvbFxuICAgICAgICAgIC5tZXRhZGF0YS5yZXNwb25zZS5zdGF0dXNfY29kZSA9IHJlcS5zdGF0dXNcbiAgICAgIH1cbiAgICAgIGlmIGVyciAhPSBudWxsIHtcbiAgICAgICAgYWJvcnRcbiAgICAgIH1cbiAgIyBJZ25vcmVzIG5vbiBuZ2lueCBlcnJvcnMgc2luY2UgdGhleSBhcmUgcmVsYXRlZCB3aXRoIGtvbmcgYm9vdGluZyB1cFxuICBrb25nX2VycjpcbiAgICB0eXBlOiByZW1hcFxuICAgIGlucHV0czpcbiAgICAgIC0gcm91dGVyLmtvbmdcbiAgICBzb3VyY2U6IHwtXG4gICAgICAubWV0YWRhdGEucmVxdWVzdC5tZXRob2QgPSBcIkdFVFwiXG4gICAgICAubWV0YWRhdGEucmVzcG9uc2Uuc3RhdHVzX2NvZGUgPSAyMDBcbiAgICAgIHBhcnNlZCwgZXJyID0gcGFyc2VfbmdpbnhfbG9nKC5ldmVudF9tZXNzYWdlLCBcImVycm9yXCIpXG4gICAgICBpZiBlcnIgPT0gbnVsbCB7XG4gICAgICAgICAgLnRpbWVzdGFtcCA9IHBhcnNlZC50aW1lc3RhbXBcbiAgICAgICAgICAuc2V2ZXJpdHkgPSBwYXJzZWQuc2V2ZXJpdHlcbiAgICAgICAgICAubWV0YWRhdGEucmVxdWVzdC5ob3N0ID0gcGFyc2VkLmhvc3RcbiAgICAgICAgICAubWV0YWRhdGEucmVxdWVzdC5oZWFkZXJzLmNmX2Nvbm5lY3RpbmdfaXAgPSBwYXJzZWQuY2xpZW50XG4gICAgICAgICAgdXJsLCBlcnIgPSBzcGxpdChwYXJzZWQucmVxdWVzdCwgXCIgXCIpXG4gICAgICAgICAgaWYgZXJyID09IG51bGwge1xuICAgICAgICAgICAgICAubWV0YWRhdGEucmVxdWVzdC5tZXRob2QgPSB1cmxbMF1cbiAgICAgICAgICAgICAgLm1ldGFkYXRhLnJlcXVlc3QucGF0aCA9IHVybFsxXVxuICAgICAgICAgICAgICAubWV0YWRhdGEucmVxdWVzdC5wcm90b2NvbCA9IHVybFsyXVxuICAgICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIGVyciAhPSBudWxsIHtcbiAgICAgICAgYWJvcnRcbiAgICAgIH1cbiAgIyBHb3RydWUgbG9ncyBhcmUgc3RydWN0dXJlZCBqc29uIHN0cmluZ3Mgd2hpY2ggZnJvbnRlbmQgcGFyc2VzIGRpcmVjdGx5LiBCdXQgd2Uga2VlcCBtZXRhZGF0YSBmb3IgY29uc2lzdGVuY3kuXG4gIGF1dGhfbG9nczpcbiAgICB0eXBlOiByZW1hcFxuICAgIGlucHV0czpcbiAgICAgIC0gcm91dGVyLmF1dGhcbiAgICBzb3VyY2U6IHwtXG4gICAgICBwYXJzZWQsIGVyciA9IHBhcnNlX2pzb24oLmV2ZW50X21lc3NhZ2UpXG4gICAgICBpZiBlcnIgPT0gbnVsbCB7XG4gICAgICAgICAgLm1ldGFkYXRhLnRpbWVzdGFtcCA9IHBhcnNlZC50aW1lXG4gICAgICAgICAgLm1ldGFkYXRhID0gbWVyZ2UhKC5tZXRhZGF0YSwgcGFyc2VkKVxuICAgICAgfVxuICAjIFBvc3RnUkVTVCBsb2dzIGFyZSBzdHJ1Y3R1cmVkIHNvIHdlIHNlcGFyYXRlIHRpbWVzdGFtcCBmcm9tIG1lc3NhZ2UgdXNpbmcgcmVnZXhcbiAgcmVzdF9sb2dzOlxuICAgIHR5cGU6IHJlbWFwXG4gICAgaW5wdXRzOlxuICAgICAgLSByb3V0ZXIucmVzdFxuICAgIHNvdXJjZTogfC1cbiAgICAgIHBhcnNlZCwgZXJyID0gcGFyc2VfcmVnZXgoLmV2ZW50X21lc3NhZ2UsIHInXig/UDx0aW1lPi4qKTogKD9QPG1zZz4uKikkJylcbiAgICAgIGlmIGVyciA9PSBudWxsIHtcbiAgICAgICAgICAuZXZlbnRfbWVzc2FnZSA9IHBhcnNlZC5tc2dcbiAgICAgICAgICAudGltZXN0YW1wID0gdG9fdGltZXN0YW1wIShwYXJzZWQudGltZSlcbiAgICAgICAgICAubWV0YWRhdGEuaG9zdCA9IC5wcm9qZWN0XG4gICAgICB9XG4gICMgUmVhbHRpbWUgbG9ncyBhcmUgc3RydWN0dXJlZCBzbyB3ZSBwYXJzZSB0aGUgc2V2ZXJpdHkgbGV2ZWwgdXNpbmcgcmVnZXggKGlnbm9yZSB0aW1lIGJlY2F1c2UgaXQgaGFzIG5vIGRhdGUpXG4gIHJlYWx0aW1lX2xvZ3M6XG4gICAgdHlwZTogcmVtYXBcbiAgICBpbnB1dHM6XG4gICAgICAtIHJvdXRlci5yZWFsdGltZVxuICAgIHNvdXJjZTogfC1cbiAgICAgIC5tZXRhZGF0YS5wcm9qZWN0ID0gZGVsKC5wcm9qZWN0KVxuICAgICAgLm1ldGFkYXRhLmV4dGVybmFsX2lkID0gLm1ldGFkYXRhLnByb2plY3RcbiAgICAgIHBhcnNlZCwgZXJyID0gcGFyc2VfcmVnZXgoLmV2ZW50X21lc3NhZ2UsIHInXig/UDx0aW1lPlxcZCs6XFxkKzpcXGQrXFwuXFxkKykgXFxbKD9QPGxldmVsPlxcdyspXFxdICg/UDxtc2c+LiopJCcpXG4gICAgICBpZiBlcnIgPT0gbnVsbCB7XG4gICAgICAgICAgLmV2ZW50X21lc3NhZ2UgPSBwYXJzZWQubXNnXG4gICAgICAgICAgLm1ldGFkYXRhLmxldmVsID0gcGFyc2VkLmxldmVsXG4gICAgICB9XG4gICMgU3RvcmFnZSBsb2dzIG1heSBjb250YWluIGpzb24gb2JqZWN0cyBzbyB3ZSBwYXJzZSB0aGVtIGZvciBjb21wbGV0ZW5lc3NcbiAgc3RvcmFnZV9sb2dzOlxuICAgIHR5cGU6IHJlbWFwXG4gICAgaW5wdXRzOlxuICAgICAgLSByb3V0ZXIuc3RvcmFnZVxuICAgIHNvdXJjZTogfC1cbiAgICAgIC5tZXRhZGF0YS5wcm9qZWN0ID0gZGVsKC5wcm9qZWN0KVxuICAgICAgLm1ldGFkYXRhLnRlbmFudElkID0gLm1ldGFkYXRhLnByb2plY3RcbiAgICAgIHBhcnNlZCwgZXJyID0gcGFyc2VfanNvbiguZXZlbnRfbWVzc2FnZSlcbiAgICAgIGlmIGVyciA9PSBudWxsIHtcbiAgICAgICAgICAuZXZlbnRfbWVzc2FnZSA9IHBhcnNlZC5tc2dcbiAgICAgICAgICAubWV0YWRhdGEubGV2ZWwgPSBwYXJzZWQubGV2ZWxcbiAgICAgICAgICAubWV0YWRhdGEudGltZXN0YW1wID0gcGFyc2VkLnRpbWVcbiAgICAgICAgICAubWV0YWRhdGEuY29udGV4dFswXS5ob3N0ID0gcGFyc2VkLmhvc3RuYW1lXG4gICAgICAgICAgLm1ldGFkYXRhLmNvbnRleHRbMF0ucGlkID0gcGFyc2VkLnBpZFxuICAgICAgfVxuICAjIFBvc3RncmVzIGxvZ3Mgc29tZSBtZXNzYWdlcyB0byBzdGRlcnIgd2hpY2ggd2UgbWFwIHRvIHdhcm5pbmcgc2V2ZXJpdHkgbGV2ZWxcbiAgZGJfbG9nczpcbiAgICB0eXBlOiByZW1hcFxuICAgIGlucHV0czpcbiAgICAgIC0gcm91dGVyLmRiXG4gICAgc291cmNlOiB8LVxuICAgICAgLm1ldGFkYXRhLmhvc3QgPSBcImRiLWRlZmF1bHRcIlxuICAgICAgLm1ldGFkYXRhLnBhcnNlZC50aW1lc3RhbXAgPSAudGltZXN0YW1wXG5cbiAgICAgIHBhcnNlZCwgZXJyID0gcGFyc2VfcmVnZXgoLmV2ZW50X21lc3NhZ2UsIHInLiooP1A8bGV2ZWw+SU5GT3xOT1RJQ0V8V0FSTklOR3xFUlJPUnxMT0d8RkFUQUx8UEFOSUM/KTouKicsIG51bWVyaWNfZ3JvdXBzOiB0cnVlKVxuXG4gICAgICBpZiBlcnIgIT0gbnVsbCB8fCBwYXJzZWQgPT0gbnVsbCB7XG4gICAgICAgIC5tZXRhZGF0YS5wYXJzZWQuZXJyb3Jfc2V2ZXJpdHkgPSBcImluZm9cIlxuICAgICAgfVxuICAgICAgaWYgcGFyc2VkICE9IG51bGwge1xuICAgICAgLm1ldGFkYXRhLnBhcnNlZC5lcnJvcl9zZXZlcml0eSA9IHBhcnNlZC5sZXZlbFxuICAgICAgfVxuICAgICAgaWYgLm1ldGFkYXRhLnBhcnNlZC5lcnJvcl9zZXZlcml0eSA9PSBcImluZm9cIiB7XG4gICAgICAgICAgLm1ldGFkYXRhLnBhcnNlZC5lcnJvcl9zZXZlcml0eSA9IFwibG9nXCJcbiAgICAgIH1cbiAgICAgIC5tZXRhZGF0YS5wYXJzZWQuZXJyb3Jfc2V2ZXJpdHkgPSB1cGNhc2UhKC5tZXRhZGF0YS5wYXJzZWQuZXJyb3Jfc2V2ZXJpdHkpXG5cbnNpbmtzOlxuICBsb2dmbGFyZV9hdXRoOlxuICAgIHR5cGU6ICdodHRwJ1xuICAgIGlucHV0czpcbiAgICAgIC0gYXV0aF9sb2dzXG4gICAgZW5jb2Rpbmc6XG4gICAgICBjb2RlYzogJ2pzb24nXG4gICAgbWV0aG9kOiAncG9zdCdcbiAgICByZXF1ZXN0OlxuICAgICAgcmV0cnlfbWF4X2R1cmF0aW9uX3NlY3M6IDEwXG4gICAgdXJpOiAnaHR0cDovL3N1cGFiYXNlLWFuYWx5dGljczo0MDAwL2FwaS9sb2dzP3NvdXJjZV9uYW1lPWdvdHJ1ZS5sb2dzLnByb2QmYXBpX2tleT0ke0xPR0ZMQVJFX0FQSV9LRVk/TE9HRkxBUkVfQVBJX0tFWSBpcyByZXF1aXJlZH0nXG4gIGxvZ2ZsYXJlX3JlYWx0aW1lOlxuICAgIHR5cGU6ICdodHRwJ1xuICAgIGlucHV0czpcbiAgICAgIC0gcmVhbHRpbWVfbG9nc1xuICAgIGVuY29kaW5nOlxuICAgICAgY29kZWM6ICdqc29uJ1xuICAgIG1ldGhvZDogJ3Bvc3QnXG4gICAgcmVxdWVzdDpcbiAgICAgIHJldHJ5X21heF9kdXJhdGlvbl9zZWNzOiAxMFxuICAgIHVyaTogJ2h0dHA6Ly9zdXBhYmFzZS1hbmFseXRpY3M6NDAwMC9hcGkvbG9ncz9zb3VyY2VfbmFtZT1yZWFsdGltZS5sb2dzLnByb2QmYXBpX2tleT0ke0xPR0ZMQVJFX0FQSV9LRVk/TE9HRkxBUkVfQVBJX0tFWSBpcyByZXF1aXJlZH0nXG4gIGxvZ2ZsYXJlX3Jlc3Q6XG4gICAgdHlwZTogJ2h0dHAnXG4gICAgaW5wdXRzOlxuICAgICAgLSByZXN0X2xvZ3NcbiAgICBlbmNvZGluZzpcbiAgICAgIGNvZGVjOiAnanNvbidcbiAgICBtZXRob2Q6ICdwb3N0J1xuICAgIHJlcXVlc3Q6XG4gICAgICByZXRyeV9tYXhfZHVyYXRpb25fc2VjczogMTBcbiAgICB1cmk6ICdodHRwOi8vc3VwYWJhc2UtYW5hbHl0aWNzOjQwMDAvYXBpL2xvZ3M/c291cmNlX25hbWU9cG9zdGdSRVNULmxvZ3MucHJvZCZhcGlfa2V5PSR7TE9HRkxBUkVfQVBJX0tFWT9MT0dGTEFSRV9BUElfS0VZIGlzIHJlcXVpcmVkfSdcbiAgbG9nZmxhcmVfZGI6XG4gICAgdHlwZTogJ2h0dHAnXG4gICAgaW5wdXRzOlxuICAgICAgLSBkYl9sb2dzXG4gICAgZW5jb2Rpbmc6XG4gICAgICBjb2RlYzogJ2pzb24nXG4gICAgbWV0aG9kOiAncG9zdCdcbiAgICByZXF1ZXN0OlxuICAgICAgcmV0cnlfbWF4X2R1cmF0aW9uX3NlY3M6IDEwXG4gICAgIyBXZSBtdXN0IHJvdXRlIHRoZSBzaW5rIHRocm91Z2gga29uZyBiZWNhdXNlIGluZ2VzdGluZyBsb2dzIGJlZm9yZSBsb2dmbGFyZSBpcyBmdWxseSBpbml0aWFsaXNlZCB3aWxsXG4gICAgIyBsZWFkIHRvIGJyb2tlbiBxdWVyaWVzIGZyb20gc3R1ZGlvLiBUaGlzIHdvcmtzIGJ5IHRoZSBhc3N1bXB0aW9uIHRoYXQgY29udGFpbmVycyBhcmUgc3RhcnRlZCBpbiB0aGVcbiAgICAjIGZvbGxvd2luZyBvcmRlcjogdmVjdG9yID4gZGIgPiBsb2dmbGFyZSA+IGtvbmdcbiAgICB1cmk6ICdodHRwOi8vc3VwYWJhc2Uta29uZzo4MDAwL2FuYWx5dGljcy92MS9hcGkvbG9ncz9zb3VyY2VfbmFtZT1wb3N0Z3Jlcy5sb2dzJmFwaV9rZXk9JHtMT0dGTEFSRV9BUElfS0VZP0xPR0ZMQVJFX0FQSV9LRVkgaXMgcmVxdWlyZWR9J1xuICBsb2dmbGFyZV9mdW5jdGlvbnM6XG4gICAgdHlwZTogJ2h0dHAnXG4gICAgaW5wdXRzOlxuICAgICAgLSByb3V0ZXIuZnVuY3Rpb25zXG4gICAgZW5jb2Rpbmc6XG4gICAgICBjb2RlYzogJ2pzb24nXG4gICAgbWV0aG9kOiAncG9zdCdcbiAgICByZXF1ZXN0OlxuICAgICAgcmV0cnlfbWF4X2R1cmF0aW9uX3NlY3M6IDEwXG4gICAgdXJpOiAnaHR0cDovL3N1cGFiYXNlLWFuYWx5dGljczo0MDAwL2FwaS9sb2dzP3NvdXJjZV9uYW1lPWRlbm8tcmVsYXktbG9ncyZhcGlfa2V5PSR7TE9HRkxBUkVfQVBJX0tFWT9MT0dGTEFSRV9BUElfS0VZIGlzIHJlcXVpcmVkfSdcbiAgbG9nZmxhcmVfc3RvcmFnZTpcbiAgICB0eXBlOiAnaHR0cCdcbiAgICBpbnB1dHM6XG4gICAgICAtIHN0b3JhZ2VfbG9nc1xuICAgIGVuY29kaW5nOlxuICAgICAgY29kZWM6ICdqc29uJ1xuICAgIG1ldGhvZDogJ3Bvc3QnXG4gICAgcmVxdWVzdDpcbiAgICAgIHJldHJ5X21heF9kdXJhdGlvbl9zZWNzOiAxMFxuICAgIHVyaTogJ2h0dHA6Ly9zdXBhYmFzZS1hbmFseXRpY3M6NDAwMC9hcGkvbG9ncz9zb3VyY2VfbmFtZT1zdG9yYWdlLmxvZ3MucHJvZC4yJmFwaV9rZXk9JHtMT0dGTEFSRV9BUElfS0VZP0xPR0ZMQVJFX0FQSV9LRVkgaXMgcmVxdWlyZWR9J1xuICBsb2dmbGFyZV9rb25nOlxuICAgIHR5cGU6ICdodHRwJ1xuICAgIGlucHV0czpcbiAgICAgIC0ga29uZ19sb2dzXG4gICAgICAtIGtvbmdfZXJyXG4gICAgZW5jb2Rpbmc6XG4gICAgICBjb2RlYzogJ2pzb24nXG4gICAgbWV0aG9kOiAncG9zdCdcbiAgICByZXF1ZXN0OlxuICAgICAgcmV0cnlfbWF4X2R1cmF0aW9uX3NlY3M6IDEwXG4gICAgdXJpOiAnaHR0cDovL3N1cGFiYXNlLWFuYWx5dGljczo0MDAwL2FwaS9sb2dzP3NvdXJjZV9uYW1lPWNsb3VkZmxhcmUubG9ncy5wcm9kJmFwaV9rZXk9JHtMT0dGTEFSRV9BUElfS0VZP0xPR0ZMQVJFX0FQSV9LRVkgaXMgcmVxdWlyZWR9J1xuIgogICAgICAtICcvdmFyL3J1bi9kb2NrZXIuc29jazovdmFyL3J1bi9kb2NrZXIuc29jazpybycKICAgIGVudmlyb25tZW50OgogICAgICAtICdMT0dGTEFSRV9BUElfS0VZPSR7U0VSVklDRV9QQVNTV09SRF9MT0dGTEFSRX0nCiAgICBjb21tYW5kOgogICAgICAtICctLWNvbmZpZycKICAgICAgLSBldGMvdmVjdG9yL3ZlY3Rvci55bWwKICBzdXBhYmFzZS1yZXN0OgogICAgaW1hZ2U6ICdwb3N0Z3Jlc3QvcG9zdGdyZXN0OnYxMi4yLjEyJwogICAgZGVwZW5kc19vbjoKICAgICAgc3VwYWJhc2UtZGI6CiAgICAgICAgY29uZGl0aW9uOiBzZXJ2aWNlX2hlYWx0aHkKICAgICAgc3VwYWJhc2UtYW5hbHl0aWNzOgogICAgICAgIGNvbmRpdGlvbjogc2VydmljZV9oZWFsdGh5CiAgICBlbnZpcm9ubWVudDoKICAgICAgLSAnUEdSU1RfREJfVVJJPXBvc3RncmVzOi8vYXV0aGVudGljYXRvcjoke1NFUlZJQ0VfUEFTU1dPUkRfUE9TVEdSRVN9QCR7UE9TVEdSRVNfSE9TVE5BTUU6LXN1cGFiYXNlLWRifToke1BPU1RHUkVTX1BPUlQ6LTU0MzJ9LyR7UE9TVEdSRVNfREI6LXBvc3RncmVzfScKICAgICAgLSAnUEdSU1RfREJfU0NIRU1BUz0ke1BHUlNUX0RCX1NDSEVNQVM6LXB1YmxpYyxzdG9yYWdlLGdyYXBocWxfcHVibGljfScKICAgICAgLSBQR1JTVF9EQl9BTk9OX1JPTEU9YW5vbgogICAgICAtICdQR1JTVF9KV1RfU0VDUkVUPSR7U0VSVklDRV9QQVNTV09SRF9KV1R9JwogICAgICAtIFBHUlNUX0RCX1VTRV9MRUdBQ1lfR1VDUz1mYWxzZQogICAgICAtICdQR1JTVF9BUFBfU0VUVElOR1NfSldUX1NFQ1JFVD0ke1NFUlZJQ0VfUEFTU1dPUkRfSldUfScKICAgICAgLSAnUEdSU1RfQVBQX1NFVFRJTkdTX0pXVF9FWFA9JHtKV1RfRVhQSVJZOi0zNjAwfScKICAgIGNvbW1hbmQ6IHBvc3RncmVzdAogICAgZXhjbHVkZV9mcm9tX2hjOiB0cnVlCiAgc3VwYWJhc2UtYXV0aDoKICAgIGltYWdlOiAnc3VwYWJhc2UvZ290cnVlOnYyLjE3NC4wJwogICAgZGVwZW5kc19vbjoKICAgICAgc3VwYWJhc2UtZGI6CiAgICAgICAgY29uZGl0aW9uOiBzZXJ2aWNlX2hlYWx0aHkKICAgICAgc3VwYWJhc2UtYW5hbHl0aWNzOgogICAgICAgIGNvbmRpdGlvbjogc2VydmljZV9oZWFsdGh5CiAgICBoZWFsdGhjaGVjazoKICAgICAgdGVzdDoKICAgICAgICAtIENNRAogICAgICAgIC0gd2dldAogICAgICAgIC0gJy0tbm8tdmVyYm9zZScKICAgICAgICAtICctLXRyaWVzPTEnCiAgICAgICAgLSAnLS1zcGlkZXInCiAgICAgICAgLSAnaHR0cDovLzEyNy4wLjAuMTo5OTk5L2hlYWx0aCcKICAgICAgdGltZW91dDogNXMKICAgICAgaW50ZXJ2YWw6IDVzCiAgICAgIHJldHJpZXM6IDMKICAgIGVudmlyb25tZW50OgogICAgICAtIEdPVFJVRV9BUElfSE9TVD0wLjAuMC4wCiAgICAgIC0gR09UUlVFX0FQSV9QT1JUPTk5OTkKICAgICAgLSAnQVBJX0VYVEVSTkFMX1VSTD0ke0FQSV9FWFRFUk5BTF9VUkw6LWh0dHA6Ly9zdXBhYmFzZS1rb25nOjgwMDB9JwogICAgICAtIEdPVFJVRV9EQl9EUklWRVI9cG9zdGdyZXMKICAgICAgLSAnR09UUlVFX0RCX0RBVEFCQVNFX1VSTD1wb3N0Z3JlczovL3N1cGFiYXNlX2F1dGhfYWRtaW46JHtTRVJWSUNFX1BBU1NXT1JEX1BPU1RHUkVTfUAke1BPU1RHUkVTX0hPU1ROQU1FOi1zdXBhYmFzZS1kYn06JHtQT1NUR1JFU19QT1JUOi01NDMyfS8ke1BPU1RHUkVTX0RCOi1wb3N0Z3Jlc30nCiAgICAgIC0gJ0dPVFJVRV9TSVRFX1VSTD0ke1NFUlZJQ0VfRlFETl9TVVBBQkFTRUtPTkd9JwogICAgICAtICdHT1RSVUVfVVJJX0FMTE9XX0xJU1Q9JHtBRERJVElPTkFMX1JFRElSRUNUX1VSTFN9JwogICAgICAtICdHT1RSVUVfRElTQUJMRV9TSUdOVVA9JHtESVNBQkxFX1NJR05VUDotZmFsc2V9JwogICAgICAtIEdPVFJVRV9KV1RfQURNSU5fUk9MRVM9c2VydmljZV9yb2xlCiAgICAgIC0gR09UUlVFX0pXVF9BVUQ9YXV0aGVudGljYXRlZAogICAgICAtIEdPVFJVRV9KV1RfREVGQVVMVF9HUk9VUF9OQU1FPWF1dGhlbnRpY2F0ZWQKICAgICAgLSAnR09UUlVFX0pXVF9FWFA9JHtKV1RfRVhQSVJZOi0zNjAwfScKICAgICAgLSAnR09UUlVFX0pXVF9TRUNSRVQ9JHtTRVJWSUNFX1BBU1NXT1JEX0pXVH0nCiAgICAgIC0gJ0dPVFJVRV9FWFRFUk5BTF9FTUFJTF9FTkFCTEVEPSR7RU5BQkxFX0VNQUlMX1NJR05VUDotdHJ1ZX0nCiAgICAgIC0gJ0dPVFJVRV9FWFRFUk5BTF9BTk9OWU1PVVNfVVNFUlNfRU5BQkxFRD0ke0VOQUJMRV9BTk9OWU1PVVNfVVNFUlM6LWZhbHNlfScKICAgICAgLSAnR09UUlVFX01BSUxFUl9BVVRPQ09ORklSTT0ke0VOQUJMRV9FTUFJTF9BVVRPQ09ORklSTTotZmFsc2V9JwogICAgICAtICdHT1RSVUVfU01UUF9BRE1JTl9FTUFJTD0ke1NNVFBfQURNSU5fRU1BSUx9JwogICAgICAtICdHT1RSVUVfU01UUF9IT1NUPSR7U01UUF9IT1NUfScKICAgICAgLSAnR09UUlVFX1NNVFBfUE9SVD0ke1NNVFBfUE9SVDotNTg3fScKICAgICAgLSAnR09UUlVFX1NNVFBfVVNFUj0ke1NNVFBfVVNFUn0nCiAgICAgIC0gJ0dPVFJVRV9TTVRQX1BBU1M9JHtTTVRQX1BBU1N9JwogICAgICAtICdHT1RSVUVfU01UUF9TRU5ERVJfTkFNRT0ke1NNVFBfU0VOREVSX05BTUV9JwogICAgICAtICdHT1RSVUVfTUFJTEVSX1VSTFBBVEhTX0lOVklURT0ke01BSUxFUl9VUkxQQVRIU19JTlZJVEU6LS9hdXRoL3YxL3ZlcmlmeX0nCiAgICAgIC0gJ0dPVFJVRV9NQUlMRVJfVVJMUEFUSFNfQ09ORklSTUFUSU9OPSR7TUFJTEVSX1VSTFBBVEhTX0NPTkZJUk1BVElPTjotL2F1dGgvdjEvdmVyaWZ5fScKICAgICAgLSAnR09UUlVFX01BSUxFUl9VUkxQQVRIU19SRUNPVkVSWT0ke01BSUxFUl9VUkxQQVRIU19SRUNPVkVSWTotL2F1dGgvdjEvdmVyaWZ5fScKICAgICAgLSAnR09UUlVFX01BSUxFUl9VUkxQQVRIU19FTUFJTF9DSEFOR0U9JHtNQUlMRVJfVVJMUEFUSFNfRU1BSUxfQ0hBTkdFOi0vYXV0aC92MS92ZXJpZnl9JwogICAgICAtICdHT1RSVUVfTUFJTEVSX1RFTVBMQVRFU19JTlZJVEU9JHtNQUlMRVJfVEVNUExBVEVTX0lOVklURX0nCiAgICAgIC0gJ0dPVFJVRV9NQUlMRVJfVEVNUExBVEVTX0NPTkZJUk1BVElPTj0ke01BSUxFUl9URU1QTEFURVNfQ09ORklSTUFUSU9OfScKICAgICAgLSAnR09UUlVFX01BSUxFUl9URU1QTEFURVNfUkVDT1ZFUlk9JHtNQUlMRVJfVEVNUExBVEVTX1JFQ09WRVJZfScKICAgICAgLSAnR09UUlVFX01BSUxFUl9URU1QTEFURVNfTUFHSUNfTElOSz0ke01BSUxFUl9URU1QTEFURVNfTUFHSUNfTElOS30nCiAgICAgIC0gJ0dPVFJVRV9NQUlMRVJfVEVNUExBVEVTX0VNQUlMX0NIQU5HRT0ke01BSUxFUl9URU1QTEFURVNfRU1BSUxfQ0hBTkdFfScKICAgICAgLSAnR09UUlVFX01BSUxFUl9TVUJKRUNUU19DT05GSVJNQVRJT049JHtNQUlMRVJfU1VCSkVDVFNfQ09ORklSTUFUSU9OfScKICAgICAgLSAnR09UUlVFX01BSUxFUl9TVUJKRUNUU19SRUNPVkVSWT0ke01BSUxFUl9TVUJKRUNUU19SRUNPVkVSWX0nCiAgICAgIC0gJ0dPVFJVRV9NQUlMRVJfU1VCSkVDVFNfTUFHSUNfTElOSz0ke01BSUxFUl9TVUJKRUNUU19NQUdJQ19MSU5LfScKICAgICAgLSAnR09UUlVFX01BSUxFUl9TVUJKRUNUU19FTUFJTF9DSEFOR0U9JHtNQUlMRVJfU1VCSkVDVFNfRU1BSUxfQ0hBTkdFfScKICAgICAgLSAnR09UUlVFX01BSUxFUl9TVUJKRUNUU19JTlZJVEU9JHtNQUlMRVJfU1VCSkVDVFNfSU5WSVRFfScKICAgICAgLSAnR09UUlVFX0VYVEVSTkFMX1BIT05FX0VOQUJMRUQ9JHtFTkFCTEVfUEhPTkVfU0lHTlVQOi10cnVlfScKICAgICAgLSAnR09UUlVFX1NNU19BVVRPQ09ORklSTT0ke0VOQUJMRV9QSE9ORV9BVVRPQ09ORklSTTotdHJ1ZX0nCiAgcmVhbHRpbWUtZGV2OgogICAgaW1hZ2U6ICdzdXBhYmFzZS9yZWFsdGltZTp2Mi4zNC40NycKICAgIGNvbnRhaW5lcl9uYW1lOiByZWFsdGltZS1kZXYuc3VwYWJhc2UtcmVhbHRpbWUKICAgIGRlcGVuZHNfb246CiAgICAgIHN1cGFiYXNlLWRiOgogICAgICAgIGNvbmRpdGlvbjogc2VydmljZV9oZWFsdGh5CiAgICAgIHN1cGFiYXNlLWFuYWx5dGljczoKICAgICAgICBjb25kaXRpb246IHNlcnZpY2VfaGVhbHRoeQogICAgaGVhbHRoY2hlY2s6CiAgICAgIHRlc3Q6CiAgICAgICAgLSBDTUQKICAgICAgICAtIGN1cmwKICAgICAgICAtICctc1NmTCcKICAgICAgICAtICctLWhlYWQnCiAgICAgICAgLSAnLW8nCiAgICAgICAgLSAvZGV2L251bGwKICAgICAgICAtICctSCcKICAgICAgICAtICdBdXRob3JpemF0aW9uOiBCZWFyZXIgJHtTRVJWSUNFX1NVUEFCQVNFQU5PTl9LRVl9JwogICAgICAgIC0gJ2h0dHA6Ly8xMjcuMC4wLjE6NDAwMC9hcGkvdGVuYW50cy9yZWFsdGltZS1kZXYvaGVhbHRoJwogICAgICB0aW1lb3V0OiA1cwogICAgICBpbnRlcnZhbDogNXMKICAgICAgcmV0cmllczogMwogICAgZW52aXJvbm1lbnQ6CiAgICAgIC0gUE9SVD00MDAwCiAgICAgIC0gJ0RCX0hPU1Q9JHtQT1NUR1JFU19IT1NUTkFNRTotc3VwYWJhc2UtZGJ9JwogICAgICAtICdEQl9QT1JUPSR7UE9TVEdSRVNfUE9SVDotNTQzMn0nCiAgICAgIC0gREJfVVNFUj1zdXBhYmFzZV9hZG1pbgogICAgICAtICdEQl9QQVNTV09SRD0ke1NFUlZJQ0VfUEFTU1dPUkRfUE9TVEdSRVN9JwogICAgICAtICdEQl9OQU1FPSR7UE9TVEdSRVNfREI6LXBvc3RncmVzfScKICAgICAgLSAnREJfQUZURVJfQ09OTkVDVF9RVUVSWT1TRVQgc2VhcmNoX3BhdGggVE8gX3JlYWx0aW1lJwogICAgICAtIERCX0VOQ19LRVk9c3VwYWJhc2VyZWFsdGltZQogICAgICAtICdBUElfSldUX1NFQ1JFVD0ke1NFUlZJQ0VfUEFTU1dPUkRfSldUfScKICAgICAgLSBGTFlfQUxMT0NfSUQ9Zmx5MTIzCiAgICAgIC0gRkxZX0FQUF9OQU1FPXJlYWx0aW1lCiAgICAgIC0gJ1NFQ1JFVF9LRVlfQkFTRT0ke1NFQ1JFVF9QQVNTV09SRF9SRUFMVElNRX0nCiAgICAgIC0gJ0VSTF9BRkxBR1M9LXByb3RvX2Rpc3QgaW5ldF90Y3AnCiAgICAgIC0gRU5BQkxFX1RBSUxTQ0FMRT1mYWxzZQogICAgICAtICJETlNfTk9ERVM9JyciCiAgICAgIC0gUkxJTUlUX05PRklMRT0xMDAwMAogICAgICAtIEFQUF9OQU1FPXJlYWx0aW1lCiAgICAgIC0gU0VFRF9TRUxGX0hPU1Q9dHJ1ZQogICAgICAtIExPR19MRVZFTD1lcnJvcgogICAgICAtIFJVTl9KQU5JVE9SPXRydWUKICAgICAgLSBKQU5JVE9SX0lOVEVSVkFMPTYwMDAwCiAgICBjb21tYW5kOiAic2ggLWMgXCIvYXBwL2Jpbi9taWdyYXRlICYmIC9hcHAvYmluL3JlYWx0aW1lIGV2YWwgJ1JlYWx0aW1lLlJlbGVhc2Uuc2VlZHMoUmVhbHRpbWUuUmVwbyknICYmIC9hcHAvYmluL3NlcnZlclwiXG4iCiAgc3VwYWJhc2UtbWluaW86CiAgICBpbWFnZTogbWluaW8vbWluaW8KICAgIGVudmlyb25tZW50OgogICAgICAtICdNSU5JT19ST09UX1VTRVI9JHtTRVJWSUNFX1VTRVJfTUlOSU99JwogICAgICAtICdNSU5JT19ST09UX1BBU1NXT1JEPSR7U0VSVklDRV9QQVNTV09SRF9NSU5JT30nCiAgICBjb21tYW5kOiAnc2VydmVyIC0tY29uc29sZS1hZGRyZXNzICI6OTAwMSIgL2RhdGEnCiAgICBoZWFsdGhjaGVjazoKICAgICAgdGVzdDogJ3NsZWVwIDUgJiYgZXhpdCAwJwogICAgICBpbnRlcnZhbDogMnMKICAgICAgdGltZW91dDogMTBzCiAgICAgIHJldHJpZXM6IDUKICAgIHZvbHVtZXM6CiAgICAgIC0gJy4vdm9sdW1lcy9zdG9yYWdlOi9kYXRhJwogIG1pbmlvLWNyZWF0ZWJ1Y2tldDoKICAgIGltYWdlOiBtaW5pby9tYwogICAgcmVzdGFydDogJ25vJwogICAgZW52aXJvbm1lbnQ6CiAgICAgIC0gJ01JTklPX1JPT1RfVVNFUj0ke1NFUlZJQ0VfVVNFUl9NSU5JT30nCiAgICAgIC0gJ01JTklPX1JPT1RfUEFTU1dPUkQ9JHtTRVJWSUNFX1BBU1NXT1JEX01JTklPfScKICAgIGRlcGVuZHNfb246CiAgICAgIHN1cGFiYXNlLW1pbmlvOgogICAgICAgIGNvbmRpdGlvbjogc2VydmljZV9oZWFsdGh5CiAgICBlbnRyeXBvaW50OgogICAgICAtIC9lbnRyeXBvaW50LnNoCiAgICB2b2x1bWVzOgogICAgICAtCiAgICAgICAgdHlwZTogYmluZAogICAgICAgIHNvdXJjZTogLi9lbnRyeXBvaW50LnNoCiAgICAgICAgdGFyZ2V0OiAvZW50cnlwb2ludC5zaAogICAgICAgIGNvbnRlbnQ6ICIjIS9iaW4vc2hcbi91c3IvYmluL21jIGFsaWFzIHNldCBzdXBhYmFzZS1taW5pbyBodHRwOi8vc3VwYWJhc2UtbWluaW86OTAwMCAke01JTklPX1JPT1RfVVNFUn0gJHtNSU5JT19ST09UX1BBU1NXT1JEfTtcbi91c3IvYmluL21jIG1iIC0taWdub3JlLWV4aXN0aW5nIHN1cGFiYXNlLW1pbmlvL3N0dWI7XG5leGl0IDBcbiIKICBzdXBhYmFzZS1zdG9yYWdlOgogICAgaW1hZ2U6ICdzdXBhYmFzZS9zdG9yYWdlLWFwaTp2MS4xNC42JwogICAgZGVwZW5kc19vbjoKICAgICAgc3VwYWJhc2UtZGI6CiAgICAgICAgY29uZGl0aW9uOiBzZXJ2aWNlX2hlYWx0aHkKICAgICAgc3VwYWJhc2UtcmVzdDoKICAgICAgICBjb25kaXRpb246IHNlcnZpY2Vfc3RhcnRlZAogICAgICBpbWdwcm94eToKICAgICAgICBjb25kaXRpb246IHNlcnZpY2Vfc3RhcnRlZAogICAgaGVhbHRoY2hlY2s6CiAgICAgIHRlc3Q6CiAgICAgICAgLSBDTUQKICAgICAgICAtIHdnZXQKICAgICAgICAtICctLW5vLXZlcmJvc2UnCiAgICAgICAgLSAnLS10cmllcz0xJwogICAgICAgIC0gJy0tc3BpZGVyJwogICAgICAgIC0gJ2h0dHA6Ly8xMjcuMC4wLjE6NTAwMC9zdGF0dXMnCiAgICAgIHRpbWVvdXQ6IDVzCiAgICAgIGludGVydmFsOiA1cwogICAgICByZXRyaWVzOiAzCiAgICBlbnZpcm9ubWVudDoKICAgICAgLSBTRVJWRVJfUE9SVD01MDAwCiAgICAgIC0gU0VSVkVSX1JFR0lPTj1sb2NhbAogICAgICAtIE1VTFRJX1RFTkFOVD1mYWxzZQogICAgICAtICdBVVRIX0pXVF9TRUNSRVQ9JHtTRVJWSUNFX1BBU1NXT1JEX0pXVH0nCiAgICAgIC0gJ0RBVEFCQVNFX1VSTD1wb3N0Z3JlczovL3N1cGFiYXNlX3N0b3JhZ2VfYWRtaW46JHtTRVJWSUNFX1BBU1NXT1JEX1BPU1RHUkVTfUAke1BPU1RHUkVTX0hPU1ROQU1FOi1zdXBhYmFzZS1kYn06JHtQT1NUR1JFU19QT1JUOi01NDMyfS8ke1BPU1RHUkVTX0RCOi1wb3N0Z3Jlc30nCiAgICAgIC0gREJfSU5TVEFMTF9ST0xFUz1mYWxzZQogICAgICAtIFNUT1JBR0VfQkFDS0VORD1zMwogICAgICAtIFNUT1JBR0VfUzNfQlVDS0VUPXN0dWIKICAgICAgLSAnU1RPUkFHRV9TM19FTkRQT0lOVD1odHRwOi8vc3VwYWJhc2UtbWluaW86OTAwMCcKICAgICAgLSBTVE9SQUdFX1MzX0ZPUkNFX1BBVEhfU1RZTEU9dHJ1ZQogICAgICAtIFNUT1JBR0VfUzNfUkVHSU9OPXVzLWVhc3QtMQogICAgICAtICdBV1NfQUNDRVNTX0tFWV9JRD0ke1NFUlZJQ0VfVVNFUl9NSU5JT30nCiAgICAgIC0gJ0FXU19TRUNSRVRfQUNDRVNTX0tFWT0ke1NFUlZJQ0VfUEFTU1dPUkRfTUlOSU99JwogICAgICAtIFVQTE9BRF9GSUxFX1NJWkVfTElNSVQ9NTI0Mjg4MDAwCiAgICAgIC0gVVBMT0FEX0ZJTEVfU0laRV9MSU1JVF9TVEFOREFSRD01MjQyODgwMDAKICAgICAgLSBVUExPQURfU0lHTkVEX1VSTF9FWFBJUkFUSU9OX1RJTUU9MTIwCiAgICAgIC0gVFVTX1VSTF9QQVRIPXVwbG9hZC9yZXN1bWFibGUKICAgICAgLSBUVVNfTUFYX1NJWkU9MzYwMDAwMAogICAgICAtIEVOQUJMRV9JTUFHRV9UUkFOU0ZPUk1BVElPTj10cnVlCiAgICAgIC0gJ0lNR1BST1hZX1VSTD1odHRwOi8vaW1ncHJveHk6ODA4MCcKICAgICAgLSBJTUdQUk9YWV9SRVFVRVNUX1RJTUVPVVQ9MTUKICAgICAgLSBEQVRBQkFTRV9TRUFSQ0hfUEFUSD1zdG9yYWdlCiAgICAgIC0gTk9ERV9FTlY9cHJvZHVjdGlvbgogICAgICAtIFJFUVVFU1RfQUxMT1dfWF9GT1JXQVJERURfUEFUSD10cnVlCiAgICB2b2x1bWVzOgogICAgICAtICcuL3ZvbHVtZXMvc3RvcmFnZTovdmFyL2xpYi9zdG9yYWdlJwogIGltZ3Byb3h5OgogICAgaW1hZ2U6ICdkYXJ0aHNpbS9pbWdwcm94eTp2My44LjAnCiAgICBoZWFsdGhjaGVjazoKICAgICAgdGVzdDoKICAgICAgICAtIENNRAogICAgICAgIC0gaW1ncHJveHkKICAgICAgICAtIGhlYWx0aAogICAgICB0aW1lb3V0OiA1cwogICAgICBpbnRlcnZhbDogNXMKICAgICAgcmV0cmllczogMwogICAgZW52aXJvbm1lbnQ6CiAgICAgIC0gSU1HUFJPWFlfTE9DQUxfRklMRVNZU1RFTV9ST09UPS8KICAgICAgLSBJTUdQUk9YWV9VU0VfRVRBRz10cnVlCiAgICAgIC0gJ0lNR1BST1hZX0VOQUJMRV9XRUJQX0RFVEVDVElPTj0ke0lNR1BST1hZX0VOQUJMRV9XRUJQX0RFVEVDVElPTjotdHJ1ZX0nCiAgICB2b2x1bWVzOgogICAgICAtICcuL3ZvbHVtZXMvc3RvcmFnZTovdmFyL2xpYi9zdG9yYWdlJwogIHN1cGFiYXNlLW1ldGE6CiAgICBpbWFnZTogJ3N1cGFiYXNlL3Bvc3RncmVzLW1ldGE6djAuODkuMycKICAgIGRlcGVuZHNfb246CiAgICAgIHN1cGFiYXNlLWRiOgogICAgICAgIGNvbmRpdGlvbjogc2VydmljZV9oZWFsdGh5CiAgICAgIHN1cGFiYXNlLWFuYWx5dGljczoKICAgICAgICBjb25kaXRpb246IHNlcnZpY2VfaGVhbHRoeQogICAgZW52aXJvbm1lbnQ6CiAgICAgIC0gUEdfTUVUQV9QT1JUPTgwODAKICAgICAgLSAnUEdfTUVUQV9EQl9IT1NUPSR7UE9TVEdSRVNfSE9TVE5BTUU6LXN1cGFiYXNlLWRifScKICAgICAgLSAnUEdfTUVUQV9EQl9QT1JUPSR7UE9TVEdSRVNfUE9SVDotNTQzMn0nCiAgICAgIC0gJ1BHX01FVEFfREJfTkFNRT0ke1BPU1RHUkVTX0RCOi1wb3N0Z3Jlc30nCiAgICAgIC0gUEdfTUVUQV9EQl9VU0VSPXN1cGFiYXNlX2FkbWluCiAgICAgIC0gJ1BHX01FVEFfREJfUEFTU1dPUkQ9JHtTRVJWSUNFX1BBU1NXT1JEX1BPU1RHUkVTfScKICBzdXBhYmFzZS1lZGdlLWZ1bmN0aW9uczoKICAgIGltYWdlOiAnc3VwYWJhc2UvZWRnZS1ydW50aW1lOnYxLjY3LjQnCiAgICBkZXBlbmRzX29uOgogICAgICBzdXBhYmFzZS1hbmFseXRpY3M6CiAgICAgICAgY29uZGl0aW9uOiBzZXJ2aWNlX2hlYWx0aHkKICAgIGhlYWx0aGNoZWNrOgogICAgICB0ZXN0OgogICAgICAgIC0gQ01ECiAgICAgICAgLSBlY2hvCiAgICAgICAgLSAnRWRnZSBGdW5jdGlvbnMgaXMgaGVhbHRoeScKICAgICAgdGltZW91dDogNXMKICAgICAgaW50ZXJ2YWw6IDVzCiAgICAgIHJldHJpZXM6IDMKICAgIGVudmlyb25tZW50OgogICAgICAtICdKV1RfU0VDUkVUPSR7U0VSVklDRV9QQVNTV09SRF9KV1R9JwogICAgICAtICdTVVBBQkFTRV9VUkw9JHtTRVJWSUNFX0ZRRE5fU1VQQUJBU0VLT05HfScKICAgICAgLSAnU1VQQUJBU0VfQU5PTl9LRVk9JHtTRVJWSUNFX1NVUEFCQVNFQU5PTl9LRVl9JwogICAgICAtICdTVVBBQkFTRV9TRVJWSUNFX1JPTEVfS0VZPSR7U0VSVklDRV9TVVBBQkFTRVNFUlZJQ0VfS0VZfScKICAgICAgLSAnU1VQQUJBU0VfREJfVVJMPXBvc3RncmVzcWw6Ly9wb3N0Z3Jlczoke1NFUlZJQ0VfUEFTU1dPUkRfUE9TVEdSRVN9QCR7UE9TVEdSRVNfSE9TVE5BTUU6LXN1cGFiYXNlLWRifToke1BPU1RHUkVTX1BPUlQ6LTU0MzJ9LyR7UE9TVEdSRVNfREI6LXBvc3RncmVzfScKICAgICAgLSAnVkVSSUZZX0pXVD0ke0ZVTkNUSU9OU19WRVJJRllfSldUOi1mYWxzZX0nCiAgICB2b2x1bWVzOgogICAgICAtICcuL3ZvbHVtZXMvZnVuY3Rpb25zOi9ob21lL2Rlbm8vZnVuY3Rpb25zJwogICAgICAtCiAgICAgICAgdHlwZTogYmluZAogICAgICAgIHNvdXJjZTogLi92b2x1bWVzL2Z1bmN0aW9ucy9tYWluL2luZGV4LnRzCiAgICAgICAgdGFyZ2V0OiAvaG9tZS9kZW5vL2Z1bmN0aW9ucy9tYWluL2luZGV4LnRzCiAgICAgICAgY29udGVudDogImltcG9ydCB7IHNlcnZlIH0gZnJvbSAnaHR0cHM6Ly9kZW5vLmxhbmQvc3RkQDAuMTMxLjAvaHR0cC9zZXJ2ZXIudHMnXG5pbXBvcnQgKiBhcyBqb3NlIGZyb20gJ2h0dHBzOi8vZGVuby5sYW5kL3gvam9zZUB2NC4xNC40L2luZGV4LnRzJ1xuXG5jb25zb2xlLmxvZygnbWFpbiBmdW5jdGlvbiBzdGFydGVkJylcblxuY29uc3QgSldUX1NFQ1JFVCA9IERlbm8uZW52LmdldCgnSldUX1NFQ1JFVCcpXG5jb25zdCBWRVJJRllfSldUID0gRGVuby5lbnYuZ2V0KCdWRVJJRllfSldUJykgPT09ICd0cnVlJ1xuXG5mdW5jdGlvbiBnZXRBdXRoVG9rZW4ocmVxOiBSZXF1ZXN0KSB7XG4gIGNvbnN0IGF1dGhIZWFkZXIgPSByZXEuaGVhZGVycy5nZXQoJ2F1dGhvcml6YXRpb24nKVxuICBpZiAoIWF1dGhIZWFkZXIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ01pc3NpbmcgYXV0aG9yaXphdGlvbiBoZWFkZXInKVxuICB9XG4gIGNvbnN0IFtiZWFyZXIsIHRva2VuXSA9IGF1dGhIZWFkZXIuc3BsaXQoJyAnKVxuICBpZiAoYmVhcmVyICE9PSAnQmVhcmVyJykge1xuICAgIHRocm93IG5ldyBFcnJvcihgQXV0aCBoZWFkZXIgaXMgbm90ICdCZWFyZXIge3Rva2VufSdgKVxuICB9XG4gIHJldHVybiB0b2tlblxufVxuXG5hc3luYyBmdW5jdGlvbiB2ZXJpZnlKV1Qoand0OiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgY29uc3QgZW5jb2RlciA9IG5ldyBUZXh0RW5jb2RlcigpXG4gIGNvbnN0IHNlY3JldEtleSA9IGVuY29kZXIuZW5jb2RlKEpXVF9TRUNSRVQpXG4gIHRyeSB7XG4gICAgYXdhaXQgam9zZS5qd3RWZXJpZnkoand0LCBzZWNyZXRLZXkpXG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGNvbnNvbGUuZXJyb3IoZXJyKVxuICAgIHJldHVybiBmYWxzZVxuICB9XG4gIHJldHVybiB0cnVlXG59XG5cbnNlcnZlKGFzeW5jIChyZXE6IFJlcXVlc3QpID0+IHtcbiAgaWYgKHJlcS5tZXRob2QgIT09ICdPUFRJT05TJyAmJiBWRVJJRllfSldUKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHRva2VuID0gZ2V0QXV0aFRva2VuKHJlcSlcbiAgICAgIGNvbnN0IGlzVmFsaWRKV1QgPSBhd2FpdCB2ZXJpZnlKV1QodG9rZW4pXG5cbiAgICAgIGlmICghaXNWYWxpZEpXVCkge1xuICAgICAgICByZXR1cm4gbmV3IFJlc3BvbnNlKEpTT04uc3RyaW5naWZ5KHsgbXNnOiAnSW52YWxpZCBKV1QnIH0pLCB7XG4gICAgICAgICAgc3RhdHVzOiA0MDEsXG4gICAgICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgY29uc29sZS5lcnJvcihlKVxuICAgICAgcmV0dXJuIG5ldyBSZXNwb25zZShKU09OLnN0cmluZ2lmeSh7IG1zZzogZS50b1N0cmluZygpIH0pLCB7XG4gICAgICAgIHN0YXR1czogNDAxLFxuICAgICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgIH0pXG4gICAgfVxuICB9XG5cbiAgY29uc3QgdXJsID0gbmV3IFVSTChyZXEudXJsKVxuICBjb25zdCB7IHBhdGhuYW1lIH0gPSB1cmxcbiAgY29uc3QgcGF0aF9wYXJ0cyA9IHBhdGhuYW1lLnNwbGl0KCcvJylcbiAgY29uc3Qgc2VydmljZV9uYW1lID0gcGF0aF9wYXJ0c1sxXVxuXG4gIGlmICghc2VydmljZV9uYW1lIHx8IHNlcnZpY2VfbmFtZSA9PT0gJycpIHtcbiAgICBjb25zdCBlcnJvciA9IHsgbXNnOiAnbWlzc2luZyBmdW5jdGlvbiBuYW1lIGluIHJlcXVlc3QnIH1cbiAgICByZXR1cm4gbmV3IFJlc3BvbnNlKEpTT04uc3RyaW5naWZ5KGVycm9yKSwge1xuICAgICAgc3RhdHVzOiA0MDAsXG4gICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICB9KVxuICB9XG5cbiAgY29uc3Qgc2VydmljZVBhdGggPSBgL2hvbWUvZGVuby9mdW5jdGlvbnMvJHtzZXJ2aWNlX25hbWV9YFxuICBjb25zb2xlLmVycm9yKGBzZXJ2aW5nIHRoZSByZXF1ZXN0IHdpdGggJHtzZXJ2aWNlUGF0aH1gKVxuXG4gIGNvbnN0IG1lbW9yeUxpbWl0TWIgPSAxNTBcbiAgY29uc3Qgd29ya2VyVGltZW91dE1zID0gMSAqIDYwICogMTAwMFxuICBjb25zdCBub01vZHVsZUNhY2hlID0gZmFsc2VcbiAgY29uc3QgaW1wb3J0TWFwUGF0aCA9IG51bGxcbiAgY29uc3QgZW52VmFyc09iaiA9IERlbm8uZW52LnRvT2JqZWN0KClcbiAgY29uc3QgZW52VmFycyA9IE9iamVjdC5rZXlzKGVudlZhcnNPYmopLm1hcCgoaykgPT4gW2ssIGVudlZhcnNPYmpba11dKVxuXG4gIHRyeSB7XG4gICAgY29uc3Qgd29ya2VyID0gYXdhaXQgRWRnZVJ1bnRpbWUudXNlcldvcmtlcnMuY3JlYXRlKHtcbiAgICAgIHNlcnZpY2VQYXRoLFxuICAgICAgbWVtb3J5TGltaXRNYixcbiAgICAgIHdvcmtlclRpbWVvdXRNcyxcbiAgICAgIG5vTW9kdWxlQ2FjaGUsXG4gICAgICBpbXBvcnRNYXBQYXRoLFxuICAgICAgZW52VmFycyxcbiAgICB9KVxuICAgIHJldHVybiBhd2FpdCB3b3JrZXIuZmV0Y2gocmVxKVxuICB9IGNhdGNoIChlKSB7XG4gICAgY29uc3QgZXJyb3IgPSB7IG1zZzogZS50b1N0cmluZygpIH1cbiAgICByZXR1cm4gbmV3IFJlc3BvbnNlKEpTT04uc3RyaW5naWZ5KGVycm9yKSwge1xuICAgICAgc3RhdHVzOiA1MDAsXG4gICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICB9KVxuICB9XG59KVxuIgogICAgICAtCiAgICAgICAgdHlwZTogYmluZAogICAgICAgIHNvdXJjZTogLi92b2x1bWVzL2Z1bmN0aW9ucy9oZWxsby9pbmRleC50cwogICAgICAgIHRhcmdldDogL2hvbWUvZGVuby9mdW5jdGlvbnMvaGVsbG8vaW5kZXgudHMKICAgICAgICBjb250ZW50OiAiLy8gRm9sbG93IHRoaXMgc2V0dXAgZ3VpZGUgdG8gaW50ZWdyYXRlIHRoZSBEZW5vIGxhbmd1YWdlIHNlcnZlciB3aXRoIHlvdXIgZWRpdG9yOlxuLy8gaHR0cHM6Ly9kZW5vLmxhbmQvbWFudWFsL2dldHRpbmdfc3RhcnRlZC9zZXR1cF95b3VyX2Vudmlyb25tZW50XG4vLyBUaGlzIGVuYWJsZXMgYXV0b2NvbXBsZXRlLCBnbyB0byBkZWZpbml0aW9uLCBldGMuXG5cbmltcG9ydCB7IHNlcnZlIH0gZnJvbSBcImh0dHBzOi8vZGVuby5sYW5kL3N0ZEAwLjE3Ny4xL2h0dHAvc2VydmVyLnRzXCJcblxuc2VydmUoYXN5bmMgKCkgPT4ge1xuICByZXR1cm4gbmV3IFJlc3BvbnNlKFxuICAgIGBcIkhlbGxvIGZyb20gRWRnZSBGdW5jdGlvbnMhXCJgLFxuICAgIHsgaGVhZGVyczogeyBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIiB9IH0sXG4gIClcbn0pXG5cbi8vIFRvIGludm9rZTpcbi8vIGN1cmwgJ2h0dHA6Ly9sb2NhbGhvc3Q6PEtPTkdfSFRUUF9QT1JUPi9mdW5jdGlvbnMvdjEvaGVsbG8nIFxcXG4vLyAgIC0taGVhZGVyICdBdXRob3JpemF0aW9uOiBCZWFyZXIgPGFub24vc2VydmljZV9yb2xlIEFQSSBrZXk+J1xuIgogICAgY29tbWFuZDoKICAgICAgLSBzdGFydAogICAgICAtICctLW1haW4tc2VydmljZScKICAgICAgLSAvaG9tZS9kZW5vL2Z1bmN0aW9ucy9tYWluCiAgc3VwYWJhc2Utc3VwYXZpc29yOgogICAgaW1hZ2U6ICdzdXBhYmFzZS9zdXBhdmlzb3I6Mi41LjEnCiAgICBoZWFsdGhjaGVjazoKICAgICAgdGVzdDoKICAgICAgICAtIENNRAogICAgICAgIC0gY3VybAogICAgICAgIC0gJy1zU2ZMJwogICAgICAgIC0gJy1vJwogICAgICAgIC0gL2Rldi9udWxsCiAgICAgICAgLSAnaHR0cDovLzEyNy4wLjAuMTo0MDAwL2FwaS9oZWFsdGgnCiAgICAgIHRpbWVvdXQ6IDVzCiAgICAgIGludGVydmFsOiA1cwogICAgICByZXRyaWVzOiAxMAogICAgZGVwZW5kc19vbjoKICAgICAgc3VwYWJhc2UtZGI6CiAgICAgICAgY29uZGl0aW9uOiBzZXJ2aWNlX2hlYWx0aHkKICAgICAgc3VwYWJhc2UtYW5hbHl0aWNzOgogICAgICAgIGNvbmRpdGlvbjogc2VydmljZV9oZWFsdGh5CiAgICBlbnZpcm9ubWVudDoKICAgICAgLSBQT09MRVJfVEVOQU5UX0lEPWRldl90ZW5hbnQKICAgICAgLSBQT09MRVJfUE9PTF9NT0RFPXRyYW5zYWN0aW9uCiAgICAgIC0gJ1BPT0xFUl9ERUZBVUxUX1BPT0xfU0laRT0ke1BPT0xFUl9ERUZBVUxUX1BPT0xfU0laRTotMjB9JwogICAgICAtICdQT09MRVJfTUFYX0NMSUVOVF9DT05OPSR7UE9PTEVSX01BWF9DTElFTlRfQ09OTjotMTAwfScKICAgICAgLSBQT1JUPTQwMDAKICAgICAgLSAnUE9TVEdSRVNfUE9SVD0ke1BPU1RHUkVTX1BPUlQ6LTU0MzJ9JwogICAgICAtICdQT1NUR1JFU19IT1NUTkFNRT0ke1BPU1RHUkVTX0hPU1ROQU1FOi1zdXBhYmFzZS1kYn0nCiAgICAgIC0gJ1BPU1RHUkVTX0RCPSR7UE9TVEdSRVNfREI6LXBvc3RncmVzfScKICAgICAgLSAnUE9TVEdSRVNfUEFTU1dPUkQ9JHtTRVJWSUNFX1BBU1NXT1JEX1BPU1RHUkVTfScKICAgICAgLSAnREFUQUJBU0VfVVJMPWVjdG86Ly9zdXBhYmFzZV9hZG1pbjoke1NFUlZJQ0VfUEFTU1dPUkRfUE9TVEdSRVN9QCR7UE9TVEdSRVNfSE9TVE5BTUU6LXN1cGFiYXNlLWRifToke1BPU1RHUkVTX1BPUlQ6LTU0MzJ9L19zdXBhYmFzZScKICAgICAgLSBDTFVTVEVSX1BPU1RHUkVTPXRydWUKICAgICAgLSAnU0VDUkVUX0tFWV9CQVNFPSR7U0VSVklDRV9QQVNTV09SRF9TVVBBVklTT1JTRUNSRVR9JwogICAgICAtICdWQVVMVF9FTkNfS0VZPSR7U0VSVklDRV9QQVNTV09SRF9WQVVMVEVOQ30nCiAgICAgIC0gJ0FQSV9KV1RfU0VDUkVUPSR7U0VSVklDRV9QQVNTV09SRF9KV1R9JwogICAgICAtICdNRVRSSUNTX0pXVF9TRUNSRVQ9JHtTRVJWSUNFX1BBU1NXT1JEX0pXVH0nCiAgICAgIC0gUkVHSU9OPWxvY2FsCiAgICAgIC0gJ0VSTF9BRkxBR1M9LXByb3RvX2Rpc3QgaW5ldF90Y3AnCiAgICBjb21tYW5kOgogICAgICAtIC9iaW4vc2gKICAgICAgLSAnLWMnCiAgICAgIC0gJy9hcHAvYmluL21pZ3JhdGUgJiYgL2FwcC9iaW4vc3VwYXZpc29yIGV2YWwgIiQkKGNhdCAvZXRjL3Bvb2xlci9wb29sZXIuZXhzKSIgJiYgL2FwcC9iaW4vc2VydmVyJwogICAgdm9sdW1lczoKICAgICAgLQogICAgICAgIHR5cGU6IGJpbmQKICAgICAgICBzb3VyY2U6IC4vdm9sdW1lcy9wb29sZXIvcG9vbGVyLmV4cwogICAgICAgIHRhcmdldDogL2V0Yy9wb29sZXIvcG9vbGVyLmV4cwogICAgICAgIGNvbnRlbnQ6ICJ7Om9rLCBffSA9IEFwcGxpY2F0aW9uLmVuc3VyZV9hbGxfc3RhcnRlZCg6c3VwYXZpc29yKVxuezpvaywgdmVyc2lvbn0gPVxuICAgIGNhc2UgU3VwYXZpc29yLlJlcG8ucXVlcnkhKFwic2VsZWN0IHZlcnNpb24oKVwiKSBkb1xuICAgICV7cm93czogW1t2ZXJdXX0gLT4gU3VwYXZpc29yLkhlbHBlcnMucGFyc2VfcGdfdmVyc2lvbih2ZXIpXG4gICAgXyAtPiBuaWxcbiAgICBlbmRcbnBhcmFtcyA9ICV7XG4gICAgXCJleHRlcm5hbF9pZFwiID0+IFN5c3RlbS5nZXRfZW52KFwiUE9PTEVSX1RFTkFOVF9JRFwiKSxcbiAgICBcImRiX2hvc3RcIiA9PiBTeXN0ZW0uZ2V0X2VudihcIlBPU1RHUkVTX0hPU1ROQU1FXCIpLFxuICAgIFwiZGJfcG9ydFwiID0+IFN5c3RlbS5nZXRfZW52KFwiUE9TVEdSRVNfUE9SVFwiKSB8PiBTdHJpbmcudG9faW50ZWdlcigpLFxuICAgIFwiZGJfZGF0YWJhc2VcIiA9PiBTeXN0ZW0uZ2V0X2VudihcIlBPU1RHUkVTX0RCXCIpLFxuICAgIFwicmVxdWlyZV91c2VyXCIgPT4gZmFsc2UsXG4gICAgXCJhdXRoX3F1ZXJ5XCIgPT4gXCJTRUxFQ1QgKiBGUk9NIHBnYm91bmNlci5nZXRfYXV0aCgkMSlcIixcbiAgICBcImRlZmF1bHRfbWF4X2NsaWVudHNcIiA9PiBTeXN0ZW0uZ2V0X2VudihcIlBPT0xFUl9NQVhfQ0xJRU5UX0NPTk5cIiksXG4gICAgXCJkZWZhdWx0X3Bvb2xfc2l6ZVwiID0+IFN5c3RlbS5nZXRfZW52KFwiUE9PTEVSX0RFRkFVTFRfUE9PTF9TSVpFXCIpLFxuICAgIFwiZGVmYXVsdF9wYXJhbWV0ZXJfc3RhdHVzXCIgPT4gJXtcInNlcnZlcl92ZXJzaW9uXCIgPT4gdmVyc2lvbn0sXG4gICAgXCJ1c2Vyc1wiID0+IFsle1xuICAgIFwiZGJfdXNlclwiID0+IFwicGdib3VuY2VyXCIsXG4gICAgXCJkYl9wYXNzd29yZFwiID0+IFN5c3RlbS5nZXRfZW52KFwiUE9TVEdSRVNfUEFTU1dPUkRcIiksXG4gICAgXCJtb2RlX3R5cGVcIiA9PiBTeXN0ZW0uZ2V0X2VudihcIlBPT0xFUl9QT09MX01PREVcIiksXG4gICAgXCJwb29sX3NpemVcIiA9PiBTeXN0ZW0uZ2V0X2VudihcIlBPT0xFUl9ERUZBVUxUX1BPT0xfU0laRVwiKSxcbiAgICBcImlzX21hbmFnZXJcIiA9PiB0cnVlXG4gICAgfV1cbn1cblxudGVuYW50ID0gU3VwYXZpc29yLlRlbmFudHMuZ2V0X3RlbmFudF9ieV9leHRlcm5hbF9pZChwYXJhbXNbXCJleHRlcm5hbF9pZFwiXSlcblxuaWYgdGVuYW50IGRvXG4gIHs6b2ssIF99ID0gU3VwYXZpc29yLlRlbmFudHMudXBkYXRlX3RlbmFudCh0ZW5hbnQsIHBhcmFtcylcbmVsc2VcbiAgezpvaywgX30gPSBTdXBhdmlzb3IuVGVuYW50cy5jcmVhdGVfdGVuYW50KHBhcmFtcylcbmVuZFxuIgo=", "tags": [ "firebase", "alternative", From b70a9a6d47a8a20aefe367c7fc7c10b2cde0dd35 Mon Sep 17 00:00:00 2001 From: Darren Sisson <74752850+djsisson@users.noreply.github.com> Date: Fri, 13 Jun 2025 17:02:52 +0100 Subject: [PATCH 0131/1232] change db proxy to use volume mount for config (#5981) * change db proxy to use volume mount for config * fix(database-proxy): adjust configuration directory for development environment --------- Co-authored-by: Andras Bacsai <5845193+andrasbacsai@users.noreply.github.com> --- app/Actions/Database/StartDatabaseProxy.php | 23 ++++++++++----------- 1 file changed, 11 insertions(+), 12 deletions(-) diff --git a/app/Actions/Database/StartDatabaseProxy.php b/app/Actions/Database/StartDatabaseProxy.php index c4a40f020..744bbaa50 100644 --- a/app/Actions/Database/StartDatabaseProxy.php +++ b/app/Actions/Database/StartDatabaseProxy.php @@ -44,6 +44,9 @@ public function handle(StandaloneRedis|StandalonePostgresql|StandaloneMongodb|St }; $configuration_dir = database_proxy_dir($database->uuid); + if (isDev()) { + $configuration_dir = '/var/lib/docker/volumes/coolify_dev_coolify_data/_data/databases/'.$database->uuid.'/proxy'; + } $nginxconf = << [ $proxyContainerName => [ - 'build' => [ - 'context' => $configuration_dir, - 'dockerfile' => 'Dockerfile', - ], 'image' => 'nginx:stable-alpine', 'container_name' => $proxyContainerName, 'restart' => RESTART_MODE, @@ -81,6 +75,13 @@ public function handle(StandaloneRedis|StandalonePostgresql|StandaloneMongodb|St 'networks' => [ $network, ], + 'volumes' => [ + [ + 'type' => 'bind', + 'source' => "$configuration_dir/nginx.conf", + 'target' => '/etc/nginx/nginx.conf', + ], + ], 'healthcheck' => [ 'test' => [ 'CMD-SHELL', @@ -103,15 +104,13 @@ public function handle(StandaloneRedis|StandalonePostgresql|StandaloneMongodb|St ]; $dockercompose_base64 = base64_encode(Yaml::dump($docker_compose, 4, 2)); $nginxconf_base64 = base64_encode($nginxconf); - $dockerfile_base64 = base64_encode($dockerfile); instant_remote_process(["docker rm -f $proxyContainerName"], $server, false); instant_remote_process([ "mkdir -p $configuration_dir", - "echo '{$dockerfile_base64}' | base64 -d | tee $configuration_dir/Dockerfile > /dev/null", "echo '{$nginxconf_base64}' | base64 -d | tee $configuration_dir/nginx.conf > /dev/null", "echo '{$dockercompose_base64}' | base64 -d | tee $configuration_dir/docker-compose.yaml > /dev/null", "docker compose --project-directory {$configuration_dir} pull", - "docker compose --project-directory {$configuration_dir} up --build -d", + "docker compose --project-directory {$configuration_dir} up -d", ], $server); } } From 15472aa0b7b1ab0f44150b5818728382c83ecce6 Mon Sep 17 00:00:00 2001 From: Andras Bacsai <5845193+andrasbacsai@users.noreply.github.com> Date: Sat, 14 Jun 2025 12:42:14 +0200 Subject: [PATCH 0132/1232] Enhance terminal connection handling in execute-container-command view --- .../execute-container-command.blade.php | 98 +++++++++---------- 1 file changed, 47 insertions(+), 51 deletions(-) diff --git a/resources/views/livewire/project/shared/execute-container-command.blade.php b/resources/views/livewire/project/shared/execute-container-command.blade.php index dc484f5e7..f34a62bd4 100644 --- a/resources/views/livewire/project/shared/execute-container-command.blade.php +++ b/resources/views/livewire/project/shared/execute-container-command.blade.php @@ -33,11 +33,32 @@
+ @endif + @if ($type === 'server') + @if ($server->isTerminalEnabled()) +
+

Terminal

+ + Reconnect + + {{-- Loading indicator for all connection states --}} + @if (!$containersLoaded || $isConnecting || $connectionStatus) + {{ $connectionStatus }} + @endif +
+
+ +
+ @else +
Terminal access is disabled on this server.
+ @endif @else - @if ($type === 'server') - @if ($server->isTerminalEnabled()) -
+ @if (count($containers) === 0) +
No containers are running on this server or terminal access is disabled.
+ @else + @if (count($containers) === 1) +

Terminal

Reconnect @@ -48,57 +69,32 @@ @if (!$containersLoaded || $isConnecting || $connectionStatus) {{ $connectionStatus }} @endif - -
- -
@else -
Terminal access is disabled on this server.
- @endif - @else - @if (count($containers) === 0) -
No containers are running on this server or terminal access is disabled.
- @else - @if (count($containers) === 1) - -

Terminal

- - Reconnect - - +
+ + @foreach ($containers as $container) + @if ($loop->first) + + @endif + + @endforeach + + + {{ $isConnecting ? 'Connecting...' : 'Connect' }} + +
- {{-- Loading indicator for all connection states --}} - @if (!$containersLoaded || $isConnecting || $connectionStatus) - {{ $connectionStatus }} - @endif - @else -
- - @foreach ($containers as $container) - @if ($loop->first) - - @endif - - @endforeach - - - {{ $isConnecting ? 'Connecting...' : 'Connect' }} - -
- - {{-- Loading indicator for manual connection --}} - @if ($isConnecting || $connectionStatus) - {{ $connectionStatus }} - @endif + {{-- Loading indicator for manual connection --}} + @if ($isConnecting || $connectionStatus) + {{ $connectionStatus }} @endif -
- -
@endif +
+ +
@endif @endif From 2a419ab8dae65a4b5c3d40fc82295fc36b6e3d05 Mon Sep 17 00:00:00 2001 From: Andras Bacsai <5845193+andrasbacsai@users.noreply.github.com> Date: Sat, 14 Jun 2025 12:42:20 +0200 Subject: [PATCH 0133/1232] Refactor terminal view: streamline HTML structure and improve readability by removing unnecessary conditional blocks --- .../project/shared/terminal.blade.php | 47 +++++++++---------- 1 file changed, 23 insertions(+), 24 deletions(-) diff --git a/resources/views/livewire/project/shared/terminal.blade.php b/resources/views/livewire/project/shared/terminal.blade.php index 47965522e..988ecd662 100644 --- a/resources/views/livewire/project/shared/terminal.blade.php +++ b/resources/views/livewire/project/shared/terminal.blade.php @@ -15,31 +15,30 @@
- @else -
- -
- - -
@endif +
+ +
+
+ + +
@script - @endscript
From 52cd0d83db433bb068b809a8ff3036b63972a8c5 Mon Sep 17 00:00:00 2001 From: Andras Bacsai <5845193+andrasbacsai@users.noreply.github.com> Date: Mon, 16 Jun 2025 13:09:24 +0200 Subject: [PATCH 0136/1232] fix(degraded-status): remove unnecessary whitespace in badge element for cleaner HTML --- resources/views/components/status/degraded.blade.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/views/components/status/degraded.blade.php b/resources/views/components/status/degraded.blade.php index d48e1898c..40dc5f5a4 100644 --- a/resources/views/components/status/degraded.blade.php +++ b/resources/views/components/status/degraded.blade.php @@ -4,7 +4,7 @@
-
+
{{ str($status)->before(':')->headline() }}
From 78e9c8583f6c3b8088bc24af5171fcacac5f52b2 Mon Sep 17 00:00:00 2001 From: Andras Bacsai <5845193+andrasbacsai@users.noreply.github.com> Date: Mon, 16 Jun 2025 13:09:30 +0200 Subject: [PATCH 0137/1232] refactor(navigation): remove wire:navigate directive from configuration links for cleaner HTML structure --- resources/views/livewire/project/database/heading.blade.php | 2 +- resources/views/livewire/project/service/heading.blade.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/resources/views/livewire/project/database/heading.blade.php b/resources/views/livewire/project/database/heading.blade.php index a13da4195..8ecbaba44 100644 --- a/resources/views/livewire/project/database/heading.blade.php +++ b/resources/views/livewire/project/database/heading.blade.php @@ -9,7 +9,7 @@