From ba90ab130a0ad43f702069305265272b78966c8b Mon Sep 17 00:00:00 2001 From: ocket8888 Date: Thu, 9 Sep 2021 16:57:49 -0600 Subject: [PATCH 01/98] Add Dev Docker setup for TO --- traffic_ops/Dockerfile | 33 +++++++++++++++++++++++++++++++++ traffic_ops/dev/cdn.json | 40 ++++++++++++++++++++++++++++++++++++++++ traffic_ops/dev/run.sh | 30 ++++++++++++++++++++++++++++++ 3 files changed, 103 insertions(+) create mode 100644 traffic_ops/Dockerfile create mode 100644 traffic_ops/dev/cdn.json create mode 100755 traffic_ops/dev/run.sh diff --git a/traffic_ops/Dockerfile b/traffic_ops/Dockerfile new file mode 100644 index 0000000000..b829e59d0a --- /dev/null +++ b/traffic_ops/Dockerfile @@ -0,0 +1,33 @@ +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +FROM alpine:latest AS certbuilder +RUN apk add --no-cache openssl +RUN openssl genrsa -passout pass:x -out server.pass.key 2048 && \ + openssl rsa -passin pass:x -in server.pass.key -out server.key && \ + rm server.pass.key && \ + openssl req -new -key server.key -out server.csr \ + -subj "/C=US/ST=CO/L=Denver/O=Apache/OU=Traffic Control/CN=trafficops.dev.ciab.test" && \ + openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt + +FROM alpine:latest AS trafficops-dev + +VOLUME /root/go/src/github.com/apache/trafficcontrol/traffic_ops/traffic_ops_golang +EXPOSE 443 + +COPY --from=certbuilder /server.key /server.csr / +RUN apk add --no-cache inotify-tools go postgresql-client && go install github.com/go-delve/delve/cmd/dlv@latest && ln -s /root/go/bin/dlv /usr/bin/dlv + +COPY dev/run.sh / + +ENTRYPOINT /run.sh diff --git a/traffic_ops/dev/cdn.json b/traffic_ops/dev/cdn.json new file mode 100644 index 0000000000..9733a3d84e --- /dev/null +++ b/traffic_ops/dev/cdn.json @@ -0,0 +1,40 @@ +{ + "hypnotoad" : { + "listen" : [ + "https://[::]:60443?cert=/server.csr&key=/server.key&verify=0x00&ciphers=AES128-GCM-SHA256:HIGH:!RC4:!MD5:!aNULL:!EDH:!ED" + ], + }, + "traffic_ops_golang" : { + "port" : 443, + "log_location_error": "stderr", + "log_location_warning": "stderr", + "log_location_info": "stdout", + "log_location_debug": "stdout", + "log_location_event": "stdout", + "whitelisted_oauth_urls": [], + "oauth_client_secret": "", + "traffic_vault_backend": "postgres", + "traffic_vault_config": {}, + "supported_ds_metrics": [ "kbps", "tps_total", "tps_2xx", "tps_3xx", "tps_4xx", "tps_5xx" ], + }, + "use_ims": true, + "role_based_permissions": false, + "cors" : { + "access_control_allow_origin" : "*" + }, + "to" : { + "base_url" : "https://localhost:6443", + "email_from" : "no-reply@traffic-ops-domain.com", + "no_account_found_msg" : "A Traffic Ops user account is required for access. Please contact your Traffic Ops user administrator." + }, + "portal" : { + "base_url" : "https://localhost/#!/", + "docs_url" : "https://traffic-control-cdn.readthedocs.io/en/latest/admin/traffic_portal/usingtrafficportal.html", + "email_from" : "no-reply@traffic-portal-domain.com", + "pass_reset_path" : "user", + "user_register_path" : "user" + }, + "secrets" : [ + "mONKEYDOmONKEYSEE." + ], +} diff --git a/traffic_ops/dev/run.sh b/traffic_ops/dev/run.sh new file mode 100755 index 0000000000..fcd2b26570 --- /dev/null +++ b/traffic_ops/dev/run.sh @@ -0,0 +1,30 @@ +#!/bin/sh + +set -o errexit +trap '[ $? -eq 0 ] && exit 0 || echo "Error on line ${LINENO} of ${0}"; exit 1' EXIT + +while ! pg_isready -h db -p 5432 -d postgres; do + echo "waiting for db on postgresql://db:5432/postgres"; + sleep 3; +done + +exit 0 + +DB_CFG_FILE="$(mktemp)" + +mkdir -p git +cd /traffic_ops_golang + +dlv --accept-multiclient --continue --listen=:6444 --headless --api-version=2 debug -- --cfg="$CFG_FILE" --dbcfg="$DB_CFG_FILE" + + +while inotifywait --exclude .swp -e modify -r . ; +do + # find PID of the file generated by `go run .` to kill it. make sure the grep does not match other processes running on the system + IDS=$(ps ax | grep "/tmp/go-build" | grep "b001/exe/main" | grep -v "grep" | awk '{print $1}') + if [ ! -z "$IDS" ] + then + kill $IDS; + fi + go run . & +done; From 29867aa5d4b178ec5e571d2dd25b0aa637178590 Mon Sep 17 00:00:00 2001 From: ocket8888 Date: Thu, 9 Sep 2021 16:58:35 -0600 Subject: [PATCH 02/98] Add CiaB-dev docker-compose file --- docker-compose.yml | 43 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 docker-compose.yml diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000000..4d8ae99062 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,43 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + +--- +version: '3.5' + +services: + # trafficops runs Traffic Ops in a container. + trafficops: + build: + context: traffic_ops/ + depends_on: + - db + domainname: dev.ciab.test + hostname: trafficops + image: trafficops-dev + ports: + - 6443:443 + volumes: + - ./traffic_ops/traffic_ops_golang:/root/go/src/github.com/apache/trafficcontrol/traffic_ops/traffic_ops_golang + + db: + image: postgres:13.2-alpine + ports: + - 5432:5432 + environment: + - POSTGRES_PASSWORD=twelve12 + hostname: db + domainname: dev.ciab.test From 4fa684019181d43f13e10ec0b360900762b818f0 Mon Sep 17 00:00:00 2001 From: ocket8888 Date: Thu, 9 Sep 2021 20:16:16 -0600 Subject: [PATCH 03/98] Add resetting the database on TO startup --- traffic_ops/Dockerfile | 6 +++++- traffic_ops/dev/cdn.json | 14 ++++++++++---- traffic_ops/dev/dbconf.yml | 21 +++++++++++++++++++++ traffic_ops/dev/run.sh | 10 ++++++---- traffic_ops/dev/traffic.vault.dbconf.yml | 21 +++++++++++++++++++++ 5 files changed, 63 insertions(+), 9 deletions(-) create mode 100644 traffic_ops/dev/dbconf.yml create mode 100644 traffic_ops/dev/traffic.vault.dbconf.yml diff --git a/traffic_ops/Dockerfile b/traffic_ops/Dockerfile index b829e59d0a..563c50d851 100644 --- a/traffic_ops/Dockerfile +++ b/traffic_ops/Dockerfile @@ -27,7 +27,11 @@ EXPOSE 443 COPY --from=certbuilder /server.key /server.csr / RUN apk add --no-cache inotify-tools go postgresql-client && go install github.com/go-delve/delve/cmd/dlv@latest && ln -s /root/go/bin/dlv /usr/bin/dlv +RUN mkdir /lib64 && ln -s /lib/libc.musl-x86_64.so.1 /lib64/ld-linux-x86-64.so.2 -COPY dev/run.sh / +COPY app/db/admin dev/run.sh dev/dbconf.yml dev/traffic.vault.dbconf.yml app/db/create_tables.sql app/db/patches.sql app/db/seeds.sql / +COPY app/db/migrations/ /migrations/ +COPY app/db/trafficvault/migrations/ /traffic_vault_migrations/ +COPY app/db/trafficvault/create_tables.sql /traffic_vault_schema.psql ENTRYPOINT /run.sh diff --git a/traffic_ops/dev/cdn.json b/traffic_ops/dev/cdn.json index 9733a3d84e..0bff3959e7 100644 --- a/traffic_ops/dev/cdn.json +++ b/traffic_ops/dev/cdn.json @@ -2,7 +2,7 @@ "hypnotoad" : { "listen" : [ "https://[::]:60443?cert=/server.csr&key=/server.key&verify=0x00&ciphers=AES128-GCM-SHA256:HIGH:!RC4:!MD5:!aNULL:!EDH:!ED" - ], + ] }, "traffic_ops_golang" : { "port" : 443, @@ -14,8 +14,14 @@ "whitelisted_oauth_urls": [], "oauth_client_secret": "", "traffic_vault_backend": "postgres", - "traffic_vault_config": {}, - "supported_ds_metrics": [ "kbps", "tps_total", "tps_2xx", "tps_3xx", "tps_4xx", "tps_5xx" ], + "traffic_vault_config": { + "dbname": "traffic_vault_development", + "hostname": "db", + "user": "postgres", + "password": "twelve12", + "port": 5432 + }, + "supported_ds_metrics": [ "kbps", "tps_total", "tps_2xx", "tps_3xx", "tps_4xx", "tps_5xx" ] }, "use_ims": true, "role_based_permissions": false, @@ -36,5 +42,5 @@ }, "secrets" : [ "mONKEYDOmONKEYSEE." - ], + ] } diff --git a/traffic_ops/dev/dbconf.yml b/traffic_ops/dev/dbconf.yml new file mode 100644 index 0000000000..1056b5a1d7 --- /dev/null +++ b/traffic_ops/dev/dbconf.yml @@ -0,0 +1,21 @@ +# +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +version: "1.0" +name: dbconf.yml + +development: + driver: postgres + open: host=db port=5432 user=postgres password=twelve12 dbname=traffic_ops_development sslmode=disable diff --git a/traffic_ops/dev/run.sh b/traffic_ops/dev/run.sh index fcd2b26570..024939b22d 100755 --- a/traffic_ops/dev/run.sh +++ b/traffic_ops/dev/run.sh @@ -8,14 +8,16 @@ while ! pg_isready -h db -p 5432 -d postgres; do sleep 3; done -exit 0 +/admin -c /dbconf.yml -s /create_tables.sql -S /seeds.sql -p /patches.sql -m /migrations reset +/admin -c /dbconf.yml -s /create_tables.sql -S /seeds.sql -p /patches.sql -m /migrations upgrade -DB_CFG_FILE="$(mktemp)" +rm -rf /dbconf.yml /create_tables.sql /seeds.sql /patches.sql /migrations /admin -mkdir -p git cd /traffic_ops_golang -dlv --accept-multiclient --continue --listen=:6444 --headless --api-version=2 debug -- --cfg="$CFG_FILE" --dbcfg="$DB_CFG_FILE" +exit 0 + +dlv --accept-multiclient --continue --listen=:6444 --headless --api-version=2 debug -- --cfg=/cdn.json --dbcfg=/dbconf.yml while inotifywait --exclude .swp -e modify -r . ; diff --git a/traffic_ops/dev/traffic.vault.dbconf.yml b/traffic_ops/dev/traffic.vault.dbconf.yml new file mode 100644 index 0000000000..bca0ac6277 --- /dev/null +++ b/traffic_ops/dev/traffic.vault.dbconf.yml @@ -0,0 +1,21 @@ +# +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +version: "1.0" +name: traffic.vault.dbconf.yml + +development: + driver: postgres + open: host=db port=5432 user=postgres password=twelve12 dbname=traffic_vault_development sslmode=disable From dda305064ef0010ed652f0fd7a5a711be6e0b017 Mon Sep 17 00:00:00 2001 From: ocket8888 Date: Thu, 9 Sep 2021 20:56:00 -0600 Subject: [PATCH 04/98] Mount all of ATC as a volume, fix pg connection settings --- docker-compose.yml | 2 +- traffic_ops/Dockerfile | 4 +++- traffic_ops/dev/.pgpass | 17 +++++++++++++++++ traffic_ops/dev/cdn.json | 2 +- traffic_ops/dev/dbconf.yml | 2 +- traffic_ops/dev/traffic.vault.dbconf.yml | 2 +- 6 files changed, 24 insertions(+), 5 deletions(-) create mode 100644 traffic_ops/dev/.pgpass diff --git a/docker-compose.yml b/docker-compose.yml index 4d8ae99062..e85999e19b 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -31,7 +31,7 @@ services: ports: - 6443:443 volumes: - - ./traffic_ops/traffic_ops_golang:/root/go/src/github.com/apache/trafficcontrol/traffic_ops/traffic_ops_golang + - ./:/root/go/src/github.com/apache/trafficcontrol/ db: image: postgres:13.2-alpine diff --git a/traffic_ops/Dockerfile b/traffic_ops/Dockerfile index 563c50d851..40e72f4d53 100644 --- a/traffic_ops/Dockerfile +++ b/traffic_ops/Dockerfile @@ -22,13 +22,15 @@ RUN openssl genrsa -passout pass:x -out server.pass.key 2048 && \ FROM alpine:latest AS trafficops-dev -VOLUME /root/go/src/github.com/apache/trafficcontrol/traffic_ops/traffic_ops_golang +VOLUME /root/go/src/github.com/apache/trafficcontrol EXPOSE 443 COPY --from=certbuilder /server.key /server.csr / RUN apk add --no-cache inotify-tools go postgresql-client && go install github.com/go-delve/delve/cmd/dlv@latest && ln -s /root/go/bin/dlv /usr/bin/dlv RUN mkdir /lib64 && ln -s /lib/libc.musl-x86_64.so.1 /lib64/ld-linux-x86-64.so.2 +COPY dev/.pgpass /root/.pgpass +RUN chmod 0600 /root/.pgpass COPY app/db/admin dev/run.sh dev/dbconf.yml dev/traffic.vault.dbconf.yml app/db/create_tables.sql app/db/patches.sql app/db/seeds.sql / COPY app/db/migrations/ /migrations/ COPY app/db/trafficvault/migrations/ /traffic_vault_migrations/ diff --git a/traffic_ops/dev/.pgpass b/traffic_ops/dev/.pgpass new file mode 100644 index 0000000000..a33d63bbe5 --- /dev/null +++ b/traffic_ops/dev/.pgpass @@ -0,0 +1,17 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +db:5432:postgres:postgres:twelve12 diff --git a/traffic_ops/dev/cdn.json b/traffic_ops/dev/cdn.json index 0bff3959e7..a849d423c2 100644 --- a/traffic_ops/dev/cdn.json +++ b/traffic_ops/dev/cdn.json @@ -17,7 +17,7 @@ "traffic_vault_config": { "dbname": "traffic_vault_development", "hostname": "db", - "user": "postgres", + "user": "traffic_ops", "password": "twelve12", "port": 5432 }, diff --git a/traffic_ops/dev/dbconf.yml b/traffic_ops/dev/dbconf.yml index 1056b5a1d7..8d7f8d16bd 100644 --- a/traffic_ops/dev/dbconf.yml +++ b/traffic_ops/dev/dbconf.yml @@ -18,4 +18,4 @@ name: dbconf.yml development: driver: postgres - open: host=db port=5432 user=postgres password=twelve12 dbname=traffic_ops_development sslmode=disable + open: host=db port=5432 user=traffic_ops password=twelve12 dbname=traffic_ops_development sslmode=disable diff --git a/traffic_ops/dev/traffic.vault.dbconf.yml b/traffic_ops/dev/traffic.vault.dbconf.yml index bca0ac6277..743a413f0d 100644 --- a/traffic_ops/dev/traffic.vault.dbconf.yml +++ b/traffic_ops/dev/traffic.vault.dbconf.yml @@ -18,4 +18,4 @@ name: traffic.vault.dbconf.yml development: driver: postgres - open: host=db port=5432 user=postgres password=twelve12 dbname=traffic_vault_development sslmode=disable + open: host=db port=5432 user=traffic_ops password=twelve12 dbname=traffic_vault_development sslmode=disable From b22754a6a3f8128299a6cbfde791fc1bc6af609b Mon Sep 17 00:00:00 2001 From: ocket8888 Date: Thu, 9 Sep 2021 20:56:39 -0600 Subject: [PATCH 05/98] Make the top-level Makefile build stuff --- Makefile | 27 ++++++++++++++++++++------- 1 file changed, 20 insertions(+), 7 deletions(-) diff --git a/Makefile b/Makefile index e60a471aae..7c2ec203ab 100644 --- a/Makefile +++ b/Makefile @@ -14,14 +14,27 @@ # KIND, either express or implied. See the License for the # specific language governing permissions and limitations # under the License. -DC_OPTS ?= "--no-ansi" +CACHE_CONFIG_DIRS=$(filter-out cache-config/testing/ cache-config/build/,$(wildcard cache-config/*/)) +TO_SOURCE=$(filter-out %_test.go,$(wildcard traffic_ops/traffic_ops_golang/**.go)) -.PHONY: lint unit +.PHONY: lint unit all check + +all: traffic_ops/traffic_ops_golang/traffic_ops_golang traffic_ops/app/db/admin + +traffic_ops/traffic_ops_golang/traffic_ops_golang: $(TO_SOURCE) + cd traffic_ops/traffic_ops_golang && go build + +traffic_ops/app/db/admin: traffic_ops/app/db/admin.go + cd $(dir $@) && go build -o $(notdir $@) . + +check: unit lint lint: - @echo -n '? ' - docker-compose $(DC_OPTS) -f tools/golang/docker-compose.yml up lint + golangci-lint run ./... + +cache-config/t3c-check-refs/t3c-check-refs: cache-config/t3c-check-refs/config/config.go cache-config/t3c-check-refs/t3c-check-refs.go + go build "github.com/apache/trafficcontrol/cache-config/t3c-check-refs" + mv -f t3c-check-refs $@ -unit: - @echo -n '? ' - docker-compose $(DC_OPTS) -f tools/golang/docker-compose.yml up unit +unit: cache-config/t3c-check-refs/t3c-check-refs + go test $(addsuffix ...,$(addprefix ./,$(CACHE_CONFIG_DIRS))) ./grove/... ./lib/... ./traffic_monitor/... ./traffic_ops/traffic_ops_golang/... ./traffic_stats/... From c72e94dac32cb4df74babf4b8d4e5d2770dd0906 Mon Sep 17 00:00:00 2001 From: ocket8888 Date: Thu, 9 Sep 2021 21:24:28 -0600 Subject: [PATCH 06/98] Add setting up Traffic Vault --- traffic_ops/Dockerfile | 4 ++-- traffic_ops/dev/cdn.json | 2 +- traffic_ops/dev/run.sh | 4 +++- traffic_ops/dev/traffic.vault.dbconf.yml | 2 +- 4 files changed, 7 insertions(+), 5 deletions(-) diff --git a/traffic_ops/Dockerfile b/traffic_ops/Dockerfile index 40e72f4d53..9abb987310 100644 --- a/traffic_ops/Dockerfile +++ b/traffic_ops/Dockerfile @@ -33,7 +33,7 @@ COPY dev/.pgpass /root/.pgpass RUN chmod 0600 /root/.pgpass COPY app/db/admin dev/run.sh dev/dbconf.yml dev/traffic.vault.dbconf.yml app/db/create_tables.sql app/db/patches.sql app/db/seeds.sql / COPY app/db/migrations/ /migrations/ -COPY app/db/trafficvault/migrations/ /traffic_vault_migrations/ -COPY app/db/trafficvault/create_tables.sql /traffic_vault_schema.psql +COPY app/db/trafficvault/migrations/ /traffic.vault.migrations/ +COPY app/db/trafficvault/create_tables.sql /traffic.vault.schema.psql ENTRYPOINT /run.sh diff --git a/traffic_ops/dev/cdn.json b/traffic_ops/dev/cdn.json index a849d423c2..531253d98e 100644 --- a/traffic_ops/dev/cdn.json +++ b/traffic_ops/dev/cdn.json @@ -17,7 +17,7 @@ "traffic_vault_config": { "dbname": "traffic_vault_development", "hostname": "db", - "user": "traffic_ops", + "user": "traffic_vault", "password": "twelve12", "port": 5432 }, diff --git a/traffic_ops/dev/run.sh b/traffic_ops/dev/run.sh index 024939b22d..7a98bedd93 100755 --- a/traffic_ops/dev/run.sh +++ b/traffic_ops/dev/run.sh @@ -10,8 +10,10 @@ done /admin -c /dbconf.yml -s /create_tables.sql -S /seeds.sql -p /patches.sql -m /migrations reset /admin -c /dbconf.yml -s /create_tables.sql -S /seeds.sql -p /patches.sql -m /migrations upgrade +/admin -v -c /traffic.vault.dbconf.yml -s /traffic.vault.schema.psql -m /traffic.vault.migrations reset +/admin -v -c /traffic.vault.dbconf.yml -s /traffic.vault.schema.psql -m /traffic.vault.migrations upgrade -rm -rf /dbconf.yml /create_tables.sql /seeds.sql /patches.sql /migrations /admin +rm -rf /dbconf.yml /create_tables.sql /seeds.sql /patches.sql /migrations /admin /traffic.vault.dbconf.yml /traffic.vault.schema.psql /traffic.vault.migrations cd /traffic_ops_golang diff --git a/traffic_ops/dev/traffic.vault.dbconf.yml b/traffic_ops/dev/traffic.vault.dbconf.yml index 743a413f0d..8610e43da5 100644 --- a/traffic_ops/dev/traffic.vault.dbconf.yml +++ b/traffic_ops/dev/traffic.vault.dbconf.yml @@ -18,4 +18,4 @@ name: traffic.vault.dbconf.yml development: driver: postgres - open: host=db port=5432 user=traffic_ops password=twelve12 dbname=traffic_vault_development sslmode=disable + open: host=db port=5432 user=traffic_vault password=twelve12 dbname=traffic_vault_development sslmode=disable From 121fdd8ebe142ce4cf5f94efa7498116675ddb55 Mon Sep 17 00:00:00 2001 From: ocket8888 Date: Fri, 10 Sep 2021 01:12:20 -0600 Subject: [PATCH 07/98] Add TO live-reloading on changes to source files --- Makefile | 5 +--- docker-compose.yml | 2 +- traffic_ops/Dockerfile | 13 ++++------- traffic_ops/dev/cdn.json | 5 ++-- traffic_ops/dev/db.config.json | 10 ++++++++ traffic_ops/dev/insert.admin.psql | 28 ++++++++++++++++++++++ traffic_ops/dev/run.sh | 39 +++++++++++++++++-------------- 7 files changed, 70 insertions(+), 32 deletions(-) create mode 100644 traffic_ops/dev/db.config.json create mode 100644 traffic_ops/dev/insert.admin.psql diff --git a/Makefile b/Makefile index 7c2ec203ab..3e24d8c7a4 100644 --- a/Makefile +++ b/Makefile @@ -19,10 +19,7 @@ TO_SOURCE=$(filter-out %_test.go,$(wildcard traffic_ops/traffic_ops_golang/**.go .PHONY: lint unit all check -all: traffic_ops/traffic_ops_golang/traffic_ops_golang traffic_ops/app/db/admin - -traffic_ops/traffic_ops_golang/traffic_ops_golang: $(TO_SOURCE) - cd traffic_ops/traffic_ops_golang && go build +all: traffic_ops/app/db/admin traffic_ops/app/db/admin: traffic_ops/app/db/admin.go cd $(dir $@) && go build -o $(notdir $@) . diff --git a/docker-compose.yml b/docker-compose.yml index e85999e19b..2ef34b6425 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -31,7 +31,7 @@ services: ports: - 6443:443 volumes: - - ./:/root/go/src/github.com/apache/trafficcontrol/ + - .:/root/go/src/github.com/apache/trafficcontrol/ db: image: postgres:13.2-alpine diff --git a/traffic_ops/Dockerfile b/traffic_ops/Dockerfile index 9abb987310..8e84fdc132 100644 --- a/traffic_ops/Dockerfile +++ b/traffic_ops/Dockerfile @@ -18,22 +18,19 @@ RUN openssl genrsa -passout pass:x -out server.pass.key 2048 && \ rm server.pass.key && \ openssl req -new -key server.key -out server.csr \ -subj "/C=US/ST=CO/L=Denver/O=Apache/OU=Traffic Control/CN=trafficops.dev.ciab.test" && \ - openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt + openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt && \ + openssl rand 32 | base64 > /aes.key FROM alpine:latest AS trafficops-dev VOLUME /root/go/src/github.com/apache/trafficcontrol EXPOSE 443 -COPY --from=certbuilder /server.key /server.csr / -RUN apk add --no-cache inotify-tools go postgresql-client && go install github.com/go-delve/delve/cmd/dlv@latest && ln -s /root/go/bin/dlv /usr/bin/dlv +COPY --from=certbuilder /server.key /server.crt /aes.key / +RUN apk add --no-cache make inotify-tools go postgresql-client && go install github.com/go-delve/delve/cmd/dlv@latest && ln -s /root/go/bin/dlv /usr/bin/dlv RUN mkdir /lib64 && ln -s /lib/libc.musl-x86_64.so.1 /lib64/ld-linux-x86-64.so.2 COPY dev/.pgpass /root/.pgpass RUN chmod 0600 /root/.pgpass -COPY app/db/admin dev/run.sh dev/dbconf.yml dev/traffic.vault.dbconf.yml app/db/create_tables.sql app/db/patches.sql app/db/seeds.sql / -COPY app/db/migrations/ /migrations/ -COPY app/db/trafficvault/migrations/ /traffic.vault.migrations/ -COPY app/db/trafficvault/create_tables.sql /traffic.vault.schema.psql -ENTRYPOINT /run.sh +ENTRYPOINT /root/go/src/github.com/apache/trafficcontrol/traffic_ops/dev/run.sh diff --git a/traffic_ops/dev/cdn.json b/traffic_ops/dev/cdn.json index 531253d98e..3b80d3e68f 100644 --- a/traffic_ops/dev/cdn.json +++ b/traffic_ops/dev/cdn.json @@ -1,11 +1,11 @@ { "hypnotoad" : { "listen" : [ - "https://[::]:60443?cert=/server.csr&key=/server.key&verify=0x00&ciphers=AES128-GCM-SHA256:HIGH:!RC4:!MD5:!aNULL:!EDH:!ED" + "https://[::]:60443?cert=/server.crt&key=/server.key&verify=0x00&ciphers=AES128-GCM-SHA256:HIGH:!RC4:!MD5:!aNULL:!EDH:!ED" ] }, "traffic_ops_golang" : { - "port" : 443, + "port" : "443", "log_location_error": "stderr", "log_location_warning": "stderr", "log_location_info": "stdout", @@ -15,6 +15,7 @@ "oauth_client_secret": "", "traffic_vault_backend": "postgres", "traffic_vault_config": { + "aes_key_location": "/aes.key", "dbname": "traffic_vault_development", "hostname": "db", "user": "traffic_vault", diff --git a/traffic_ops/dev/db.config.json b/traffic_ops/dev/db.config.json new file mode 100644 index 0000000000..572b1a05eb --- /dev/null +++ b/traffic_ops/dev/db.config.json @@ -0,0 +1,10 @@ +{ + "description": "dev db", + "dbname": "traffic_ops_development", + "hostname": "db", + "user": "traffic_ops", + "password": "twelve12", + "port": "5432", + "ssl": false, + "type": "Pg" +} diff --git a/traffic_ops/dev/insert.admin.psql b/traffic_ops/dev/insert.admin.psql new file mode 100644 index 0000000000..c21f24c1d1 --- /dev/null +++ b/traffic_ops/dev/insert.admin.psql @@ -0,0 +1,28 @@ +/* Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +INSERT INTO tm_user ( + username, + tenant_id, + "role", + local_passwd, + confirm_local_passwd +) VALUES ( + 'admin', + (SELECT id FROM tenant WHERE name = 'root'), + (SELECT id FROM role WHERE name = 'admin'), + -- 'twelve12' encrypted with SCRYPT + 'SCRYPT:16384:8:1:p0Bppp/6IBeYxSwdLuYddsdMLBU/BNSlLY6fSIF7H1XW4eTbNVeMPVm7TuTEG4FM8PbqLlVwi8sPy8ZJznAlaQ==:sRcHWGe43mm/uEmXTIw37GcLEQZTlWAdf4vJqK8f0MDh8P+8gXoNx+nxWyb3r/0Bh+yyg0g/dUvti/ePZJL+Jw==', + 'SCRYPT:16384:8:1:p0Bppp/6IBeYxSwdLuYddsdMLBU/BNSlLY6fSIF7H1XW4eTbNVeMPVm7TuTEG4FM8PbqLlVwi8sPy8ZJznAlaQ==:sRcHWGe43mm/uEmXTIw37GcLEQZTlWAdf4vJqK8f0MDh8P+8gXoNx+nxWyb3r/0Bh+yyg0g/dUvti/ePZJL+Jw==' +) +ON CONFLICT (username) DO NOTHING; diff --git a/traffic_ops/dev/run.sh b/traffic_ops/dev/run.sh index 7a98bedd93..c3040ad923 100755 --- a/traffic_ops/dev/run.sh +++ b/traffic_ops/dev/run.sh @@ -8,27 +8,32 @@ while ! pg_isready -h db -p 5432 -d postgres; do sleep 3; done -/admin -c /dbconf.yml -s /create_tables.sql -S /seeds.sql -p /patches.sql -m /migrations reset -/admin -c /dbconf.yml -s /create_tables.sql -S /seeds.sql -p /patches.sql -m /migrations upgrade -/admin -v -c /traffic.vault.dbconf.yml -s /traffic.vault.schema.psql -m /traffic.vault.migrations reset -/admin -v -c /traffic.vault.dbconf.yml -s /traffic.vault.schema.psql -m /traffic.vault.migrations upgrade +TC=/root/go/src/github.com/apache/trafficcontrol +ADMIN="$TC/traffic_ops/app/db/admin" -rm -rf /dbconf.yml /create_tables.sql /seeds.sql /patches.sql /migrations /admin /traffic.vault.dbconf.yml /traffic.vault.schema.psql /traffic.vault.migrations +cd "$TC" +make +cd "$TC/traffic_ops/dev" -cd /traffic_ops_golang +"$ADMIN" -c ./dbconf.yml -s ../app/db/create_tables.sql -S ../app/db/seeds.sql -p ../app/db/patches.sql -m ../app/db/migrations reset +"$ADMIN" -c ./dbconf.yml -s ../app/db/create_tables.sql -S ../app/db/seeds.sql -p ../app/db/patches.sql -m ../app/db/migrations upgrade +"$ADMIN" -v -c ./traffic.vault.dbconf.yml -s ./../app/db/trafficvault/create_tables.sql -m ../app/db/trafficvault/migrations reset +"$ADMIN" -v -c ./traffic.vault.dbconf.yml -s ./../app/db/trafficvault/create_tables.sql -m ../app/db/trafficvault/migrations upgrade -exit 0 +psql -d 'postgres://traffic_ops:twelve12@db:5432/traffic_ops_development?sslmode=disable' -f ./insert.admin.psql -dlv --accept-multiclient --continue --listen=:6444 --headless --api-version=2 debug -- --cfg=/cdn.json --dbcfg=/dbconf.yml +cd "$TC/traffic_ops/traffic_ops_golang" +dlv --accept-multiclient --continue --listen=:6444 --headless --api-version=2 debug -- --cfg=../dev/cdn.json --dbcfg=../dev/db.config.json & -while inotifywait --exclude .swp -e modify -r . ; -do - # find PID of the file generated by `go run .` to kill it. make sure the grep does not match other processes running on the system - IDS=$(ps ax | grep "/tmp/go-build" | grep "b001/exe/main" | grep -v "grep" | awk '{print $1}') - if [ ! -z "$IDS" ] - then - kill $IDS; - fi - go run . & + +while inotifywait --exclude '.*(\.md|_test\.go|\.gitignore|__debug_bin)$' -e modify -r . ; do + kill "$(netstat -nlp | grep ':443' | grep __debug_bin | head -n1 | tr -s ' ' | cut -d ' ' -f7 | cut -d '/' -f1)" + kill "$(netstat -nlp | grep ':6444' | grep dlv | head -n1 | tr -s ' ' | cut -d ' ' -f7 | cut -d '/' -f1)" + dlv --accept-multiclient --continue --listen=:6444 --headless --api-version=2 debug -- --cfg=../dev/cdn.json --dbcfg=../dev/db.config.json & + # for whatever reason, without this the repeated call to inotifywait will + # sometimes lose track of th current directory. It spits out: + # Couldn't watch .: No such file or directory + # which is a bit odd. + sleep 0.5 done; From ff2b651ccb68a8d6bf4d4baa08b2044cd05870f0 Mon Sep 17 00:00:00 2001 From: ocket8888 Date: Fri, 10 Sep 2021 01:24:30 -0600 Subject: [PATCH 08/98] Fix debugging port not exposed --- docker-compose.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/docker-compose.yml b/docker-compose.yml index 2ef34b6425..1c38354375 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -30,6 +30,7 @@ services: image: trafficops-dev ports: - 6443:443 + - 6444:6444 volumes: - .:/root/go/src/github.com/apache/trafficcontrol/ From fc6f4bd71dd75892b78de844e19bb111e7e54d7c Mon Sep 17 00:00:00 2001 From: ocket8888 Date: Fri, 10 Sep 2021 01:34:40 -0600 Subject: [PATCH 09/98] move dev materials to a dedicated structure --- {traffic_ops/dev => dev/traffic_ops}/.pgpass | 0 {traffic_ops => dev/traffic_ops}/Dockerfile | 4 ++-- {traffic_ops/dev => dev/traffic_ops}/cdn.json | 0 .../dev => dev/traffic_ops}/db.config.json | 0 {traffic_ops/dev => dev/traffic_ops}/dbconf.yml | 0 .../dev => dev/traffic_ops}/insert.admin.psql | 0 {traffic_ops/dev => dev/traffic_ops}/run.sh | 14 +++++++------- .../traffic_ops}/traffic.vault.dbconf.yml | 0 docker-compose.yml | 2 +- 9 files changed, 10 insertions(+), 10 deletions(-) rename {traffic_ops/dev => dev/traffic_ops}/.pgpass (100%) rename {traffic_ops => dev/traffic_ops}/Dockerfile (93%) rename {traffic_ops/dev => dev/traffic_ops}/cdn.json (100%) rename {traffic_ops/dev => dev/traffic_ops}/db.config.json (100%) rename {traffic_ops/dev => dev/traffic_ops}/dbconf.yml (100%) rename {traffic_ops/dev => dev/traffic_ops}/insert.admin.psql (100%) rename {traffic_ops/dev => dev/traffic_ops}/run.sh (55%) rename {traffic_ops/dev => dev/traffic_ops}/traffic.vault.dbconf.yml (100%) diff --git a/traffic_ops/dev/.pgpass b/dev/traffic_ops/.pgpass similarity index 100% rename from traffic_ops/dev/.pgpass rename to dev/traffic_ops/.pgpass diff --git a/traffic_ops/Dockerfile b/dev/traffic_ops/Dockerfile similarity index 93% rename from traffic_ops/Dockerfile rename to dev/traffic_ops/Dockerfile index 8e84fdc132..722379bcc6 100644 --- a/traffic_ops/Dockerfile +++ b/dev/traffic_ops/Dockerfile @@ -30,7 +30,7 @@ COPY --from=certbuilder /server.key /server.crt /aes.key / RUN apk add --no-cache make inotify-tools go postgresql-client && go install github.com/go-delve/delve/cmd/dlv@latest && ln -s /root/go/bin/dlv /usr/bin/dlv RUN mkdir /lib64 && ln -s /lib/libc.musl-x86_64.so.1 /lib64/ld-linux-x86-64.so.2 -COPY dev/.pgpass /root/.pgpass +COPY .pgpass /root/.pgpass RUN chmod 0600 /root/.pgpass -ENTRYPOINT /root/go/src/github.com/apache/trafficcontrol/traffic_ops/dev/run.sh +ENTRYPOINT /root/go/src/github.com/apache/trafficcontrol/dev/traffic_ops/run.sh diff --git a/traffic_ops/dev/cdn.json b/dev/traffic_ops/cdn.json similarity index 100% rename from traffic_ops/dev/cdn.json rename to dev/traffic_ops/cdn.json diff --git a/traffic_ops/dev/db.config.json b/dev/traffic_ops/db.config.json similarity index 100% rename from traffic_ops/dev/db.config.json rename to dev/traffic_ops/db.config.json diff --git a/traffic_ops/dev/dbconf.yml b/dev/traffic_ops/dbconf.yml similarity index 100% rename from traffic_ops/dev/dbconf.yml rename to dev/traffic_ops/dbconf.yml diff --git a/traffic_ops/dev/insert.admin.psql b/dev/traffic_ops/insert.admin.psql similarity index 100% rename from traffic_ops/dev/insert.admin.psql rename to dev/traffic_ops/insert.admin.psql diff --git a/traffic_ops/dev/run.sh b/dev/traffic_ops/run.sh similarity index 55% rename from traffic_ops/dev/run.sh rename to dev/traffic_ops/run.sh index c3040ad923..9454d0b455 100755 --- a/traffic_ops/dev/run.sh +++ b/dev/traffic_ops/run.sh @@ -13,24 +13,24 @@ ADMIN="$TC/traffic_ops/app/db/admin" cd "$TC" make -cd "$TC/traffic_ops/dev" +cd "$TC/dev/traffic_ops" -"$ADMIN" -c ./dbconf.yml -s ../app/db/create_tables.sql -S ../app/db/seeds.sql -p ../app/db/patches.sql -m ../app/db/migrations reset -"$ADMIN" -c ./dbconf.yml -s ../app/db/create_tables.sql -S ../app/db/seeds.sql -p ../app/db/patches.sql -m ../app/db/migrations upgrade -"$ADMIN" -v -c ./traffic.vault.dbconf.yml -s ./../app/db/trafficvault/create_tables.sql -m ../app/db/trafficvault/migrations reset -"$ADMIN" -v -c ./traffic.vault.dbconf.yml -s ./../app/db/trafficvault/create_tables.sql -m ../app/db/trafficvault/migrations upgrade +"$ADMIN" -c ./dbconf.yml -s "$TC/traffic_ops/app/db/create_tables.sql" -S "$TC/traffic_ops/app/db/seeds.sql" -p "$TC/traffic_ops/app/db/patches.sql" -m "$TC/traffic_ops/app/db/migrations" reset +"$ADMIN" -c ./dbconf.yml -s "$TC/traffic_ops/app/db/create_tables.sql" -S "$TC/traffic_ops/app/db/seeds.sql" -p "$TC/traffic_ops/app/db/patches.sql" -m "$TC/traffic_ops/app/db/migrations" upgrade +"$ADMIN" -v -c ./traffic.vault.dbconf.yml -s "$TC/traffic_ops/app/db/trafficvault/create_tables.sql" -m "$TC/traffic_ops/app/db/trafficvault/migrations" reset +"$ADMIN" -v -c ./traffic.vault.dbconf.yml -s "$TC/traffic_ops/app/db/trafficvault/create_tables.sql" -m "$TC/traffic_ops/app/db/trafficvault/migrations" upgrade psql -d 'postgres://traffic_ops:twelve12@db:5432/traffic_ops_development?sslmode=disable' -f ./insert.admin.psql cd "$TC/traffic_ops/traffic_ops_golang" -dlv --accept-multiclient --continue --listen=:6444 --headless --api-version=2 debug -- --cfg=../dev/cdn.json --dbcfg=../dev/db.config.json & +dlv --accept-multiclient --continue --listen=:6444 --headless --api-version=2 debug -- --cfg=../../dev/traffic_ops/cdn.json --dbcfg=../../dev/traffic_ops/db.config.json & while inotifywait --exclude '.*(\.md|_test\.go|\.gitignore|__debug_bin)$' -e modify -r . ; do kill "$(netstat -nlp | grep ':443' | grep __debug_bin | head -n1 | tr -s ' ' | cut -d ' ' -f7 | cut -d '/' -f1)" kill "$(netstat -nlp | grep ':6444' | grep dlv | head -n1 | tr -s ' ' | cut -d ' ' -f7 | cut -d '/' -f1)" - dlv --accept-multiclient --continue --listen=:6444 --headless --api-version=2 debug -- --cfg=../dev/cdn.json --dbcfg=../dev/db.config.json & + dlv --accept-multiclient --continue --listen=:6444 --headless --api-version=2 debug -- --cfg=../../dev/traffic_ops/cdn.json --dbcfg=../../dev/traffic_ops/db.config.json & # for whatever reason, without this the repeated call to inotifywait will # sometimes lose track of th current directory. It spits out: # Couldn't watch .: No such file or directory diff --git a/traffic_ops/dev/traffic.vault.dbconf.yml b/dev/traffic_ops/traffic.vault.dbconf.yml similarity index 100% rename from traffic_ops/dev/traffic.vault.dbconf.yml rename to dev/traffic_ops/traffic.vault.dbconf.yml diff --git a/docker-compose.yml b/docker-compose.yml index 1c38354375..1f7a58de66 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -22,7 +22,7 @@ services: # trafficops runs Traffic Ops in a container. trafficops: build: - context: traffic_ops/ + context: dev/traffic_ops/ depends_on: - db domainname: dev.ciab.test From b647ffd9419f69a92d486b3b2b5118450f0a8b7b Mon Sep 17 00:00:00 2001 From: ocket8888 Date: Fri, 10 Sep 2021 08:32:02 -0600 Subject: [PATCH 10/98] Add a live-reloading TP container to the dev environment --- dev/traffic_portal/Dockerfile | 32 +++++++++++++++++++++++++++++ dev/traffic_portal/config.js | 38 +++++++++++++++++++++++++++++++++++ dev/traffic_portal/run.sh | 21 +++++++++++++++++++ docker-compose.yml | 13 ++++++++++++ 4 files changed, 104 insertions(+) create mode 100644 dev/traffic_portal/Dockerfile create mode 100644 dev/traffic_portal/config.js create mode 100755 dev/traffic_portal/run.sh diff --git a/dev/traffic_portal/Dockerfile b/dev/traffic_portal/Dockerfile new file mode 100644 index 0000000000..5d53a3b99d --- /dev/null +++ b/dev/traffic_portal/Dockerfile @@ -0,0 +1,32 @@ +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +FROM alpine:latest AS certbuilder +RUN apk add --no-cache openssl +RUN openssl genrsa -passout pass:x -out server.pass.key 2048 && \ + openssl rsa -passin pass:x -in server.pass.key -out server.key && \ + rm server.pass.key && \ + openssl req -new -key server.key -out server.csr \ + -subj "/C=US/ST=CO/L=Denver/O=Apache/OU=Traffic Control/CN=trafficops.dev.ciab.test" && \ + openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt && \ + openssl rand 32 | base64 > /aes.key + +FROM node:alpine AS trafficportal-dev + +VOLUME /root/go/src/github.com/apache/trafficcontrol +EXPOSE 443 + +RUN apk add --no-cache ruby ruby-dev gcc musl-dev make && gem update --system && gem install sass compass +COPY --from=certbuilder /server.key /server.crt / + +ENTRYPOINT /root/go/src/github.com/apache/trafficcontrol/dev/traffic_portal/run.sh diff --git a/dev/traffic_portal/config.js b/dev/traffic_portal/config.js new file mode 100644 index 0000000000..dcca20abda --- /dev/null +++ b/dev/traffic_portal/config.js @@ -0,0 +1,38 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +module.exports = { + timeout: '120s', + useSSL: true, + port: 80, + sslPort: 443, + ssl: { + key: '/server.key', + cert: '/server.crt', + ca: [ '/server.crt' ] + }, + api: { + base_url: 'https://trafficops:443/api/' + }, + files: { + static: '/root/go/src/github.com/apache/trafficcontrol/traffic_portal/app/dist/public' + }, + log: null, + reject_unauthorized: 0 +}; diff --git a/dev/traffic_portal/run.sh b/dev/traffic_portal/run.sh new file mode 100755 index 0000000000..a3567ce450 --- /dev/null +++ b/dev/traffic_portal/run.sh @@ -0,0 +1,21 @@ +#!/bin/sh +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +set -o errexit + +TC="/root/go/src/github.com/apache/trafficcontrol/" +cd "$TC/traffic_portal" +npm install +TP_SERVER_CONFIG_FILE="$TC/dev/traffic_portal/config.js" ./node_modules/.bin/grunt diff --git a/docker-compose.yml b/docker-compose.yml index 1f7a58de66..0c964770a3 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -42,3 +42,16 @@ services: - POSTGRES_PASSWORD=twelve12 hostname: db domainname: dev.ciab.test + + trafficportal: + build: + context: dev/traffic_portal + depends_on: + - trafficops + hostname: trafficportal + domainname: trafficportal + image: trafficportal-dev + ports: + - 444:443 + volumes: + - .:/root/go/src/github.com/apache/trafficcontrol From e6d8297c4d8f5a2cc632ca72a63219ac43d93589 Mon Sep 17 00:00:00 2001 From: ocket8888 Date: Fri, 10 Sep 2021 10:02:02 -0600 Subject: [PATCH 11/98] Add a live-reloading TPv2 container to the dev environment --- dev/tpv2/Dockerfile | 31 ++ dev/tpv2/proxy.json | 6 + dev/tpv2/run.sh | 21 + docker-compose.yml | 15 +- experimental/traffic-portal/package-lock.json | 410 +++++++++--------- experimental/traffic-portal/package.json | 2 +- 6 files changed, 282 insertions(+), 203 deletions(-) create mode 100644 dev/tpv2/Dockerfile create mode 100644 dev/tpv2/proxy.json create mode 100755 dev/tpv2/run.sh diff --git a/dev/tpv2/Dockerfile b/dev/tpv2/Dockerfile new file mode 100644 index 0000000000..ba84e717e0 --- /dev/null +++ b/dev/tpv2/Dockerfile @@ -0,0 +1,31 @@ +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +FROM alpine:latest AS certbuilder +RUN apk add --no-cache openssl +RUN openssl genrsa -passout pass:x -out server.pass.key 2048 && \ + openssl rsa -passin pass:x -in server.pass.key -out server.key && \ + rm server.pass.key && \ + openssl req -new -key server.key -out server.csr \ + -subj "/C=US/ST=CO/L=Denver/O=Apache/OU=Traffic Control/CN=trafficops.dev.ciab.test" && \ + openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt && \ + openssl rand 32 | base64 > /aes.key + +FROM node:alpine AS tpv2-dev + +VOLUME /root/go/src/github.com/apache/trafficcontrol +EXPOSE 443 + +COPY --from=certbuilder /server.key /server.crt / + +ENTRYPOINT /root/go/src/github.com/apache/trafficcontrol/dev/tpv2/run.sh diff --git a/dev/tpv2/proxy.json b/dev/tpv2/proxy.json new file mode 100644 index 0000000000..33a1a890ea --- /dev/null +++ b/dev/tpv2/proxy.json @@ -0,0 +1,6 @@ +{ + "/api": { + "target": "https://trafficops:443/", + "secure": false + } +} diff --git a/dev/tpv2/run.sh b/dev/tpv2/run.sh new file mode 100755 index 0000000000..dff3de31c8 --- /dev/null +++ b/dev/tpv2/run.sh @@ -0,0 +1,21 @@ +#!/bin/sh +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +set -o errexit + +TC="/root/go/src/github.com/apache/trafficcontrol/" +cd "$TC/experimental/traffic-portal" +npm install +./node_modules/.bin/ng serve --ssl --ssl-cert /server.crt --ssl-key /server.key --watch --progress --proxy-config "$TC/dev/tpv2/proxy.json" --port 443 --host "::0" --live-reload diff --git a/docker-compose.yml b/docker-compose.yml index 0c964770a3..5465f9a973 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -49,9 +49,22 @@ services: depends_on: - trafficops hostname: trafficportal - domainname: trafficportal + domainname: dev.ciab.test image: trafficportal-dev ports: - 444:443 volumes: - .:/root/go/src/github.com/apache/trafficcontrol + + tpv2: + build: + context: dev/tpv2 + depends_on: + - trafficops + hostname: tpv2 + domainname: dev.ciab.test + image: tpv2-dev + ports: + - 443:443 + volumes: + - .:/root/go/src/github.com/apache/trafficcontrol diff --git a/experimental/traffic-portal/package-lock.json b/experimental/traffic-portal/package-lock.json index ecc88b4991..f4be0191df 100644 --- a/experimental/traffic-portal/package-lock.json +++ b/experimental/traffic-portal/package-lock.json @@ -1,6 +1,6 @@ { "name": "traffic-portal", - "version": "0.4.0", + "version": "0.4.1", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -19,25 +19,25 @@ } }, "@angular-devkit/architect": { - "version": "0.1302.3", - "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1302.3.tgz", - "integrity": "sha512-0m8jMKrFfIqsYt33zTUwSmyekyfuS67hna08RQ6USjzWQSE3z4S8ulCUARSjM6AzdMblX+whfy56nJUpT17NSA==", + "version": "0.1302.4", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1302.4.tgz", + "integrity": "sha512-9dS0Gvs4ER1DPSnKorJ4uk27A/rWwyvNy5CheOZu4ZTUnggGA7SFtMG7CKPD11Ae01lIMfxKfDqJYE8j2VpQaw==", "dev": true, "requires": { - "@angular-devkit/core": "13.2.3", + "@angular-devkit/core": "13.2.4", "rxjs": "6.6.7" } }, "@angular-devkit/build-angular": { - "version": "13.2.3", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-13.2.3.tgz", - "integrity": "sha512-cZ2gRcMRgW3t1WCeP+2D/wmr2M+BR/RICAh0wL9irIdypWAzIFt3Z2+2R/HmgAAxoEkdUMIfB9AnkYmwRVgFeA==", + "version": "13.2.4", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-13.2.4.tgz", + "integrity": "sha512-8fKIBMsQOIg+UFj+wL95SRYs/ED90cX3fjCKonE9TdOPLCEXC+nlZ0nbY45aGCmKiYlY9c9zhQiwgCGdVKSGYQ==", "dev": true, "requires": { "@ampproject/remapping": "1.1.1", - "@angular-devkit/architect": "0.1302.3", - "@angular-devkit/build-webpack": "0.1302.3", - "@angular-devkit/core": "13.2.3", + "@angular-devkit/architect": "0.1302.4", + "@angular-devkit/build-webpack": "0.1302.4", + "@angular-devkit/core": "13.2.4", "@babel/core": "7.16.12", "@babel/generator": "7.16.8", "@babel/helper-annotate-as-pure": "7.16.7", @@ -48,7 +48,7 @@ "@babel/runtime": "7.16.7", "@babel/template": "7.16.7", "@discoveryjs/json-ext": "0.5.6", - "@ngtools/webpack": "13.2.3", + "@ngtools/webpack": "13.2.4", "ansi-colors": "4.1.1", "babel-loader": "8.2.3", "babel-plugin-istanbul": "6.1.1", @@ -59,8 +59,8 @@ "core-js": "3.20.3", "critters": "0.0.16", "css-loader": "6.5.1", - "esbuild": "0.14.14", - "esbuild-wasm": "0.14.14", + "esbuild": "0.14.22", + "esbuild-wasm": "0.14.22", "glob": "7.2.0", "https-proxy-agent": "5.0.0", "inquirer": "8.2.0", @@ -68,7 +68,7 @@ "karma-source-map-support": "1.4.0", "less": "4.1.2", "less-loader": "10.2.0", - "license-webpack-plugin": "4.0.1", + "license-webpack-plugin": "4.0.2", "loader-utils": "3.2.0", "mini-css-extract-plugin": "2.5.3", "minimatch": "3.0.4", @@ -163,30 +163,31 @@ } }, "esbuild": { - "version": "0.14.14", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.14.14.tgz", - "integrity": "sha512-aiK4ddv+uui0k52OqSHu4xxu+SzOim7Rlz4i25pMEiC8rlnGU0HJ9r+ZMfdWL5bzifg+nhnn7x4NSWTeehYblg==", + "version": "0.14.22", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.14.22.tgz", + "integrity": "sha512-CjFCFGgYtbFOPrwZNJf7wsuzesx8kqwAffOlbYcFDLFuUtP8xloK1GH+Ai13Qr0RZQf9tE7LMTHJ2iVGJ1SKZA==", "dev": true, "optional": true, "requires": { - "esbuild-android-arm64": "0.14.14", - "esbuild-darwin-64": "0.14.14", - "esbuild-darwin-arm64": "0.14.14", - "esbuild-freebsd-64": "0.14.14", - "esbuild-freebsd-arm64": "0.14.14", - "esbuild-linux-32": "0.14.14", - "esbuild-linux-64": "0.14.14", - "esbuild-linux-arm": "0.14.14", - "esbuild-linux-arm64": "0.14.14", - "esbuild-linux-mips64le": "0.14.14", - "esbuild-linux-ppc64le": "0.14.14", - "esbuild-linux-s390x": "0.14.14", - "esbuild-netbsd-64": "0.14.14", - "esbuild-openbsd-64": "0.14.14", - "esbuild-sunos-64": "0.14.14", - "esbuild-windows-32": "0.14.14", - "esbuild-windows-64": "0.14.14", - "esbuild-windows-arm64": "0.14.14" + "esbuild-android-arm64": "0.14.22", + "esbuild-darwin-64": "0.14.22", + "esbuild-darwin-arm64": "0.14.22", + "esbuild-freebsd-64": "0.14.22", + "esbuild-freebsd-arm64": "0.14.22", + "esbuild-linux-32": "0.14.22", + "esbuild-linux-64": "0.14.22", + "esbuild-linux-arm": "0.14.22", + "esbuild-linux-arm64": "0.14.22", + "esbuild-linux-mips64le": "0.14.22", + "esbuild-linux-ppc64le": "0.14.22", + "esbuild-linux-riscv64": "0.14.22", + "esbuild-linux-s390x": "0.14.22", + "esbuild-netbsd-64": "0.14.22", + "esbuild-openbsd-64": "0.14.22", + "esbuild-sunos-64": "0.14.22", + "esbuild-windows-32": "0.14.22", + "esbuild-windows-64": "0.14.22", + "esbuild-windows-arm64": "0.14.22" } }, "minimatch": { @@ -218,19 +219,19 @@ } }, "@angular-devkit/build-webpack": { - "version": "0.1302.3", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1302.3.tgz", - "integrity": "sha512-+JYH1lWU0UOjaWYxpoR2VLsdcb6nG9Gv+M1gH+kT0r2sAKOFaHnrksbOvca3EhDoaMa2b9LSGEE0OcSHWnN+eQ==", + "version": "0.1302.4", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1302.4.tgz", + "integrity": "sha512-GNHXSSnIbL4Oi3fBHTtRyQ308YMSDdKs/bVrArIq8QDbiCuB3RQfooEfvkoN2M++MeSW0vNqtQ7pZyxqRey6fQ==", "dev": true, "requires": { - "@angular-devkit/architect": "0.1302.3", + "@angular-devkit/architect": "0.1302.4", "rxjs": "6.6.7" } }, "@angular-devkit/core": { - "version": "13.2.3", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-13.2.3.tgz", - "integrity": "sha512-/47RA8qmWzeS60xSdaprIn1MiSv0Iw83t0M9/ENH7irFS5vMAq62NCcwiWXH59pZmvvLbF+7xy/RgYUZLr4nHQ==", + "version": "13.2.4", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-13.2.4.tgz", + "integrity": "sha512-hSw1JWA/6dDAF/xleQRXGtzHphfU49TMUhvAoAmsmmz3NAn03xLy1dtqdIXIf+TkFXVvZDaAB2mW8KfRV67GFg==", "requires": { "ajv": "8.9.0", "ajv-formats": "2.1.1", @@ -241,11 +242,11 @@ } }, "@angular-devkit/schematics": { - "version": "13.2.3", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-13.2.3.tgz", - "integrity": "sha512-+dyC4iKV0huvpjiuz4uyjLNK3FsCIp/Ghv5lXvhG6yok/dCAubsJItJOxi6G16aVCzG/E9zbsDfm9fNMyVOkgQ==", + "version": "13.2.4", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-13.2.4.tgz", + "integrity": "sha512-VMhYa4cDu5yE31OvHncAd15Rmlchih/Sr6sxFsIwkg4xzRNIIZCtwqxVXgf0TiTN9zrvlvzK7nhPqTGNqqYb2A==", "requires": { - "@angular-devkit/core": "13.2.3", + "@angular-devkit/core": "13.2.4", "jsonc-parser": "3.0.0", "magic-string": "0.25.7", "ora": "5.4.1", @@ -340,9 +341,9 @@ } }, "@angular/animations": { - "version": "13.2.2", - "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-13.2.2.tgz", - "integrity": "sha512-qX8LAMuCJaueHBVyuwKtqunx96G0Dr26k7y5Z03VTcscYst4Ib4V2d4i5dwn3HS82DehFdO86cm3Hi2PqE/qww==", + "version": "13.2.3", + "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-13.2.3.tgz", + "integrity": "sha512-HfNNpDMSf5Var2Ti/vrmy576Uyp68hRaSNdFxxO9OYG3qH/5ZYVAv5ixz8Wu4RE+Lmw9jjzEfpL0BvK6BYWa4g==", "requires": { "tslib": "^2.3.0" } @@ -357,15 +358,15 @@ } }, "@angular/cli": { - "version": "13.2.3", - "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-13.2.3.tgz", - "integrity": "sha512-QsakxpdQuO67u4fQNuOASqabYUO9gJb/5CpUGpWbuBzru0/9CMEF1CtXoF4EoDiwa5sJMirz3SJMKhtzFlv1cQ==", + "version": "13.2.4", + "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-13.2.4.tgz", + "integrity": "sha512-Llk0RzrpzCsAIgX4wk8QIB7xZInyLT07r6gF9dc9b0latHsJyRpeZXdPcFmT2wny0cin+1Y9q6HsBe4Srs19SA==", "dev": true, "requires": { - "@angular-devkit/architect": "0.1302.3", - "@angular-devkit/core": "13.2.3", - "@angular-devkit/schematics": "13.2.3", - "@schematics/angular": "13.2.3", + "@angular-devkit/architect": "0.1302.4", + "@angular-devkit/core": "13.2.4", + "@angular-devkit/schematics": "13.2.4", + "@schematics/angular": "13.2.4", "@yarnpkg/lockfile": "1.1.0", "ansi-colors": "4.1.1", "debug": "4.3.3", @@ -384,25 +385,25 @@ } }, "@angular/common": { - "version": "13.2.2", - "resolved": "https://registry.npmjs.org/@angular/common/-/common-13.2.2.tgz", - "integrity": "sha512-56C/bheNLKtTCyQUZCiYtKbBIZN9jj6rjFILPtJCGls3cBCxp7t9tIdoLiQG/wVQRmaxdj1ioLT+sCWz7mLtQw==", + "version": "13.2.3", + "resolved": "https://registry.npmjs.org/@angular/common/-/common-13.2.3.tgz", + "integrity": "sha512-aK42bLd8VIVsUPcIaPw+dwD3c1d7rigTUMbNQ7zqyEQMCajLPakpzM9QEnywdzWSJTJFUbp3h39jD7ZzQPuTTQ==", "requires": { "tslib": "^2.3.0" } }, "@angular/compiler": { - "version": "13.2.2", - "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-13.2.2.tgz", - "integrity": "sha512-XXQtB0/e7pR2LPrHmpEiTU72SX4xxHGy91vYWIj1JCjSn0fYF7vtHzSJPXDvkbnkNow/PXXzJJYaU1ctdMZPcA==", + "version": "13.2.3", + "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-13.2.3.tgz", + "integrity": "sha512-WUjzs0xa2UTHOChEs+cHHj75AieiwSvEKBoXjyINNUnmbyf3Q+khLlBScjB+40Y/zSDi1mKxuolv4KfyREk4DA==", "requires": { "tslib": "^2.3.0" } }, "@angular/compiler-cli": { - "version": "13.2.2", - "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-13.2.2.tgz", - "integrity": "sha512-tuOIcEEKVIht+mKrj0rtX3I8gc+ByPjzpCZhFQRggxM6xbKJIToO1zERbEGKrZ+sUJ6BB5KLvscDy+Pddy3b8w==", + "version": "13.2.3", + "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-13.2.3.tgz", + "integrity": "sha512-Y3q1rjb6aqCMEAkDwzvTNjAkHbQWDmDIApTaqAZul2GsuTvqPLfdriSMxBAFe1WOfw+fKdncsMnV35ij+iOnHA==", "dev": true, "requires": { "@babel/core": "^7.8.6", @@ -418,17 +419,17 @@ } }, "@angular/core": { - "version": "13.2.2", - "resolved": "https://registry.npmjs.org/@angular/core/-/core-13.2.2.tgz", - "integrity": "sha512-zpctw0BxIVOsRFnckchK15SD1L8tzhf5GzwIDaM6+VylDQj1uYkm8mvAjJTQZyUuApomoFet2Rfj7XQPV+cNSQ==", + "version": "13.2.3", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-13.2.3.tgz", + "integrity": "sha512-81QtWR+UQgCo5xJwExzKaRUd9aXJoOGbWfh3MZSUkiv+PTMXwmfU3lZxpz9S/y2uwvaVqZdW5MN/RzpKv6tHxA==", "requires": { "tslib": "^2.3.0" } }, "@angular/forms": { - "version": "13.2.2", - "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-13.2.2.tgz", - "integrity": "sha512-T61W4Ay9X9qhxjc6lLqpNFeHrGKwg2mqdsZ3zIm/c7oKo37mgl9TB5kkrtnS+205r3N2hF4ICnGFZ4a/egUP/g==", + "version": "13.2.3", + "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-13.2.3.tgz", + "integrity": "sha512-fOsWiimPTQCDtZj+Hqc4+Io7v4aKjJJUIRoxN/wQqik66Gg/1rs4iWtpdxm4vgyQD0rUFZaRLHhsh+ldIFw7CA==", "requires": { "tslib": "^2.3.0" } @@ -442,25 +443,25 @@ } }, "@angular/platform-browser": { - "version": "13.2.2", - "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-13.2.2.tgz", - "integrity": "sha512-M7gWC8fFCPc/CRcHCzqe/j7WzwAUMeKt9vwlK633XnesHBoqZdYgbb3YHHc6WPVU0YI09Nb/Hm5sezEKmjUmPg==", + "version": "13.2.3", + "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-13.2.3.tgz", + "integrity": "sha512-kdV51osiEkW7hwwh7wQMy+9+e7lGFXQBnHVxIiyVQI1nKVfWykzc1Vt5oGw7zuBkkJat2Gs3Mq2lqaXMa2Xl1g==", "requires": { "tslib": "^2.3.0" } }, "@angular/platform-browser-dynamic": { - "version": "13.2.2", - "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-13.2.2.tgz", - "integrity": "sha512-lj6xwat0StLp+ROFqXU62upwHQhlxaQi0djhrS+DGKUK0Xu9bkBeaSCfBFgS78jPm1SwL8Xztu9/vuDAHLRrqw==", + "version": "13.2.3", + "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-13.2.3.tgz", + "integrity": "sha512-dCHVyYsbEZR+Ekk47fZFh9zjFD/pryrwSelFStMUoGKExJxsVIVBzgdHwzPBVFh9gwjVCvBOmLpMcVMRNMq9cQ==", "requires": { "tslib": "^2.3.0" } }, "@angular/platform-server": { - "version": "13.2.2", - "resolved": "https://registry.npmjs.org/@angular/platform-server/-/platform-server-13.2.2.tgz", - "integrity": "sha512-v17/E9hWY5/MgUjk+E+aNUNZ/wmhHb08RyeKvvUKhx8Xb24hRiMdjA9yMkt1UsjOGJUIeZ8s5nn6xRiRc3t+9A==", + "version": "13.2.3", + "resolved": "https://registry.npmjs.org/@angular/platform-server/-/platform-server-13.2.3.tgz", + "integrity": "sha512-cH79/LICik7a/HXGWXaY+R0HOiUJwhhWskxBaID4ECduVkCge8nRoW//gkYB8ml27qeblbiFZN/jREWN7/KwcQ==", "requires": { "domino": "^2.1.2", "tslib": "^2.3.0", @@ -468,9 +469,9 @@ } }, "@angular/router": { - "version": "13.2.2", - "resolved": "https://registry.npmjs.org/@angular/router/-/router-13.2.2.tgz", - "integrity": "sha512-dt2b9/kGJAkmOqUmUD3aKlp4pGpdqLwB0zmhUYF3ktNEcQaPf4ZjWT/4jhy09gFL+TKOHG5OQW9GxBbhWI4bSg==", + "version": "13.2.3", + "resolved": "https://registry.npmjs.org/@angular/router/-/router-13.2.3.tgz", + "integrity": "sha512-niU8/19wmPSeuvKCHfaDbw+DPfE9gI0divcnwqGEB8tSbs7VNIaTmhLs9yMU+pD6puUYk3gUFTXLBl+g3qwOpg==", "requires": { "tslib": "^2.3.0" } @@ -495,9 +496,9 @@ "integrity": "sha512-392byTlpGWXMv4FbyWw3sAZ/FrW/DrwqLGXpy0mbyNe9Taqv1mg9yON5/o0cnr8XYCkFTZbC1eV+c+LAROgrng==" }, "@babel/core": { - "version": "7.17.4", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.17.4.tgz", - "integrity": "sha512-R9x5r4t4+hBqZTmioSnkrW+I6NmbojwjGT8p4G2Gw1thWbXIHGDnmGdLdFw0/7ljucdIrNRp7Npgb4CyBYzzJg==", + "version": "7.17.5", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.17.5.tgz", + "integrity": "sha512-/BBMw4EvjmyquN5O+t5eh0+YqB3XXJkYD2cjKpYtWOfFy4lQ4UozNSmxAcWT8r2XtZs0ewG+zrfsqeR15i1ajA==", "requires": { "@ampproject/remapping": "^2.1.0", "@babel/code-frame": "^7.16.7", @@ -1707,14 +1708,14 @@ "dev": true }, "@es-joy/jsdoccomment": { - "version": "0.19.0", - "resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.19.0.tgz", - "integrity": "sha512-lRx/5ChsOwv7gIU05m8Ur1Rxa4/XkE23wTsX8XFBGWRYrCcCrngPf6yGJMG6n9dqnyDehPrBBVeFIm2INEIeQA==", + "version": "0.20.1", + "resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.20.1.tgz", + "integrity": "sha512-oeJK41dcdqkvdZy/HctKklJNkt/jh+av3PZARrZEl+fs/8HaHeeYoAvEwOV0u5I6bArTF17JEsTZMY359e/nfQ==", "dev": true, "requires": { "comment-parser": "1.3.0", "esquery": "^1.4.0", - "jsdoc-type-pratt-parser": "~2.2.2" + "jsdoc-type-pratt-parser": "~2.2.3" } }, "@eslint/eslintrc": { @@ -1946,9 +1947,9 @@ } }, "@ngtools/webpack": { - "version": "13.2.3", - "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-13.2.3.tgz", - "integrity": "sha512-wooUZiV92QyoeFxkhqIwH/cfiAAAn+l8fEEuaaEIfJtpjpbShvvlboEVsqb28soeGiFJfLcmsZM3mUFgsG4QBQ==", + "version": "13.2.4", + "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-13.2.4.tgz", + "integrity": "sha512-+1wPzxKSrbf5ghFq5YWZvrPy7IACa+0AF16JYpWcdcW1D1u0Ug22IYN8gyEt7waJnD1HJn/d0jaeKNNpJiW1Cg==", "dev": true }, "@nguniversal/common": { @@ -2153,13 +2154,13 @@ } }, "@schematics/angular": { - "version": "13.2.3", - "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-13.2.3.tgz", - "integrity": "sha512-jloooGC7eco9AKxlIMMqFRptJYzZ0jNRBStWOp2dCISg6rmOKqpxbsHLtYFQIT1PnlomSxtKDAgYGQMDi9zhXw==", + "version": "13.2.4", + "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-13.2.4.tgz", + "integrity": "sha512-pAVuPmFklWVpNJkARs4aGYM5Mo4iez0eW0dDY+ugxZlt1KOLJQDmMK2Go60iEAQLlOw2pKO/jcmTttOP8PN0UQ==", "dev": true, "requires": { - "@angular-devkit/core": "13.2.3", - "@angular-devkit/schematics": "13.2.3", + "@angular-devkit/core": "13.2.4", + "@angular-devkit/schematics": "13.2.4", "jsonc-parser": "3.0.0" } }, @@ -3549,19 +3550,19 @@ } }, "body-parser": { - "version": "1.19.1", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.1.tgz", - "integrity": "sha512-8ljfQi5eBk8EJfECMrgqNGWPEY5jWP+1IzkzkGdFFEwFQZZyaZ21UqdaHktgiMlH0xLHqIFtE/u2OYE5dOtViA==", + "version": "1.19.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.2.tgz", + "integrity": "sha512-SAAwOxgoCKMGs9uUAUFHygfLAyaniaoun6I8mFY9pRAJL9+Kec34aU+oIjDhTycub1jozEfEwx1W1IuOYxVSFw==", "requires": { - "bytes": "3.1.1", + "bytes": "3.1.2", "content-type": "~1.0.4", "debug": "2.6.9", "depd": "~1.1.2", "http-errors": "1.8.1", "iconv-lite": "0.4.24", "on-finished": "~2.3.0", - "qs": "6.9.6", - "raw-body": "2.4.2", + "qs": "6.9.7", + "raw-body": "2.4.3", "type-is": "~1.6.18" }, "dependencies": { @@ -3692,14 +3693,14 @@ } }, "browserslist": { - "version": "4.19.1", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.19.1.tgz", - "integrity": "sha512-u2tbbG5PdKRTUoctO3NBD8FQ5HdPh1ZXPHzp1rwaa5jTc+RV9/+RlWiAIKmjRPQF+xbGM9Kklj5bZQFa2s/38A==", + "version": "4.19.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.19.2.tgz", + "integrity": "sha512-97XU1CTZ5TwU9Qy/Taj+RtiI6SQM1WIhZ9osT7EY0oO2aWXGABZT2OZeRL+6PfaQsiiMIjjwIoYFPq4APgspgQ==", "requires": { - "caniuse-lite": "^1.0.30001286", - "electron-to-chromium": "^1.4.17", + "caniuse-lite": "^1.0.30001312", + "electron-to-chromium": "^1.4.71", "escalade": "^3.1.1", - "node-releases": "^2.0.1", + "node-releases": "^2.0.2", "picocolors": "^1.0.0" } }, @@ -3775,9 +3776,9 @@ "dev": true }, "bytes": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.1.tgz", - "integrity": "sha512-dWe4nWO/ruEOY7HkUJ5gFt1DCFV9zPRoJr8pV0/ASQermOZjtq8jMjOprC0Kd10GLN+l7xaUPvxzJFWtxGu8Fg==" + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==" }, "cacache": { "version": "15.3.0", @@ -4343,9 +4344,9 @@ } }, "cookie": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz", - "integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==" + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", + "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==" }, "cookie-signature": { "version": "1.0.6", @@ -5328,134 +5329,141 @@ } }, "esbuild-android-arm64": { - "version": "0.14.14", - "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.14.14.tgz", - "integrity": "sha512-be/Uw6DdpQiPfula1J4bdmA+wtZ6T3BRCZsDMFB5X+k0Gp8TIh9UvmAcqvKNnbRAafSaXG3jPCeXxDKqnc8hFQ==", + "version": "0.14.22", + "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.14.22.tgz", + "integrity": "sha512-k1Uu4uC4UOFgrnTj2zuj75EswFSEBK+H6lT70/DdS4mTAOfs2ECv2I9ZYvr3w0WL0T4YItzJdK7fPNxcPw6YmQ==", "dev": true, "optional": true }, "esbuild-darwin-64": { - "version": "0.14.14", - "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.14.14.tgz", - "integrity": "sha512-BEexYmjWafcISK8cT6O98E3TfcLuZL8DKuubry6G54n2+bD4GkoRD6HYUOnCkfl2p7jodA+s4369IjSFSWjtHg==", + "version": "0.14.22", + "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.14.22.tgz", + "integrity": "sha512-d8Ceuo6Vw6HM3fW218FB6jTY6O3r2WNcTAU0SGsBkXZ3k8SDoRLd3Nrc//EqzdgYnzDNMNtrWegK2Qsss4THhw==", "dev": true, "optional": true }, "esbuild-darwin-arm64": { - "version": "0.14.14", - "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.14.tgz", - "integrity": "sha512-tnBKm41pDOB1GtZ8q/w26gZlLLRzVmP8fdsduYjvM+yFD7E2DLG4KbPAqFMWm4Md9B+DitBglP57FY7AznxbTg==", + "version": "0.14.22", + "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.22.tgz", + "integrity": "sha512-YAt9Tj3SkIUkswuzHxkaNlT9+sg0xvzDvE75LlBo4DI++ogSgSmKNR6B4eUhU5EUUepVXcXdRIdqMq9ppeRqfw==", "dev": true, "optional": true }, "esbuild-freebsd-64": { - "version": "0.14.14", - "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.14.tgz", - "integrity": "sha512-Q9Rx6sgArOHalQtNwAaIzJ6dnQ8A+I7f/RsQsdkS3JrdzmnlFo8JEVofTmwVQLoIop7OKUqIVOGP4PoQcwfVMA==", + "version": "0.14.22", + "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.22.tgz", + "integrity": "sha512-ek1HUv7fkXMy87Qm2G4IRohN+Qux4IcnrDBPZGXNN33KAL0pEJJzdTv0hB/42+DCYWylSrSKxk3KUXfqXOoH4A==", "dev": true, "optional": true }, "esbuild-freebsd-arm64": { - "version": "0.14.14", - "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.14.tgz", - "integrity": "sha512-TJvq0OpLM7BkTczlyPIphcvnwrQwQDG1HqxzoYePWn26SMUAlt6wrLnEvxdbXAvNvDLVzG83kA+JimjK7aRNBA==", + "version": "0.14.22", + "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.22.tgz", + "integrity": "sha512-zPh9SzjRvr9FwsouNYTqgqFlsMIW07O8mNXulGeQx6O5ApgGUBZBgtzSlBQXkHi18WjrosYfsvp5nzOKiWzkjQ==", "dev": true, "optional": true }, "esbuild-linux-32": { - "version": "0.14.14", - "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.14.14.tgz", - "integrity": "sha512-h/CrK9Baimt5VRbu8gqibWV7e1P9l+mkanQgyOgv0Ng3jHT1NVFC9e6rb1zbDdaJVmuhWX5xVliUA5bDDCcJeg==", + "version": "0.14.22", + "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.14.22.tgz", + "integrity": "sha512-SnpveoE4nzjb9t2hqCIzzTWBM0RzcCINDMBB67H6OXIuDa4KqFqaIgmTchNA9pJKOVLVIKd5FYxNiJStli21qg==", "dev": true, "optional": true }, "esbuild-linux-64": { - "version": "0.14.14", - "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.14.14.tgz", - "integrity": "sha512-IC+wAiIg/egp5OhQp4W44D9PcBOH1b621iRn1OXmlLzij9a/6BGr9NMIL4CRwz4j2kp3WNZu5sT473tYdynOuQ==", + "version": "0.14.22", + "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.14.22.tgz", + "integrity": "sha512-Zcl9Wg7gKhOWWNqAjygyqzB+fJa19glgl2JG7GtuxHyL1uEnWlpSMytTLMqtfbmRykIHdab797IOZeKwk5g0zg==", "dev": true, "optional": true }, "esbuild-linux-arm": { - "version": "0.14.14", - "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.14.14.tgz", - "integrity": "sha512-gxpOaHOPwp7zSmcKYsHrtxabScMqaTzfSQioAMUaB047YiMuDBzqVcKBG8OuESrYkGrL9DDljXr/mQNg7pbdaQ==", + "version": "0.14.22", + "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.14.22.tgz", + "integrity": "sha512-soPDdbpt/C0XvOOK45p4EFt8HbH5g+0uHs5nUKjHVExfgR7du734kEkXR/mE5zmjrlymk5AA79I0VIvj90WZ4g==", "dev": true, "optional": true }, "esbuild-linux-arm64": { - "version": "0.14.14", - "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.14.tgz", - "integrity": "sha512-6QVul3RI4M5/VxVIRF/I5F+7BaxzR3DfNGoqEVSCZqUbgzHExPn+LXr5ly1C7af2Kw4AHpo+wDqx8A4ziP9avw==", + "version": "0.14.22", + "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.22.tgz", + "integrity": "sha512-8q/FRBJtV5IHnQChO3LHh/Jf7KLrxJ/RCTGdBvlVZhBde+dk3/qS9fFsUy+rs3dEi49aAsyVitTwlKw1SUFm+A==", "dev": true, "optional": true }, "esbuild-linux-mips64le": { - "version": "0.14.14", - "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.14.tgz", - "integrity": "sha512-4Jl5/+xoINKbA4cesH3f4R+q0vltAztZ6Jm8YycS8lNhN1pgZJBDxWfI6HUMIAdkKlIpR1PIkA9aXQgZ8sxFAg==", + "version": "0.14.22", + "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.22.tgz", + "integrity": "sha512-SiNDfuRXhGh1JQLLA9JPprBgPVFOsGuQ0yDfSPTNxztmVJd8W2mX++c4FfLpAwxuJe183mLuKf7qKCHQs5ZnBQ==", "dev": true, "optional": true }, "esbuild-linux-ppc64le": { - "version": "0.14.14", - "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.14.tgz", - "integrity": "sha512-BitW37GxeebKxqYNl4SVuSdnIJAzH830Lr6Mkq3pBHXtzQay0vK+IeOR/Ele1GtNVJ+/f8wYM53tcThkv5SC5w==", + "version": "0.14.22", + "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.22.tgz", + "integrity": "sha512-6t/GI9I+3o1EFm2AyN9+TsjdgWCpg2nwniEhjm2qJWtJyJ5VzTXGUU3alCO3evopu8G0hN2Bu1Jhz2YmZD0kng==", + "dev": true, + "optional": true + }, + "esbuild-linux-riscv64": { + "version": "0.14.22", + "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.14.22.tgz", + "integrity": "sha512-AyJHipZKe88sc+tp5layovquw5cvz45QXw5SaDgAq2M911wLHiCvDtf/07oDx8eweCyzYzG5Y39Ih568amMTCQ==", "dev": true, "optional": true }, "esbuild-linux-s390x": { - "version": "0.14.14", - "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.14.tgz", - "integrity": "sha512-vLj6p76HOZG3wfuTr5MyO3qW5iu8YdhUNxuY+tx846rPo7GcKtYSPMusQjeVEfZlJpSYoR+yrNBBxq+qVF9zrw==", + "version": "0.14.22", + "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.22.tgz", + "integrity": "sha512-Sz1NjZewTIXSblQDZWEFZYjOK6p8tV6hrshYdXZ0NHTjWE+lwxpOpWeElUGtEmiPcMT71FiuA9ODplqzzSxkzw==", "dev": true, "optional": true }, "esbuild-netbsd-64": { - "version": "0.14.14", - "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.14.tgz", - "integrity": "sha512-fn8looXPQhpVqUyCBWUuPjesH+yGIyfbIQrLKG05rr1Kgm3rZD/gaYrd3Wpmf5syVZx70pKZPvdHp8OTA+y7cQ==", + "version": "0.14.22", + "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.22.tgz", + "integrity": "sha512-TBbCtx+k32xydImsHxvFgsOCuFqCTGIxhzRNbgSL1Z2CKhzxwT92kQMhxort9N/fZM2CkRCPPs5wzQSamtzEHA==", "dev": true, "optional": true }, "esbuild-openbsd-64": { - "version": "0.14.14", - "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.14.tgz", - "integrity": "sha512-HdAnJ399pPff3SKbd8g+P4o5znseni5u5n5rJ6Z7ouqOdgbOwHe2ofZbMow17WMdNtz1IyOZk2Wo9Ve6/lZ4Rg==", + "version": "0.14.22", + "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.22.tgz", + "integrity": "sha512-vK912As725haT313ANZZZN+0EysEEQXWC/+YE4rQvOQzLuxAQc2tjbzlAFREx3C8+uMuZj/q7E5gyVB7TzpcTA==", "dev": true, "optional": true }, "esbuild-sunos-64": { - "version": "0.14.14", - "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.14.14.tgz", - "integrity": "sha512-bmDHa99ulsGnYlh/xjBEfxoGuC8CEG5OWvlgD+pF7bKKiVTbtxqVCvOGEZeoDXB+ja6AvHIbPxrEE32J+m5nqQ==", + "version": "0.14.22", + "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.14.22.tgz", + "integrity": "sha512-/mbJdXTW7MTcsPhtfDsDyPEOju9EOABvCjeUU2OJ7fWpX/Em/H3WYDa86tzLUbcVg++BScQDzqV/7RYw5XNY0g==", "dev": true, "optional": true }, "esbuild-wasm": { - "version": "0.14.14", - "resolved": "https://registry.npmjs.org/esbuild-wasm/-/esbuild-wasm-0.14.14.tgz", - "integrity": "sha512-qTjK4MWnYtQHCMGg2qDUqeFYXfVvYq5qJkQTIsOV4VZCknoYePVaDTG9ygEB9Ct0kc0DWs7IrS6Ja+GjY62Kzw==", + "version": "0.14.22", + "resolved": "https://registry.npmjs.org/esbuild-wasm/-/esbuild-wasm-0.14.22.tgz", + "integrity": "sha512-FOSAM29GN1fWusw0oLMv6JYhoheDIh5+atC72TkJKfIUMID6yISlicoQSd9gsNSFsNBvABvtE2jR4JB1j4FkFw==", "dev": true }, "esbuild-windows-32": { - "version": "0.14.14", - "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.14.14.tgz", - "integrity": "sha512-6tVooQcxJCNenPp5GHZBs/RLu31q4B+BuF4MEoRxswT+Eq2JGF0ZWDRQwNKB8QVIo3t6Svc5wNGez+CwKNQjBg==", + "version": "0.14.22", + "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.14.22.tgz", + "integrity": "sha512-1vRIkuvPTjeSVK3diVrnMLSbkuE36jxA+8zGLUOrT4bb7E/JZvDRhvtbWXWaveUc/7LbhaNFhHNvfPuSw2QOQg==", "dev": true, "optional": true }, "esbuild-windows-64": { - "version": "0.14.14", - "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.14.14.tgz", - "integrity": "sha512-kl3BdPXh0/RD/dad41dtzj2itMUR4C6nQbXQCyYHHo4zoUoeIXhpCrSl7BAW1nv5EFL8stT1V+TQVXGZca5A2A==", + "version": "0.14.22", + "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.14.22.tgz", + "integrity": "sha512-AxjIDcOmx17vr31C5hp20HIwz1MymtMjKqX4qL6whPj0dT9lwxPexmLj6G1CpR3vFhui6m75EnBEe4QL82SYqw==", "dev": true, "optional": true }, "esbuild-windows-arm64": { - "version": "0.14.14", - "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.14.tgz", - "integrity": "sha512-dCm1wTOm6HIisLanmybvRKvaXZZo4yEVrHh1dY0v582GThXJOzuXGja1HIQgV09RpSHYRL3m4KoUBL00l6SWEg==", + "version": "0.14.22", + "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.22.tgz", + "integrity": "sha512-5wvQ+39tHmRhNpu2Fx04l7QfeK3mQ9tKzDqqGR8n/4WUxsFxnVLfDRBGirIfk4AfWlxk60kqirlODPoT5LqMUg==", "dev": true, "optional": true }, @@ -5791,12 +5799,12 @@ } }, "eslint-plugin-jsdoc": { - "version": "37.9.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-37.9.1.tgz", - "integrity": "sha512-ynIsYL+rOtIKWOttAYWCgOJawPwYKexcX3cuoYHwifvz4+uY+MZ2un5nMHBULigdSITnQ5/ZSHpO/O1nwv/uJA==", + "version": "37.9.4", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-37.9.4.tgz", + "integrity": "sha512-VxCyGgUNNnj2T4bb1OqltkbsPp3ehRzR5onIfh6zGrAvISmvgX/sbxUlh3YyGqWtjOTSBCURdKdmelSXEIHnlA==", "dev": true, "requires": { - "@es-joy/jsdoccomment": "~0.19.0", + "@es-joy/jsdoccomment": "~0.20.1", "comment-parser": "1.3.0", "debug": "^4.3.3", "escape-string-regexp": "^4.0.0", @@ -5999,16 +6007,16 @@ "dev": true }, "express": { - "version": "4.17.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.17.2.tgz", - "integrity": "sha512-oxlxJxcQlYwqPWKVJJtvQiwHgosH/LrLSPA+H4UxpyvSS6jC5aH+5MoHFM+KABgTOt0APue4w66Ha8jCUo9QGg==", + "version": "4.17.3", + "resolved": "https://registry.npmjs.org/express/-/express-4.17.3.tgz", + "integrity": "sha512-yuSQpz5I+Ch7gFrPCk4/c+dIBKlQUxtgwqzph132bsT6qhuzss6I8cLJQz7B3rFblzd6wtcI0ZbGltH/C4LjUg==", "requires": { - "accepts": "~1.3.7", + "accepts": "~1.3.8", "array-flatten": "1.1.1", - "body-parser": "1.19.1", + "body-parser": "1.19.2", "content-disposition": "0.5.4", "content-type": "~1.0.4", - "cookie": "0.4.1", + "cookie": "0.4.2", "cookie-signature": "1.0.6", "debug": "2.6.9", "depd": "~1.1.2", @@ -6023,7 +6031,7 @@ "parseurl": "~1.3.3", "path-to-regexp": "0.1.7", "proxy-addr": "~2.0.7", - "qs": "6.9.6", + "qs": "6.9.7", "range-parser": "~1.2.1", "safe-buffer": "5.2.1", "send": "0.17.2", @@ -6270,9 +6278,9 @@ "dev": true }, "follow-redirects": { - "version": "1.14.8", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.8.tgz", - "integrity": "sha512-1x0S9UVJHsQprFcEC/qnNzBLcIxsjAV905f/UkQxbclCsoTWlacCNOpQa/anodLl2uaEKFhfWOvM2Qg77+15zA==", + "version": "1.14.9", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.9.tgz", + "integrity": "sha512-MQDfihBQYMcyy5dhRDJUHcw7lb2Pv/TuE6xP1vyraLukNDHKbDxDNaOE3NbCAdKQApno+GPRyo1YAp89yCjK4w==", "dev": true }, "forever-agent": { @@ -7944,9 +7952,9 @@ } }, "license-webpack-plugin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/license-webpack-plugin/-/license-webpack-plugin-4.0.1.tgz", - "integrity": "sha512-SQum9mg3BgnY5BK+2KYl4W7pk9b26Q8tW2lTsO6tidD0/Ds9ksdXvp3ip2s9LqDjj5gtBMyWRfOPZptWj4PfCg==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/license-webpack-plugin/-/license-webpack-plugin-4.0.2.tgz", + "integrity": "sha512-771TFWFD70G1wLTC4oU2Cw4qvtmNrIw+wRvBtn+okgHl7slJVi7zfNcdmqDL72BojM30VNJ2UHylr1o77U37Jw==", "dev": true, "requires": { "webpack-sources": "^3.0.0" @@ -9974,9 +9982,9 @@ "dev": true }, "qs": { - "version": "6.9.6", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.6.tgz", - "integrity": "sha512-TIRk4aqYLNoJUbd+g2lEdz5kLWIuTMRagAXxl78Q0RiVjAOugHmeKNGdd3cwo/ktpf9aL9epCfFqWDEKysUlLQ==" + "version": "6.9.7", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.7.tgz", + "integrity": "sha512-IhMFgUmuNpyRfxA90umL7ByLlgRXu6tIfKPpF5TmcfRLlLCckfP/g3IQmju6jjpu+Hh8rA+2p6A27ZSPOOHdKw==" }, "queue-microtask": { "version": "1.2.3", @@ -10009,11 +10017,11 @@ "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" }, "raw-body": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.2.tgz", - "integrity": "sha512-RPMAFUJP19WIet/99ngh6Iv8fzAbqum4Li7AD6DtGaW2RpMB/11xDoalPiJMTbu6I3hkbMVkATvZrqb9EEqeeQ==", + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.3.tgz", + "integrity": "sha512-UlTNLIcu0uzb4D2f4WltY6cVjLi+/jEN4lgEUj3E04tpMDpUlkBo/eSn6zou9hum2VMNpCCUone0O0WeJim07g==", "requires": { - "bytes": "3.1.1", + "bytes": "3.1.2", "http-errors": "1.8.1", "iconv-lite": "0.4.24", "unpipe": "1.0.0" @@ -11530,9 +11538,9 @@ } }, "typed-assert": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/typed-assert/-/typed-assert-1.0.8.tgz", - "integrity": "sha512-5NkbXZUlmCE73Fs7gvkp1XXJWHYetPkg60QnQ2NXQmBYNFxbBr2zA8GCtaH4K2s2WhOmSlgiSTmrjrcm5tnM5g==", + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/typed-assert/-/typed-assert-1.0.9.tgz", + "integrity": "sha512-KNNZtayBCtmnNmbo5mG47p1XsCyrx6iVqomjcZnec/1Y5GGARaxPs6r49RnSPeUP3YjNYiU9sQHAtY4BBvnZwg==", "dev": true }, "typedarray": { diff --git a/experimental/traffic-portal/package.json b/experimental/traffic-portal/package.json index 09c2b7ccb0..4e24dd2cc3 100644 --- a/experimental/traffic-portal/package.json +++ b/experimental/traffic-portal/package.json @@ -72,7 +72,7 @@ "zone.js": "~0.11.4" }, "devDependencies": { - "@angular-devkit/build-angular": "^13.2.0", + "@angular-devkit/build-angular": "^13.2.1", "@angular-eslint/builder": "13.0.1", "@angular-eslint/eslint-plugin": "13.0.1", "@angular-eslint/eslint-plugin-template": "13.0.1", From e76c20d761be7a12f6563dfc61cdf4bd3c36c03c Mon Sep 17 00:00:00 2001 From: ocket8888 Date: Fri, 10 Sep 2021 10:42:57 -0600 Subject: [PATCH 12/98] Set TO timeouts longer so debugging doesn't cause 500s --- dev/traffic_ops/cdn.json | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/dev/traffic_ops/cdn.json b/dev/traffic_ops/cdn.json index 3b80d3e68f..6d4a2ee0ae 100644 --- a/dev/traffic_ops/cdn.json +++ b/dev/traffic_ops/cdn.json @@ -17,11 +17,20 @@ "traffic_vault_config": { "aes_key_location": "/aes.key", "dbname": "traffic_vault_development", + "conn_max_lifetime_seconds": 86400, + "query_timeout_seconds": 86400, "hostname": "db", "user": "traffic_vault", "password": "twelve12", "port": 5432 }, + "read_timeout": 86400, + "read_header_timeout": 86400, + "request_timeout": 86400, + "write_timeout": 86400, + "idle_timeout": 86400, + "db_conn_max_lifetime_seconds": 86400, + "db_query_timeout_seconds": 86400, "supported_ds_metrics": [ "kbps", "tps_total", "tps_2xx", "tps_3xx", "tps_4xx", "tps_5xx" ] }, "use_ims": true, From a1ac9d516d6df10626237eb33158e8d752df4984 Mon Sep 17 00:00:00 2001 From: ocket8888 Date: Fri, 10 Sep 2021 11:20:02 -0600 Subject: [PATCH 13/98] Add a live-reloading TM container to the dev environment --- dev/traffic_monitor/Dockerfile | 22 ++++++++++++++++++++++ dev/traffic_monitor/ops.config.json | 8 ++++++++ dev/traffic_monitor/run.sh | 23 +++++++++++++++++++++++ dev/traffic_monitor/tm.config.json | 17 +++++++++++++++++ docker-compose.yml | 15 ++++++++++++++- 5 files changed, 84 insertions(+), 1 deletion(-) create mode 100644 dev/traffic_monitor/Dockerfile create mode 100644 dev/traffic_monitor/ops.config.json create mode 100755 dev/traffic_monitor/run.sh create mode 100644 dev/traffic_monitor/tm.config.json diff --git a/dev/traffic_monitor/Dockerfile b/dev/traffic_monitor/Dockerfile new file mode 100644 index 0000000000..d5f9f0656e --- /dev/null +++ b/dev/traffic_monitor/Dockerfile @@ -0,0 +1,22 @@ +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +FROM alpine:latest AS trafficmonitor-dev + +VOLUME /root/go/src/github.com/apache/trafficcontrol +EXPOSE 443 + +RUN apk add --no-cache inotify-tools go && go install github.com/go-delve/delve/cmd/dlv@latest && ln -s /root/go/bin/dlv /usr/bin/dlv +RUN mkdir /lib64 && ln -s /lib/libc.musl-x86_64.so.1 /lib64/ld-linux-x86-64.so.2 + +ENTRYPOINT /root/go/src/github.com/apache/trafficcontrol/dev/traffic_monitor/run.sh diff --git a/dev/traffic_monitor/ops.config.json b/dev/traffic_monitor/ops.config.json new file mode 100644 index 0000000000..947cad9e97 --- /dev/null +++ b/dev/traffic_monitor/ops.config.json @@ -0,0 +1,8 @@ +{ + "username": "admin", + "password": "twelve12", + "url": "https://trafficops:443/", + "insecure": true, + "cdnName": "ALL", + "httpListener": ":80" +} diff --git a/dev/traffic_monitor/run.sh b/dev/traffic_monitor/run.sh new file mode 100755 index 0000000000..c8c4d8b7f9 --- /dev/null +++ b/dev/traffic_monitor/run.sh @@ -0,0 +1,23 @@ +#!/bin/sh + +set -o errexit +trap '[ $? -eq 0 ] && exit 0 || echo "Error on line ${LINENO} of ${0}"; exit 1' EXIT + +TC=/root/go/src/github.com/apache/trafficcontrol + +cd "$TC/traffic_monitor" + +dlv --accept-multiclient --continue --listen=:81 --headless --api-version=2 debug -- --opsCfg="$TC/dev/traffic_monitor/ops.config.json" --config="$TC/dev/traffic_monitor/tm.config.json" & + +# "static" files need to be watched since TM caches their contents, so it needs +# to be restarted to apply changes to them. +while inotifywait --exclude '.*(\.md|\.csv|\.json|\.cfg|_test\.go|\.gitignore|__debug_bin)$|^\./(build|tools|tests|tmclient)/.*' -e modify -r . ; do + kill "$(netstat -nlp | grep ':80' | grep __debug_bin | head -n1 | tr -s ' ' | cut -d ' ' -f7 | cut -d '/' -f1)" + kill "$(netstat -nlp | grep ':81' | grep dlv | head -n1 | tr -s ' ' | cut -d ' ' -f7 | cut -d '/' -f1)" + dlv --accept-multiclient --continue --listen=:81 --headless --api-version=2 debug -- --opsCfg="$TC/dev/traffic_monitor/ops.config.json" --config="$TC/dev/traffic_monitor/tm.config.json" & + # for whatever reason, without this the repeated call to inotifywait will + # sometimes lose track of th current directory. It spits out: + # Couldn't watch .: No such file or directory + # which is a bit odd. + sleep 0.5 +done; diff --git a/dev/traffic_monitor/tm.config.json b/dev/traffic_monitor/tm.config.json new file mode 100644 index 0000000000..8b4d155eac --- /dev/null +++ b/dev/traffic_monitor/tm.config.json @@ -0,0 +1,17 @@ +{ + "monitor_config_polling_interval_ms": 15000, + "http_timeout_ms": 86400000, + "peer_optimistic": true, + "peer_optimistic_quorum_min": 0, + "max_events": 100, + "health_flush_interval_ms": 20, + "stat_flush_interval_ms": 20, + "log_location_event": "stdout", + "log_location_error": "stderr", + "log_location_warning": "stderr", + "log_location_info": "stdout", + "log_location_debug": "stdout", + "serve_read_timeout_ms": 86400000, + "serve_write_timeout_ms": 86400000, + "static_file_dir": "/root/go/src/github.com/apache/trafficcontrol/traffic_monitor/static/" +} diff --git a/docker-compose.yml b/docker-compose.yml index 5465f9a973..7e5018e618 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -19,7 +19,6 @@ version: '3.5' services: - # trafficops runs Traffic Ops in a container. trafficops: build: context: dev/traffic_ops/ @@ -68,3 +67,17 @@ services: - 443:443 volumes: - .:/root/go/src/github.com/apache/trafficcontrol + + trafficmonitor: + build: + context: dev/traffic_monitor + depends_on: + - trafficops + hostname: trafficmonitor + domainname: dev.ciab.test + image: trafficmonitor-dev + ports: + - 80:80 + - 81:81 + volumes: + - .:/root/go/src/github.com/apache/trafficcontrol From d95757126370ef7ccd57007b788b67a1c7f489f1 Mon Sep 17 00:00:00 2001 From: ocket8888 Date: Fri, 10 Sep 2021 13:38:34 -0600 Subject: [PATCH 14/98] Seed enough data for valid monitoring snapshots to be taken --- dev/traffic_ops/insert.admin.psql | 28 ---- dev/traffic_ops/run.sh | 3 +- dev/traffic_ops/seed.psql | 244 ++++++++++++++++++++++++++++++ 3 files changed, 245 insertions(+), 30 deletions(-) delete mode 100644 dev/traffic_ops/insert.admin.psql create mode 100644 dev/traffic_ops/seed.psql diff --git a/dev/traffic_ops/insert.admin.psql b/dev/traffic_ops/insert.admin.psql deleted file mode 100644 index c21f24c1d1..0000000000 --- a/dev/traffic_ops/insert.admin.psql +++ /dev/null @@ -1,28 +0,0 @@ -/* Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -INSERT INTO tm_user ( - username, - tenant_id, - "role", - local_passwd, - confirm_local_passwd -) VALUES ( - 'admin', - (SELECT id FROM tenant WHERE name = 'root'), - (SELECT id FROM role WHERE name = 'admin'), - -- 'twelve12' encrypted with SCRYPT - 'SCRYPT:16384:8:1:p0Bppp/6IBeYxSwdLuYddsdMLBU/BNSlLY6fSIF7H1XW4eTbNVeMPVm7TuTEG4FM8PbqLlVwi8sPy8ZJznAlaQ==:sRcHWGe43mm/uEmXTIw37GcLEQZTlWAdf4vJqK8f0MDh8P+8gXoNx+nxWyb3r/0Bh+yyg0g/dUvti/ePZJL+Jw==', - 'SCRYPT:16384:8:1:p0Bppp/6IBeYxSwdLuYddsdMLBU/BNSlLY6fSIF7H1XW4eTbNVeMPVm7TuTEG4FM8PbqLlVwi8sPy8ZJznAlaQ==:sRcHWGe43mm/uEmXTIw37GcLEQZTlWAdf4vJqK8f0MDh8P+8gXoNx+nxWyb3r/0Bh+yyg0g/dUvti/ePZJL+Jw==' -) -ON CONFLICT (username) DO NOTHING; diff --git a/dev/traffic_ops/run.sh b/dev/traffic_ops/run.sh index 9454d0b455..7ecf587a65 100755 --- a/dev/traffic_ops/run.sh +++ b/dev/traffic_ops/run.sh @@ -20,13 +20,12 @@ cd "$TC/dev/traffic_ops" "$ADMIN" -v -c ./traffic.vault.dbconf.yml -s "$TC/traffic_ops/app/db/trafficvault/create_tables.sql" -m "$TC/traffic_ops/app/db/trafficvault/migrations" reset "$ADMIN" -v -c ./traffic.vault.dbconf.yml -s "$TC/traffic_ops/app/db/trafficvault/create_tables.sql" -m "$TC/traffic_ops/app/db/trafficvault/migrations" upgrade -psql -d 'postgres://traffic_ops:twelve12@db:5432/traffic_ops_development?sslmode=disable' -f ./insert.admin.psql +psql -d 'postgres://traffic_ops:twelve12@db:5432/traffic_ops_development?sslmode=disable' -f ./seed.psql cd "$TC/traffic_ops/traffic_ops_golang" dlv --accept-multiclient --continue --listen=:6444 --headless --api-version=2 debug -- --cfg=../../dev/traffic_ops/cdn.json --dbcfg=../../dev/traffic_ops/db.config.json & - while inotifywait --exclude '.*(\.md|_test\.go|\.gitignore|__debug_bin)$' -e modify -r . ; do kill "$(netstat -nlp | grep ':443' | grep __debug_bin | head -n1 | tr -s ' ' | cut -d ' ' -f7 | cut -d '/' -f1)" kill "$(netstat -nlp | grep ':6444' | grep dlv | head -n1 | tr -s ' ' | cut -d ' ' -f7 | cut -d '/' -f1)" diff --git a/dev/traffic_ops/seed.psql b/dev/traffic_ops/seed.psql new file mode 100644 index 0000000000..4b287d12c3 --- /dev/null +++ b/dev/traffic_ops/seed.psql @@ -0,0 +1,244 @@ +/* Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +INSERT INTO tm_user ( + username, + tenant_id, + "role", + local_passwd, + confirm_local_passwd +) VALUES ( + 'admin', + (SELECT id FROM tenant WHERE "name" = 'root'), + (SELECT id FROM "role" WHERE "name" = 'admin'), + -- 'twelve12' encrypted with SCRYPT + 'SCRYPT:16384:8:1:p0Bppp/6IBeYxSwdLuYddsdMLBU/BNSlLY6fSIF7H1XW4eTbNVeMPVm7TuTEG4FM8PbqLlVwi8sPy8ZJznAlaQ==:sRcHWGe43mm/uEmXTIw37GcLEQZTlWAdf4vJqK8f0MDh8P+8gXoNx+nxWyb3r/0Bh+yyg0g/dUvti/ePZJL+Jw==', + 'SCRYPT:16384:8:1:p0Bppp/6IBeYxSwdLuYddsdMLBU/BNSlLY6fSIF7H1XW4eTbNVeMPVm7TuTEG4FM8PbqLlVwi8sPy8ZJznAlaQ==:sRcHWGe43mm/uEmXTIw37GcLEQZTlWAdf4vJqK8f0MDh8P+8gXoNx+nxWyb3r/0Bh+yyg0g/dUvti/ePZJL+Jw==' +) +ON CONFLICT (username) DO NOTHING; + +INSERT INTO profile ( + "name", + description, + "type", + cdn +) VALUES ( + 'RASCAL_TM_dev', + 'dev TM Profile', + 'TM_PROFILE', + (SELECT id FROM cdn WHERE "name" = 'ALL') +), ( + 'EDGE_dev', + 'dev edge Profile', + 'ATS_PROFILE', + (SELECT id FROM cdn WHERE "name" = 'ALL') +); + +INSERT INTO parameter ( + config_file, + "name", + "value" +) VALUES ( + 'rascal-config.txt', + 'health.polling.interval', + '6000' +), ( + 'rascal-config.txt', + 'heartbeat.polling.interval', + '3000' +), ( + 'rascal-config.txt', + 'peers.polling.interval', + '3000' +), ( + 'rascal-config.txt', + 'tm.polling.interval', + '2000' +); + +INSERT INTO profile_parameter +SELECT profile.id, parameter.id +FROM profile, parameter +WHERE parameter.config_file = 'rascal-config.txt' +AND parameter."name" LIKE '%.polling.%' +AND profile."name" = 'RASCAL_TM_dev'; + +INSERT INTO division ("name") VALUES ('dev'); +INSERT INTO region ( + "name", + division +) VALUES ( + 'dev', + (SELECT id FROM division WHERE "name" = 'dev') +); +INSERT INTO phys_location ( + "name", + short_name, + address, + city, + state, + zip, + region +) VALUES ( + 'dev', + 'dev', + 'address', + 'city', + 'state', + 'zip', + (SELECT id from region WHERE "name" = 'dev') +); + +INSERT INTO coordinate ( + "name", + latitude, + longitude +) VALUES ( + 'dev', + 0, + 0 +); + +INSERT INTO cachegroup ( + "name", + short_name, + "type", + coordinate +) VALUES ( + 'dev', + 'dev', + (SELECT id FROM "type" WHERE "name" = 'EDGE_LOC'), + (SELECT id FROM coordinate WHERE "name" = 'dev') +); + +INSERT INTO "server" ( + host_name, + domain_name, + tcp_port, + https_port, + phys_location, + cachegroup, + type, + status, + profile, + cdn_id +) VALUES ( + 'trafficmonitor', + 'dev.ciab.test', + 80, + NULL, + (SELECT id FROM phys_location WHERE "name" = 'dev'), + (SELECT id FROM cachegroup WHERE "name" = 'dev'), + (SELECT id FROM "type" WHERE "name" = 'RASCAL'), + (SELECT id FROM status WHERE "name" = 'ONLINE'), + (SELECT id FROM profile WHERE "name"= 'RASCAL_TM_dev'), + (SELECT id FROM cdn WHERE "name" = 'ALL') +), ( + 'edge', + 'dev.ciab.test', + 80, + 443, + (SELECT id FROM phys_location WHERE "name" = 'dev'), + (SELECT id FROM cachegroup WHERE "name" = 'dev'), + (SELECT id FROM "type" WHERE "name" = 'EDGE'), + (SELECT id FROM status WHERE "name" = 'REPORTED'), + (SELECT id FROM profile WHERE "name"= 'EDGE_dev'), + (SELECT id FROM cdn WHERE "name" = 'ALL') +); + +INSERT INTO interface ( + monitor, + "name", + "server" +) VALUES ( + FALSE, + 'eth0', + (SELECT id FROM "server" WHERE host_name = 'trafficmonitor' LIMIT 1) +), ( + TRUE, + 'eth0', + (SELECT id FROM "server" WHERE host_name = 'edge' LIMIT 1) +); + +INSERT INTO ip_address ( + address, + interface, + "server", + service_address +) VALUES ( + '129.0.0.1'::inet, + 'eth0', + (SELECT id FROM "server" WHERE host_name = 'trafficmonitor' LIMIT 1), + TRUE +), ( + '129.0.0.2'::inet, + 'eth0', + (SELECT id FROM "server" WHERE host_name = 'edge' LIMIT 1), + TRUE +); + +INSERT INTO deliveryservice ( + xml_id, + active, + dscp, + qstring_ignore, + type, + cdn_id, + display_name, + tenant_id +) VALUES ( + 'dev', + TRUE, + 1, + 0, + (SELECT id FROM "type" WHERE "name" = 'HTTP'), + (SELECT id FROM cdn WHERE "name" = 'ALL'), + 'dev', + (SELECT id FROM tenant WHERE "name" = 'root') +); + +INSERT INTO regex ( + "type", + pattern +) VALUES ( + (SELECT id FROM "type" WHERE "name" = 'HOST_REGEXP'), + '.*\\.dev\\..*' +); + +INSERT INTO deliveryservice_regex ( + deliveryservice, + regex, + set_number +) VALUES ( + (SELECT id FROM deliveryservice WHERE xml_id = 'dev') , + (SELECT id FROM regex WHERE pattern = '.*\\.dev\\..*' LIMIT 1), + 0 +); + +INSERT INTO origin ( + "name", + fqdn, + protocol, + is_primary, + port, + deliveryservice, + tenant +) VALUES ( + 'dev', + 'origin.infra.ciab.test', + 'http', + TRUE, + 80, + (SELECT id FROM deliveryservice WHERE xml_id = 'dev'), + (SELECT id FROM tenant WHERE "name" = 'root') +); From a6720e73aed32d1f11c015646be6bd44ad996023 Mon Sep 17 00:00:00 2001 From: ocket8888 Date: Fri, 10 Sep 2021 13:40:20 -0600 Subject: [PATCH 15/98] fix snapshot backup files in nonexistent dir --- dev/traffic_monitor/.gitignore | 19 +++++++++++++++++++ dev/traffic_monitor/tm.config.json | 4 +++- 2 files changed, 22 insertions(+), 1 deletion(-) create mode 100644 dev/traffic_monitor/.gitignore diff --git a/dev/traffic_monitor/.gitignore b/dev/traffic_monitor/.gitignore new file mode 100644 index 0000000000..7aed120107 --- /dev/null +++ b/dev/traffic_monitor/.gitignore @@ -0,0 +1,19 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + +# TM backups +*.backup.json diff --git a/dev/traffic_monitor/tm.config.json b/dev/traffic_monitor/tm.config.json index 8b4d155eac..91b6882653 100644 --- a/dev/traffic_monitor/tm.config.json +++ b/dev/traffic_monitor/tm.config.json @@ -13,5 +13,7 @@ "log_location_debug": "stdout", "serve_read_timeout_ms": 86400000, "serve_write_timeout_ms": 86400000, - "static_file_dir": "/root/go/src/github.com/apache/trafficcontrol/traffic_monitor/static/" + "static_file_dir": "/root/go/src/github.com/apache/trafficcontrol/traffic_monitor/static/", + "crconfig_backup_file": "/root/go/src/github.com/apache/trafficcontrol/dev/traffic_monitor/snapshot.backup.json", + "tmconfig_backup_file": "/root/go/src/github.com/apache/trafficcontrol/dev/traffic_monitor/monitoring.snapshot.backup.json" } From dc03710a5a1a7de625ee0c6309f26f5925583e51 Mon Sep 17 00:00:00 2001 From: ocket8888 Date: Sat, 11 Sep 2021 20:46:33 -0600 Subject: [PATCH 16/98] Add T3C makefile --- Makefile | 7 ++++++- cache-config/Makefile | 40 +++++++++++++++++++++++++++++++++++----- 2 files changed, 41 insertions(+), 6 deletions(-) diff --git a/Makefile b/Makefile index 3e24d8c7a4..348c44f103 100644 --- a/Makefile +++ b/Makefile @@ -17,9 +17,14 @@ CACHE_CONFIG_DIRS=$(filter-out cache-config/testing/ cache-config/build/,$(wildcard cache-config/*/)) TO_SOURCE=$(filter-out %_test.go,$(wildcard traffic_ops/traffic_ops_golang/**.go)) +T3C_TARGETS := cache-config/t3c/t3c cache-config/t3c-apply/t3c-apply cache-config/t3c-check/t3c-check t3c-check-refs/t3c-check-refs t3c-check-reload/t3c-check-reload cache-config/t3c-diff/t3c-diff cache-config/t3c-generate/t3c-generate cache-config/t3c-preprocess/t3c-preprocess cache-config/t3c-request/t3c-request cache-config/t3c-update/t3c-update cache-config/tm-health-client/tm-health-client + .PHONY: lint unit all check -all: traffic_ops/app/db/admin +all: traffic_ops/app/db/admin $(T3C_TARGETS) + +$(T3C_TARGETS): + $(MAKE) -C cache-config/ $@ traffic_ops/app/db/admin: traffic_ops/app/db/admin.go cd $(dir $@) && go build -o $(notdir $@) . diff --git a/cache-config/Makefile b/cache-config/Makefile index 2a9f0b426d..543382ca4e 100644 --- a/cache-config/Makefile +++ b/cache-config/Makefile @@ -1,4 +1,3 @@ -# # Licensed to the Apache Software Foundation (ASF) under one # or more contributor license agreements. See the NOTICE file # distributed with this work for additional information @@ -15,8 +14,6 @@ # KIND, either express or implied. See the License for the # specific language governing permissions and limitations # under the License. -# - SOURCE_DIRS := $(subst /,,$(dir $(wildcard **/README.md))) MANPAGES := $(join $(SOURCE_DIRS), $(SOURCE_DIRS:%=/%.1)) RST := $(join $(SOURCE_DIRS), $(SOURCE_DIRS:%=/%.rst)) @@ -24,9 +21,16 @@ PANDOC_VERSION := $(shell pandoc --version | head -n1 | cut -d ' ' -f2) DATE ?= $(shell date '+%Y-%m-%d') TC_VERSION ?= $(shell cat ../VERSION) +GO_FLAGS ?= PANDOC_FLAGS := --strip-comments -.PHONY: man rst clean +TARGETS := t3c/t3c t3c-apply/t3c-apply t3c-check/t3c-check t3c-check-refs/t3c-check-refs t3c-check-reload/t3c-check-reload t3c-diff/t3c-diff t3c-generate/t3c-generate t3c-preprocess/t3c-preprocess t3c-request/t3c-request t3c-update/t3c-update tm-health-client/tm-health-client + +.PHONY: debug all man rst clean + +all: $(TARGETS) + +<<<<<<< HEAD man: $(MANPAGES) @@ -59,4 +63,30 @@ rst: $(RST) clean: - $(RM) $(MANPAGES) $(RST) + $(RM) $(MANPAGES) $(RST) $(TARGETS) + +t3c/t3c: $(wildcard t3c/**/*.go) $(wildcard t3c/*.go) + go build -o $@ $(GO_FLAGS) github.com/apache/trafficcontrol/cache-config/$(dir $@) +t3c-apply/t3c-apply: $(wildcard t3c-apply/**/*.go) $(wildcard t3c-apply/*.go) + go build -o $@ $(GO_FLAGS) github.com/apache/trafficcontrol/cache-config/$(dir $@) +t3c-check/t3c-check: $(wildcard t3c-check/**/*.go) $(wildcard t3c-check/*.go) + go build -o $@ $(GO_FLAGS) github.com/apache/trafficcontrol/cache-config/$(dir $@) +t3c-check-refs/t3c-check-refs: $(wildcard t3c-check-refs/**/*.go) $(wildcard t3c-check-refs/*.go) + go build -o $@ $(GO_FLAGS) github.com/apache/trafficcontrol/cache-config/$(dir $@) +t3c-check-reload/t3c-check-reload: $(wildcard t3c-check-reload/**/*.go) $(wildcard t3c-check-reload/*.go) + go build -o $@ $(GO_FLAGS) github.com/apache/trafficcontrol/cache-config/$(dir $@) +t3c-diff/t3c-diff: $(wildcard t3c-diff/**/*.go) $(wildcard t3c-diff/*.go) + go build -o $@ $(GO_FLAGS) github.com/apache/trafficcontrol/cache-config/$(dir $@) +t3c-generate/t3c-generate: $(wildcard t3c-generate/**/*.go) $(wildcard t3c-generate/*.go) + go build -o $@ $(GO_FLAGS) github.com/apache/trafficcontrol/cache-config/$(dir $@) +t3c-preprocess/t3c-preprocess: $(wildcard t3c-preprocess/**/*.go) $(wildcard t3c-preprocess/*.go) + go build -o $@ $(GO_FLAGS) github.com/apache/trafficcontrol/cache-config/$(dir $@) +t3c-request/t3c-request: $(wildcard t3c-request/**/*.go) $(wildcard t3c-request/*.go) + go build -o $@ $(GO_FLAGS) github.com/apache/trafficcontrol/cache-config/$(dir $@) +t3c-update/t3c-update: $(wildcard t3c-update/**/*.go) $(wildcard t3c-update/*.go) + go build -o $@ $(GO_FLAGS) github.com/apache/trafficcontrol/cache-config/$(dir $@) +tm-health-client/tm-health-client: $(wildcard tm-health-client/**/*.go) $(wildcard tm-health-client/*.go) + go build -o $@ $(GO_FLAGS) github.com/apache/trafficcontrol/cache-config/$(dir $@) + +debug: GO_FLAGS=--gcflags "all=-N -l" +debug: all From cff3d0f76ae02088217b360f2d0d9b3f5f40bfae Mon Sep 17 00:00:00 2001 From: ocket8888 Date: Mon, 13 Sep 2021 07:22:41 -0600 Subject: [PATCH 17/98] Remove extraneous option to $(RM) in t3c makefile --- cache-config/Makefile | 2 -- 1 file changed, 2 deletions(-) diff --git a/cache-config/Makefile b/cache-config/Makefile index 543382ca4e..a6b63405c9 100644 --- a/cache-config/Makefile +++ b/cache-config/Makefile @@ -30,8 +30,6 @@ TARGETS := t3c/t3c t3c-apply/t3c-apply t3c-check/t3c-check t3c-check-refs/t3c-ch all: $(TARGETS) -<<<<<<< HEAD - man: $(MANPAGES) %.1: APP=$(subst /,,$(dir $@)) From cf6800f29bbaa9f8996ea0766fdec609f5ae17e9 Mon Sep 17 00:00:00 2001 From: ocket8888 Date: Mon, 13 Sep 2021 13:42:15 -0600 Subject: [PATCH 18/98] Fix TO building too much --- dev/traffic_ops/run.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dev/traffic_ops/run.sh b/dev/traffic_ops/run.sh index 7ecf587a65..56097bbd50 100755 --- a/dev/traffic_ops/run.sh +++ b/dev/traffic_ops/run.sh @@ -12,7 +12,7 @@ TC=/root/go/src/github.com/apache/trafficcontrol ADMIN="$TC/traffic_ops/app/db/admin" cd "$TC" -make +make traffic_ops/app/db/admin cd "$TC/dev/traffic_ops" "$ADMIN" -c ./dbconf.yml -s "$TC/traffic_ops/app/db/create_tables.sql" -S "$TC/traffic_ops/app/db/seeds.sql" -p "$TC/traffic_ops/app/db/patches.sql" -m "$TC/traffic_ops/app/db/migrations" reset From 6fd57ab80c40c516a4332d8a25c8b31b560b1756 Mon Sep 17 00:00:00 2001 From: ocket8888 Date: Mon, 13 Sep 2021 14:12:34 -0600 Subject: [PATCH 19/98] Add "live"-reloading t3c container to the dev environment --- dev/t3c/Dockerfile | 47 ++++++++++++++++++++++++++ dev/t3c/run.sh | 83 ++++++++++++++++++++++++++++++++++++++++++++++ docker-compose.yml | 14 ++++++++ 3 files changed, 144 insertions(+) create mode 100644 dev/t3c/Dockerfile create mode 100755 dev/t3c/run.sh diff --git a/dev/t3c/Dockerfile b/dev/t3c/Dockerfile new file mode 100644 index 0000000000..ee0a0f589e --- /dev/null +++ b/dev/t3c/Dockerfile @@ -0,0 +1,47 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +FROM alpine:latest AS traffic-server-builder + +RUN apk add --no-cache build-base perl libexecinfo-dev pcre-dev libressl-dev libtool linux-headers openssl-dev zlib-dev +ADD https://downloads.apache.org/trafficserver/trafficserver-9.1.0.tar.bz2 / +RUN tar -xf trafficserver-9.1.0.tar.bz2 && cd trafficserver-9.1.0 && mkdir /ats && ./configure --prefix / --enable-experimental-plugins && make && make install && ls -R /ats + +FROM alpine:latest AS t3c-dev + +VOLUME /root/go/src/github.com/apache/trafficcontrol +EXPOSE 443 + +COPY --from=traffic-server-builder /bin/traffic_cache_tool /bin/traffic_crashlog /bin/traffic_ctl /bin/traffic_layout /bin/traffic_logcat /bin/traffic_logstats /bin/traffic_manager /bin/traffic_server /bin/traffic_via /bin/trafficserver /bin/tspush /bin/tsxs /bin/ +COPY --from=traffic-server-builder /etc/trafficserver /etc/trafficserver +COPY --from=traffic-server-builder /include/ts /include/ts +COPY --from=traffic-server-builder /include/tscpp /include/tscpp +COPY --from=traffic-server-builder /lib/perl5 /lib/perl5 +COPY --from=traffic-server-builder /lib/pkgconfig/trafficserver.pc /lib/pkgconfig/trafficserver.pc +COPY --from=traffic-server-builder /lib/libtscore.la /lib/libtscore.so /lib/libtscore.so.9 /lib/libtscore.so.9.1.1 /lib/libtscppapi.la /lib/libtscppapi.so /lib/libtscppapi.so.9 /lib/libtscppapi.so.9.1.1 /lib/libtscpputil.la /lib/libtscpputil.so /lib/libtscpputil.so.9 /lib/libtscpputil.so.9.1.1 /lib/libtsmgmt.la /lib/libtsmgmt.so /lib/libtsmgmt.so.9 /lib/libtsmgmt.so.9.1.1 /lib/plugin_init_fail.la /lib/plugin_init_fail.so /lib/plugin_instinit_fail.la /lib/plugin_instinit_fail.so /lib/plugin_missing_deleteinstance.la /lib/plugin_missing_deleteinstance.so /lib/plugin_missing_doremap.la /lib/plugin_missing_doremap.so /lib/plugin_missing_init.la /lib/plugin_missing_init.so /lib/plugin_missing_newinstance.la /lib/plugin_missing_newinstance.so /lib/plugin_required_cb.la /lib/plugin_required_cb.so /lib/plugin_testing_calls.la /lib/plugin_testing_calls.so /lib/plugin_v1.la /lib/plugin_v1.so /lib/plugin_v2.la /lib/plugin_v2.so /lib/ +COPY --from=traffic-server-builder /libexec/trafficserver /libexec/trafficserver +COPY --from=traffic-server-builder /share/man /share/man +RUN mkdir /share/trafficserver && mkdir -p /var/log/trafficserver && mkdir /var/trafficserver + +RUN apk add --no-cache make inotify-tools go pcre libexecinfo && \ + go install github.com/go-delve/delve/cmd/dlv@latest && \ + ln -s /root/go/bin/dlv /usr/bin/dlv && \ + mkdir /lib64 && \ + ln -s /lib/libc.musl-x86_64.so.1 /lib64/ld-linux-x86-64.so.2 + +RUN echo "stats_over_http.so" >> /etc/trafficserver/plugin.config && echo "system_stats.so" >> /etc/trafficserver/plugin.config + +ENTRYPOINT /root/go/src/github.com/apache/trafficcontrol/dev/t3c/run.sh diff --git a/dev/t3c/run.sh b/dev/t3c/run.sh new file mode 100755 index 0000000000..44b6d4314b --- /dev/null +++ b/dev/t3c/run.sh @@ -0,0 +1,83 @@ +#!/bin/sh + +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + +set -o errexit +trap '[ $? -eq 0 ] && exit 0 || echo "Error on line ${LINENO} of ${0}"; exit 1' EXIT + + +TC=/root/go/src/github.com/apache/trafficcontrol + +cd "$TC/cache-config" + +# Build area may contain non-debug binaries +make clean && make -j debug + +if [[ ! -f /usr/bin/t3c ]]; then + ln -s /root/go/src/github.com/apache/trafficcontrol/cache-config/t3c/t3c /usr/bin/ +fi +if [[ ! -f /usr/bin/t3c-apply ]]; then + ln -s /root/go/src/github.com/apache/trafficcontrol/cache-config/t3c-apply/t3c-apply /usr/bin/ +fi +if [[ ! -f /usr/bin/t3c-check ]]; then + ln -s /root/go/src/github.com/apache/trafficcontrol/cache-config/t3c-check/t3c-check /usr/bin/ +fi +if [[ ! -f /usr/bin/t3c-check-refs ]]; then + ln -s /root/go/src/github.com/apache/trafficcontrol/cache-config/t3c-check-refs/t3c-check-refs /usr/bin/ +fi +if [[ ! -f /usr/bin/t3c-check-reload ]]; then + ln -s /root/go/src/github.com/apache/trafficcontrol/cache-config/t3c-check-reload/t3c-check-reload /usr/bin/ +fi +if [[ ! -f /usr/bin/t3c-diff ]]; then + ln -s /root/go/src/github.com/apache/trafficcontrol/cache-config/t3c-diff/t3c-diff /usr/bin/ +fi +if [[ ! -f /usr/bin/t3c-generate ]]; then + ln -s /root/go/src/github.com/apache/trafficcontrol/cache-config/t3c-generate/t3c-generate /usr/bin/ +fi +if [[ ! -f /usr/bin/t3c-preprocess ]]; then + ln -s /root/go/src/github.com/apache/trafficcontrol/cache-config/t3c-preprocess/t3c-preprocess /usr/bin/ +fi +if [[ ! -f /usr/bin/t3c-request ]]; then + ln -s /root/go/src/github.com/apache/trafficcontrol/cache-config/t3c-request/t3c-request /usr/bin/ +fi +if [[ ! -f /usr/bin/t3c-update ]]; then + ln -s /root/go/src/github.com/apache/trafficcontrol/cache-config/t3c-update/t3c-update /usr/bin/ +fi +if [[ ! -f /usr/bin/tm-health-client ]]; then + ln -s /root/go/src/github.com/apache/trafficcontrol/cache-config/tm-health-client/tm-health-client /usr/bin/ +fi + +traffic_server & + +while inotifywait --exclude '.*(\.md|\.json|\.pl|\.rst|_test\.go|\.gitignore|__debug_bin|-logrotate|.service)$|^\./(build|t3c-check-refs/test-files|testing|t3util/testing|tm-health-client/(config|tmagent)/test_files)/.*' -e modify -r . ; do + T3C_PID="$(ps | grep t3c | grep -v grep | grep -v inotifywait | grep -v run.sh | tr -s ' ' | cut -d ' ' -f2)" + if [[ ! -z "$T3"]]; then + echo "$T3C_PID" | xargs kill; + fi + # TODO: is it even necessary to restart ATS? + if [[ -f /var/trafficserver/server.lock ]]; then + rm /var/trafficserver/server.lock; + fi + ps | grep traffic_server | grep -v grep | tr -s ' ' | cut -d ' ' -f2 | xargs kill + traffic_server & + # for whatever reason, without this the repeated call to inotifywait will + # sometimes lose track of th current directory. It spits out: + # Couldn't watch .: No such file or directory + # which is a bit odd. + sleep 0.5 +done; diff --git a/docker-compose.yml b/docker-compose.yml index 7e5018e618..57c69a9ee1 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -81,3 +81,17 @@ services: - 81:81 volumes: - .:/root/go/src/github.com/apache/trafficcontrol + + t3c: + build: + context: dev/t3c + depends_on: + - trafficops + hostname: edge + domainname: dev.ciab.test + image: t3c-dev + ports: + - 8080:80 + - 8081:8081 + volumes: + - .:/root/go/src/github.com/apache/trafficcontrol From 2a019fc60fd00102dd360e4918f4543df5edc40a Mon Sep 17 00:00:00 2001 From: ocket8888 Date: Mon, 13 Sep 2021 14:13:02 -0600 Subject: [PATCH 20/98] add a dev env shell script file that defines dev functions --- dev/atc.dev.sh | 87 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 87 insertions(+) create mode 100644 dev/atc.dev.sh diff --git a/dev/atc.dev.sh b/dev/atc.dev.sh new file mode 100644 index 0000000000..520de9dfe9 --- /dev/null +++ b/dev/atc.dev.sh @@ -0,0 +1,87 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + +alias atc-start="docker-compose up -d --build"; +alias atc-stop="docker-compose down -v --remove-orphans"; +alias atc-restart="atc-stop && atc-start"; + +function atc-ready { + curl -skL https://localhost:6443/api/4.0/ping >/dev/null 2>&1; + return $?; +} + +function atc-exec { + if [[ $# -lt 2 ]]; then + echo "Usage: atc-exec SERVICE CMD" >&2; + return 1; + fi; + local service="trafficcontrol_$1_1"; + shift; + docker exec "$service" $@; + return $?; +} + +function atc-connect { + if [[ $# -ne 1 ]]; then + echo "Usage: atc-connect SERVICE" >&2; + return 1; + fi; + docker exec -it "trafficcontrol_$1_1" /bin/sh; + return $?; +} + +export t3cDir="/root/go/src/github.com/apache/trafficcontrol/cache-config"; + +function t3c { + trap 'atc-exec t3c ps | grep dlv | tr -s " " | cut -d " " -f1 | xargs docker exec trafficcontrol_t3c_1 kill' INT; + local dExec=(docker exec); + local dlv=(); + if [[ ! -z "$TC_WAIT" ]]; then + dlv=(dlv --accept-multiclient --listen=:8081 --headless --api-version=2 debug --); + else; + dlv=(dlv --accept-multiclient --continue --listen=:8081 --headless --api-version=2 debug --); + fi + if [[ $# -lt 2 ]]; then + $dExec -w "$t3cDir/t3c" trafficcontrol_t3c_1 $dlv; + return $?; + fi; + local pkg="t3c" + case "$1" in + apply|check|check-refs|check-reload|diff|generate|preprocess|request|update) + pkg="t3c-$1";; + esac; + shift; + $dExec -w "$t3cDir/$pkg" trafficcontrol_t3c_1 $dlv $@; + return "$?"; +} + +function tm-health-client { + trap 'atc-exec t3c ps | grep dlv | tr -s " " | cut -d " " -f1 | xargs docker exec trafficcontrol_t3c_1 kill' INT; + local dExec=(docker exec -w "$t3cDir/tm-health-client" trafficcontrol_t3c_1); + local dlv=(); + if [[ ! -z "$TC_WAIT" ]]; then + dlv=(dlv --accept-multiclient --listen=:8081 --headless --api-version=2 debug --); + else + dlv=(dlv --accept-multiclient --continue --listen=:8081 --headless --api-version=2 debug --); + fi + $dExec $dlv $@ || atc-exec t3c 'ps | grep dlv | tr -s ' ' | cut -d -f1 | xargs kill'; + return $?; +} + +export TO_URL="https://localhost:6443" +export TO_USER="admin" +export TO_PASSWORD="twelve12" From 7b38e86eadb028baf84950002c2d2f7aa8e04b8e Mon Sep 17 00:00:00 2001 From: ocket8888 Date: Tue, 14 Sep 2021 08:52:49 -0600 Subject: [PATCH 21/98] add master 'atc' command --- dev/atc.dev.sh | 46 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) diff --git a/dev/atc.dev.sh b/dev/atc.dev.sh index 520de9dfe9..1ea57cd02f 100644 --- a/dev/atc.dev.sh +++ b/dev/atc.dev.sh @@ -44,6 +44,52 @@ function atc-connect { return $?; } +function atc { + if [[ $# -lt 1 ]]; then + echo "Usage: atc OPERATION" >&2; + return 1; + fi + local arg="$1"; + shift; + case "$arg" in + start) + atc-start $@;; + stop) + atc-stop $@;; + restart) + atc-restart $@;; + ready) + atc-ready $@;; + exec) + atc-exec $@;; + connect) + atc-connect $@;; + -h|--help|/\?) + echo "Usage: atc OPERATION"; + echo ""; + echo "Valid OPERATIONs:"; + echo " start Start up the development environment"; + echo " stop Stop the development environment"; + echo " restart Retart up the development environment"; + echo " ready Check if the development environment is ready"; + echo " exec Run a command in a dev container"; + echo " connect Connect to a shell session inside a dev container"; + ;; + *) + echo "Usage: atc OPERATION" >&2; + echo "" >&2; + echo "Valid OPERATIONs:" >&2; + echo " start Start up the development environment" >&2; + echo " stop Stop the development environment" >&2; + echo " restart Retart up the development environment" >&2; + echo " ready Check if the development environment is ready" >&2; + echo " exec Run a command in a dev container" >&2; + echo " connect Connect to a shell session inside a dev container" >&2; + return 2;; + esac + return "$?"; +} + export t3cDir="/root/go/src/github.com/apache/trafficcontrol/cache-config"; function t3c { From 3542a68e413c2dae0ee8128d3c9f2f0d18a71bc2 Mon Sep 17 00:00:00 2001 From: ocket8888 Date: Tue, 14 Sep 2021 08:53:53 -0600 Subject: [PATCH 22/98] Fix port exposures, add env vars to Dockerfiles --- dev/t3c/Dockerfile | 3 ++- dev/t3c/run.sh | 2 -- dev/tpv2/Dockerfile | 2 ++ dev/tpv2/run.sh | 1 - dev/traffic_monitor/Dockerfile | 3 ++- dev/traffic_monitor/run.sh | 2 -- dev/traffic_ops/Dockerfile | 4 +++- dev/traffic_ops/run.sh | 3 --- dev/traffic_portal/Dockerfile | 2 ++ dev/traffic_portal/run.sh | 3 +-- 10 files changed, 12 insertions(+), 13 deletions(-) diff --git a/dev/t3c/Dockerfile b/dev/t3c/Dockerfile index ee0a0f589e..481fb4bb11 100644 --- a/dev/t3c/Dockerfile +++ b/dev/t3c/Dockerfile @@ -22,8 +22,9 @@ RUN tar -xf trafficserver-9.1.0.tar.bz2 && cd trafficserver-9.1.0 && mkdir /ats FROM alpine:latest AS t3c-dev +ENV TC="/root/go/src/github.com/apache/trafficcontrol/" VOLUME /root/go/src/github.com/apache/trafficcontrol -EXPOSE 443 +EXPOSE 80 8081 COPY --from=traffic-server-builder /bin/traffic_cache_tool /bin/traffic_crashlog /bin/traffic_ctl /bin/traffic_layout /bin/traffic_logcat /bin/traffic_logstats /bin/traffic_manager /bin/traffic_server /bin/traffic_via /bin/trafficserver /bin/tspush /bin/tsxs /bin/ COPY --from=traffic-server-builder /etc/trafficserver /etc/trafficserver diff --git a/dev/t3c/run.sh b/dev/t3c/run.sh index 44b6d4314b..38b4af085f 100755 --- a/dev/t3c/run.sh +++ b/dev/t3c/run.sh @@ -21,8 +21,6 @@ set -o errexit trap '[ $? -eq 0 ] && exit 0 || echo "Error on line ${LINENO} of ${0}"; exit 1' EXIT -TC=/root/go/src/github.com/apache/trafficcontrol - cd "$TC/cache-config" # Build area may contain non-debug binaries diff --git a/dev/tpv2/Dockerfile b/dev/tpv2/Dockerfile index ba84e717e0..5412b9861d 100644 --- a/dev/tpv2/Dockerfile +++ b/dev/tpv2/Dockerfile @@ -12,6 +12,7 @@ # limitations under the License. # FROM alpine:latest AS certbuilder + RUN apk add --no-cache openssl RUN openssl genrsa -passout pass:x -out server.pass.key 2048 && \ openssl rsa -passin pass:x -in server.pass.key -out server.key && \ @@ -23,6 +24,7 @@ RUN openssl genrsa -passout pass:x -out server.pass.key 2048 && \ FROM node:alpine AS tpv2-dev +ENV TC="/root/go/src/github.com/apache/trafficcontrol/" VOLUME /root/go/src/github.com/apache/trafficcontrol EXPOSE 443 diff --git a/dev/tpv2/run.sh b/dev/tpv2/run.sh index dff3de31c8..7ab98337ea 100755 --- a/dev/tpv2/run.sh +++ b/dev/tpv2/run.sh @@ -15,7 +15,6 @@ set -o errexit -TC="/root/go/src/github.com/apache/trafficcontrol/" cd "$TC/experimental/traffic-portal" npm install ./node_modules/.bin/ng serve --ssl --ssl-cert /server.crt --ssl-key /server.key --watch --progress --proxy-config "$TC/dev/tpv2/proxy.json" --port 443 --host "::0" --live-reload diff --git a/dev/traffic_monitor/Dockerfile b/dev/traffic_monitor/Dockerfile index d5f9f0656e..19635c9133 100644 --- a/dev/traffic_monitor/Dockerfile +++ b/dev/traffic_monitor/Dockerfile @@ -13,8 +13,9 @@ # FROM alpine:latest AS trafficmonitor-dev +ENV TC=/root/go/src/github.com/apache/trafficcontrol VOLUME /root/go/src/github.com/apache/trafficcontrol -EXPOSE 443 +EXPOSE 80 81 RUN apk add --no-cache inotify-tools go && go install github.com/go-delve/delve/cmd/dlv@latest && ln -s /root/go/bin/dlv /usr/bin/dlv RUN mkdir /lib64 && ln -s /lib/libc.musl-x86_64.so.1 /lib64/ld-linux-x86-64.so.2 diff --git a/dev/traffic_monitor/run.sh b/dev/traffic_monitor/run.sh index c8c4d8b7f9..6dd179d3f4 100755 --- a/dev/traffic_monitor/run.sh +++ b/dev/traffic_monitor/run.sh @@ -3,8 +3,6 @@ set -o errexit trap '[ $? -eq 0 ] && exit 0 || echo "Error on line ${LINENO} of ${0}"; exit 1' EXIT -TC=/root/go/src/github.com/apache/trafficcontrol - cd "$TC/traffic_monitor" dlv --accept-multiclient --continue --listen=:81 --headless --api-version=2 debug -- --opsCfg="$TC/dev/traffic_monitor/ops.config.json" --config="$TC/dev/traffic_monitor/tm.config.json" & diff --git a/dev/traffic_ops/Dockerfile b/dev/traffic_ops/Dockerfile index 722379bcc6..ab8d1b06bb 100644 --- a/dev/traffic_ops/Dockerfile +++ b/dev/traffic_ops/Dockerfile @@ -23,8 +23,10 @@ RUN openssl genrsa -passout pass:x -out server.pass.key 2048 && \ FROM alpine:latest AS trafficops-dev +ENV TC="/root/go/src/github.com/apache/trafficcontrol/" VOLUME /root/go/src/github.com/apache/trafficcontrol -EXPOSE 443 +ENV ADMIN="$TC/traffic_ops/app/db/admin" +EXPOSE 443 6444 COPY --from=certbuilder /server.key /server.crt /aes.key / RUN apk add --no-cache make inotify-tools go postgresql-client && go install github.com/go-delve/delve/cmd/dlv@latest && ln -s /root/go/bin/dlv /usr/bin/dlv diff --git a/dev/traffic_ops/run.sh b/dev/traffic_ops/run.sh index 56097bbd50..0f645dec22 100755 --- a/dev/traffic_ops/run.sh +++ b/dev/traffic_ops/run.sh @@ -8,9 +8,6 @@ while ! pg_isready -h db -p 5432 -d postgres; do sleep 3; done -TC=/root/go/src/github.com/apache/trafficcontrol -ADMIN="$TC/traffic_ops/app/db/admin" - cd "$TC" make traffic_ops/app/db/admin cd "$TC/dev/traffic_ops" diff --git a/dev/traffic_portal/Dockerfile b/dev/traffic_portal/Dockerfile index 5d53a3b99d..7632673625 100644 --- a/dev/traffic_portal/Dockerfile +++ b/dev/traffic_portal/Dockerfile @@ -23,8 +23,10 @@ RUN openssl genrsa -passout pass:x -out server.pass.key 2048 && \ FROM node:alpine AS trafficportal-dev +ENV TC="/root/go/src/github.com/apache/trafficcontrol/" VOLUME /root/go/src/github.com/apache/trafficcontrol EXPOSE 443 +ENV TP_SERVER_CONFIG_FILE="$TC/dev/traffic_portal/config.js" RUN apk add --no-cache ruby ruby-dev gcc musl-dev make && gem update --system && gem install sass compass COPY --from=certbuilder /server.key /server.crt / diff --git a/dev/traffic_portal/run.sh b/dev/traffic_portal/run.sh index a3567ce450..79607d4658 100755 --- a/dev/traffic_portal/run.sh +++ b/dev/traffic_portal/run.sh @@ -15,7 +15,6 @@ set -o errexit -TC="/root/go/src/github.com/apache/trafficcontrol/" cd "$TC/traffic_portal" npm install -TP_SERVER_CONFIG_FILE="$TC/dev/traffic_portal/config.js" ./node_modules/.bin/grunt +./node_modules/.bin/grunt From bdb7448d9be97b74e7a338ec37fb29988c1e6d53 Mon Sep 17 00:00:00 2001 From: ocket8888 Date: Tue, 14 Sep 2021 08:55:41 -0600 Subject: [PATCH 23/98] Add trafficrouter service --- dev/traffic_router/Dockerfile | 28 +++++++++++++++++ dev/traffic_router/run.sh | 23 ++++++++++++++ dev/traffic_router/settings.xml | 21 +++++++++++++ docker-compose.yml | 19 ++++++++++++ .../cdn-in-a-box/traffic_router/run.sh | 30 +++++++++---------- 5 files changed, 106 insertions(+), 15 deletions(-) create mode 100644 dev/traffic_router/Dockerfile create mode 100755 dev/traffic_router/run.sh create mode 100644 dev/traffic_router/settings.xml diff --git a/dev/traffic_router/Dockerfile b/dev/traffic_router/Dockerfile new file mode 100644 index 0000000000..431a6dde64 --- /dev/null +++ b/dev/traffic_router/Dockerfile @@ -0,0 +1,28 @@ +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +FROM alpine:latest AS trafficops-dev + +ENV TC=/root/go/src/github.com/apache/trafficcontrol +VOLUME /root/go/src/github.com/apache/trafficcontrol +ENV JPDA_OPTS="-agentlib:jdwp=transport=dt_socket,address=5005,server=y,suspend=n" JAVA_HOME=/usr/lib/jvm/java-8-openjdk M2_HOME=/root/.m2/ +EXPOSE 3053:53/tcp 3053:53/udp 3080:80 3443:443 3333:3333 2222:3443 5005:5005 + +RUN apk add --no-cache openjdk8 inotify-tools maven && ln -s /usr/lib/jvm/java-1.8-openjdk/bin/jdb /bin/jdb + +ADD https://dlcdn.apache.org/tomcat/tomcat-9/v9.0.53/bin/apache-tomcat-9.0.53.tar.gz /opt/tomcat.tgz +RUN cd /opt && tar -xf tomcat.tgz && mv apache-tomcat-9.0.53 tomcat && rm /usr/share/java/maven-3/conf/settings.xml + +COPY settings.xml /usr/share/java/maven-3/conf/settings.xml + +ENTRYPOINT /root/go/src/github.com/apache/trafficcontrol/dev/traffic_router/run.sh diff --git a/dev/traffic_router/run.sh b/dev/traffic_router/run.sh new file mode 100755 index 0000000000..1a63b9de98 --- /dev/null +++ b/dev/traffic_router/run.sh @@ -0,0 +1,23 @@ +#!/bin/sh + +set -o errexit +trap '[ $? -eq 0 ] && exit 0 || echo "Error on line ${LINENO} of ${0}"; exit 1' EXIT + +cd "$TC/traffic_router" + +mvn -Dmaven.test.skip=true compile -P \!rpm-build +mvn -Dmaven.test.skip=true package -P \!rpm-build + +/opt/tomcat/bin/catalina.sh jpda debug +# java -agentlib:jdwp=transport=dt_socket,address=5005,server=y,suspend=n StartTrafficRouter + +# while inotifywait --exclude '.*(\.md|_test\.go|\.gitignore|__debug_bin)$' -e modify -r . ; do +# kill "$(netstat -nlp | grep ':443' | grep __debug_bin | head -n1 | tr -s ' ' | cut -d ' ' -f7 | cut -d '/' -f1)" +# kill "$(netstat -nlp | grep ':6444' | grep dlv | head -n1 | tr -s ' ' | cut -d ' ' -f7 | cut -d '/' -f1)" +# dlv --accept-multiclient --continue --listen=:6444 --headless --api-version=2 debug -- --cfg=../../dev/traffic_ops/cdn.json --dbcfg=../../dev/traffic_ops/db.config.json & +# # for whatever reason, without this the repeated call to inotifywait will +# # sometimes lose track of th current directory. It spits out: +# # Couldn't watch .: No such file or directory +# # which is a bit odd. +# sleep 0.5 +# done; diff --git a/dev/traffic_router/settings.xml b/dev/traffic_router/settings.xml new file mode 100644 index 0000000000..ad86e7e4b9 --- /dev/null +++ b/dev/traffic_router/settings.xml @@ -0,0 +1,21 @@ + + + /root/go/src/github.com/apache/trafficcontrol/.m2/repository/ + diff --git a/docker-compose.yml b/docker-compose.yml index 57c69a9ee1..8ad4018f01 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -95,3 +95,22 @@ services: - 8081:8081 volumes: - .:/root/go/src/github.com/apache/trafficcontrol + + trafficrouter: + build: + context: dev/traffic_router + depends_on: + - trafficmonitor + hostname: trafficrouter + domainname: dev.ciab.test + image: trafficrouter-dev + ports: + - 3053:53/tcp + - 3053:53/udp + - 3080:80 + - 3443:443 + - 3333:3333 + - 2222:3443 + - 5005:5005 + volumes: + - .:/root/go/src/github.com/apache/trafficcontrol diff --git a/infrastructure/cdn-in-a-box/traffic_router/run.sh b/infrastructure/cdn-in-a-box/traffic_router/run.sh index 990b0265a5..642c2412e9 100755 --- a/infrastructure/cdn-in-a-box/traffic_router/run.sh +++ b/infrastructure/cdn-in-a-box/traffic_router/run.sh @@ -66,7 +66,7 @@ LOGFILE="$CATALINA_BASE/var/log/traffic_router.log" ACCESSLOG="$CATALINA_BASE/var/log/access.log" export JAVA_HOME JAVA_OPTS -export TO_PROPERTIES TM_PROPERTIES +export TO_PROPERTIES TM_PROPERTIES export CATALINA_HOME CATALINA_BASE CATALINA_OPTS CATALINA_OUT CATALINA_PID # Wait on SSL certificate generation @@ -90,19 +90,19 @@ cp $X509_CA_INTR_CERT_FILE $CATALINA_BASE/conf cp $X509_CA_CERT_FULL_CHAIN_FILE /etc/pki/ca-trust/source/anchors update-ca-trust extract -# Add traffic -for crtfile in $(find $CATALINA_BASE/conf -name \*.crt -type f) -do - alias=$(echo $crtfile |sed -e 's/.crt//g' |tr [:upper:] [:lower:]); - cacerts=$(find $JAVA_HOME -follow -name cacerts); echo $cacerts; - keytool=$JAVA_HOME/bin/keytool; - - $keytool -list -alias $alias -keystore $cacerts -storepass changeit -noprompt > /dev/null; - - if [ $? -ne 0 ]; then - echo "Installing certificate ${crtfile}.."; - $keytool -import -trustcacerts -file $crtfile -alias $alias -keystore $cacerts -storepass changeit -noprompt; - fi; +# Add traffic +for crtfile in $(find $CATALINA_BASE/conf -name \*.crt -type f) +do + alias=$(echo $crtfile |sed -e 's/.crt//g' |tr [:upper:] [:lower:]); + cacerts=$(find $JAVA_HOME -follow -name cacerts); echo $cacerts; + keytool=$JAVA_HOME/bin/keytool; + + $keytool -list -alias $alias -keystore $cacerts -storepass changeit -noprompt > /dev/null; + + if [ $? -ne 0 ]; then + echo "Installing certificate ${crtfile}.."; + $keytool -import -trustcacerts -file $crtfile -alias $alias -keystore $cacerts -storepass changeit -noprompt; + fi; done /opt/traffic_router/conf/generatingCerts.sh @@ -134,4 +134,4 @@ else exec /opt/tomcat/bin/catalina.sh run & fi; -tail -F $CATALINA_OUT $CATALINA_LOG $LOGFILE $ACCESSLOG +tail -F $CATALINA_OUT $CATALINA_LOG $LOGFILE $ACCESSLOG From 297d1a2642d3e6f051f74c4268bd6a8178a05a47 Mon Sep 17 00:00:00 2001 From: ocket8888 Date: Tue, 14 Sep 2021 08:58:52 -0600 Subject: [PATCH 24/98] Fix TR service catalina not running --- dev/traffic_router/run.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dev/traffic_router/run.sh b/dev/traffic_router/run.sh index 1a63b9de98..c56445f6d9 100755 --- a/dev/traffic_router/run.sh +++ b/dev/traffic_router/run.sh @@ -8,7 +8,7 @@ cd "$TC/traffic_router" mvn -Dmaven.test.skip=true compile -P \!rpm-build mvn -Dmaven.test.skip=true package -P \!rpm-build -/opt/tomcat/bin/catalina.sh jpda debug +/opt/tomcat/bin/catalina.sh jpda run # java -agentlib:jdwp=transport=dt_socket,address=5005,server=y,suspend=n StartTrafficRouter # while inotifywait --exclude '.*(\.md|_test\.go|\.gitignore|__debug_bin)$' -e modify -r . ; do From 93ce66bd7862e13d2cb44b6073e733b338245709 Mon Sep 17 00:00:00 2001 From: ocket8888 Date: Mon, 25 Oct 2021 09:59:44 -0600 Subject: [PATCH 25/98] bump Tomcat version to one that's supported --- dev/traffic_router/Dockerfile | 6 +- traffic_portal/package-lock.json | 7378 +++--------------------------- 2 files changed, 633 insertions(+), 6751 deletions(-) diff --git a/dev/traffic_router/Dockerfile b/dev/traffic_router/Dockerfile index 431a6dde64..9555a75c8c 100644 --- a/dev/traffic_router/Dockerfile +++ b/dev/traffic_router/Dockerfile @@ -11,7 +11,7 @@ # See the License for the specific language governing permissions and # limitations under the License. # -FROM alpine:latest AS trafficops-dev +FROM alpine:latest AS trafficrouter-dev ENV TC=/root/go/src/github.com/apache/trafficcontrol VOLUME /root/go/src/github.com/apache/trafficcontrol @@ -20,8 +20,8 @@ EXPOSE 3053:53/tcp 3053:53/udp 3080:80 3443:443 3333:3333 2222:3443 5005:5005 RUN apk add --no-cache openjdk8 inotify-tools maven && ln -s /usr/lib/jvm/java-1.8-openjdk/bin/jdb /bin/jdb -ADD https://dlcdn.apache.org/tomcat/tomcat-9/v9.0.53/bin/apache-tomcat-9.0.53.tar.gz /opt/tomcat.tgz -RUN cd /opt && tar -xf tomcat.tgz && mv apache-tomcat-9.0.53 tomcat && rm /usr/share/java/maven-3/conf/settings.xml +ADD https://dlcdn.apache.org/tomcat/tomcat-9/v9.0.54/bin/apache-tomcat-9.0.54.tar.gz /opt/tomcat.tgz +RUN cd /opt && tar -xf tomcat.tgz && mv apache-tomcat-9.0.54 tomcat && rm /usr/share/java/maven-3/conf/settings.xml COPY settings.xml /usr/share/java/maven-3/conf/settings.xml diff --git a/traffic_portal/package-lock.json b/traffic_portal/package-lock.json index 6fe2df47e0..07b1675062 100644 --- a/traffic_portal/package-lock.json +++ b/traffic_portal/package-lock.json @@ -1,6210 +1,8 @@ { "name": "traffic_portal", "version": "6.2.0", - "lockfileVersion": 2, + "lockfileVersion": 1, "requires": true, - "packages": { - "": { - "version": "6.2.0", - "dependencies": { - "@uirouter/angularjs": "0.4.2", - "ag-grid-community": "23.2.0", - "angular": "1.8.0", - "angular-animate": "1.8.0", - "angular-bootstrap-contextmenu": "1.2.1", - "angular-jwt": "0.0.9", - "angular-loading-bar": "0.8.0", - "angular-resource": "1.8.0", - "angular-route": "1.8.0", - "angular-sanitize": "1.8.0", - "angular-ui-bootstrap": "0.14.3", - "bootstrap-sass": "3.4.1", - "es5-shim": "4.6.4", - "flot": "2.3.2", - "font-awesome": "4.7.0", - "jquery": "3.6.0", - "jquery.flot.tooltip": "0.9.0", - "json3": "3.3.3" - }, - "devDependencies": { - "browserify": "16.5.1", - "connect-livereload": "0.6.1", - "connect-modrewrite": "0.10.2", - "connect-timeout": "1.9.0", - "express": "4.17.2", - "grunt": "1.4.1", - "grunt-browserify": "6.0.0", - "grunt-contrib-clean": "2.0.0", - "grunt-contrib-copy": "1.0.0", - "grunt-contrib-watch": "1.1.0", - "grunt-dart-sass": "2.0.1", - "grunt-express-server": "0.5.4", - "grunt-html2js": "0.8.0", - "grunt-install-dependencies": "0.2.0", - "grunt-string-replace": "1.3.1", - "load-grunt-config": "4.0.1", - "morgan": "1.10.0", - "requirejs": "2.3.6", - "sass": "1.49.0", - "ssl-root-cas": "1.3.1", - "time-grunt": "2.0.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", - "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==", - "dev": true, - "optional": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/parser": { - "version": "7.16.8", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.16.8.tgz", - "integrity": "sha512-i7jDUfrVBWc+7OKcBzEe5n7fbv3i2fWtxKzzCvOjnzSxMfWMigAhtfJ7qzZNGFNMsCCd67+uz553dYKWXPvCKw==", - "dev": true, - "optional": true, - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/types": { - "version": "7.16.8", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.16.8.tgz", - "integrity": "sha512-smN2DQc5s4M7fntyjGtyIPbRJv6wW4rU/94fmYJ7PKQuZkC0qGMHXJbg6sNGt12JmVr4k5YaptI/XtiLJBnmIg==", - "dev": true, - "optional": true, - "dependencies": { - "@babel/helper-validator-identifier": "^7.16.7", - "to-fast-properties": "^2.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@coolaj86/urequest": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/@coolaj86/urequest/-/urequest-1.3.7.tgz", - "integrity": "sha512-PPrVYra9aWvZjSCKl/x1pJ9ZpXda1652oJrPBYy5rQumJJMkmTBN3ux+sK2xAUwVvv2wnewDlaQaHLxLwSHnIA==", - "dev": true - }, - "node_modules/@types/minimatch": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz", - "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==", - "dev": true - }, - "node_modules/@uirouter/angularjs": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/@uirouter/angularjs/-/angularjs-0.4.2.tgz", - "integrity": "sha512-1bKQbQkrwHo3mNzrrvYML8AlQBLCoSYSzCV8Z6rqByRT75EDN9wPtuLFbBjG/R7GZs3hh1JKl4F5BZ8VDu0vWA==", - "dependencies": { - "angular": "^1.0.8" - } - }, - "node_modules/abbrev": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.9.tgz", - "integrity": "sha1-kbR5JYinc4wl813W9jdSovh3YTU=", - "dev": true - }, - "node_modules/accepts": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", - "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", - "dev": true, - "dependencies": { - "mime-types": "~2.1.24", - "negotiator": "0.6.2" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", - "dev": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-node": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/acorn-node/-/acorn-node-1.8.2.tgz", - "integrity": "sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A==", - "dev": true, - "dependencies": { - "acorn": "^7.0.0", - "acorn-walk": "^7.0.0", - "xtend": "^4.0.2" - } - }, - "node_modules/acorn-walk": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", - "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", - "dev": true, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/ag-grid-community": { - "version": "23.2.0", - "resolved": "https://registry.npmjs.org/ag-grid-community/-/ag-grid-community-23.2.0.tgz", - "integrity": "sha512-aG7Ghfu79HeqOCd50GhFSeZUX1Tw9BVUX1VKMuglkAcwYPTQjuYvYT7QVQB5FGzfFjcVq4a1QFfcgdoAcZYJIA==" - }, - "node_modules/amdefine": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", - "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=", - "dev": true, - "optional": true, - "engines": { - "node": ">=0.4.2" - } - }, - "node_modules/angular": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/angular/-/angular-1.8.0.tgz", - "integrity": "sha512-VdaMx+Qk0Skla7B5gw77a8hzlcOakwF8mjlW13DpIWIDlfqwAbSSLfd8N/qZnzEmQF4jC4iofInd3gE7vL8ZZg==" - }, - "node_modules/angular-animate": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/angular-animate/-/angular-animate-1.8.0.tgz", - "integrity": "sha512-ROFK3UIn1MSVpqAlay15ZxjPmVbvwaO3Zn/2vhmQdYeqxSbUVuOckcvtDLBpHPGPtOAreu35qfV7NQ7u2EgDcA==" - }, - "node_modules/angular-bootstrap-contextmenu": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/angular-bootstrap-contextmenu/-/angular-bootstrap-contextmenu-1.2.1.tgz", - "integrity": "sha512-Jqm5ESXUJxzp5oYCuV2LO2FDyOIZJdJ6Bf7ZmoEcM0iEiGLAcqe+fArleBTeF6jhCFX4NqHFq00nEiF1XhvlKw==" - }, - "node_modules/angular-jwt": { - "version": "0.0.9", - "resolved": "https://registry.npmjs.org/angular-jwt/-/angular-jwt-0.0.9.tgz", - "integrity": "sha1-kSWHtSAYnSjQiURsf6rzDvdTQxM=", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/angular-loading-bar": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/angular-loading-bar/-/angular-loading-bar-0.8.0.tgz", - "integrity": "sha1-kIzKTiJAULEwGxHeTD4ILriLv5E=" - }, - "node_modules/angular-resource": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/angular-resource/-/angular-resource-1.8.0.tgz", - "integrity": "sha512-9woUq3kDwoT7R6SjKX8vaJMhOplYBm9sqRAxKgDhDIdPyA8iBowqQIusf9+8Q+z/HlXb8ZXvKspJyKXrxmKdvg==" - }, - "node_modules/angular-route": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/angular-route/-/angular-route-1.8.0.tgz", - "integrity": "sha512-ORvXAdVfCCA6XFwyjSkVQFFGufj0mNGiCvBR93Qsii8+7t/6Ioy6wheUoCj1x4NWUv7hAq3nYYGCVO6QEKb1BQ==" - }, - "node_modules/angular-sanitize": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/angular-sanitize/-/angular-sanitize-1.8.0.tgz", - "integrity": "sha512-j5GiOPCvfcDWK5svEOVoPb11X3UDVy/mdHPRWuy14Iyw86xaq+Bb+x/em2sAOa5MQQeY5ciLXbF3RRp8iCKcNg==" - }, - "node_modules/angular-ui-bootstrap": { - "version": "0.14.3", - "resolved": "https://registry.npmjs.org/angular-ui-bootstrap/-/angular-ui-bootstrap-0.14.3.tgz", - "integrity": "sha1-2WzmBMhLvXBro0qryh1ac3bhi6Y=", - "peerDependencies": { - "angular": "^1.3.x || >= 1.4.0-beta.0 || >= 1.5.0-beta.0" - } - }, - "node_modules/ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/anymatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", - "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", - "dev": true, - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/array-each": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/array-each/-/array-each-1.0.1.tgz", - "integrity": "sha1-p5SvDAWrF1KEbudTofIRoFugxE8=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=", - "dev": true - }, - "node_modules/array-slice": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-1.1.0.tgz", - "integrity": "sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/asap": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", - "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=", - "dev": true, - "optional": true - }, - "node_modules/asn1.js": { - "version": "4.10.1", - "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", - "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", - "dev": true, - "dependencies": { - "bn.js": "^4.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0" - } - }, - "node_modules/asn1.js/node_modules/bn.js": { - "version": "4.11.9", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", - "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", - "dev": true - }, - "node_modules/assert": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz", - "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==", - "dev": true, - "dependencies": { - "object-assign": "^4.1.1", - "util": "0.10.3" - } - }, - "node_modules/assert-never": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/assert-never/-/assert-never-1.2.1.tgz", - "integrity": "sha512-TaTivMB6pYI1kXwrFlEhLeGfOqoDNdTxjCdwRfFFkEA30Eu+k48W34nlok2EYWJfFFzqaEmichdNM7th6M5HNw==", - "dev": true, - "optional": true - }, - "node_modules/assert/node_modules/inherits": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", - "dev": true - }, - "node_modules/assert/node_modules/util": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", - "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", - "dev": true, - "dependencies": { - "inherits": "2.0.1" - } - }, - "node_modules/async": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", - "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", - "dev": true - }, - "node_modules/available-typed-arrays": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", - "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/babel-walk": { - "version": "3.0.0-canary-5", - "resolved": "https://registry.npmjs.org/babel-walk/-/babel-walk-3.0.0-canary-5.tgz", - "integrity": "sha512-GAwkz0AihzY5bkwIY5QDR+LvsRQgB/B+1foMPvi0FZPMl5fjD7ICiznUiBdLYMH1QYe6vqu4gWYytZOccLouFw==", - "dev": true, - "optional": true, - "dependencies": { - "@babel/types": "^7.9.6" - }, - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" - }, - "node_modules/basic-auth": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz", - "integrity": "sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==", - "dev": true, - "dependencies": { - "safe-buffer": "5.1.2" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/bn.js": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.1.2.tgz", - "integrity": "sha512-40rZaf3bUNKTVYu9sIeeEGOg7g14Yvnj9kH7b50EiwX0Q7A6umbvfI5tvHaOERH0XigqKkfLkFQxzb4e6CIXnA==", - "dev": true - }, - "node_modules/body": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/body/-/body-5.1.0.tgz", - "integrity": "sha1-5LoM5BCkaTYyM2dgnstOZVMSUGk=", - "dev": true, - "dependencies": { - "continuable-cache": "^0.3.1", - "error": "^7.0.0", - "raw-body": "~1.1.0", - "safe-json-parse": "~1.0.1" - } - }, - "node_modules/body-parser": { - "version": "1.19.1", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.1.tgz", - "integrity": "sha512-8ljfQi5eBk8EJfECMrgqNGWPEY5jWP+1IzkzkGdFFEwFQZZyaZ21UqdaHktgiMlH0xLHqIFtE/u2OYE5dOtViA==", - "dev": true, - "dependencies": { - "bytes": "3.1.1", - "content-type": "~1.0.4", - "debug": "2.6.9", - "depd": "~1.1.2", - "http-errors": "1.8.1", - "iconv-lite": "0.4.24", - "on-finished": "~2.3.0", - "qs": "6.9.6", - "raw-body": "2.4.2", - "type-is": "~1.6.18" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/body-parser/node_modules/http-errors": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", - "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", - "dev": true, - "dependencies": { - "depd": "~1.1.2", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.1" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/body-parser/node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "node_modules/body-parser/node_modules/setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", - "dev": true - }, - "node_modules/body/node_modules/bytes": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-1.0.0.tgz", - "integrity": "sha1-NWnt6Lo0MV+rmcPpLLBMciDeH6g=", - "dev": true - }, - "node_modules/body/node_modules/raw-body": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-1.1.7.tgz", - "integrity": "sha1-HQJ8K/oRasxmI7yo8AAWVyqH1CU=", - "dev": true, - "dependencies": { - "bytes": "1", - "string_decoder": "0.10" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/body/node_modules/string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", - "dev": true - }, - "node_modules/bootstrap-sass": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/bootstrap-sass/-/bootstrap-sass-3.4.1.tgz", - "integrity": "sha512-p5rxsK/IyEDQm2CwiHxxUi0MZZtvVFbhWmyMOt4lLkA4bujDA1TGoKT0i1FKIWiugAdP+kK8T5KMDFIKQCLYIA==" - }, - "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "dependencies": { - "fill-range": "^7.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/brorand": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", - "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", - "dev": true - }, - "node_modules/browser-pack": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/browser-pack/-/browser-pack-6.1.0.tgz", - "integrity": "sha512-erYug8XoqzU3IfcU8fUgyHqyOXqIE4tUTTQ+7mqUjQlvnXkOO6OlT9c/ZoJVHYoAaqGxr09CN53G7XIsO4KtWA==", - "dev": true, - "dependencies": { - "combine-source-map": "~0.8.0", - "defined": "^1.0.0", - "JSONStream": "^1.0.3", - "safe-buffer": "^5.1.1", - "through2": "^2.0.0", - "umd": "^3.0.0" - }, - "bin": { - "browser-pack": "bin/cmd.js" - } - }, - "node_modules/browser-resolve": { - "version": "1.11.3", - "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-1.11.3.tgz", - "integrity": "sha512-exDi1BYWB/6raKHmDTCicQfTkqwN5fioMFV4j8BsfMU4R2DK/QfZfK7kOVkmWCNANf0snkBzqGqAJBao9gZMdQ==", - "dev": true, - "dependencies": { - "resolve": "1.1.7" - } - }, - "node_modules/browser-resolve/node_modules/resolve": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", - "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=", - "dev": true - }, - "node_modules/browserify": { - "version": "16.5.1", - "resolved": "https://registry.npmjs.org/browserify/-/browserify-16.5.1.tgz", - "integrity": "sha512-EQX0h59Pp+0GtSRb5rL6OTfrttlzv+uyaUVlK6GX3w11SQ0jKPKyjC/54RhPR2ib2KmfcELM06e8FxcI5XNU2A==", - "dev": true, - "dependencies": { - "assert": "^1.4.0", - "browser-pack": "^6.0.1", - "browser-resolve": "^1.11.0", - "browserify-zlib": "~0.2.0", - "buffer": "~5.2.1", - "cached-path-relative": "^1.0.0", - "concat-stream": "^1.6.0", - "console-browserify": "^1.1.0", - "constants-browserify": "~1.0.0", - "crypto-browserify": "^3.0.0", - "defined": "^1.0.0", - "deps-sort": "^2.0.0", - "domain-browser": "^1.2.0", - "duplexer2": "~0.1.2", - "events": "^2.0.0", - "glob": "^7.1.0", - "has": "^1.0.0", - "htmlescape": "^1.1.0", - "https-browserify": "^1.0.0", - "inherits": "~2.0.1", - "insert-module-globals": "^7.0.0", - "JSONStream": "^1.0.3", - "labeled-stream-splicer": "^2.0.0", - "mkdirp-classic": "^0.5.2", - "module-deps": "^6.0.0", - "os-browserify": "~0.3.0", - "parents": "^1.0.1", - "path-browserify": "~0.0.0", - "process": "~0.11.0", - "punycode": "^1.3.2", - "querystring-es3": "~0.2.0", - "read-only-stream": "^2.0.0", - "readable-stream": "^2.0.2", - "resolve": "^1.1.4", - "shasum": "^1.0.0", - "shell-quote": "^1.6.1", - "stream-browserify": "^2.0.0", - "stream-http": "^3.0.0", - "string_decoder": "^1.1.1", - "subarg": "^1.0.0", - "syntax-error": "^1.1.1", - "through2": "^2.0.0", - "timers-browserify": "^1.0.1", - "tty-browserify": "0.0.1", - "url": "~0.11.0", - "util": "~0.10.1", - "vm-browserify": "^1.0.0", - "xtend": "^4.0.0" - }, - "bin": { - "browserify": "bin/cmd.js" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/browserify-aes": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", - "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", - "dev": true, - "dependencies": { - "buffer-xor": "^1.0.3", - "cipher-base": "^1.0.0", - "create-hash": "^1.1.0", - "evp_bytestokey": "^1.0.3", - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/browserify-cache-api": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/browserify-cache-api/-/browserify-cache-api-3.0.1.tgz", - "integrity": "sha1-liR+hT8Gj9bg1FzHPwuyzZd47wI=", - "dev": true, - "dependencies": { - "async": "^1.5.2", - "through2": "^2.0.0", - "xtend": "^4.0.0" - } - }, - "node_modules/browserify-cipher": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", - "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", - "dev": true, - "dependencies": { - "browserify-aes": "^1.0.4", - "browserify-des": "^1.0.0", - "evp_bytestokey": "^1.0.0" - } - }, - "node_modules/browserify-des": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", - "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", - "dev": true, - "dependencies": { - "cipher-base": "^1.0.1", - "des.js": "^1.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "node_modules/browserify-incremental": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/browserify-incremental/-/browserify-incremental-3.1.1.tgz", - "integrity": "sha1-BxPLdYckemMqnwjPG9FpuHi2Koo=", - "dev": true, - "dependencies": { - "browserify-cache-api": "^3.0.0", - "JSONStream": "^0.10.0", - "through2": "^2.0.0", - "xtend": "^4.0.0" - }, - "bin": { - "browserifyinc": "bin/cmd.js" - } - }, - "node_modules/browserify-incremental/node_modules/JSONStream": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-0.10.0.tgz", - "integrity": "sha1-dDSdDYlSK3HzDwoD/5vSDKbxKsA=", - "dev": true, - "dependencies": { - "jsonparse": "0.0.5", - "through": ">=2.2.7 <3" - }, - "bin": { - "JSONStream": "index.js" - }, - "engines": { - "node": "*" - } - }, - "node_modules/browserify-rsa": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", - "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", - "dev": true, - "dependencies": { - "bn.js": "^4.1.0", - "randombytes": "^2.0.1" - } - }, - "node_modules/browserify-rsa/node_modules/bn.js": { - "version": "4.11.9", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", - "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", - "dev": true - }, - "node_modules/browserify-sign": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.0.tgz", - "integrity": "sha512-hEZC1KEeYuoHRqhGhTy6gWrpJA3ZDjFWv0DE61643ZnOXAKJb3u7yWcrU0mMc9SwAqK1n7myPGndkp0dFG7NFA==", - "dev": true, - "dependencies": { - "bn.js": "^5.1.1", - "browserify-rsa": "^4.0.1", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "elliptic": "^6.5.2", - "inherits": "^2.0.4", - "parse-asn1": "^5.1.5", - "readable-stream": "^3.6.0", - "safe-buffer": "^5.2.0" - } - }, - "node_modules/browserify-sign/node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "node_modules/browserify-sign/node_modules/readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dev": true, - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/browserify-sign/node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true - }, - "node_modules/browserify-zlib": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", - "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", - "dev": true, - "dependencies": { - "pako": "~1.0.5" - } - }, - "node_modules/buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.2.1.tgz", - "integrity": "sha512-c+Ko0loDaFfuPWiL02ls9Xd3GO3cPVmUobQ6t3rXNUk304u6hGq+8N/kFi+QEIKhzK3uwolVhLzszmfLmMLnqg==", - "dev": true, - "dependencies": { - "base64-js": "^1.0.2", - "ieee754": "^1.1.4" - } - }, - "node_modules/buffer-from": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", - "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", - "dev": true - }, - "node_modules/buffer-xor": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", - "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", - "dev": true - }, - "node_modules/buffer/node_modules/base64-js": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz", - "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==", - "dev": true - }, - "node_modules/builtin-status-codes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", - "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=", - "dev": true - }, - "node_modules/bytes": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.1.tgz", - "integrity": "sha512-dWe4nWO/ruEOY7HkUJ5gFt1DCFV9zPRoJr8pV0/ASQermOZjtq8jMjOprC0Kd10GLN+l7xaUPvxzJFWtxGu8Fg==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/cached-path-relative": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/cached-path-relative/-/cached-path-relative-1.0.2.tgz", - "integrity": "sha512-5r2GqsoEb4qMTTN9J+WzXfjov+hjxT+j3u5K+kIVNIwAd99DLCJE9pBIMP1qVeybV6JiijL385Oz0DcYxfbOIg==", - "dev": true - }, - "node_modules/call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/camel-case": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-3.0.0.tgz", - "integrity": "sha1-yjw2iKTpzzpM2nd9xNy8cTJJz3M=", - "dev": true, - "dependencies": { - "no-case": "^2.2.0", - "upper-case": "^1.1.1" - } - }, - "node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/character-parser": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/character-parser/-/character-parser-2.2.0.tgz", - "integrity": "sha1-x84o821LzZdE5f/CxfzeHHMmH8A=", - "dev": true, - "optional": true, - "dependencies": { - "is-regex": "^1.0.3" - } - }, - "node_modules/chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ], - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/cipher-base": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", - "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", - "dev": true, - "dependencies": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/clean-css": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.3.tgz", - "integrity": "sha512-VcMWDN54ZN/DS+g58HYL5/n4Zrqe8vHJpGA8KdgUXFU4fuP/aHNw8eld9SyEIyabIMJX/0RaY/fplOo5hYLSFA==", - "dev": true, - "dependencies": { - "source-map": "~0.6.0" - }, - "engines": { - "node": ">= 4.0" - } - }, - "node_modules/clean-css/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/clone": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=", - "engines": { - "node": ">=0.8" - } - }, - "node_modules/coffeescript": { - "version": "1.12.7", - "resolved": "https://registry.npmjs.org/coffeescript/-/coffeescript-1.12.7.tgz", - "integrity": "sha512-pLXHFxQMPklVoEekowk8b3erNynC+DVJzChxS/LCBBgR6/8AJkHivkm//zbowcfc7BTCAjryuhx6gPqPRfsFoA==", - "dev": true, - "bin": { - "cake": "bin/cake", - "coffee": "bin/coffee" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true - }, - "node_modules/colors": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz", - "integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM=", - "dev": true, - "engines": { - "node": ">=0.1.90" - } - }, - "node_modules/combine-source-map": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/combine-source-map/-/combine-source-map-0.8.0.tgz", - "integrity": "sha1-pY0N8ELBhvz4IqjoAV9UUNLXmos=", - "dev": true, - "dependencies": { - "convert-source-map": "~1.1.0", - "inline-source-map": "~0.6.0", - "lodash.memoize": "~3.0.3", - "source-map": "~0.5.3" - } - }, - "node_modules/commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" - }, - "node_modules/concat-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", - "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", - "dev": true, - "engines": [ - "node >= 0.8" - ], - "dependencies": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" - } - }, - "node_modules/connect-livereload": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/connect-livereload/-/connect-livereload-0.6.1.tgz", - "integrity": "sha512-3R0kMOdL7CjJpU66fzAkCe6HNtd3AavCS4m+uW4KtJjrdGPT0SQEZieAYd+cm+lJoBznNQ4lqipYWkhBMgk00g==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/connect-modrewrite": { - "version": "0.10.2", - "resolved": "https://registry.npmjs.org/connect-modrewrite/-/connect-modrewrite-0.10.2.tgz", - "integrity": "sha512-37+kS9t26vxjW5ErNrr8d04F7Us1EH7XhHtxSm8yE8kO2uDF2DsPI+qI2wCeBSaoakXKit0/88sg4vL2Wl8tDw==", - "dev": true, - "dependencies": { - "qs": "^6.3.1" - } - }, - "node_modules/connect-timeout": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/connect-timeout/-/connect-timeout-1.9.0.tgz", - "integrity": "sha1-vCcyaxIhA3FL6/oNlYurM/ZSLjo=", - "dev": true, - "dependencies": { - "http-errors": "~1.6.1", - "ms": "2.0.0", - "on-finished": "~2.3.0", - "on-headers": "~1.0.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/console-browserify": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", - "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==", - "dev": true - }, - "node_modules/constantinople": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/constantinople/-/constantinople-4.0.1.tgz", - "integrity": "sha512-vCrqcSIq4//Gx74TXXCGnHpulY1dskqLTFGDmhrGxzeXL8lF8kvXv6mpNWlJj1uD4DW23D4ljAqbY4RRaaUZIw==", - "dev": true, - "optional": true, - "dependencies": { - "@babel/parser": "^7.6.0", - "@babel/types": "^7.6.1" - } - }, - "node_modules/constants-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", - "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=", - "dev": true - }, - "node_modules/content-disposition": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", - "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", - "dev": true, - "dependencies": { - "safe-buffer": "5.2.1" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/content-disposition/node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/content-type": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", - "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/continuable-cache": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/continuable-cache/-/continuable-cache-0.3.1.tgz", - "integrity": "sha1-vXJ6f67XfnH/OYWskzUakSczrQ8=", - "dev": true - }, - "node_modules/convert-source-map": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.1.3.tgz", - "integrity": "sha1-SCnId+n+SbMWHzvzZziI4gRpmGA=", - "dev": true - }, - "node_modules/cookie": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz", - "integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=", - "dev": true - }, - "node_modules/core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "dev": true - }, - "node_modules/create-ecdh": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz", - "integrity": "sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==", - "dev": true, - "dependencies": { - "bn.js": "^4.1.0", - "elliptic": "^6.0.0" - } - }, - "node_modules/create-ecdh/node_modules/bn.js": { - "version": "4.11.9", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", - "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", - "dev": true - }, - "node_modules/create-hash": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", - "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", - "dev": true, - "dependencies": { - "cipher-base": "^1.0.1", - "inherits": "^2.0.1", - "md5.js": "^1.3.4", - "ripemd160": "^2.0.1", - "sha.js": "^2.4.0" - } - }, - "node_modules/create-hmac": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", - "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", - "dev": true, - "dependencies": { - "cipher-base": "^1.0.3", - "create-hash": "^1.1.0", - "inherits": "^2.0.1", - "ripemd160": "^2.0.0", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - } - }, - "node_modules/crypto-browserify": { - "version": "3.12.0", - "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", - "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", - "dev": true, - "dependencies": { - "browserify-cipher": "^1.0.0", - "browserify-sign": "^4.0.0", - "create-ecdh": "^4.0.0", - "create-hash": "^1.1.0", - "create-hmac": "^1.1.0", - "diffie-hellman": "^5.0.0", - "inherits": "^2.0.1", - "pbkdf2": "^3.0.3", - "public-encrypt": "^4.0.0", - "randombytes": "^2.0.0", - "randomfill": "^1.0.3" - }, - "engines": { - "node": "*" - } - }, - "node_modules/cson": { - "version": "7.20.0", - "resolved": "https://registry.npmjs.org/cson/-/cson-7.20.0.tgz", - "integrity": "sha512-K7g/86vC77mJqi6PRFhd3p8U/y0R6SsCeTJb5RpOAaQdApHxCoK5JwfZ8WeJjpOZ6lyyi8tNvh3UuC184H3GWg==", - "dev": true, - "dependencies": { - "cson-parser": "^4.0.5", - "extract-opts": "^4.3.0", - "requirefresh": "^4.12.0", - "safefs": "^6.12.0" - }, - "bin": { - "cson2json": "bin.cjs", - "json2cson": "bin.cjs" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://bevry.me/fund" - } - }, - "node_modules/cson-parser": { - "version": "4.0.9", - "resolved": "https://registry.npmjs.org/cson-parser/-/cson-parser-4.0.9.tgz", - "integrity": "sha512-I79SAcCYquWnEfXYj8hBqOOWKj6eH6zX1hhX3yqmS4K3bYp7jME3UFpHPzu3rUew0oyfc0s8T6IlWGXRAheHag==", - "dev": true, - "dependencies": { - "coffeescript": "1.12.7" - }, - "engines": { - "node": ">=10.13" - } - }, - "node_modules/dash-ast": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/dash-ast/-/dash-ast-1.0.0.tgz", - "integrity": "sha512-Vy4dx7gquTeMcQR/hDkYLGUnwVil6vk4FOOct+djUnHOUWt+zJPJAaRIXaAFkPXtJjvlY7o3rfRu0/3hpnwoUA==", - "dev": true - }, - "node_modules/date-time": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/date-time/-/date-time-1.1.0.tgz", - "integrity": "sha1-GIdtC9pMGf5w3Tv0sDTygbEqQLY=", - "dev": true, - "dependencies": { - "time-zone": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/dateformat": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-3.0.3.tgz", - "integrity": "sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true - }, - "node_modules/defaults": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz", - "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=", - "dependencies": { - "clone": "^1.0.2" - } - }, - "node_modules/define-properties": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", - "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", - "dev": true, - "dependencies": { - "object-keys": "^1.0.12" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/defined": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", - "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=", - "dev": true - }, - "node_modules/depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/deps-sort": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/deps-sort/-/deps-sort-2.0.1.tgz", - "integrity": "sha512-1orqXQr5po+3KI6kQb9A4jnXT1PBwggGl2d7Sq2xsnOeI9GPcE/tGcF9UiSZtZBM7MukY4cAh7MemS6tZYipfw==", - "dev": true, - "dependencies": { - "JSONStream": "^1.0.3", - "shasum-object": "^1.0.0", - "subarg": "^1.0.0", - "through2": "^2.0.0" - }, - "bin": { - "deps-sort": "bin/cmd.js" - } - }, - "node_modules/des.js": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz", - "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==", - "dev": true, - "dependencies": { - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0" - } - }, - "node_modules/destroy": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", - "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=", - "dev": true - }, - "node_modules/detect-file": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", - "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/detective": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/detective/-/detective-5.2.0.tgz", - "integrity": "sha512-6SsIx+nUUbuK0EthKjv0zrdnajCCXVYGmbYYiYjFVpzcjwEs/JMDZ8tPRG29J/HhN56t3GJp2cGSWDRjjot8Pg==", - "dev": true, - "dependencies": { - "acorn-node": "^1.6.1", - "defined": "^1.0.0", - "minimist": "^1.1.1" - }, - "bin": { - "detective": "bin/detective.js" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/diffie-hellman": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", - "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", - "dev": true, - "dependencies": { - "bn.js": "^4.1.0", - "miller-rabin": "^4.0.0", - "randombytes": "^2.0.0" - } - }, - "node_modules/diffie-hellman/node_modules/bn.js": { - "version": "4.11.9", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", - "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", - "dev": true - }, - "node_modules/doctypes": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/doctypes/-/doctypes-1.1.0.tgz", - "integrity": "sha1-6oCxBqh1OHdOijpKWv4pPeSJ4Kk=", - "dev": true, - "optional": true - }, - "node_modules/domain-browser": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", - "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", - "dev": true, - "engines": { - "node": ">=0.4", - "npm": ">=1.2" - } - }, - "node_modules/duplexer2": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", - "integrity": "sha1-ixLauHjA1p4+eJEFFmKjL8a93ME=", - "dev": true, - "dependencies": { - "readable-stream": "^2.0.2" - } - }, - "node_modules/eachr": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/eachr/-/eachr-4.5.0.tgz", - "integrity": "sha512-9I664RWp6p8jvcHZIwo7bWaiSaUmA1wNSLKwNZEiaYjqiTARq3cGjyRiIunsopZv4QMmX3T5Hs17QoPAzdYxfg==", - "dev": true, - "dependencies": { - "typechecker": "^6.2.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://bevry.me/fund" - } - }, - "node_modules/ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", - "dev": true - }, - "node_modules/elliptic": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", - "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", - "dev": true, - "dependencies": { - "bn.js": "^4.11.9", - "brorand": "^1.1.0", - "hash.js": "^1.0.0", - "hmac-drbg": "^1.0.1", - "inherits": "^2.0.4", - "minimalistic-assert": "^1.0.1", - "minimalistic-crypto-utils": "^1.0.1" - } - }, - "node_modules/elliptic/node_modules/bn.js": { - "version": "4.11.9", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", - "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", - "dev": true - }, - "node_modules/elliptic/node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "node_modules/encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/error": { - "version": "7.2.1", - "resolved": "https://registry.npmjs.org/error/-/error-7.2.1.tgz", - "integrity": "sha512-fo9HBvWnx3NGUKMvMwB/CBCMMrfEJgbDTVDEkPygA3Bdd3lM1OyCd+rbQ8BwnpF6GdVeOLDNmyL4N5Bg80ZvdA==", - "dev": true, - "dependencies": { - "string-template": "~0.2.1" - } - }, - "node_modules/es-abstract": { - "version": "1.19.1", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.19.1.tgz", - "integrity": "sha512-2vJ6tjA/UfqLm2MPs7jxVybLoB8i1t1Jd9R3kISld20sIxPcTbLuggQOUxeWeAvIUkduv/CfMjuh4WmiXr2v9w==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "get-intrinsic": "^1.1.1", - "get-symbol-description": "^1.0.0", - "has": "^1.0.3", - "has-symbols": "^1.0.2", - "internal-slot": "^1.0.3", - "is-callable": "^1.2.4", - "is-negative-zero": "^2.0.1", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.1", - "is-string": "^1.0.7", - "is-weakref": "^1.0.1", - "object-inspect": "^1.11.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.2", - "string.prototype.trimend": "^1.0.4", - "string.prototype.trimstart": "^1.0.4", - "unbox-primitive": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "dev": true, - "dependencies": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/es5-shim": { - "version": "4.6.4", - "resolved": "https://registry.npmjs.org/es5-shim/-/es5-shim-4.6.4.tgz", - "integrity": "sha512-Z0f7OUYZ8JfqT12d3Tgh2ErxIH5Shaz97GE8qyDG9quxb2Hmh2vvFHlOFjx6lzyD0CRgvJfnNYcisjdbRp7MPw==", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=", - "dev": true - }, - "node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/escodegen": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.8.1.tgz", - "integrity": "sha1-WltTr0aTEQvrsIZ6o0MN07cKEBg=", - "dev": true, - "dependencies": { - "esprima": "^2.7.1", - "estraverse": "^1.9.1", - "esutils": "^2.0.2", - "optionator": "^0.8.1" - }, - "bin": { - "escodegen": "bin/escodegen.js", - "esgenerate": "bin/esgenerate.js" - }, - "engines": { - "node": ">=0.12.0" - }, - "optionalDependencies": { - "source-map": "~0.2.0" - } - }, - "node_modules/escodegen/node_modules/source-map": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.2.0.tgz", - "integrity": "sha1-2rc/vPwrqBm03gO9b26qSBZLP50=", - "dev": true, - "optional": true, - "dependencies": { - "amdefine": ">=0.0.4" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/esprima": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", - "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=", - "dev": true, - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/estraverse": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-1.9.3.tgz", - "integrity": "sha1-r2fy3JIlgkFZUJJgkaQAXSnJu0Q=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/eventemitter2": { - "version": "0.4.14", - "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-0.4.14.tgz", - "integrity": "sha1-j2G3XN4BKy6esoTUVFWDtWQ7Yas=", - "dev": true - }, - "node_modules/events": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/events/-/events-2.1.0.tgz", - "integrity": "sha512-3Zmiobend8P9DjmKAty0Era4jV8oJ0yGYe2nJJAxgymF9+N8F2m0hhZiMoWtcfepExzNKZumFU3ksdQbInGWCg==", - "dev": true, - "engines": { - "node": ">=0.4.x" - } - }, - "node_modules/evp_bytestokey": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", - "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", - "dev": true, - "dependencies": { - "md5.js": "^1.3.4", - "safe-buffer": "^5.1.1" - } - }, - "node_modules/exit": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", - "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", - "dev": true, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/expand-tilde": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", - "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", - "dev": true, - "dependencies": { - "homedir-polyfill": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/express": { - "version": "4.17.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.17.2.tgz", - "integrity": "sha512-oxlxJxcQlYwqPWKVJJtvQiwHgosH/LrLSPA+H4UxpyvSS6jC5aH+5MoHFM+KABgTOt0APue4w66Ha8jCUo9QGg==", - "dev": true, - "dependencies": { - "accepts": "~1.3.7", - "array-flatten": "1.1.1", - "body-parser": "1.19.1", - "content-disposition": "0.5.4", - "content-type": "~1.0.4", - "cookie": "0.4.1", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "~1.1.2", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "~1.1.2", - "fresh": "0.5.2", - "merge-descriptors": "1.0.1", - "methods": "~1.1.2", - "on-finished": "~2.3.0", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.7", - "qs": "6.9.6", - "range-parser": "~1.2.1", - "safe-buffer": "5.2.1", - "send": "0.17.2", - "serve-static": "1.14.2", - "setprototypeof": "1.2.0", - "statuses": "~1.5.0", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - }, - "engines": { - "node": ">= 0.10.0" - } - }, - "node_modules/express/node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/express/node_modules/setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", - "dev": true - }, - "node_modules/extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - "dev": true - }, - "node_modules/extract-opts": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/extract-opts/-/extract-opts-4.3.0.tgz", - "integrity": "sha512-Dmssi1tgKJkQsVmbP7TgW/kbdc42SAsNf6h9ClweP+dS7O24YYMTXsNwPelxhx0LF15npiWwY5ahKtyQiNgxWA==", - "dev": true, - "dependencies": { - "eachr": "^4.5.0", - "typechecker": "^6.2.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://bevry.me/fund" - } - }, - "node_modules/fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", - "dev": true - }, - "node_modules/fast-safe-stringify": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.0.7.tgz", - "integrity": "sha512-Utm6CdzT+6xsDk2m8S6uL8VHxNwI6Jub+e9NYTcAms28T84pTa25GJQV9j0CY0N1rM8hK4x6grpF2BQf+2qwVA==", - "dev": true - }, - "node_modules/faye-websocket": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.10.0.tgz", - "integrity": "sha1-TkkvjQTftviQA1B/btvy1QHnxvQ=", - "dev": true, - "dependencies": { - "websocket-driver": ">=0.5.1" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/figures": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", - "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", - "dev": true, - "dependencies": { - "escape-string-regexp": "^1.0.5", - "object-assign": "^4.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/file-exist": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/file-exist/-/file-exist-0.0.4.tgz", - "integrity": "sha1-bPDldLw9us20vAaLzGncblr8Bck=", - "dependencies": { - "commander": "^2.8.1" - }, - "bin": { - "exists": "bin/exists" - } - }, - "node_modules/file-sync-cmp": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/file-sync-cmp/-/file-sync-cmp-0.1.1.tgz", - "integrity": "sha1-peeo/7+kk7Q7kju9TKiaU7Y7YSs=", - "dev": true - }, - "node_modules/files-exist": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/files-exist/-/files-exist-1.1.0.tgz", - "integrity": "sha512-FG9ZrkR5Ek6s+2MHe5ljMwEz2/gWOTNIh+qboHFgc49DZJIOZMwJVwMvH/Sn0ifHELrAKPy7bvKfHOL8ZcmDmQ==", - "dependencies": { - "defaults": "^1.0.3", - "glob": "^6.0.2" - } - }, - "node_modules/files-exist/node_modules/glob": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/glob/-/glob-6.0.4.tgz", - "integrity": "sha1-DwiGD2oVUSey+t1PnOJLGqtuTSI=", - "dependencies": { - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "2 || 3", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - } - }, - "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/finalhandler": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", - "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", - "dev": true, - "dependencies": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "~2.3.0", - "parseurl": "~1.3.3", - "statuses": "~1.5.0", - "unpipe": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/findup-sync": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-0.3.0.tgz", - "integrity": "sha1-N5MKpdgWt3fANEXhlmzGeQpMCxY=", - "dev": true, - "dependencies": { - "glob": "~5.0.0" - }, - "engines": { - "node": ">= 0.6.0" - } - }, - "node_modules/findup-sync/node_modules/glob": { - "version": "5.0.15", - "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", - "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", - "dev": true, - "dependencies": { - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "2 || 3", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - } - }, - "node_modules/fined": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/fined/-/fined-1.2.0.tgz", - "integrity": "sha512-ZYDqPLGxDkDhDZBjZBb+oD1+j0rA4E0pXY50eplAAOPg2N/gUBSSk5IM1/QhPfyVo19lJ+CvXpqfvk+b2p/8Ng==", - "dev": true, - "dependencies": { - "expand-tilde": "^2.0.2", - "is-plain-object": "^2.0.3", - "object.defaults": "^1.1.0", - "object.pick": "^1.2.0", - "parse-filepath": "^1.0.1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/flagged-respawn": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/flagged-respawn/-/flagged-respawn-1.0.1.tgz", - "integrity": "sha512-lNaHNVymajmk0OJMBn8fVUAU1BtDeKIqKoVhk4xAALB57aALg6b4W0MfJ/cUE0g9YBXy5XhSlPIpYIJ7HaY/3Q==", - "dev": true, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/flot": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/flot/-/flot-2.3.2.tgz", - "integrity": "sha512-zvLb5jXOFMbKdbeACyh8P6zjqIsUQ336QBqjAnd5QTuYNPSPuGTzTdL2beGe7TmZ3z8k7W1fatO01jLbS1NO3g==", - "dependencies": { - "file-exist": "0.0.4", - "files-exist": "^1.1.0" - } - }, - "node_modules/font-awesome": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/font-awesome/-/font-awesome-4.7.0.tgz", - "integrity": "sha1-j6jPBBGhoxr9B7BtKQK7n8gVoTM=", - "engines": { - "node": ">=0.10.3" - } - }, - "node_modules/for-in": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/for-own": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", - "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=", - "dev": true, - "dependencies": { - "for-in": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/foreach": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz", - "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=", - "dev": true - }, - "node_modules/forwarded": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true - }, - "node_modules/fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true - }, - "node_modules/gaze": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/gaze/-/gaze-1.1.3.tgz", - "integrity": "sha512-BRdNm8hbWzFzWHERTrejLqwHDfS4GibPoq5wjTPIoJHoBtKGPg3xAFfxmM+9ztbXelxcf2hwQcaz1PtmFeue8g==", - "dev": true, - "dependencies": { - "globule": "^1.0.0" - }, - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/get-assigned-identifiers": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/get-assigned-identifiers/-/get-assigned-identifiers-1.2.0.tgz", - "integrity": "sha512-mBBwmeGTrxEMO4pMaaf/uUEFHnYtwr8FTe8Y/mer4rcV/bye0qGm6pw1bGZFGStxC5O76c5ZAVBGnqHmOaJpdQ==", - "dev": true - }, - "node_modules/get-intrinsic": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", - "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-symbol-description": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", - "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/getobject": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/getobject/-/getobject-1.0.2.tgz", - "integrity": "sha512-2zblDBaFcb3rB4rF77XVnuINOE2h2k/OnqXAiy0IrTxUfV1iFp3la33oAQVY9pCpWU268WFYVt2t71hlMuLsOg==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/glob": { - "version": "7.1.7", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", - "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/global-modules": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", - "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", - "dev": true, - "dependencies": { - "global-prefix": "^1.0.1", - "is-windows": "^1.0.1", - "resolve-dir": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/global-prefix": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", - "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=", - "dev": true, - "dependencies": { - "expand-tilde": "^2.0.2", - "homedir-polyfill": "^1.0.1", - "ini": "^1.3.4", - "is-windows": "^1.0.1", - "which": "^1.2.14" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/global-prefix/node_modules/which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "which": "bin/which" - } - }, - "node_modules/globule": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/globule/-/globule-1.3.0.tgz", - "integrity": "sha512-YlD4kdMqRCQHrhVdonet4TdRtv1/sZKepvoxNT4Nrhrp5HI8XFfc8kFlGlBn2myBo80aGp8Eft259mbcUJhgSg==", - "dev": true, - "dependencies": { - "glob": "~7.1.1", - "lodash": "~4.17.10", - "minimatch": "~3.0.2" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.9", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.9.tgz", - "integrity": "sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ==", - "dev": true - }, - "node_modules/grunt": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/grunt/-/grunt-1.4.1.tgz", - "integrity": "sha512-ZXIYXTsAVrA7sM+jZxjQdrBOAg7DyMUplOMhTaspMRExei+fD0BTwdWXnn0W5SXqhb/Q/nlkzXclSi3IH55PIA==", - "dev": true, - "dependencies": { - "dateformat": "~3.0.3", - "eventemitter2": "~0.4.13", - "exit": "~0.1.2", - "findup-sync": "~0.3.0", - "glob": "~7.1.6", - "grunt-cli": "~1.4.2", - "grunt-known-options": "~2.0.0", - "grunt-legacy-log": "~3.0.0", - "grunt-legacy-util": "~2.0.1", - "iconv-lite": "~0.4.13", - "js-yaml": "~3.14.0", - "minimatch": "~3.0.4", - "mkdirp": "~1.0.4", - "nopt": "~3.0.6", - "rimraf": "~3.0.2" - }, - "bin": { - "grunt": "bin/grunt" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/grunt-browserify": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/grunt-browserify/-/grunt-browserify-6.0.0.tgz", - "integrity": "sha512-m130pTVFEsxQZ+dJQd287TrnUI5VvEKJ+MmPjMF/7bVJBTBRWhJlYVFgBOYLZMUykfk1RWXfQ2sAQu5NuXumvg==", - "dev": true, - "dependencies": { - "async": "^2.5.0", - "browserify": "^17.0.0", - "browserify-incremental": "^3.1.1", - "glob": "^7.1.2", - "lodash": "^4.17.4", - "resolve": "^1.1.6", - "watchify": "^4.0.0" - }, - "engines": { - "node": ">= 8.10.x" - } - }, - "node_modules/grunt-browserify/node_modules/async": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", - "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", - "dev": true, - "dependencies": { - "lodash": "^4.17.14" - } - }, - "node_modules/grunt-browserify/node_modules/browser-resolve": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-2.0.0.tgz", - "integrity": "sha512-7sWsQlYL2rGLy2IWm8WL8DCTJvYLc/qlOnsakDac87SOoCd16WLsaAMdCiAqsTNHIe+SXfaqyxyo6THoWqs8WQ==", - "dev": true, - "dependencies": { - "resolve": "^1.17.0" - } - }, - "node_modules/grunt-browserify/node_modules/browserify": { - "version": "17.0.0", - "resolved": "https://registry.npmjs.org/browserify/-/browserify-17.0.0.tgz", - "integrity": "sha512-SaHqzhku9v/j6XsQMRxPyBrSP3gnwmE27gLJYZgMT2GeK3J0+0toN+MnuNYDfHwVGQfLiMZ7KSNSIXHemy905w==", - "dev": true, - "dependencies": { - "assert": "^1.4.0", - "browser-pack": "^6.0.1", - "browser-resolve": "^2.0.0", - "browserify-zlib": "~0.2.0", - "buffer": "~5.2.1", - "cached-path-relative": "^1.0.0", - "concat-stream": "^1.6.0", - "console-browserify": "^1.1.0", - "constants-browserify": "~1.0.0", - "crypto-browserify": "^3.0.0", - "defined": "^1.0.0", - "deps-sort": "^2.0.1", - "domain-browser": "^1.2.0", - "duplexer2": "~0.1.2", - "events": "^3.0.0", - "glob": "^7.1.0", - "has": "^1.0.0", - "htmlescape": "^1.1.0", - "https-browserify": "^1.0.0", - "inherits": "~2.0.1", - "insert-module-globals": "^7.2.1", - "JSONStream": "^1.0.3", - "labeled-stream-splicer": "^2.0.0", - "mkdirp-classic": "^0.5.2", - "module-deps": "^6.2.3", - "os-browserify": "~0.3.0", - "parents": "^1.0.1", - "path-browserify": "^1.0.0", - "process": "~0.11.0", - "punycode": "^1.3.2", - "querystring-es3": "~0.2.0", - "read-only-stream": "^2.0.0", - "readable-stream": "^2.0.2", - "resolve": "^1.1.4", - "shasum-object": "^1.0.0", - "shell-quote": "^1.6.1", - "stream-browserify": "^3.0.0", - "stream-http": "^3.0.0", - "string_decoder": "^1.1.1", - "subarg": "^1.0.0", - "syntax-error": "^1.1.1", - "through2": "^2.0.0", - "timers-browserify": "^1.0.1", - "tty-browserify": "0.0.1", - "url": "~0.11.0", - "util": "~0.12.0", - "vm-browserify": "^1.0.0", - "xtend": "^4.0.0" - }, - "bin": { - "browserify": "bin/cmd.js" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/grunt-browserify/node_modules/events": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", - "dev": true, - "engines": { - "node": ">=0.8.x" - } - }, - "node_modules/grunt-browserify/node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "node_modules/grunt-browserify/node_modules/path-browserify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", - "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", - "dev": true - }, - "node_modules/grunt-browserify/node_modules/stream-browserify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-3.0.0.tgz", - "integrity": "sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA==", - "dev": true, - "dependencies": { - "inherits": "~2.0.4", - "readable-stream": "^3.5.0" - } - }, - "node_modules/grunt-browserify/node_modules/stream-browserify/node_modules/readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dev": true, - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/grunt-browserify/node_modules/util": { - "version": "0.12.4", - "resolved": "https://registry.npmjs.org/util/-/util-0.12.4.tgz", - "integrity": "sha512-bxZ9qtSlGUWSOy9Qa9Xgk11kSslpuZwaxCg4sNIDj6FLucDab2JxnHwyNTCpHMtK1MjoQiWQ6DiUMZYbSrO+Sw==", - "dev": true, - "dependencies": { - "inherits": "^2.0.3", - "is-arguments": "^1.0.4", - "is-generator-function": "^1.0.7", - "is-typed-array": "^1.1.3", - "safe-buffer": "^5.1.2", - "which-typed-array": "^1.1.2" - } - }, - "node_modules/grunt-cli": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/grunt-cli/-/grunt-cli-1.4.3.tgz", - "integrity": "sha512-9Dtx/AhVeB4LYzsViCjUQkd0Kw0McN2gYpdmGYKtE2a5Yt7v1Q+HYZVWhqXc/kGnxlMtqKDxSwotiGeFmkrCoQ==", - "dev": true, - "dependencies": { - "grunt-known-options": "~2.0.0", - "interpret": "~1.1.0", - "liftup": "~3.0.1", - "nopt": "~4.0.1", - "v8flags": "~3.2.0" - }, - "bin": { - "grunt": "bin/grunt" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/grunt-cli/node_modules/nopt": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.3.tgz", - "integrity": "sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg==", - "dev": true, - "dependencies": { - "abbrev": "1", - "osenv": "^0.1.4" - }, - "bin": { - "nopt": "bin/nopt.js" - } - }, - "node_modules/grunt-contrib-clean": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/grunt-contrib-clean/-/grunt-contrib-clean-2.0.0.tgz", - "integrity": "sha512-g5ZD3ORk6gMa5ugZosLDQl3dZO7cI3R14U75hTM+dVLVxdMNJCPVmwf9OUt4v4eWgpKKWWoVK9DZc1amJp4nQw==", - "dev": true, - "dependencies": { - "async": "^2.6.1", - "rimraf": "^2.6.2" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/grunt-contrib-clean/node_modules/async": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", - "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", - "dev": true, - "dependencies": { - "lodash": "^4.17.14" - } - }, - "node_modules/grunt-contrib-copy": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/grunt-contrib-copy/-/grunt-contrib-copy-1.0.0.tgz", - "integrity": "sha1-cGDGWB6QS4qw0A8HbgqPbj58NXM=", - "dev": true, - "dependencies": { - "chalk": "^1.1.1", - "file-sync-cmp": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/grunt-contrib-copy/node_modules/ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/grunt-contrib-copy/node_modules/chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "dependencies": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/grunt-contrib-copy/node_modules/supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/grunt-contrib-watch": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/grunt-contrib-watch/-/grunt-contrib-watch-1.1.0.tgz", - "integrity": "sha512-yGweN+0DW5yM+oo58fRu/XIRrPcn3r4tQx+nL7eMRwjpvk+rQY6R8o94BPK0i2UhTg9FN21hS+m8vR8v9vXfeg==", - "dev": true, - "dependencies": { - "async": "^2.6.0", - "gaze": "^1.1.0", - "lodash": "^4.17.10", - "tiny-lr": "^1.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/grunt-contrib-watch/node_modules/async": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", - "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", - "dev": true, - "dependencies": { - "lodash": "^4.17.14" - } - }, - "node_modules/grunt-dart-sass": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/grunt-dart-sass/-/grunt-dart-sass-2.0.1.tgz", - "integrity": "sha512-LLJDRbbVQZ+B6mXndIxtGWJ4qUDKqvnuipJx1iJbQ0V24OZYBLX/X/8NYp+UhZE2zSyc43n1pQmG0Ey+w1HQQw==", - "dev": true, - "dependencies": { - "chalk": "^2.4.1", - "intercept-stdout": "^0.1.2", - "path": "^0.12.7" - }, - "peerDependencies": { - "sass": "^1.32.8" - } - }, - "node_modules/grunt-express-server": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/grunt-express-server/-/grunt-express-server-0.5.4.tgz", - "integrity": "sha512-Q9sTDOwxC46uviL1/LSXFflTMv+/WnwANtzxD7hwnEXaej79LS1AUZlWc/O5P+CWjKG69/1xJFn+CVP94fOQ6Q==", - "dev": true, - "engines": { - "node": ">= 0.10.0" - } - }, - "node_modules/grunt-html2js": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/grunt-html2js/-/grunt-html2js-0.8.0.tgz", - "integrity": "sha512-9r1WGYH2wsoKgp49HRxhwH75LmtXAPYw1ZAE/+9+jF1sazvORhgaFIFs07U1vTsdCZeU+M93iFNRfLBEbcoPiw==", - "dev": true, - "dependencies": { - "chokidar": "^3", - "grunt-cli": "^1.3.2", - "html-minifier": "^4", - "istanbul": "^0.4.5" - }, - "engines": { - "node": ">= 0.8.0" - }, - "optionalDependencies": { - "pug": "^3" - }, - "peerDependencies": { - "grunt": ">=0.4.0" - } - }, - "node_modules/grunt-install-dependencies": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/grunt-install-dependencies/-/grunt-install-dependencies-0.2.0.tgz", - "integrity": "sha1-/ssvIUvpYW/Zgc3YaAbBZiIGEks=", - "dev": true, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/grunt-known-options": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/grunt-known-options/-/grunt-known-options-2.0.0.tgz", - "integrity": "sha512-GD7cTz0I4SAede1/+pAbmJRG44zFLPipVtdL9o3vqx9IEyb7b4/Y3s7r6ofI3CchR5GvYJ+8buCSioDv5dQLiA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/grunt-legacy-log": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/grunt-legacy-log/-/grunt-legacy-log-3.0.0.tgz", - "integrity": "sha512-GHZQzZmhyq0u3hr7aHW4qUH0xDzwp2YXldLPZTCjlOeGscAOWWPftZG3XioW8MasGp+OBRIu39LFx14SLjXRcA==", - "dev": true, - "dependencies": { - "colors": "~1.1.2", - "grunt-legacy-log-utils": "~2.1.0", - "hooker": "~0.2.3", - "lodash": "~4.17.19" - }, - "engines": { - "node": ">= 0.10.0" - } - }, - "node_modules/grunt-legacy-log-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/grunt-legacy-log-utils/-/grunt-legacy-log-utils-2.1.0.tgz", - "integrity": "sha512-lwquaPXJtKQk0rUM1IQAop5noEpwFqOXasVoedLeNzaibf/OPWjKYvvdqnEHNmU+0T0CaReAXIbGo747ZD+Aaw==", - "dev": true, - "dependencies": { - "chalk": "~4.1.0", - "lodash": "~4.17.19" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/grunt-legacy-log-utils/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/grunt-legacy-log-utils/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/grunt-legacy-log-utils/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/grunt-legacy-log-utils/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/grunt-legacy-log-utils/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/grunt-legacy-log-utils/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/grunt-legacy-util": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/grunt-legacy-util/-/grunt-legacy-util-2.0.1.tgz", - "integrity": "sha512-2bQiD4fzXqX8rhNdXkAywCadeqiPiay0oQny77wA2F3WF4grPJXCvAcyoWUJV+po/b15glGkxuSiQCK299UC2w==", - "dev": true, - "dependencies": { - "async": "~3.2.0", - "exit": "~0.1.2", - "getobject": "~1.0.0", - "hooker": "~0.2.3", - "lodash": "~4.17.21", - "underscore.string": "~3.3.5", - "which": "~2.0.2" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/grunt-legacy-util/node_modules/async": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.3.tgz", - "integrity": "sha512-spZRyzKL5l5BZQrr/6m/SqFdBN0q3OCI0f9rjfBzCMBIP4p75P620rR3gTmaksNOhmzgdxcaxdNfMy6anrbM0g==", - "dev": true - }, - "node_modules/grunt-string-replace": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/grunt-string-replace/-/grunt-string-replace-1.3.1.tgz", - "integrity": "sha1-YzoDvHhIKg4OH5339kWBH8H7sWI=", - "dev": true, - "dependencies": { - "async": "^2.0.0", - "chalk": "^1.0.0" - }, - "bin": { - "grunt-string-replace": "bin/grunt-string-replace" - }, - "engines": { - "node": ">= 0.10.0", - "npm": ">= 1.4.15" - } - }, - "node_modules/grunt-string-replace/node_modules/ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/grunt-string-replace/node_modules/async": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", - "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", - "dev": true, - "dependencies": { - "lodash": "^4.17.14" - } - }, - "node_modules/grunt-string-replace/node_modules/chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "dependencies": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/grunt-string-replace/node_modules/supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/grunt/node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/handlebars": { - "version": "4.7.7", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.7.tgz", - "integrity": "sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA==", - "dev": true, - "dependencies": { - "minimist": "^1.2.5", - "neo-async": "^2.6.0", - "source-map": "^0.6.1", - "wordwrap": "^1.0.0" - }, - "bin": { - "handlebars": "bin/handlebars" - }, - "engines": { - "node": ">=0.4.7" - }, - "optionalDependencies": { - "uglify-js": "^3.1.4" - } - }, - "node_modules/handlebars/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/handlebars/node_modules/wordwrap": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", - "dev": true - }, - "node_modules/has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.1" - }, - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/has-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", - "dev": true, - "dependencies": { - "ansi-regex": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/has-bigints": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz", - "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/has-symbols": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", - "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-tostringtag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", - "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", - "dev": true, - "dependencies": { - "has-symbols": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/hash-base": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", - "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", - "dev": true, - "dependencies": { - "inherits": "^2.0.4", - "readable-stream": "^3.6.0", - "safe-buffer": "^5.2.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/hash-base/node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "node_modules/hash-base/node_modules/readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dev": true, - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/hash-base/node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true - }, - "node_modules/hash.js": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", - "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", - "dev": true, - "dependencies": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.1" - } - }, - "node_modules/he": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", - "dev": true, - "bin": { - "he": "bin/he" - } - }, - "node_modules/hmac-drbg": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", - "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", - "dev": true, - "dependencies": { - "hash.js": "^1.0.3", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.1" - } - }, - "node_modules/homedir-polyfill": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", - "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", - "dev": true, - "dependencies": { - "parse-passwd": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/hooker": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/hooker/-/hooker-0.2.3.tgz", - "integrity": "sha1-uDT3I8xKJCqmWWNFnfbZhMXT2Vk=", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/html-minifier": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/html-minifier/-/html-minifier-4.0.0.tgz", - "integrity": "sha512-aoGxanpFPLg7MkIl/DDFYtb0iWz7jMFGqFhvEDZga6/4QTjneiD8I/NXL1x5aaoCp7FSIT6h/OhykDdPsbtMig==", - "dev": true, - "dependencies": { - "camel-case": "^3.0.0", - "clean-css": "^4.2.1", - "commander": "^2.19.0", - "he": "^1.2.0", - "param-case": "^2.1.1", - "relateurl": "^0.2.7", - "uglify-js": "^3.5.1" - }, - "bin": { - "html-minifier": "cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/htmlescape": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/htmlescape/-/htmlescape-1.1.1.tgz", - "integrity": "sha1-OgPtwiFLyjtmQko+eVk0lQnLA1E=", - "dev": true, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/http-errors": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", - "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", - "dev": true, - "dependencies": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.0", - "statuses": ">= 1.4.0 < 2" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/http-parser-js": { - "version": "0.4.10", - "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.4.10.tgz", - "integrity": "sha1-ksnBN0w1CF912zWexWzCV8u5P6Q=", - "dev": true - }, - "node_modules/https-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", - "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=", - "dev": true - }, - "node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ieee754": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", - "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==", - "dev": true - }, - "node_modules/immutable": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.0.0.tgz", - "integrity": "sha512-zIE9hX70qew5qTUjSS7wi1iwj/l7+m54KWU247nhM3v806UdGj1yDndXj+IOYxxtW9zyLI+xqFNZjTuDaLUqFw==", - "dev": true - }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" - }, - "node_modules/ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "dev": true - }, - "node_modules/inline-source-map": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/inline-source-map/-/inline-source-map-0.6.2.tgz", - "integrity": "sha1-+Tk0ccGKedFyT4Y/o4tYY3Ct4qU=", - "dev": true, - "dependencies": { - "source-map": "~0.5.3" - } - }, - "node_modules/insert-module-globals": { - "version": "7.2.1", - "resolved": "https://registry.npmjs.org/insert-module-globals/-/insert-module-globals-7.2.1.tgz", - "integrity": "sha512-ufS5Qq9RZN+Bu899eA9QCAYThY+gGW7oRkmb0vC93Vlyu/CFGcH0OYPEjVkDXA5FEbTt1+VWzdoOD3Ny9N+8tg==", - "dev": true, - "dependencies": { - "acorn-node": "^1.5.2", - "combine-source-map": "^0.8.0", - "concat-stream": "^1.6.1", - "is-buffer": "^1.1.0", - "JSONStream": "^1.0.3", - "path-is-absolute": "^1.0.1", - "process": "~0.11.0", - "through2": "^2.0.0", - "undeclared-identifiers": "^1.1.2", - "xtend": "^4.0.0" - }, - "bin": { - "insert-module-globals": "bin/cmd.js" - } - }, - "node_modules/intercept-stdout": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/intercept-stdout/-/intercept-stdout-0.1.2.tgz", - "integrity": "sha1-Emq/H65sUJpCipjGGmMVWQQq6f0=", - "dev": true, - "dependencies": { - "lodash.toarray": "^3.0.0" - } - }, - "node_modules/internal-slot": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", - "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==", - "dev": true, - "dependencies": { - "get-intrinsic": "^1.1.0", - "has": "^1.0.3", - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/interpret": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.1.0.tgz", - "integrity": "sha1-ftGxQQxqDg94z5XTuEQMY/eLhhQ=", - "dev": true - }, - "node_modules/ipaddr.js": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", - "dev": true, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/is-absolute": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz", - "integrity": "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==", - "dev": true, - "dependencies": { - "is-relative": "^1.0.0", - "is-windows": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-arguments": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", - "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-bigint": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", - "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", - "dev": true, - "dependencies": { - "has-bigints": "^1.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-boolean-object": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", - "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, - "node_modules/is-callable": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz", - "integrity": "sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-core-module": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.1.tgz", - "integrity": "sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA==", - "dev": true, - "dependencies": { - "has": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-date-object": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", - "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", - "dev": true, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-expression": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-expression/-/is-expression-4.0.0.tgz", - "integrity": "sha512-zMIXX63sxzG3XrkHkrAPvm/OVZVSCPNkwMHU8oTX7/U3AL78I0QXCEICXUM13BIa8TYGZ68PiTKfQz3yaTNr4A==", - "dev": true, - "optional": true, - "dependencies": { - "acorn": "^7.1.1", - "object-assign": "^4.1.1" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-finite": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", - "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", - "dev": true, - "dependencies": { - "number-is-nan": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-generator-function": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", - "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", - "dev": true, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-glob": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", - "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", - "dev": true, - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-negative-zero": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", - "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-number-object": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.6.tgz", - "integrity": "sha512-bEVOqiRcvo3zO1+G2lVMy+gkkEm9Yh7cDMRusKKu5ZJKPUYSJwICTKZrNKHA2EbSP0Tu0+6B/emsYNHZyn6K8g==", - "dev": true, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "dev": true, - "dependencies": { - "isobject": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-promise": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz", - "integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==", - "dev": true, - "optional": true - }, - "node_modules/is-regex": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", - "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-relative": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz", - "integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==", - "dev": true, - "dependencies": { - "is-unc-path": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-shared-array-buffer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.1.tgz", - "integrity": "sha512-IU0NmyknYZN0rChcKhRO1X8LYz5Isj/Fsqh8NJOSf+N/hCOTwy29F32Ik7a+QszE63IdvmwdTPDd6cZ5pg4cwA==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-string": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", - "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", - "dev": true, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-symbol": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", - "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", - "dev": true, - "dependencies": { - "has-symbols": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-typed-array": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.8.tgz", - "integrity": "sha512-HqH41TNZq2fgtGT8WHVFVJhBVGuY3AnP3Q36K8JKXUxSxRgk/d+7NjmwG2vo2mYmXK8UYZKu0qH8bVP5gEisjA==", - "dev": true, - "dependencies": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "es-abstract": "^1.18.5", - "foreach": "^2.0.5", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-unc-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz", - "integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==", - "dev": true, - "dependencies": { - "unc-path-regex": "^0.1.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-weakref": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", - "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-windows": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true - }, - "node_modules/isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/istanbul": { - "version": "0.4.5", - "resolved": "https://registry.npmjs.org/istanbul/-/istanbul-0.4.5.tgz", - "integrity": "sha1-ZcfXPUxNqE1POsMQuRj7C4Azczs=", - "deprecated": "This module is no longer maintained, try this instead:\n npm i nyc\nVisit https://istanbul.js.org/integrations for other alternatives.", - "dev": true, - "dependencies": { - "abbrev": "1.0.x", - "async": "1.x", - "escodegen": "1.8.x", - "esprima": "2.7.x", - "glob": "^5.0.15", - "handlebars": "^4.0.1", - "js-yaml": "3.x", - "mkdirp": "0.5.x", - "nopt": "3.x", - "once": "1.x", - "resolve": "1.1.x", - "supports-color": "^3.1.0", - "which": "^1.1.1", - "wordwrap": "^1.0.0" - }, - "bin": { - "istanbul": "lib/cli.js" - } - }, - "node_modules/istanbul/node_modules/glob": { - "version": "5.0.15", - "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", - "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", - "dev": true, - "dependencies": { - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "2 || 3", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - } - }, - "node_modules/istanbul/node_modules/has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/istanbul/node_modules/mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "dev": true, - "dependencies": { - "minimist": "^1.2.5" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } - }, - "node_modules/istanbul/node_modules/resolve": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", - "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=", - "dev": true - }, - "node_modules/istanbul/node_modules/supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "dev": true, - "dependencies": { - "has-flag": "^1.0.0" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/istanbul/node_modules/which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "which": "bin/which" - } - }, - "node_modules/istanbul/node_modules/wordwrap": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", - "dev": true - }, - "node_modules/jit-grunt": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/jit-grunt/-/jit-grunt-0.10.0.tgz", - "integrity": "sha1-AIw6f+Hpa9DYTiYOofoXg0V/ecI=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/jquery": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.6.0.tgz", - "integrity": "sha512-JVzAR/AjBvVt2BmYhxRCSYysDsPcssdmTFnzyLEts9qNwmjmu4JTAMYubEfwVOSwpQ1I1sKKFcxhZCI2buerfw==" - }, - "node_modules/jquery.flot.tooltip": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/jquery.flot.tooltip/-/jquery.flot.tooltip-0.9.0.tgz", - "integrity": "sha1-rha/lLJsLtmrTbFnu6Ut/bYVwd8=" - }, - "node_modules/js-stringify": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/js-stringify/-/js-stringify-1.0.2.tgz", - "integrity": "sha1-Fzb939lyTyijaCrcYjCufk6Weds=", - "dev": true, - "optional": true - }, - "node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/js-yaml-js-types": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/js-yaml-js-types/-/js-yaml-js-types-1.0.0.tgz", - "integrity": "sha512-UNjPwuoaj4mcHkJCJSF6l4MgkzoFjG+JJkBXMYNvjgO3yE9gTeRt+E6PN022vduz/daZZ7HmlEiSEE36NrGE4w==", - "dev": true, - "dependencies": { - "esprima": "^4.0.1" - } - }, - "node_modules/js-yaml-js-types/node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true, - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/js-yaml/node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true, - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/json-stable-stringify": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-0.0.1.tgz", - "integrity": "sha1-YRwj6BTbN1Un34URk9tZ3Sryf0U=", - "dev": true, - "dependencies": { - "jsonify": "~0.0.0" - } - }, - "node_modules/json3": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.3.tgz", - "integrity": "sha512-c7/8mbUsKigAbLkD5B010BK4D9LZm7A1pNItkEwiUZRpIN66exu/e7YQWysGun+TRKaJp8MhemM+VkfWv42aCA==" - }, - "node_modules/jsonify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", - "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", - "dev": true - }, - "node_modules/jsonparse": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-0.0.5.tgz", - "integrity": "sha1-MwVCrT8KZUZlt3jz6y2an6UHrGQ=", - "dev": true, - "engines": [ - "node >= 0.2.0" - ] - }, - "node_modules/JSONStream": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", - "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", - "dev": true, - "dependencies": { - "jsonparse": "^1.2.0", - "through": ">=2.2.7 <3" - }, - "bin": { - "JSONStream": "bin.js" - }, - "engines": { - "node": "*" - } - }, - "node_modules/JSONStream/node_modules/jsonparse": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", - "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=", - "dev": true, - "engines": [ - "node >= 0.2.0" - ] - }, - "node_modules/jstransformer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/jstransformer/-/jstransformer-1.0.0.tgz", - "integrity": "sha1-7Yvwkh4vPx7U1cGkT2hwntJHIsM=", - "dev": true, - "optional": true, - "dependencies": { - "is-promise": "^2.0.0", - "promise": "^7.0.1" - } - }, - "node_modules/kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/labeled-stream-splicer": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/labeled-stream-splicer/-/labeled-stream-splicer-2.0.2.tgz", - "integrity": "sha512-Ca4LSXFFZUjPScRaqOcFxneA0VpKZr4MMYCljyQr4LIewTLb3Y0IUTIsnBBsVubIeEfxeSZpSjSsRM8APEQaAw==", - "dev": true, - "dependencies": { - "inherits": "^2.0.1", - "stream-splicer": "^2.0.0" - } - }, - "node_modules/levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", - "dev": true, - "dependencies": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/liftup": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/liftup/-/liftup-3.0.1.tgz", - "integrity": "sha512-yRHaiQDizWSzoXk3APcA71eOI/UuhEkNN9DiW2Tt44mhYzX4joFoCZlxsSOF7RyeLlfqzFLQI1ngFq3ggMPhOw==", - "dev": true, - "dependencies": { - "extend": "^3.0.2", - "findup-sync": "^4.0.0", - "fined": "^1.2.0", - "flagged-respawn": "^1.0.1", - "is-plain-object": "^2.0.4", - "object.map": "^1.0.1", - "rechoir": "^0.7.0", - "resolve": "^1.19.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/liftup/node_modules/findup-sync": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-4.0.0.tgz", - "integrity": "sha512-6jvvn/12IC4quLBL1KNokxC7wWTvYncaVUYSoxWw7YykPLuRrnv4qdHcSOywOI5RpkOVGeQRtWM8/q+G6W6qfQ==", - "dev": true, - "dependencies": { - "detect-file": "^1.0.0", - "is-glob": "^4.0.0", - "micromatch": "^4.0.2", - "resolve-dir": "^1.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/livereload-js": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/livereload-js/-/livereload-js-2.4.0.tgz", - "integrity": "sha512-XPQH8Z2GDP/Hwz2PCDrh2mth4yFejwA1OZ/81Ti3LgKyhDcEjsSsqFWZojHG0va/duGd+WyosY7eXLDoOyqcPw==", - "dev": true - }, - "node_modules/load-grunt-config": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/load-grunt-config/-/load-grunt-config-4.0.1.tgz", - "integrity": "sha512-F3CD28C1WFocVvdTRSKnV73q7JvGY2OrqoeUeflbOQg58AhkFROIFc2BQXOU2xdrYJqWZx53glT5PZp1vrr9qA==", - "dev": true, - "dependencies": { - "cson": "7.20.0", - "glob": "7.1.7", - "jit-grunt": "0.10.0", - "js-yaml": "4.1.0", - "js-yaml-js-types": "1.0.0", - "load-grunt-tasks": "5.1.0", - "lodash": "4.17.21" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/load-grunt-config/node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, - "node_modules/load-grunt-config/node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/load-grunt-tasks": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/load-grunt-tasks/-/load-grunt-tasks-5.1.0.tgz", - "integrity": "sha512-oNj0Jlka1TsfDe+9He0kcA1cRln+TMoTsEByW7ij6kyktNLxBKJtslCFEvFrLC2Dj0S19IWJh3fOCIjLby2Xrg==", - "dev": true, - "dependencies": { - "arrify": "^2.0.1", - "multimatch": "^4.0.0", - "pkg-up": "^3.1.0", - "resolve-pkg": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/load-grunt-tasks/node_modules/array-differ": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-3.0.0.tgz", - "integrity": "sha512-THtfYS6KtME/yIAhKjZ2ul7XI96lQGHRputJQHO80LAWQnuGP4iCIN8vdMRboGbIEYBwU33q8Tch1os2+X0kMg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/load-grunt-tasks/node_modules/array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/load-grunt-tasks/node_modules/arrify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", - "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/load-grunt-tasks/node_modules/find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "dependencies": { - "locate-path": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/load-grunt-tasks/node_modules/multimatch": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/multimatch/-/multimatch-4.0.0.tgz", - "integrity": "sha512-lDmx79y1z6i7RNx0ZGCPq1bzJ6ZoDDKbvh7jxr9SJcWLkShMzXrHbYVpTdnhNM5MXpDUxCQ4DgqVttVXlBgiBQ==", - "dev": true, - "dependencies": { - "@types/minimatch": "^3.0.3", - "array-differ": "^3.0.0", - "array-union": "^2.1.0", - "arrify": "^2.0.1", - "minimatch": "^3.0.4" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/load-grunt-tasks/node_modules/pkg-up": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-3.1.0.tgz", - "integrity": "sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==", - "dev": true, - "dependencies": { - "find-up": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/load-grunt-tasks/node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/load-grunt-tasks/node_modules/resolve-pkg": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/resolve-pkg/-/resolve-pkg-2.0.0.tgz", - "integrity": "sha512-+1lzwXehGCXSeryaISr6WujZzowloigEofRB+dj75y9RRa/obVcYgbHJd53tdYw8pvZj8GojXaaENws8Ktw/hQ==", - "dev": true, - "dependencies": { - "resolve-from": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "dependencies": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/locate-path/node_modules/path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true - }, - "node_modules/lodash._arraycopy": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._arraycopy/-/lodash._arraycopy-3.0.0.tgz", - "integrity": "sha1-due3wfH7klRzdIeKVi7Qaj5Q9uE=", - "dev": true - }, - "node_modules/lodash._basevalues": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._basevalues/-/lodash._basevalues-3.0.0.tgz", - "integrity": "sha1-W3dXYoAr3j0yl1A+JjAIIP32Ybc=", - "dev": true - }, - "node_modules/lodash._getnative": { - "version": "3.9.1", - "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz", - "integrity": "sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=", - "dev": true - }, - "node_modules/lodash.isarguments": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", - "integrity": "sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo=", - "dev": true - }, - "node_modules/lodash.isarray": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz", - "integrity": "sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U=", - "dev": true - }, - "node_modules/lodash.keys": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz", - "integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=", - "dev": true, - "dependencies": { - "lodash._getnative": "^3.0.0", - "lodash.isarguments": "^3.0.0", - "lodash.isarray": "^3.0.0" - } - }, - "node_modules/lodash.memoize": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-3.0.4.tgz", - "integrity": "sha1-LcvSwofLwKVcxCMovQxzYVDVPj8=", - "dev": true - }, - "node_modules/lodash.toarray": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/lodash.toarray/-/lodash.toarray-3.0.2.tgz", - "integrity": "sha1-KyBPD6T1HChcbwDIHRzqWiMEEXk=", - "dev": true, - "dependencies": { - "lodash._arraycopy": "^3.0.0", - "lodash._basevalues": "^3.0.0", - "lodash.keys": "^3.0.0" - } - }, - "node_modules/lower-case": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz", - "integrity": "sha1-miyr0bno4K6ZOkv31YdcOcQujqw=", - "dev": true - }, - "node_modules/make-iterator": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/make-iterator/-/make-iterator-1.0.1.tgz", - "integrity": "sha512-pxiuXh0iVEq7VM7KMIhs5gxsfxCux2URptUQaXo4iZZJxBAzTPOLE2BumO5dbfVYq/hBJFBR/a1mFDmOx5AGmw==", - "dev": true, - "dependencies": { - "kind-of": "^6.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/map-cache": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", - "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/md5.js": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", - "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", - "dev": true, - "dependencies": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "node_modules/media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=", - "dev": true - }, - "node_modules/methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/micromatch": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", - "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", - "dev": true, - "dependencies": { - "braces": "^3.0.1", - "picomatch": "^2.2.3" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/miller-rabin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", - "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", - "dev": true, - "dependencies": { - "bn.js": "^4.0.0", - "brorand": "^1.0.1" - }, - "bin": { - "miller-rabin": "bin/miller-rabin" - } - }, - "node_modules/miller-rabin/node_modules/bn.js": { - "version": "4.11.9", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", - "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", - "dev": true - }, - "node_modules/mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "dev": true, - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/mime-db": { - "version": "1.43.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.43.0.tgz", - "integrity": "sha512-+5dsGEEovYbT8UY9yD7eE4XTc4UwJ1jBYlgaQQF38ENsKR3wj/8q8RFZrF9WIZpB2V1ArTVFUva8sAul1NzRzQ==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.26", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.26.tgz", - "integrity": "sha512-01paPWYgLrkqAyrlDorC1uDwl2p3qZT7yl806vW7DvDoxwXi46jsjFbg+WdwotBIk6/MbEhO/dh5aZ5sNj/dWQ==", - "dev": true, - "dependencies": { - "mime-db": "1.43.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/minimalistic-assert": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", - "dev": true - }, - "node_modules/minimalistic-crypto-utils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", - "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=", - "dev": true - }, - "node_modules/minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", - "dev": true - }, - "node_modules/mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true, - "bin": { - "mkdirp": "bin/cmd.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/mkdirp-classic": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", - "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", - "dev": true - }, - "node_modules/module-deps": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/module-deps/-/module-deps-6.2.3.tgz", - "integrity": "sha512-fg7OZaQBcL4/L+AK5f4iVqf9OMbCclXfy/znXRxTVhJSeW5AIlS9AwheYwDaXM3lVW7OBeaeUEY3gbaC6cLlSA==", - "dev": true, - "dependencies": { - "browser-resolve": "^2.0.0", - "cached-path-relative": "^1.0.2", - "concat-stream": "~1.6.0", - "defined": "^1.0.0", - "detective": "^5.2.0", - "duplexer2": "^0.1.2", - "inherits": "^2.0.1", - "JSONStream": "^1.0.3", - "parents": "^1.0.0", - "readable-stream": "^2.0.2", - "resolve": "^1.4.0", - "stream-combiner2": "^1.1.1", - "subarg": "^1.0.0", - "through2": "^2.0.0", - "xtend": "^4.0.0" - }, - "bin": { - "module-deps": "bin/cmd.js" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/module-deps/node_modules/browser-resolve": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-2.0.0.tgz", - "integrity": "sha512-7sWsQlYL2rGLy2IWm8WL8DCTJvYLc/qlOnsakDac87SOoCd16WLsaAMdCiAqsTNHIe+SXfaqyxyo6THoWqs8WQ==", - "dev": true, - "dependencies": { - "resolve": "^1.17.0" - } - }, - "node_modules/morgan": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.10.0.tgz", - "integrity": "sha512-AbegBVI4sh6El+1gNwvD5YIck7nSA36weD7xvIxG4in80j/UoK8AEGaWnnz8v1GxonMCltmlNs5ZKbGvl9b1XQ==", - "dev": true, - "dependencies": { - "basic-auth": "~2.0.1", - "debug": "2.6.9", - "depd": "~2.0.0", - "on-finished": "~2.3.0", - "on-headers": "~1.0.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/morgan/node_modules/depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - }, - "node_modules/negotiator": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", - "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/neo-async": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", - "dev": true - }, - "node_modules/no-case": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz", - "integrity": "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==", - "dev": true, - "dependencies": { - "lower-case": "^1.1.1" - } - }, - "node_modules/nopt": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", - "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", - "dev": true, - "dependencies": { - "abbrev": "1" - }, - "bin": { - "nopt": "bin/nopt.js" - } - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/number-is-nan": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-inspect": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.0.tgz", - "integrity": "sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object.assign": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", - "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3", - "has-symbols": "^1.0.1", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object.defaults": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/object.defaults/-/object.defaults-1.1.0.tgz", - "integrity": "sha1-On+GgzS0B96gbaFtiNXNKeQ1/s8=", - "dev": true, - "dependencies": { - "array-each": "^1.0.1", - "array-slice": "^1.0.0", - "for-own": "^1.0.0", - "isobject": "^3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object.map": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object.map/-/object.map-1.0.1.tgz", - "integrity": "sha1-z4Plncj8wK1fQlDh94s7gb2AHTc=", - "dev": true, - "dependencies": { - "for-own": "^1.0.0", - "make-iterator": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object.pick": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", - "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", - "dev": true, - "dependencies": { - "isobject": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/on-finished": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", - "dev": true, - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/on-headers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", - "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/optionator": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", - "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", - "dev": true, - "dependencies": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.6", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "word-wrap": "~1.2.3" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/os-browserify": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", - "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=", - "dev": true - }, - "node_modules/os-homedir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/osenv": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", - "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", - "dev": true, - "dependencies": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.0" - } - }, - "node_modules/outpipe": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/outpipe/-/outpipe-1.1.1.tgz", - "integrity": "sha1-UM+GFjZeh+Ax4ppeyTOaPaRyX6I=", - "dev": true, - "dependencies": { - "shell-quote": "^1.4.2" - } - }, - "node_modules/p-limit": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.2.tgz", - "integrity": "sha512-WGR+xHecKTr7EbUEhyLSh5Dube9JtdiG78ufaeLxTgpudf/20KqyMioIUZJAezlTIi6evxuoUs9YXc11cU+yzQ==", - "dev": true, - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, - "dependencies": { - "p-limit": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/pako": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", - "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", - "dev": true - }, - "node_modules/param-case": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/param-case/-/param-case-2.1.1.tgz", - "integrity": "sha1-35T9jPZTHs915r75oIWPvHK+Ikc=", - "dev": true, - "dependencies": { - "no-case": "^2.2.0" - } - }, - "node_modules/parents": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parents/-/parents-1.0.1.tgz", - "integrity": "sha1-/t1NK/GTp3dF/nHjcdc8MwfZx1E=", - "dev": true, - "dependencies": { - "path-platform": "~0.11.15" - } - }, - "node_modules/parse-asn1": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.5.tgz", - "integrity": "sha512-jkMYn1dcJqF6d5CpU689bq7w/b5ALS9ROVSpQDPrZsqqesUJii9qutvoT5ltGedNXMO2e16YUWIghG9KxaViTQ==", - "dev": true, - "dependencies": { - "asn1.js": "^4.0.0", - "browserify-aes": "^1.0.0", - "create-hash": "^1.1.0", - "evp_bytestokey": "^1.0.0", - "pbkdf2": "^3.0.3", - "safe-buffer": "^5.1.1" - } - }, - "node_modules/parse-filepath": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.2.tgz", - "integrity": "sha1-pjISf1Oq89FYdvWHLz/6x2PWyJE=", - "dev": true, - "dependencies": { - "is-absolute": "^1.0.0", - "map-cache": "^0.2.0", - "path-root": "^0.1.1" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/parse-ms": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parse-ms/-/parse-ms-1.0.1.tgz", - "integrity": "sha1-VjRtR0nXjyNDDKDHE4UK75GqNh0=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/parse-passwd": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", - "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/path": { - "version": "0.12.7", - "resolved": "https://registry.npmjs.org/path/-/path-0.12.7.tgz", - "integrity": "sha1-1NwqUGxM4hl+tIHr/NWzbAFAsQ8=", - "dev": true, - "dependencies": { - "process": "^0.11.1", - "util": "^0.10.3" - } - }, - "node_modules/path-browserify": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz", - "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==", - "dev": true - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true - }, - "node_modules/path-platform": { - "version": "0.11.15", - "resolved": "https://registry.npmjs.org/path-platform/-/path-platform-0.11.15.tgz", - "integrity": "sha1-6GQhf3TDaFDwhSt43Hv31KVyG/I=", - "dev": true, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/path-root": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/path-root/-/path-root-0.1.1.tgz", - "integrity": "sha1-mkpoFMrBwM1zNgqV8yCDyOpHRbc=", - "dev": true, - "dependencies": { - "path-root-regex": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-root-regex": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/path-root-regex/-/path-root-regex-0.1.2.tgz", - "integrity": "sha1-v8zcjfWxLcUsi0PsONGNcsBLqW0=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=", - "dev": true - }, - "node_modules/pbkdf2": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.1.tgz", - "integrity": "sha512-4Ejy1OPxi9f2tt1rRV7Go7zmfDQ+ZectEQz3VGUQhgq62HtIRPDyG/JtnwIxs6x3uNMwo2V7q1fMvKjb+Tnpqg==", - "dev": true, - "dependencies": { - "create-hash": "^1.1.2", - "create-hmac": "^1.1.4", - "ripemd160": "^2.0.1", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - }, - "engines": { - "node": ">=0.12" - } - }, - "node_modules/picomatch": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", - "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==", - "dev": true, - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/plur": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/plur/-/plur-1.0.0.tgz", - "integrity": "sha1-24XGgU9eXlo7Se/CjWBP7GKXUVY=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", - "dev": true, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/pretty-ms": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/pretty-ms/-/pretty-ms-2.1.0.tgz", - "integrity": "sha1-QlfCVt8/sLRR1q/6qwIYhBJpgdw=", - "dev": true, - "dependencies": { - "is-finite": "^1.0.1", - "parse-ms": "^1.0.0", - "plur": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/process": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", - "dev": true, - "engines": { - "node": ">= 0.6.0" - } - }, - "node_modules/process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true - }, - "node_modules/promise": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", - "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", - "dev": true, - "optional": true, - "dependencies": { - "asap": "~2.0.3" - } - }, - "node_modules/proxy-addr": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", - "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", - "dev": true, - "dependencies": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/public-encrypt": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", - "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", - "dev": true, - "dependencies": { - "bn.js": "^4.1.0", - "browserify-rsa": "^4.0.0", - "create-hash": "^1.1.0", - "parse-asn1": "^5.0.0", - "randombytes": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "node_modules/public-encrypt/node_modules/bn.js": { - "version": "4.11.9", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", - "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", - "dev": true - }, - "node_modules/pug": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/pug/-/pug-3.0.2.tgz", - "integrity": "sha512-bp0I/hiK1D1vChHh6EfDxtndHji55XP/ZJKwsRqrz6lRia6ZC2OZbdAymlxdVFwd1L70ebrVJw4/eZ79skrIaw==", - "dev": true, - "optional": true, - "dependencies": { - "pug-code-gen": "^3.0.2", - "pug-filters": "^4.0.0", - "pug-lexer": "^5.0.1", - "pug-linker": "^4.0.0", - "pug-load": "^3.0.0", - "pug-parser": "^6.0.0", - "pug-runtime": "^3.0.1", - "pug-strip-comments": "^2.0.0" - } - }, - "node_modules/pug-attrs": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pug-attrs/-/pug-attrs-3.0.0.tgz", - "integrity": "sha512-azINV9dUtzPMFQktvTXciNAfAuVh/L/JCl0vtPCwvOA21uZrC08K/UnmrL+SXGEVc1FwzjW62+xw5S/uaLj6cA==", - "dev": true, - "optional": true, - "dependencies": { - "constantinople": "^4.0.1", - "js-stringify": "^1.0.2", - "pug-runtime": "^3.0.0" - } - }, - "node_modules/pug-code-gen": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/pug-code-gen/-/pug-code-gen-3.0.2.tgz", - "integrity": "sha512-nJMhW16MbiGRiyR4miDTQMRWDgKplnHyeLvioEJYbk1RsPI3FuA3saEP8uwnTb2nTJEKBU90NFVWJBk4OU5qyg==", - "dev": true, - "optional": true, - "dependencies": { - "constantinople": "^4.0.1", - "doctypes": "^1.1.0", - "js-stringify": "^1.0.2", - "pug-attrs": "^3.0.0", - "pug-error": "^2.0.0", - "pug-runtime": "^3.0.0", - "void-elements": "^3.1.0", - "with": "^7.0.0" - } - }, - "node_modules/pug-error": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/pug-error/-/pug-error-2.0.0.tgz", - "integrity": "sha512-sjiUsi9M4RAGHktC1drQfCr5C5eriu24Lfbt4s+7SykztEOwVZtbFk1RRq0tzLxcMxMYTBR+zMQaG07J/btayQ==", - "dev": true, - "optional": true - }, - "node_modules/pug-filters": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/pug-filters/-/pug-filters-4.0.0.tgz", - "integrity": "sha512-yeNFtq5Yxmfz0f9z2rMXGw/8/4i1cCFecw/Q7+D0V2DdtII5UvqE12VaZ2AY7ri6o5RNXiweGH79OCq+2RQU4A==", - "dev": true, - "optional": true, - "dependencies": { - "constantinople": "^4.0.1", - "jstransformer": "1.0.0", - "pug-error": "^2.0.0", - "pug-walk": "^2.0.0", - "resolve": "^1.15.1" - } - }, - "node_modules/pug-lexer": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/pug-lexer/-/pug-lexer-5.0.1.tgz", - "integrity": "sha512-0I6C62+keXlZPZkOJeVam9aBLVP2EnbeDw3An+k0/QlqdwH6rv8284nko14Na7c0TtqtogfWXcRoFE4O4Ff20w==", - "dev": true, - "optional": true, - "dependencies": { - "character-parser": "^2.2.0", - "is-expression": "^4.0.0", - "pug-error": "^2.0.0" - } - }, - "node_modules/pug-linker": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/pug-linker/-/pug-linker-4.0.0.tgz", - "integrity": "sha512-gjD1yzp0yxbQqnzBAdlhbgoJL5qIFJw78juN1NpTLt/mfPJ5VgC4BvkoD3G23qKzJtIIXBbcCt6FioLSFLOHdw==", - "dev": true, - "optional": true, - "dependencies": { - "pug-error": "^2.0.0", - "pug-walk": "^2.0.0" - } - }, - "node_modules/pug-load": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pug-load/-/pug-load-3.0.0.tgz", - "integrity": "sha512-OCjTEnhLWZBvS4zni/WUMjH2YSUosnsmjGBB1An7CsKQarYSWQ0GCVyd4eQPMFJqZ8w9xgs01QdiZXKVjk92EQ==", - "dev": true, - "optional": true, - "dependencies": { - "object-assign": "^4.1.1", - "pug-walk": "^2.0.0" - } - }, - "node_modules/pug-parser": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/pug-parser/-/pug-parser-6.0.0.tgz", - "integrity": "sha512-ukiYM/9cH6Cml+AOl5kETtM9NR3WulyVP2y4HOU45DyMim1IeP/OOiyEWRr6qk5I5klpsBnbuHpwKmTx6WURnw==", - "dev": true, - "optional": true, - "dependencies": { - "pug-error": "^2.0.0", - "token-stream": "1.0.0" - } - }, - "node_modules/pug-runtime": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/pug-runtime/-/pug-runtime-3.0.1.tgz", - "integrity": "sha512-L50zbvrQ35TkpHwv0G6aLSuueDRwc/97XdY8kL3tOT0FmhgG7UypU3VztfV/LATAvmUfYi4wNxSajhSAeNN+Kg==", - "dev": true, - "optional": true - }, - "node_modules/pug-strip-comments": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/pug-strip-comments/-/pug-strip-comments-2.0.0.tgz", - "integrity": "sha512-zo8DsDpH7eTkPHCXFeAk1xZXJbyoTfdPlNR0bK7rpOMuhBYb0f5qUVCO1xlsitYd3w5FQTK7zpNVKb3rZoUrrQ==", - "dev": true, - "optional": true, - "dependencies": { - "pug-error": "^2.0.0" - } - }, - "node_modules/pug-walk": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/pug-walk/-/pug-walk-2.0.0.tgz", - "integrity": "sha512-yYELe9Q5q9IQhuvqsZNwA5hfPkMJ8u92bQLIMcsMxf/VADjNtEYptU+inlufAFYcWdHlwNfZOEnOOQrZrcyJCQ==", - "dev": true, - "optional": true - }, - "node_modules/punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", - "dev": true - }, - "node_modules/qs": { - "version": "6.9.6", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.6.tgz", - "integrity": "sha512-TIRk4aqYLNoJUbd+g2lEdz5kLWIuTMRagAXxl78Q0RiVjAOugHmeKNGdd3cwo/ktpf9aL9epCfFqWDEKysUlLQ==", - "dev": true, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/querystring": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", - "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", - "dev": true, - "engines": { - "node": ">=0.4.x" - } - }, - "node_modules/querystring-es3": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", - "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", - "dev": true, - "engines": { - "node": ">=0.4.x" - } - }, - "node_modules/randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dev": true, - "dependencies": { - "safe-buffer": "^5.1.0" - } - }, - "node_modules/randomfill": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", - "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", - "dev": true, - "dependencies": { - "randombytes": "^2.0.5", - "safe-buffer": "^5.1.0" - } - }, - "node_modules/range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/raw-body": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.2.tgz", - "integrity": "sha512-RPMAFUJP19WIet/99ngh6Iv8fzAbqum4Li7AD6DtGaW2RpMB/11xDoalPiJMTbu6I3hkbMVkATvZrqb9EEqeeQ==", - "dev": true, - "dependencies": { - "bytes": "3.1.1", - "http-errors": "1.8.1", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/raw-body/node_modules/http-errors": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", - "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", - "dev": true, - "dependencies": { - "depd": "~1.1.2", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.1" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/raw-body/node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "node_modules/raw-body/node_modules/setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", - "dev": true - }, - "node_modules/read-only-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/read-only-stream/-/read-only-stream-2.0.0.tgz", - "integrity": "sha1-JyT9aoET1zdkrCiNQ4YnDB2/F/A=", - "dev": true, - "dependencies": { - "readable-stream": "^2.0.2" - } - }, - "node_modules/readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dev": true, - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/rechoir": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.7.1.tgz", - "integrity": "sha512-/njmZ8s1wVeR6pjTZ+0nCnv8SpZNRMT2D1RLOJQESlYFDBvwpTA4KWJpZ+sBJ4+vhjILRcK7JIFdGCdxEAAitg==", - "dev": true, - "dependencies": { - "resolve": "^1.9.0" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/relateurl": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", - "integrity": "sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=", - "dev": true, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/requirefresh": { - "version": "4.13.0", - "resolved": "https://registry.npmjs.org/requirefresh/-/requirefresh-4.13.0.tgz", - "integrity": "sha512-APrzWWxqnwE2Bz3ysFepAU0Dc0aYjn8jsDLFIegedn+KVCS9LykAclkf+6YaJXk3ON9l6QAm04rN+bEA89cGIg==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://bevry.me/fund" - } - }, - "node_modules/requirejs": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/requirejs/-/requirejs-2.3.6.tgz", - "integrity": "sha512-ipEzlWQe6RK3jkzikgCupiTbTvm4S0/CAU5GlgptkN5SO6F3u0UD0K18wy6ErDqiCyP4J4YYe1HuAShvsxePLg==", - "dev": true, - "bin": { - "r_js": "bin/r.js", - "r.js": "bin/r.js" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/resolve": { - "version": "1.21.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.21.0.tgz", - "integrity": "sha512-3wCbTpk5WJlyE4mSOtDLhqQmGFi0/TD9VPwmiolnk8U0wRgMEktqCXd3vy5buTO3tljvalNvKrjHEfrd2WpEKA==", - "dev": true, - "dependencies": { - "is-core-module": "^2.8.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/resolve-dir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", - "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=", - "dev": true, - "dependencies": { - "expand-tilde": "^2.0.0", - "global-modules": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/rimraf": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", - "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", - "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - } - }, - "node_modules/ripemd160": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", - "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", - "dev": true, - "dependencies": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1" - } - }, - "node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "node_modules/safe-json-parse": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/safe-json-parse/-/safe-json-parse-1.0.1.tgz", - "integrity": "sha1-PnZyPjjf3aE8mx0poeB//uSzC1c=", - "dev": true - }, - "node_modules/safefs": { - "version": "6.16.0", - "resolved": "https://registry.npmjs.org/safefs/-/safefs-6.16.0.tgz", - "integrity": "sha512-IUIN5h+r2acNVkbsM5VoBUsRnaSFwQFZnzyvQsiLlgFsncLi7rrtmM4FsEgwv+xDTJzsrp79rd+/GJu2zWcR9w==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.6" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://bevry.me/fund" - } - }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true - }, - "node_modules/sass": { - "version": "1.49.0", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.49.0.tgz", - "integrity": "sha512-TVwVdNDj6p6b4QymJtNtRS2YtLJ/CqZriGg0eIAbAKMlN8Xy6kbv33FsEZSF7FufFFM705SQviHjjThfaQ4VNw==", - "dev": true, - "dependencies": { - "chokidar": ">=3.0.0 <4.0.0", - "immutable": "^4.0.0", - "source-map-js": ">=0.6.2 <2.0.0" - }, - "bin": { - "sass": "sass.js" - }, - "engines": { - "node": ">=8.9.0" - } - }, - "node_modules/send": { - "version": "0.17.2", - "resolved": "https://registry.npmjs.org/send/-/send-0.17.2.tgz", - "integrity": "sha512-UJYB6wFSJE3G00nEivR5rgWp8c2xXvJ3OPWPhmuteU0IKj8nKbG3DrjiOmLwpnHGYWAVwA69zmTm++YG0Hmwww==", - "dev": true, - "dependencies": { - "debug": "2.6.9", - "depd": "~1.1.2", - "destroy": "~1.0.4", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "1.8.1", - "mime": "1.6.0", - "ms": "2.1.3", - "on-finished": "~2.3.0", - "range-parser": "~1.2.1", - "statuses": "~1.5.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/send/node_modules/http-errors": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", - "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", - "dev": true, - "dependencies": { - "depd": "~1.1.2", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.1" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/send/node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "node_modules/send/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true - }, - "node_modules/send/node_modules/setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", - "dev": true - }, - "node_modules/serve-static": { - "version": "1.14.2", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.2.tgz", - "integrity": "sha512-+TMNA9AFxUEGuC0z2mevogSnn9MXKb4fa7ngeRMJaaGv8vTwnIEkKi+QGvPt33HSnf8pRS+WGM0EbMtCJLKMBQ==", - "dev": true, - "dependencies": { - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.17.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/setprototypeof": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", - "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", - "dev": true - }, - "node_modules/sha.js": { - "version": "2.4.11", - "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", - "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", - "dev": true, - "dependencies": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - }, - "bin": { - "sha.js": "bin.js" - } - }, - "node_modules/shasum": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/shasum/-/shasum-1.0.2.tgz", - "integrity": "sha1-5wEjENj0F/TetXEhUOVni4euVl8=", - "dev": true, - "dependencies": { - "json-stable-stringify": "~0.0.0", - "sha.js": "~2.4.4" - } - }, - "node_modules/shasum-object": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shasum-object/-/shasum-object-1.0.0.tgz", - "integrity": "sha512-Iqo5rp/3xVi6M4YheapzZhhGPVs0yZwHj7wvwQ1B9z8H6zk+FEnI7y3Teq7qwnekfEhu8WmG2z0z4iWZaxLWVg==", - "dev": true, - "dependencies": { - "fast-safe-stringify": "^2.0.7" - } - }, - "node_modules/shell-quote": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.2.tgz", - "integrity": "sha512-mRz/m/JVscCrkMyPqHc/bczi3OQHkLTqXHEFu0zDhK/qfv3UcOA4SVmRCLmos4bhjr9ekVQubj/R7waKapmiQg==", - "dev": true - }, - "node_modules/side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/simple-concat": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.0.tgz", - "integrity": "sha1-c0TLuLbib7J9ZrL8hvn21Zl1IcY=", - "dev": true - }, - "node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-js": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", - "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", - "dev": true - }, - "node_modules/ssl-root-cas": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/ssl-root-cas/-/ssl-root-cas-1.3.1.tgz", - "integrity": "sha512-KR8J210Wfvjh+iNE9jcQEgbG0VG2713PHreItx6aNCPnkFO8XChz1cJ4iuCGeBj0+8wukLmgHgJqX+O5kRjPkQ==", - "dev": true, - "dependencies": { - "@coolaj86/urequest": "^1.3.6" - } - }, - "node_modules/statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/stream-browserify": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz", - "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==", - "dev": true, - "dependencies": { - "inherits": "~2.0.1", - "readable-stream": "^2.0.2" - } - }, - "node_modules/stream-combiner2": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/stream-combiner2/-/stream-combiner2-1.1.1.tgz", - "integrity": "sha1-+02KFCDqNidk4hrUeAOXvry0HL4=", - "dev": true, - "dependencies": { - "duplexer2": "~0.1.0", - "readable-stream": "^2.0.2" - } - }, - "node_modules/stream-http": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-3.1.1.tgz", - "integrity": "sha512-S7OqaYu0EkFpgeGFb/NPOoPLxFko7TPqtEeFg5DXPB4v/KETHG0Ln6fRFrNezoelpaDKmycEmmZ81cC9DAwgYg==", - "dev": true, - "dependencies": { - "builtin-status-codes": "^3.0.0", - "inherits": "^2.0.4", - "readable-stream": "^3.6.0", - "xtend": "^4.0.2" - } - }, - "node_modules/stream-http/node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "node_modules/stream-http/node_modules/readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dev": true, - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/stream-splicer": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/stream-splicer/-/stream-splicer-2.0.1.tgz", - "integrity": "sha512-Xizh4/NPuYSyAXyT7g8IvdJ9HJpxIGL9PjyhtywCZvvP0OPIdqyrr4dMikeuvY8xahpdKEBlBTySe583totajg==", - "dev": true, - "dependencies": { - "inherits": "^2.0.1", - "readable-stream": "^2.0.2" - } - }, - "node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/string-template": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/string-template/-/string-template-0.2.1.tgz", - "integrity": "sha1-QpMuWYo1LQH8IuwzZ9nYTuxsmt0=", - "dev": true - }, - "node_modules/string.prototype.trimend": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz", - "integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.trimstart": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz", - "integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "dependencies": { - "ansi-regex": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/subarg": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/subarg/-/subarg-1.0.0.tgz", - "integrity": "sha1-9izxdYHplrSPyWVpn1TAauJouNI=", - "dev": true, - "dependencies": { - "minimist": "^1.1.0" - } - }, - "node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/syntax-error": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/syntax-error/-/syntax-error-1.4.0.tgz", - "integrity": "sha512-YPPlu67mdnHGTup2A8ff7BC2Pjq0e0Yp/IyTFN03zWO0RcK07uLcbi7C2KpGR2FvWbaB0+bfE27a+sBKebSo7w==", - "dev": true, - "dependencies": { - "acorn-node": "^1.2.0" - } - }, - "node_modules/text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", - "dev": true - }, - "node_modules/through": { - "version": "2.2.7", - "resolved": "https://registry.npmjs.org/through/-/through-2.2.7.tgz", - "integrity": "sha1-bo4hIAGR1OtqmfbwEN9Gqhxusr0=", - "dev": true - }, - "node_modules/through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dev": true, - "dependencies": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - }, - "node_modules/time-grunt": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/time-grunt/-/time-grunt-2.0.0.tgz", - "integrity": "sha512-iQD2AeDYCAJrsPC/eUsfYZD9UT7TuBOmUIgFV5zeTQgRk6yLJKoc3aYR0gusJ0m+bG13B6qrDZ0SwPLe0/htHw==", - "deprecated": "Deprecated because Grunt is practically unmaintained. Move on to something better. This package will continue to work with Grunt v1, but it will not receive any updates.", - "dev": true, - "dependencies": { - "chalk": "^1.0.0", - "date-time": "^1.1.0", - "figures": "^1.0.0", - "hooker": "^0.2.3", - "number-is-nan": "^1.0.0", - "pretty-ms": "^2.1.0", - "text-table": "^0.2.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/time-grunt/node_modules/ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/time-grunt/node_modules/chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "dependencies": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/time-grunt/node_modules/supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/time-zone": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/time-zone/-/time-zone-0.1.0.tgz", - "integrity": "sha1-Sncotqwo2w4Aj1FAQ/1VW9VXO0Y=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/timers-browserify": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-1.4.2.tgz", - "integrity": "sha1-ycWLV1voQHN1y14kYtrO50NZ9B0=", - "dev": true, - "dependencies": { - "process": "~0.11.0" - }, - "engines": { - "node": ">=0.6.0" - } - }, - "node_modules/tiny-lr": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/tiny-lr/-/tiny-lr-1.1.1.tgz", - "integrity": "sha512-44yhA3tsaRoMOjQQ+5v5mVdqef+kH6Qze9jTpqtVufgYjYt08zyZAwNwwVBj3i1rJMnR52IxOW0LK0vBzgAkuA==", - "dev": true, - "dependencies": { - "body": "^5.1.0", - "debug": "^3.1.0", - "faye-websocket": "~0.10.0", - "livereload-js": "^2.3.0", - "object-assign": "^4.1.0", - "qs": "^6.4.0" - } - }, - "node_modules/tiny-lr/node_modules/debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "dev": true, - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/tiny-lr/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "node_modules/to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", - "dev": true, - "optional": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/toidentifier": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", - "dev": true, - "engines": { - "node": ">=0.6" - } - }, - "node_modules/token-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/token-stream/-/token-stream-1.0.0.tgz", - "integrity": "sha1-zCAOqyYT9BZtJ/+a/HylbUnfbrQ=", - "dev": true, - "optional": true - }, - "node_modules/tty-browserify": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.1.tgz", - "integrity": "sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw==", - "dev": true - }, - "node_modules/type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", - "dev": true, - "dependencies": { - "prelude-ls": "~1.1.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", - "dev": true, - "dependencies": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/typechecker": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/typechecker/-/typechecker-6.4.0.tgz", - "integrity": "sha512-EbOu+9szY13mhl0EsvLXnR+pTCa3gTHQQPLdce72ujcC9fRHXlVFBNXtHeRhgzLxLlKUh4zA9C0tezLDgshf+A==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://bevry.me/fund" - } - }, - "node_modules/typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", - "dev": true - }, - "node_modules/uglify-js": { - "version": "3.14.5", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.14.5.tgz", - "integrity": "sha512-qZukoSxOG0urUTvjc2ERMTcAy+BiFh3weWAkeurLwjrCba73poHmG3E36XEjd/JGukMzwTL7uCxZiAexj8ppvQ==", - "dev": true, - "bin": { - "uglifyjs": "bin/uglifyjs" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/umd": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/umd/-/umd-3.0.3.tgz", - "integrity": "sha512-4IcGSufhFshvLNcMCV80UnQVlZ5pMOC8mvNPForqwA4+lzYQuetTESLDQkeLmihq8bRcnpbQa48Wb8Lh16/xow==", - "dev": true, - "bin": { - "umd": "bin/cli.js" - } - }, - "node_modules/unbox-primitive": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz", - "integrity": "sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.1", - "has-bigints": "^1.0.1", - "has-symbols": "^1.0.2", - "which-boxed-primitive": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/unc-path-regex": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", - "integrity": "sha1-5z3T17DXxe2G+6xrCufYxqadUPo=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/undeclared-identifiers": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/undeclared-identifiers/-/undeclared-identifiers-1.1.3.tgz", - "integrity": "sha512-pJOW4nxjlmfwKApE4zvxLScM/njmwj/DiUBv7EabwE4O8kRUy+HIwxQtZLBPll/jx1LJyBcqNfB3/cpv9EZwOw==", - "dev": true, - "dependencies": { - "acorn-node": "^1.3.0", - "dash-ast": "^1.0.0", - "get-assigned-identifiers": "^1.2.0", - "simple-concat": "^1.0.0", - "xtend": "^4.0.1" - }, - "bin": { - "undeclared-identifiers": "bin.js" - } - }, - "node_modules/underscore.string": { - "version": "3.3.5", - "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-3.3.5.tgz", - "integrity": "sha512-g+dpmgn+XBneLmXXo+sGlW5xQEt4ErkS3mgeN2GFbremYeMBSJKr9Wf2KJplQVaiPY/f7FN6atosWYNm9ovrYg==", - "dev": true, - "dependencies": { - "sprintf-js": "^1.0.3", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": "*" - } - }, - "node_modules/unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/upper-case": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz", - "integrity": "sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg=", - "dev": true - }, - "node_modules/url": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", - "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", - "dev": true, - "dependencies": { - "punycode": "1.3.2", - "querystring": "0.2.0" - } - }, - "node_modules/url/node_modules/punycode": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", - "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", - "dev": true - }, - "node_modules/util": { - "version": "0.10.4", - "resolved": "https://registry.npmjs.org/util/-/util-0.10.4.tgz", - "integrity": "sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==", - "dev": true, - "dependencies": { - "inherits": "2.0.3" - } - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true - }, - "node_modules/utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", - "dev": true, - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/v8flags": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-3.2.0.tgz", - "integrity": "sha512-mH8etigqMfiGWdeXpaaqGfs6BndypxusHHcv2qSHyZkGEznCd/qAXCWWRzeowtL54147cktFOC4P5y+kl8d8Jg==", - "dev": true, - "dependencies": { - "homedir-polyfill": "^1.0.1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/vm-browserify": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", - "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==", - "dev": true - }, - "node_modules/void-elements": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-3.1.0.tgz", - "integrity": "sha1-YU9/v42AHwu18GYfWy9XhXUOTwk=", - "dev": true, - "optional": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/watchify": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/watchify/-/watchify-4.0.0.tgz", - "integrity": "sha512-2Z04dxwoOeNxa11qzWumBTgSAohTC0+ScuY7XMenPnH+W2lhTcpEOJP4g2EIG/SWeLadPk47x++Yh+8BqPM/lA==", - "dev": true, - "dependencies": { - "anymatch": "^3.1.0", - "browserify": "^17.0.0", - "chokidar": "^3.4.0", - "defined": "^1.0.0", - "outpipe": "^1.1.0", - "through2": "^4.0.2", - "xtend": "^4.0.2" - }, - "bin": { - "watchify": "bin/cmd.js" - }, - "engines": { - "node": ">= 8.10.0" - } - }, - "node_modules/watchify/node_modules/browser-resolve": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-2.0.0.tgz", - "integrity": "sha512-7sWsQlYL2rGLy2IWm8WL8DCTJvYLc/qlOnsakDac87SOoCd16WLsaAMdCiAqsTNHIe+SXfaqyxyo6THoWqs8WQ==", - "dev": true, - "dependencies": { - "resolve": "^1.17.0" - } - }, - "node_modules/watchify/node_modules/browserify": { - "version": "17.0.0", - "resolved": "https://registry.npmjs.org/browserify/-/browserify-17.0.0.tgz", - "integrity": "sha512-SaHqzhku9v/j6XsQMRxPyBrSP3gnwmE27gLJYZgMT2GeK3J0+0toN+MnuNYDfHwVGQfLiMZ7KSNSIXHemy905w==", - "dev": true, - "dependencies": { - "assert": "^1.4.0", - "browser-pack": "^6.0.1", - "browser-resolve": "^2.0.0", - "browserify-zlib": "~0.2.0", - "buffer": "~5.2.1", - "cached-path-relative": "^1.0.0", - "concat-stream": "^1.6.0", - "console-browserify": "^1.1.0", - "constants-browserify": "~1.0.0", - "crypto-browserify": "^3.0.0", - "defined": "^1.0.0", - "deps-sort": "^2.0.1", - "domain-browser": "^1.2.0", - "duplexer2": "~0.1.2", - "events": "^3.0.0", - "glob": "^7.1.0", - "has": "^1.0.0", - "htmlescape": "^1.1.0", - "https-browserify": "^1.0.0", - "inherits": "~2.0.1", - "insert-module-globals": "^7.2.1", - "JSONStream": "^1.0.3", - "labeled-stream-splicer": "^2.0.0", - "mkdirp-classic": "^0.5.2", - "module-deps": "^6.2.3", - "os-browserify": "~0.3.0", - "parents": "^1.0.1", - "path-browserify": "^1.0.0", - "process": "~0.11.0", - "punycode": "^1.3.2", - "querystring-es3": "~0.2.0", - "read-only-stream": "^2.0.0", - "readable-stream": "^2.0.2", - "resolve": "^1.1.4", - "shasum-object": "^1.0.0", - "shell-quote": "^1.6.1", - "stream-browserify": "^3.0.0", - "stream-http": "^3.0.0", - "string_decoder": "^1.1.1", - "subarg": "^1.0.0", - "syntax-error": "^1.1.1", - "through2": "^2.0.0", - "timers-browserify": "^1.0.1", - "tty-browserify": "0.0.1", - "url": "~0.11.0", - "util": "~0.12.0", - "vm-browserify": "^1.0.0", - "xtend": "^4.0.0" - }, - "bin": { - "browserify": "bin/cmd.js" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/watchify/node_modules/browserify/node_modules/through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dev": true, - "dependencies": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - }, - "node_modules/watchify/node_modules/events": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", - "dev": true, - "engines": { - "node": ">=0.8.x" - } - }, - "node_modules/watchify/node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "node_modules/watchify/node_modules/path-browserify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", - "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", - "dev": true - }, - "node_modules/watchify/node_modules/stream-browserify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-3.0.0.tgz", - "integrity": "sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA==", - "dev": true, - "dependencies": { - "inherits": "~2.0.4", - "readable-stream": "^3.5.0" - } - }, - "node_modules/watchify/node_modules/stream-browserify/node_modules/readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dev": true, - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/watchify/node_modules/through2": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz", - "integrity": "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==", - "dev": true, - "dependencies": { - "readable-stream": "3" - } - }, - "node_modules/watchify/node_modules/through2/node_modules/readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dev": true, - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/watchify/node_modules/util": { - "version": "0.12.4", - "resolved": "https://registry.npmjs.org/util/-/util-0.12.4.tgz", - "integrity": "sha512-bxZ9qtSlGUWSOy9Qa9Xgk11kSslpuZwaxCg4sNIDj6FLucDab2JxnHwyNTCpHMtK1MjoQiWQ6DiUMZYbSrO+Sw==", - "dev": true, - "dependencies": { - "inherits": "^2.0.3", - "is-arguments": "^1.0.4", - "is-generator-function": "^1.0.7", - "is-typed-array": "^1.1.3", - "safe-buffer": "^5.1.2", - "which-typed-array": "^1.1.2" - } - }, - "node_modules/websocket-driver": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.3.tgz", - "integrity": "sha512-bpxWlvbbB459Mlipc5GBzzZwhoZgGEZLuqPaR0INBGnPAY1vdBX6hPnoFXiw+3yWxDuHyQjO2oXTMyS8A5haFg==", - "dev": true, - "dependencies": { - "http-parser-js": ">=0.4.0 <0.4.11", - "safe-buffer": ">=5.1.0", - "websocket-extensions": ">=0.1.1" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/websocket-extensions": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", - "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/which-boxed-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", - "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", - "dev": true, - "dependencies": { - "is-bigint": "^1.0.1", - "is-boolean-object": "^1.1.0", - "is-number-object": "^1.0.4", - "is-string": "^1.0.5", - "is-symbol": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/which-typed-array": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.7.tgz", - "integrity": "sha512-vjxaB4nfDqwKI0ws7wZpxIlde1XrLX5uB0ZjpfshgmapJMD7jJWhZI+yToJTqaFByF0eNBcYxbjmCzoRP7CfEw==", - "dev": true, - "dependencies": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "es-abstract": "^1.18.5", - "foreach": "^2.0.5", - "has-tostringtag": "^1.0.0", - "is-typed-array": "^1.1.7" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/with": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/with/-/with-7.0.2.tgz", - "integrity": "sha512-RNGKj82nUPg3g5ygxkQl0R937xLyho1J24ItRCBTr/m1YnZkzJy1hUiHUJrc/VlsDQzsCnInEGSg3bci0Lmd4w==", - "dev": true, - "optional": true, - "dependencies": { - "@babel/parser": "^7.9.6", - "@babel/types": "^7.9.6", - "assert-never": "^1.2.1", - "babel-walk": "3.0.0-canary-5" - }, - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" - }, - "node_modules/xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", - "dev": true, - "engines": { - "node": ">=0.4" - } - } - }, "dependencies": { "@babel/helper-validator-identifier": { "version": "7.16.7", @@ -6214,9 +12,9 @@ "optional": true }, "@babel/parser": { - "version": "7.16.8", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.16.8.tgz", - "integrity": "sha512-i7jDUfrVBWc+7OKcBzEe5n7fbv3i2fWtxKzzCvOjnzSxMfWMigAhtfJ7qzZNGFNMsCCd67+uz553dYKWXPvCKw==", + "version": "7.16.12", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.16.12.tgz", + "integrity": "sha512-VfaV15po8RiZssrkPweyvbGVSe4x2y+aciFCgn0n0/SJMR22cwofRV1mtnJQYcSB1wUTaA/X1LnA3es66MCO5A==", "dev": true, "optional": true }, @@ -6238,9 +36,9 @@ "dev": true }, "@types/minimatch": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz", - "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==", + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.5.tgz", + "integrity": "sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==", "dev": true }, "@uirouter/angularjs": { @@ -6251,10 +49,20 @@ "angular": "^1.0.8" } }, + "JSONStream": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", + "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", + "dev": true, + "requires": { + "jsonparse": "^1.2.0", + "through": ">=2.2.7 <3" + } + }, "abbrev": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.9.tgz", - "integrity": "sha1-kbR5JYinc4wl813W9jdSovh3YTU=", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", "dev": true }, "accepts": { @@ -6345,8 +153,7 @@ "angular-ui-bootstrap": { "version": "0.14.3", "resolved": "https://registry.npmjs.org/angular-ui-bootstrap/-/angular-ui-bootstrap-0.14.3.tgz", - "integrity": "sha1-2WzmBMhLvXBro0qryh1ac3bhi6Y=", - "requires": {} + "integrity": "sha1-2WzmBMhLvXBro0qryh1ac3bhi6Y=" }, "ansi-regex": { "version": "2.1.1", @@ -6355,12 +162,12 @@ "dev": true }, "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "requires": { - "color-convert": "^1.9.0" + "color-convert": "^2.0.1" } }, "anymatch": { @@ -6380,8 +187,22 @@ "dev": true, "requires": { "sprintf-js": "~1.0.2" + }, + "dependencies": { + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + } } }, + "array-differ": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-3.0.0.tgz", + "integrity": "sha512-THtfYS6KtME/yIAhKjZ2ul7XI96lQGHRputJQHO80LAWQnuGP4iCIN8vdMRboGbIEYBwU33q8Tch1os2+X0kMg==", + "dev": true + }, "array-each": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/array-each/-/array-each-1.0.1.tgz", @@ -6400,6 +221,18 @@ "integrity": "sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w==", "dev": true }, + "array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true + }, + "arrify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", + "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==", + "dev": true + }, "asap": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", @@ -6408,20 +241,21 @@ "optional": true }, "asn1.js": { - "version": "4.10.1", - "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", - "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", + "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==", "dev": true, "requires": { "bn.js": "^4.0.0", "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0" + "minimalistic-assert": "^1.0.0", + "safer-buffer": "^2.1.0" }, "dependencies": { "bn.js": { - "version": "4.11.9", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", - "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", "dev": true } } @@ -6461,9 +295,9 @@ "optional": true }, "async": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", - "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.3.tgz", + "integrity": "sha512-spZRyzKL5l5BZQrr/6m/SqFdBN0q3OCI0f9rjfBzCMBIP4p75P620rR3gTmaksNOhmzgdxcaxdNfMy6anrbM0g==", "dev": true }, "available-typed-arrays": { @@ -6483,9 +317,15 @@ } }, "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "dev": true }, "basic-auth": { "version": "2.0.1", @@ -6494,6 +334,14 @@ "dev": true, "requires": { "safe-buffer": "5.1.2" + }, + "dependencies": { + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + } } }, "binary-extensions": { @@ -6503,9 +351,9 @@ "dev": true }, "bn.js": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.1.2.tgz", - "integrity": "sha512-40rZaf3bUNKTVYu9sIeeEGOg7g14Yvnj9kH7b50EiwX0Q7A6umbvfI5tvHaOERH0XigqKkfLkFQxzb4e6CIXnA==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.0.tgz", + "integrity": "sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw==", "dev": true }, "body": { @@ -6575,10 +423,10 @@ "toidentifier": "1.0.1" } }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "qs": { + "version": "6.9.6", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.6.tgz", + "integrity": "sha512-TIRk4aqYLNoJUbd+g2lEdz5kLWIuTMRagAXxl78Q0RiVjAOugHmeKNGdd3cwo/ktpf9aL9epCfFqWDEKysUlLQ==", "dev": true }, "setprototypeof": { @@ -6624,9 +472,9 @@ "integrity": "sha512-erYug8XoqzU3IfcU8fUgyHqyOXqIE4tUTTQ+7mqUjQlvnXkOO6OlT9c/ZoJVHYoAaqGxr09CN53G7XIsO4KtWA==", "dev": true, "requires": { + "JSONStream": "^1.0.3", "combine-source-map": "~0.8.0", "defined": "^1.0.0", - "JSONStream": "^1.0.3", "safe-buffer": "^5.1.1", "through2": "^2.0.0", "umd": "^3.0.0" @@ -6655,6 +503,7 @@ "integrity": "sha512-EQX0h59Pp+0GtSRb5rL6OTfrttlzv+uyaUVlK6GX3w11SQ0jKPKyjC/54RhPR2ib2KmfcELM06e8FxcI5XNU2A==", "dev": true, "requires": { + "JSONStream": "^1.0.3", "assert": "^1.4.0", "browser-pack": "^6.0.1", "browser-resolve": "^1.11.0", @@ -6676,7 +525,6 @@ "https-browserify": "^1.0.0", "inherits": "~2.0.1", "insert-module-globals": "^7.0.0", - "JSONStream": "^1.0.3", "labeled-stream-splicer": "^2.0.0", "mkdirp-classic": "^0.5.2", "module-deps": "^6.0.0", @@ -6703,6 +551,22 @@ "util": "~0.10.1", "vm-browserify": "^1.0.0", "xtend": "^4.0.0" + }, + "dependencies": { + "glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + } } }, "browserify-aes": { @@ -6728,6 +592,14 @@ "async": "^1.5.2", "through2": "^2.0.0", "xtend": "^4.0.0" + }, + "dependencies": { + "async": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", + "dev": true + } } }, "browserify-cipher": { @@ -6759,8 +631,8 @@ "integrity": "sha1-BxPLdYckemMqnwjPG9FpuHi2Koo=", "dev": true, "requires": { - "browserify-cache-api": "^3.0.0", "JSONStream": "^0.10.0", + "browserify-cache-api": "^3.0.0", "through2": "^2.0.0", "xtend": "^4.0.0" }, @@ -6774,50 +646,42 @@ "jsonparse": "0.0.5", "through": ">=2.2.7 <3" } + }, + "jsonparse": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-0.0.5.tgz", + "integrity": "sha1-MwVCrT8KZUZlt3jz6y2an6UHrGQ=", + "dev": true } } }, "browserify-rsa": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", - "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.0.tgz", + "integrity": "sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==", "dev": true, "requires": { - "bn.js": "^4.1.0", + "bn.js": "^5.0.0", "randombytes": "^2.0.1" - }, - "dependencies": { - "bn.js": { - "version": "4.11.9", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", - "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", - "dev": true - } } }, "browserify-sign": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.0.tgz", - "integrity": "sha512-hEZC1KEeYuoHRqhGhTy6gWrpJA3ZDjFWv0DE61643ZnOXAKJb3u7yWcrU0mMc9SwAqK1n7myPGndkp0dFG7NFA==", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.1.tgz", + "integrity": "sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==", "dev": true, "requires": { "bn.js": "^5.1.1", "browserify-rsa": "^4.0.1", "create-hash": "^1.2.0", "create-hmac": "^1.1.7", - "elliptic": "^6.5.2", + "elliptic": "^6.5.3", "inherits": "^2.0.4", "parse-asn1": "^5.1.5", "readable-stream": "^3.6.0", "safe-buffer": "^5.2.0" }, "dependencies": { - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, "readable-stream": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", @@ -6828,12 +692,6 @@ "string_decoder": "^1.1.1", "util-deprecate": "^1.0.1" } - }, - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true } } }, @@ -6854,20 +712,12 @@ "requires": { "base64-js": "^1.0.2", "ieee754": "^1.1.4" - }, - "dependencies": { - "base64-js": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz", - "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==", - "dev": true - } } }, "buffer-from": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", - "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", "dev": true }, "buffer-xor": { @@ -6889,9 +739,9 @@ "dev": true }, "cached-path-relative": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/cached-path-relative/-/cached-path-relative-1.0.2.tgz", - "integrity": "sha512-5r2GqsoEb4qMTTN9J+WzXfjov+hjxT+j3u5K+kIVNIwAd99DLCJE9pBIMP1qVeybV6JiijL385Oz0DcYxfbOIg==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/cached-path-relative/-/cached-path-relative-1.1.0.tgz", + "integrity": "sha512-WF0LihfemtesFcJgO7xfOoOcnWzY/QHR4qeDqV44jPU3HTI54+LnfXK3SA27AVVGCdZFgjjFFaqUA9Jx7dMJZA==", "dev": true }, "call-bind": { @@ -6915,14 +765,13 @@ } }, "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" } }, "character-parser": { @@ -6962,9 +811,9 @@ } }, "clean-css": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.3.tgz", - "integrity": "sha512-VcMWDN54ZN/DS+g58HYL5/n4Zrqe8vHJpGA8KdgUXFU4fuP/aHNw8eld9SyEIyabIMJX/0RaY/fplOo5hYLSFA==", + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.4.tgz", + "integrity": "sha512-EJUDT7nDVFDvaQgAo2G/PJvxmp1o/c6iXLbswsBbUFXi1Nr+AjA2cKmfbKDMjMvzEe75g3P6JkaDDAKk96A85A==", "dev": true, "requires": { "source-map": "~0.6.0" @@ -6990,18 +839,18 @@ "dev": true }, "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "requires": { - "color-name": "1.1.3" + "color-name": "~1.1.4" } }, "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, "colors": { @@ -7101,14 +950,6 @@ "dev": true, "requires": { "safe-buffer": "5.2.1" - }, - "dependencies": { - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true - } } }, "content-type": { @@ -7142,25 +983,25 @@ "dev": true }, "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", "dev": true }, "create-ecdh": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz", - "integrity": "sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz", + "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==", "dev": true, "requires": { "bn.js": "^4.1.0", - "elliptic": "^6.0.0" + "elliptic": "^6.5.3" }, "dependencies": { "bn.js": { - "version": "4.11.9", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", - "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", "dev": true } } @@ -7354,9 +1195,9 @@ }, "dependencies": { "bn.js": { - "version": "4.11.9", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", - "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", "dev": true } } @@ -7414,15 +1255,9 @@ }, "dependencies": { "bn.js": { - "version": "4.11.9", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", - "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", - "dev": true - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", "dev": true } } @@ -7511,6 +1346,12 @@ "source-map": "~0.2.0" }, "dependencies": { + "esprima": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", + "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=", + "dev": true + }, "source-map": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.2.0.tgz", @@ -7524,9 +1365,9 @@ } }, "esprima": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", - "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", "dev": true }, "estraverse": { @@ -7622,10 +1463,10 @@ "vary": "~1.1.2" }, "dependencies": { - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "qs": { + "version": "6.9.6", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.6.tgz", + "integrity": "sha512-TIRk4aqYLNoJUbd+g2lEdz5kLWIuTMRagAXxl78Q0RiVjAOugHmeKNGdd3cwo/ktpf9aL9epCfFqWDEKysUlLQ==", "dev": true }, "setprototypeof": { @@ -7659,9 +1500,9 @@ "dev": true }, "fast-safe-stringify": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.0.7.tgz", - "integrity": "sha512-Utm6CdzT+6xsDk2m8S6uL8VHxNwI6Jub+e9NYTcAms28T84pTa25GJQV9j0CY0N1rM8hK4x6grpF2BQf+2qwVA==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", + "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==", "dev": true }, "faye-websocket": { @@ -7704,20 +1545,6 @@ "requires": { "defaults": "^1.0.3", "glob": "^6.0.2" - }, - "dependencies": { - "glob": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/glob/-/glob-6.0.4.tgz", - "integrity": "sha1-DwiGD2oVUSey+t1PnOJLGqtuTSI=", - "requires": { - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "2 || 3", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - } } }, "fill-range": { @@ -7744,6 +1571,15 @@ "unpipe": "~1.0.0" } }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, "findup-sync": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-0.3.0.tgz", @@ -7896,15 +1732,13 @@ "dev": true }, "glob": { - "version": "7.1.7", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", - "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", - "dev": true, + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/glob/-/glob-6.0.4.tgz", + "integrity": "sha1-DwiGD2oVUSey+t1PnOJLGqtuTSI=", "requires": { - "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", - "minimatch": "^3.0.4", + "minimatch": "2 || 3", "once": "^1.3.0", "path-is-absolute": "^1.0.0" } @@ -7940,28 +1774,33 @@ "ini": "^1.3.4", "is-windows": "^1.0.1", "which": "^1.2.14" - }, - "dependencies": { - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - } } }, "globule": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/globule/-/globule-1.3.0.tgz", - "integrity": "sha512-YlD4kdMqRCQHrhVdonet4TdRtv1/sZKepvoxNT4Nrhrp5HI8XFfc8kFlGlBn2myBo80aGp8Eft259mbcUJhgSg==", + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/globule/-/globule-1.3.3.tgz", + "integrity": "sha512-mb1aYtDbIjTu4ShMB85m3UzjX9BVKe9WCzsnfMSZk+K5GpIbBOexgg4PPCt5eHDEG5/ZQAUX2Kct02zfiPLsKg==", "dev": true, "requires": { "glob": "~7.1.1", "lodash": "~4.17.10", "minimatch": "~3.0.2" + }, + "dependencies": { + "glob": { + "version": "7.1.7", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", + "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + } } }, "graceful-fs": { @@ -7993,13 +1832,43 @@ "rimraf": "~3.0.2" }, "dependencies": { - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "glob": { + "version": "7.1.7", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", + "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", "dev": true, "requires": { - "glob": "^7.1.3" + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "grunt-cli": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/grunt-cli/-/grunt-cli-1.4.3.tgz", + "integrity": "sha512-9Dtx/AhVeB4LYzsViCjUQkd0Kw0McN2gYpdmGYKtE2a5Yt7v1Q+HYZVWhqXc/kGnxlMtqKDxSwotiGeFmkrCoQ==", + "dev": true, + "requires": { + "grunt-known-options": "~2.0.0", + "interpret": "~1.1.0", + "liftup": "~3.0.1", + "nopt": "~4.0.1", + "v8flags": "~3.2.0" + }, + "dependencies": { + "nopt": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.3.tgz", + "integrity": "sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg==", + "dev": true, + "requires": { + "abbrev": "1", + "osenv": "^0.1.4" + } + } } } } @@ -8043,6 +1912,7 @@ "integrity": "sha512-SaHqzhku9v/j6XsQMRxPyBrSP3gnwmE27gLJYZgMT2GeK3J0+0toN+MnuNYDfHwVGQfLiMZ7KSNSIXHemy905w==", "dev": true, "requires": { + "JSONStream": "^1.0.3", "assert": "^1.4.0", "browser-pack": "^6.0.1", "browser-resolve": "^2.0.0", @@ -8064,7 +1934,6 @@ "https-browserify": "^1.0.0", "inherits": "~2.0.1", "insert-module-globals": "^7.2.1", - "JSONStream": "^1.0.3", "labeled-stream-splicer": "^2.0.0", "mkdirp-classic": "^0.5.2", "module-deps": "^6.2.3", @@ -8099,11 +1968,19 @@ "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", "dev": true }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true + "glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } }, "path-browserify": { "version": "1.0.1", @@ -8150,31 +2027,6 @@ } } }, - "grunt-cli": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/grunt-cli/-/grunt-cli-1.4.3.tgz", - "integrity": "sha512-9Dtx/AhVeB4LYzsViCjUQkd0Kw0McN2gYpdmGYKtE2a5Yt7v1Q+HYZVWhqXc/kGnxlMtqKDxSwotiGeFmkrCoQ==", - "dev": true, - "requires": { - "grunt-known-options": "~2.0.0", - "interpret": "~1.1.0", - "liftup": "~3.0.1", - "nopt": "~4.0.1", - "v8flags": "~3.2.0" - }, - "dependencies": { - "nopt": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.3.tgz", - "integrity": "sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg==", - "dev": true, - "requires": { - "abbrev": "1", - "osenv": "^0.1.4" - } - } - } - }, "grunt-contrib-clean": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/grunt-contrib-clean/-/grunt-contrib-clean-2.0.0.tgz", @@ -8193,6 +2045,29 @@ "requires": { "lodash": "^4.17.14" } + }, + "glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } } } }, @@ -8265,6 +2140,58 @@ "chalk": "^2.4.1", "intercept-stdout": "^0.1.2", "path": "^0.12.7" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } } }, "grunt-express-server": { @@ -8284,6 +2211,31 @@ "html-minifier": "^4", "istanbul": "^0.4.5", "pug": "^3" + }, + "dependencies": { + "grunt-cli": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/grunt-cli/-/grunt-cli-1.4.3.tgz", + "integrity": "sha512-9Dtx/AhVeB4LYzsViCjUQkd0Kw0McN2gYpdmGYKtE2a5Yt7v1Q+HYZVWhqXc/kGnxlMtqKDxSwotiGeFmkrCoQ==", + "dev": true, + "requires": { + "grunt-known-options": "~2.0.0", + "interpret": "~1.1.0", + "liftup": "~3.0.1", + "nopt": "~4.0.1", + "v8flags": "~3.2.0" + } + }, + "nopt": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.3.tgz", + "integrity": "sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg==", + "dev": true, + "requires": { + "abbrev": "1", + "osenv": "^0.1.4" + } + } } }, "grunt-install-dependencies": { @@ -8318,57 +2270,6 @@ "requires": { "chalk": "~4.1.0", "lodash": "~4.17.19" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } } }, "grunt-legacy-util": { @@ -8386,11 +2287,14 @@ "which": "~2.0.2" }, "dependencies": { - "async": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.3.tgz", - "integrity": "sha512-spZRyzKL5l5BZQrr/6m/SqFdBN0q3OCI0f9rjfBzCMBIP4p75P620rR3gTmaksNOhmzgdxcaxdNfMy6anrbM0g==", - "dev": true + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } } } }, @@ -8458,12 +2362,6 @@ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true - }, - "wordwrap": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", - "dev": true } } }, @@ -8492,9 +2390,9 @@ "dev": true }, "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, "has-symbols": { @@ -8521,14 +2419,8 @@ "inherits": "^2.0.4", "readable-stream": "^3.6.0", "safe-buffer": "^5.2.0" - }, - "dependencies": { - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, + }, + "dependencies": { "readable-stream": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", @@ -8539,12 +2431,6 @@ "string_decoder": "^1.1.1", "util-deprecate": "^1.0.1" } - }, - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true } } }, @@ -8621,12 +2507,20 @@ "inherits": "2.0.3", "setprototypeof": "1.1.0", "statuses": ">= 1.4.0 < 2" + }, + "dependencies": { + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + } } }, "http-parser-js": { - "version": "0.4.10", - "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.4.10.tgz", - "integrity": "sha1-ksnBN0w1CF912zWexWzCV8u5P6Q=", + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.5.tgz", + "integrity": "sha512-x+JVEkO2PoM8qqpbPbOL3cqHPwerep7OwzK7Ay+sMQjKzaKCqWvjoXm5tqMP9tXWWTnTzAjIhXg+J99XYuPhPA==", "dev": true }, "https-browserify": { @@ -8645,9 +2539,9 @@ } }, "ieee754": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", - "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", "dev": true }, "immutable": { @@ -8666,9 +2560,9 @@ } }, "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, "ini": { "version": "1.3.8", @@ -8691,11 +2585,11 @@ "integrity": "sha512-ufS5Qq9RZN+Bu899eA9QCAYThY+gGW7oRkmb0vC93Vlyu/CFGcH0OYPEjVkDXA5FEbTt1+VWzdoOD3Ny9N+8tg==", "dev": true, "requires": { + "JSONStream": "^1.0.3", "acorn-node": "^1.5.2", "combine-source-map": "^0.8.0", "concat-stream": "^1.6.1", "is-buffer": "^1.1.0", - "JSONStream": "^1.0.3", "path-is-absolute": "^1.0.1", "process": "~0.11.0", "through2": "^2.0.0", @@ -8831,13 +2725,10 @@ "dev": true }, "is-finite": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", - "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", - "dev": true, - "requires": { - "number-is-nan": "^1.0.0" - } + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.1.0.tgz", + "integrity": "sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==", + "dev": true }, "is-generator-function": { "version": "1.0.10", @@ -8849,9 +2740,9 @@ } }, "is-glob": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", - "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "dev": true, "requires": { "is-extglob": "^2.1.1" @@ -9014,6 +2905,24 @@ "wordwrap": "^1.0.0" }, "dependencies": { + "abbrev": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.9.tgz", + "integrity": "sha1-kbR5JYinc4wl813W9jdSovh3YTU=", + "dev": true + }, + "async": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", + "dev": true + }, + "esprima": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", + "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=", + "dev": true + }, "glob": { "version": "5.0.15", "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", @@ -9056,21 +2965,6 @@ "requires": { "has-flag": "^1.0.0" } - }, - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - }, - "wordwrap": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", - "dev": true } } }, @@ -9105,14 +2999,6 @@ "requires": { "argparse": "^1.0.7", "esprima": "^4.0.0" - }, - "dependencies": { - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true - } } }, "js-yaml-js-types": { @@ -9122,14 +3008,6 @@ "dev": true, "requires": { "esprima": "^4.0.1" - }, - "dependencies": { - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true - } } }, "json-stable-stringify": { @@ -9153,29 +3031,11 @@ "dev": true }, "jsonparse": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-0.0.5.tgz", - "integrity": "sha1-MwVCrT8KZUZlt3jz6y2an6UHrGQ=", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", + "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=", "dev": true }, - "JSONStream": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", - "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", - "dev": true, - "requires": { - "jsonparse": "^1.2.0", - "through": ">=2.2.7 <3" - }, - "dependencies": { - "jsonparse": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", - "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=", - "dev": true - } - } - }, "jstransformer": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/jstransformer/-/jstransformer-1.0.0.tgz", @@ -9270,6 +3130,20 @@ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "dev": true }, + "glob": { + "version": "7.1.7", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", + "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, "js-yaml": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", @@ -9291,72 +3165,6 @@ "multimatch": "^4.0.0", "pkg-up": "^3.1.0", "resolve-pkg": "^2.0.0" - }, - "dependencies": { - "array-differ": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-3.0.0.tgz", - "integrity": "sha512-THtfYS6KtME/yIAhKjZ2ul7XI96lQGHRputJQHO80LAWQnuGP4iCIN8vdMRboGbIEYBwU33q8Tch1os2+X0kMg==", - "dev": true - }, - "array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true - }, - "arrify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", - "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==", - "dev": true - }, - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "requires": { - "locate-path": "^3.0.0" - } - }, - "multimatch": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/multimatch/-/multimatch-4.0.0.tgz", - "integrity": "sha512-lDmx79y1z6i7RNx0ZGCPq1bzJ6ZoDDKbvh7jxr9SJcWLkShMzXrHbYVpTdnhNM5MXpDUxCQ4DgqVttVXlBgiBQ==", - "dev": true, - "requires": { - "@types/minimatch": "^3.0.3", - "array-differ": "^3.0.0", - "array-union": "^2.1.0", - "arrify": "^2.0.1", - "minimatch": "^3.0.4" - } - }, - "pkg-up": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-3.1.0.tgz", - "integrity": "sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==", - "dev": true, - "requires": { - "find-up": "^3.0.0" - } - }, - "resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true - }, - "resolve-pkg": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/resolve-pkg/-/resolve-pkg-2.0.0.tgz", - "integrity": "sha512-+1lzwXehGCXSeryaISr6WujZzowloigEofRB+dj75y9RRa/obVcYgbHJd53tdYw8pvZj8GojXaaENws8Ktw/hQ==", - "dev": true, - "requires": { - "resolve-from": "^5.0.0" - } - } } }, "locate-path": { @@ -9367,14 +3175,6 @@ "requires": { "p-locate": "^3.0.0", "path-exists": "^3.0.0" - }, - "dependencies": { - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true - } } }, "lodash": { @@ -9512,9 +3312,9 @@ }, "dependencies": { "bn.js": { - "version": "4.11.9", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", - "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", "dev": true } } @@ -9526,18 +3326,18 @@ "dev": true }, "mime-db": { - "version": "1.43.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.43.0.tgz", - "integrity": "sha512-+5dsGEEovYbT8UY9yD7eE4XTc4UwJ1jBYlgaQQF38ENsKR3wj/8q8RFZrF9WIZpB2V1ArTVFUva8sAul1NzRzQ==", + "version": "1.51.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.51.0.tgz", + "integrity": "sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g==", "dev": true }, "mime-types": { - "version": "2.1.26", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.26.tgz", - "integrity": "sha512-01paPWYgLrkqAyrlDorC1uDwl2p3qZT7yl806vW7DvDoxwXi46jsjFbg+WdwotBIk6/MbEhO/dh5aZ5sNj/dWQ==", + "version": "2.1.34", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.34.tgz", + "integrity": "sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A==", "dev": true, "requires": { - "mime-db": "1.43.0" + "mime-db": "1.51.0" } }, "minimalistic-assert": { @@ -9584,6 +3384,7 @@ "integrity": "sha512-fg7OZaQBcL4/L+AK5f4iVqf9OMbCclXfy/znXRxTVhJSeW5AIlS9AwheYwDaXM3lVW7OBeaeUEY3gbaC6cLlSA==", "dev": true, "requires": { + "JSONStream": "^1.0.3", "browser-resolve": "^2.0.0", "cached-path-relative": "^1.0.2", "concat-stream": "~1.6.0", @@ -9591,7 +3392,6 @@ "detective": "^5.2.0", "duplexer2": "^0.1.2", "inherits": "^2.0.1", - "JSONStream": "^1.0.3", "parents": "^1.0.0", "readable-stream": "^2.0.2", "resolve": "^1.4.0", @@ -9639,6 +3439,19 @@ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", "dev": true }, + "multimatch": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/multimatch/-/multimatch-4.0.0.tgz", + "integrity": "sha512-lDmx79y1z6i7RNx0ZGCPq1bzJ6ZoDDKbvh7jxr9SJcWLkShMzXrHbYVpTdnhNM5MXpDUxCQ4DgqVttVXlBgiBQ==", + "dev": true, + "requires": { + "@types/minimatch": "^3.0.3", + "array-differ": "^3.0.0", + "array-union": "^2.1.0", + "arrify": "^2.0.1", + "minimatch": "^3.0.4" + } + }, "negotiator": { "version": "0.6.2", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", @@ -9817,9 +3630,9 @@ } }, "p-limit": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.2.tgz", - "integrity": "sha512-WGR+xHecKTr7EbUEhyLSh5Dube9JtdiG78ufaeLxTgpudf/20KqyMioIUZJAezlTIi6evxuoUs9YXc11cU+yzQ==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, "requires": { "p-try": "^2.0.0" @@ -9865,14 +3678,13 @@ } }, "parse-asn1": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.5.tgz", - "integrity": "sha512-jkMYn1dcJqF6d5CpU689bq7w/b5ALS9ROVSpQDPrZsqqesUJii9qutvoT5ltGedNXMO2e16YUWIghG9KxaViTQ==", + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.6.tgz", + "integrity": "sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==", "dev": true, "requires": { - "asn1.js": "^4.0.0", + "asn1.js": "^5.2.0", "browserify-aes": "^1.0.0", - "create-hash": "^1.1.0", "evp_bytestokey": "^1.0.0", "pbkdf2": "^3.0.3", "safe-buffer": "^5.1.1" @@ -9923,6 +3735,12 @@ "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==", "dev": true }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + }, "path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", @@ -9962,9 +3780,9 @@ "dev": true }, "pbkdf2": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.1.tgz", - "integrity": "sha512-4Ejy1OPxi9f2tt1rRV7Go7zmfDQ+ZectEQz3VGUQhgq62HtIRPDyG/JtnwIxs6x3uNMwo2V7q1fMvKjb+Tnpqg==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz", + "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==", "dev": true, "requires": { "create-hash": "^1.1.2", @@ -9975,11 +3793,20 @@ } }, "picomatch": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", - "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "dev": true }, + "pkg-up": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-3.1.0.tgz", + "integrity": "sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==", + "dev": true, + "requires": { + "find-up": "^3.0.0" + } + }, "plur": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/plur/-/plur-1.0.0.tgz", @@ -10050,9 +3877,9 @@ }, "dependencies": { "bn.js": { - "version": "4.11.9", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", - "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", "dev": true } } @@ -10200,10 +4027,13 @@ "dev": true }, "qs": { - "version": "6.9.6", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.6.tgz", - "integrity": "sha512-TIRk4aqYLNoJUbd+g2lEdz5kLWIuTMRagAXxl78Q0RiVjAOugHmeKNGdd3cwo/ktpf9aL9epCfFqWDEKysUlLQ==", - "dev": true + "version": "6.10.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.3.tgz", + "integrity": "sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==", + "dev": true, + "requires": { + "side-channel": "^1.0.4" + } }, "querystring": { "version": "0.2.0", @@ -10267,12 +4097,6 @@ "toidentifier": "1.0.1" } }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, "setprototypeof": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", @@ -10303,6 +4127,23 @@ "safe-buffer": "~5.1.1", "string_decoder": "~1.1.1", "util-deprecate": "~1.0.1" + }, + "dependencies": { + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } } }, "readdirp": { @@ -10342,12 +4183,12 @@ "dev": true }, "resolve": { - "version": "1.21.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.21.0.tgz", - "integrity": "sha512-3wCbTpk5WJlyE4mSOtDLhqQmGFi0/TD9VPwmiolnk8U0wRgMEktqCXd3vy5buTO3tljvalNvKrjHEfrd2WpEKA==", + "version": "1.22.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz", + "integrity": "sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==", "dev": true, "requires": { - "is-core-module": "^2.8.0", + "is-core-module": "^2.8.1", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" } @@ -10362,13 +4203,44 @@ "global-modules": "^1.0.0" } }, + "resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true + }, + "resolve-pkg": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/resolve-pkg/-/resolve-pkg-2.0.0.tgz", + "integrity": "sha512-+1lzwXehGCXSeryaISr6WujZzowloigEofRB+dj75y9RRa/obVcYgbHJd53tdYw8pvZj8GojXaaENws8Ktw/hQ==", + "dev": true, + "requires": { + "resolve-from": "^5.0.0" + } + }, "rimraf": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", - "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", "dev": true, "requires": { "glob": "^7.1.3" + }, + "dependencies": { + "glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + } } }, "ripemd160": { @@ -10382,9 +4254,9 @@ } }, "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", "dev": true }, "safe-json-parse": { @@ -10453,12 +4325,6 @@ "toidentifier": "1.0.1" } }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, "ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", @@ -10521,9 +4387,9 @@ } }, "shell-quote": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.2.tgz", - "integrity": "sha512-mRz/m/JVscCrkMyPqHc/bczi3OQHkLTqXHEFu0zDhK/qfv3UcOA4SVmRCLmos4bhjr9ekVQubj/R7waKapmiQg==", + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.3.tgz", + "integrity": "sha512-Vpfqwm4EnqGdlsBFNmHhxhElJYrdfcxPThu+ryKS5J8L/fhAwLazFZtq+S+TWZ9ANj2piSQLGj6NQg+lKPmxrw==", "dev": true }, "side-channel": { @@ -10538,9 +4404,9 @@ } }, "simple-concat": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.0.tgz", - "integrity": "sha1-c0TLuLbib7J9ZrL8hvn21Zl1IcY=", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", + "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", "dev": true }, "source-map": { @@ -10556,9 +4422,9 @@ "dev": true }, "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.2.tgz", + "integrity": "sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug==", "dev": true }, "ssl-root-cas": { @@ -10597,9 +4463,9 @@ } }, "stream-http": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-3.1.1.tgz", - "integrity": "sha512-S7OqaYu0EkFpgeGFb/NPOoPLxFko7TPqtEeFg5DXPB4v/KETHG0Ln6fRFrNezoelpaDKmycEmmZ81cC9DAwgYg==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-3.2.0.tgz", + "integrity": "sha512-Oq1bLqisTyK3TSCXpPbT4sdeYNdmyZJv1LxpEm2vu1ZhK89kSE5YXwZc3cWk0MagGaKriBh9mCFbVGtO+vY29A==", "dev": true, "requires": { "builtin-status-codes": "^3.0.0", @@ -10608,12 +4474,6 @@ "xtend": "^4.0.2" }, "dependencies": { - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, "readable-stream": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", @@ -10637,15 +4497,6 @@ "readable-stream": "^2.0.2" } }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - }, "string-template": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/string-template/-/string-template-0.2.1.tgz", @@ -10672,6 +4523,15 @@ "define-properties": "^1.1.3" } }, + "string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "requires": { + "safe-buffer": "~5.2.0" + } + }, "strip-ansi": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", @@ -10691,12 +4551,12 @@ } }, "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "requires": { - "has-flag": "^3.0.0" + "has-flag": "^4.0.0" } }, "supports-preserve-symlinks-flag": { @@ -10721,9 +4581,9 @@ "dev": true }, "through": { - "version": "2.2.7", - "resolved": "https://registry.npmjs.org/through/-/through-2.2.7.tgz", - "integrity": "sha1-bo4hIAGR1OtqmfbwEN9Gqhxusr0=", + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", "dev": true }, "through2": { @@ -10808,18 +4668,18 @@ }, "dependencies": { "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, "requires": { "ms": "^2.1.1" } }, "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "dev": true } } @@ -10891,9 +4751,9 @@ "dev": true }, "uglify-js": { - "version": "3.14.5", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.14.5.tgz", - "integrity": "sha512-qZukoSxOG0urUTvjc2ERMTcAy+BiFh3weWAkeurLwjrCba73poHmG3E36XEjd/JGukMzwTL7uCxZiAexj8ppvQ==", + "version": "3.15.0", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.15.0.tgz", + "integrity": "sha512-x+xdeDWq7FiORDvyIJ0q/waWd4PhjBNOm5dQUOq2AKC0IEjxOS66Ha9tctiVDGcRQuh69K7fgU5oRuTK4cysSg==", "dev": true }, "umd": { @@ -10934,12 +4794,12 @@ } }, "underscore.string": { - "version": "3.3.5", - "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-3.3.5.tgz", - "integrity": "sha512-g+dpmgn+XBneLmXXo+sGlW5xQEt4ErkS3mgeN2GFbremYeMBSJKr9Wf2KJplQVaiPY/f7FN6atosWYNm9ovrYg==", + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-3.3.6.tgz", + "integrity": "sha512-VoC83HWXmCrF6rgkyxS9GHv8W9Q5nhMKho+OadDJGzL2oDYbYEppBaCMH6pFlwLeqj2QS+hhkw2kpXkSdD1JxQ==", "dev": true, "requires": { - "sprintf-js": "^1.0.3", + "sprintf-js": "^1.1.1", "util-deprecate": "^1.0.2" } }, @@ -10980,6 +4840,14 @@ "dev": true, "requires": { "inherits": "2.0.3" + }, + "dependencies": { + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + } } }, "util-deprecate": { @@ -11052,6 +4920,7 @@ "integrity": "sha512-SaHqzhku9v/j6XsQMRxPyBrSP3gnwmE27gLJYZgMT2GeK3J0+0toN+MnuNYDfHwVGQfLiMZ7KSNSIXHemy905w==", "dev": true, "requires": { + "JSONStream": "^1.0.3", "assert": "^1.4.0", "browser-pack": "^6.0.1", "browser-resolve": "^2.0.0", @@ -11073,7 +4942,6 @@ "https-browserify": "^1.0.0", "inherits": "~2.0.1", "insert-module-globals": "^7.2.1", - "JSONStream": "^1.0.3", "labeled-stream-splicer": "^2.0.0", "mkdirp-classic": "^0.5.2", "module-deps": "^6.2.3", @@ -11120,11 +4988,19 @@ "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", "dev": true }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true + "glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } }, "path-browserify": { "version": "1.0.1", @@ -11194,12 +5070,12 @@ } }, "websocket-driver": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.3.tgz", - "integrity": "sha512-bpxWlvbbB459Mlipc5GBzzZwhoZgGEZLuqPaR0INBGnPAY1vdBX6hPnoFXiw+3yWxDuHyQjO2oXTMyS8A5haFg==", + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", + "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", "dev": true, "requires": { - "http-parser-js": ">=0.4.0 <0.4.11", + "http-parser-js": ">=0.5.1", "safe-buffer": ">=5.1.0", "websocket-extensions": ">=0.1.1" } @@ -11211,9 +5087,9 @@ "dev": true }, "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", "dev": true, "requires": { "isexe": "^2.0.0" @@ -11265,6 +5141,12 @@ "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", "dev": true }, + "wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", + "dev": true + }, "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", From 47c0e95cd059724f2c36565b0da95d87b4c38d1a Mon Sep 17 00:00:00 2001 From: ocket8888 Date: Fri, 29 Oct 2021 12:02:15 -0600 Subject: [PATCH 26/98] Add explicit build command --- dev/atc.dev.sh | 37 +++++++++++++++++++++---------------- 1 file changed, 21 insertions(+), 16 deletions(-) diff --git a/dev/atc.dev.sh b/dev/atc.dev.sh index 1ea57cd02f..61a621e27c 100644 --- a/dev/atc.dev.sh +++ b/dev/atc.dev.sh @@ -16,6 +16,7 @@ # under the License. alias atc-start="docker-compose up -d --build"; +alias atc-build="docker-compose build"; alias atc-stop="docker-compose down -v --remove-orphans"; alias atc-restart="atc-stop && atc-start"; @@ -52,39 +53,43 @@ function atc { local arg="$1"; shift; case "$arg" in + build) + atc-build $@;; + connect) + atc-connect $@;; + exec) + atc-exec $@;; + ready) + atc-ready $@;; + restart) + atc-restart $@;; start) atc-start $@;; stop) atc-stop $@;; - restart) - atc-restart $@;; - ready) - atc-ready $@;; - exec) - atc-exec $@;; - connect) - atc-connect $@;; -h|--help|/\?) echo "Usage: atc OPERATION"; echo ""; echo "Valid OPERATIONs:"; + echo " build Build the images for the environment, but do not start it"; + echo " connect Connect to a shell session inside a dev container"; + echo " exec Run a command in a dev container"; + echo " ready Check if the development environment is ready"; + echo " restart Retart up the development environment"; echo " start Start up the development environment"; echo " stop Stop the development environment"; - echo " restart Retart up the development environment"; - echo " ready Check if the development environment is ready"; - echo " exec Run a command in a dev container"; - echo " connect Connect to a shell session inside a dev container"; ;; *) echo "Usage: atc OPERATION" >&2; echo "" >&2; echo "Valid OPERATIONs:" >&2; + echo " build Build the images for the environment, but do not start it" >&2; + echo " connect Connect to a shell session inside a dev container" >&2; + echo " exec Run a command in a dev container" >&2; + echo " ready Check if the development environment is ready" >&2; + echo " restart Retart up the development environment" >&2; echo " start Start up the development environment" >&2; echo " stop Stop the development environment" >&2; - echo " restart Retart up the development environment" >&2; - echo " ready Check if the development environment is ready" >&2; - echo " exec Run a command in a dev container" >&2; - echo " connect Connect to a shell session inside a dev container" >&2; return 2;; esac return "$?"; From 61a76d547bed36d0032788220089f73f356cc383 Mon Sep 17 00:00:00 2001 From: ocket8888 Date: Fri, 29 Oct 2021 15:10:39 -0600 Subject: [PATCH 27/98] Add -w/--wait to atc ready which blocks until ATC is read, and -h to explain it --- dev/atc.dev.sh | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/dev/atc.dev.sh b/dev/atc.dev.sh index 61a621e27c..76e4cd7a90 100644 --- a/dev/atc.dev.sh +++ b/dev/atc.dev.sh @@ -21,7 +21,29 @@ alias atc-stop="docker-compose down -v --remove-orphans"; alias atc-restart="atc-stop && atc-start"; function atc-ready { - curl -skL https://localhost:6443/api/4.0/ping >/dev/null 2>&1; + local url="https://localhost:6443/api/4.0/ping"; + if [[ $# -gt 0 ]]; then + case "$1" in + -w|--wait) + while ! curl -skL "$url" >/dev/null 2>&1; do + sleep 1; + done + return 0;; + -h|--help) + echo "Usage: $0 [-h] [-w]"; + echo ""; + echo "-h, --help print usage information and exit"; + echo "-w, --wait wait for ATC to be ready, instead of just checking if it is ready"; + return 0;; + *) + echo "Usage: $0 [-h] [-w]" >&2; + echo "" >&2; + echo "-h, --help print usage information and exit" >&2; + echo "-w, --wait wait for ATC to be ready, instead of just checking if it is ready" >&2; + return 1;; + esac + fi + curl -skL "$url" >/dev/null 2>&1; return $?; } From 9427a74ddfa907d6a5fe0452737390e73d2bce92 Mon Sep 17 00:00:00 2001 From: ocket8888 Date: Fri, 29 Oct 2021 15:11:08 -0600 Subject: [PATCH 28/98] Remove invalid make targets --- Makefile | 2 +- cache-config/Makefile | 4 +--- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/Makefile b/Makefile index 348c44f103..0a0986e5a0 100644 --- a/Makefile +++ b/Makefile @@ -17,7 +17,7 @@ CACHE_CONFIG_DIRS=$(filter-out cache-config/testing/ cache-config/build/,$(wildcard cache-config/*/)) TO_SOURCE=$(filter-out %_test.go,$(wildcard traffic_ops/traffic_ops_golang/**.go)) -T3C_TARGETS := cache-config/t3c/t3c cache-config/t3c-apply/t3c-apply cache-config/t3c-check/t3c-check t3c-check-refs/t3c-check-refs t3c-check-reload/t3c-check-reload cache-config/t3c-diff/t3c-diff cache-config/t3c-generate/t3c-generate cache-config/t3c-preprocess/t3c-preprocess cache-config/t3c-request/t3c-request cache-config/t3c-update/t3c-update cache-config/tm-health-client/tm-health-client +T3C_TARGETS := cache-config/t3c/t3c cache-config/t3c-apply/t3c-apply cache-config/t3c-check/t3c-check t3c-check-refs/t3c-check-refs t3c-check-reload/t3c-check-reload cache-config/t3c-diff/t3c-diff cache-config/t3c-generate/t3c-generate cache-config/t3c-preprocess/t3c-preprocess cache-config/t3c-request/t3c-request cache-config/t3c-update/t3c-update .PHONY: lint unit all check diff --git a/cache-config/Makefile b/cache-config/Makefile index a6b63405c9..69f8069bfe 100644 --- a/cache-config/Makefile +++ b/cache-config/Makefile @@ -24,7 +24,7 @@ TC_VERSION ?= $(shell cat ../VERSION) GO_FLAGS ?= PANDOC_FLAGS := --strip-comments -TARGETS := t3c/t3c t3c-apply/t3c-apply t3c-check/t3c-check t3c-check-refs/t3c-check-refs t3c-check-reload/t3c-check-reload t3c-diff/t3c-diff t3c-generate/t3c-generate t3c-preprocess/t3c-preprocess t3c-request/t3c-request t3c-update/t3c-update tm-health-client/tm-health-client +TARGETS := t3c/t3c t3c-apply/t3c-apply t3c-check/t3c-check t3c-check-refs/t3c-check-refs t3c-check-reload/t3c-check-reload t3c-diff/t3c-diff t3c-generate/t3c-generate t3c-preprocess/t3c-preprocess t3c-request/t3c-request t3c-update/t3c-update .PHONY: debug all man rst clean @@ -83,8 +83,6 @@ t3c-request/t3c-request: $(wildcard t3c-request/**/*.go) $(wildcard t3c-request/ go build -o $@ $(GO_FLAGS) github.com/apache/trafficcontrol/cache-config/$(dir $@) t3c-update/t3c-update: $(wildcard t3c-update/**/*.go) $(wildcard t3c-update/*.go) go build -o $@ $(GO_FLAGS) github.com/apache/trafficcontrol/cache-config/$(dir $@) -tm-health-client/tm-health-client: $(wildcard tm-health-client/**/*.go) $(wildcard tm-health-client/*.go) - go build -o $@ $(GO_FLAGS) github.com/apache/trafficcontrol/cache-config/$(dir $@) debug: GO_FLAGS=--gcflags "all=-N -l" debug: all From 8dd0ea50fd244b2f2f9c70cae3fe631a98fc2e61 Mon Sep 17 00:00:00 2001 From: ocket8888 Date: Mon, 1 Nov 2021 11:58:30 -0600 Subject: [PATCH 29/98] Add TR configuration files --- dev/traffic_router/conf/https.properties | 14 ++++++ dev/traffic_router/conf/keyStore.jks | Bin 0 -> 2364 bytes dev/traffic_router/conf/log4j.properties | 28 +++++++++++ dev/traffic_router/conf/logging.properties | 21 ++++++++ dev/traffic_router/conf/server.xml | 45 ++++++++++++++++++ dev/traffic_router/conf/startup.properties | 30 ++++++++++++ .../conf/traffic_monitor.properties | 15 ++++++ .../conf/traffic_ops.properties | 13 +++++ .../conf/trafficrouter.dev.ciab.test.crt | 23 +++++++++ dev/traffic_router/conf/web.xml | 38 +++++++++++++++ 10 files changed, 227 insertions(+) create mode 100644 dev/traffic_router/conf/https.properties create mode 100644 dev/traffic_router/conf/keyStore.jks create mode 100644 dev/traffic_router/conf/log4j.properties create mode 100644 dev/traffic_router/conf/logging.properties create mode 100644 dev/traffic_router/conf/server.xml create mode 100644 dev/traffic_router/conf/startup.properties create mode 100644 dev/traffic_router/conf/traffic_monitor.properties create mode 100644 dev/traffic_router/conf/traffic_ops.properties create mode 100644 dev/traffic_router/conf/trafficrouter.dev.ciab.test.crt create mode 100644 dev/traffic_router/conf/web.xml diff --git a/dev/traffic_router/conf/https.properties b/dev/traffic_router/conf/https.properties new file mode 100644 index 0000000000..8f53aab8a8 --- /dev/null +++ b/dev/traffic_router/conf/https.properties @@ -0,0 +1,14 @@ +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +https.certificate.location=/opt/tomcat/conf/keyStore.jks +https.password=changeit diff --git a/dev/traffic_router/conf/keyStore.jks b/dev/traffic_router/conf/keyStore.jks new file mode 100644 index 0000000000000000000000000000000000000000..fee5429abbad4dc2f19f178bef6f58d982cedfb3 GIT binary patch literal 2364 zcmd5-X*AT28lFA-m>K&XB4hgvvc!Ze87hoIw#YgeW=w;BmSjoRlr6HPY0C8{5wavA zWv`4aYavtFQ3+T+-t(U4Iq!SUd!F;0=iOc0T?BzZko^MxDRDZ@!^el@ zNuvbQy=iJ*-XUt9B##Sfbni>_{h5f~ifjQ82o42eV0!=`f=d|zhJmpV6c`K#!D3+Z zaJ%^CbI*)V){{bRSjL@sRMzVO)fyr?YohB49uCgwqiP_1HTd7+Z< zTw)PN9)~#aM)J+9z(v~#L@Moh!z>qxh#juv=JTg)XId%vY*dA}6qBME;#sI|S0RM? zp~(lYHp9yxReF(|S%EnH%D#6xD?tN~l#aQ2!p(Rk3pP*HF1DOx-(FCo_L#>Eqm&uv z@<2WbI7y73zKh%g;Ayb_q zQ@WR3drM}d?#!+FWc!6_-yBLdc9&BvxBk15$e{QWFCG3eL{bWS%kSAOqx`yiV_s^#m8+XUGhAk1ws+!7Y>zi`Gp|e6x)yw`*l+a(IYFFDb6lyvfo+gF1iiYYO z#7^5WziyA2NIU8}@}9uWE=07PTjpk^eqcFkImHwC^(WK9kBYl(edTBkiZ^N+)ul}D zjcJ4!+ai$>BdW>g4Ia+cjVE$`XpT_wsctC*?5Nwcul39LQCING#`dCvymgAK12tRh z<|fUR@i13g4n?P;YffTU>PEhEmqzwc5>jmh-#R5LjMlzvpTC>$aqCT|onR|yGjg3N zs^B7k>n$2^x!RQX>yqPK!$)01GEAsT8$MfdE#xl59d)^BQ=9wDHNu*aPUa*kEdn5muIvG{RmLjB_=;&gjXl6AbITWp2c7R=0Lk z6*;L!!hY0~=Igj})E>BXhfV8v!m=ku#74~o#V(qOzmv)Y)RVvAcPG%wPqCAkdEI3P zd`*dv8J2&5#ho0`LM`>88(&+XjU4{Umd?TLY2RE|`)uQWd2E8f+G=;=Pwa!GpACB= zTEBRTQ>~@E-xH5>9Nach5Cyv@KQmN>4r=f-pYrBcpTE)YppwMDchSURPFQa`0a>1& zH-J!@bQj>c%i}r)ySXNdw7kq(i(qkwGj)faJ{ceypwrAwC?2rBF6t6s=V3Aeh32IM9AV{W1_80nSt!5&8p+OoLz^X z5!>Rf&NuTXu(d4J(7z;z3ppOxCjnH6)s^>MvH@~I3jWPA*SFL;(iJFggqW|i?U)Pv zF=xmn0`am(s#oU!HWfP9Bi`O+qpME6)Kb zVO|X!4$#ok0B~BGT28{en!lmWf8qb#y)j_fe@eRla-cC_BnXHBb3tOjU=XXMTG*>G zET}B4z$TTtYi9r6%2OS6tf4Ko>~;YzaJ`|VGy1V-@Ns$tT7SBPa%g97{@SOpq^Q~n z)IBdz$xPjNI?_m92VSrRyO?_jANE(Ev*Cy;+WCiKj&%BDoXSggCEb7_IpNLZwg-_c z(XPDOR-A~K^3p)GL11&JieviPN{U*n|7WeFlm1~NTulovDo3fT5BWJinuG$~%$aq? ziKmV`;H$?uR{2~1x>w0-n5YK^4f+&(#cg2M8%NABK<%ES(-#V-+wpcd%+PYZA={~hfZPJYP=iFu|RF88NEMq*l0RFpK{ z;I2+GdTwkfAh1*=H=)Op)6sNP{T2y%L_{-M`Zd>Bn%^j^(mI*&;1Ip8@3Ev}5M-(8 z)Aj6(*r==vgn3O2e-(TujYqYfbI$ST^kD^;(Sg|U45)NuePNF#XKUT?MW}QGJe(0l z$V$(*uqE4+KYu<|_F2E%37pcVvU + + + + + + + + + + + + + + + + + + + + + + + diff --git a/dev/traffic_router/conf/startup.properties b/dev/traffic_router/conf/startup.properties new file mode 100644 index 0000000000..91ca01efc7 --- /dev/null +++ b/dev/traffic_router/conf/startup.properties @@ -0,0 +1,30 @@ +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Any environment variables you define here will become part of the startup +# environment for the 'traffic_router' service. It is a good place to set +# command line arguments for the Java command line or any environment specific +# setting you want available to the traffic_router process. +# This file is not replaced by the update process when a new version of traffic +# router is installed. +CATALINA_OPTS="\ + -server -Xms2g -Xmx8g \ + -Dlog4j.configuration=file:///opt/tomcat/conf/log4j.properties \ + -Djava.library.path=/usr/lib \ + -Dorg.apache.catalina.connector.Response.ENFORCE_ENCODING_IN_GET_WRITER=false \ + -XX:+UseG1GC \ + -XX:+UnlockExperimentalVMOptions \ + -XX:InitiatingHeapOccupancyPercent=30" +JAVA_OPTS="\ + -Djava.awt.headless=true \ + -Djava.security.egd=file:/dev/./urandom" diff --git a/dev/traffic_router/conf/traffic_monitor.properties b/dev/traffic_router/conf/traffic_monitor.properties new file mode 100644 index 0000000000..386574d8b0 --- /dev/null +++ b/dev/traffic_router/conf/traffic_monitor.properties @@ -0,0 +1,15 @@ +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +traffic_monitor.bootstrap.hosts=trafficmonitor:80; +traffic_monitor.bootstrap.local = false +traffic_monitor.properties=file:/opt/tomcat/conf/traffic_monitor.properties +traffic_monitor.properties.reload.period=60000 diff --git a/dev/traffic_router/conf/traffic_ops.properties b/dev/traffic_router/conf/traffic_ops.properties new file mode 100644 index 0000000000..80d9b01154 --- /dev/null +++ b/dev/traffic_router/conf/traffic_ops.properties @@ -0,0 +1,13 @@ +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +traffic_ops.username=admin +traffic_ops.password=twelve12 diff --git a/dev/traffic_router/conf/trafficrouter.dev.ciab.test.crt b/dev/traffic_router/conf/trafficrouter.dev.ciab.test.crt new file mode 100644 index 0000000000..3e3267ef9c --- /dev/null +++ b/dev/traffic_router/conf/trafficrouter.dev.ciab.test.crt @@ -0,0 +1,23 @@ +-----BEGIN CERTIFICATE----- +MIID2TCCAsGgAwIBAgIECbxoVzANBgkqhkiG9w0BAQsFADCBjTELMAkGA1UEBhMC +VVMxETAPBgNVBAgTCENvbG9yYWRvMQ8wDQYDVQQHEwZEZW52ZXIxHzAdBgNVBAoT +FkFwYWNoZSBUcmFmZmljIENvbnRyb2wxEzARBgNVBAsTCkFQSURlZmF1bHQxJDAi +BgNVBAMTG3RyYWZmaWNyb3V0ZXIuZGV2LmNpYWIudGVzdDAeFw0yMTEwMjkyMDE0 +MzRaFw0zMTEwMjcyMDE0MzRaMIGNMQswCQYDVQQGEwJVUzERMA8GA1UECBMIQ29s +b3JhZG8xDzANBgNVBAcTBkRlbnZlcjEfMB0GA1UEChMWQXBhY2hlIFRyYWZmaWMg +Q29udHJvbDETMBEGA1UECxMKQVBJRGVmYXVsdDEkMCIGA1UEAxMbdHJhZmZpY3Jv +dXRlci5kZXYuY2lhYi50ZXN0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC +AQEA0qm0F2S8enGsj51QjXD+RVbYS2MvET66xIOsl50xbva6qcmBr2N1QnSwEjvi +qW8l/f/rheTbin+33RGhZBkdlDiGdA9AJDcFnfoEapklPXp4bls/2S0SW/QnmB+S +3oQsw2ApOG3WIxf4i8SlfdIZypu3wjEYGivu1IE8br93LFiS9fCMLoNr5zSKTGt6 +2Qq+7MCx2nDS35yY9L4Wbl5GpLiniU1CVz203AjyEMJ4obENP4k5AgBgmV21Qu9r +CdT9KTXuCyS1VekaRQrRYTAC4bPH2RKxzPYge6AcvKU/DgkPObAb0rDJHDscZ5eg +s9udg7CcrFv1aaGyGU8fRTcVDwIDAQABoz8wPTAPBgNVHRMBAf8EBTADAQH/MAsG +A1UdDwQEAwICpDAdBgNVHQ4EFgQUY9QVEWlky7Bi21tW9pconfsKh28wDQYJKoZI +hvcNAQELBQADggEBAGgTkpfYzchX3HV0nbj3Gv8yVP9IdDOEKpku8XzaF29rjuNJ +1TAgJV5ZiW2N7HKGa7dI9kvirWBliStSyB7t6HyJAMED2OTsBXAQmjaCCRAd3Rzr +pCMxmfkUk4mPin9/Hz08nzeLEurb7m1uqyyZiMxKCVhE2i+RaQ81GDOBH8YK249o +2tKxT4tJpSV0uNGvHSdxAu6+5IeWk4N/lWJJ6zMTELMF/Y8MLbkJ6lg64igmXNrU +g9yTAx99uZ7MMwnCuNdqAx+6BXuif0mVkpxIUWxQrr294aznO8taAYzELPI+P4yU +qy5sinTvvDuPNqncH0AfixT6Bk0ObnnmD1WDbEE= +-----END CERTIFICATE----- diff --git a/dev/traffic_router/conf/web.xml b/dev/traffic_router/conf/web.xml new file mode 100644 index 0000000000..0e56fccc91 --- /dev/null +++ b/dev/traffic_router/conf/web.xml @@ -0,0 +1,38 @@ + + + + + default + org.apache.catalina.servlets.DefaultServlet + + debug + 1 + + + listings + false + + 1 + + + From 93e428338e708b2e14776a4d20ce3cfcf26b731a Mon Sep 17 00:00:00 2001 From: ocket8888 Date: Mon, 31 Jan 2022 16:54:03 -0700 Subject: [PATCH 30/98] Fix license issues --- .dependency_license | 2 ++ dev/traffic_monitor/run.sh | 16 ++++++++++++++++ dev/traffic_ops/run.sh | 16 ++++++++++++++++ dev/traffic_router/run.sh | 16 ++++++++++++++++ 4 files changed, 50 insertions(+) diff --git a/.dependency_license b/.dependency_license index bdf745009a..986ddd5d04 100644 --- a/.dependency_license +++ b/.dependency_license @@ -54,6 +54,7 @@ traffic_router/core/src/test/resources/api/2.0/cdns/name/thecdn/sslkeys(-missing traffic_router/core/src/test/resources/api/2.0/steering*, Apache-2.0 traffic_router/core/src/test/resources/api/2.0/federations/all, Apache-2.0 BUILD_NUMBER$, Apache-2.0 +\.jks, Apache-2.0 # Java Key Store # Images, created for this project or used under an Apache license. ^misc/logos/ATC-PNG\.png, Apache-2.0 @@ -74,6 +75,7 @@ BUILD_NUMBER$, Apache-2.0 # Demo certificates ssl\.(crt|key)$, Apache-2.0 +trafficrouter.dev.ciab.test.crt, Apache-2.0 /keystore, Apache-2.0 # Uncommentable files diff --git a/dev/traffic_monitor/run.sh b/dev/traffic_monitor/run.sh index 6dd179d3f4..cd3b655ad6 100755 --- a/dev/traffic_monitor/run.sh +++ b/dev/traffic_monitor/run.sh @@ -1,4 +1,20 @@ #!/bin/sh +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. set -o errexit trap '[ $? -eq 0 ] && exit 0 || echo "Error on line ${LINENO} of ${0}"; exit 1' EXIT diff --git a/dev/traffic_ops/run.sh b/dev/traffic_ops/run.sh index 0f645dec22..6da2320ebc 100755 --- a/dev/traffic_ops/run.sh +++ b/dev/traffic_ops/run.sh @@ -1,4 +1,20 @@ #!/bin/sh +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. set -o errexit trap '[ $? -eq 0 ] && exit 0 || echo "Error on line ${LINENO} of ${0}"; exit 1' EXIT diff --git a/dev/traffic_router/run.sh b/dev/traffic_router/run.sh index c56445f6d9..5bc8e41d00 100755 --- a/dev/traffic_router/run.sh +++ b/dev/traffic_router/run.sh @@ -1,4 +1,20 @@ #!/bin/sh +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. set -o errexit trap '[ $? -eq 0 ] && exit 0 || echo "Error on line ${LINENO} of ${0}"; exit 1' EXIT From 11c5f40dc6cc1864cea5bbc673a21f886e8d2166 Mon Sep 17 00:00:00 2001 From: ocket8888 Date: Tue, 1 Feb 2022 10:28:29 -0700 Subject: [PATCH 31/98] Remove development assets from CiaB workflow trigger paths --- .github/workflows/ciab.yaml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/.github/workflows/ciab.yaml b/.github/workflows/ciab.yaml index 1cac861813..659f4e3044 100644 --- a/.github/workflows/ciab.yaml +++ b/.github/workflows/ciab.yaml @@ -49,6 +49,9 @@ on: - 'traffic_control/java/**' - 'cache-config/testing/**' - 'traffic_ops/testing/**' + - 'dev/**' + - 'Makefile' + - 'cache-config/Makefile' create: pull_request: paths-ignore: @@ -76,6 +79,9 @@ on: - 'traffic_control/java/**' - 'cache-config/testing/**' - 'traffic_ops/testing/**' + - 'dev/**' + - 'Makefile' + - 'cache-config/Makefile' types: [ opened, reopened, ready_for_review, synchronize ] jobs: From 8375e9fd57a17a33a0480bd477b585c4a8ef08e0 Mon Sep 17 00:00:00 2001 From: ocket8888 Date: Tue, 1 Feb 2022 10:37:27 -0700 Subject: [PATCH 32/98] Replace ENTRYPOINT with CMD --- dev/t3c/Dockerfile | 2 +- dev/tpv2/Dockerfile | 2 +- dev/traffic_monitor/Dockerfile | 2 +- dev/traffic_ops/Dockerfile | 2 +- dev/traffic_portal/Dockerfile | 2 +- dev/traffic_router/Dockerfile | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/dev/t3c/Dockerfile b/dev/t3c/Dockerfile index 481fb4bb11..ae798613ca 100644 --- a/dev/t3c/Dockerfile +++ b/dev/t3c/Dockerfile @@ -45,4 +45,4 @@ RUN apk add --no-cache make inotify-tools go pcre libexecinfo && \ RUN echo "stats_over_http.so" >> /etc/trafficserver/plugin.config && echo "system_stats.so" >> /etc/trafficserver/plugin.config -ENTRYPOINT /root/go/src/github.com/apache/trafficcontrol/dev/t3c/run.sh +CMD /root/go/src/github.com/apache/trafficcontrol/dev/t3c/run.sh diff --git a/dev/tpv2/Dockerfile b/dev/tpv2/Dockerfile index 5412b9861d..df634e90fd 100644 --- a/dev/tpv2/Dockerfile +++ b/dev/tpv2/Dockerfile @@ -30,4 +30,4 @@ EXPOSE 443 COPY --from=certbuilder /server.key /server.crt / -ENTRYPOINT /root/go/src/github.com/apache/trafficcontrol/dev/tpv2/run.sh +CMD /root/go/src/github.com/apache/trafficcontrol/dev/tpv2/run.sh diff --git a/dev/traffic_monitor/Dockerfile b/dev/traffic_monitor/Dockerfile index 19635c9133..dd62e19478 100644 --- a/dev/traffic_monitor/Dockerfile +++ b/dev/traffic_monitor/Dockerfile @@ -20,4 +20,4 @@ EXPOSE 80 81 RUN apk add --no-cache inotify-tools go && go install github.com/go-delve/delve/cmd/dlv@latest && ln -s /root/go/bin/dlv /usr/bin/dlv RUN mkdir /lib64 && ln -s /lib/libc.musl-x86_64.so.1 /lib64/ld-linux-x86-64.so.2 -ENTRYPOINT /root/go/src/github.com/apache/trafficcontrol/dev/traffic_monitor/run.sh +CMD /root/go/src/github.com/apache/trafficcontrol/dev/traffic_monitor/run.sh diff --git a/dev/traffic_ops/Dockerfile b/dev/traffic_ops/Dockerfile index ab8d1b06bb..fec4ace810 100644 --- a/dev/traffic_ops/Dockerfile +++ b/dev/traffic_ops/Dockerfile @@ -35,4 +35,4 @@ RUN mkdir /lib64 && ln -s /lib/libc.musl-x86_64.so.1 /lib64/ld-linux-x86-64.so.2 COPY .pgpass /root/.pgpass RUN chmod 0600 /root/.pgpass -ENTRYPOINT /root/go/src/github.com/apache/trafficcontrol/dev/traffic_ops/run.sh +CMD /root/go/src/github.com/apache/trafficcontrol/dev/traffic_ops/run.sh diff --git a/dev/traffic_portal/Dockerfile b/dev/traffic_portal/Dockerfile index 7632673625..31a7ece83a 100644 --- a/dev/traffic_portal/Dockerfile +++ b/dev/traffic_portal/Dockerfile @@ -31,4 +31,4 @@ ENV TP_SERVER_CONFIG_FILE="$TC/dev/traffic_portal/config.js" RUN apk add --no-cache ruby ruby-dev gcc musl-dev make && gem update --system && gem install sass compass COPY --from=certbuilder /server.key /server.crt / -ENTRYPOINT /root/go/src/github.com/apache/trafficcontrol/dev/traffic_portal/run.sh +CMD /root/go/src/github.com/apache/trafficcontrol/dev/traffic_portal/run.sh diff --git a/dev/traffic_router/Dockerfile b/dev/traffic_router/Dockerfile index 9555a75c8c..abbbc96400 100644 --- a/dev/traffic_router/Dockerfile +++ b/dev/traffic_router/Dockerfile @@ -25,4 +25,4 @@ RUN cd /opt && tar -xf tomcat.tgz && mv apache-tomcat-9.0.54 tomcat && rm /usr/s COPY settings.xml /usr/share/java/maven-3/conf/settings.xml -ENTRYPOINT /root/go/src/github.com/apache/trafficcontrol/dev/traffic_router/run.sh +CMD /root/go/src/github.com/apache/trafficcontrol/dev/traffic_router/run.sh From 7745b63e32fce13e26c01d4248453e766c979548 Mon Sep 17 00:00:00 2001 From: ocket8888 Date: Tue, 1 Feb 2022 10:39:28 -0700 Subject: [PATCH 33/98] Fix non-bash-compliance in atc dev script file --- dev/atc.dev.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dev/atc.dev.sh b/dev/atc.dev.sh index 76e4cd7a90..4ebcb730df 100644 --- a/dev/atc.dev.sh +++ b/dev/atc.dev.sh @@ -125,7 +125,7 @@ function t3c { local dlv=(); if [[ ! -z "$TC_WAIT" ]]; then dlv=(dlv --accept-multiclient --listen=:8081 --headless --api-version=2 debug --); - else; + else dlv=(dlv --accept-multiclient --continue --listen=:8081 --headless --api-version=2 debug --); fi if [[ $# -lt 2 ]]; then From 9263c955dd701c582358fa763485a5598ce384ba Mon Sep 17 00:00:00 2001 From: ocket8888 Date: Tue, 1 Feb 2022 10:40:34 -0700 Subject: [PATCH 34/98] Add license header to TR SSL certificate --- .dependency_license | 1 - .../conf/trafficrouter.dev.ciab.test.crt | 22 ++++++++++++++++--- 2 files changed, 19 insertions(+), 4 deletions(-) diff --git a/.dependency_license b/.dependency_license index 986ddd5d04..0f12e48a45 100644 --- a/.dependency_license +++ b/.dependency_license @@ -75,7 +75,6 @@ BUILD_NUMBER$, Apache-2.0 # Demo certificates ssl\.(crt|key)$, Apache-2.0 -trafficrouter.dev.ciab.test.crt, Apache-2.0 /keystore, Apache-2.0 # Uncommentable files diff --git a/dev/traffic_router/conf/trafficrouter.dev.ciab.test.crt b/dev/traffic_router/conf/trafficrouter.dev.ciab.test.crt index 3e3267ef9c..9e9a372075 100644 --- a/dev/traffic_router/conf/trafficrouter.dev.ciab.test.crt +++ b/dev/traffic_router/conf/trafficrouter.dev.ciab.test.crt @@ -1,4 +1,20 @@ ------BEGIN CERTIFICATE----- +Licensed to the Apache Software Foundation (ASF) under one +or more contributor license agreements. See the NOTICE file +distributed with this work for additional information +regarding copyright ownership. The ASF licenses this file +to you under the Apache License, Version 2.0 (the +"License"); you may not use this file except in compliance +with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, +software distributed under the License is distributed on an +"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +KIND, either express or implied. See the License for the +specific language governing permissions and limitations +under the License. +-----BEGIN CERTIFICATE----- MIID2TCCAsGgAwIBAgIECbxoVzANBgkqhkiG9w0BAQsFADCBjTELMAkGA1UEBhMC VVMxETAPBgNVBAgTCENvbG9yYWRvMQ8wDQYDVQQHEwZEZW52ZXIxHzAdBgNVBAoT FkFwYWNoZSBUcmFmZmljIENvbnRyb2wxEzARBgNVBAsTCkFQSURlZmF1bHQxJDAi @@ -19,5 +35,5 @@ hvcNAQELBQADggEBAGgTkpfYzchX3HV0nbj3Gv8yVP9IdDOEKpku8XzaF29rjuNJ pCMxmfkUk4mPin9/Hz08nzeLEurb7m1uqyyZiMxKCVhE2i+RaQ81GDOBH8YK249o 2tKxT4tJpSV0uNGvHSdxAu6+5IeWk4N/lWJJ6zMTELMF/Y8MLbkJ6lg64igmXNrU g9yTAx99uZ7MMwnCuNdqAx+6BXuif0mVkpxIUWxQrr294aznO8taAYzELPI+P4yU -qy5sinTvvDuPNqncH0AfixT6Bk0ObnnmD1WDbEE= ------END CERTIFICATE----- +qy5sinTvvDuPNqncH0AfixT6Bk0ObnnmD1WDbEE= +-----END CERTIFICATE----- From 32b2f3e3915f7248ba5ffcfd4ad48a070f871db5 Mon Sep 17 00:00:00 2001 From: ocket8888 Date: Tue, 1 Feb 2022 10:43:13 -0700 Subject: [PATCH 35/98] Allow ATS build to run multiple processes --- dev/t3c/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dev/t3c/Dockerfile b/dev/t3c/Dockerfile index ae798613ca..1f48d9d692 100644 --- a/dev/t3c/Dockerfile +++ b/dev/t3c/Dockerfile @@ -18,7 +18,7 @@ FROM alpine:latest AS traffic-server-builder RUN apk add --no-cache build-base perl libexecinfo-dev pcre-dev libressl-dev libtool linux-headers openssl-dev zlib-dev ADD https://downloads.apache.org/trafficserver/trafficserver-9.1.0.tar.bz2 / -RUN tar -xf trafficserver-9.1.0.tar.bz2 && cd trafficserver-9.1.0 && mkdir /ats && ./configure --prefix / --enable-experimental-plugins && make && make install && ls -R /ats +RUN tar -xf trafficserver-9.1.0.tar.bz2 && cd trafficserver-9.1.0 && mkdir /ats && ./configure --prefix / --enable-experimental-plugins && make -j && make install && ls -R /ats FROM alpine:latest AS t3c-dev From a41a6fcfc7c5b93a4963dd3d6466fe1ca1219122 Mon Sep 17 00:00:00 2001 From: ocket8888 Date: Tue, 1 Feb 2022 11:01:35 -0700 Subject: [PATCH 36/98] Speed up atc-down by killing first --- dev/atc.dev.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dev/atc.dev.sh b/dev/atc.dev.sh index 4ebcb730df..41e32248dc 100644 --- a/dev/atc.dev.sh +++ b/dev/atc.dev.sh @@ -17,7 +17,7 @@ alias atc-start="docker-compose up -d --build"; alias atc-build="docker-compose build"; -alias atc-stop="docker-compose down -v --remove-orphans"; +alias atc-stop="docker-compose kill && docker-compose down -v --remove-orphans"; alias atc-restart="atc-stop && atc-start"; function atc-ready { From 83642ba149a9b3ba04dd3e88612caabf9742dddf Mon Sep 17 00:00:00 2001 From: ocket8888 Date: Tue, 1 Feb 2022 11:13:13 -0700 Subject: [PATCH 37/98] Fix spelling error --- dev/atc.dev.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dev/atc.dev.sh b/dev/atc.dev.sh index 41e32248dc..d96259459a 100644 --- a/dev/atc.dev.sh +++ b/dev/atc.dev.sh @@ -97,7 +97,7 @@ function atc { echo " connect Connect to a shell session inside a dev container"; echo " exec Run a command in a dev container"; echo " ready Check if the development environment is ready"; - echo " restart Retart up the development environment"; + echo " restart Restart the development environment"; echo " start Start up the development environment"; echo " stop Stop the development environment"; ;; @@ -109,7 +109,7 @@ function atc { echo " connect Connect to a shell session inside a dev container" >&2; echo " exec Run a command in a dev container" >&2; echo " ready Check if the development environment is ready" >&2; - echo " restart Retart up the development environment" >&2; + echo " restart Restart the development environment" >&2; echo " start Start up the development environment" >&2; echo " stop Stop the development environment" >&2; return 2;; From a2c071de213b784bfbfc4cda1e60cedb28c022c9 Mon Sep 17 00:00:00 2001 From: ocket8888 Date: Tue, 1 Feb 2022 12:35:08 -0700 Subject: [PATCH 38/98] Fix TP and TPv2 modifying package-lock.json --- dev/tpv2/run.sh | 2 +- dev/traffic_portal/run.sh | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/dev/tpv2/run.sh b/dev/tpv2/run.sh index 7ab98337ea..5e15af2f86 100755 --- a/dev/tpv2/run.sh +++ b/dev/tpv2/run.sh @@ -16,5 +16,5 @@ set -o errexit cd "$TC/experimental/traffic-portal" -npm install +npm ci ./node_modules/.bin/ng serve --ssl --ssl-cert /server.crt --ssl-key /server.key --watch --progress --proxy-config "$TC/dev/tpv2/proxy.json" --port 443 --host "::0" --live-reload diff --git a/dev/traffic_portal/run.sh b/dev/traffic_portal/run.sh index 79607d4658..6f45c18435 100755 --- a/dev/traffic_portal/run.sh +++ b/dev/traffic_portal/run.sh @@ -16,5 +16,5 @@ set -o errexit cd "$TC/traffic_portal" -npm install +npm ci ./node_modules/.bin/grunt From 6a683bab8c27e7b098a3d9fde76ed6334b51ffa0 Mon Sep 17 00:00:00 2001 From: ocket8888 Date: Tue, 1 Feb 2022 12:35:21 -0700 Subject: [PATCH 39/98] Remove unused layer/dependencies from legacy TP --- dev/traffic_portal/Dockerfile | 1 - 1 file changed, 1 deletion(-) diff --git a/dev/traffic_portal/Dockerfile b/dev/traffic_portal/Dockerfile index 31a7ece83a..ff942c82b5 100644 --- a/dev/traffic_portal/Dockerfile +++ b/dev/traffic_portal/Dockerfile @@ -28,7 +28,6 @@ VOLUME /root/go/src/github.com/apache/trafficcontrol EXPOSE 443 ENV TP_SERVER_CONFIG_FILE="$TC/dev/traffic_portal/config.js" -RUN apk add --no-cache ruby ruby-dev gcc musl-dev make && gem update --system && gem install sass compass COPY --from=certbuilder /server.key /server.crt / CMD /root/go/src/github.com/apache/trafficcontrol/dev/traffic_portal/run.sh From 1b471b0ae31393cf85cf20c69ec68dec5aafd9f7 Mon Sep 17 00:00:00 2001 From: ocket8888 Date: Tue, 1 Feb 2022 12:35:44 -0700 Subject: [PATCH 40/98] Fix incorrect/broken Tomcat download URL --- dev/traffic_router/Dockerfile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dev/traffic_router/Dockerfile b/dev/traffic_router/Dockerfile index abbbc96400..c4300be9e6 100644 --- a/dev/traffic_router/Dockerfile +++ b/dev/traffic_router/Dockerfile @@ -20,8 +20,8 @@ EXPOSE 3053:53/tcp 3053:53/udp 3080:80 3443:443 3333:3333 2222:3443 5005:5005 RUN apk add --no-cache openjdk8 inotify-tools maven && ln -s /usr/lib/jvm/java-1.8-openjdk/bin/jdb /bin/jdb -ADD https://dlcdn.apache.org/tomcat/tomcat-9/v9.0.54/bin/apache-tomcat-9.0.54.tar.gz /opt/tomcat.tgz -RUN cd /opt && tar -xf tomcat.tgz && mv apache-tomcat-9.0.54 tomcat && rm /usr/share/java/maven-3/conf/settings.xml +ADD https://archive.apache.org/dist/tomcat/tomcat-9/v9.0.43/bin/apache-tomcat-9.0.43.tar.gz /opt/tomcat.tgz +RUN cd /opt && tar -xf tomcat.tgz && mv apache-tomcat-* tomcat && rm /usr/share/java/maven-3/conf/settings.xml COPY settings.xml /usr/share/java/maven-3/conf/settings.xml From b9809b81c41229076b7bd0596f64434795c1e118 Mon Sep 17 00:00:00 2001 From: ocket8888 Date: Tue, 1 Feb 2022 18:31:30 -0700 Subject: [PATCH 41/98] Switch log4j to new config file format --- dev/traffic_router/conf/log4j.properties | 28 ------------------ dev/traffic_router/conf/log4j2.xml | 34 ++++++++++++++++++++++ dev/traffic_router/conf/startup.properties | 2 +- 3 files changed, 35 insertions(+), 29 deletions(-) delete mode 100644 dev/traffic_router/conf/log4j.properties create mode 100644 dev/traffic_router/conf/log4j2.xml diff --git a/dev/traffic_router/conf/log4j.properties b/dev/traffic_router/conf/log4j.properties deleted file mode 100644 index 1f62ca1e27..0000000000 --- a/dev/traffic_router/conf/log4j.properties +++ /dev/null @@ -1,28 +0,0 @@ -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -log4j.appender.ACCESS=org.apache.log4j.RollingFileAppender -log4j.appender.ACCESS.File=/root/go/src/github.com/apache/trafficcontrol/dev/traffic_router/access.log -log4j.appender.ACCESS.MaxFileSize=200MB -log4j.appender.ACCESS.MaxBackupIndex=10 -log4j.appender.ACCESS.layout=org.apache.log4j.PatternLayout -log4j.appender.ACCESS.layout.ConversionPattern=%m%n -log4j.appender.ACCESS.threshold=INFO -log4j.appender.A1=org.apache.log4j.RollingFileAppender -log4j.appender.A1.file=/root/go/src/github.com/apache/trafficcontrol/dev/traffic_router/traffic_router.log -log4j.appender.A1.maxFileSize=100MB -log4j.appender.A1.layout=org.apache.log4j.PatternLayout -log4j.appender.A1.layout.ConversionPattern=%-5p %d{yyyy-MM-dd'T'HH:mm:ss.SSS} [%t] %c - %m%n -log4j.appender.A1.threshold=ALL -log4j.rootLogger=ALL, A1 -log4j.logger.org.apache.traffic_control.traffic_router=ALL -log4j.logger.org.apache.traffic_control.traffic_router.core.access=ALL -log4j.additivity.org.apache.traffic_control.traffic_router.core.access=false diff --git a/dev/traffic_router/conf/log4j2.xml b/dev/traffic_router/conf/log4j2.xml new file mode 100644 index 0000000000..77688dcb9e --- /dev/null +++ b/dev/traffic_router/conf/log4j2.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/dev/traffic_router/conf/startup.properties b/dev/traffic_router/conf/startup.properties index 91ca01efc7..fb7e6f9036 100644 --- a/dev/traffic_router/conf/startup.properties +++ b/dev/traffic_router/conf/startup.properties @@ -19,7 +19,7 @@ # router is installed. CATALINA_OPTS="\ -server -Xms2g -Xmx8g \ - -Dlog4j.configuration=file:///opt/tomcat/conf/log4j.properties \ + -Dlog4j.configuration=file:///opt/tomcat/conf/log4j2.xml \ -Djava.library.path=/usr/lib \ -Dorg.apache.catalina.connector.Response.ENFORCE_ENCODING_IN_GET_WRITER=false \ -XX:+UseG1GC \ From bbbe7d558ea02a7b93afca186cceda3c20abb88f Mon Sep 17 00:00:00 2001 From: ocket8888 Date: Tue, 1 Feb 2022 18:31:42 -0700 Subject: [PATCH 42/98] Upgrade Java to 11 --- dev/traffic_router/Dockerfile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dev/traffic_router/Dockerfile b/dev/traffic_router/Dockerfile index c4300be9e6..e5c53e7bd6 100644 --- a/dev/traffic_router/Dockerfile +++ b/dev/traffic_router/Dockerfile @@ -15,10 +15,10 @@ FROM alpine:latest AS trafficrouter-dev ENV TC=/root/go/src/github.com/apache/trafficcontrol VOLUME /root/go/src/github.com/apache/trafficcontrol -ENV JPDA_OPTS="-agentlib:jdwp=transport=dt_socket,address=5005,server=y,suspend=n" JAVA_HOME=/usr/lib/jvm/java-8-openjdk M2_HOME=/root/.m2/ +ENV JPDA_OPTS="-agentlib:jdwp=transport=dt_socket,address=5005,server=y,suspend=n" JAVA_HOME=/usr/lib/jvm/java-11-openjdk M2_HOME=/root/.m2/ EXPOSE 3053:53/tcp 3053:53/udp 3080:80 3443:443 3333:3333 2222:3443 5005:5005 -RUN apk add --no-cache openjdk8 inotify-tools maven && ln -s /usr/lib/jvm/java-1.8-openjdk/bin/jdb /bin/jdb +RUN apk add --no-cache openjdk11 inotify-tools maven && ln -s /usr/lib/jvm/java-11-openjdk/bin/jdb /bin/jdb ADD https://archive.apache.org/dist/tomcat/tomcat-9/v9.0.43/bin/apache-tomcat-9.0.43.tar.gz /opt/tomcat.tgz RUN cd /opt && tar -xf tomcat.tgz && mv apache-tomcat-* tomcat && rm /usr/share/java/maven-3/conf/settings.xml From 3483e8434c2e6b63db6ca84872470470394b04e7 Mon Sep 17 00:00:00 2001 From: ocket8888 Date: Tue, 1 Feb 2022 18:55:08 -0700 Subject: [PATCH 43/98] Fix Traffic Router not working --- dev/traffic_router/Dockerfile | 5 ++++- dev/traffic_router/run.sh | 3 +++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/dev/traffic_router/Dockerfile b/dev/traffic_router/Dockerfile index e5c53e7bd6..d9357eec6d 100644 --- a/dev/traffic_router/Dockerfile +++ b/dev/traffic_router/Dockerfile @@ -21,7 +21,10 @@ EXPOSE 3053:53/tcp 3053:53/udp 3080:80 3443:443 3333:3333 2222:3443 5005:5005 RUN apk add --no-cache openjdk11 inotify-tools maven && ln -s /usr/lib/jvm/java-11-openjdk/bin/jdb /bin/jdb ADD https://archive.apache.org/dist/tomcat/tomcat-9/v9.0.43/bin/apache-tomcat-9.0.43.tar.gz /opt/tomcat.tgz -RUN cd /opt && tar -xf tomcat.tgz && mv apache-tomcat-* tomcat && rm /usr/share/java/maven-3/conf/settings.xml +RUN cd /opt && \ + tar -xf tomcat.tgz && \ + rm -rf tomcat.tgz tomcat/webapps/* tomcat/conf/web.xml tomcat/conf/server.xml tomcat/conf/logging.properties /usr/share/java/maven-3/conf/settings.xml && \ + mv apache-tomcat-* tomcat COPY settings.xml /usr/share/java/maven-3/conf/settings.xml diff --git a/dev/traffic_router/run.sh b/dev/traffic_router/run.sh index 5bc8e41d00..307d72e870 100755 --- a/dev/traffic_router/run.sh +++ b/dev/traffic_router/run.sh @@ -24,6 +24,9 @@ cd "$TC/traffic_router" mvn -Dmaven.test.skip=true compile -P \!rpm-build mvn -Dmaven.test.skip=true package -P \!rpm-build +cp core/target/ROOT.war /opt/tomcat/webapps/ +ln -s "$TC/dev/traffic_router/conf/*" /opt/tomcat/conf/ + /opt/tomcat/bin/catalina.sh jpda run # java -agentlib:jdwp=transport=dt_socket,address=5005,server=y,suspend=n StartTrafficRouter From 06458130f64ce5da689b4a3587ab23ac3b83b6f7 Mon Sep 17 00:00:00 2001 From: ocket8888 Date: Wed, 2 Feb 2022 13:43:20 -0700 Subject: [PATCH 44/98] Upgrade ATS to version 9.1.1 and fix crashing --- dev/t3c/Dockerfile | 5 +++-- dev/t3c/run.sh | 4 ++-- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/dev/t3c/Dockerfile b/dev/t3c/Dockerfile index 1f48d9d692..8a233206f9 100644 --- a/dev/t3c/Dockerfile +++ b/dev/t3c/Dockerfile @@ -17,8 +17,8 @@ FROM alpine:latest AS traffic-server-builder RUN apk add --no-cache build-base perl libexecinfo-dev pcre-dev libressl-dev libtool linux-headers openssl-dev zlib-dev -ADD https://downloads.apache.org/trafficserver/trafficserver-9.1.0.tar.bz2 / -RUN tar -xf trafficserver-9.1.0.tar.bz2 && cd trafficserver-9.1.0 && mkdir /ats && ./configure --prefix / --enable-experimental-plugins && make -j && make install && ls -R /ats +ADD https://downloads.apache.org/trafficserver/trafficserver-9.1.1.tar.bz2 / +RUN tar -xf trafficserver-9.1.1.tar.bz2 && cd trafficserver-9.1.1 && mkdir /ats && ./configure --prefix / --enable-experimental-plugins && make -j && make install && ls -R /ats FROM alpine:latest AS t3c-dev @@ -43,6 +43,7 @@ RUN apk add --no-cache make inotify-tools go pcre libexecinfo && \ mkdir /lib64 && \ ln -s /lib/libc.musl-x86_64.so.1 /lib64/ld-linux-x86-64.so.2 +RUN addgroup ats && adduser -S -s /bin/ash -G ats ats && chown -R ats:ats /etc/trafficserver /var/trafficserver /share/trafficserver /var/log/trafficserver RUN echo "stats_over_http.so" >> /etc/trafficserver/plugin.config && echo "system_stats.so" >> /etc/trafficserver/plugin.config CMD /root/go/src/github.com/apache/trafficcontrol/dev/t3c/run.sh diff --git a/dev/t3c/run.sh b/dev/t3c/run.sh index 38b4af085f..a0ff0b5262 100755 --- a/dev/t3c/run.sh +++ b/dev/t3c/run.sh @@ -60,7 +60,7 @@ if [[ ! -f /usr/bin/tm-health-client ]]; then ln -s /root/go/src/github.com/apache/trafficcontrol/cache-config/tm-health-client/tm-health-client /usr/bin/ fi -traffic_server & +su -c traffic_server ats & while inotifywait --exclude '.*(\.md|\.json|\.pl|\.rst|_test\.go|\.gitignore|__debug_bin|-logrotate|.service)$|^\./(build|t3c-check-refs/test-files|testing|t3util/testing|tm-health-client/(config|tmagent)/test_files)/.*' -e modify -r . ; do T3C_PID="$(ps | grep t3c | grep -v grep | grep -v inotifywait | grep -v run.sh | tr -s ' ' | cut -d ' ' -f2)" @@ -72,7 +72,7 @@ while inotifywait --exclude '.*(\.md|\.json|\.pl|\.rst|_test\.go|\.gitignore|__d rm /var/trafficserver/server.lock; fi ps | grep traffic_server | grep -v grep | tr -s ' ' | cut -d ' ' -f2 | xargs kill - traffic_server & + su -c traffic_server ats & # for whatever reason, without this the repeated call to inotifywait will # sometimes lose track of th current directory. It spits out: # Couldn't watch .: No such file or directory From 9438586b25302fb9a020882d16860c21e86da57c Mon Sep 17 00:00:00 2001 From: ocket8888 Date: Wed, 2 Feb 2022 13:41:50 -0700 Subject: [PATCH 45/98] Add missing required user fields --- dev/traffic_ops/seed.psql | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/dev/traffic_ops/seed.psql b/dev/traffic_ops/seed.psql index 4b287d12c3..98559812c2 100644 --- a/dev/traffic_ops/seed.psql +++ b/dev/traffic_ops/seed.psql @@ -16,14 +16,18 @@ INSERT INTO tm_user ( tenant_id, "role", local_passwd, - confirm_local_passwd + confirm_local_passwd, + email, + full_name ) VALUES ( 'admin', (SELECT id FROM tenant WHERE "name" = 'root'), (SELECT id FROM "role" WHERE "name" = 'admin'), -- 'twelve12' encrypted with SCRYPT 'SCRYPT:16384:8:1:p0Bppp/6IBeYxSwdLuYddsdMLBU/BNSlLY6fSIF7H1XW4eTbNVeMPVm7TuTEG4FM8PbqLlVwi8sPy8ZJznAlaQ==:sRcHWGe43mm/uEmXTIw37GcLEQZTlWAdf4vJqK8f0MDh8P+8gXoNx+nxWyb3r/0Bh+yyg0g/dUvti/ePZJL+Jw==', - 'SCRYPT:16384:8:1:p0Bppp/6IBeYxSwdLuYddsdMLBU/BNSlLY6fSIF7H1XW4eTbNVeMPVm7TuTEG4FM8PbqLlVwi8sPy8ZJznAlaQ==:sRcHWGe43mm/uEmXTIw37GcLEQZTlWAdf4vJqK8f0MDh8P+8gXoNx+nxWyb3r/0Bh+yyg0g/dUvti/ePZJL+Jw==' + 'SCRYPT:16384:8:1:p0Bppp/6IBeYxSwdLuYddsdMLBU/BNSlLY6fSIF7H1XW4eTbNVeMPVm7TuTEG4FM8PbqLlVwi8sPy8ZJznAlaQ==:sRcHWGe43mm/uEmXTIw37GcLEQZTlWAdf4vJqK8f0MDh8P+8gXoNx+nxWyb3r/0Bh+yyg0g/dUvti/ePZJL+Jw==', + 'admin@no-reply.atc.test', + 'Development Admin User' ) ON CONFLICT (username) DO NOTHING; From a14209a7b854f05f347638f8f33f66fce787d743 Mon Sep 17 00:00:00 2001 From: ocket8888 Date: Wed, 2 Feb 2022 13:42:59 -0700 Subject: [PATCH 46/98] Fix cache server having an un-poll-able Profile --- dev/traffic_ops/seed.psql | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/dev/traffic_ops/seed.psql b/dev/traffic_ops/seed.psql index 98559812c2..515ca1555e 100644 --- a/dev/traffic_ops/seed.psql +++ b/dev/traffic_ops/seed.psql @@ -68,6 +68,14 @@ INSERT INTO parameter ( 'rascal-config.txt', 'tm.polling.interval', '2000' +), ( + 'rascal.properties', + 'health.polling.url', + 'http://edge:8080/_stats?application=&inf.name=${interface_name}' +), ( + 'rascal.properties', + 'health.polling.format', + 'stats_over_http' ); INSERT INTO profile_parameter @@ -77,6 +85,12 @@ WHERE parameter.config_file = 'rascal-config.txt' AND parameter."name" LIKE '%.polling.%' AND profile."name" = 'RASCAL_TM_dev'; +INSERT INTO profile_parameter +SELECT profile.id, parameter.id +FROM profile, parameter +WHERE parameter.config_file = 'rascal.properties' +AND profile."name" = 'EDGE_dev'; + INSERT INTO division ("name") VALUES ('dev'); INSERT INTO region ( "name", From b5f500365caa4381f7039ab1136dcd001cc4e058 Mon Sep 17 00:00:00 2001 From: ocket8888 Date: Wed, 2 Feb 2022 13:44:21 -0700 Subject: [PATCH 47/98] Switch everything from using the ALL CDN to a new dev CDN ALL causes too many problems; it's treated specially in some places and not in others. --- dev/traffic_monitor/ops.config.json | 2 +- dev/traffic_ops/seed.psql | 17 ++++++++++++----- 2 files changed, 13 insertions(+), 6 deletions(-) diff --git a/dev/traffic_monitor/ops.config.json b/dev/traffic_monitor/ops.config.json index 947cad9e97..e540e04b5e 100644 --- a/dev/traffic_monitor/ops.config.json +++ b/dev/traffic_monitor/ops.config.json @@ -3,6 +3,6 @@ "password": "twelve12", "url": "https://trafficops:443/", "insecure": true, - "cdnName": "ALL", + "cdnName": "dev", "httpListener": ":80" } diff --git a/dev/traffic_ops/seed.psql b/dev/traffic_ops/seed.psql index 515ca1555e..30b1b88d8c 100644 --- a/dev/traffic_ops/seed.psql +++ b/dev/traffic_ops/seed.psql @@ -31,6 +31,13 @@ INSERT INTO tm_user ( ) ON CONFLICT (username) DO NOTHING; +INSERT INTO cdn ( + "name", + domain_name +) VALUES ( + 'dev', + 'ciab.test' +); INSERT INTO profile ( "name", description, @@ -40,12 +47,12 @@ INSERT INTO profile ( 'RASCAL_TM_dev', 'dev TM Profile', 'TM_PROFILE', - (SELECT id FROM cdn WHERE "name" = 'ALL') + (SELECT id FROM cdn WHERE "name" = 'dev') ), ( 'EDGE_dev', 'dev edge Profile', 'ATS_PROFILE', - (SELECT id FROM cdn WHERE "name" = 'ALL') + (SELECT id FROM cdn WHERE "name" = 'dev') ); INSERT INTO parameter ( @@ -160,7 +167,7 @@ INSERT INTO "server" ( (SELECT id FROM "type" WHERE "name" = 'RASCAL'), (SELECT id FROM status WHERE "name" = 'ONLINE'), (SELECT id FROM profile WHERE "name"= 'RASCAL_TM_dev'), - (SELECT id FROM cdn WHERE "name" = 'ALL') + (SELECT id FROM cdn WHERE "name" = 'dev') ), ( 'edge', 'dev.ciab.test', @@ -171,7 +178,7 @@ INSERT INTO "server" ( (SELECT id FROM "type" WHERE "name" = 'EDGE'), (SELECT id FROM status WHERE "name" = 'REPORTED'), (SELECT id FROM profile WHERE "name"= 'EDGE_dev'), - (SELECT id FROM cdn WHERE "name" = 'ALL') + (SELECT id FROM cdn WHERE "name" = 'dev') ); INSERT INTO interface ( @@ -220,7 +227,7 @@ INSERT INTO deliveryservice ( 1, 0, (SELECT id FROM "type" WHERE "name" = 'HTTP'), - (SELECT id FROM cdn WHERE "name" = 'ALL'), + (SELECT id FROM cdn WHERE "name" = 'dev'), 'dev', (SELECT id FROM tenant WHERE "name" = 'root') ); From 64a7ce5bb312564606f4ae24cc17dda539e1bea6 Mon Sep 17 00:00:00 2001 From: ocket8888 Date: Wed, 2 Feb 2022 13:44:31 -0700 Subject: [PATCH 48/98] Add initial CDN snapshot --- dev/traffic_ops/seed.psql | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/dev/traffic_ops/seed.psql b/dev/traffic_ops/seed.psql index 30b1b88d8c..ea0e7645ba 100644 --- a/dev/traffic_ops/seed.psql +++ b/dev/traffic_ops/seed.psql @@ -38,6 +38,17 @@ INSERT INTO cdn ( 'dev', 'ciab.test' ); + +INSERT INTO snapshot ( + cdn, + crconfig, + monitoring +) VALUES ( + 'dev', + '{"config":{"dnssec.enabled":"false","domain_name":"ciab.test"},"contentServers":{"edge":{"cacheGroup":"dev","fqdn":"edge.dev.ciab.test","hashCount":999,"hashId":"edge","httpsPort":443,"interfaceName":"eth0","ip":"129.0.0.2","ip6":"","locationId":"dev","port":80,"profile":"EDGE_dev","status":"REPORTED","type":"EDGE","routingDisabled":0}},"deliveryServices":{"dev":{"anonymousBlockingEnabled":"false","coverageZoneOnly":"false","deepCachingType":"NEVER","dispersion":{"limit":1,"shuffled":"true"},"domains":["dev.ciab.test"],"ecsEnabled":"false","geolocationProvider":"maxmindGeolocationService","ip6RoutingEnabled":"false","matchsets":[{"protocol":"HTTP","matchlist":[{"regex":".*\\\\.dev\\\\..*","match-type":"HOST"}]}],"protocol":{"acceptHttps":"false","redirectToHttps":"false"},"regionalGeoBlocking":"false","routingName":"cdn","soa":{"admin":"traffic_ops","expire":"604800","minimum":"30","refresh":"28800","retry":"7200"},"sslEnabled":"false","ttls":{"A":"","AAAA":"","NS":"3600","SOA":"86400"}}},"edgeLocations":{"dev":{"latitude":0,"longitude":0,"backupLocations":{"fallbackToClosest":"true"},"localizationMethods":["GEO","CZ","DEEP_CZ"]}},"monitors":{"trafficmonitor":{"fqdn":"trafficmonitor.dev.ciab.test","httpsPort":null,"ip":"129.0.0.1","ip6":"","location":"dev","port":80,"profile":"RASCAL_TM_dev","status":"ONLINE"}},"stats":{"CDN_name":"dev","date":1643833749,"tm_host":"","tm_user":"admin","tm_version":"development"}}', + '{"trafficServers":[{"profile":"EDGE_dev","status":"REPORTED","port":80,"cachegroup":"dev","hostname":"edge","fqdn":"edge.dev.ciab.test","interfaces":[{"ipAddresses":[{"address":"129.0.0.2","gateway":null,"serviceAddress":true}],"maxBandwidth":null,"monitor":true,"mtu":1500,"name":"eth0"}],"type":"EDGE","hashid":""}],"trafficMonitors":[{"profile":"RASCAL_TM_dev","status":"ONLINE","port":80,"cachegroup":"dev","hostname":"trafficmonitor","fqdn":"trafficmonitor.dev.ciab.test","ip":"129.0.0.1","ip6":""}],"cacheGroups":[{"name":"dev","coordinates":{"latitude":0,"longitude":0}}],"profiles":[{"name":"EDGE_dev","type":"EDGE","parameters":{"health.polling.format":"stats_over_http","health.polling.url":"http://edge:8080/_stats?application=\u0026inf.name=${interface_name}"}}],"deliveryServices":[{"xmlId":"dev","totalTpsThreshold":0,"status":"REPORTED","totalKbpsThreshold":0}],"config":{"health.polling.interval":6000,"heartbeat.polling.interval":3000,"peers.polling.interval":3000,"tm.polling.interval":2000}}' +); + INSERT INTO profile ( "name", description, From 706d3aa6116647b2e5d7fa001290cf371acc7eca Mon Sep 17 00:00:00 2001 From: ocket8888 Date: Thu, 3 Feb 2022 08:48:15 -0700 Subject: [PATCH 49/98] Fix default tomcat webapps not being removed --- dev/traffic_router/Dockerfile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dev/traffic_router/Dockerfile b/dev/traffic_router/Dockerfile index d9357eec6d..dd8fa8d128 100644 --- a/dev/traffic_router/Dockerfile +++ b/dev/traffic_router/Dockerfile @@ -23,8 +23,8 @@ RUN apk add --no-cache openjdk11 inotify-tools maven && ln -s /usr/lib/jvm/java- ADD https://archive.apache.org/dist/tomcat/tomcat-9/v9.0.43/bin/apache-tomcat-9.0.43.tar.gz /opt/tomcat.tgz RUN cd /opt && \ tar -xf tomcat.tgz && \ - rm -rf tomcat.tgz tomcat/webapps/* tomcat/conf/web.xml tomcat/conf/server.xml tomcat/conf/logging.properties /usr/share/java/maven-3/conf/settings.xml && \ - mv apache-tomcat-* tomcat + mv apache-tomcat-* tomcat && \ + rm -rf tomcat.tgz tomcat/webapps/* tomcat/conf/web.xml tomcat/conf/server.xml tomcat/conf/logging.properties /usr/share/java/maven-3/conf/settings.xml COPY settings.xml /usr/share/java/maven-3/conf/settings.xml From 88cb1c7f2b86a3938ca46daa5464c4b7bdc3b2e0 Mon Sep 17 00:00:00 2001 From: ocket8888 Date: Thu, 3 Feb 2022 09:50:59 -0700 Subject: [PATCH 50/98] Simplify repetitive commands --- dev/t3c/run.sh | 42 ++++++++++-------------------------------- 1 file changed, 10 insertions(+), 32 deletions(-) diff --git a/dev/t3c/run.sh b/dev/t3c/run.sh index a0ff0b5262..9f1c2e36c6 100755 --- a/dev/t3c/run.sh +++ b/dev/t3c/run.sh @@ -20,44 +20,22 @@ set -o errexit trap '[ $? -eq 0 ] && exit 0 || echo "Error on line ${LINENO} of ${0}"; exit 1' EXIT +cd "$TC/tc-health-client" +go build --gcflags "all=-N -l" . cd "$TC/cache-config" # Build area may contain non-debug binaries make clean && make -j debug -if [[ ! -f /usr/bin/t3c ]]; then - ln -s /root/go/src/github.com/apache/trafficcontrol/cache-config/t3c/t3c /usr/bin/ -fi -if [[ ! -f /usr/bin/t3c-apply ]]; then - ln -s /root/go/src/github.com/apache/trafficcontrol/cache-config/t3c-apply/t3c-apply /usr/bin/ -fi -if [[ ! -f /usr/bin/t3c-check ]]; then - ln -s /root/go/src/github.com/apache/trafficcontrol/cache-config/t3c-check/t3c-check /usr/bin/ -fi -if [[ ! -f /usr/bin/t3c-check-refs ]]; then - ln -s /root/go/src/github.com/apache/trafficcontrol/cache-config/t3c-check-refs/t3c-check-refs /usr/bin/ -fi -if [[ ! -f /usr/bin/t3c-check-reload ]]; then - ln -s /root/go/src/github.com/apache/trafficcontrol/cache-config/t3c-check-reload/t3c-check-reload /usr/bin/ -fi -if [[ ! -f /usr/bin/t3c-diff ]]; then - ln -s /root/go/src/github.com/apache/trafficcontrol/cache-config/t3c-diff/t3c-diff /usr/bin/ -fi -if [[ ! -f /usr/bin/t3c-generate ]]; then - ln -s /root/go/src/github.com/apache/trafficcontrol/cache-config/t3c-generate/t3c-generate /usr/bin/ -fi -if [[ ! -f /usr/bin/t3c-preprocess ]]; then - ln -s /root/go/src/github.com/apache/trafficcontrol/cache-config/t3c-preprocess/t3c-preprocess /usr/bin/ -fi -if [[ ! -f /usr/bin/t3c-request ]]; then - ln -s /root/go/src/github.com/apache/trafficcontrol/cache-config/t3c-request/t3c-request /usr/bin/ -fi -if [[ ! -f /usr/bin/t3c-update ]]; then - ln -s /root/go/src/github.com/apache/trafficcontrol/cache-config/t3c-update/t3c-update /usr/bin/ -fi -if [[ ! -f /usr/bin/tm-health-client ]]; then - ln -s /root/go/src/github.com/apache/trafficcontrol/cache-config/tm-health-client/tm-health-client /usr/bin/ +for component in "t3c t3c-apply t3c-check t3c-check-refs t3c-check-reload t3c-diff t3c-generate t3c-preprocess t3c-request t3c-update"; do + if [[ ! -f "/usr/bin/$component" ]]; then + ln -s "$TC/cache-config/$component/$component" /usr/bin + fi +done + +if [[ ! -f /usr/bin/tc-health-client ]]; then + ln -s "$TC/tc-health-client/tc-health-client" /usr/bin/ fi su -c traffic_server ats & From a1a9e0726943a2c375a4c50569d56fa0510fb037 Mon Sep 17 00:00:00 2001 From: ocket8888 Date: Thu, 3 Feb 2022 09:51:33 -0700 Subject: [PATCH 51/98] Fix incorrect TR config linking --- dev/traffic_router/run.sh | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/dev/traffic_router/run.sh b/dev/traffic_router/run.sh index 307d72e870..44233e4c00 100755 --- a/dev/traffic_router/run.sh +++ b/dev/traffic_router/run.sh @@ -17,7 +17,6 @@ # under the License. set -o errexit -trap '[ $? -eq 0 ] && exit 0 || echo "Error on line ${LINENO} of ${0}"; exit 1' EXIT cd "$TC/traffic_router" @@ -25,7 +24,7 @@ mvn -Dmaven.test.skip=true compile -P \!rpm-build mvn -Dmaven.test.skip=true package -P \!rpm-build cp core/target/ROOT.war /opt/tomcat/webapps/ -ln -s "$TC/dev/traffic_router/conf/*" /opt/tomcat/conf/ +ln -s $TC/dev/traffic_router/conf/* /opt/tomcat/conf/ /opt/tomcat/bin/catalina.sh jpda run # java -agentlib:jdwp=transport=dt_socket,address=5005,server=y,suspend=n StartTrafficRouter From 115734fbbc6f8d17ab9b130d50ba91f8007f4766 Mon Sep 17 00:00:00 2001 From: ocket8888 Date: Thu, 3 Feb 2022 09:51:48 -0700 Subject: [PATCH 52/98] Remove docs from t3c debug build target --- cache-config/Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cache-config/Makefile b/cache-config/Makefile index 69f8069bfe..bc871d0ce4 100644 --- a/cache-config/Makefile +++ b/cache-config/Makefile @@ -85,4 +85,4 @@ t3c-update/t3c-update: $(wildcard t3c-update/**/*.go) $(wildcard t3c-update/*.go go build -o $@ $(GO_FLAGS) github.com/apache/trafficcontrol/cache-config/$(dir $@) debug: GO_FLAGS=--gcflags "all=-N -l" -debug: all +debug: $(TARGETS) From b13ae3fc68e2fcce6ef8735333146563426fde3d Mon Sep 17 00:00:00 2001 From: ocket8888 Date: Thu, 3 Feb 2022 09:52:05 -0700 Subject: [PATCH 53/98] Add built tc-health-client binary to gitignore --- tc-health-client/.gitignore | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 tc-health-client/.gitignore diff --git a/tc-health-client/.gitignore b/tc-health-client/.gitignore new file mode 100644 index 0000000000..1782d06964 --- /dev/null +++ b/tc-health-client/.gitignore @@ -0,0 +1,18 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# +tc-health-client From 762a99f61fc1a15604875bd4106726513dc34738 Mon Sep 17 00:00:00 2001 From: ocket8888 Date: Tue, 8 Feb 2022 09:13:46 -0700 Subject: [PATCH 54/98] Use repo's .m2 maven cache --- dev/traffic_router/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dev/traffic_router/Dockerfile b/dev/traffic_router/Dockerfile index dd8fa8d128..b0aeedc564 100644 --- a/dev/traffic_router/Dockerfile +++ b/dev/traffic_router/Dockerfile @@ -15,7 +15,7 @@ FROM alpine:latest AS trafficrouter-dev ENV TC=/root/go/src/github.com/apache/trafficcontrol VOLUME /root/go/src/github.com/apache/trafficcontrol -ENV JPDA_OPTS="-agentlib:jdwp=transport=dt_socket,address=5005,server=y,suspend=n" JAVA_HOME=/usr/lib/jvm/java-11-openjdk M2_HOME=/root/.m2/ +ENV JPDA_OPTS="-agentlib:jdwp=transport=dt_socket,address=5005,server=y,suspend=n" JAVA_HOME=/usr/lib/jvm/java-11-openjdk M2_HOME=/root/go/src/github.com/apache/trafficcontrol/.m2 EXPOSE 3053:53/tcp 3053:53/udp 3080:80 3443:443 3333:3333 2222:3443 5005:5005 RUN apk add --no-cache openjdk11 inotify-tools maven && ln -s /usr/lib/jvm/java-11-openjdk/bin/jdb /bin/jdb From 19faafba886a956702aa807a3afe54a4248aa912 Mon Sep 17 00:00:00 2001 From: ocket8888 Date: Mon, 14 Feb 2022 08:30:50 -0700 Subject: [PATCH 55/98] Use environment variables to set Go version for Go components pylint update because classes are variables - things meant to be exported are "unused" even if they are used in a package-local context --- .env | 1 + .../pr_to_update_go/go_pr_maker.py | 340 +++++++++++------- .gitignore | 2 + dev/t3c/Dockerfile | 5 +- dev/traffic_monitor/Dockerfile | 5 +- dev/traffic_ops/Dockerfile | 7 +- docker-compose.yml | 6 + traffic_control/clients/python/pylint.rc | 2 +- 8 files changed, 237 insertions(+), 131 deletions(-) create mode 100644 .env diff --git a/.env b/.env new file mode 100644 index 0000000000..29c3b2f6cf --- /dev/null +++ b/.env @@ -0,0 +1 @@ +GO_VERSION=1.17.6 diff --git a/.github/actions/pr-to-update-go/pr_to_update_go/go_pr_maker.py b/.github/actions/pr-to-update-go/pr_to_update_go/go_pr_maker.py index e0cb24e581..d5c02e475c 100644 --- a/.github/actions/pr-to-update-go/pr_to_update_go/go_pr_maker.py +++ b/.github/actions/pr-to-update-go/pr_to_update_go/go_pr_maker.py @@ -24,50 +24,146 @@ import re import subprocess import sys -from typing import Optional +from typing import Optional, TypedDict, Any, Final import requests -from github import GitRef + from github.Branch import Branch from github.Commit import Commit +from github.ContentFile import ContentFile from github.GitCommit import GitCommit -from github.GitTree import GitTree -from github.GithubObject import NotSet -from github.InputGitTreeElement import InputGitTreeElement -from github.Requester import Requester - -from requests import Response - from github.GithubException import BadCredentialsException, GithubException, UnknownObjectException +from github.GithubObject import NotSet +from github.GitRef import GitRef +from github.GitTree import GitTree from github.InputGitAuthor import InputGitAuthor +from github.InputGitTreeElement import InputGitTreeElement from github.Label import Label from github.MainClass import Github -from github.Milestone import Milestone -from github.PaginatedList import PaginatedList from github.PullRequest import PullRequest from github.Repository import Repository +from github.Requester import Requester from pr_to_update_go.constants import ENV_GITHUB_TOKEN, GO_VERSION_URL, ENV_GITHUB_REPOSITORY, \ ENV_GITHUB_REPOSITORY_OWNER, GO_REPO_NAME, RELEASE_PAGE_URL, ENV_GO_VERSION_FILE, \ ENV_GIT_AUTHOR_NAME, GIT_AUTHOR_EMAIL_TEMPLATE +class GoVersion(TypedDict): + """ + A single entry in the list returned by the Go website's version listing API. + """ + #: The type of files is unimportant, because it's not used + files: list[Any] + stable: bool + version: str + +def get_pr_body(go_version: str, milestone_url: str) -> str: + """ + Generates the body of a Pull Request given a Go release version and a + URL that points to information about what changes were in said release. + """ + with open(os.path.join(os.path.dirname(__file__), '/pr_template.md'), encoding="UTF-8") as file: + pr_template = file.read() + go_major_version = get_major_version(go_version) + + release_notes = get_release_notes(go_version) + pr_body = pr_template.format(GO_VERSION=go_version, GO_MAJOR_VERSION=go_major_version, + RELEASE_NOTES=release_notes, MILESTONE_URL=milestone_url) + print('Templated PR body') + return pr_body + +def get_major_version(from_go_version: str) -> str: + """ + Extracts the "major" version part of a full Go release version. ("major" to + the Go project is the part of the version that most people think of as the + major and minor versions - refer to examples). + + >>> get_major_version("1.23.45-6rc7") + '1.23' + >>> get_major_version("not a release version") + '' + """ + match = re.search(pattern=r'^\d+\.\d+', string=from_go_version) + if match: + return match.group(0) + return "" + +def getenv(var: str) -> str: + """ + Returns the value of the environment variable with the given name. + + If ``var`` is not set in the execution environment, a KeyError is raised. + + >>> os.environ["FOO"] = "BAR" + >>> getenv("FOO") + 'BAR' + """ + return os.environ[var] + +get_repo_name = lambda: getenv(ENV_GITHUB_REPOSITORY) +get_repo_owner = lambda: getenv(ENV_GITHUB_REPOSITORY_OWNER) + +def get_release_notes(go_version: str) -> str: + """ + Gets the release notes for the given Go version. + """ + release_history_response = requests.get(RELEASE_PAGE_URL) + release_history_response.raise_for_status() + release_notes_content = release_history_response.content.decode() + go_version_pattern = go_version.replace('.', '\\.') + release_notes_pattern: str = f'

\\s*\\n\\s*go{go_version_pattern}.*?

' + release_notes_matches = re.search(release_notes_pattern, release_notes_content, + re.MULTILINE | re.DOTALL) + if release_notes_matches is None: + raise Exception(f'Could not find release notes on {RELEASE_PAGE_URL}') + release_notes = re.sub(r'[\s\t]+', ' ', release_notes_matches.group(0)) + return release_notes + + +def get_latest_major_upgrade(from_go_version: str) -> str: + """ + Gets the version of the latest Go release that is the same "major" + version as the passed current (or "from") Go version. + + If no stable version is found that is the same "major" version as the + given current version, an exception is raised. + """ + major_version = get_major_version(from_go_version) + go_version_response = requests.get(GO_VERSION_URL) + go_version_response.raise_for_status() + go_version_content: list[GoVersion] = json.loads(go_version_response.content) + fetched_go_version: str = '' + for go_version in go_version_content: + if not go_version["stable"]: + continue + match = re.search(r"[\d.]+", go_version["version"]) + if not match: + continue + fetched_go_version = match.group(0) + if major_version == get_major_version(fetched_go_version): + break + else: + raise Exception(f'No supported {major_version} Go versions exist.') + print(f'Latest version of Go {major_version} is {fetched_go_version}') + return fetched_go_version + class GoPRMaker: """ - A class to generate pull requests for the purpose of updating the Go version in a repository. + A class to generate pull requests for the purpose of updating the Go version + in a repository. """ - gh: Github + gh_api: Github latest_go_version: str repo: Repository author: InputGitAuthor - def __init__(self, gh: Github) -> None: - self.gh = gh - repo_name: str = self.get_repo_name() - self.repo = self.get_repo(repo_name) + def __init__(self, gh_api: Github): + self.gh_api = gh_api + self.repo = self.get_repo(get_repo_name()) try: - git_author_name = self.getenv(ENV_GIT_AUTHOR_NAME) + git_author_name = getenv(ENV_GIT_AUTHOR_NAME) git_author_email = GIT_AUTHOR_EMAIL_TEMPLATE.format(git_author_name=git_author_name) self.author = InputGitAuthor(git_author_name, git_author_email) except KeyError: @@ -75,18 +171,28 @@ def __init__(self, gh: Github) -> None: print('Will commit using the default author') def branch_exists(self, branch: str) -> bool: + """ + Checks the existence of a given branch in the repository. + """ try: repo_go_version = self.get_repo_go_version(branch) if self.latest_go_version == repo_go_version: print(f'Branch {branch} already exists') return True except GithubException as e: - message = e.data.get('message') - if not re.match(r'No commit found for the ref', message): + message = e.data["message"] + if not isinstance(message, str) or not re.match("No commit found for the ref", message): raise e return False def update_branch(self, branch_name: str, sha: str) -> None: + """ + Updates the branch given by ``branch_name`` on the remote origin by + fast-forwarding it to a commit given by its hash in ``sha``. + + Note that only fast-forward updates are possible, as this doesn't + "force" push. + """ requester: Requester = self.repo._requester patch_parameters = { 'sha': sha, @@ -94,11 +200,14 @@ def update_branch(self, branch_name: str, sha: str) -> None: requester.requestJsonAndCheck( 'PATCH', self.repo.url + f'/git/refs/heads/{branch_name}', input=patch_parameters ) - return def run(self, update_version_only: bool = False) -> None: + """ + This is the 'main' method of the PR maker, which does everything + necessary to create the PR that will update the repository's Go version. + """ repo_go_version = self.get_repo_go_version() - self.latest_go_version = self.get_latest_major_upgrade(repo_go_version) + self.latest_go_version = get_latest_major_upgrade(repo_go_version) commit_message: str = f'Update Go version to {self.latest_go_version}' source_branch_name: str = f'go-{self.latest_go_version}' @@ -125,58 +234,29 @@ def run(self, update_version_only: bool = False) -> None: sha: str = update_golang_org_x_commit.sha self.update_branch(source_branch_name, sha) - owner: str = self.get_repo_owner() - self.create_pr(self.latest_go_version, commit_message, owner, source_branch_name, + self.create_pr(self.latest_go_version, commit_message, get_repo_owner(), source_branch_name, target_branch) - @staticmethod - def getenv(env_name: str) -> str: - return os.environ[env_name] - def get_repo(self, repo_name: str) -> Repository: + """ + Fetches a PyGitHub Repository object using the passed repository name. + """ try: - repo: Repository = self.gh.get_repo(repo_name) - except BadCredentialsException: - print(f'Credentials from {ENV_GITHUB_TOKEN} were bad.') - sys.exit(1) + repo: Repository = self.gh_api.get_repo(repo_name) + except BadCredentialsException as e: + raise PermissionError(f"Credentials from token '{ENV_GITHUB_TOKEN}' were bad") from e return repo - @staticmethod - def get_major_version(from_go_version: str) -> str: - return re.search(pattern=r'^\d+\.\d+', string=from_go_version).group(0) - - def get_latest_major_upgrade(self, from_go_version: str) -> str: - major_version = self.get_major_version(from_go_version) - go_version_response: Response = requests.get(GO_VERSION_URL) - go_version_response.raise_for_status() - go_version_content: list = json.loads(go_version_response.content) - index = 0 - fetched_go_version: str = '' - while True: - if not go_version_content[index]['stable']: - continue - go_version_name: str = go_version_content[index]['version'] - fetched_go_version = re.search(pattern=r'[\d.]+', string=go_version_name).group(0) - if major_version == self.get_major_version(fetched_go_version): - break - index += 1 - if major_version != self.get_major_version(fetched_go_version): - raise Exception(f'No supported {major_version} Go versions exist.') - print(f'Latest version of Go {major_version} is {fetched_go_version}') - return fetched_go_version - - def get_repo_name(self) -> str: - repo_name: str = self.getenv(ENV_GITHUB_REPOSITORY) - return repo_name - - def get_repo_owner(self) -> str: - repo_name: str = self.getenv(ENV_GITHUB_REPOSITORY_OWNER) - return repo_name - - def get_go_milestone(self, go_version: str) -> str: + def get_go_milestone(self, go_version: str) -> Optional[str]: + """ + Gets a URL for the GitHub milestone that tracks the release of the + passed Go version. + + If the passed version is not found to have a milestone associated with + it, an exception is raised. + """ go_repo: Repository = self.get_repo(GO_REPO_NAME) - milestones: PaginatedList[Milestone] = go_repo.get_milestones(state='all', sort='due_on', - direction='desc') + milestones = go_repo.get_milestones(state='all', sort='due_on', direction='desc') milestone_title = f'Go{go_version}' for milestone in milestones: # type: Milestone if milestone.title == milestone_title: @@ -184,86 +264,92 @@ def get_go_milestone(self, go_version: str) -> str: return milestone.raw_data.get('html_url') raise Exception(f'Could not find a milestone named {milestone_title}.') - @staticmethod - def get_release_notes_page() -> str: - release_history_response: Response = requests.get(RELEASE_PAGE_URL) - release_history_response.raise_for_status() - return release_history_response.content.decode() - - @staticmethod - def get_release_notes(go_version: str, release_notes_content: str) -> str: - go_version_pattern = go_version.replace('.', '\\.') - release_notes_pattern: str = f'

\\s*\\n\\s*go{go_version_pattern}.*?

' - release_notes_matches = re.search(release_notes_pattern, release_notes_content, - re.MULTILINE | re.DOTALL) - if release_notes_matches is None: - raise Exception(f'Could not find release notes on {RELEASE_PAGE_URL}') - release_notes = re.sub(r'[\s\t]+', ' ', release_notes_matches.group(0)) - return release_notes - - def get_pr_body(self, go_version: str, milestone_url: str) -> str: - with open(os.path.dirname(__file__) + '/pr_template.md') as file: - pr_template = file.read() - go_major_version = self.get_major_version(go_version) - - release_notes = self.get_release_notes(go_version, self.get_release_notes_page()) - pr_body: str = pr_template.format(GO_VERSION=go_version, GO_MAJOR_VERSION=go_major_version, - RELEASE_NOTES=release_notes, MILESTONE_URL=milestone_url) - print('Templated PR body') - return pr_body + def file_contents(self, file: str, branch: str = "master") -> ContentFile: + """ + Gets the contents of the given file path within the repository, + optionally on a specific branch ("master" by default). + + All trailing whitespace (e.g. extra newlines) is stripped. + + An exception is raised if ``file`` is not a path to a regular file, + relative to the root of the repository (on the given branch). + """ + contents = self.repo.get_contents(file, f"refs/heads/{branch}") + if isinstance(contents, list): + raise IsADirectoryError(f"cannot get file contents of '{file}': is a directory") + return contents def get_repo_go_version(self, branch: str = 'master') -> str: - return self.repo.get_contents(self.getenv(ENV_GO_VERSION_FILE), - f'refs/heads/{branch}').decoded_content.rstrip().decode() + """ + Gets the current Go version used at the head of the given branch (or not + given to use "master" by default) for the repository. + """ + return self.file_contents(getenv(ENV_GO_VERSION_FILE), branch).decoded_content.decode() def set_go_version(self, go_version: str, commit_message: str, source_branch_name: str) -> Commit: + """ + Makes the commits necessary to change the Go version used by the + repository. + + This includes updating the GO_VERSION and .env files at the repository's + root. + """ master: Branch = self.repo.get_branch('master') - sha: str = master.commit.sha - ref: str = f'refs/heads/{source_branch_name}' + sha = master.commit.sha + ref = f'refs/heads/{source_branch_name}' self.repo.create_git_ref(ref, sha) print(f'Created branch {source_branch_name}') - go_version_file: str = self.getenv(ENV_GO_VERSION_FILE) - go_file_contents = self.repo.get_contents(go_version_file, ref) - kwargs = {'path': go_version_file, - 'message': commit_message, - 'content': (go_version + '\n'), - 'sha': go_file_contents.sha, - 'branch': source_branch_name, + go_version_file = getenv(ENV_GO_VERSION_FILE) + kwargs = { + "branch": source_branch_name, + "committer": NotSet, + "content": f"${go_version}\n", + "path": go_version_file, + "message": commit_message, + "sha": self.file_contents(go_version_file, source_branch_name).sha } try: - git_author_name = self.getenv(ENV_GIT_AUTHOR_NAME) + git_author_name = getenv(ENV_GIT_AUTHOR_NAME) git_author_email = GIT_AUTHOR_EMAIL_TEMPLATE.format(git_author_name=git_author_name) author: InputGitAuthor = InputGitAuthor(name=git_author_name, email=git_author_email) - kwargs['author'] = author - kwargs['committer'] = author + kwargs["author"] = author except KeyError: print('Committing using the default author') - commit: Commit = self.repo.update_file(**kwargs).get('commit') + self.repo.update_file(**kwargs) print(f'Updated {go_version_file} on {self.repo.name}') + env_path = os.path.join(os.path.dirname(go_version_file), ".env") + kwargs["path"] = env_path + kwargs["content"] = f"GO_VERSION={go_version}\n" + kwargs["sha"] = self.file_contents(go_version_file, source_branch_name).sha + commit: Commit = self.repo.update_file(**kwargs)["commit"] + print(f"Updated {env_path} on {self.repo.name}") return commit def update_golang_org_x(self, previous_commit: Commit) -> Optional[GitCommit]: + """ + Updates golang.org/x/ Go dependencies as necessary for the new Go + version. + """ subprocess.run(['git', 'fetch', 'origin'], check=True) subprocess.run(['git', 'checkout', previous_commit.sha], check=True) - script_path: str = os.path.join(os.path.dirname(__file__), 'update_golang_org_x.sh') - subprocess.run([script_path], check=True) + subprocess.run([os.path.join(os.path.dirname(__file__), 'update_golang_org_x.sh')], check=True) files_to_check: list[str] = ['go.mod', 'go.sum', os.path.join('vendor', 'modules.txt')] tree_elements: list[InputGitTreeElement] = [] for file in files_to_check: - diff_process = subprocess.run(['git', 'diff', '--exit-code', '--', file]) + diff_process = subprocess.run(['git', 'diff', '--exit-code', '--', file], check=False) if diff_process.returncode == 0: continue - with open(file) as stream: + with open(file, encoding="UTF-8") as stream: content: str = stream.read() tree_element: InputGitTreeElement = InputGitTreeElement(path=file, mode='100644', type='blob', content=content) tree_elements.append(tree_element) if len(tree_elements) == 0: print('No golang.org/x/ dependencies need to be updated.') - return + return None tree_hash = subprocess.check_output( ['git', 'log', '-1', '--pretty=%T', previous_commit.sha]).decode().strip() base_tree: GitTree = self.repo.get_git_tree(sha=tree_hash) @@ -278,18 +364,24 @@ def update_golang_org_x(self, previous_commit: Commit) -> Optional[GitCommit]: def create_pr(self, latest_go_version: str, commit_message: str, owner: str, source_branch_name: str, target_branch: str) -> None: - prs: PaginatedList = self.gh.search_issues( + """ + Creates the pull request to update the Go version. + """ + prs = self.gh_api.search_issues( f'repo:{self.repo.full_name} is:pr is:open head:{source_branch_name}') for list_item in prs: - pr: PullRequest = self.repo.get_pull(list_item.number) - if pr.head.ref != source_branch_name: + pull_request = self.repo.get_pull(list_item.number) + if pull_request.head.ref != source_branch_name: continue - print(f'Pull request for branch {source_branch_name} already exists:\n{pr.html_url}') + print(f'Pull request for branch {source_branch_name} already exists:\n{pull_request.html_url}') return - milestone_url: str = self.get_go_milestone(latest_go_version) - pr_body: str = self.get_pr_body(latest_go_version, milestone_url) - pr: PullRequest = self.repo.create_pull( + milestone_url = self.get_go_milestone(latest_go_version) + if milestone_url is None: + #TODO subclass this + raise LookupError(f"no milestone found for '${latest_go_version}'") + pr_body = get_pr_body(latest_go_version, milestone_url) + pull_request: PullRequest = self.repo.create_pull( title=commit_message, body=pr_body, head=f'{owner}:{source_branch_name}', @@ -298,7 +390,7 @@ def create_pr(self, latest_go_version: str, commit_message: str, owner: str, ) try: go_version_label: Label = self.repo.get_label('go version') - pr.add_to_labels(go_version_label) + pull_request.add_to_labels(go_version_label) except UnknownObjectException: - print('Unable to find a label named "go version".') - print(f'Created pull request {pr.html_url}') + print('Unable to find a label named "go version"', file=sys.stderr) + print(f'Created pull request {pull_request.html_url}') diff --git a/.gitignore b/.gitignore index c6e6f9fd0e..4e14022fa7 100644 --- a/.gitignore +++ b/.gitignore @@ -82,3 +82,5 @@ __debug_bin ./traffic_ops_golang # Created by TP/TO docker integration tests junit/ +# local install of Python packages in "edit" mode +*.egg-info/ diff --git a/dev/t3c/Dockerfile b/dev/t3c/Dockerfile index 8a233206f9..d6e5722d6f 100644 --- a/dev/t3c/Dockerfile +++ b/dev/t3c/Dockerfile @@ -14,13 +14,14 @@ # KIND, either express or implied. See the License for the # specific language governing permissions and limitations # under the License. +ARG GO_VERSION FROM alpine:latest AS traffic-server-builder RUN apk add --no-cache build-base perl libexecinfo-dev pcre-dev libressl-dev libtool linux-headers openssl-dev zlib-dev ADD https://downloads.apache.org/trafficserver/trafficserver-9.1.1.tar.bz2 / RUN tar -xf trafficserver-9.1.1.tar.bz2 && cd trafficserver-9.1.1 && mkdir /ats && ./configure --prefix / --enable-experimental-plugins && make -j && make install && ls -R /ats -FROM alpine:latest AS t3c-dev +FROM golang:${GO_VERSION}-alpine AS t3c-dev ENV TC="/root/go/src/github.com/apache/trafficcontrol/" VOLUME /root/go/src/github.com/apache/trafficcontrol @@ -37,7 +38,7 @@ COPY --from=traffic-server-builder /libexec/trafficserver /libexec/trafficserver COPY --from=traffic-server-builder /share/man /share/man RUN mkdir /share/trafficserver && mkdir -p /var/log/trafficserver && mkdir /var/trafficserver -RUN apk add --no-cache make inotify-tools go pcre libexecinfo && \ +RUN apk add --no-cache make inotify-tools gcc libc-dev pcre libexecinfo && \ go install github.com/go-delve/delve/cmd/dlv@latest && \ ln -s /root/go/bin/dlv /usr/bin/dlv && \ mkdir /lib64 && \ diff --git a/dev/traffic_monitor/Dockerfile b/dev/traffic_monitor/Dockerfile index dd62e19478..41ecf85821 100644 --- a/dev/traffic_monitor/Dockerfile +++ b/dev/traffic_monitor/Dockerfile @@ -11,13 +11,14 @@ # See the License for the specific language governing permissions and # limitations under the License. # -FROM alpine:latest AS trafficmonitor-dev +ARG GO_VERSION +FROM golang:${GO_VERSION}-alpine AS trafficmonitor-dev ENV TC=/root/go/src/github.com/apache/trafficcontrol VOLUME /root/go/src/github.com/apache/trafficcontrol EXPOSE 80 81 -RUN apk add --no-cache inotify-tools go && go install github.com/go-delve/delve/cmd/dlv@latest && ln -s /root/go/bin/dlv /usr/bin/dlv +RUN apk add --no-cache inotify-tools gcc libc-dev && go install github.com/go-delve/delve/cmd/dlv@latest && ln -s /root/go/bin/dlv /usr/bin/dlv RUN mkdir /lib64 && ln -s /lib/libc.musl-x86_64.so.1 /lib64/ld-linux-x86-64.so.2 CMD /root/go/src/github.com/apache/trafficcontrol/dev/traffic_monitor/run.sh diff --git a/dev/traffic_ops/Dockerfile b/dev/traffic_ops/Dockerfile index fec4ace810..d9fd2b1dd9 100644 --- a/dev/traffic_ops/Dockerfile +++ b/dev/traffic_ops/Dockerfile @@ -11,6 +11,7 @@ # See the License for the specific language governing permissions and # limitations under the License. # +ARG GO_VERSION FROM alpine:latest AS certbuilder RUN apk add --no-cache openssl RUN openssl genrsa -passout pass:x -out server.pass.key 2048 && \ @@ -21,7 +22,7 @@ RUN openssl genrsa -passout pass:x -out server.pass.key 2048 && \ openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt && \ openssl rand 32 | base64 > /aes.key -FROM alpine:latest AS trafficops-dev +FROM golang:${GO_VERSION}-alpine AS trafficops-dev ENV TC="/root/go/src/github.com/apache/trafficcontrol/" VOLUME /root/go/src/github.com/apache/trafficcontrol @@ -29,7 +30,9 @@ ENV ADMIN="$TC/traffic_ops/app/db/admin" EXPOSE 443 6444 COPY --from=certbuilder /server.key /server.crt /aes.key / -RUN apk add --no-cache make inotify-tools go postgresql-client && go install github.com/go-delve/delve/cmd/dlv@latest && ln -s /root/go/bin/dlv /usr/bin/dlv +RUN apk add --no-cache make inotify-tools postgresql-client gcc libc-dev && \ + go install github.com/go-delve/delve/cmd/dlv@latest && \ + ln -s /root/go/bin/dlv /usr/bin/dlv RUN mkdir /lib64 && ln -s /lib/libc.musl-x86_64.so.1 /lib64/ld-linux-x86-64.so.2 COPY .pgpass /root/.pgpass diff --git a/docker-compose.yml b/docker-compose.yml index 8ad4018f01..e9c44c6285 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -22,6 +22,8 @@ services: trafficops: build: context: dev/traffic_ops/ + args: + - GO_VERSION=${GO_VERSION} depends_on: - db domainname: dev.ciab.test @@ -71,6 +73,8 @@ services: trafficmonitor: build: context: dev/traffic_monitor + args: + - GO_VERSION=${GO_VERSION} depends_on: - trafficops hostname: trafficmonitor @@ -85,6 +89,8 @@ services: t3c: build: context: dev/t3c + args: + - GO_VERSION=${GO_VERSION} depends_on: - trafficops hostname: edge diff --git a/traffic_control/clients/python/pylint.rc b/traffic_control/clients/python/pylint.rc index 0f4fe2a6ef..77d93556e1 100644 --- a/traffic_control/clients/python/pylint.rc +++ b/traffic_control/clients/python/pylint.rc @@ -233,7 +233,7 @@ variable-naming-style=snake_case additional-builtins= # Tells whether unused global variables should be treated as a violation. -allow-global-unused-variables=no +allow-global-unused-variables=yes # List of strings which can identify a callback function by name. A callback # name must start or end with one of those strings. From 88dd79440db6e104b3a9f0fa42e495ae4fb7095c Mon Sep 17 00:00:00 2001 From: ocket8888 Date: Mon, 14 Feb 2022 08:31:57 -0700 Subject: [PATCH 56/98] Don't mask attempts to delete non-existent files/directories --- dev/traffic_router/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dev/traffic_router/Dockerfile b/dev/traffic_router/Dockerfile index b0aeedc564..a0894ed3c3 100644 --- a/dev/traffic_router/Dockerfile +++ b/dev/traffic_router/Dockerfile @@ -24,7 +24,7 @@ ADD https://archive.apache.org/dist/tomcat/tomcat-9/v9.0.43/bin/apache-tomcat-9. RUN cd /opt && \ tar -xf tomcat.tgz && \ mv apache-tomcat-* tomcat && \ - rm -rf tomcat.tgz tomcat/webapps/* tomcat/conf/web.xml tomcat/conf/server.xml tomcat/conf/logging.properties /usr/share/java/maven-3/conf/settings.xml + rm -r tomcat.tgz tomcat/webapps/* tomcat/conf/web.xml tomcat/conf/server.xml tomcat/conf/logging.properties /usr/share/java/maven-3/conf/settings.xml COPY settings.xml /usr/share/java/maven-3/conf/settings.xml From 9cece7a4f4e8586c9715bda7f7a27481c9806729 Mon Sep 17 00:00:00 2001 From: ocket8888 Date: Mon, 14 Feb 2022 08:34:26 -0700 Subject: [PATCH 57/98] Set CATALINA_BASE how TR wants it --- dev/traffic_router/Dockerfile | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/dev/traffic_router/Dockerfile b/dev/traffic_router/Dockerfile index a0894ed3c3..47888ae750 100644 --- a/dev/traffic_router/Dockerfile +++ b/dev/traffic_router/Dockerfile @@ -15,7 +15,7 @@ FROM alpine:latest AS trafficrouter-dev ENV TC=/root/go/src/github.com/apache/trafficcontrol VOLUME /root/go/src/github.com/apache/trafficcontrol -ENV JPDA_OPTS="-agentlib:jdwp=transport=dt_socket,address=5005,server=y,suspend=n" JAVA_HOME=/usr/lib/jvm/java-11-openjdk M2_HOME=/root/go/src/github.com/apache/trafficcontrol/.m2 +ENV JPDA_OPTS="-agentlib:jdwp=transport=dt_socket,address=5005,server=y,suspend=n" JAVA_HOME=/usr/lib/jvm/java-11-openjdk M2_HOME=/root/go/src/github.com/apache/trafficcontrol/.m2 CATALINA_BASE=/opt/traffic_router EXPOSE 3053:53/tcp 3053:53/udp 3080:80 3443:443 3333:3333 2222:3443 5005:5005 RUN apk add --no-cache openjdk11 inotify-tools maven && ln -s /usr/lib/jvm/java-11-openjdk/bin/jdb /bin/jdb @@ -24,7 +24,8 @@ ADD https://archive.apache.org/dist/tomcat/tomcat-9/v9.0.43/bin/apache-tomcat-9. RUN cd /opt && \ tar -xf tomcat.tgz && \ mv apache-tomcat-* tomcat && \ - rm -r tomcat.tgz tomcat/webapps/* tomcat/conf/web.xml tomcat/conf/server.xml tomcat/conf/logging.properties /usr/share/java/maven-3/conf/settings.xml + rm -r tomcat.tgz tomcat/webapps/* tomcat/conf/web.xml tomcat/conf/server.xml tomcat/conf/logging.properties /usr/share/java/maven-3/conf/settings.xml && \ + ln -s /root/go/src/github.com/apache/trafficcontrol/dev/traffic_router /opt/traffic_router COPY settings.xml /usr/share/java/maven-3/conf/settings.xml From 20f4cf607905515d8f9387f8c3219c66d1b3e47f Mon Sep 17 00:00:00 2001 From: ocket8888 Date: Mon, 14 Feb 2022 08:35:37 -0700 Subject: [PATCH 58/98] Don't remove files that don't need to be removed --- dev/traffic_router/Dockerfile | 2 +- dev/traffic_router/run.sh | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/dev/traffic_router/Dockerfile b/dev/traffic_router/Dockerfile index 47888ae750..82c5efddb1 100644 --- a/dev/traffic_router/Dockerfile +++ b/dev/traffic_router/Dockerfile @@ -24,7 +24,7 @@ ADD https://archive.apache.org/dist/tomcat/tomcat-9/v9.0.43/bin/apache-tomcat-9. RUN cd /opt && \ tar -xf tomcat.tgz && \ mv apache-tomcat-* tomcat && \ - rm -r tomcat.tgz tomcat/webapps/* tomcat/conf/web.xml tomcat/conf/server.xml tomcat/conf/logging.properties /usr/share/java/maven-3/conf/settings.xml && \ + rm -r tomcat.tgz tomcat/webapps/* /usr/share/java/maven-3/conf/settings.xml && \ ln -s /root/go/src/github.com/apache/trafficcontrol/dev/traffic_router /opt/traffic_router COPY settings.xml /usr/share/java/maven-3/conf/settings.xml diff --git a/dev/traffic_router/run.sh b/dev/traffic_router/run.sh index 44233e4c00..8946893619 100755 --- a/dev/traffic_router/run.sh +++ b/dev/traffic_router/run.sh @@ -24,7 +24,6 @@ mvn -Dmaven.test.skip=true compile -P \!rpm-build mvn -Dmaven.test.skip=true package -P \!rpm-build cp core/target/ROOT.war /opt/tomcat/webapps/ -ln -s $TC/dev/traffic_router/conf/* /opt/tomcat/conf/ /opt/tomcat/bin/catalina.sh jpda run # java -agentlib:jdwp=transport=dt_socket,address=5005,server=y,suspend=n StartTrafficRouter From 5ba315c4090476a00250a735601b7f771eeaafed Mon Sep 17 00:00:00 2001 From: ocket8888 Date: Mon, 14 Feb 2022 08:37:34 -0700 Subject: [PATCH 59/98] Use symlink instead of a .war file --- dev/traffic_router/run.sh | 2 -- dev/traffic_router/webapps/ROOT | 1 + 2 files changed, 1 insertion(+), 2 deletions(-) create mode 120000 dev/traffic_router/webapps/ROOT diff --git a/dev/traffic_router/run.sh b/dev/traffic_router/run.sh index 8946893619..13cbca1154 100755 --- a/dev/traffic_router/run.sh +++ b/dev/traffic_router/run.sh @@ -23,8 +23,6 @@ cd "$TC/traffic_router" mvn -Dmaven.test.skip=true compile -P \!rpm-build mvn -Dmaven.test.skip=true package -P \!rpm-build -cp core/target/ROOT.war /opt/tomcat/webapps/ - /opt/tomcat/bin/catalina.sh jpda run # java -agentlib:jdwp=transport=dt_socket,address=5005,server=y,suspend=n StartTrafficRouter diff --git a/dev/traffic_router/webapps/ROOT b/dev/traffic_router/webapps/ROOT new file mode 120000 index 0000000000..14a4d1b428 --- /dev/null +++ b/dev/traffic_router/webapps/ROOT @@ -0,0 +1 @@ +../../../traffic_router/core/target/ROOT \ No newline at end of file From 6a574b3439c8746ea25f824127bc339e3f972235 Mon Sep 17 00:00:00 2001 From: ocket8888 Date: Mon, 14 Feb 2022 08:39:41 -0700 Subject: [PATCH 60/98] Add lib symlink so Tomcat can load TR --- dev/traffic_router/lib | 1 + 1 file changed, 1 insertion(+) create mode 120000 dev/traffic_router/lib diff --git a/dev/traffic_router/lib b/dev/traffic_router/lib new file mode 120000 index 0000000000..4bb5698b4b --- /dev/null +++ b/dev/traffic_router/lib @@ -0,0 +1 @@ +../../traffic_router/core/target/ROOT/WEB-INF/lib \ No newline at end of file From 41430ba3e2a5378652efea8d6b1a41081de6f8f4 Mon Sep 17 00:00:00 2001 From: ocket8888 Date: Mon, 14 Feb 2022 08:39:55 -0700 Subject: [PATCH 61/98] Fix JDPA port specification --- dev/traffic_router/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dev/traffic_router/Dockerfile b/dev/traffic_router/Dockerfile index 82c5efddb1..8a3c6f50b9 100644 --- a/dev/traffic_router/Dockerfile +++ b/dev/traffic_router/Dockerfile @@ -15,7 +15,7 @@ FROM alpine:latest AS trafficrouter-dev ENV TC=/root/go/src/github.com/apache/trafficcontrol VOLUME /root/go/src/github.com/apache/trafficcontrol -ENV JPDA_OPTS="-agentlib:jdwp=transport=dt_socket,address=5005,server=y,suspend=n" JAVA_HOME=/usr/lib/jvm/java-11-openjdk M2_HOME=/root/go/src/github.com/apache/trafficcontrol/.m2 CATALINA_BASE=/opt/traffic_router +ENV JPDA_OPTS="-agentlib:jdwp=transport=dt_socket,address=*:5005,server=y,suspend=n" JAVA_HOME=/usr/lib/jvm/java-11-openjdk M2_HOME=/root/go/src/github.com/apache/trafficcontrol/.m2 CATALINA_BASE=/opt/traffic_router EXPOSE 3053:53/tcp 3053:53/udp 3080:80 3443:443 3333:3333 2222:3443 5005:5005 RUN apk add --no-cache openjdk11 inotify-tools maven && ln -s /usr/lib/jvm/java-11-openjdk/bin/jdb /bin/jdb From ccd7262bdf6a2c5835f78186c0d58fe9f40302a6 Mon Sep 17 00:00:00 2001 From: ocket8888 Date: Mon, 14 Feb 2022 09:36:37 -0700 Subject: [PATCH 62/98] Remove unused file --- dev/traffic_router/conf/startup.properties | 30 ---------------------- 1 file changed, 30 deletions(-) delete mode 100644 dev/traffic_router/conf/startup.properties diff --git a/dev/traffic_router/conf/startup.properties b/dev/traffic_router/conf/startup.properties deleted file mode 100644 index fb7e6f9036..0000000000 --- a/dev/traffic_router/conf/startup.properties +++ /dev/null @@ -1,30 +0,0 @@ -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -# Any environment variables you define here will become part of the startup -# environment for the 'traffic_router' service. It is a good place to set -# command line arguments for the Java command line or any environment specific -# setting you want available to the traffic_router process. -# This file is not replaced by the update process when a new version of traffic -# router is installed. -CATALINA_OPTS="\ - -server -Xms2g -Xmx8g \ - -Dlog4j.configuration=file:///opt/tomcat/conf/log4j2.xml \ - -Djava.library.path=/usr/lib \ - -Dorg.apache.catalina.connector.Response.ENFORCE_ENCODING_IN_GET_WRITER=false \ - -XX:+UseG1GC \ - -XX:+UnlockExperimentalVMOptions \ - -XX:InitiatingHeapOccupancyPercent=30" -JAVA_OPTS="\ - -Djava.awt.headless=true \ - -Djava.security.egd=file:/dev/./urandom" From bb06c90a2cc9e44a697a3d3c05f58119a5775c60 Mon Sep 17 00:00:00 2001 From: ocket8888 Date: Mon, 14 Feb 2022 10:11:59 -0700 Subject: [PATCH 63/98] Fix TM properties path --- dev/traffic_router/conf/traffic_monitor.properties | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dev/traffic_router/conf/traffic_monitor.properties b/dev/traffic_router/conf/traffic_monitor.properties index 386574d8b0..408d5552b0 100644 --- a/dev/traffic_router/conf/traffic_monitor.properties +++ b/dev/traffic_router/conf/traffic_monitor.properties @@ -3,7 +3,7 @@ # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 -# +# # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. @@ -11,5 +11,5 @@ # limitations under the License. traffic_monitor.bootstrap.hosts=trafficmonitor:80; traffic_monitor.bootstrap.local = false -traffic_monitor.properties=file:/opt/tomcat/conf/traffic_monitor.properties +traffic_monitor.properties=file:/opt/traffic_router/conf/traffic_monitor.properties traffic_monitor.properties.reload.period=60000 From 942b7f82d764fa2c97a93e239d5a57cd5d8b9aa5 Mon Sep 17 00:00:00 2001 From: ocket8888 Date: Mon, 14 Feb 2022 10:12:59 -0700 Subject: [PATCH 64/98] Fix creating a ton of things owned by root in the TR container --- dev/traffic_router/Dockerfile | 9 +++++++-- dev/traffic_router/run.sh | 1 + 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/dev/traffic_router/Dockerfile b/dev/traffic_router/Dockerfile index 8a3c6f50b9..eb3ba15034 100644 --- a/dev/traffic_router/Dockerfile +++ b/dev/traffic_router/Dockerfile @@ -15,12 +15,17 @@ FROM alpine:latest AS trafficrouter-dev ENV TC=/root/go/src/github.com/apache/trafficcontrol VOLUME /root/go/src/github.com/apache/trafficcontrol -ENV JPDA_OPTS="-agentlib:jdwp=transport=dt_socket,address=*:5005,server=y,suspend=n" JAVA_HOME=/usr/lib/jvm/java-11-openjdk M2_HOME=/root/go/src/github.com/apache/trafficcontrol/.m2 CATALINA_BASE=/opt/traffic_router +ENV JPDA_OPTS="-agentlib:jdwp=transport=dt_socket,address=*:5005,server=y,suspend=n" JAVA_HOME=/usr/lib/jvm/java-11-openjdk M2_HOME=/root/go/src/github.com/apache/trafficcontrol/.m2 CATALINA_BASE=/opt/traffic_router TRAFFIC_MONITOR_HOSTS=trafficmonitor EXPOSE 3053:53/tcp 3053:53/udp 3080:80 3443:443 3333:3333 2222:3443 5005:5005 -RUN apk add --no-cache openjdk11 inotify-tools maven && ln -s /usr/lib/jvm/java-11-openjdk/bin/jdb /bin/jdb +RUN apk add --no-cache openjdk11 inotify-tools maven tomcat-native openssl && ln -s /usr/lib/jvm/java-11-openjdk/bin/jdb /bin/jdb ADD https://archive.apache.org/dist/tomcat/tomcat-9/v9.0.43/bin/apache-tomcat-9.0.43.tar.gz /opt/tomcat.tgz + +ARG USER +RUN adduser -H -D ${USER} +RUN chown -R ${USER} /opt /usr/share/java/ /root +USER ${USER} RUN cd /opt && \ tar -xf tomcat.tgz && \ mv apache-tomcat-* tomcat && \ diff --git a/dev/traffic_router/run.sh b/dev/traffic_router/run.sh index 13cbca1154..d17c2c9f12 100755 --- a/dev/traffic_router/run.sh +++ b/dev/traffic_router/run.sh @@ -23,6 +23,7 @@ cd "$TC/traffic_router" mvn -Dmaven.test.skip=true compile -P \!rpm-build mvn -Dmaven.test.skip=true package -P \!rpm-build +chmod -R a+rw "$TC/dev/traffic_router/" /opt/tomcat/bin/catalina.sh jpda run # java -agentlib:jdwp=transport=dt_socket,address=5005,server=y,suspend=n StartTrafficRouter From 14e80ee78159297554c09df208ca3dc7c763fd84 Mon Sep 17 00:00:00 2001 From: ocket8888 Date: Mon, 14 Feb 2022 10:40:01 -0700 Subject: [PATCH 65/98] Switch to a network instead of domains --- docker-compose.yml | 27 ++++++++++++++++++++------- 1 file changed, 20 insertions(+), 7 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index e9c44c6285..c5880d2a9f 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -26,7 +26,8 @@ services: - GO_VERSION=${GO_VERSION} depends_on: - db - domainname: dev.ciab.test + networks: + - ciab hostname: trafficops image: trafficops-dev ports: @@ -42,7 +43,8 @@ services: environment: - POSTGRES_PASSWORD=twelve12 hostname: db - domainname: dev.ciab.test + networks: + - ciab trafficportal: build: @@ -50,7 +52,8 @@ services: depends_on: - trafficops hostname: trafficportal - domainname: dev.ciab.test + networks: + - ciab image: trafficportal-dev ports: - 444:443 @@ -63,7 +66,8 @@ services: depends_on: - trafficops hostname: tpv2 - domainname: dev.ciab.test + networks: + - ciab image: tpv2-dev ports: - 443:443 @@ -78,7 +82,8 @@ services: depends_on: - trafficops hostname: trafficmonitor - domainname: dev.ciab.test + networks: + - ciab image: trafficmonitor-dev ports: - 80:80 @@ -94,7 +99,8 @@ services: depends_on: - trafficops hostname: edge - domainname: dev.ciab.test + networks: + - ciab image: t3c-dev ports: - 8080:80 @@ -105,10 +111,13 @@ services: trafficrouter: build: context: dev/traffic_router + args: + - USER=${USER} depends_on: - trafficmonitor hostname: trafficrouter - domainname: dev.ciab.test + networks: + - ciab image: trafficrouter-dev ports: - 3053:53/tcp @@ -120,3 +129,7 @@ services: - 5005:5005 volumes: - .:/root/go/src/github.com/apache/trafficcontrol +networks: + ciab: + name: dev.ciab.test + driver: bridge From a835be9c574219d1f3d08b9c1369d03fbb00e0b9 Mon Sep 17 00:00:00 2001 From: ocket8888 Date: Mon, 14 Feb 2022 10:40:21 -0700 Subject: [PATCH 66/98] Add a polling URL for the GeoIP2 database --- dev/traffic_ops/seed.psql | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/dev/traffic_ops/seed.psql b/dev/traffic_ops/seed.psql index ea0e7645ba..54d05c0a46 100644 --- a/dev/traffic_ops/seed.psql +++ b/dev/traffic_ops/seed.psql @@ -45,7 +45,7 @@ INSERT INTO snapshot ( monitoring ) VALUES ( 'dev', - '{"config":{"dnssec.enabled":"false","domain_name":"ciab.test"},"contentServers":{"edge":{"cacheGroup":"dev","fqdn":"edge.dev.ciab.test","hashCount":999,"hashId":"edge","httpsPort":443,"interfaceName":"eth0","ip":"129.0.0.2","ip6":"","locationId":"dev","port":80,"profile":"EDGE_dev","status":"REPORTED","type":"EDGE","routingDisabled":0}},"deliveryServices":{"dev":{"anonymousBlockingEnabled":"false","coverageZoneOnly":"false","deepCachingType":"NEVER","dispersion":{"limit":1,"shuffled":"true"},"domains":["dev.ciab.test"],"ecsEnabled":"false","geolocationProvider":"maxmindGeolocationService","ip6RoutingEnabled":"false","matchsets":[{"protocol":"HTTP","matchlist":[{"regex":".*\\\\.dev\\\\..*","match-type":"HOST"}]}],"protocol":{"acceptHttps":"false","redirectToHttps":"false"},"regionalGeoBlocking":"false","routingName":"cdn","soa":{"admin":"traffic_ops","expire":"604800","minimum":"30","refresh":"28800","retry":"7200"},"sslEnabled":"false","ttls":{"A":"","AAAA":"","NS":"3600","SOA":"86400"}}},"edgeLocations":{"dev":{"latitude":0,"longitude":0,"backupLocations":{"fallbackToClosest":"true"},"localizationMethods":["GEO","CZ","DEEP_CZ"]}},"monitors":{"trafficmonitor":{"fqdn":"trafficmonitor.dev.ciab.test","httpsPort":null,"ip":"129.0.0.1","ip6":"","location":"dev","port":80,"profile":"RASCAL_TM_dev","status":"ONLINE"}},"stats":{"CDN_name":"dev","date":1643833749,"tm_host":"","tm_user":"admin","tm_version":"development"}}', + '{"config":{"dnssec.enabled":"false","domain_name":"ciab.test"},"contentServers":{"edge":{"cacheGroup":"dev","fqdn":"edge.dev.ciab.test","hashCount":999,"hashId":"edge","httpsPort":443,"interfaceName":"eth0","ip":"129.0.0.2","ip6":"","locationId":"dev","port":80,"profile":"EDGE_dev","status":"REPORTED","type":"EDGE","routingDisabled":0}},"deliveryServices":{"dev":{"anonymousBlockingEnabled":"false","coverageZoneOnly":"false","deepCachingType":"NEVER","dispersion":{"limit":1,"shuffled":"true"},"domains":["dev.ciab.test"],"ecsEnabled":"false","geolocationProvider":"maxmindGeolocationService","ip6RoutingEnabled":"false","matchsets":[{"protocol":"HTTP","matchlist":[{"regex":".*\\\\.dev\\\\..*","match-type":"HOST"}]}],"protocol":{"acceptHttps":"false","redirectToHttps":"false"},"regionalGeoBlocking":"false","routingName":"cdn","soa":{"admin":"traffic_ops","expire":"604800","minimum":"30","refresh":"28800","retry":"7200"},"sslEnabled":"false","ttls":{"A":"","AAAA":"","NS":"3600","SOA":"86400"}}},"edgeLocations":{"dev":{"latitude":0,"longitude":0,"backupLocations":{"fallbackToClosest":"true"},"localizationMethods":["GEO","CZ","DEEP_CZ"]}},"monitors":{"trafficmonitor":{"fqdn":"trafficmonitor.dev.ciab.test","httpsPort":null,"ip":"129.0.0.1","ip6":"","location":"dev","port":80,"profile":"RASCAL_TM_dev","status":"ONLINE"}},"stats":{"CDN_name":"dev","date":1643833749,"tm_host":"trafficops","tm_user":"admin","tm_version":"development"}}', '{"trafficServers":[{"profile":"EDGE_dev","status":"REPORTED","port":80,"cachegroup":"dev","hostname":"edge","fqdn":"edge.dev.ciab.test","interfaces":[{"ipAddresses":[{"address":"129.0.0.2","gateway":null,"serviceAddress":true}],"maxBandwidth":null,"monitor":true,"mtu":1500,"name":"eth0"}],"type":"EDGE","hashid":""}],"trafficMonitors":[{"profile":"RASCAL_TM_dev","status":"ONLINE","port":80,"cachegroup":"dev","hostname":"trafficmonitor","fqdn":"trafficmonitor.dev.ciab.test","ip":"129.0.0.1","ip6":""}],"cacheGroups":[{"name":"dev","coordinates":{"latitude":0,"longitude":0}}],"profiles":[{"name":"EDGE_dev","type":"EDGE","parameters":{"health.polling.format":"stats_over_http","health.polling.url":"http://edge:8080/_stats?application=\u0026inf.name=${interface_name}"}}],"deliveryServices":[{"xmlId":"dev","totalTpsThreshold":0,"status":"REPORTED","totalKbpsThreshold":0}],"config":{"health.polling.interval":6000,"heartbeat.polling.interval":3000,"peers.polling.interval":3000,"tm.polling.interval":2000}}' ); @@ -64,6 +64,11 @@ INSERT INTO profile ( 'dev edge Profile', 'ATS_PROFILE', (SELECT id FROM cdn WHERE "name" = 'dev') +), ( + 'GLOBAL', + 'dev global Profile', + 'UNK_PROFILE', + (SELECT id FROM cdn WHERE "name" = 'ALL') ); INSERT INTO parameter ( @@ -94,6 +99,10 @@ INSERT INTO parameter ( 'rascal.properties', 'health.polling.format', 'stats_over_http' +), ( + 'CRConfig.json', + 'geolocation.polling.url', + 'file:///root/go/src/github.com/apache/trafficcontrol/traffic_router/core/src/test/resources/geo/GeoLite2-City.mmdb.gz' ); INSERT INTO profile_parameter @@ -109,6 +118,12 @@ FROM profile, parameter WHERE parameter.config_file = 'rascal.properties' AND profile."name" = 'EDGE_dev'; +INSERT INTO profile_parameter +SELECT profile.id, parameter.id +FROM profile, parameter +WHERE parameter.config_file = 'CRConfig.json' +AND profile."name" = 'GLOBAL'; + INSERT INTO division ("name") VALUES ('dev'); INSERT INTO region ( "name", From 3ec31eb17dc678b749ad9b686ebf95b10c6c9619 Mon Sep 17 00:00:00 2001 From: ocket8888 Date: Mon, 14 Feb 2022 10:40:33 -0700 Subject: [PATCH 67/98] Add README --- dev/README.md | 71 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 71 insertions(+) create mode 100644 dev/README.md diff --git a/dev/README.md b/dev/README.md new file mode 100644 index 0000000000..99ff763d0f --- /dev/null +++ b/dev/README.md @@ -0,0 +1,71 @@ + + +# Development Environment +The ATC development environment - housed in this directory - can be used to +quickly make changes to ATC components and test them immediately. + +To use the development environment, ensure you are in the repository's root and +source the `dev/atc.dev.sh` file. Then, use `atc` to run commands (see +`atc --help` for usage). + +## Traffic Ops +Traffic Ops will start with its API bound to local port 6443. The API will use a +self-signed certificate, so `curl` commands to the API will need to use +`-k`/`--insecure` (as will `toget`/`toput`/`topost`/`todelete`). The Delve +debugger for Go listens on port 6444 for connections to debug Traffic Ops. + +The login credentials for the "admin" user are the same as those for the user of +the same name in CDN-in-a-Box - password is `twelve12`. + +## Traffic Portal +The current version of Traffic Portal serves using HTTPS on port 444. The +certificate it uses is self-signed, so browsers will warn that the site is +insecure. + +## Traffic Portal "v2" +The experimental Traffic Portal (`experimental/traffic-portal`) serves using +HTTP on port 443. The certificate it uses is self-signed, so browsers will warn +that the site is insecure. + +## Traffic Monitor +The Traffic Monitor API is served locally over HTTP on port 80. The Delve +debugger for Go listens on port 81 for connections to debug Traffic Monitor. + +Note that Traffic Monitor will do almost nothing useful if the edge cache server +(the `t3c` service) is not running when it starts. + +## Database/Traffic Vault +A Postgres database listens on port 5432 (this conflicts with the default port +for running Postgres, so any Postgres servers running on the host machine may +need to be stopped before running ATC) and houses the Traffic Ops database as +`traffic_ops_development`, and the Traffic Vault database as +`traffic_vault_development`. To connect as the Traffic Ops user to the Traffic +Ops database, use the username `traffic_ops` and the password `twelve12`. To +connect as the Traffic Ops Vault user to the Traffic Vault database, use the +username `traffic_vault` and the password `twelve12`. + +## T3C +An edge-tier cache server listens for HTTP (HTTPS not supported) connections on +local port 8080. The Delve debugger for Go listens on port 8081 for connections +to debug `t3c` sub-commands. + +Note that, while in most production deployments `t3c` runs on a `cron` schedule, +`t3c` is never run in this service container, normally. One must manualy trigger +a run, usually by using the `t3c` function provided by `atc.dev.sh`. From 072fb692a01fad81e6890bc911a8866f9634a614 Mon Sep 17 00:00:00 2001 From: ocket8888 Date: Mon, 14 Feb 2022 10:55:56 -0700 Subject: [PATCH 68/98] Fix .env not covered by licensing --- .dependency_license | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.dependency_license b/.dependency_license index 0f12e48a45..1657efd119 100644 --- a/.dependency_license +++ b/.dependency_license @@ -160,3 +160,7 @@ GeoLite2-City.mmdb.gz, !MIT /Roboto\.ttf$, Apache-2.0 /Roboto\.\d+\.ttf$, Apache-2.0 /MaterialIcons.ttf$, Apache-2.0 + +# Files that have content generated - not written - by code already covered +# under its own licenses terms. +^\.env$, Apache-2.0 From a426aaa3be96c354ac694936de4a3065faa75813 Mon Sep 17 00:00:00 2001 From: ocket8888 Date: Fri, 18 Feb 2022 14:59:09 -0700 Subject: [PATCH 69/98] Fix inserting GLOBAL profile that already exists --- dev/traffic_ops/seed.psql | 5 ----- 1 file changed, 5 deletions(-) diff --git a/dev/traffic_ops/seed.psql b/dev/traffic_ops/seed.psql index 54d05c0a46..52c112cedb 100644 --- a/dev/traffic_ops/seed.psql +++ b/dev/traffic_ops/seed.psql @@ -64,11 +64,6 @@ INSERT INTO profile ( 'dev edge Profile', 'ATS_PROFILE', (SELECT id FROM cdn WHERE "name" = 'dev') -), ( - 'GLOBAL', - 'dev global Profile', - 'UNK_PROFILE', - (SELECT id FROM cdn WHERE "name" = 'ALL') ); INSERT INTO parameter ( From 5ec6c898c678937f884343854ef4156a4e6706ae Mon Sep 17 00:00:00 2001 From: ocket8888 Date: Mon, 21 Feb 2022 10:18:29 -0700 Subject: [PATCH 70/98] Add geolocation db polling url to initial snapshot --- dev/traffic_ops/seed.psql | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dev/traffic_ops/seed.psql b/dev/traffic_ops/seed.psql index 52c112cedb..b1b71afc21 100644 --- a/dev/traffic_ops/seed.psql +++ b/dev/traffic_ops/seed.psql @@ -45,7 +45,7 @@ INSERT INTO snapshot ( monitoring ) VALUES ( 'dev', - '{"config":{"dnssec.enabled":"false","domain_name":"ciab.test"},"contentServers":{"edge":{"cacheGroup":"dev","fqdn":"edge.dev.ciab.test","hashCount":999,"hashId":"edge","httpsPort":443,"interfaceName":"eth0","ip":"129.0.0.2","ip6":"","locationId":"dev","port":80,"profile":"EDGE_dev","status":"REPORTED","type":"EDGE","routingDisabled":0}},"deliveryServices":{"dev":{"anonymousBlockingEnabled":"false","coverageZoneOnly":"false","deepCachingType":"NEVER","dispersion":{"limit":1,"shuffled":"true"},"domains":["dev.ciab.test"],"ecsEnabled":"false","geolocationProvider":"maxmindGeolocationService","ip6RoutingEnabled":"false","matchsets":[{"protocol":"HTTP","matchlist":[{"regex":".*\\\\.dev\\\\..*","match-type":"HOST"}]}],"protocol":{"acceptHttps":"false","redirectToHttps":"false"},"regionalGeoBlocking":"false","routingName":"cdn","soa":{"admin":"traffic_ops","expire":"604800","minimum":"30","refresh":"28800","retry":"7200"},"sslEnabled":"false","ttls":{"A":"","AAAA":"","NS":"3600","SOA":"86400"}}},"edgeLocations":{"dev":{"latitude":0,"longitude":0,"backupLocations":{"fallbackToClosest":"true"},"localizationMethods":["GEO","CZ","DEEP_CZ"]}},"monitors":{"trafficmonitor":{"fqdn":"trafficmonitor.dev.ciab.test","httpsPort":null,"ip":"129.0.0.1","ip6":"","location":"dev","port":80,"profile":"RASCAL_TM_dev","status":"ONLINE"}},"stats":{"CDN_name":"dev","date":1643833749,"tm_host":"trafficops","tm_user":"admin","tm_version":"development"}}', + '{"config":{"dnssec.enabled":"false","domain_name":"ciab.test","geolocation.polling.url":"file:///root/go/src/apache/trafficcontrol/traffic_router/core/src/test/resources/geo/GeoLite2-City.mmdb.gz"},"contentServers":{"edge":{"cacheGroup":"dev","fqdn":"edge.dev.ciab.test","hashCount":999,"hashId":"edge","httpsPort":443,"interfaceName":"eth0","ip":"129.0.0.2","ip6":"","locationId":"dev","port":80,"profile":"EDGE_dev","status":"REPORTED","type":"EDGE","routingDisabled":0}},"deliveryServices":{"dev":{"anonymousBlockingEnabled":"false","coverageZoneOnly":"false","deepCachingType":"NEVER","dispersion":{"limit":1,"shuffled":"true"},"domains":["dev.ciab.test"],"ecsEnabled":"false","geolocationProvider":"maxmindGeolocationService","ip6RoutingEnabled":"false","matchsets":[{"protocol":"HTTP","matchlist":[{"regex":".*\\\\.dev\\\\..*","match-type":"HOST"}]}],"protocol":{"acceptHttps":"false","redirectToHttps":"false"},"regionalGeoBlocking":"false","routingName":"cdn","soa":{"admin":"traffic_ops","expire":"604800","minimum":"30","refresh":"28800","retry":"7200"},"sslEnabled":"false","ttls":{"A":"","AAAA":"","NS":"3600","SOA":"86400"}}},"edgeLocations":{"dev":{"latitude":0,"longitude":0,"backupLocations":{"fallbackToClosest":"true"},"localizationMethods":["GEO","CZ","DEEP_CZ"]}},"monitors":{"trafficmonitor":{"fqdn":"trafficmonitor.dev.ciab.test","httpsPort":null,"ip":"129.0.0.1","ip6":"","location":"dev","port":80,"profile":"RASCAL_TM_dev","status":"ONLINE"}},"stats":{"CDN_name":"dev","date":1643833749,"tm_host":"trafficops","tm_user":"admin","tm_version":"development"}}', '{"trafficServers":[{"profile":"EDGE_dev","status":"REPORTED","port":80,"cachegroup":"dev","hostname":"edge","fqdn":"edge.dev.ciab.test","interfaces":[{"ipAddresses":[{"address":"129.0.0.2","gateway":null,"serviceAddress":true}],"maxBandwidth":null,"monitor":true,"mtu":1500,"name":"eth0"}],"type":"EDGE","hashid":""}],"trafficMonitors":[{"profile":"RASCAL_TM_dev","status":"ONLINE","port":80,"cachegroup":"dev","hostname":"trafficmonitor","fqdn":"trafficmonitor.dev.ciab.test","ip":"129.0.0.1","ip6":""}],"cacheGroups":[{"name":"dev","coordinates":{"latitude":0,"longitude":0}}],"profiles":[{"name":"EDGE_dev","type":"EDGE","parameters":{"health.polling.format":"stats_over_http","health.polling.url":"http://edge:8080/_stats?application=\u0026inf.name=${interface_name}"}}],"deliveryServices":[{"xmlId":"dev","totalTpsThreshold":0,"status":"REPORTED","totalKbpsThreshold":0}],"config":{"health.polling.interval":6000,"heartbeat.polling.interval":3000,"peers.polling.interval":3000,"tm.polling.interval":2000}}' ); From 3718d15edd073364b1aa22658c77cfcd82faa559 Mon Sep 17 00:00:00 2001 From: ocket8888 Date: Mon, 21 Feb 2022 10:18:51 -0700 Subject: [PATCH 71/98] Remove unnecessary maven step --- dev/traffic_router/run.sh | 1 - 1 file changed, 1 deletion(-) diff --git a/dev/traffic_router/run.sh b/dev/traffic_router/run.sh index d17c2c9f12..5c73c22269 100755 --- a/dev/traffic_router/run.sh +++ b/dev/traffic_router/run.sh @@ -21,7 +21,6 @@ set -o errexit cd "$TC/traffic_router" mvn -Dmaven.test.skip=true compile -P \!rpm-build -mvn -Dmaven.test.skip=true package -P \!rpm-build chmod -R a+rw "$TC/dev/traffic_router/" /opt/tomcat/bin/catalina.sh jpda run From 69149d103ac60696e5b7e25a04b094a50171cc8a Mon Sep 17 00:00:00 2001 From: ocket8888 Date: Mon, 21 Feb 2022 13:46:17 -0700 Subject: [PATCH 72/98] Fix file path on geolocation polling url in Snapshot --- dev/traffic_ops/seed.psql | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dev/traffic_ops/seed.psql b/dev/traffic_ops/seed.psql index b1b71afc21..a6a1e6125b 100644 --- a/dev/traffic_ops/seed.psql +++ b/dev/traffic_ops/seed.psql @@ -45,7 +45,7 @@ INSERT INTO snapshot ( monitoring ) VALUES ( 'dev', - '{"config":{"dnssec.enabled":"false","domain_name":"ciab.test","geolocation.polling.url":"file:///root/go/src/apache/trafficcontrol/traffic_router/core/src/test/resources/geo/GeoLite2-City.mmdb.gz"},"contentServers":{"edge":{"cacheGroup":"dev","fqdn":"edge.dev.ciab.test","hashCount":999,"hashId":"edge","httpsPort":443,"interfaceName":"eth0","ip":"129.0.0.2","ip6":"","locationId":"dev","port":80,"profile":"EDGE_dev","status":"REPORTED","type":"EDGE","routingDisabled":0}},"deliveryServices":{"dev":{"anonymousBlockingEnabled":"false","coverageZoneOnly":"false","deepCachingType":"NEVER","dispersion":{"limit":1,"shuffled":"true"},"domains":["dev.ciab.test"],"ecsEnabled":"false","geolocationProvider":"maxmindGeolocationService","ip6RoutingEnabled":"false","matchsets":[{"protocol":"HTTP","matchlist":[{"regex":".*\\\\.dev\\\\..*","match-type":"HOST"}]}],"protocol":{"acceptHttps":"false","redirectToHttps":"false"},"regionalGeoBlocking":"false","routingName":"cdn","soa":{"admin":"traffic_ops","expire":"604800","minimum":"30","refresh":"28800","retry":"7200"},"sslEnabled":"false","ttls":{"A":"","AAAA":"","NS":"3600","SOA":"86400"}}},"edgeLocations":{"dev":{"latitude":0,"longitude":0,"backupLocations":{"fallbackToClosest":"true"},"localizationMethods":["GEO","CZ","DEEP_CZ"]}},"monitors":{"trafficmonitor":{"fqdn":"trafficmonitor.dev.ciab.test","httpsPort":null,"ip":"129.0.0.1","ip6":"","location":"dev","port":80,"profile":"RASCAL_TM_dev","status":"ONLINE"}},"stats":{"CDN_name":"dev","date":1643833749,"tm_host":"trafficops","tm_user":"admin","tm_version":"development"}}', + '{"config":{"dnssec.enabled":"false","domain_name":"ciab.test","geolocation.polling.url":"file:///root/go/src/github.com/apache/trafficcontrol/traffic_router/core/src/test/resources/geo/GeoLite2-City.mmdb.gz"},"contentServers":{"edge":{"cacheGroup":"dev","fqdn":"edge.dev.ciab.test","hashCount":999,"hashId":"edge","httpsPort":443,"interfaceName":"eth0","ip":"129.0.0.2","ip6":"","locationId":"dev","port":80,"profile":"EDGE_dev","status":"REPORTED","type":"EDGE","routingDisabled":0}},"deliveryServices":{"dev":{"anonymousBlockingEnabled":"false","coverageZoneOnly":"false","deepCachingType":"NEVER","dispersion":{"limit":1,"shuffled":"true"},"domains":["dev.ciab.test"],"ecsEnabled":"false","geolocationProvider":"maxmindGeolocationService","ip6RoutingEnabled":"false","matchsets":[{"protocol":"HTTP","matchlist":[{"regex":".*\\\\.dev\\\\..*","match-type":"HOST"}]}],"protocol":{"acceptHttps":"false","redirectToHttps":"false"},"regionalGeoBlocking":"false","routingName":"cdn","soa":{"admin":"traffic_ops","expire":"604800","minimum":"30","refresh":"28800","retry":"7200"},"sslEnabled":"false","ttls":{"A":"","AAAA":"","NS":"3600","SOA":"86400"}}},"edgeLocations":{"dev":{"latitude":0,"longitude":0,"backupLocations":{"fallbackToClosest":"true"},"localizationMethods":["GEO","CZ","DEEP_CZ"]}},"monitors":{"trafficmonitor":{"fqdn":"trafficmonitor.dev.ciab.test","httpsPort":null,"ip":"129.0.0.1","ip6":"","location":"dev","port":80,"profile":"RASCAL_TM_dev","status":"ONLINE"}},"stats":{"CDN_name":"dev","date":1643833749,"tm_host":"trafficops","tm_user":"admin","tm_version":"development"}}', '{"trafficServers":[{"profile":"EDGE_dev","status":"REPORTED","port":80,"cachegroup":"dev","hostname":"edge","fqdn":"edge.dev.ciab.test","interfaces":[{"ipAddresses":[{"address":"129.0.0.2","gateway":null,"serviceAddress":true}],"maxBandwidth":null,"monitor":true,"mtu":1500,"name":"eth0"}],"type":"EDGE","hashid":""}],"trafficMonitors":[{"profile":"RASCAL_TM_dev","status":"ONLINE","port":80,"cachegroup":"dev","hostname":"trafficmonitor","fqdn":"trafficmonitor.dev.ciab.test","ip":"129.0.0.1","ip6":""}],"cacheGroups":[{"name":"dev","coordinates":{"latitude":0,"longitude":0}}],"profiles":[{"name":"EDGE_dev","type":"EDGE","parameters":{"health.polling.format":"stats_over_http","health.polling.url":"http://edge:8080/_stats?application=\u0026inf.name=${interface_name}"}}],"deliveryServices":[{"xmlId":"dev","totalTpsThreshold":0,"status":"REPORTED","totalKbpsThreshold":0}],"config":{"health.polling.interval":6000,"heartbeat.polling.interval":3000,"peers.polling.interval":3000,"tm.polling.interval":2000}}' ); From 8a513af5b90cd1ca180f42a2833400f7e7bc613c Mon Sep 17 00:00:00 2001 From: ocket8888 Date: Mon, 21 Feb 2022 13:47:15 -0700 Subject: [PATCH 73/98] Add necessary package target to maven command --- dev/traffic_router/run.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dev/traffic_router/run.sh b/dev/traffic_router/run.sh index 5c73c22269..e7b4873c4c 100755 --- a/dev/traffic_router/run.sh +++ b/dev/traffic_router/run.sh @@ -20,7 +20,7 @@ set -o errexit cd "$TC/traffic_router" -mvn -Dmaven.test.skip=true compile -P \!rpm-build +mvn -Dmaven.test.skip=true compile package -P \!rpm-build chmod -R a+rw "$TC/dev/traffic_router/" /opt/tomcat/bin/catalina.sh jpda run From cbdde0c835a5d61c995af9035fc2d05e43888f11 Mon Sep 17 00:00:00 2001 From: ocket8888 Date: Mon, 21 Feb 2022 13:52:37 -0700 Subject: [PATCH 74/98] Add coveragezone polling url --- dev/traffic_ops/seed.psql | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dev/traffic_ops/seed.psql b/dev/traffic_ops/seed.psql index a6a1e6125b..a05dd5ec44 100644 --- a/dev/traffic_ops/seed.psql +++ b/dev/traffic_ops/seed.psql @@ -45,7 +45,7 @@ INSERT INTO snapshot ( monitoring ) VALUES ( 'dev', - '{"config":{"dnssec.enabled":"false","domain_name":"ciab.test","geolocation.polling.url":"file:///root/go/src/github.com/apache/trafficcontrol/traffic_router/core/src/test/resources/geo/GeoLite2-City.mmdb.gz"},"contentServers":{"edge":{"cacheGroup":"dev","fqdn":"edge.dev.ciab.test","hashCount":999,"hashId":"edge","httpsPort":443,"interfaceName":"eth0","ip":"129.0.0.2","ip6":"","locationId":"dev","port":80,"profile":"EDGE_dev","status":"REPORTED","type":"EDGE","routingDisabled":0}},"deliveryServices":{"dev":{"anonymousBlockingEnabled":"false","coverageZoneOnly":"false","deepCachingType":"NEVER","dispersion":{"limit":1,"shuffled":"true"},"domains":["dev.ciab.test"],"ecsEnabled":"false","geolocationProvider":"maxmindGeolocationService","ip6RoutingEnabled":"false","matchsets":[{"protocol":"HTTP","matchlist":[{"regex":".*\\\\.dev\\\\..*","match-type":"HOST"}]}],"protocol":{"acceptHttps":"false","redirectToHttps":"false"},"regionalGeoBlocking":"false","routingName":"cdn","soa":{"admin":"traffic_ops","expire":"604800","minimum":"30","refresh":"28800","retry":"7200"},"sslEnabled":"false","ttls":{"A":"","AAAA":"","NS":"3600","SOA":"86400"}}},"edgeLocations":{"dev":{"latitude":0,"longitude":0,"backupLocations":{"fallbackToClosest":"true"},"localizationMethods":["GEO","CZ","DEEP_CZ"]}},"monitors":{"trafficmonitor":{"fqdn":"trafficmonitor.dev.ciab.test","httpsPort":null,"ip":"129.0.0.1","ip6":"","location":"dev","port":80,"profile":"RASCAL_TM_dev","status":"ONLINE"}},"stats":{"CDN_name":"dev","date":1643833749,"tm_host":"trafficops","tm_user":"admin","tm_version":"development"}}', + '{"config":{"coveragezone.polling.url":"file:///root/go/src/github.com/apache/trafficcontrol/traffic_router/core/src/test/resources/czmap.json","dnssec.enabled":"false","domain_name":"ciab.test","geolocation.polling.url":"file:///root/go/src/github.com/apache/trafficcontrol/traffic_router/core/src/test/resources/geo/GeoLite2-City.mmdb.gz"},"contentServers":{"edge":{"cacheGroup":"dev","fqdn":"edge.dev.ciab.test","hashCount":999,"hashId":"edge","httpsPort":443,"interfaceName":"eth0","ip":"129.0.0.2","ip6":"","locationId":"dev","port":80,"profile":"EDGE_dev","status":"REPORTED","type":"EDGE","routingDisabled":0}},"deliveryServices":{"dev":{"anonymousBlockingEnabled":"false","coverageZoneOnly":"false","deepCachingType":"NEVER","dispersion":{"limit":1,"shuffled":"true"},"domains":["dev.ciab.test"],"ecsEnabled":"false","geolocationProvider":"maxmindGeolocationService","ip6RoutingEnabled":"false","matchsets":[{"protocol":"HTTP","matchlist":[{"regex":".*\\\\.dev\\\\..*","match-type":"HOST"}]}],"protocol":{"acceptHttps":"false","redirectToHttps":"false"},"regionalGeoBlocking":"false","routingName":"cdn","soa":{"admin":"traffic_ops","expire":"604800","minimum":"30","refresh":"28800","retry":"7200"},"sslEnabled":"false","ttls":{"A":"","AAAA":"","NS":"3600","SOA":"86400"}}},"edgeLocations":{"dev":{"latitude":0,"longitude":0,"backupLocations":{"fallbackToClosest":"true"},"localizationMethods":["GEO","CZ","DEEP_CZ"]}},"monitors":{"trafficmonitor":{"fqdn":"trafficmonitor.dev.ciab.test","httpsPort":null,"ip":"129.0.0.1","ip6":"","location":"dev","port":80,"profile":"RASCAL_TM_dev","status":"ONLINE"}},"stats":{"CDN_name":"dev","date":1643833749,"tm_host":"trafficops","tm_user":"admin","tm_version":"development"}}', '{"trafficServers":[{"profile":"EDGE_dev","status":"REPORTED","port":80,"cachegroup":"dev","hostname":"edge","fqdn":"edge.dev.ciab.test","interfaces":[{"ipAddresses":[{"address":"129.0.0.2","gateway":null,"serviceAddress":true}],"maxBandwidth":null,"monitor":true,"mtu":1500,"name":"eth0"}],"type":"EDGE","hashid":""}],"trafficMonitors":[{"profile":"RASCAL_TM_dev","status":"ONLINE","port":80,"cachegroup":"dev","hostname":"trafficmonitor","fqdn":"trafficmonitor.dev.ciab.test","ip":"129.0.0.1","ip6":""}],"cacheGroups":[{"name":"dev","coordinates":{"latitude":0,"longitude":0}}],"profiles":[{"name":"EDGE_dev","type":"EDGE","parameters":{"health.polling.format":"stats_over_http","health.polling.url":"http://edge:8080/_stats?application=\u0026inf.name=${interface_name}"}}],"deliveryServices":[{"xmlId":"dev","totalTpsThreshold":0,"status":"REPORTED","totalKbpsThreshold":0}],"config":{"health.polling.interval":6000,"heartbeat.polling.interval":3000,"peers.polling.interval":3000,"tm.polling.interval":2000}}' ); From c06eec448c9b836214a50f9dcb146c278a6cf2f4 Mon Sep 17 00:00:00 2001 From: ocket8888 Date: Tue, 22 Feb 2022 18:41:28 -0700 Subject: [PATCH 75/98] Add TR as an actual server, to make the Snapshot valid. --- dev/traffic_ops/seed.psql | 31 ++++++++++++++++++++++++++++--- 1 file changed, 28 insertions(+), 3 deletions(-) diff --git a/dev/traffic_ops/seed.psql b/dev/traffic_ops/seed.psql index a05dd5ec44..8125bbca19 100644 --- a/dev/traffic_ops/seed.psql +++ b/dev/traffic_ops/seed.psql @@ -45,8 +45,8 @@ INSERT INTO snapshot ( monitoring ) VALUES ( 'dev', - '{"config":{"coveragezone.polling.url":"file:///root/go/src/github.com/apache/trafficcontrol/traffic_router/core/src/test/resources/czmap.json","dnssec.enabled":"false","domain_name":"ciab.test","geolocation.polling.url":"file:///root/go/src/github.com/apache/trafficcontrol/traffic_router/core/src/test/resources/geo/GeoLite2-City.mmdb.gz"},"contentServers":{"edge":{"cacheGroup":"dev","fqdn":"edge.dev.ciab.test","hashCount":999,"hashId":"edge","httpsPort":443,"interfaceName":"eth0","ip":"129.0.0.2","ip6":"","locationId":"dev","port":80,"profile":"EDGE_dev","status":"REPORTED","type":"EDGE","routingDisabled":0}},"deliveryServices":{"dev":{"anonymousBlockingEnabled":"false","coverageZoneOnly":"false","deepCachingType":"NEVER","dispersion":{"limit":1,"shuffled":"true"},"domains":["dev.ciab.test"],"ecsEnabled":"false","geolocationProvider":"maxmindGeolocationService","ip6RoutingEnabled":"false","matchsets":[{"protocol":"HTTP","matchlist":[{"regex":".*\\\\.dev\\\\..*","match-type":"HOST"}]}],"protocol":{"acceptHttps":"false","redirectToHttps":"false"},"regionalGeoBlocking":"false","routingName":"cdn","soa":{"admin":"traffic_ops","expire":"604800","minimum":"30","refresh":"28800","retry":"7200"},"sslEnabled":"false","ttls":{"A":"","AAAA":"","NS":"3600","SOA":"86400"}}},"edgeLocations":{"dev":{"latitude":0,"longitude":0,"backupLocations":{"fallbackToClosest":"true"},"localizationMethods":["GEO","CZ","DEEP_CZ"]}},"monitors":{"trafficmonitor":{"fqdn":"trafficmonitor.dev.ciab.test","httpsPort":null,"ip":"129.0.0.1","ip6":"","location":"dev","port":80,"profile":"RASCAL_TM_dev","status":"ONLINE"}},"stats":{"CDN_name":"dev","date":1643833749,"tm_host":"trafficops","tm_user":"admin","tm_version":"development"}}', - '{"trafficServers":[{"profile":"EDGE_dev","status":"REPORTED","port":80,"cachegroup":"dev","hostname":"edge","fqdn":"edge.dev.ciab.test","interfaces":[{"ipAddresses":[{"address":"129.0.0.2","gateway":null,"serviceAddress":true}],"maxBandwidth":null,"monitor":true,"mtu":1500,"name":"eth0"}],"type":"EDGE","hashid":""}],"trafficMonitors":[{"profile":"RASCAL_TM_dev","status":"ONLINE","port":80,"cachegroup":"dev","hostname":"trafficmonitor","fqdn":"trafficmonitor.dev.ciab.test","ip":"129.0.0.1","ip6":""}],"cacheGroups":[{"name":"dev","coordinates":{"latitude":0,"longitude":0}}],"profiles":[{"name":"EDGE_dev","type":"EDGE","parameters":{"health.polling.format":"stats_over_http","health.polling.url":"http://edge:8080/_stats?application=\u0026inf.name=${interface_name}"}}],"deliveryServices":[{"xmlId":"dev","totalTpsThreshold":0,"status":"REPORTED","totalKbpsThreshold":0}],"config":{"health.polling.interval":6000,"heartbeat.polling.interval":3000,"peers.polling.interval":3000,"tm.polling.interval":2000}}' + '{"config":{"coveragezone.polling.url":"file:///root/go/src/github.com/apache/trafficcontrol/traffic_router/core/src/test/resources/czf.json","dnssec.enabled":"false","domain_name":"ciab.test","geolocation.polling.url":"file:///root/go/src/github.com/apache/trafficcontrol/traffic_router/core/src/test/resources/geo/GeoLite2-City.mmdb.gz"},"contentServers":{"edge":{"cacheGroup":"dev","fqdn":"edge.dev.ciab.test","hashCount":999,"hashId":"edge","httpsPort":443,"interfaceName":"eth0","ip":"129.0.0.2","ip6":"","locationId":"dev","port":80,"profile":"EDGE_dev","status":"REPORTED","type":"EDGE","routingDisabled":0}},"contentRouters":{"trafficrouter":{"fqdn":"trafficrouter.dev.ciab.test","httpsPort":443,"ip":"","ip6":"","location":"tr-cg","port":80,"profile":"CCR_dev","status":"ONLINE"}},"deliveryServices":{"dev":{"anonymousBlockingEnabled":"false","coverageZoneOnly":"false","deepCachingType":"NEVER","dispersion":{"limit":1,"shuffled":"true"},"domains":["dev.ciab.test"],"ecsEnabled":"false","geolocationProvider":"maxmindGeolocationService","ip6RoutingEnabled":"false","matchsets":[{"protocol":"HTTP","matchlist":[{"regex":".*\\\\.dev\\\\..*","match-type":"HOST"}]}],"protocol":{"acceptHttps":"false","redirectToHttps":"false"},"regionalGeoBlocking":"false","routingName":"cdn","soa":{"admin":"traffic_ops","expire":"604800","minimum":"30","refresh":"28800","retry":"7200"},"sslEnabled":"false","ttls":{"A":"","AAAA":"","NS":"3600","SOA":"86400"}}},"edgeLocations":{"dev":{"latitude":0,"longitude":0,"backupLocations":{"fallbackToClosest":"true"},"localizationMethods":["GEO","CZ","DEEP_CZ"]}},"trafficRouterLocations":{"tr-cg":{"latitude":0,"longitude":0,"backupLocations":{"fallbackToClosest":"false"},"localizationMethods":["GEO","CZ","DEEP_CZ"]}},"monitors":{"trafficmonitor":{"fqdn":"trafficmonitor.dev.ciab.test","httpsPort":null,"ip":"129.0.0.1","ip6":"","location":"dev","port":80,"profile":"RASCAL_TM_dev","status":"ONLINE"}},"stats":{"CDN_name":"dev","date":1645572050,"tm_host":"trafficops","tm_user":"admin","tm_version":"development"}}', + '{"trafficServers":[{"profile":"EDGE_dev","status":"REPORTED","port":80,"cachegroup":"dev","hostname":"edge","fqdn":"edge.dev.ciab.test","interfaces":[{"ipAddresses":[{"address":"129.0.0.2","gateway":null,"serviceAddress":true}],"maxBandwidth":null,"monitor":true,"mtu":1500,"name":"eth0"}],"type":"EDGE","hashid":""}],"trafficMonitors":[{"profile":"RASCAL_TM_dev","status":"ONLINE","port":80,"cachegroup":"dev","hostname":"trafficmonitor","fqdn":"trafficmonitor.dev.ciab.test","ip":"129.0.0.1","ip6":""}],"cacheGroups":[{"name":"dev","coordinates":{"latitude":0,"longitude":0}},{"name":"tr-cg","coordinates":{"latitude":0,"longitude":0}}],"profiles":[{"name":"CCR_dev","type":"CCR","parameters":null},{"name":"EDGE_dev","type":"EDGE","parameters":{"health.polling.format":"stats_over_http","health.polling.url":"http://edge:8080/_stats?application=\u0026inf.name=${interface_name}"}}],"deliveryServices":[{"xmlId":"dev","totalTpsThreshold":0,"status":"REPORTED","totalKbpsThreshold":0}],"config":{"health.polling.interval":6000,"heartbeat.polling.interval":3000,"peers.polling.interval":3000,"tm.polling.interval":2000}}' ); INSERT INTO profile ( @@ -64,6 +64,11 @@ INSERT INTO profile ( 'dev edge Profile', 'ATS_PROFILE', (SELECT id FROM cdn WHERE "name" = 'dev') +), ( + 'CCR_dev', + 'dev Traffic Router Profile', + 'TR_PROFILE', + (SELECT id FROM cdn WHERE "name" = 'dev') ); INSERT INTO parameter ( @@ -98,6 +103,10 @@ INSERT INTO parameter ( 'CRConfig.json', 'geolocation.polling.url', 'file:///root/go/src/github.com/apache/trafficcontrol/traffic_router/core/src/test/resources/geo/GeoLite2-City.mmdb.gz' +), ( + 'CRConfig.json', + 'coveragezone.polling.url', + 'file:///root/go/src/github.com/apache/trafficcontrol/traffic_router/core/src/test/resources/czf.json' ); INSERT INTO profile_parameter @@ -117,7 +126,7 @@ INSERT INTO profile_parameter SELECT profile.id, parameter.id FROM profile, parameter WHERE parameter.config_file = 'CRConfig.json' -AND profile."name" = 'GLOBAL'; +AND profile."name" = 'CCR_dev'; INSERT INTO division ("name") VALUES ('dev'); INSERT INTO region ( @@ -165,6 +174,11 @@ INSERT INTO cachegroup ( 'dev', (SELECT id FROM "type" WHERE "name" = 'EDGE_LOC'), (SELECT id FROM coordinate WHERE "name" = 'dev') +), ( + 'tr-cg', + 'tr-cg', + (SELECT id FROM "type" WHERE "name" = 'TR_LOC'), + (SELECT id FROM coordinate WHERE "name" = 'dev') ); INSERT INTO "server" ( @@ -200,6 +214,17 @@ INSERT INTO "server" ( (SELECT id FROM status WHERE "name" = 'REPORTED'), (SELECT id FROM profile WHERE "name"= 'EDGE_dev'), (SELECT id FROM cdn WHERE "name" = 'dev') +), ( + 'trafficrouter', + 'dev.ciab.test', + 80, + 443, + (SELECT id FROM phys_location WHERE "name" = 'dev'), + (SELECT id FROM cachegroup WHERE "name" = 'tr-cg'), + (SELECT id FROM "type" WHERE "name" = 'CCR'), + (SELECT id FROM status WHERE "name" = 'ONLINE'), + (SELECT id FROM profile WHERE "name" = 'CCR_dev'), + (SELECT id FROM cdn WHERE "name" = 'dev') ); INSERT INTO interface ( From 4ea13ecadd169858804dccaab1ed654ae72ece2b Mon Sep 17 00:00:00 2001 From: ocket8888 Date: Wed, 23 Feb 2022 10:23:20 -0700 Subject: [PATCH 76/98] Add TR output files for the dev environment to .gitignore --- dev/traffic_router/.gitignore | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 dev/traffic_router/.gitignore diff --git a/dev/traffic_router/.gitignore b/dev/traffic_router/.gitignore new file mode 100644 index 0000000000..94f4da0faa --- /dev/null +++ b/dev/traffic_router/.gitignore @@ -0,0 +1,20 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + +db/ +temp/ +var/ From c0401188323563ea80f60dc0cc1742f044bb18f6 Mon Sep 17 00:00:00 2001 From: ocket8888 Date: Wed, 23 Feb 2022 12:58:00 -0700 Subject: [PATCH 77/98] Fix missing "global" Parameter for TO hostname. --- dev/traffic_ops/seed.psql | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/dev/traffic_ops/seed.psql b/dev/traffic_ops/seed.psql index 8125bbca19..1a74eb678e 100644 --- a/dev/traffic_ops/seed.psql +++ b/dev/traffic_ops/seed.psql @@ -107,6 +107,10 @@ INSERT INTO parameter ( 'CRConfig.json', 'coveragezone.polling.url', 'file:///root/go/src/github.com/apache/trafficcontrol/traffic_router/core/src/test/resources/czf.json' +), ( + 'global', + 'tm.url', + 'https://trafficops' ); INSERT INTO profile_parameter From 2ae2d3e0b22ec198b4ab65a82811ca4a199422ee Mon Sep 17 00:00:00 2001 From: ocket8888 Date: Wed, 23 Feb 2022 13:05:48 -0700 Subject: [PATCH 78/98] Fix incorrect HTTPS cert path --- dev/traffic_router/conf/https.properties | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dev/traffic_router/conf/https.properties b/dev/traffic_router/conf/https.properties index 8f53aab8a8..6f9e370aae 100644 --- a/dev/traffic_router/conf/https.properties +++ b/dev/traffic_router/conf/https.properties @@ -3,12 +3,12 @@ # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 -# +# # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # -https.certificate.location=/opt/tomcat/conf/keyStore.jks +https.certificate.location=/opt/traffic_router/conf/keyStore.jks https.password=changeit From 19bf1d9ab02b4fb22d7dfbd307387022f970c4f4 Mon Sep 17 00:00:00 2001 From: ocket8888 Date: Wed, 23 Feb 2022 13:09:02 -0700 Subject: [PATCH 79/98] remove unused code --- dev/traffic_router/run.sh | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/dev/traffic_router/run.sh b/dev/traffic_router/run.sh index e7b4873c4c..040bf74118 100755 --- a/dev/traffic_router/run.sh +++ b/dev/traffic_router/run.sh @@ -24,15 +24,3 @@ mvn -Dmaven.test.skip=true compile package -P \!rpm-build chmod -R a+rw "$TC/dev/traffic_router/" /opt/tomcat/bin/catalina.sh jpda run -# java -agentlib:jdwp=transport=dt_socket,address=5005,server=y,suspend=n StartTrafficRouter - -# while inotifywait --exclude '.*(\.md|_test\.go|\.gitignore|__debug_bin)$' -e modify -r . ; do -# kill "$(netstat -nlp | grep ':443' | grep __debug_bin | head -n1 | tr -s ' ' | cut -d ' ' -f7 | cut -d '/' -f1)" -# kill "$(netstat -nlp | grep ':6444' | grep dlv | head -n1 | tr -s ' ' | cut -d ' ' -f7 | cut -d '/' -f1)" -# dlv --accept-multiclient --continue --listen=:6444 --headless --api-version=2 debug -- --cfg=../../dev/traffic_ops/cdn.json --dbcfg=../../dev/traffic_ops/db.config.json & -# # for whatever reason, without this the repeated call to inotifywait will -# # sometimes lose track of th current directory. It spits out: -# # Couldn't watch .: No such file or directory -# # which is a bit odd. -# sleep 0.5 -# done; From 51de2ba855dad492357126fc7fa6dd63ae3b5ff5 Mon Sep 17 00:00:00 2001 From: ocket8888 Date: Wed, 23 Feb 2022 13:13:32 -0700 Subject: [PATCH 80/98] Add TR to the README --- dev/README.md | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/dev/README.md b/dev/README.md index 99ff763d0f..13d87cec78 100644 --- a/dev/README.md +++ b/dev/README.md @@ -51,6 +51,9 @@ debugger for Go listens on port 81 for connections to debug Traffic Monitor. Note that Traffic Monitor will do almost nothing useful if the edge cache server (the `t3c` service) is not running when it starts. +Traffic Monitor writes its backups for CDN Snapshots and Monitoring Configs in +the `dev/traffic_monitor` directory, so you can see them. + ## Database/Traffic Vault A Postgres database listens on port 5432 (this conflicts with the default port for running Postgres, so any Postgres servers running on the host machine may @@ -69,3 +72,16 @@ to debug `t3c` sub-commands. Note that, while in most production deployments `t3c` runs on a `cron` schedule, `t3c` is never run in this service container, normally. One must manualy trigger a run, usually by using the `t3c` function provided by `atc.dev.sh`. + +## Traffic Router +Traffic Router listens locally for DNS queries on port 3053 (TCP and/or UDP), +HTTP requests from clients to be routed on ports 3080 (HTTP) and 3443 (HTTPS), +HTTP requests to its API on ports 3333 (HTTP) and 2222 (HTTPS), and listens for +JDPA debugging connections on port 5005. + +Traffic Router writes its backups for the "Coverage Zone" file, CDN Snapshot, +Federations, cache health (as published by Traffic Monitor), LetsEncrypt data, +and Steering information into `dev/traffic_router/db/` so you can see them. +Generated DNS Zones are written in `dev/traffic_router/var/` and Traffic Router +will use `dev/traffic_router/temp` to create any temporary files it needs (that +will grow without bound, so it may need to be cleaned up every now and again). From 46b38a34d4d1a1df8ddd1a6d3f0b5df495421cbb Mon Sep 17 00:00:00 2001 From: ocket8888 Date: Wed, 23 Feb 2022 14:41:27 -0700 Subject: [PATCH 81/98] Fix spelling error --- dev/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dev/README.md b/dev/README.md index 13d87cec78..7455d815de 100644 --- a/dev/README.md +++ b/dev/README.md @@ -70,7 +70,7 @@ local port 8080. The Delve debugger for Go listens on port 8081 for connections to debug `t3c` sub-commands. Note that, while in most production deployments `t3c` runs on a `cron` schedule, -`t3c` is never run in this service container, normally. One must manualy trigger +`t3c` is never run in this service container, normally. One must manually trigger a run, usually by using the `t3c` function provided by `atc.dev.sh`. ## Traffic Router From 477a3677c4649383279e0dbfea0dd074d4fb8828 Mon Sep 17 00:00:00 2001 From: ocket8888 Date: Wed, 23 Feb 2022 14:41:43 -0700 Subject: [PATCH 82/98] Fix `atc-restart` only respecting args for the `start` portion --- dev/atc.dev.sh | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/dev/atc.dev.sh b/dev/atc.dev.sh index d96259459a..8829eb8cdf 100644 --- a/dev/atc.dev.sh +++ b/dev/atc.dev.sh @@ -18,7 +18,14 @@ alias atc-start="docker-compose up -d --build"; alias atc-build="docker-compose build"; alias atc-stop="docker-compose kill && docker-compose down -v --remove-orphans"; -alias atc-restart="atc-stop && atc-start"; + +function atc-restart { + if ! atc-stop $@; then + return 1; + fi + atc-start $@; + return $?; +} function atc-ready { local url="https://localhost:6443/api/4.0/ping"; From 10b16b31641d1c55260ab2342c7ed806f68870ef Mon Sep 17 00:00:00 2001 From: ocket8888 Date: Wed, 23 Feb 2022 14:42:15 -0700 Subject: [PATCH 83/98] Fix non-idempotent database seeding --- dev/traffic_ops/seed.psql | 58 +++++++++++++++++++++++++-------------- 1 file changed, 38 insertions(+), 20 deletions(-) diff --git a/dev/traffic_ops/seed.psql b/dev/traffic_ops/seed.psql index 1a74eb678e..b7967050e6 100644 --- a/dev/traffic_ops/seed.psql +++ b/dev/traffic_ops/seed.psql @@ -29,7 +29,7 @@ INSERT INTO tm_user ( 'admin@no-reply.atc.test', 'Development Admin User' ) -ON CONFLICT (username) DO NOTHING; +ON CONFLICT DO NOTHING; INSERT INTO cdn ( "name", @@ -37,7 +37,8 @@ INSERT INTO cdn ( ) VALUES ( 'dev', 'ciab.test' -); +) +ON CONFLICT DO NOTHING; INSERT INTO snapshot ( cdn, @@ -47,7 +48,8 @@ INSERT INTO snapshot ( 'dev', '{"config":{"coveragezone.polling.url":"file:///root/go/src/github.com/apache/trafficcontrol/traffic_router/core/src/test/resources/czf.json","dnssec.enabled":"false","domain_name":"ciab.test","geolocation.polling.url":"file:///root/go/src/github.com/apache/trafficcontrol/traffic_router/core/src/test/resources/geo/GeoLite2-City.mmdb.gz"},"contentServers":{"edge":{"cacheGroup":"dev","fqdn":"edge.dev.ciab.test","hashCount":999,"hashId":"edge","httpsPort":443,"interfaceName":"eth0","ip":"129.0.0.2","ip6":"","locationId":"dev","port":80,"profile":"EDGE_dev","status":"REPORTED","type":"EDGE","routingDisabled":0}},"contentRouters":{"trafficrouter":{"fqdn":"trafficrouter.dev.ciab.test","httpsPort":443,"ip":"","ip6":"","location":"tr-cg","port":80,"profile":"CCR_dev","status":"ONLINE"}},"deliveryServices":{"dev":{"anonymousBlockingEnabled":"false","coverageZoneOnly":"false","deepCachingType":"NEVER","dispersion":{"limit":1,"shuffled":"true"},"domains":["dev.ciab.test"],"ecsEnabled":"false","geolocationProvider":"maxmindGeolocationService","ip6RoutingEnabled":"false","matchsets":[{"protocol":"HTTP","matchlist":[{"regex":".*\\\\.dev\\\\..*","match-type":"HOST"}]}],"protocol":{"acceptHttps":"false","redirectToHttps":"false"},"regionalGeoBlocking":"false","routingName":"cdn","soa":{"admin":"traffic_ops","expire":"604800","minimum":"30","refresh":"28800","retry":"7200"},"sslEnabled":"false","ttls":{"A":"","AAAA":"","NS":"3600","SOA":"86400"}}},"edgeLocations":{"dev":{"latitude":0,"longitude":0,"backupLocations":{"fallbackToClosest":"true"},"localizationMethods":["GEO","CZ","DEEP_CZ"]}},"trafficRouterLocations":{"tr-cg":{"latitude":0,"longitude":0,"backupLocations":{"fallbackToClosest":"false"},"localizationMethods":["GEO","CZ","DEEP_CZ"]}},"monitors":{"trafficmonitor":{"fqdn":"trafficmonitor.dev.ciab.test","httpsPort":null,"ip":"129.0.0.1","ip6":"","location":"dev","port":80,"profile":"RASCAL_TM_dev","status":"ONLINE"}},"stats":{"CDN_name":"dev","date":1645572050,"tm_host":"trafficops","tm_user":"admin","tm_version":"development"}}', '{"trafficServers":[{"profile":"EDGE_dev","status":"REPORTED","port":80,"cachegroup":"dev","hostname":"edge","fqdn":"edge.dev.ciab.test","interfaces":[{"ipAddresses":[{"address":"129.0.0.2","gateway":null,"serviceAddress":true}],"maxBandwidth":null,"monitor":true,"mtu":1500,"name":"eth0"}],"type":"EDGE","hashid":""}],"trafficMonitors":[{"profile":"RASCAL_TM_dev","status":"ONLINE","port":80,"cachegroup":"dev","hostname":"trafficmonitor","fqdn":"trafficmonitor.dev.ciab.test","ip":"129.0.0.1","ip6":""}],"cacheGroups":[{"name":"dev","coordinates":{"latitude":0,"longitude":0}},{"name":"tr-cg","coordinates":{"latitude":0,"longitude":0}}],"profiles":[{"name":"CCR_dev","type":"CCR","parameters":null},{"name":"EDGE_dev","type":"EDGE","parameters":{"health.polling.format":"stats_over_http","health.polling.url":"http://edge:8080/_stats?application=\u0026inf.name=${interface_name}"}}],"deliveryServices":[{"xmlId":"dev","totalTpsThreshold":0,"status":"REPORTED","totalKbpsThreshold":0}],"config":{"health.polling.interval":6000,"heartbeat.polling.interval":3000,"peers.polling.interval":3000,"tm.polling.interval":2000}}' -); +) +ON CONFLICT DO NOTHING; INSERT INTO profile ( "name", @@ -69,7 +71,8 @@ INSERT INTO profile ( 'dev Traffic Router Profile', 'TR_PROFILE', (SELECT id FROM cdn WHERE "name" = 'dev') -); +) +ON CONFLICT DO NOTHING; INSERT INTO parameter ( config_file, @@ -111,35 +114,40 @@ INSERT INTO parameter ( 'global', 'tm.url', 'https://trafficops' -); +) +ON CONFLICT DO NOTHING; INSERT INTO profile_parameter SELECT profile.id, parameter.id FROM profile, parameter WHERE parameter.config_file = 'rascal-config.txt' AND parameter."name" LIKE '%.polling.%' -AND profile."name" = 'RASCAL_TM_dev'; +AND profile."name" = 'RASCAL_TM_dev' +ON CONFLICT DO NOTHING; INSERT INTO profile_parameter SELECT profile.id, parameter.id FROM profile, parameter WHERE parameter.config_file = 'rascal.properties' -AND profile."name" = 'EDGE_dev'; +AND profile."name" = 'EDGE_dev' +ON CONFLICT DO NOTHING; INSERT INTO profile_parameter SELECT profile.id, parameter.id FROM profile, parameter WHERE parameter.config_file = 'CRConfig.json' -AND profile."name" = 'CCR_dev'; +AND profile."name" = 'CCR_dev' +ON CONFLICT DO NOTHING; -INSERT INTO division ("name") VALUES ('dev'); +INSERT INTO division ("name") VALUES ('dev') ON CONFLICT DO NOTHING; INSERT INTO region ( "name", division ) VALUES ( 'dev', (SELECT id FROM division WHERE "name" = 'dev') -); +) +ON CONFLICT DO NOTHING; INSERT INTO phys_location ( "name", short_name, @@ -156,7 +164,8 @@ INSERT INTO phys_location ( 'state', 'zip', (SELECT id from region WHERE "name" = 'dev') -); +) +ON CONFLICT DO NOTHING; INSERT INTO coordinate ( "name", @@ -166,7 +175,8 @@ INSERT INTO coordinate ( 'dev', 0, 0 -); +) +ON CONFLICT DO NOTHING; INSERT INTO cachegroup ( "name", @@ -183,7 +193,8 @@ INSERT INTO cachegroup ( 'tr-cg', (SELECT id FROM "type" WHERE "name" = 'TR_LOC'), (SELECT id FROM coordinate WHERE "name" = 'dev') -); +) +ON CONFLICT DO NOTHING; INSERT INTO "server" ( host_name, @@ -229,7 +240,8 @@ INSERT INTO "server" ( (SELECT id FROM status WHERE "name" = 'ONLINE'), (SELECT id FROM profile WHERE "name" = 'CCR_dev'), (SELECT id FROM cdn WHERE "name" = 'dev') -); +) +ON CONFLICT DO NOTHING; INSERT INTO interface ( monitor, @@ -243,7 +255,8 @@ INSERT INTO interface ( TRUE, 'eth0', (SELECT id FROM "server" WHERE host_name = 'edge' LIMIT 1) -); +) +ON CONFLICT DO NOTHING; INSERT INTO ip_address ( address, @@ -260,7 +273,8 @@ INSERT INTO ip_address ( 'eth0', (SELECT id FROM "server" WHERE host_name = 'edge' LIMIT 1), TRUE -); +) +ON CONFLICT DO NOTHING; INSERT INTO deliveryservice ( xml_id, @@ -280,7 +294,8 @@ INSERT INTO deliveryservice ( (SELECT id FROM cdn WHERE "name" = 'dev'), 'dev', (SELECT id FROM tenant WHERE "name" = 'root') -); +) +ON CONFLICT DO NOTHING; INSERT INTO regex ( "type", @@ -288,7 +303,8 @@ INSERT INTO regex ( ) VALUES ( (SELECT id FROM "type" WHERE "name" = 'HOST_REGEXP'), '.*\\.dev\\..*' -); +) +ON CONFLICT DO NOTHING; INSERT INTO deliveryservice_regex ( deliveryservice, @@ -298,7 +314,8 @@ INSERT INTO deliveryservice_regex ( (SELECT id FROM deliveryservice WHERE xml_id = 'dev') , (SELECT id FROM regex WHERE pattern = '.*\\.dev\\..*' LIMIT 1), 0 -); +) +ON CONFLICT DO NOTHING; INSERT INTO origin ( "name", @@ -316,4 +333,5 @@ INSERT INTO origin ( 80, (SELECT id FROM deliveryservice WHERE xml_id = 'dev'), (SELECT id FROM tenant WHERE "name" = 'root') -); +) +ON CONFLICT DO NOTHING; From 5e2f35929041bc14a252da167968491db6479449 Mon Sep 17 00:00:00 2001 From: ocket8888 Date: Wed, 23 Feb 2022 14:42:47 -0700 Subject: [PATCH 84/98] Add proper documentation --- docs/source/development/debugging.rst | 2 + docs/source/development/index.rst | 191 ++++++++++++++++++++++++++ 2 files changed, 193 insertions(+) diff --git a/docs/source/development/debugging.rst b/docs/source/development/debugging.rst index 19b7500a56..ffb7b9308b 100644 --- a/docs/source/development/debugging.rst +++ b/docs/source/development/debugging.rst @@ -22,6 +22,8 @@ Debugging inside CDN-in-a-Box ***************************** +.. tip:: For the purposes of development, it may be easier to use :ref:`dev`. + Some CDN-in-a-Box components can be used with a debugger to step through lines of code, set breakpoints, see the state of all variables in each scope, etc. at runtime. Components that support debugging: * `Enroller`_ diff --git a/docs/source/development/index.rst b/docs/source/development/index.rst index 0290ad7a4b..0a74512f7b 100644 --- a/docs/source/development/index.rst +++ b/docs/source/development/index.rst @@ -18,6 +18,197 @@ Developer's Guide ***************** Use this guide to start developing applications that consume the Traffic Control APIs, to create extensions to Traffic Ops, or work on Traffic Control itself. +.. _dev: + +The Development Environment +=========================== +A development environment is available in :atc-file:`dev/`. This environment only depends on `Docker `_ (version 20+) and `Docker-Compose `_ debugging session is automatically started when :ref:`t3c-t3c` is run, which listens on port 8081. + .. toctree:: :maxdepth: 2 From fff9a77ea235a07a41d2d3b0acdfee983b79f925 Mon Sep 17 00:00:00 2001 From: ocket8888 Date: Wed, 23 Feb 2022 14:44:32 -0700 Subject: [PATCH 85/98] Fix TR working directory --- dev/traffic_router/run.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dev/traffic_router/run.sh b/dev/traffic_router/run.sh index 040bf74118..6794a26188 100755 --- a/dev/traffic_router/run.sh +++ b/dev/traffic_router/run.sh @@ -18,7 +18,7 @@ set -o errexit -cd "$TC/traffic_router" +cd "$TC/dev/traffic_router" mvn -Dmaven.test.skip=true compile package -P \!rpm-build From c92a9f863d8673e2f4d61bb18a3dadfd62fead25 Mon Sep 17 00:00:00 2001 From: ocket8888 Date: Wed, 23 Feb 2022 14:50:34 -0700 Subject: [PATCH 86/98] Fix incorrect build directory --- dev/traffic_router/run.sh | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/dev/traffic_router/run.sh b/dev/traffic_router/run.sh index 6794a26188..3b40c2f9e7 100755 --- a/dev/traffic_router/run.sh +++ b/dev/traffic_router/run.sh @@ -18,9 +18,11 @@ set -o errexit -cd "$TC/dev/traffic_router" +cd "$TC/traffic_router" mvn -Dmaven.test.skip=true compile package -P \!rpm-build - chmod -R a+rw "$TC/dev/traffic_router/" + +cd "$TC/dev/traffic_router" + /opt/tomcat/bin/catalina.sh jpda run From 49781eb8c5ffcba10d6763ec4f0e541fd668a598 Mon Sep 17 00:00:00 2001 From: ocket8888 Date: Wed, 23 Feb 2022 15:32:02 -0700 Subject: [PATCH 87/98] Fix user ID not properly set in Traffic Router to avoid inaccessible files being created --- dev/traffic_router/Dockerfile | 3 ++- docker-compose.yml | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/dev/traffic_router/Dockerfile b/dev/traffic_router/Dockerfile index eb3ba15034..6ff078723a 100644 --- a/dev/traffic_router/Dockerfile +++ b/dev/traffic_router/Dockerfile @@ -23,7 +23,8 @@ RUN apk add --no-cache openjdk11 inotify-tools maven tomcat-native openssl && ln ADD https://archive.apache.org/dist/tomcat/tomcat-9/v9.0.43/bin/apache-tomcat-9.0.43.tar.gz /opt/tomcat.tgz ARG USER -RUN adduser -H -D ${USER} +ARG UID +RUN adduser -H -D ${USER} -u ${UID} RUN chown -R ${USER} /opt /usr/share/java/ /root USER ${USER} RUN cd /opt && \ diff --git a/docker-compose.yml b/docker-compose.yml index c5880d2a9f..aab5349118 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -113,6 +113,7 @@ services: context: dev/traffic_router args: - USER=${USER} + - UID=${UID} depends_on: - trafficmonitor hostname: trafficrouter From bd28407928ad4dd2da6b189dc0c02ad5bfb98c04 Mon Sep 17 00:00:00 2001 From: ocket8888 Date: Wed, 23 Feb 2022 15:33:09 -0700 Subject: [PATCH 88/98] Add setting/exporting UID and USER for systems/shells that don't set/export them This is likely to fail on systems where UID isn't actually set or is somehow set improperly as a shell variable, but it fixes compatibility issues for a few major OSs. --- dev/atc.dev.sh | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/dev/atc.dev.sh b/dev/atc.dev.sh index 8829eb8cdf..88b0575971 100644 --- a/dev/atc.dev.sh +++ b/dev/atc.dev.sh @@ -165,3 +165,20 @@ function tm-health-client { export TO_URL="https://localhost:6443" export TO_USER="admin" export TO_PASSWORD="twelve12" + + +# On some shell/system combinations, either or both of these are available as +# shell variables but aren't exported to the execution environment. In others, +# they may just not be set. In any case, trying to set one or both of these to +# certain values - or even at all, on some systems - will fail, so we hope this +# isn't necessary. +if [[ -z "$USER" ]]; then + USER="$(id -un)"; +fi +export USER; + +if [[ -z "$UID" ]]; then + UID="$(id -u)"; +fi +export UID; + From e24c2eedf87ef16972053a651330a7a31f60eb0b Mon Sep 17 00:00:00 2001 From: ocket8888 Date: Wed, 23 Feb 2022 15:33:43 -0700 Subject: [PATCH 89/98] Add TR logs to gitignore --- dev/traffic_router/.gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/dev/traffic_router/.gitignore b/dev/traffic_router/.gitignore index 94f4da0faa..cb84f283be 100644 --- a/dev/traffic_router/.gitignore +++ b/dev/traffic_router/.gitignore @@ -16,5 +16,6 @@ # under the License. db/ +logs/ temp/ var/ From b215638e2987a5cca4ef8aee24d8f91fe9f21ea4 Mon Sep 17 00:00:00 2001 From: ocket8888 Date: Wed, 23 Feb 2022 16:05:24 -0700 Subject: [PATCH 90/98] Set default user identification values --- docker-compose.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index aab5349118..fb13702bd0 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -112,8 +112,8 @@ services: build: context: dev/traffic_router args: - - USER=${USER} - - UID=${UID} + - USER=${USER:-atc} + - UID=${UID:-1000} depends_on: - trafficmonitor hostname: trafficrouter From 3a70eeda5cb8aba3e5705ecdf571cda97a89ba74 Mon Sep 17 00:00:00 2001 From: ocket8888 Date: Wed, 23 Feb 2022 16:18:29 -0700 Subject: [PATCH 91/98] Add more info to TR logs --- dev/traffic_router/conf/log4j2.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dev/traffic_router/conf/log4j2.xml b/dev/traffic_router/conf/log4j2.xml index 77688dcb9e..0b3e097975 100644 --- a/dev/traffic_router/conf/log4j2.xml +++ b/dev/traffic_router/conf/log4j2.xml @@ -16,7 +16,7 @@ - + From c5de27f4e650a8fe86955a6807673dfa77975862 Mon Sep 17 00:00:00 2001 From: ocket8888 Date: Wed, 23 Feb 2022 16:38:39 -0700 Subject: [PATCH 92/98] Fix TR not able to find its logging configuration --- dev/traffic_router/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dev/traffic_router/Dockerfile b/dev/traffic_router/Dockerfile index 6ff078723a..1423202ede 100644 --- a/dev/traffic_router/Dockerfile +++ b/dev/traffic_router/Dockerfile @@ -15,7 +15,7 @@ FROM alpine:latest AS trafficrouter-dev ENV TC=/root/go/src/github.com/apache/trafficcontrol VOLUME /root/go/src/github.com/apache/trafficcontrol -ENV JPDA_OPTS="-agentlib:jdwp=transport=dt_socket,address=*:5005,server=y,suspend=n" JAVA_HOME=/usr/lib/jvm/java-11-openjdk M2_HOME=/root/go/src/github.com/apache/trafficcontrol/.m2 CATALINA_BASE=/opt/traffic_router TRAFFIC_MONITOR_HOSTS=trafficmonitor +ENV JPDA_OPTS="-agentlib:jdwp=transport=dt_socket,address=*:5005,server=y,suspend=n" JAVA_HOME=/usr/lib/jvm/java-11-openjdk M2_HOME=/root/go/src/github.com/apache/trafficcontrol/.m2 CATALINA_BASE=/opt/traffic_router TRAFFIC_MONITOR_HOSTS=trafficmonitor CATALINA_OPTS=-Dlog4j.configurationFile=/opt/traffic_router/conf/log4j2.xml EXPOSE 3053:53/tcp 3053:53/udp 3080:80 3443:443 3333:3333 2222:3443 5005:5005 RUN apk add --no-cache openjdk11 inotify-tools maven tomcat-native openssl && ln -s /usr/lib/jvm/java-11-openjdk/bin/jdb /bin/jdb From a27b0fc702a9e5e9424f87c6a187ce99f4f9afce Mon Sep 17 00:00:00 2001 From: ocket8888 Date: Wed, 23 Feb 2022 17:04:10 -0700 Subject: [PATCH 93/98] Remove extraneous escapism --- dev/traffic_ops/seed.psql | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/dev/traffic_ops/seed.psql b/dev/traffic_ops/seed.psql index b7967050e6..4560c90343 100644 --- a/dev/traffic_ops/seed.psql +++ b/dev/traffic_ops/seed.psql @@ -46,7 +46,7 @@ INSERT INTO snapshot ( monitoring ) VALUES ( 'dev', - '{"config":{"coveragezone.polling.url":"file:///root/go/src/github.com/apache/trafficcontrol/traffic_router/core/src/test/resources/czf.json","dnssec.enabled":"false","domain_name":"ciab.test","geolocation.polling.url":"file:///root/go/src/github.com/apache/trafficcontrol/traffic_router/core/src/test/resources/geo/GeoLite2-City.mmdb.gz"},"contentServers":{"edge":{"cacheGroup":"dev","fqdn":"edge.dev.ciab.test","hashCount":999,"hashId":"edge","httpsPort":443,"interfaceName":"eth0","ip":"129.0.0.2","ip6":"","locationId":"dev","port":80,"profile":"EDGE_dev","status":"REPORTED","type":"EDGE","routingDisabled":0}},"contentRouters":{"trafficrouter":{"fqdn":"trafficrouter.dev.ciab.test","httpsPort":443,"ip":"","ip6":"","location":"tr-cg","port":80,"profile":"CCR_dev","status":"ONLINE"}},"deliveryServices":{"dev":{"anonymousBlockingEnabled":"false","coverageZoneOnly":"false","deepCachingType":"NEVER","dispersion":{"limit":1,"shuffled":"true"},"domains":["dev.ciab.test"],"ecsEnabled":"false","geolocationProvider":"maxmindGeolocationService","ip6RoutingEnabled":"false","matchsets":[{"protocol":"HTTP","matchlist":[{"regex":".*\\\\.dev\\\\..*","match-type":"HOST"}]}],"protocol":{"acceptHttps":"false","redirectToHttps":"false"},"regionalGeoBlocking":"false","routingName":"cdn","soa":{"admin":"traffic_ops","expire":"604800","minimum":"30","refresh":"28800","retry":"7200"},"sslEnabled":"false","ttls":{"A":"","AAAA":"","NS":"3600","SOA":"86400"}}},"edgeLocations":{"dev":{"latitude":0,"longitude":0,"backupLocations":{"fallbackToClosest":"true"},"localizationMethods":["GEO","CZ","DEEP_CZ"]}},"trafficRouterLocations":{"tr-cg":{"latitude":0,"longitude":0,"backupLocations":{"fallbackToClosest":"false"},"localizationMethods":["GEO","CZ","DEEP_CZ"]}},"monitors":{"trafficmonitor":{"fqdn":"trafficmonitor.dev.ciab.test","httpsPort":null,"ip":"129.0.0.1","ip6":"","location":"dev","port":80,"profile":"RASCAL_TM_dev","status":"ONLINE"}},"stats":{"CDN_name":"dev","date":1645572050,"tm_host":"trafficops","tm_user":"admin","tm_version":"development"}}', + '{"config":{"coveragezone.polling.url":"file:///root/go/src/github.com/apache/trafficcontrol/traffic_router/core/src/test/resources/czf.json","dnssec.enabled":"false","domain_name":"ciab.test","geolocation.polling.url":"file:///root/go/src/github.com/apache/trafficcontrol/traffic_router/core/src/test/resources/geo/GeoLite2-City.mmdb.gz"},"contentServers":{"edge":{"cacheGroup":"dev","fqdn":"edge.dev.ciab.test","hashCount":999,"hashId":"edge","httpsPort":443,"interfaceName":"eth0","ip":"129.0.0.2","ip6":"","locationId":"dev","port":80,"profile":"EDGE_dev","status":"REPORTED","type":"EDGE","routingDisabled":0}},"contentRouters":{"trafficrouter":{"fqdn":"trafficrouter.dev.ciab.test","httpsPort":443,"ip":"","ip6":"","location":"tr-cg","port":80,"profile":"CCR_dev","status":"ONLINE"}},"deliveryServices":{"dev":{"anonymousBlockingEnabled":"false","coverageZoneOnly":"false","deepCachingType":"NEVER","dispersion":{"limit":1,"shuffled":"true"},"domains":["dev.ciab.test"],"ecsEnabled":"false","geolocationProvider":"maxmindGeolocationService","ip6RoutingEnabled":"false","matchsets":[{"protocol":"HTTP","matchlist":[{"regex":".*\\.dev\\..*","match-type":"HOST"}]}],"protocol":{"acceptHttps":"false","redirectToHttps":"false"},"regionalGeoBlocking":"false","routingName":"cdn","soa":{"admin":"traffic_ops","expire":"604800","minimum":"30","refresh":"28800","retry":"7200"},"sslEnabled":"false","ttls":{"A":"","AAAA":"","NS":"3600","SOA":"86400"}}},"edgeLocations":{"dev":{"latitude":0,"longitude":0,"backupLocations":{"fallbackToClosest":"true"},"localizationMethods":["GEO","CZ","DEEP_CZ"]}},"trafficRouterLocations":{"tr-cg":{"latitude":0,"longitude":0,"backupLocations":{"fallbackToClosest":"false"},"localizationMethods":["GEO","CZ","DEEP_CZ"]}},"monitors":{"trafficmonitor":{"fqdn":"trafficmonitor.dev.ciab.test","httpsPort":null,"ip":"129.0.0.1","ip6":"","location":"dev","port":80,"profile":"RASCAL_TM_dev","status":"ONLINE"}},"stats":{"CDN_name":"dev","date":1645572050,"tm_host":"trafficops","tm_user":"admin","tm_version":"development"}}', '{"trafficServers":[{"profile":"EDGE_dev","status":"REPORTED","port":80,"cachegroup":"dev","hostname":"edge","fqdn":"edge.dev.ciab.test","interfaces":[{"ipAddresses":[{"address":"129.0.0.2","gateway":null,"serviceAddress":true}],"maxBandwidth":null,"monitor":true,"mtu":1500,"name":"eth0"}],"type":"EDGE","hashid":""}],"trafficMonitors":[{"profile":"RASCAL_TM_dev","status":"ONLINE","port":80,"cachegroup":"dev","hostname":"trafficmonitor","fqdn":"trafficmonitor.dev.ciab.test","ip":"129.0.0.1","ip6":""}],"cacheGroups":[{"name":"dev","coordinates":{"latitude":0,"longitude":0}},{"name":"tr-cg","coordinates":{"latitude":0,"longitude":0}}],"profiles":[{"name":"CCR_dev","type":"CCR","parameters":null},{"name":"EDGE_dev","type":"EDGE","parameters":{"health.polling.format":"stats_over_http","health.polling.url":"http://edge:8080/_stats?application=\u0026inf.name=${interface_name}"}}],"deliveryServices":[{"xmlId":"dev","totalTpsThreshold":0,"status":"REPORTED","totalKbpsThreshold":0}],"config":{"health.polling.interval":6000,"heartbeat.polling.interval":3000,"peers.polling.interval":3000,"tm.polling.interval":2000}}' ) ON CONFLICT DO NOTHING; @@ -302,7 +302,7 @@ INSERT INTO regex ( pattern ) VALUES ( (SELECT id FROM "type" WHERE "name" = 'HOST_REGEXP'), - '.*\\.dev\\..*' + '.*\.dev\..*' ) ON CONFLICT DO NOTHING; @@ -312,7 +312,7 @@ INSERT INTO deliveryservice_regex ( set_number ) VALUES ( (SELECT id FROM deliveryservice WHERE xml_id = 'dev') , - (SELECT id FROM regex WHERE pattern = '.*\\.dev\\..*' LIMIT 1), + (SELECT id FROM regex WHERE pattern = '.*\.dev\..*' LIMIT 1), 0 ) ON CONFLICT DO NOTHING; From 93ac83c9ed76210924f2ba5256be0b4c319a3e4a Mon Sep 17 00:00:00 2001 From: ocket8888 Date: Thu, 24 Feb 2022 12:38:56 -0700 Subject: [PATCH 94/98] Add 'clean' target to Makefile to destroy built binaries --- Makefile | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 0a0986e5a0..c6f563785f 100644 --- a/Makefile +++ b/Makefile @@ -19,7 +19,7 @@ TO_SOURCE=$(filter-out %_test.go,$(wildcard traffic_ops/traffic_ops_golang/**.go T3C_TARGETS := cache-config/t3c/t3c cache-config/t3c-apply/t3c-apply cache-config/t3c-check/t3c-check t3c-check-refs/t3c-check-refs t3c-check-reload/t3c-check-reload cache-config/t3c-diff/t3c-diff cache-config/t3c-generate/t3c-generate cache-config/t3c-preprocess/t3c-preprocess cache-config/t3c-request/t3c-request cache-config/t3c-update/t3c-update -.PHONY: lint unit all check +.PHONY: lint unit all check clean all: traffic_ops/app/db/admin $(T3C_TARGETS) @@ -40,3 +40,6 @@ cache-config/t3c-check-refs/t3c-check-refs: cache-config/t3c-check-refs/config/c unit: cache-config/t3c-check-refs/t3c-check-refs go test $(addsuffix ...,$(addprefix ./,$(CACHE_CONFIG_DIRS))) ./grove/... ./lib/... ./traffic_monitor/... ./traffic_ops/traffic_ops_golang/... ./traffic_stats/... + +clean: + $(RM) traffic_ops/app/db/admin $(T3C_TARGETS) From 5619116cdcf889ea65a51f7b9afef1b83455d6c7 Mon Sep 17 00:00:00 2001 From: ocket8888 Date: Thu, 24 Feb 2022 13:18:46 -0700 Subject: [PATCH 95/98] Change DS XMLID to dev-ds and add coveragezone file --- dev/traffic_ops/seed.psql | 16 ++++++++-------- dev/traffic_router/czf.json | 20 ++++++++++++++++++++ 2 files changed, 28 insertions(+), 8 deletions(-) create mode 100644 dev/traffic_router/czf.json diff --git a/dev/traffic_ops/seed.psql b/dev/traffic_ops/seed.psql index 4560c90343..e365f6395b 100644 --- a/dev/traffic_ops/seed.psql +++ b/dev/traffic_ops/seed.psql @@ -46,8 +46,8 @@ INSERT INTO snapshot ( monitoring ) VALUES ( 'dev', - '{"config":{"coveragezone.polling.url":"file:///root/go/src/github.com/apache/trafficcontrol/traffic_router/core/src/test/resources/czf.json","dnssec.enabled":"false","domain_name":"ciab.test","geolocation.polling.url":"file:///root/go/src/github.com/apache/trafficcontrol/traffic_router/core/src/test/resources/geo/GeoLite2-City.mmdb.gz"},"contentServers":{"edge":{"cacheGroup":"dev","fqdn":"edge.dev.ciab.test","hashCount":999,"hashId":"edge","httpsPort":443,"interfaceName":"eth0","ip":"129.0.0.2","ip6":"","locationId":"dev","port":80,"profile":"EDGE_dev","status":"REPORTED","type":"EDGE","routingDisabled":0}},"contentRouters":{"trafficrouter":{"fqdn":"trafficrouter.dev.ciab.test","httpsPort":443,"ip":"","ip6":"","location":"tr-cg","port":80,"profile":"CCR_dev","status":"ONLINE"}},"deliveryServices":{"dev":{"anonymousBlockingEnabled":"false","coverageZoneOnly":"false","deepCachingType":"NEVER","dispersion":{"limit":1,"shuffled":"true"},"domains":["dev.ciab.test"],"ecsEnabled":"false","geolocationProvider":"maxmindGeolocationService","ip6RoutingEnabled":"false","matchsets":[{"protocol":"HTTP","matchlist":[{"regex":".*\\.dev\\..*","match-type":"HOST"}]}],"protocol":{"acceptHttps":"false","redirectToHttps":"false"},"regionalGeoBlocking":"false","routingName":"cdn","soa":{"admin":"traffic_ops","expire":"604800","minimum":"30","refresh":"28800","retry":"7200"},"sslEnabled":"false","ttls":{"A":"","AAAA":"","NS":"3600","SOA":"86400"}}},"edgeLocations":{"dev":{"latitude":0,"longitude":0,"backupLocations":{"fallbackToClosest":"true"},"localizationMethods":["GEO","CZ","DEEP_CZ"]}},"trafficRouterLocations":{"tr-cg":{"latitude":0,"longitude":0,"backupLocations":{"fallbackToClosest":"false"},"localizationMethods":["GEO","CZ","DEEP_CZ"]}},"monitors":{"trafficmonitor":{"fqdn":"trafficmonitor.dev.ciab.test","httpsPort":null,"ip":"129.0.0.1","ip6":"","location":"dev","port":80,"profile":"RASCAL_TM_dev","status":"ONLINE"}},"stats":{"CDN_name":"dev","date":1645572050,"tm_host":"trafficops","tm_user":"admin","tm_version":"development"}}', - '{"trafficServers":[{"profile":"EDGE_dev","status":"REPORTED","port":80,"cachegroup":"dev","hostname":"edge","fqdn":"edge.dev.ciab.test","interfaces":[{"ipAddresses":[{"address":"129.0.0.2","gateway":null,"serviceAddress":true}],"maxBandwidth":null,"monitor":true,"mtu":1500,"name":"eth0"}],"type":"EDGE","hashid":""}],"trafficMonitors":[{"profile":"RASCAL_TM_dev","status":"ONLINE","port":80,"cachegroup":"dev","hostname":"trafficmonitor","fqdn":"trafficmonitor.dev.ciab.test","ip":"129.0.0.1","ip6":""}],"cacheGroups":[{"name":"dev","coordinates":{"latitude":0,"longitude":0}},{"name":"tr-cg","coordinates":{"latitude":0,"longitude":0}}],"profiles":[{"name":"CCR_dev","type":"CCR","parameters":null},{"name":"EDGE_dev","type":"EDGE","parameters":{"health.polling.format":"stats_over_http","health.polling.url":"http://edge:8080/_stats?application=\u0026inf.name=${interface_name}"}}],"deliveryServices":[{"xmlId":"dev","totalTpsThreshold":0,"status":"REPORTED","totalKbpsThreshold":0}],"config":{"health.polling.interval":6000,"heartbeat.polling.interval":3000,"peers.polling.interval":3000,"tm.polling.interval":2000}}' + '{"config":{"coveragezone.polling.url":"file:///root/go/src/github.com/apache/trafficcontrol/dev/traffic_router/czf.json","dnssec.enabled":"false","domain_name":"ciab.test","geolocation.polling.url":"file:///root/go/src/github.com/apache/trafficcontrol/traffic_router/core/src/test/resources/geo/GeoLite2-City.mmdb.gz"},"contentServers":{"edge":{"cacheGroup":"dev","fqdn":"edge.dev.ciab.test","hashCount":999,"hashId":"edge","httpsPort":443,"interfaceName":"eth0","ip":"129.0.0.2","ip6":"","locationId":"dev","port":80,"profile":"EDGE_dev","status":"REPORTED","type":"EDGE","routingDisabled":0}},"contentRouters":{"trafficrouter":{"fqdn":"trafficrouter.dev.ciab.test","httpsPort":443,"ip":"","ip6":"","location":"tr-cg","port":80,"profile":"CCR_dev","status":"ONLINE"}},"deliveryServices":{"dev-ds":{"anonymousBlockingEnabled":"false","coverageZoneOnly":"false","deepCachingType":"NEVER","dispersion":{"limit":1,"shuffled":"true"},"domains":["dev.ciab.test"],"ecsEnabled":"false","geolocationProvider":"maxmindGeolocationService","ip6RoutingEnabled":"false","matchsets":[{"protocol":"HTTP","matchlist":[{"regex":".*\\.dev\\..*","match-type":"HOST"}]}],"protocol":{"acceptHttps":"false","redirectToHttps":"false"},"regionalGeoBlocking":"false","routingName":"cdn","soa":{"admin":"traffic_ops","expire":"604800","minimum":"30","refresh":"28800","retry":"7200"},"sslEnabled":"false","ttls":{"A":"","AAAA":"","NS":"3600","SOA":"86400"}}},"edgeLocations":{"dev":{"latitude":0,"longitude":0,"backupLocations":{"fallbackToClosest":"true"},"localizationMethods":["GEO","CZ","DEEP_CZ"]}},"trafficRouterLocations":{"tr-cg":{"latitude":0,"longitude":0,"backupLocations":{"fallbackToClosest":"false"},"localizationMethods":["GEO","CZ","DEEP_CZ"]}},"monitors":{"trafficmonitor":{"fqdn":"trafficmonitor.dev.ciab.test","httpsPort":null,"ip":"129.0.0.1","ip6":"","location":"dev","port":80,"profile":"RASCAL_TM_dev","status":"ONLINE"}},"stats":{"CDN_name":"dev","date":1645572050,"tm_host":"trafficops","tm_user":"admin","tm_version":"development"}}', + '{"trafficServers":[{"profile":"EDGE_dev","status":"REPORTED","port":80,"cachegroup":"dev","hostname":"edge","fqdn":"edge.dev.ciab.test","interfaces":[{"ipAddresses":[{"address":"129.0.0.2","gateway":null,"serviceAddress":true}],"maxBandwidth":null,"monitor":true,"mtu":1500,"name":"eth0"}],"type":"EDGE","hashid":""}],"trafficMonitors":[{"profile":"RASCAL_TM_dev","status":"ONLINE","port":80,"cachegroup":"dev","hostname":"trafficmonitor","fqdn":"trafficmonitor.dev.ciab.test","ip":"129.0.0.1","ip6":""}],"cacheGroups":[{"name":"dev","coordinates":{"latitude":1,"longitude":1}},{"name":"tr-cg","coordinates":{"latitude":1,"longitude":1}}],"profiles":[{"name":"CCR_dev","type":"CCR","parameters":null},{"name":"EDGE_dev","type":"EDGE","parameters":{"health.polling.format":"stats_over_http","health.polling.url":"http://edge:8080/_stats?application=\u0026inf.name=${interface_name}"}}],"deliveryServices":[{"xmlId":"dev-ds","totalTpsThreshold":0,"status":"REPORTED","totalKbpsThreshold":0}],"config":{"health.polling.interval":6000,"heartbeat.polling.interval":3000,"peers.polling.interval":3000,"tm.polling.interval":2000}}' ) ON CONFLICT DO NOTHING; @@ -109,7 +109,7 @@ INSERT INTO parameter ( ), ( 'CRConfig.json', 'coveragezone.polling.url', - 'file:///root/go/src/github.com/apache/trafficcontrol/traffic_router/core/src/test/resources/czf.json' + 'file:///root/go/src/github.com/apache/trafficcontrol/dev/traffic_router/czf.json' ), ( 'global', 'tm.url', @@ -286,7 +286,7 @@ INSERT INTO deliveryservice ( display_name, tenant_id ) VALUES ( - 'dev', + 'dev-ds', TRUE, 1, 0, @@ -302,7 +302,7 @@ INSERT INTO regex ( pattern ) VALUES ( (SELECT id FROM "type" WHERE "name" = 'HOST_REGEXP'), - '.*\.dev\..*' + '.*\.dev-ds\..*' ) ON CONFLICT DO NOTHING; @@ -311,8 +311,8 @@ INSERT INTO deliveryservice_regex ( regex, set_number ) VALUES ( - (SELECT id FROM deliveryservice WHERE xml_id = 'dev') , - (SELECT id FROM regex WHERE pattern = '.*\.dev\..*' LIMIT 1), + (SELECT id FROM deliveryservice WHERE xml_id = 'dev-ds') , + (SELECT id FROM regex WHERE pattern = '.*\.dev-ds\..*' LIMIT 1), 0 ) ON CONFLICT DO NOTHING; @@ -331,7 +331,7 @@ INSERT INTO origin ( 'http', TRUE, 80, - (SELECT id FROM deliveryservice WHERE xml_id = 'dev'), + (SELECT id FROM deliveryservice WHERE xml_id = 'dev-ds'), (SELECT id FROM tenant WHERE "name" = 'root') ) ON CONFLICT DO NOTHING; diff --git a/dev/traffic_router/czf.json b/dev/traffic_router/czf.json new file mode 100644 index 0000000000..0bee5aef3a --- /dev/null +++ b/dev/traffic_router/czf.json @@ -0,0 +1,20 @@ +{ + "coverageZones": + { + "dev": + { + "network6": + [ + "::/0" + ], + "network": + [ + "0.0.0.0/0" + ], + "coordinates": { + "latitude": 1, + "longitude": 1 + } + } + } +} From 7b90addc1edd3e3248314f3f2d23bc1d1a69ee5f Mon Sep 17 00:00:00 2001 From: ocket8888 Date: Thu, 24 Feb 2022 13:20:46 -0700 Subject: [PATCH 96/98] Fix using apparently invalid latitude/longitude --- dev/traffic_ops/seed.psql | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/dev/traffic_ops/seed.psql b/dev/traffic_ops/seed.psql index e365f6395b..f61de18e47 100644 --- a/dev/traffic_ops/seed.psql +++ b/dev/traffic_ops/seed.psql @@ -173,8 +173,8 @@ INSERT INTO coordinate ( longitude ) VALUES ( 'dev', - 0, - 0 + 1, + 1 ) ON CONFLICT DO NOTHING; @@ -281,10 +281,12 @@ INSERT INTO deliveryservice ( active, dscp, qstring_ignore, - type, + "type", cdn_id, display_name, - tenant_id + tenant_id, + miss_lat, + miss_long ) VALUES ( 'dev-ds', TRUE, @@ -293,7 +295,9 @@ INSERT INTO deliveryservice ( (SELECT id FROM "type" WHERE "name" = 'HTTP'), (SELECT id FROM cdn WHERE "name" = 'dev'), 'dev', - (SELECT id FROM tenant WHERE "name" = 'root') + (SELECT id FROM tenant WHERE "name" = 'root'), + 1, + 1 ) ON CONFLICT DO NOTHING; From 504dd68e3ecf830b07612e5e8cdd755287873f72 Mon Sep 17 00:00:00 2001 From: ocket8888 Date: Thu, 24 Feb 2022 13:21:14 -0700 Subject: [PATCH 97/98] Fix DS not associated with edge server --- dev/traffic_ops/seed.psql | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/dev/traffic_ops/seed.psql b/dev/traffic_ops/seed.psql index f61de18e47..ebe281449f 100644 --- a/dev/traffic_ops/seed.psql +++ b/dev/traffic_ops/seed.psql @@ -339,3 +339,12 @@ INSERT INTO origin ( (SELECT id FROM tenant WHERE "name" = 'root') ) ON CONFLICT DO NOTHING; + +INSERT INTO deliveryservice_server ( + deliveryservice, + "server" +) VALUES ( + (SELECT id FROM deliveryservice WHERE xml_id = 'dev-ds'), + (SELECT id FROM "server" WHERE host_name = 'edge') +) +ON CONFLICT DO NOTHING; From a1e9dff65ae13d07c2192926a022f8826d54038c Mon Sep 17 00:00:00 2001 From: ocket8888 Date: Thu, 24 Feb 2022 13:45:16 -0700 Subject: [PATCH 98/98] fix cached snapshot not updated for recent changes --- dev/traffic_ops/seed.psql | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dev/traffic_ops/seed.psql b/dev/traffic_ops/seed.psql index ebe281449f..97a7153e69 100644 --- a/dev/traffic_ops/seed.psql +++ b/dev/traffic_ops/seed.psql @@ -46,7 +46,7 @@ INSERT INTO snapshot ( monitoring ) VALUES ( 'dev', - '{"config":{"coveragezone.polling.url":"file:///root/go/src/github.com/apache/trafficcontrol/dev/traffic_router/czf.json","dnssec.enabled":"false","domain_name":"ciab.test","geolocation.polling.url":"file:///root/go/src/github.com/apache/trafficcontrol/traffic_router/core/src/test/resources/geo/GeoLite2-City.mmdb.gz"},"contentServers":{"edge":{"cacheGroup":"dev","fqdn":"edge.dev.ciab.test","hashCount":999,"hashId":"edge","httpsPort":443,"interfaceName":"eth0","ip":"129.0.0.2","ip6":"","locationId":"dev","port":80,"profile":"EDGE_dev","status":"REPORTED","type":"EDGE","routingDisabled":0}},"contentRouters":{"trafficrouter":{"fqdn":"trafficrouter.dev.ciab.test","httpsPort":443,"ip":"","ip6":"","location":"tr-cg","port":80,"profile":"CCR_dev","status":"ONLINE"}},"deliveryServices":{"dev-ds":{"anonymousBlockingEnabled":"false","coverageZoneOnly":"false","deepCachingType":"NEVER","dispersion":{"limit":1,"shuffled":"true"},"domains":["dev.ciab.test"],"ecsEnabled":"false","geolocationProvider":"maxmindGeolocationService","ip6RoutingEnabled":"false","matchsets":[{"protocol":"HTTP","matchlist":[{"regex":".*\\.dev\\..*","match-type":"HOST"}]}],"protocol":{"acceptHttps":"false","redirectToHttps":"false"},"regionalGeoBlocking":"false","routingName":"cdn","soa":{"admin":"traffic_ops","expire":"604800","minimum":"30","refresh":"28800","retry":"7200"},"sslEnabled":"false","ttls":{"A":"","AAAA":"","NS":"3600","SOA":"86400"}}},"edgeLocations":{"dev":{"latitude":0,"longitude":0,"backupLocations":{"fallbackToClosest":"true"},"localizationMethods":["GEO","CZ","DEEP_CZ"]}},"trafficRouterLocations":{"tr-cg":{"latitude":0,"longitude":0,"backupLocations":{"fallbackToClosest":"false"},"localizationMethods":["GEO","CZ","DEEP_CZ"]}},"monitors":{"trafficmonitor":{"fqdn":"trafficmonitor.dev.ciab.test","httpsPort":null,"ip":"129.0.0.1","ip6":"","location":"dev","port":80,"profile":"RASCAL_TM_dev","status":"ONLINE"}},"stats":{"CDN_name":"dev","date":1645572050,"tm_host":"trafficops","tm_user":"admin","tm_version":"development"}}', + '{"config":{"coveragezone.polling.url":"file:///root/go/src/github.com/apache/trafficcontrol/dev/traffic_router/czf.json","dnssec.enabled":"false","domain_name":"ciab.test","geolocation.polling.url":"file:///root/go/src/github.com/apache/trafficcontrol/traffic_router/core/src/test/resources/geo/GeoLite2-City.mmdb.gz"},"contentServers":{"edge":{"cacheGroup":"dev","deliveryServices":["edge.dev-ds.ciab.test"],"fqdn":"edge.dev.ciab.test","hashCount":999,"hashId":"edge","httpsPort":443,"interfaceName":"eth0","ip":"129.0.0.2","ip6":"","locationId":"dev","port":80,"profile":"EDGE_dev","status":"REPORTED","type":"EDGE","routingDisabled":0}},"contentRouters":{"trafficrouter":{"fqdn":"trafficrouter.dev.ciab.test","httpsPort":443,"ip":"","ip6":"","location":"tr-cg","port":80,"profile":"CCR_dev","status":"ONLINE"}},"deliveryServices":{"dev-ds":{"anonymousBlockingEnabled":"false","coverageZoneOnly":"false","deepCachingType":"NEVER","dispersion":{"limit":1,"shuffled":"true"},"domains":["dev-ds.ciab.test"],"ecsEnabled":"false","geolocationProvider":"maxmindGeolocationService","ip6RoutingEnabled":"false","matchsets":[{"protocol":"HTTP","matchlist":[{"regex":".*\\.dev-ds\\..*","match-type":"HOST"}]}],"missLocation":{"lat":1,"long":1},"protocol":{"acceptHttps":"false","redirectToHttps":"false"},"regionalGeoBlocking":"false","routingName":"cdn","soa":{"admin":"traffic_ops","expire":"604800","minimum":"30","refresh":"28800","retry":"7200"},"sslEnabled":"false","ttls":{"A":"","AAAA":"","NS":"3600","SOA":"86400"}}},"edgeLocations":{"dev":{"latitude":1,"longitude":1,"backupLocations":{"fallbackToClosest":"true"},"localizationMethods":["GEO","CZ","DEEP_CZ"]}},"trafficRouterLocations":{"tr-cg":{"latitude":1,"longitude":1,"backupLocations":{"fallbackToClosest":"false"},"localizationMethods":["GEO","CZ","DEEP_CZ"]}},"monitors":{"trafficmonitor":{"fqdn":"trafficmonitor.dev.ciab.test","httpsPort":null,"ip":"129.0.0.1","ip6":"","location":"dev","port":80,"profile":"RASCAL_TM_dev","status":"ONLINE"}},"stats":{"CDN_name":"dev","date":1645572050,"tm_host":"trafficops","tm_user":"admin","tm_version":"development"}}', '{"trafficServers":[{"profile":"EDGE_dev","status":"REPORTED","port":80,"cachegroup":"dev","hostname":"edge","fqdn":"edge.dev.ciab.test","interfaces":[{"ipAddresses":[{"address":"129.0.0.2","gateway":null,"serviceAddress":true}],"maxBandwidth":null,"monitor":true,"mtu":1500,"name":"eth0"}],"type":"EDGE","hashid":""}],"trafficMonitors":[{"profile":"RASCAL_TM_dev","status":"ONLINE","port":80,"cachegroup":"dev","hostname":"trafficmonitor","fqdn":"trafficmonitor.dev.ciab.test","ip":"129.0.0.1","ip6":""}],"cacheGroups":[{"name":"dev","coordinates":{"latitude":1,"longitude":1}},{"name":"tr-cg","coordinates":{"latitude":1,"longitude":1}}],"profiles":[{"name":"CCR_dev","type":"CCR","parameters":null},{"name":"EDGE_dev","type":"EDGE","parameters":{"health.polling.format":"stats_over_http","health.polling.url":"http://edge:8080/_stats?application=\u0026inf.name=${interface_name}"}}],"deliveryServices":[{"xmlId":"dev-ds","totalTpsThreshold":0,"status":"REPORTED","totalKbpsThreshold":0}],"config":{"health.polling.interval":6000,"heartbeat.polling.interval":3000,"peers.polling.interval":3000,"tm.polling.interval":2000}}' ) ON CONFLICT DO NOTHING;