From b297520666cc303bbd5ae35aa34ab19324f07537 Mon Sep 17 00:00:00 2001 From: SuperQ Date: Mon, 1 Nov 2021 21:44:49 +0100 Subject: [PATCH 001/135] Add agent mode identifier Identify in the logs and liveness endpoints if the server is running in Agent mode or not. Signed-off-by: SuperQ --- cmd/prometheus/main.go | 10 +++++++++- web/web.go | 5 +++-- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/cmd/prometheus/main.go b/cmd/prometheus/main.go index d1563b1d500..69b21aeb22a 100644 --- a/cmd/prometheus/main.go +++ b/cmd/prometheus/main.go @@ -510,7 +510,14 @@ func main() { klogv2.ClampLevel(6) klogv2.SetLogger(log.With(logger, "component", "k8s_client_runtime")) - level.Info(logger).Log("msg", "Starting Prometheus", "version", version.Info()) + modeAppName := "Prometheus Server" + mode := "server" + if agentMode { + modeAppName = "Prometheus Agent" + mode = "agent" + } + + level.Info(logger).Log("msg", "Starting "+modeAppName, "mode", mode, "version", version.Info()) if bits.UintSize < 64 { level.Warn(logger).Log("msg", "This Prometheus binary has not been compiled for a 64-bit architecture. Due to virtual memory constraints of 32-bit systems, it is highly recommended to switch to a 64-bit binary of Prometheus.", "GOARCH", runtime.GOARCH) } @@ -604,6 +611,7 @@ func main() { cfg.web.Notifier = notifierManager cfg.web.LookbackDelta = time.Duration(cfg.lookbackDelta) cfg.web.IsAgent = agentMode + cfg.web.AppName = modeAppName cfg.web.Version = &web.PrometheusVersion{ Version: version.Version, diff --git a/web/web.go b/web/web.go index 47d76590ec0..3b05df7cd5c 100644 --- a/web/web.go +++ b/web/web.go @@ -254,6 +254,7 @@ type Options struct { RemoteReadBytesInFrame int EnableRemoteWriteReceiver bool IsAgent bool + AppName string Gatherer prometheus.Gatherer Registerer prometheus.Registerer @@ -463,11 +464,11 @@ func New(logger log.Logger, o *Options) *Handler { router.Get("/-/healthy", func(w http.ResponseWriter, r *http.Request) { w.WriteHeader(http.StatusOK) - fmt.Fprintf(w, "Prometheus is Healthy.\n") + fmt.Fprintf(w, o.AppName+" is Healthy.\n") }) router.Get("/-/ready", readyf(func(w http.ResponseWriter, r *http.Request) { w.WriteHeader(http.StatusOK) - fmt.Fprintf(w, "Prometheus is Ready.\n") + fmt.Fprintf(w, o.AppName+" is Ready.\n") })) return h From 5b73e518260d8bab36ebb1c0d0a5826eba8fc0a0 Mon Sep 17 00:00:00 2001 From: Augustin Husson Date: Fri, 8 Apr 2022 14:19:26 +0200 Subject: [PATCH 002/135] cut v2.35.0-rc0 (#10543) Signed-off-by: Augustin Husson --- CHANGELOG.md | 16 ++++++++++++++++ VERSION | 2 +- 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d24177d4f55..3880619f783 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,19 @@ +## 2.35.0-rc0 / 2022-04-08 + +* [CHANGE] TSDB: Delete *.tmp WAL files when Prometheus starts. #10317 +* [CHANGE] promtool: Add new flag `--lint` (enabled by default) for the commands `check rules` and `check config`, resulting in a new exit code (`3`) for linter errors. #10435 +* [FEATURE] Support for automatically setting the variable `GOMAXPROCS` to the container CPU limit. Enable with the flag `--enable-feature=auto-gomaxprocs` #10498 +* [FEATURE] PromQL: Extend statistics with total and peak number of samples in a query. Additionally, per-step statistics are available with --enable-feature=promql-per-step-stats and using `stats=all` in the query API. +Enable with the flag `--enable-feature=per-step-stats` #10369 +* [ENHANCEMENT] Prometheus is built with Go 1.18. #10501 +* [ENHANCEMENT] TSDB: more efficient sorting of postings read from WAL at startup. #10500 +* [ENHANCEMENT] Azure SD: Add metric to track Azure SD failures #10476 +* [ENHANCEMENT] Azure SD: Add an optional `resource_group` configuration. #10365 +* [ENHANCEMENT] Kubernetes SD: Support `discovery.k8s.io/v1` `EndpointSlice` (previously only `discovery.k8s.io/v1beta1` `EndpointSlice` was supported). #9570 +* [BUGFIX] Kubernetes SD: Explicitly include gcp auth from k8s.io. #10516 +* [BUGFIX] Fix OpenMetrics parser to sort uppercase labels correctly. #10510 +* [BUGFIX] UI: Fix scrape interval and duration tooltip not showing on target page. #10545 + ## 2.34.0 / 2022-03-15 * [CHANGE] UI: Classic UI removed. #10208 diff --git a/VERSION b/VERSION index dc1591835cd..044037b8c0c 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -2.34.0 +2.35.0-rc0 From 8abef6d661b8dc82a25e071fcfbbec1c0298c949 Mon Sep 17 00:00:00 2001 From: Julien Pivotto Date: Tue, 12 Apr 2022 11:00:54 +0200 Subject: [PATCH 003/135] Proper support for go modules. (#10486) * Proper support for go modules. This pull requests makes Prometheus go-mod compatible. The general idea is to release the Prometheus libraries as v0.x releases, next to the v2.x tags used by end users. This is done by mirroring Prometheus 2.x tags with Prometheus 0.x tags. When v2.X.0 is released, we would release v0.X.0. Pre-go mod versions are retracted from go.mod. This is not nice but should work. Only v2.x tags will be built and released by CI. v0.x.x tags would just be normal tags in the repo, not promoted as releases. Signed-off-by: Julien Pivotto --- .circleci/config.yml | 6 +-- .github/workflows/codeql-analysis.yml | 45 ++++-------------- RELEASE.md | 12 +++++ go.mod | 66 +++++++++++++++++++++++++++ 4 files changed, 90 insertions(+), 39 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 44cf04abd4d..c7f59df3137 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -148,7 +148,7 @@ workflows: promu_opts: "-p linux/amd64 -p windows/amd64 -p linux/arm64 -p darwin/amd64 -p darwin/arm64 -p linux/386" filters: tags: - ignore: /^v[0-9]+(\.[0-9]+){2}(-.+|[^-.]*)$/ + ignore: /^v2(\.[0-9]+){2}(-.+|[^-.]*)$/ branches: ignore: /^(main|release-.*|.*build-all.*)$/ - prometheus/build: @@ -158,7 +158,7 @@ workflows: branches: only: /^(main|release-.*|.*build-all.*)$/ tags: - only: /^v[0-9]+(\.[0-9]+){2}(-.+|[^-.]*)$/ + only: /^v2(\.[0-9]+){2}(-.+|[^-.]*)$/ - prometheus/publish_main: context: org-context requires: @@ -177,7 +177,7 @@ workflows: - build_all filters: tags: - only: /^v[0-9]+(\.[0-9]+){2}(-.+|[^-.]*)$/ + only: /^v2(\.[0-9]+){2}(-.+|[^-.]*)$/ branches: ignore: /.*/ image: circleci/golang:1-node diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index 903e221c7f5..55890343d4c 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -1,21 +1,10 @@ -# For most projects, this workflow file will not need changing; you simply need -# to commit it to your repository. -# -# You may wish to alter this file to override the set of languages analyzed, -# or to provide custom queries or build logic. -# -# ******** NOTE ******** -# We have attempted to detect the languages in your repository. Please check -# the `language` matrix defined below to confirm you have the correct set of -# supported CodeQL languages. -# +--- name: "CodeQL" on: push: branches: [main, release-*] pull_request: - # The branches below must be a subset of the branches above branches: [main] schedule: - cron: "26 14 * * 1" @@ -24,44 +13,28 @@ jobs: analyze: name: Analyze runs-on: ubuntu-latest + permissions: + security-events: write strategy: fail-fast: false matrix: language: ["go", "javascript"] - # CodeQL supports [ 'cpp', 'csharp', 'go', 'java', 'javascript', 'python' ] - # Learn more: - # https://docs.github.com/en/free-pro-team@latest/github/finding-security-vulnerabilities-and-errors-in-your-code/configuring-code-scanning#changing-the-languages-that-are-analyzed steps: - name: Checkout repository uses: actions/checkout@v3 + - uses: actions/setup-go@v3 + with: + go-version: '>=1.17 <1.18' - # Initializes the CodeQL tools for scanning. - name: Initialize CodeQL - uses: github/codeql-action/init@v1 + uses: github/codeql-action/init@v2 with: languages: ${{ matrix.language }} - # If you wish to specify custom queries, you can do so here or in a config file. - # By default, queries listed here will override any specified in a config file. - # Prefix the list here with "+" to use these queries and those in the config file. - # queries: ./path/to/local/query, your-org/your-repo/queries@main - # Autobuild attempts to build any compiled languages (C/C++, C#, or Java). - # If this step fails, then you should remove it and run the build manually (see below) - name: Autobuild - uses: github/codeql-action/autobuild@v1 - - # ℹī¸ Command-line programs to run using the OS shell. - # 📚 https://git.io/JvXDl - - # ✏ī¸ If the Autobuild fails above, remove it and uncomment the following three lines - # and modify them (or add more) to build your code if your project - # uses a compiled language - - #- run: | - # make bootstrap - # make release + uses: github/codeql-action/autobuild@v2 - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@v1 + uses: github/codeql-action/analyze@v2 diff --git a/RELEASE.md b/RELEASE.md index 3108cf4e1bd..65da3c0c3a0 100644 --- a/RELEASE.md +++ b/RELEASE.md @@ -147,6 +147,18 @@ $ git tag -s "${tag}" -m "${tag}" $ git push origin "${tag}" ``` +Go modules versioning requires strict use of semver. Because we do not commit to +avoid code-level breaking changes for the libraries between minor releases of +the Prometheus server, we use major version zero releases for the libraries. + +Tag the new library release via the following commands: + +```bash +$ tag="v$(sed s/2/0/ < VERSION)" +$ git tag -s "${tag}" -m "${tag}" +$ git push origin "${tag}" +``` + Optionally, you can use this handy `.gitconfig` alias. ```ini diff --git a/go.mod b/go.mod index 96b4449ba09..36cd6b3ca45 100644 --- a/go.mod +++ b/go.mod @@ -124,3 +124,69 @@ exclude ( k8s.io/client-go v9.0.0+incompatible k8s.io/client-go v9.0.0-invalid+incompatible ) + +retract ( + v2.5.0+incompatible + v2.5.0-rc.2+incompatible + v2.5.0-rc.1+incompatible + v2.5.0-rc.0+incompatible + v2.4.3+incompatible + v2.4.2+incompatible + v2.4.1+incompatible + v2.4.0+incompatible + v2.4.0-rc.0+incompatible + v2.3.2+incompatible + v2.3.1+incompatible + v2.3.0+incompatible + v2.2.1+incompatible + v2.2.0+incompatible + v2.2.0-rc.1+incompatible + v2.2.0-rc.0+incompatible + v2.1.0+incompatible + v2.0.0+incompatible + v2.0.0-rc.3+incompatible + v2.0.0-rc.2+incompatible + v2.0.0-rc.1+incompatible + v2.0.0-rc.0+incompatible + v2.0.0-beta.5+incompatible + v2.0.0-beta.4+incompatible + v2.0.0-beta.3+incompatible + v2.0.0-beta.2+incompatible + v2.0.0-beta.1+incompatible + v2.0.0-beta.0+incompatible + v2.0.0-alpha.3+incompatible + v2.0.0-alpha.2+incompatible + v2.0.0-alpha.1+incompatible + v2.0.0-alpha.0+incompatible + v1.8.2 + v1.8.1 + v1.8.0 + v1.7.2 + v1.7.1 + v1.7.0 + v1.6.3 + v1.6.2 + v1.6.1 + v1.6.0 + v1.5.3 + v1.5.2 + v1.5.1 + v1.5.0 + v1.4.1 + v1.4.0 + v1.3.1 + v1.3.0 + v1.3.0-beta.0 + v1.2.3 + v1.2.2 + v1.2.1 + v1.2.0 + v1.1.3 + v1.1.2 + v1.1.1 + v1.1.0 + v1.0.2 + v1.0.1 + v1.0.0 + v1.0.0-rc.0 +) From 1186974715c58edc3317221bdd7bf6d510bceb59 Mon Sep 17 00:00:00 2001 From: Julien Pivotto Date: Tue, 12 Apr 2022 19:23:02 +0200 Subject: [PATCH 004/135] Publish UI release artefact in our github releases (#10577) This will make UI static files part of the release artefacts, for consumption by downstream distributions. Signed-off-by: Julien Pivotto --- .circleci/config.yml | 6 ++++-- scripts/package_assets.sh | 4 +++- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index c7f59df3137..966c546f2b1 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -63,8 +63,10 @@ jobs: - run: make ui-build-module - run: make ui-test - run: make assets-tarball -o assets - - store_artifacts: - path: web/ui/static.tar.gz + - persist_to_workspace: + root: . + paths: + - .tarballs - save_cache: key: v3-npm-deps-{{ checksum "web/ui/package-lock.json" }} paths: diff --git a/scripts/package_assets.sh b/scripts/package_assets.sh index a1f1571dd5b..038993851d1 100755 --- a/scripts/package_assets.sh +++ b/scripts/package_assets.sh @@ -4,5 +4,7 @@ set -euo pipefail +version="$(< VERSION)" +mkdir -p .tarballs cd web/ui -find static -type f -not -name '*.gz' -print0 | xargs -0 tar czf static.tar.gz +find static -type f -not -name '*.gz' -print0 | xargs -0 tar czf ../../.tarballs/prometheus-web-ui-${version}.tar.gz From dc8b67329918329c02c538b785ff963a5e332f17 Mon Sep 17 00:00:00 2001 From: Julien Pivotto Date: Tue, 12 Apr 2022 20:22:51 +0200 Subject: [PATCH 005/135] Build the UI when making UI tarball (#10578) We run ui-install on ci but not ui-build. This PR resolves that. Signed-off-by: Julien Pivotto --- .circleci/config.yml | 4 +--- Makefile | 2 +- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 966c546f2b1..5bbeecedf53 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -58,11 +58,9 @@ jobs: keys: - v3-npm-deps-{{ checksum "web/ui/package-lock.json" }} - v3-npm-deps- - - run: make ui-install + - run: make assets-tarball - run: make ui-lint - - run: make ui-build-module - run: make ui-test - - run: make assets-tarball -o assets - persist_to_workspace: root: . paths: diff --git a/Makefile b/Makefile index c5b58bf5ab6..59c16e1d664 100644 --- a/Makefile +++ b/Makefile @@ -68,7 +68,7 @@ assets-compress: assets scripts/compress_assets.sh .PHONY: assets-tarball -assets-tarball: assets-compress +assets-tarball: assets @echo '>> packaging assets' scripts/package_assets.sh From a5e75f355113374cc3834c4db1dbd2692fd55ebf Mon Sep 17 00:00:00 2001 From: Julien Pivotto Date: Wed, 13 Apr 2022 12:29:48 +0200 Subject: [PATCH 006/135] changelog: Add missing enhancements (#10583) Signed-off-by: Julien Pivotto --- CHANGELOG.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3880619f783..6e305ea26c7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,6 @@ ## 2.35.0-rc0 / 2022-04-08 -* [CHANGE] TSDB: Delete *.tmp WAL files when Prometheus starts. #10317 +* [CHANGE] TSDB: Delete `*.tmp` WAL files when Prometheus starts. #10317 * [CHANGE] promtool: Add new flag `--lint` (enabled by default) for the commands `check rules` and `check config`, resulting in a new exit code (`3`) for linter errors. #10435 * [FEATURE] Support for automatically setting the variable `GOMAXPROCS` to the container CPU limit. Enable with the flag `--enable-feature=auto-gomaxprocs` #10498 * [FEATURE] PromQL: Extend statistics with total and peak number of samples in a query. Additionally, per-step statistics are available with --enable-feature=promql-per-step-stats and using `stats=all` in the query API. @@ -10,6 +10,8 @@ Enable with the flag `--enable-feature=per-step-stats` #10369 * [ENHANCEMENT] Azure SD: Add metric to track Azure SD failures #10476 * [ENHANCEMENT] Azure SD: Add an optional `resource_group` configuration. #10365 * [ENHANCEMENT] Kubernetes SD: Support `discovery.k8s.io/v1` `EndpointSlice` (previously only `discovery.k8s.io/v1beta1` `EndpointSlice` was supported). #9570 +* [ENHANCEMENT] OAuth2: Support for using a proxy URL to fetch OAuth2 tokens. #10492 +* [ENHANCEMENT] Configuration: Add the ability to disable HTTP2. #10492 * [BUGFIX] Kubernetes SD: Explicitly include gcp auth from k8s.io. #10516 * [BUGFIX] Fix OpenMetrics parser to sort uppercase labels correctly. #10510 * [BUGFIX] UI: Fix scrape interval and duration tooltip not showing on target page. #10545 From a1aa3721e8893a67c1fde9ea1e5a3778be77dcc7 Mon Sep 17 00:00:00 2001 From: TomasKohout Date: Wed, 13 Apr 2022 15:41:28 +0200 Subject: [PATCH 007/135] uber.go/automaxprocs package upgrade for cgroups2 support (#10584) Signed-off-by: Tomas Kohout --- go.mod | 2 +- go.sum | 6 ++++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 36cd6b3ca45..9fecc16ad52 100644 --- a/go.mod +++ b/go.mod @@ -63,7 +63,7 @@ require ( go.opentelemetry.io/otel/sdk v1.6.1 go.opentelemetry.io/otel/trace v1.6.1 go.uber.org/atomic v1.9.0 - go.uber.org/automaxprocs v1.4.0 + go.uber.org/automaxprocs v1.5.1 go.uber.org/goleak v1.1.12 golang.org/x/net v0.0.0-20220325170049-de3da57026de golang.org/x/oauth2 v0.0.0-20220309155454-6242fa91716a diff --git a/go.sum b/go.sum index f97a568df48..2e3f5a14eee 100644 --- a/go.sum +++ b/go.sum @@ -1026,6 +1026,8 @@ github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZN github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= github.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s= github.com/pquerna/cachecontrol v0.0.0-20171018203845-0dec1b30a021/go.mod h1:prYjPmNq4d1NPVmpShWobRqXY3q7Vp+80DqgxxUrUIA= +github.com/prashantv/gostub v1.1.0 h1:BTyx3RfQjRHnUWaGF9oQos79AlQ5k8WNktv7VGvVH4g= +github.com/prashantv/gostub v1.1.0/go.mod h1:A5zLQHz7ieHGG7is6LLXLz7I8+3LZzsrV0P1IAHhP5U= github.com/prometheus/alertmanager v0.24.0 h1:HBWR3lk4uy3ys+naDZthDdV7yEsxpaNeZuUS+hJgrOw= github.com/prometheus/alertmanager v0.24.0/go.mod h1:r6fy/D7FRuZh5YbnX6J3MBY0eI4Pb5yPYS7/bPSXXqI= github.com/prometheus/client_golang v0.0.0-20180209125602-c332b6f63c06/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= @@ -1294,8 +1296,8 @@ go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= go.uber.org/atomic v1.9.0 h1:ECmE8Bn/WFTYwEW/bpKD3M8VtR/zQVbavAoalC1PYyE= go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= -go.uber.org/automaxprocs v1.4.0 h1:CpDZl6aOlLhReez+8S3eEotD7Jx0Os++lemPlMULQP0= -go.uber.org/automaxprocs v1.4.0/go.mod h1:/mTEdr7LvHhs0v7mjdxDreTz1OG5zdZGqgOnhWiR/+Q= +go.uber.org/automaxprocs v1.5.1 h1:e1YG66Lrk73dn4qhg8WFSvhF0JuFQF0ERIp4rpuV8Qk= +go.uber.org/automaxprocs v1.5.1/go.mod h1:BF4eumQw0P9GtnuxxovUd06vwm1o18oMzFtK66vU6XU= go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= go.uber.org/goleak v1.1.12 h1:gZAh5/EyT/HQwlpkCy6wTpqfH9H8Lz8zbm3dZh+OyzA= go.uber.org/goleak v1.1.12/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= From 286dfc70b7c7d22a17068b5038bc13f02bf87d70 Mon Sep 17 00:00:00 2001 From: Robert Fratto Date: Thu, 14 Apr 2022 04:27:06 -0400 Subject: [PATCH 008/135] tsdb/agent: port grafana/agent#676 (#10587) * tsdb/agent: port grafana/agent#676 grafana/agent#676 fixed an issue where a loading a WAL with multiple segments may result in ref ID collision. The starting ref ID for new series should be set to the highest ref ID across all series records from all WAL segments. This fixes an issue where the starting ref ID was incorrectly set to the highest ref ID found in the newest segment, which may not have any ref IDs at all if no series records have been appended to it yet. Signed-off-by: Robert Fratto * tsdb/agent: update terminology (s/ref ID/nextRef) Signed-off-by: Robert Fratto --- tsdb/agent/db.go | 2 +- tsdb/agent/db_test.go | 37 +++++++++++++++++++++++++++++++++++++ 2 files changed, 38 insertions(+), 1 deletion(-) diff --git a/tsdb/agent/db.go b/tsdb/agent/db.go index 7d42d14feba..a06d8f1f902 100644 --- a/tsdb/agent/db.go +++ b/tsdb/agent/db.go @@ -392,7 +392,7 @@ func (db *DB) replayWAL() error { func (db *DB) loadWAL(r *wal.Reader, multiRef map[chunks.HeadSeriesRef]chunks.HeadSeriesRef) (err error) { var ( dec record.Decoder - lastRef chunks.HeadSeriesRef + lastRef = chunks.HeadSeriesRef(db.nextRef.Load()) decoded = make(chan interface{}, 10) errCh = make(chan error, 1) diff --git a/tsdb/agent/db_test.go b/tsdb/agent/db_test.go index e99712f71f0..a44b6c72863 100644 --- a/tsdb/agent/db_test.go +++ b/tsdb/agent/db_test.go @@ -15,6 +15,7 @@ package agent import ( "context" + "fmt" "path/filepath" "strconv" "testing" @@ -24,6 +25,7 @@ import ( "github.com/prometheus/client_golang/prometheus" dto "github.com/prometheus/client_model/go" + "github.com/prometheus/common/model" "github.com/stretchr/testify/require" "github.com/prometheus/prometheus/model/exemplar" @@ -409,6 +411,41 @@ func TestLockfile(t *testing.T) { }) } +func Test_ExistingWAL_NextRef(t *testing.T) { + dbDir := t.TempDir() + rs := remote.NewStorage(log.NewNopLogger(), nil, startTime, dbDir, time.Second*30, nil) + defer func() { + require.NoError(t, rs.Close()) + }() + + db, err := Open(log.NewNopLogger(), nil, rs, dbDir, DefaultOptions()) + require.NoError(t, err) + + seriesCount := 10 + + // Append series + app := db.Appender(context.Background()) + for i := 0; i < seriesCount; i++ { + lset := labels.Labels{ + {Name: model.MetricNameLabel, Value: fmt.Sprintf("series_%d", i)}, + } + _, err := app.Append(0, lset, 0, 100) + require.NoError(t, err) + } + require.NoError(t, app.Commit()) + + // Truncate the WAL to force creation of a new segment. + require.NoError(t, db.truncate(0)) + require.NoError(t, db.Close()) + + // Create a new storage and see what nextRef is initialized to. + db, err = Open(log.NewNopLogger(), nil, rs, dbDir, DefaultOptions()) + require.NoError(t, err) + defer require.NoError(t, db.Close()) + + require.Equal(t, uint64(seriesCount), db.nextRef.Load(), "nextRef should be equal to the number of series written across the entire WAL") +} + func startTime() (int64, error) { return time.Now().Unix() * 1000, nil } From 580e852f1028ecbcaa67836f2da5230ac7c35fd0 Mon Sep 17 00:00:00 2001 From: Jayapriya Pai Date: Wed, 9 Mar 2022 18:57:50 +0530 Subject: [PATCH 009/135] scrape: Update error message for label limits Signed-off-by: Jayapriya Pai --- scrape/scrape.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/scrape/scrape.go b/scrape/scrape.go index 5447870cc44..e8d5147df8d 100644 --- a/scrape/scrape.go +++ b/scrape/scrape.go @@ -619,7 +619,7 @@ func verifyLabelLimits(lset labels.Labels, limits *labelLimits) error { if limits.labelLimit > 0 { nbLabels := len(lset) if nbLabels > int(limits.labelLimit) { - return fmt.Errorf("label_limit exceeded (metric: %.50s, number of label: %d, limit: %d)", met, nbLabels, limits.labelLimit) + return fmt.Errorf("label_limit exceeded (metric: %.50s, number of labels: %d, limit: %d)", met, nbLabels, limits.labelLimit) } } @@ -631,14 +631,14 @@ func verifyLabelLimits(lset labels.Labels, limits *labelLimits) error { if limits.labelNameLengthLimit > 0 { nameLength := len(l.Name) if nameLength > int(limits.labelNameLengthLimit) { - return fmt.Errorf("label_name_length_limit exceeded (metric: %.50s, label: %.50v, name length: %d, limit: %d)", met, l, nameLength, limits.labelNameLengthLimit) + return fmt.Errorf("label_name_length_limit exceeded (metric: %.50s, label name: %.50s, length: %d, limit: %d)", met, l.Name, nameLength, limits.labelNameLengthLimit) } } if limits.labelValueLengthLimit > 0 { valueLength := len(l.Value) if valueLength > int(limits.labelValueLengthLimit) { - return fmt.Errorf("label_value_length_limit exceeded (metric: %.50s, label: %.50v, value length: %d, limit: %d)", met, l, valueLength, limits.labelValueLengthLimit) + return fmt.Errorf("label_value_length_limit exceeded (metric: %.50s, label name: %.50s, value: %.50q, length: %d, limit: %d)", met, l.Name, l.Value, valueLength, limits.labelValueLengthLimit) } } } From 4d8b77546dfb2bdf86cd5e48b1494028bb1e3bad Mon Sep 17 00:00:00 2001 From: Julien Pivotto Date: Thu, 14 Apr 2022 15:05:26 +0200 Subject: [PATCH 010/135] Changelog: add missing enhancement (#10593) Signed-off-by: Julien Pivotto --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6e305ea26c7..f0b74e3e83a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,7 @@ Enable with the flag `--enable-feature=per-step-stats` #10369 * [ENHANCEMENT] Azure SD: Add metric to track Azure SD failures #10476 * [ENHANCEMENT] Azure SD: Add an optional `resource_group` configuration. #10365 * [ENHANCEMENT] Kubernetes SD: Support `discovery.k8s.io/v1` `EndpointSlice` (previously only `discovery.k8s.io/v1beta1` `EndpointSlice` was supported). #9570 +* [ENHANCEMENT] Kubernetes SD: Allow attaching node metadata to discovered pods. #10080 * [ENHANCEMENT] OAuth2: Support for using a proxy URL to fetch OAuth2 tokens. #10492 * [ENHANCEMENT] Configuration: Add the ability to disable HTTP2. #10492 * [BUGFIX] Kubernetes SD: Explicitly include gcp auth from k8s.io. #10516 From db8c550570b7b8b14873b2f79b60cadb41490c83 Mon Sep 17 00:00:00 2001 From: Julien Pivotto Date: Thu, 14 Apr 2022 15:18:46 +0200 Subject: [PATCH 011/135] Revoke storing target and metadata cache in context. (#10590) Storing the scrape cache and the target (which also contains that cache) is apparently causing hige memory increase. I think me might not control the lifespan of the context enough, therefore old objects keep living in memory for longer than needed. Let's unblock the release and look for an alternative so that downstream consumers can get access to that data. Signed-off-by: Julien Pivotto --- scrape/scrape.go | 34 +--------------------------------- 1 file changed, 1 insertion(+), 33 deletions(-) diff --git a/scrape/scrape.go b/scrape/scrape.go index 5447870cc44..09e7aae3604 100644 --- a/scrape/scrape.go +++ b/scrape/scrape.go @@ -298,12 +298,8 @@ func newScrapePool(cfg *config.ScrapeConfig, app storage.Appendable, jitterSeed } opts.target.SetMetadataStore(cache) - // Store the cache in the context. - loopCtx := ContextWithMetricMetadataStore(ctx, cache) - loopCtx = ContextWithTarget(loopCtx, opts.target) - return newScrapeLoop( - loopCtx, + ctx, opts.scraper, log.With(logger, "target", opts.target), buffers, @@ -1795,31 +1791,3 @@ func reusableCache(r, l *config.ScrapeConfig) bool { } return reflect.DeepEqual(zeroConfig(r), zeroConfig(l)) } - -// CtxKey is a dedicated type for keys of context-embedded values propagated -// with the scrape context. -type ctxKey int - -// Valid CtxKey values. -const ( - ctxKeyMetadata ctxKey = iota + 1 - ctxKeyTarget -) - -func ContextWithMetricMetadataStore(ctx context.Context, s MetricMetadataStore) context.Context { - return context.WithValue(ctx, ctxKeyMetadata, s) -} - -func MetricMetadataStoreFromContext(ctx context.Context) (MetricMetadataStore, bool) { - s, ok := ctx.Value(ctxKeyMetadata).(MetricMetadataStore) - return s, ok -} - -func ContextWithTarget(ctx context.Context, t *Target) context.Context { - return context.WithValue(ctx, ctxKeyTarget, t) -} - -func TargetFromContext(ctx context.Context) (*Target, bool) { - t, ok := ctx.Value(ctxKeyTarget).(*Target) - return t, ok -} From b4d0dcb6e8a1f16beb74059f537ac510f5439788 Mon Sep 17 00:00:00 2001 From: Julien Pivotto Date: Thu, 14 Apr 2022 12:44:02 +0200 Subject: [PATCH 012/135] Tracing/GRPC: Set TLS credentials only when insecure is false. Fixes #10542 Signed-off-by: Julien Pivotto --- tracing/tracing.go | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/tracing/tracing.go b/tracing/tracing.go index c8233206502..f5ec2895545 100644 --- a/tracing/tracing.go +++ b/tracing/tracing.go @@ -183,6 +183,14 @@ func getClient(tracingCfg config.TracingConfig) (otlptrace.Client, error) { opts := []otlptracegrpc.Option{otlptracegrpc.WithEndpoint(tracingCfg.Endpoint)} if tracingCfg.Insecure { opts = append(opts, otlptracegrpc.WithInsecure()) + } else { + // Use of TLS Credentials forces the use of TLS. Therefore it can + // only be set when `insecure` is set to false. + tlsConf, err := config_util.NewTLSConfig(&tracingCfg.TLSConfig) + if err != nil { + return nil, err + } + opts = append(opts, otlptracegrpc.WithTLSCredentials(credentials.NewTLS(tlsConf))) } if tracingCfg.Compression != "" { opts = append(opts, otlptracegrpc.WithCompressor(tracingCfg.Compression)) @@ -194,12 +202,6 @@ func getClient(tracingCfg config.TracingConfig) (otlptrace.Client, error) { opts = append(opts, otlptracegrpc.WithTimeout(time.Duration(tracingCfg.Timeout))) } - tlsConf, err := config_util.NewTLSConfig(&tracingCfg.TLSConfig) - if err != nil { - return nil, err - } - opts = append(opts, otlptracegrpc.WithTLSCredentials(credentials.NewTLS(tlsConf))) - client = otlptracegrpc.NewClient(opts...) case config.TracingClientHTTP: opts := []otlptracehttp.Option{otlptracehttp.WithEndpoint(tracingCfg.Endpoint)} From ec3d02019e84d9d793d2e137891dd7ea6d19ea60 Mon Sep 17 00:00:00 2001 From: Goutham Veeramachaneni Date: Thu, 14 Apr 2022 10:03:07 -0400 Subject: [PATCH 013/135] Pass the correct context to staleness Appender (#10588) OTel Collector prints the following error when a target disappears: ``` 2022-04-13T14:20:24.932-0400 warn scrape/scrape.go:1408 Stale append failed {"kind": "receiver", "name": "prometheus", "scrape_pool": "beep-boop", "target": "http://localhost:9090/metrics", "error": "transaction aborted"} ``` This `transaction aborted` error is returned by the custom appender that is used by the collector when the context of the appender is cancelled: https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/b7bf11174ec4d16727118b69b71c832b8d17d9b2/receiver/prometheusreceiver/internal/otlp_transaction.go#L81-L82 We call `endOfRunStaleness` after `sl.stop()` which cancels `sl.ctx`. The other `.Appender()` calls use `parentCtx` for the same reason. This hasn't come up so far because Prometheus' Appender implementation just ignores the context passed. Signed-off-by: Goutham Veeramachaneni --- scrape/scrape.go | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/scrape/scrape.go b/scrape/scrape.go index e8d5147df8d..e34cc16e1b7 100644 --- a/scrape/scrape.go +++ b/scrape/scrape.go @@ -1379,7 +1379,8 @@ func (sl *scrapeLoop) endOfRunStaleness(last time.Time, ticker *time.Ticker, int // Call sl.append again with an empty scrape to trigger stale markers. // If the target has since been recreated and scraped, the // stale markers will be out of order and ignored. - app := sl.appender(sl.ctx) + // sl.context would have been cancelled, hence using sl.parentCtx. + app := sl.appender(sl.parentCtx) var err error defer func() { if err != nil { @@ -1393,7 +1394,7 @@ func (sl *scrapeLoop) endOfRunStaleness(last time.Time, ticker *time.Ticker, int }() if _, _, _, err = sl.append(app, []byte{}, "", staleTime); err != nil { app.Rollback() - app = sl.appender(sl.ctx) + app = sl.appender(sl.parentCtx) level.Warn(sl.l).Log("msg", "Stale append failed", "err", err) } if err = sl.reportStale(app, staleTime); err != nil { From 5b80eaa3ca27beb3a831c460edaf53ac4e47c610 Mon Sep 17 00:00:00 2001 From: Augustin Husson Date: Thu, 14 Apr 2022 16:41:28 +0200 Subject: [PATCH 014/135] cut v2.35.0-rc1 (#10596) * cut v2.35.0-rc1 Signed-off-by: Augustin Husson --- CHANGELOG.md | 7 +++++++ VERSION | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f0b74e3e83a..ca8f961c438 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,10 @@ +## 2.35.0-rc1 / 2022-04-14 + +* [ENHANCEMENT] Update package `uber.go/auomaxprocs` to support `cgroups2` #10584 +* [BUGFIX] Tracing/GRPC: Set TLS credentials only when insecure is false. #10592 +* [BUGFIX] Agent: Fix ID collision when loading a WAL with multiple segments. #10587 +* [BUGFIX] Revoke storing target and metadata cache in context. This can fix a memory link introduced in `2.35.0-rc0` #10590 + ## 2.35.0-rc0 / 2022-04-08 * [CHANGE] TSDB: Delete `*.tmp` WAL files when Prometheus starts. #10317 diff --git a/VERSION b/VERSION index 044037b8c0c..925692b07c1 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -2.35.0-rc0 +2.35.0-rc1 From 624967fdbf281c3b2eb09c282b6b0b26e0d95738 Mon Sep 17 00:00:00 2001 From: Julien Pivotto Date: Thu, 14 Apr 2022 22:23:47 +0200 Subject: [PATCH 015/135] Add note about Prometheus as a library (#10594) * Add note about Prometheus as a library Signed-off-by: Julien Pivotto --- README.md | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/README.md b/README.md index 664d7b984cd..a0dbef63750 100644 --- a/README.md +++ b/README.md @@ -122,6 +122,37 @@ You can build a docker image locally with the following commands: *NB* if you are on a Mac, you will need [gnu-tar](https://formulae.brew.sh/formula/gnu-tar). +## Using Prometheus as a Go Library + +### Remote Write + +We are publishing our Remote Write protobuf independently at +[buf.build](https://buf.build/prometheus/prometheus/assets). + +You can use that as a library: + +```shell +$ go get go.buf.build/protocolbuffers/go/prometheus/prometheus +``` + +This is experimental. + +### Prometheus code base + +In order to comply with [go mod](https://go.dev/ref/mod#versions) rules, +Prometheus release number do not exactly match Go module releases. For the +Prometheus v2.y.z releases, we are publishing equivalent v0.y.z tags. + +Therefore, a user that would want to use Prometheus v2.35.0 as a library could do: + +``` +$ go get github.com/prometheus/prometheus@v0.35.0 +``` + +This solution makes it clear that we might break our internal Go APIs between +minor user-facing releases, as [breaking changes are allowed in major version +zero](https://semver.org/#spec-item-4). + ## React UI Development For more information on building, running, and developing on the new React-based UI, see the React app's [README.md](web/ui/README.md). From 4deb1a90d2f1300bb92938aa3c5949fffc7b7ce4 Mon Sep 17 00:00:00 2001 From: Paschalis Tsilias Date: Fri, 15 Apr 2022 12:12:43 +0300 Subject: [PATCH 016/135] Amend Protobuf docstrings referring to model/ packages Signed-off-by: Paschalis Tsilias --- prompb/types.pb.go | 6 +++--- prompb/types.proto | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/prompb/types.pb.go b/prompb/types.pb.go index b29170e5356..e91dd55c4d6 100644 --- a/prompb/types.pb.go +++ b/prompb/types.pb.go @@ -127,7 +127,7 @@ func (Chunk_Encoding) EnumDescriptor() ([]byte, []int) { type MetricMetadata struct { // Represents the metric type, these match the set from Prometheus. - // Refer to pkg/textparse/interface.go for details. + // Refer to model/textparse/interface.go for details. Type MetricMetadata_MetricType `protobuf:"varint,1,opt,name=type,proto3,enum=prometheus.MetricMetadata_MetricType" json:"type,omitempty"` MetricFamilyName string `protobuf:"bytes,2,opt,name=metric_family_name,json=metricFamilyName,proto3" json:"metric_family_name,omitempty"` Help string `protobuf:"bytes,4,opt,name=help,proto3" json:"help,omitempty"` @@ -200,7 +200,7 @@ func (m *MetricMetadata) GetUnit() string { type Sample struct { Value float64 `protobuf:"fixed64,1,opt,name=value,proto3" json:"value,omitempty"` - // timestamp is in ms format, see pkg/timestamp/timestamp.go for + // timestamp is in ms format, see model/timestamp/timestamp.go for // conversion from time.Time to Prometheus timestamp. Timestamp int64 `protobuf:"varint,2,opt,name=timestamp,proto3" json:"timestamp,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` @@ -259,7 +259,7 @@ type Exemplar struct { // Optional, can be empty. Labels []Label `protobuf:"bytes,1,rep,name=labels,proto3" json:"labels"` Value float64 `protobuf:"fixed64,2,opt,name=value,proto3" json:"value,omitempty"` - // timestamp is in ms format, see pkg/timestamp/timestamp.go for + // timestamp is in ms format, see model/timestamp/timestamp.go for // conversion from time.Time to Prometheus timestamp. Timestamp int64 `protobuf:"varint,3,opt,name=timestamp,proto3" json:"timestamp,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` diff --git a/prompb/types.proto b/prompb/types.proto index ee11f3a0011..6ba7074a5d3 100644 --- a/prompb/types.proto +++ b/prompb/types.proto @@ -31,7 +31,7 @@ message MetricMetadata { } // Represents the metric type, these match the set from Prometheus. - // Refer to pkg/textparse/interface.go for details. + // Refer to model/textparse/interface.go for details. MetricType type = 1; string metric_family_name = 2; string help = 4; @@ -40,7 +40,7 @@ message MetricMetadata { message Sample { double value = 1; - // timestamp is in ms format, see pkg/timestamp/timestamp.go for + // timestamp is in ms format, see model/timestamp/timestamp.go for // conversion from time.Time to Prometheus timestamp. int64 timestamp = 2; } @@ -49,7 +49,7 @@ message Exemplar { // Optional, can be empty. repeated Label labels = 1 [(gogoproto.nullable) = false]; double value = 2; - // timestamp is in ms format, see pkg/timestamp/timestamp.go for + // timestamp is in ms format, see model/timestamp/timestamp.go for // conversion from time.Time to Prometheus timestamp. int64 timestamp = 3; } From 40c1efe8bc68f74bd857edd857e1fc442275b56e Mon Sep 17 00:00:00 2001 From: Paschalis Tsilias Date: Mon, 18 Apr 2022 18:41:04 +0300 Subject: [PATCH 017/135] tsdb/agent: Ignore duplicate exemplars (#10595) * tsdb/agent: Ignore duplicate exemplars Signed-off-by: Paschalis Tsilias * Make each exemplar unique in TestCommit Signed-off-by: Paschalis Tsilias * Re-Trigger CI for Windows and UI-related steps Signed-off-by: Paschalis Tsilias * Change test comment to properly re-trigger pipeline Signed-off-by: Paschalis Tsilias * Defer Close() calls for test agent and segment reader Signed-off-by: Paschalis Tsilias --- tsdb/agent/db.go | 13 ++++++++++ tsdb/agent/db_test.go | 55 ++++++++++++++++++++++++++++++++++++++++++- tsdb/agent/series.go | 47 +++++++++++++++++++++++++++++------- 3 files changed, 106 insertions(+), 9 deletions(-) diff --git a/tsdb/agent/db.go b/tsdb/agent/db.go index 3c55283571e..0f94467851f 100644 --- a/tsdb/agent/db.go +++ b/tsdb/agent/db.go @@ -440,6 +440,8 @@ func (db *DB) loadWAL(r *wal.Reader, multiRef map[chunks.HeadSeriesRef]chunks.He decoded <- samples case record.Tombstones, record.Exemplars: // We don't care about tombstones or exemplars during replay. + // TODO: If decide to decode exemplars, we should make sure to prepopulate + // stripeSeries.exemplars in the next block by using setLatestExemplar. continue default: errCh <- &wal.CorruptionErr{ @@ -789,6 +791,16 @@ func (a *appender) AppendExemplar(ref storage.SeriesRef, l labels.Labels, e exem } } + // Check for duplicate vs last stored exemplar for this series, and discard those. + // Otherwise, record the current exemplar as the latest. + // Prometheus' TSDB returns 0 when encountering duplicates, so we do the same here. + prevExemplar := a.series.GetLatestExemplar(s.ref) + if prevExemplar != nil && prevExemplar.Equals(e) { + // Duplicate, don't return an error but don't accept the exemplar. + return 0, nil + } + a.series.SetLatestExemplar(s.ref, &e) + a.pendingExamplars = append(a.pendingExamplars, record.RefExemplar{ Ref: s.ref, T: e.Ts, @@ -796,6 +808,7 @@ func (a *appender) AppendExemplar(ref storage.SeriesRef, l labels.Labels, e exem Labels: e.Labels, }) + a.metrics.totalAppendedExemplars.Inc() return storage.SeriesRef(s.ref), nil } diff --git a/tsdb/agent/db_test.go b/tsdb/agent/db_test.go index a44b6c72863..a8acb64693d 100644 --- a/tsdb/agent/db_test.go +++ b/tsdb/agent/db_test.go @@ -129,7 +129,7 @@ func TestCommit(t *testing.T) { e := exemplar.Exemplar{ Labels: lset, - Ts: sample[0].T(), + Ts: sample[0].T() + int64(i), Value: sample[0].V(), HasTs: true, } @@ -482,3 +482,56 @@ func gatherFamily(t *testing.T, reg prometheus.Gatherer, familyName string) *dto return nil } + +func TestStorage_DuplicateExemplarsIgnored(t *testing.T) { + s := createTestAgentDB(t, nil, DefaultOptions()) + app := s.Appender(context.Background()) + defer s.Close() + + sRef, err := app.Append(0, labels.Labels{{Name: "a", Value: "1"}}, 0, 0) + require.NoError(t, err, "should not reject valid series") + + // Write a few exemplars to our appender and call Commit(). + // If the Labels, Value or Timestamp are different than the last exemplar, + // then a new one should be appended; Otherwise, it should be skipped. + e := exemplar.Exemplar{Labels: labels.Labels{{Name: "a", Value: "1"}}, Value: 20, Ts: 10, HasTs: true} + _, _ = app.AppendExemplar(sRef, nil, e) + _, _ = app.AppendExemplar(sRef, nil, e) + + e.Labels = labels.Labels{{Name: "b", Value: "2"}} + _, _ = app.AppendExemplar(sRef, nil, e) + _, _ = app.AppendExemplar(sRef, nil, e) + _, _ = app.AppendExemplar(sRef, nil, e) + + e.Value = 42 + _, _ = app.AppendExemplar(sRef, nil, e) + _, _ = app.AppendExemplar(sRef, nil, e) + + e.Ts = 25 + _, _ = app.AppendExemplar(sRef, nil, e) + _, _ = app.AppendExemplar(sRef, nil, e) + + require.NoError(t, app.Commit()) + + // Read back what was written to the WAL. + var walExemplarsCount int + sr, err := wal.NewSegmentsReader(s.wal.Dir()) + require.NoError(t, err) + defer sr.Close() + r := wal.NewReader(sr) + + var dec record.Decoder + for r.Next() { + rec := r.Record() + switch dec.Type(rec) { + case record.Exemplars: + var exemplars []record.RefExemplar + exemplars, err = dec.Exemplars(rec, exemplars) + require.NoError(t, err) + walExemplarsCount += len(exemplars) + } + } + + // We had 9 calls to AppendExemplar but only 4 of those should have gotten through. + require.Equal(t, 4, walExemplarsCount) +} diff --git a/tsdb/agent/series.go b/tsdb/agent/series.go index ddb64fc55fc..d38518f71ef 100644 --- a/tsdb/agent/series.go +++ b/tsdb/agent/series.go @@ -16,6 +16,7 @@ package agent import ( "sync" + "github.com/prometheus/prometheus/model/exemplar" "github.com/prometheus/prometheus/model/labels" "github.com/prometheus/prometheus/tsdb/chunks" ) @@ -89,10 +90,11 @@ func (m seriesHashmap) Delete(hash uint64, ref chunks.HeadSeriesRef) { // Filling the padded space with the maps was profiled to be slower - // likely due to the additional pointer dereferences. type stripeSeries struct { - size int - series []map[chunks.HeadSeriesRef]*memSeries - hashes []seriesHashmap - locks []stripeLock + size int + series []map[chunks.HeadSeriesRef]*memSeries + hashes []seriesHashmap + exemplars []map[chunks.HeadSeriesRef]*exemplar.Exemplar + locks []stripeLock gcMut sync.Mutex } @@ -105,10 +107,11 @@ type stripeLock struct { func newStripeSeries(stripeSize int) *stripeSeries { s := &stripeSeries{ - size: stripeSize, - series: make([]map[chunks.HeadSeriesRef]*memSeries, stripeSize), - hashes: make([]seriesHashmap, stripeSize), - locks: make([]stripeLock, stripeSize), + size: stripeSize, + series: make([]map[chunks.HeadSeriesRef]*memSeries, stripeSize), + hashes: make([]seriesHashmap, stripeSize), + exemplars: make([]map[chunks.HeadSeriesRef]*exemplar.Exemplar, stripeSize), + locks: make([]stripeLock, stripeSize), } for i := range s.series { s.series[i] = map[chunks.HeadSeriesRef]*memSeries{} @@ -116,6 +119,9 @@ func newStripeSeries(stripeSize int) *stripeSeries { for i := range s.hashes { s.hashes[i] = seriesHashmap{} } + for i := range s.exemplars { + s.exemplars[i] = map[chunks.HeadSeriesRef]*exemplar.Exemplar{} + } return s } @@ -154,6 +160,10 @@ func (s *stripeSeries) GC(mint int64) map[chunks.HeadSeriesRef]struct{} { delete(s.series[refLock], series.ref) s.hashes[hashLock].Delete(hash, series.ref) + // Since the series is gone, we'll also delete + // the latest stored exemplar. + delete(s.exemplars[refLock], series.ref) + if hashLock != refLock { s.locks[refLock].Unlock() } @@ -201,3 +211,24 @@ func (s *stripeSeries) Set(hash uint64, series *memSeries) { s.hashes[hashLock].Set(hash, series) s.locks[hashLock].Unlock() } + +func (s *stripeSeries) GetLatestExemplar(ref chunks.HeadSeriesRef) *exemplar.Exemplar { + i := uint64(ref) & uint64(s.size-1) + + s.locks[i].RLock() + exemplar := s.exemplars[i][ref] + s.locks[i].RUnlock() + + return exemplar +} + +func (s *stripeSeries) SetLatestExemplar(ref chunks.HeadSeriesRef, exemplar *exemplar.Exemplar) { + i := uint64(ref) & uint64(s.size-1) + + // Make sure that's a valid series id and record its latest exemplar + s.locks[i].Lock() + if s.series[i][ref] != nil { + s.exemplars[i][ref] = exemplar + } + s.locks[i].Unlock() +} From af0f6da5cb5bb9736abcfc9e8c7633ee01000ce2 Mon Sep 17 00:00:00 2001 From: Oleg Zaytsev Date: Wed, 20 Apr 2022 14:54:20 +0200 Subject: [PATCH 018/135] Fix chunk overflow appending samples at a variable rate (#10607) * Add a test with variable samples rate append This test overflows the chunk created in memseries, and the total amount of samples in the (only) mmapped chunk is 29, instead of the 65565 appended ones. Signed-off-by: Oleg Zaytsev * Cut new chunk when rate prediction was wrong When appending samples at a slow rate, and then appending at a higher rate, the prediction we made to cut a new chunk is no longer valid. Sometimes this can even cause an overflow in the chunk, if more samples than uint16 can hold are appended. Signed-off-by: Oleg Zaytsev * Improve comment on 2*samplesPerChunk Signed-off-by: Oleg Zaytsev * Assert that all chunks have less than 240 samples Also, trigger new chunk at 240, not at more than 240 Signed-off-by: Oleg Zaytsev --- tsdb/head_append.go | 7 ++++++- tsdb/head_test.go | 44 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 50 insertions(+), 1 deletion(-) diff --git a/tsdb/head_append.go b/tsdb/head_append.go index 8f1e9bc54a6..13d56de7bf2 100644 --- a/tsdb/head_append.go +++ b/tsdb/head_append.go @@ -519,7 +519,12 @@ func (s *memSeries) append(t int64, v float64, appendID uint64, chunkDiskMapper if numSamples == samplesPerChunk/4 { s.nextAt = computeChunkEndTime(c.minTime, c.maxTime, s.nextAt) } - if t >= s.nextAt { + // If numSamples > samplesPerChunk*2 then our previous prediction was invalid, + // most likely because samples rate has changed and now they are arriving more frequently. + // Since we assume that the rate is higher, we're being conservative and cutting at 2*samplesPerChunk + // as we expect more chunks to come. + // Note that next chunk will have its nextAt recalculated for the new rate. + if t >= s.nextAt || numSamples >= samplesPerChunk*2 { c = s.cutNewHeadChunk(t, chunkDiskMapper) chunkCreated = true } diff --git a/tsdb/head_test.go b/tsdb/head_test.go index 54dc82cf94f..7cd072a192b 100644 --- a/tsdb/head_test.go +++ b/tsdb/head_test.go @@ -1308,6 +1308,50 @@ func TestMemSeries_append(t *testing.T) { } } +func TestMemSeries_append_atVariableRate(t *testing.T) { + const samplesPerChunk = 120 + dir := t.TempDir() + // This is usually taken from the Head, but passing manually here. + chunkDiskMapper, err := chunks.NewChunkDiskMapper(nil, dir, chunkenc.NewPool(), chunks.DefaultWriteBufferSize, chunks.DefaultWriteQueueSize) + require.NoError(t, err) + t.Cleanup(func() { + require.NoError(t, chunkDiskMapper.Close()) + }) + + s := newMemSeries(labels.Labels{}, 1, DefaultBlockDuration, nil, defaultIsolationDisabled) + + // At this slow rate, we will fill the chunk in two block durations. + slowRate := (DefaultBlockDuration * 2) / samplesPerChunk + + var nextTs int64 + var totalAppendedSamples int + for i := 0; i < samplesPerChunk/4; i++ { + ok, _ := s.append(nextTs, float64(i), 0, chunkDiskMapper) + require.Truef(t, ok, "slow sample %d was not appended", i) + nextTs += slowRate + totalAppendedSamples++ + } + require.Equal(t, DefaultBlockDuration, s.nextAt, "after appending a samplesPerChunk/4 samples at a slow rate, we should aim to cut a new block at the default block duration %d, but it's set to %d", DefaultBlockDuration, s.nextAt) + + // Suddenly, the rate increases and we receive a sample every millisecond. + for i := 0; i < math.MaxUint16; i++ { + ok, _ := s.append(nextTs, float64(i), 0, chunkDiskMapper) + require.Truef(t, ok, "quick sample %d was not appended", i) + nextTs++ + totalAppendedSamples++ + } + ok, chunkCreated := s.append(DefaultBlockDuration, float64(0), 0, chunkDiskMapper) + require.True(t, ok, "new chunk sample was not appended") + require.True(t, chunkCreated, "sample at block duration timestamp should create a new chunk") + + var totalSamplesInChunks int + for i, c := range s.mmappedChunks { + totalSamplesInChunks += int(c.numSamples) + require.LessOrEqualf(t, c.numSamples, uint16(2*samplesPerChunk), "mmapped chunk %d has more than %d samples", i, 2*samplesPerChunk) + } + require.Equal(t, totalAppendedSamples, totalSamplesInChunks, "wrong number of samples in %d mmapped chunks", len(s.mmappedChunks)) +} + func TestGCChunkAccess(t *testing.T) { // Put a chunk, select it. GC it and then access it. h, _ := newTestHead(t, 1000, false) From a11e73eddaf9f2243efaaea37c2a3a8e3d68df99 Mon Sep 17 00:00:00 2001 From: Chris Marchbanks Date: Wed, 20 Apr 2022 12:50:41 -0600 Subject: [PATCH 019/135] Fix a deadlock between Batch and FlushAndShutdown (#10608) If FlushAndShutdown is called with a full batchQueue, and then Batch is called rather than the normal path of reading from a queue a deadlock might be encountered. Rather than having FlushAndShutdown having blocking code while holding a lock retry sending the batch every second. Signed-off-by: Chris Marchbanks --- storage/remote/queue_manager.go | 32 ++++++++++++++++++++-------- storage/remote/queue_manager_test.go | 26 ++++++++++++++++++++++ 2 files changed, 49 insertions(+), 9 deletions(-) diff --git a/storage/remote/queue_manager.go b/storage/remote/queue_manager.go index 215537e4f07..46bd7e1ff22 100644 --- a/storage/remote/queue_manager.go +++ b/storage/remote/queue_manager.go @@ -1116,19 +1116,33 @@ func (q *queue) ReturnForReuse(batch []sampleOrExemplar) { // FlushAndShutdown stops the queue and flushes any samples. No appends can be // made after this is called. func (q *queue) FlushAndShutdown(done <-chan struct{}) { + for q.tryEnqueueingBatch(done) { + time.Sleep(time.Second) + } + q.batch = nil + close(q.batchQueue) +} + +// tryEnqueueingBatch tries to send a batch if necessary. If sending needs to +// be retried it will return true. +func (q *queue) tryEnqueueingBatch(done <-chan struct{}) bool { q.batchMtx.Lock() defer q.batchMtx.Unlock() + if len(q.batch) == 0 { + return false + } - if len(q.batch) > 0 { - select { - case q.batchQueue <- q.batch: - case <-done: - // The shard has been hard shut down, so no more samples can be - // sent. Drop everything left in the queue. - } + select { + case q.batchQueue <- q.batch: + return false + case <-done: + // The shard has been hard shut down, so no more samples can be sent. + // No need to try again as we will drop everything left in the queue. + return false + default: + // The batchQueue is full, so we need to try again later. + return true } - q.batch = nil - close(q.batchQueue) } func (q *queue) newBatch(capacity int) []sampleOrExemplar { diff --git a/storage/remote/queue_manager_test.go b/storage/remote/queue_manager_test.go index 0f8f9f44950..ff3f1aaf201 100644 --- a/storage/remote/queue_manager_test.go +++ b/storage/remote/queue_manager_test.go @@ -1183,3 +1183,29 @@ func TestQueueManagerMetrics(t *testing.T) { err = client_testutil.GatherAndCompare(reg, strings.NewReader("")) require.NoError(t, err) } + +func TestQueue_FlushAndShutdownDoesNotDeadlock(t *testing.T) { + capacity := 100 + batchSize := 10 + queue := newQueue(batchSize, capacity) + for i := 0; i < capacity+batchSize; i++ { + queue.Append(sampleOrExemplar{}) + } + + done := make(chan struct{}) + go queue.FlushAndShutdown(done) + go func() { + // Give enough time for FlushAndShutdown to acquire the lock. queue.Batch() + // should not block forever even if the lock is acquired. + time.Sleep(10 * time.Millisecond) + queue.Batch() + close(done) + }() + select { + case <-done: + case <-time.After(2 * time.Second): + t.Error("Deadlock in FlushAndShutdown detected") + pprof.Lookup("goroutine").WriteTo(os.Stdout, 1) + t.FailNow() + } +} From 09da88114dbfe7717a6e1efa6a4be9966e91f691 Mon Sep 17 00:00:00 2001 From: Julien Pivotto Date: Wed, 20 Apr 2022 09:57:53 +0200 Subject: [PATCH 020/135] Support overriding minimum TLS version Signed-off-by: Julien Pivotto --- config/config_test.go | 4 ++++ config/testdata/conf.good.yml | 3 +++ docs/configuration/configuration.md | 6 ++++++ go.mod | 2 +- go.sum | 4 ++-- 5 files changed, 16 insertions(+), 3 deletions(-) diff --git a/config/config_test.go b/config/config_test.go index 822185dbadf..65a81100074 100644 --- a/config/config_test.go +++ b/config/config_test.go @@ -14,6 +14,7 @@ package config import ( + "crypto/tls" "encoding/json" "io/ioutil" "net/url" @@ -179,6 +180,9 @@ var expectedConf = &Config{ }, FollowRedirects: true, EnableHTTP2: true, + TLSConfig: config.TLSConfig{ + MinVersion: config.TLSVersion(tls.VersionTLS10), + }, }, ServiceDiscoveryConfigs: discovery.Configs{ diff --git a/config/testdata/conf.good.yml b/config/testdata/conf.good.yml index 33e9639d615..58ef791af75 100644 --- a/config/testdata/conf.good.yml +++ b/config/testdata/conf.good.yml @@ -91,6 +91,9 @@ scrape_configs: authorization: credentials_file: valid_token_file + tls_config: + min_version: TLS10 + - job_name: service-x basic_auth: diff --git a/docs/configuration/configuration.md b/docs/configuration/configuration.md index 08349e24171..1185573d006 100644 --- a/docs/configuration/configuration.md +++ b/docs/configuration/configuration.md @@ -369,6 +369,12 @@ A `tls_config` allows configuring TLS connections. # Disable validation of the server certificate. [ insecure_skip_verify: ] + +# Minimum acceptable TLS version. Accepted values: TLS10 (TLS 1.0), TLS11 (TLS +# 1.1), TLS12 (TLS 1.2), TLS13 (TLS 1.3). +# If unset, Prometheus will use Go default minimum version, which is TLS 1.2. +# See MinVersion in https://pkg.go.dev/crypto/tls#Config. +[ min_version: ] ``` ### `` diff --git a/go.mod b/go.mod index 9fecc16ad52..cf9e9dbb3d0 100644 --- a/go.mod +++ b/go.mod @@ -48,7 +48,7 @@ require ( github.com/prometheus/alertmanager v0.24.0 github.com/prometheus/client_golang v1.12.1 github.com/prometheus/client_model v0.2.0 - github.com/prometheus/common v0.33.0 + github.com/prometheus/common v0.34.0 github.com/prometheus/common/assets v0.1.0 github.com/prometheus/common/sigv4 v0.1.0 github.com/prometheus/exporter-toolkit v0.7.1 diff --git a/go.sum b/go.sum index 2e3f5a14eee..54e138a5d5d 100644 --- a/go.sum +++ b/go.sum @@ -1063,8 +1063,8 @@ github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9 github.com/prometheus/common v0.29.0/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= github.com/prometheus/common v0.30.0/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= github.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= -github.com/prometheus/common v0.33.0 h1:rHgav/0a6+uYgGdNt3jwz8FNSesO/Hsang3O0T9A5SE= -github.com/prometheus/common v0.33.0/go.mod h1:gB3sOl7P0TvJabZpLY5uQMpUqRCPPCyRLCZYc7JZTNE= +github.com/prometheus/common v0.34.0 h1:RBmGO9d/FVjqHT0yUGQwBJhkwKV+wPCn7KGpvfab0uE= +github.com/prometheus/common v0.34.0/go.mod h1:gB3sOl7P0TvJabZpLY5uQMpUqRCPPCyRLCZYc7JZTNE= github.com/prometheus/common/assets v0.1.0 h1:8WlWPDRjbfff4FWCBjaUF0NEIgDD2Mv2anoKfwG+Ums= github.com/prometheus/common/assets v0.1.0/go.mod h1:D17UVUE12bHbim7HzwUvtqm6gwBEaDQ0F+hIGbFbccI= github.com/prometheus/common/sigv4 v0.1.0 h1:qoVebwtwwEhS85Czm2dSROY5fTo2PAPEVdDeppTwGX4= From b2c21433ebe562ae48eab20e66dd4aef05572ec7 Mon Sep 17 00:00:00 2001 From: Joker Date: Thu, 21 Apr 2022 16:15:14 +0800 Subject: [PATCH 021/135] Fix exemplar docs. (#10609) Signed-off-by: Joker --- docs/configuration/configuration.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/configuration/configuration.md b/docs/configuration/configuration.md index 08349e24171..4386a5cb5a2 100644 --- a/docs/configuration/configuration.md +++ b/docs/configuration/configuration.md @@ -99,7 +99,7 @@ remote_read: # Storage related settings that are runtime reloadable. storage: - [ - ... ] + [ exemplars: ] # Configures exporting traces. tracing: From 6656cd29fe6ac92bab91ecec0fe162ef0f187654 Mon Sep 17 00:00:00 2001 From: Augustin Husson Date: Thu, 21 Apr 2022 11:38:51 +0200 Subject: [PATCH 022/135] cut v2.35.0 (#10614) * cut v2.35.0 Signed-off-by: Augustin Husson * add a note about the changes introduced by go1.18 Signed-off-by: Augustin Husson --- CHANGELOG.md | 21 ++++++++++++--------- VERSION | 2 +- 2 files changed, 13 insertions(+), 10 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ca8f961c438..843116caf66 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,28 +1,31 @@ -## 2.35.0-rc1 / 2022-04-14 +## 2.35.0 / 2022-04-21 -* [ENHANCEMENT] Update package `uber.go/auomaxprocs` to support `cgroups2` #10584 -* [BUGFIX] Tracing/GRPC: Set TLS credentials only when insecure is false. #10592 -* [BUGFIX] Agent: Fix ID collision when loading a WAL with multiple segments. #10587 -* [BUGFIX] Revoke storing target and metadata cache in context. This can fix a memory link introduced in `2.35.0-rc0` #10590 +This Prometheus release is built with go1.18, which contains two noticeable changes related to TLS: -## 2.35.0-rc0 / 2022-04-08 +* [TLS 1.0 and 1.1 disabled by default client-side](https://go.dev/doc/go1.18#tls10). +Prometheus users can override this with the `min_version` parameter of [tls_config](https://prometheus.io/docs/prometheus/latest/configuration/configuration/#tls_config). +* [Certificates signed with the SHA-1 hash function are rejected](https://go.dev/doc/go1.18#sha1). This doesn't apply to self-signed root certificates. * [CHANGE] TSDB: Delete `*.tmp` WAL files when Prometheus starts. #10317 * [CHANGE] promtool: Add new flag `--lint` (enabled by default) for the commands `check rules` and `check config`, resulting in a new exit code (`3`) for linter errors. #10435 -* [FEATURE] Support for automatically setting the variable `GOMAXPROCS` to the container CPU limit. Enable with the flag `--enable-feature=auto-gomaxprocs` #10498 +* [FEATURE] Support for automatically setting the variable `GOMAXPROCS` to the container CPU limit. Enable with the flag `--enable-feature=auto-gomaxprocs`. #10498 * [FEATURE] PromQL: Extend statistics with total and peak number of samples in a query. Additionally, per-step statistics are available with --enable-feature=promql-per-step-stats and using `stats=all` in the query API. -Enable with the flag `--enable-feature=per-step-stats` #10369 +Enable with the flag `--enable-feature=per-step-stats`. #10369 * [ENHANCEMENT] Prometheus is built with Go 1.18. #10501 * [ENHANCEMENT] TSDB: more efficient sorting of postings read from WAL at startup. #10500 -* [ENHANCEMENT] Azure SD: Add metric to track Azure SD failures #10476 +* [ENHANCEMENT] Azure SD: Add metric to track Azure SD failures. #10476 * [ENHANCEMENT] Azure SD: Add an optional `resource_group` configuration. #10365 * [ENHANCEMENT] Kubernetes SD: Support `discovery.k8s.io/v1` `EndpointSlice` (previously only `discovery.k8s.io/v1beta1` `EndpointSlice` was supported). #9570 * [ENHANCEMENT] Kubernetes SD: Allow attaching node metadata to discovered pods. #10080 * [ENHANCEMENT] OAuth2: Support for using a proxy URL to fetch OAuth2 tokens. #10492 * [ENHANCEMENT] Configuration: Add the ability to disable HTTP2. #10492 +* [ENHANCEMENT] Config: Support overriding minimum TLS version. #10610 * [BUGFIX] Kubernetes SD: Explicitly include gcp auth from k8s.io. #10516 * [BUGFIX] Fix OpenMetrics parser to sort uppercase labels correctly. #10510 * [BUGFIX] UI: Fix scrape interval and duration tooltip not showing on target page. #10545 +* [BUGFIX] Tracing/GRPC: Set TLS credentials only when insecure is false. #10592 +* [BUGFIX] Agent: Fix ID collision when loading a WAL with multiple segments. #10587 +* [BUGFIX] Remote-write: Fix a deadlock between Batch and flushing the queue. #10608 ## 2.34.0 / 2022-03-15 diff --git a/VERSION b/VERSION index 925692b07c1..aa5388f6376 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -2.35.0-rc1 +2.35.0 From fc3f1b8ded810a1263f72d37db9db4e8ce726120 Mon Sep 17 00:00:00 2001 From: Julien Pivotto Date: Fri, 22 Apr 2022 16:36:30 +0200 Subject: [PATCH 023/135] Move issue template to yml; add form. (#10576) * Move issue template to yml; add form. Signed-off-by: Julien Pivotto * Address comment Signed-off-by: Julien Pivotto * Add render for versions Signed-off-by: Julien Pivotto * Add placeholders Signed-off-by: Julien Pivotto * More placeholder Signed-off-by: Julien Pivotto * More required: true Signed-off-by: Julien Pivotto * More render: Signed-off-by: Julien Pivotto --- .github/ISSUE_TEMPLATE/bug_report.md | 57 --------------------- .github/ISSUE_TEMPLATE/bug_report.yml | 74 +++++++++++++++++++++++++++ 2 files changed, 74 insertions(+), 57 deletions(-) delete mode 100644 .github/ISSUE_TEMPLATE/bug_report.md create mode 100644 .github/ISSUE_TEMPLATE/bug_report.yml diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md deleted file mode 100644 index 8ee3cce7918..00000000000 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ /dev/null @@ -1,57 +0,0 @@ ---- -name: Bug report -about: Create a report to help us improve. -title: '' -assignees: '' ---- - - - -**What did you do?** - -**What did you expect to see?** - -**What did you see instead? Under which circumstances?** - -**Environment** - -* System information: - - insert output of `uname -srm` here - -* Prometheus version: - - insert output of `prometheus --version` here - -* Alertmanager version: - - insert output of `alertmanager --version` here (if relevant to the issue) - -* Prometheus configuration file: -``` -insert configuration here -``` - -* Alertmanager configuration file: -``` -insert configuration here (if relevant to the issue) -``` - - -* Logs: -``` -insert Prometheus and Alertmanager logs relevant to the issue here -``` diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml new file mode 100644 index 00000000000..90773a63ef0 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -0,0 +1,74 @@ +--- +name: Bug report +description: Create a report to help us improve. +body: + - type: markdown + attributes: + value: | + Thank you for opening a bug report for Prometheus. + + Please do *NOT* ask support questions in Github issues. + + If your issue is not a feature request or bug report use our [community support](https://prometheus.io/community/). + + There is also [commercial support](https://prometheus.io/support-training/) available. + - type: textarea + attributes: + label: What did you do? + description: Please provide steps for us to reproduce this issue. + validations: + required: true + - type: textarea + attributes: + label: What did you expect to see? + - type: textarea + attributes: + label: What did you see instead? Under which circumstances? + validations: + required: true + - type: markdown + attributes: + value: | + ## Environment + - type: input + attributes: + label: System information + description: insert output of `uname -srm` here, or operating system version + placeholder: e.g. Linux 5.16.15 x86_64 + - type: textarea + attributes: + label: Prometheus version + description: Insert output of `prometheus --version` here. + render: text + placeholder: | + e.g. prometheus, version 2.23.0 (branch: HEAD, revision: 26d89b4b0776fe4cd5a3656dfa520f119a375273) + build user: root@37609b3a0a21 + build date: 20201126-10:56:17 + go version: go1.15.5 + platform: linux/amd64 + - type: textarea + attributes: + label: Prometheus configuration file + description: Insert relevant configuration here. Don't forget to remove secrets. + render: yaml + - type: textarea + attributes: + label: Alertmanager version + description: Insert output of `alertmanager --version` here (if relevant to the issue). + render: text + placeholder: | + e.g. alertmanager, version 0.22.2 (branch: HEAD, revision: 44f8adc06af5101ad64bd8b9c8b18273f2922051) + build user: root@b595c7f32520 + build date: 20210602-07:50:37 + go version: go1.16.4 + platform: linux/amd64 + - type: textarea + attributes: + label: Alertmanager configuration file + description: Insert relevant configuration here. Don't forget to remove secrets. + render: yaml + - type: textarea + attributes: + label: Logs + description: Insert Prometheus and Alertmanager logs relevant to the issue here. + render: text From 64fc3e58fec13af55968db89a484b9e0c5425bd6 Mon Sep 17 00:00:00 2001 From: Julien Pivotto Date: Tue, 26 Apr 2022 13:57:02 +0200 Subject: [PATCH 024/135] Split go1.18 and changelog (#10622) Signed-off-by: Julien Pivotto --- CHANGELOG.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 843116caf66..161c23bf7d0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,9 +2,9 @@ This Prometheus release is built with go1.18, which contains two noticeable changes related to TLS: -* [TLS 1.0 and 1.1 disabled by default client-side](https://go.dev/doc/go1.18#tls10). +1. [TLS 1.0 and 1.1 disabled by default client-side](https://go.dev/doc/go1.18#tls10). Prometheus users can override this with the `min_version` parameter of [tls_config](https://prometheus.io/docs/prometheus/latest/configuration/configuration/#tls_config). -* [Certificates signed with the SHA-1 hash function are rejected](https://go.dev/doc/go1.18#sha1). This doesn't apply to self-signed root certificates. +2. [Certificates signed with the SHA-1 hash function are rejected](https://go.dev/doc/go1.18#sha1). This doesn't apply to self-signed root certificates. * [CHANGE] TSDB: Delete `*.tmp` WAL files when Prometheus starts. #10317 * [CHANGE] promtool: Add new flag `--lint` (enabled by default) for the commands `check rules` and `check config`, resulting in a new exit code (`3`) for linter errors. #10435 From 685493187ec5f5734777769f595cf8418d49900d Mon Sep 17 00:00:00 2001 From: David Heap <88432183+heapdavid@users.noreply.github.com> Date: Tue, 26 Apr 2022 13:09:33 +0100 Subject: [PATCH 025/135] Support numerical labels in PuppetDB service discovery (#10633) Fixes #10626 where previously only bool and string were supported Signed-off-by: David Heap --- discovery/puppetdb/fixtures/vhosts.json | 11 +++++++++++ discovery/puppetdb/puppetdb_test.go | 4 ++++ discovery/puppetdb/resources.go | 8 ++++++++ 3 files changed, 23 insertions(+) diff --git a/discovery/puppetdb/fixtures/vhosts.json b/discovery/puppetdb/fixtures/vhosts.json index 5ea7b05a2c0..0a9db872ef8 100644 --- a/discovery/puppetdb/fixtures/vhosts.json +++ b/discovery/puppetdb/fixtures/vhosts.json @@ -26,6 +26,17 @@ "alias": "/cgi-bin", "path": "/var/www/cgi-bin" } + ], + "port": 22, + "pi": 3.141592653589793, + "buckets": [ + 0, + 2, + 5 + ], + "coordinates": [ + 60.13464726551357, + -2.0513768021728893 ] }, "resource": "49af83866dc5a1518968b68e58a25319107afe11", diff --git a/discovery/puppetdb/puppetdb_test.go b/discovery/puppetdb/puppetdb_test.go index 25340bea776..4913035ca14 100644 --- a/discovery/puppetdb/puppetdb_test.go +++ b/discovery/puppetdb/puppetdb_test.go @@ -137,10 +137,14 @@ func TestPuppetDBRefreshWithParameters(t *testing.T) { model.LabelName("__meta_puppetdb_file"): model.LabelValue("/etc/puppetlabs/code/environments/prod/modules/upstream/apache/manifests/init.pp"), model.LabelName("__meta_puppetdb_parameter_access_log"): model.LabelValue("true"), model.LabelName("__meta_puppetdb_parameter_access_log_file"): model.LabelValue("ssl_access_log"), + model.LabelName("__meta_puppetdb_parameter_buckets"): model.LabelValue("0,2,5"), + model.LabelName("__meta_puppetdb_parameter_coordinates"): model.LabelValue("60.13464726551357,-2.0513768021728893"), model.LabelName("__meta_puppetdb_parameter_docroot"): model.LabelValue("/var/www/html"), model.LabelName("__meta_puppetdb_parameter_ensure"): model.LabelValue("absent"), model.LabelName("__meta_puppetdb_parameter_labels_alias"): model.LabelValue("edinburgh"), model.LabelName("__meta_puppetdb_parameter_options"): model.LabelValue("Indexes,FollowSymLinks,MultiViews"), + model.LabelName("__meta_puppetdb_parameter_pi"): model.LabelValue("3.141592653589793"), + model.LabelName("__meta_puppetdb_parameter_port"): model.LabelValue("22"), model.LabelName("__meta_puppetdb_resource"): model.LabelValue("49af83866dc5a1518968b68e58a25319107afe11"), model.LabelName("__meta_puppetdb_tags"): model.LabelValue(",roles::hypervisor,apache,apache::vhost,class,default-ssl,profile_hypervisor,vhost,profile_apache,hypervisor,__node_regexp__edinburgh,roles,node,"), model.LabelName("__meta_puppetdb_title"): model.LabelValue("default-ssl"), diff --git a/discovery/puppetdb/resources.go b/discovery/puppetdb/resources.go index 27792b64604..d6387fe1b8b 100644 --- a/discovery/puppetdb/resources.go +++ b/discovery/puppetdb/resources.go @@ -46,6 +46,10 @@ func (p *Parameters) toLabels() model.LabelSet { labelValue = value case bool: labelValue = strconv.FormatBool(value) + case int64: + labelValue = strconv.FormatInt(value, 10) + case float64: + labelValue = strconv.FormatFloat(value, 'g', -1, 64) case []string: labelValue = separator + strings.Join(value, separator) + separator case []interface{}: @@ -59,6 +63,10 @@ func (p *Parameters) toLabels() model.LabelSet { values[i] = value case bool: values[i] = strconv.FormatBool(value) + case int64: + values[i] = strconv.FormatInt(value, 10) + case float64: + values[i] = strconv.FormatFloat(value, 'g', -1, 64) case []string: values[i] = separator + strings.Join(value, separator) + separator } From d8ca9aa67be4c84ea5818f50548aca26889fbef3 Mon Sep 17 00:00:00 2001 From: AndreSPy1 <48663717+AndreSPy1@users.noreply.github.com> Date: Tue, 26 Apr 2022 14:20:48 -0500 Subject: [PATCH 026/135] Allow setting the search term on alerts, targets, and discovery pages via the URL (#10613) * changes in files of the expr in alerts, service and targets, Signed-off-by: AndreSPy1 Signed-off-by: AndreSPy1 * update prettier corrections Signed-off-by: AndreSPy1 * update prettier corrections Signed-off-by: AndreSPy1 * correction suggested fixes PR Signed-off-by: AndreSPy1 * Update Snap AlertContents.test.tsx and update recommendations in the code Signed-off-by: AndreSPy1 * Update web/ui/react-app/src/components/SearchBar.tsx exactly, thanks :) Co-authored-by: Julius Volz Signed-off-by: AndreSPy1 * Revert "Update web/ui/react-app/src/components/SearchBar.tsx " This reverts commit 679c763a02f65297e3f761db372a0928550f288c. Signed-off-by: AndreSPy1 * update SearchBar component Signed-off-by: AndreSPy1 * eslint-disable update SearchBar testing failed Signed-off-by: AndreSPy1 * correction part in eslint-disable Signed-off-by: AndreSPy1 * fully corrected suggestion with search expression in url Signed-off-by: AndreSPy1 * implementation in handleSearchChange with useCallBack Signed-off-by: AndreSPy1 Co-authored-by: Julius Volz --- web/ui/react-app/src/components/SearchBar.tsx | 15 ++++-- .../src/pages/alerts/AlertContents.tsx | 49 ++++++++++--------- .../__snapshots__/AlertContents.test.tsx.snap | 1 + .../src/pages/serviceDiscovery/Services.tsx | 28 ++++++----- .../src/pages/targets/ScrapePoolList.tsx | 31 ++++++++---- web/ui/react-app/src/utils/index.ts | 12 +++++ 6 files changed, 88 insertions(+), 48 deletions(-) diff --git a/web/ui/react-app/src/components/SearchBar.tsx b/web/ui/react-app/src/components/SearchBar.tsx index 761b2906840..23aa515ad74 100644 --- a/web/ui/react-app/src/components/SearchBar.tsx +++ b/web/ui/react-app/src/components/SearchBar.tsx @@ -1,29 +1,34 @@ -import React, { ChangeEvent, FC } from 'react'; +import React, { ChangeEvent, FC, useEffect } from 'react'; import { Input, InputGroup, InputGroupAddon, InputGroupText } from 'reactstrap'; import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; import { faSearch } from '@fortawesome/free-solid-svg-icons'; export interface SearchBarProps { - handleChange: (e: ChangeEvent) => void; + handleChange: (e: string) => void; placeholder: string; + defaultValue: string; } -const SearchBar: FC = ({ handleChange, placeholder }) => { +const SearchBar: FC = ({ handleChange, placeholder, defaultValue }) => { let filterTimeout: NodeJS.Timeout; const handleSearchChange = (e: ChangeEvent) => { clearTimeout(filterTimeout); filterTimeout = setTimeout(() => { - handleChange(e); + handleChange(e.target.value); }, 300); }; + useEffect(() => { + handleChange(defaultValue); + }, [defaultValue, handleChange]); + return ( {} - + ); }; diff --git a/web/ui/react-app/src/pages/alerts/AlertContents.tsx b/web/ui/react-app/src/pages/alerts/AlertContents.tsx index affc39df9d0..2837399f7cf 100644 --- a/web/ui/react-app/src/pages/alerts/AlertContents.tsx +++ b/web/ui/react-app/src/pages/alerts/AlertContents.tsx @@ -1,8 +1,8 @@ -import React, { ChangeEvent, FC, Fragment, useEffect, useState } from 'react'; +import React, { FC, Fragment, useCallback, useEffect, useMemo, useState } from 'react'; import { Badge, Col, Row } from 'reactstrap'; import CollapsibleAlertPanel from './CollapsibleAlertPanel'; import Checkbox from '../../components/Checkbox'; -import { isPresent } from '../../utils'; +import { getQuerySearchFilter, isPresent, setQuerySearchFilter } from '../../utils'; import { Rule } from '../../types/types'; import { useLocalStorage } from '../../hooks/useLocalStorage'; import CustomInfiniteScroll, { InfiniteScrollItemsProps } from '../../components/CustomInfiniteScroll'; @@ -71,7 +71,6 @@ const AlertsContent: FC = ({ groups = [], statsCount }) => { inactive: true, }); const [showAnnotations, setShowAnnotations] = useLocalStorage('alerts-annotations-status', { checked: false }); - const toggleFilter = (ruleState: RuleState) => () => { setFilter({ ...filter, @@ -79,26 +78,32 @@ const AlertsContent: FC = ({ groups = [], statsCount }) => { }); }; - const handleSearchChange = (e: ChangeEvent) => { - if (e.target.value !== '') { - const pattern = e.target.value.trim(); - const result: RuleGroup[] = []; - for (const group of groups) { - const ruleFilterList = kvSearchRule.filter(pattern, group.rules); - if (ruleFilterList.length > 0) { - result.push({ - file: group.file, - name: group.name, - interval: group.interval, - rules: ruleFilterList.map((value) => value.original), - }); + const handleSearchChange = useCallback( + (value: string) => { + setQuerySearchFilter(value); + if (value !== '') { + const pattern = value.trim(); + const result: RuleGroup[] = []; + for (const group of groups) { + const ruleFilterList = kvSearchRule.filter(pattern, group.rules); + if (ruleFilterList.length > 0) { + result.push({ + file: group.file, + name: group.name, + interval: group.interval, + rules: ruleFilterList.map((value) => value.original), + }); + } } + setGroupList(result); + } else { + setGroupList(groups); } - setGroupList(result); - } else { - setGroupList(groups); - } - }; + }, + [groups] + ); + + const defaultValue = useMemo(getQuerySearchFilter, []); useEffect(() => { const result: RuleGroup[] = []; @@ -131,7 +136,7 @@ const AlertsContent: FC = ({ groups = [], statsCount }) => { })} - + diff --git a/web/ui/react-app/src/pages/serviceDiscovery/Services.tsx b/web/ui/react-app/src/pages/serviceDiscovery/Services.tsx index ea7fd9462c4..7664be1f5f4 100644 --- a/web/ui/react-app/src/pages/serviceDiscovery/Services.tsx +++ b/web/ui/react-app/src/pages/serviceDiscovery/Services.tsx @@ -1,10 +1,10 @@ -import React, { ChangeEvent, FC, useEffect, useState } from 'react'; +import React, { FC, useCallback, useEffect, useMemo, useState } from 'react'; import { useFetch } from '../../hooks/useFetch'; import { LabelsTable } from './LabelsTable'; import { DroppedTarget, Labels, Target } from '../targets/target'; import { withStatusIndicator } from '../../components/withStatusIndicator'; -import { mapObjEntries } from '../../utils'; +import { setQuerySearchFilter, mapObjEntries, getQuerySearchFilter } from '../../utils'; import { usePathPrefix } from '../../contexts/PathPrefixContext'; import { API_PATH } from '../../constants/constants'; import { KVSearch } from '@nexucis/kvsearch'; @@ -94,14 +94,20 @@ export const ServiceDiscoveryContent: FC = ({ activeTargets, dropped const [targetList, setTargetList] = useState(processSummary(activeTargets, droppedTargets)); const [labelList, setLabelList] = useState(processTargets(activeTargets, droppedTargets)); - const handleSearchChange = (e: ChangeEvent) => { - if (e.target.value !== '') { - const result = kvSearch.filter(e.target.value.trim(), activeTargets); - setActiveTargetList(result.map((value) => value.original)); - } else { - setActiveTargetList(activeTargets); - } - }; + const handleSearchChange = useCallback( + (value: string) => { + setQuerySearchFilter(value); + if (value !== '') { + const result = kvSearch.filter(value.trim(), activeTargets); + setActiveTargetList(result.map((value) => value.original)); + } else { + setActiveTargetList(activeTargets); + } + }, + [activeTargets] + ); + + const defaultValue = useMemo(getQuerySearchFilter, []); useEffect(() => { setTargetList(processSummary(activeTargetList, droppedTargets)); @@ -112,7 +118,7 @@ export const ServiceDiscoveryContent: FC = ({ activeTargets, dropped <>

Service Discovery

- +
    {mapObjEntries(targetList, ([k, v]) => ( diff --git a/web/ui/react-app/src/pages/targets/ScrapePoolList.tsx b/web/ui/react-app/src/pages/targets/ScrapePoolList.tsx index d401f772c90..d7078128e83 100644 --- a/web/ui/react-app/src/pages/targets/ScrapePoolList.tsx +++ b/web/ui/react-app/src/pages/targets/ScrapePoolList.tsx @@ -4,7 +4,7 @@ import { useFetch } from '../../hooks/useFetch'; import { API_PATH } from '../../constants/constants'; import { groupTargets, ScrapePool, ScrapePools, Target } from './target'; import { withStatusIndicator } from '../../components/withStatusIndicator'; -import { ChangeEvent, FC, useEffect, useState } from 'react'; +import { FC, useCallback, useEffect, useMemo, useState } from 'react'; import { Col, Collapse, Row } from 'reactstrap'; import { ScrapePoolContent } from './ScrapePoolContent'; import Filter, { Expanded, FilterData } from './Filter'; @@ -12,6 +12,7 @@ import { useLocalStorage } from '../../hooks/useLocalStorage'; import styles from './ScrapePoolPanel.module.css'; import { ToggleMoreLess } from '../../components/ToggleMoreLess'; import SearchBar from '../../components/SearchBar'; +import { setQuerySearchFilter, getQuerySearchFilter } from '../../utils/index'; interface ScrapePoolListProps { activeTargets: Target[]; @@ -72,14 +73,20 @@ const ScrapePoolListContent: FC = ({ activeTargets }) => { const [expanded, setExpanded] = useLocalStorage('targets-page-expansion-state', initialExpanded); const { showHealthy, showUnhealthy } = filter; - const handleSearchChange = (e: ChangeEvent) => { - if (e.target.value !== '') { - const result = kvSearch.filter(e.target.value.trim(), activeTargets); - setTargetList(result.map((value) => value.original)); - } else { - setTargetList(activeTargets); - } - }; + const handleSearchChange = useCallback( + (value: string) => { + setQuerySearchFilter(value); + if (value !== '') { + const result = kvSearch.filter(value.trim(), activeTargets); + setTargetList(result.map((value) => value.original)); + } else { + setTargetList(activeTargets); + } + }, + [activeTargets] + ); + + const defaultValue = useMemo(getQuerySearchFilter, []); useEffect(() => { const list = targetList.filter((t) => showHealthy || t.health.toLowerCase() !== 'up'); @@ -93,7 +100,11 @@ const ScrapePoolListContent: FC = ({ activeTargets }) => { - + {Object.keys(poolList) diff --git a/web/ui/react-app/src/utils/index.ts b/web/ui/react-app/src/utils/index.ts index ca714970f5f..5e05c25e166 100644 --- a/web/ui/react-app/src/utils/index.ts +++ b/web/ui/react-app/src/utils/index.ts @@ -243,9 +243,21 @@ export const encodePanelOptionsToQueryString = (panels: PanelMeta[]): string => return `?${panels.map(toQueryString).join('&')}`; }; +export const setQuerySearchFilter = (search: string) => { + window.history.pushState({}, '', `?search=${search}`); +}; + +export const getQuerySearchFilter = (): string => { + const locationSearch = window.location.search; + const params = new URLSearchParams(locationSearch); + const search = params.get('search') || ''; + return search; +}; + export const createExpressionLink = (expr: string): string => { return `../graph?g0.expr=${encodeURIComponent(expr)}&g0.tab=1&g0.stacked=0&g0.show_exemplars=0.g0.range_input=1h.`; }; + export const mapObjEntries = ( o: T, cb: ([k, v]: [string, T[key]], i: number, arr: [string, T[key]][]) => Z From e2ede285a2766de5910ae70840220b8ea096eb73 Mon Sep 17 00:00:00 2001 From: Matthieu MOREL Date: Wed, 27 Apr 2022 11:24:36 +0200 Subject: [PATCH 027/135] refactor: move from io/ioutil to io and os packages (#10528) * refactor: move from io/ioutil to io and os packages * use fs.DirEntry instead of os.FileInfo after os.ReadDir Signed-off-by: MOREL Matthieu --- .golangci.yml | 2 ++ cmd/prometheus/main_test.go | 8 ++--- cmd/prometheus/query_log_test.go | 10 +++---- cmd/promtool/debug.go | 4 +-- cmd/promtool/main.go | 3 +- cmd/promtool/rules_test.go | 8 ++--- cmd/promtool/unittest.go | 3 +- config/config.go | 3 +- config/config_test.go | 5 ++-- discovery/eureka/client.go | 3 +- discovery/file/file.go | 4 +-- discovery/file/file_test.go | 5 ++-- discovery/hetzner/robot.go | 5 ++-- discovery/http/http.go | 5 ++-- discovery/kubernetes/kubernetes.go | 4 +-- discovery/marathon/marathon.go | 10 +++---- discovery/moby/mock_test.go | 8 ++--- discovery/puppetdb/puppetdb.go | 5 ++-- discovery/scaleway/instance_test.go | 4 +-- discovery/scaleway/scaleway.go | 6 ++-- discovery/triton/triton.go | 5 ++-- discovery/xds/client.go | 5 ++-- discovery/xds/xds_test.go | 5 ++-- .../examples/custom-sd/adapter-usage/main.go | 9 +++--- .../examples/custom-sd/adapter/adapter.go | 3 +- .../custom-sd/adapter/adapter_test.go | 3 +- .../influxdb/client_test.go | 4 +-- .../remote_storage_adapter/main.go | 4 +-- .../remote_storage_adapter/opentsdb/client.go | 5 ++-- model/rulefmt/rulefmt.go | 4 +-- model/textparse/promparse_test.go | 7 ++--- notifier/notifier.go | 3 +- notifier/notifier_test.go | 10 +++---- plugins/generate.go | 3 +- promql/engine_test.go | 3 +- promql/query_logger_test.go | 3 +- promql/test.go | 4 +-- rules/manager_test.go | 3 +- scrape/scrape.go | 3 +- scrape/scrape_test.go | 5 ++-- scrape/target_test.go | 4 +-- scripts/errcheck_excludes.txt | 2 +- storage/remote/client.go | 7 ++--- storage/remote/codec.go | 5 ++-- storage/remote/queue_manager_test.go | 3 +- storage/remote/read_handler_test.go | 3 +- storage/remote/write_handler_test.go | 4 +-- tsdb/block.go | 5 ++-- tsdb/blockwriter.go | 3 +- tsdb/chunks/chunks.go | 5 ++-- tsdb/chunks/head_chunks.go | 3 +- tsdb/chunks/head_chunks_test.go | 9 +++--- tsdb/db.go | 30 +++++++++---------- tsdb/db_test.go | 27 ++++++++++------- tsdb/example_test.go | 3 +- tsdb/fileutil/fileutil.go | 5 ++-- tsdb/head_test.go | 15 +++++----- tsdb/head_wal.go | 5 ++-- tsdb/index/index.go | 3 +- tsdb/index/index_test.go | 3 +- tsdb/repair.go | 3 +- tsdb/tombstones/tombstones.go | 3 +- tsdb/tsdbutil/dir_locker_testutil.go | 5 ++-- tsdb/wal/checkpoint.go | 3 +- tsdb/wal/checkpoint_test.go | 7 ++--- tsdb/wal/reader_test.go | 3 +- tsdb/wal/wal.go | 3 +- tsdb/wal/watcher.go | 3 +- tsdb/wal_test.go | 3 +- util/httputil/compression_test.go | 4 +-- util/logging/file_test.go | 5 ++-- util/teststorage/storage.go | 3 +- util/testutil/directory.go | 3 +- web/api/v1/api_test.go | 10 +++---- web/web.go | 5 ++-- web/web_test.go | 5 ++-- 76 files changed, 181 insertions(+), 227 deletions(-) diff --git a/.golangci.yml b/.golangci.yml index 400924ab9a7..81790e6e3a6 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -16,6 +16,7 @@ linters: - misspell issues: + max-same-issues: 0 exclude-rules: - path: _test.go linters: @@ -29,6 +30,7 @@ linters-settings: - sync/atomic: "Use go.uber.org/atomic instead of sync/atomic" - github.com/stretchr/testify/assert: "Use github.com/stretchr/testify/require instead of github.com/stretchr/testify/assert" - github.com/go-kit/kit/log: "Use github.com/go-kit/log instead of github.com/go-kit/kit/log" + - io/ioutil: "Use corresponding 'os' or 'io' functions instead." - regexp: "Use github.com/grafana/regexp instead of regexp" errcheck: exclude: scripts/errcheck_excludes.txt diff --git a/cmd/prometheus/main_test.go b/cmd/prometheus/main_test.go index 1f161d26be6..cfdb5abdf0f 100644 --- a/cmd/prometheus/main_test.go +++ b/cmd/prometheus/main_test.go @@ -17,7 +17,7 @@ import ( "bytes" "context" "fmt" - "io/ioutil" + "io" "math" "os" "os/exec" @@ -211,7 +211,7 @@ func TestWALSegmentSizeBounds(t *testing.T) { stderr, err := prom.StderrPipe() require.NoError(t, err) go func() { - slurp, _ := ioutil.ReadAll(stderr) + slurp, _ := io.ReadAll(stderr) t.Log(string(slurp)) }() @@ -256,7 +256,7 @@ func TestMaxBlockChunkSegmentSizeBounds(t *testing.T) { stderr, err := prom.StderrPipe() require.NoError(t, err) go func() { - slurp, _ := ioutil.ReadAll(stderr) + slurp, _ := io.ReadAll(stderr) t.Log(string(slurp)) }() @@ -445,7 +445,7 @@ func TestModeSpecificFlags(t *testing.T) { stderr, err := prom.StderrPipe() require.NoError(t, err) go func() { - slurp, _ := ioutil.ReadAll(stderr) + slurp, _ := io.ReadAll(stderr) t.Log(string(slurp)) }() diff --git a/cmd/prometheus/query_log_test.go b/cmd/prometheus/query_log_test.go index 844bde1c963..d5dfbea5092 100644 --- a/cmd/prometheus/query_log_test.go +++ b/cmd/prometheus/query_log_test.go @@ -17,7 +17,7 @@ import ( "bufio" "encoding/json" "fmt" - "io/ioutil" + "io" "net" "net/http" "net/url" @@ -235,10 +235,10 @@ func (p *queryLogTest) run(t *testing.T) { p.skip(t) // Setup temporary files for this test. - queryLogFile, err := ioutil.TempFile("", "query") + queryLogFile, err := os.CreateTemp("", "query") require.NoError(t, err) defer os.Remove(queryLogFile.Name()) - p.configFile, err = ioutil.TempFile("", "config") + p.configFile, err = os.CreateTemp("", "config") require.NoError(t, err) defer os.Remove(p.configFile.Name()) @@ -269,7 +269,7 @@ func (p *queryLogTest) run(t *testing.T) { wg.Add(1) defer wg.Wait() go func() { - slurp, _ := ioutil.ReadAll(stderr) + slurp, _ := io.ReadAll(stderr) t.Log(string(slurp)) wg.Done() }() @@ -333,7 +333,7 @@ func (p *queryLogTest) run(t *testing.T) { return } // Move the file, Prometheus should still write to the old file. - newFile, err := ioutil.TempFile("", "newLoc") + newFile, err := os.CreateTemp("", "newLoc") require.NoError(t, err) require.NoError(t, newFile.Close()) defer os.Remove(newFile.Name()) diff --git a/cmd/promtool/debug.go b/cmd/promtool/debug.go index 23d613bb062..310004480a0 100644 --- a/cmd/promtool/debug.go +++ b/cmd/promtool/debug.go @@ -15,7 +15,7 @@ package main import ( "fmt" - "io/ioutil" + "io" "net/http" "github.com/pkg/errors" @@ -41,7 +41,7 @@ func debugWrite(cfg debugWriterConfig) error { if err != nil { return errors.Wrap(err, "error executing HTTP request") } - body, err := ioutil.ReadAll(res.Body) + body, err := io.ReadAll(res.Body) res.Body.Close() if err != nil { return errors.Wrap(err, "error reading the response body") diff --git a/cmd/promtool/main.go b/cmd/promtool/main.go index bf85786aeca..0381a3dc22d 100644 --- a/cmd/promtool/main.go +++ b/cmd/promtool/main.go @@ -19,7 +19,6 @@ import ( "encoding/json" "fmt" "io" - "io/ioutil" "math" "net/http" "net/url" @@ -541,7 +540,7 @@ func checkSDFile(filename string) ([]*targetgroup.Group, error) { } defer fd.Close() - content, err := ioutil.ReadAll(fd) + content, err := io.ReadAll(fd) if err != nil { return nil, err } diff --git a/cmd/promtool/rules_test.go b/cmd/promtool/rules_test.go index decda0fe389..aa66d08ded7 100644 --- a/cmd/promtool/rules_test.go +++ b/cmd/promtool/rules_test.go @@ -15,8 +15,8 @@ package main import ( "context" - "io/ioutil" "math" + "os" "path/filepath" "testing" "time" @@ -188,7 +188,7 @@ func createSingleRuleTestFiles(path string) error { labels: testlabel11: testlabelvalue11 ` - return ioutil.WriteFile(path, []byte(recordingRules), 0o777) + return os.WriteFile(path, []byte(recordingRules), 0o777) } func createMultiRuleTestFiles(path string) error { @@ -208,7 +208,7 @@ func createMultiRuleTestFiles(path string) error { labels: testlabel11: testlabelvalue13 ` - return ioutil.WriteFile(path, []byte(recordingRules), 0o777) + return os.WriteFile(path, []byte(recordingRules), 0o777) } // TestBackfillLabels confirms that the labels in the rule file override the labels from the metrics @@ -236,7 +236,7 @@ func TestBackfillLabels(t *testing.T) { labels: name1: value-from-rule ` - require.NoError(t, ioutil.WriteFile(path, []byte(recordingRules), 0o777)) + require.NoError(t, os.WriteFile(path, []byte(recordingRules), 0o777)) errs := ruleImporter.loadGroups(ctx, []string{path}) for _, err := range errs { require.NoError(t, err) diff --git a/cmd/promtool/unittest.go b/cmd/promtool/unittest.go index 57b6103b0b9..fd06f0e2d76 100644 --- a/cmd/promtool/unittest.go +++ b/cmd/promtool/unittest.go @@ -16,7 +16,6 @@ package main import ( "context" "fmt" - "io/ioutil" "os" "path/filepath" "reflect" @@ -64,7 +63,7 @@ func RulesUnitTest(queryOpts promql.LazyLoaderOpts, files ...string) int { func ruleUnitTest(filename string, queryOpts promql.LazyLoaderOpts) []error { fmt.Println("Unit Testing: ", filename) - b, err := ioutil.ReadFile(filename) + b, err := os.ReadFile(filename) if err != nil { return []error{err} } diff --git a/config/config.go b/config/config.go index 2c5fc447a12..6ab790f6106 100644 --- a/config/config.go +++ b/config/config.go @@ -15,7 +15,6 @@ package config import ( "fmt" - "io/ioutil" "net/url" "os" "path/filepath" @@ -103,7 +102,7 @@ func Load(s string, expandExternalLabels bool, logger log.Logger) (*Config, erro // LoadFile parses the given YAML file into a Config. func LoadFile(filename string, agentMode, expandExternalLabels bool, logger log.Logger) (*Config, error) { - content, err := ioutil.ReadFile(filename) + content, err := os.ReadFile(filename) if err != nil { return nil, err } diff --git a/config/config_test.go b/config/config_test.go index 65a81100074..e0f76219493 100644 --- a/config/config_test.go +++ b/config/config_test.go @@ -16,7 +16,6 @@ package config import ( "crypto/tls" "encoding/json" - "io/ioutil" "net/url" "os" "path/filepath" @@ -1510,7 +1509,7 @@ func TestBadConfigs(t *testing.T) { } func TestBadStaticConfigsJSON(t *testing.T) { - content, err := ioutil.ReadFile("testdata/static_config.bad.json") + content, err := os.ReadFile("testdata/static_config.bad.json") require.NoError(t, err) var tg targetgroup.Group err = json.Unmarshal(content, &tg) @@ -1518,7 +1517,7 @@ func TestBadStaticConfigsJSON(t *testing.T) { } func TestBadStaticConfigsYML(t *testing.T) { - content, err := ioutil.ReadFile("testdata/static_config.bad.yml") + content, err := os.ReadFile("testdata/static_config.bad.yml") require.NoError(t, err) var tg targetgroup.Group err = yaml.UnmarshalStrict(content, &tg) diff --git a/discovery/eureka/client.go b/discovery/eureka/client.go index 65c5b67bfe0..071743d7974 100644 --- a/discovery/eureka/client.go +++ b/discovery/eureka/client.go @@ -18,7 +18,6 @@ import ( "encoding/xml" "fmt" "io" - "io/ioutil" "net/http" "github.com/pkg/errors" @@ -95,7 +94,7 @@ func fetchApps(ctx context.Context, server string, client *http.Client) (*Applic return nil, err } defer func() { - io.Copy(ioutil.Discard, resp.Body) + io.Copy(io.Discard, resp.Body) resp.Body.Close() }() diff --git a/discovery/file/file.go b/discovery/file/file.go index 6d645e90d41..0e8e7fd4754 100644 --- a/discovery/file/file.go +++ b/discovery/file/file.go @@ -17,7 +17,7 @@ import ( "context" "encoding/json" "fmt" - "io/ioutil" + "io" "os" "path/filepath" "strings" @@ -376,7 +376,7 @@ func (d *Discovery) readFile(filename string) ([]*targetgroup.Group, error) { } defer fd.Close() - content, err := ioutil.ReadAll(fd) + content, err := io.ReadAll(fd) if err != nil { return nil, err } diff --git a/discovery/file/file_test.go b/discovery/file/file_test.go index 6c4e022d254..e3b59b47436 100644 --- a/discovery/file/file_test.go +++ b/discovery/file/file_test.go @@ -17,7 +17,6 @@ import ( "context" "encoding/json" "io" - "io/ioutil" "os" "path/filepath" "sort" @@ -73,7 +72,7 @@ func (t *testRunner) copyFile(src string) string { func (t *testRunner) copyFileTo(src, name string) string { t.Helper() - newf, err := ioutil.TempFile(t.dir, "") + newf, err := os.CreateTemp(t.dir, "") require.NoError(t, err) f, err := os.Open(src) @@ -95,7 +94,7 @@ func (t *testRunner) copyFileTo(src, name string) string { func (t *testRunner) writeString(file, data string) { t.Helper() - newf, err := ioutil.TempFile(t.dir, "") + newf, err := os.CreateTemp(t.dir, "") require.NoError(t, err) _, err = newf.WriteString(data) diff --git a/discovery/hetzner/robot.go b/discovery/hetzner/robot.go index d0f3e4d9483..73d896450d1 100644 --- a/discovery/hetzner/robot.go +++ b/discovery/hetzner/robot.go @@ -18,7 +18,6 @@ import ( "encoding/json" "fmt" "io" - "io/ioutil" "net" "net/http" "strconv" @@ -85,7 +84,7 @@ func (d *robotDiscovery) refresh(ctx context.Context) ([]*targetgroup.Group, err } defer func() { - io.Copy(ioutil.Discard, resp.Body) + io.Copy(io.Discard, resp.Body) resp.Body.Close() }() @@ -93,7 +92,7 @@ func (d *robotDiscovery) refresh(ctx context.Context) ([]*targetgroup.Group, err return nil, errors.Errorf("non 2xx status '%d' response during hetzner service discovery with role robot", resp.StatusCode) } - b, err := ioutil.ReadAll(resp.Body) + b, err := io.ReadAll(resp.Body) if err != nil { return nil, err } diff --git a/discovery/http/http.go b/discovery/http/http.go index 09a100c6b2b..f9380ddba5d 100644 --- a/discovery/http/http.go +++ b/discovery/http/http.go @@ -18,7 +18,6 @@ import ( "encoding/json" "fmt" "io" - "io/ioutil" "net/http" "net/url" "strconv" @@ -157,7 +156,7 @@ func (d *Discovery) refresh(ctx context.Context) ([]*targetgroup.Group, error) { return nil, err } defer func() { - io.Copy(ioutil.Discard, resp.Body) + io.Copy(io.Discard, resp.Body) resp.Body.Close() }() @@ -171,7 +170,7 @@ func (d *Discovery) refresh(ctx context.Context) ([]*targetgroup.Group, error) { return nil, errors.Errorf("unsupported content type %q", resp.Header.Get("Content-Type")) } - b, err := ioutil.ReadAll(resp.Body) + b, err := io.ReadAll(resp.Body) if err != nil { failuresCount.Inc() return nil, err diff --git a/discovery/kubernetes/kubernetes.go b/discovery/kubernetes/kubernetes.go index 4fa561b6eb4..b90e6a74ef4 100644 --- a/discovery/kubernetes/kubernetes.go +++ b/discovery/kubernetes/kubernetes.go @@ -16,7 +16,7 @@ package kubernetes import ( "context" "fmt" - "io/ioutil" + "os" "reflect" "strings" "sync" @@ -312,7 +312,7 @@ func New(l log.Logger, conf *SDConfig) (*Discovery, error) { } if conf.NamespaceDiscovery.IncludeOwnNamespace { - ownNamespaceContents, err := ioutil.ReadFile("/var/run/secrets/kubernetes.io/serviceaccount/namespace") + ownNamespaceContents, err := os.ReadFile("/var/run/secrets/kubernetes.io/serviceaccount/namespace") if err != nil { return nil, fmt.Errorf("could not determine the pod's namespace: %w", err) } diff --git a/discovery/marathon/marathon.go b/discovery/marathon/marathon.go index 5688efedd50..a84313c3880 100644 --- a/discovery/marathon/marathon.go +++ b/discovery/marathon/marathon.go @@ -18,10 +18,10 @@ import ( "encoding/json" "fmt" "io" - "io/ioutil" "math/rand" "net" "net/http" + "os" "strconv" "strings" "time" @@ -186,7 +186,7 @@ type authTokenFileRoundTripper struct { // newAuthTokenFileRoundTripper adds the auth token read from the file to a request. func newAuthTokenFileRoundTripper(tokenFile string, rt http.RoundTripper) (http.RoundTripper, error) { // fail-fast if we can't read the file. - _, err := ioutil.ReadFile(tokenFile) + _, err := os.ReadFile(tokenFile) if err != nil { return nil, errors.Wrapf(err, "unable to read auth token file %s", tokenFile) } @@ -194,7 +194,7 @@ func newAuthTokenFileRoundTripper(tokenFile string, rt http.RoundTripper) (http. } func (rt *authTokenFileRoundTripper) RoundTrip(request *http.Request) (*http.Response, error) { - b, err := ioutil.ReadFile(rt.authTokenFile) + b, err := os.ReadFile(rt.authTokenFile) if err != nil { return nil, errors.Wrapf(err, "unable to read auth token file %s", rt.authTokenFile) } @@ -331,7 +331,7 @@ func fetchApps(ctx context.Context, client *http.Client, url string) (*appList, return nil, err } defer func() { - io.Copy(ioutil.Discard, resp.Body) + io.Copy(io.Discard, resp.Body) resp.Body.Close() }() @@ -339,7 +339,7 @@ func fetchApps(ctx context.Context, client *http.Client, url string) (*appList, return nil, errors.Errorf("non 2xx status '%v' response during marathon service discovery", resp.StatusCode) } - b, err := ioutil.ReadAll(resp.Body) + b, err := io.ReadAll(resp.Body) if err != nil { return nil, err } diff --git a/discovery/moby/mock_test.go b/discovery/moby/mock_test.go index 3006ca5c287..f6511ed26ff 100644 --- a/discovery/moby/mock_test.go +++ b/discovery/moby/mock_test.go @@ -16,9 +16,9 @@ package moby import ( "crypto/sha1" "encoding/base64" - "io/ioutil" "net/http" "net/http/httptest" + "os" "path/filepath" "strings" "testing" @@ -63,7 +63,7 @@ func (m *SDMock) Setup() { // HandleNodesList mocks nodes list. func (m *SDMock) SetupHandlers() { headers := make(map[string]string) - rawHeaders, err := ioutil.ReadFile(filepath.Join("testdata", m.directory, "headers.yml")) + rawHeaders, err := os.ReadFile(filepath.Join("testdata", m.directory, "headers.yml")) require.NoError(m.t, err) yaml.Unmarshal(rawHeaders, &headers) @@ -102,13 +102,13 @@ func (m *SDMock) SetupHandlers() { f += "__" + base64.URLEncoding.EncodeToString(h.Sum(nil))[:10] } } - if response, err := ioutil.ReadFile(filepath.Join("testdata", m.directory, f+".json")); err == nil { + if response, err := os.ReadFile(filepath.Join("testdata", m.directory, f+".json")); err == nil { w.Header().Add("content-type", "application/json") w.WriteHeader(http.StatusOK) w.Write(response) return } - if response, err := ioutil.ReadFile(filepath.Join("testdata", m.directory, f)); err == nil { + if response, err := os.ReadFile(filepath.Join("testdata", m.directory, f)); err == nil { w.WriteHeader(http.StatusOK) w.Write(response) return diff --git a/discovery/puppetdb/puppetdb.go b/discovery/puppetdb/puppetdb.go index c2fbba0231a..19ee7a205c2 100644 --- a/discovery/puppetdb/puppetdb.go +++ b/discovery/puppetdb/puppetdb.go @@ -19,7 +19,6 @@ import ( "encoding/json" "fmt" "io" - "io/ioutil" "net" "net/http" "net/url" @@ -187,7 +186,7 @@ func (d *Discovery) refresh(ctx context.Context) ([]*targetgroup.Group, error) { return nil, err } defer func() { - io.Copy(ioutil.Discard, resp.Body) + io.Copy(io.Discard, resp.Body) resp.Body.Close() }() @@ -199,7 +198,7 @@ func (d *Discovery) refresh(ctx context.Context) ([]*targetgroup.Group, error) { return nil, errors.Errorf("unsupported content type %s", resp.Header.Get("Content-Type")) } - b, err := ioutil.ReadAll(resp.Body) + b, err := io.ReadAll(resp.Body) if err != nil { return nil, err } diff --git a/discovery/scaleway/instance_test.go b/discovery/scaleway/instance_test.go index f1778d99090..e7a32dd9248 100644 --- a/discovery/scaleway/instance_test.go +++ b/discovery/scaleway/instance_test.go @@ -16,9 +16,9 @@ package scaleway import ( "context" "fmt" - "io/ioutil" "net/http" "net/http/httptest" + "os" "testing" "github.com/prometheus/common/model" @@ -127,7 +127,7 @@ func mockScalewayInstance(w http.ResponseWriter, r *http.Request) { return } w.Header().Set("Content-Type", "application/json") - instance, err := ioutil.ReadFile("testdata/instance.json") + instance, err := os.ReadFile("testdata/instance.json") if err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) return diff --git a/discovery/scaleway/scaleway.go b/discovery/scaleway/scaleway.go index ed3d7f3917a..d4ed8a69d34 100644 --- a/discovery/scaleway/scaleway.go +++ b/discovery/scaleway/scaleway.go @@ -15,8 +15,8 @@ package scaleway import ( "context" - "io/ioutil" "net/http" + "os" "strings" "time" @@ -226,7 +226,7 @@ type authTokenFileRoundTripper struct { // newAuthTokenFileRoundTripper adds the auth token read from the file to a request. func newAuthTokenFileRoundTripper(tokenFile string, rt http.RoundTripper) (http.RoundTripper, error) { // fail-fast if we can't read the file. - _, err := ioutil.ReadFile(tokenFile) + _, err := os.ReadFile(tokenFile) if err != nil { return nil, errors.Wrapf(err, "unable to read auth token file %s", tokenFile) } @@ -234,7 +234,7 @@ func newAuthTokenFileRoundTripper(tokenFile string, rt http.RoundTripper) (http. } func (rt *authTokenFileRoundTripper) RoundTrip(request *http.Request) (*http.Response, error) { - b, err := ioutil.ReadFile(rt.authTokenFile) + b, err := os.ReadFile(rt.authTokenFile) if err != nil { return nil, errors.Wrapf(err, "unable to read auth token file %s", rt.authTokenFile) } diff --git a/discovery/triton/triton.go b/discovery/triton/triton.go index 66efd9bbc15..ef3bcca6366 100644 --- a/discovery/triton/triton.go +++ b/discovery/triton/triton.go @@ -18,7 +18,6 @@ import ( "encoding/json" "fmt" "io" - "io/ioutil" "net/http" "net/url" "strings" @@ -207,11 +206,11 @@ func (d *Discovery) refresh(ctx context.Context) ([]*targetgroup.Group, error) { } defer func() { - io.Copy(ioutil.Discard, resp.Body) + io.Copy(io.Discard, resp.Body) resp.Body.Close() }() - data, err := ioutil.ReadAll(resp.Body) + data, err := io.ReadAll(resp.Body) if err != nil { return nil, errors.Wrap(err, "an error occurred when reading the response body") } diff --git a/discovery/xds/client.go b/discovery/xds/client.go index 05d1ca40cdf..9844c6d7ed1 100644 --- a/discovery/xds/client.go +++ b/discovery/xds/client.go @@ -19,7 +19,6 @@ import ( "errors" "fmt" "io" - "io/ioutil" "net/http" "net/url" "path" @@ -195,7 +194,7 @@ func (rc *HTTPResourceClient) Fetch(ctx context.Context) (*v3.DiscoveryResponse, return nil, err } defer func() { - io.Copy(ioutil.Discard, resp.Body) + io.Copy(io.Discard, resp.Body) resp.Body.Close() }() @@ -208,7 +207,7 @@ func (rc *HTTPResourceClient) Fetch(ctx context.Context) (*v3.DiscoveryResponse, return nil, fmt.Errorf("non 200 status '%d' response during xDS fetch", resp.StatusCode) } - respBody, err := ioutil.ReadAll(resp.Body) + respBody, err := io.ReadAll(resp.Body) if err != nil { return nil, err } diff --git a/discovery/xds/xds_test.go b/discovery/xds/xds_test.go index c0cdd3e7b47..b6c141e2835 100644 --- a/discovery/xds/xds_test.go +++ b/discovery/xds/xds_test.go @@ -16,7 +16,6 @@ package xds import ( "context" "io" - "io/ioutil" "net/http" "net/http/httptest" "testing" @@ -60,9 +59,9 @@ func createTestHTTPServer(t *testing.T, responder discoveryResponder) *httptest. require.Equal(t, "application/json", r.Header.Get("Content-Type")) require.Equal(t, "application/json", r.Header.Get("Accept")) - body, err := ioutil.ReadAll(r.Body) + body, err := io.ReadAll(r.Body) defer func() { - _, _ = io.Copy(ioutil.Discard, r.Body) + _, _ = io.Copy(io.Discard, r.Body) _ = r.Body.Close() }() require.NotEmpty(t, body) diff --git a/documentation/examples/custom-sd/adapter-usage/main.go b/documentation/examples/custom-sd/adapter-usage/main.go index 80a8f1b5ed9..a3136f08e81 100644 --- a/documentation/examples/custom-sd/adapter-usage/main.go +++ b/documentation/examples/custom-sd/adapter-usage/main.go @@ -18,7 +18,6 @@ import ( "encoding/json" "fmt" "io" - "io/ioutil" "net" "net/http" "os" @@ -101,11 +100,11 @@ func (d *discovery) parseServiceNodes(resp *http.Response, name string) (*target } defer func() { - io.Copy(ioutil.Discard, resp.Body) + io.Copy(io.Discard, resp.Body) resp.Body.Close() }() - b, err := ioutil.ReadAll(resp.Body) + b, err := io.ReadAll(resp.Body) if err != nil { return nil, err } @@ -168,8 +167,8 @@ func (d *discovery) Run(ctx context.Context, ch chan<- []*targetgroup.Group) { continue } - b, err := ioutil.ReadAll(resp.Body) - io.Copy(ioutil.Discard, resp.Body) + b, err := io.ReadAll(resp.Body) + io.Copy(io.Discard, resp.Body) resp.Body.Close() if err != nil { level.Error(d.logger).Log("msg", "Error reading services list", "err", err) diff --git a/documentation/examples/custom-sd/adapter/adapter.go b/documentation/examples/custom-sd/adapter/adapter.go index abaad7dc70e..b0ed5ab9aa0 100644 --- a/documentation/examples/custom-sd/adapter/adapter.go +++ b/documentation/examples/custom-sd/adapter/adapter.go @@ -18,7 +18,6 @@ import ( "context" "encoding/json" "fmt" - "io/ioutil" "os" "path/filepath" "reflect" @@ -117,7 +116,7 @@ func (a *Adapter) writeOutput() error { b, _ := json.MarshalIndent(arr, "", " ") dir, _ := filepath.Split(a.output) - tmpfile, err := ioutil.TempFile(dir, "sd-adapter") + tmpfile, err := os.CreateTemp(dir, "sd-adapter") if err != nil { return err } diff --git a/documentation/examples/custom-sd/adapter/adapter_test.go b/documentation/examples/custom-sd/adapter/adapter_test.go index e1223537c08..eaf34c6673e 100644 --- a/documentation/examples/custom-sd/adapter/adapter_test.go +++ b/documentation/examples/custom-sd/adapter/adapter_test.go @@ -15,7 +15,6 @@ package adapter import ( "context" - "io/ioutil" "os" "testing" @@ -223,7 +222,7 @@ func TestGenerateTargetGroups(t *testing.T) { // TestWriteOutput checks the adapter can write a file to disk. func TestWriteOutput(t *testing.T) { ctx := context.Background() - tmpfile, err := ioutil.TempFile("", "sd_adapter_test") + tmpfile, err := os.CreateTemp("", "sd_adapter_test") require.NoError(t, err) defer os.Remove(tmpfile.Name()) tmpfile.Close() diff --git a/documentation/examples/remote_storage/remote_storage_adapter/influxdb/client_test.go b/documentation/examples/remote_storage/remote_storage_adapter/influxdb/client_test.go index b657abddea6..cb56514e4b2 100644 --- a/documentation/examples/remote_storage/remote_storage_adapter/influxdb/client_test.go +++ b/documentation/examples/remote_storage/remote_storage_adapter/influxdb/client_test.go @@ -14,7 +14,7 @@ package influxdb import ( - "io/ioutil" + "io" "math" "net/http" "net/http/httptest" @@ -76,7 +76,7 @@ testmetric,test_label=test_label_value2 value=5.1234 123456789123 func(w http.ResponseWriter, r *http.Request) { require.Equal(t, "POST", r.Method, "Unexpected method.") require.Equal(t, "/write", r.URL.Path, "Unexpected path.") - b, err := ioutil.ReadAll(r.Body) + b, err := io.ReadAll(r.Body) require.NoError(t, err, "Error reading body.") require.Equal(t, expectedBody, string(b), "Unexpected request body.") }, diff --git a/documentation/examples/remote_storage/remote_storage_adapter/main.go b/documentation/examples/remote_storage/remote_storage_adapter/main.go index 6a993a6098c..548d0c5d9b3 100644 --- a/documentation/examples/remote_storage/remote_storage_adapter/main.go +++ b/documentation/examples/remote_storage/remote_storage_adapter/main.go @@ -16,7 +16,7 @@ package main import ( "fmt" - "io/ioutil" + "io" "net/http" _ "net/http/pprof" "net/url" @@ -234,7 +234,7 @@ func serve(logger log.Logger, addr string, writers []writer, readers []reader) e }) http.HandleFunc("/read", func(w http.ResponseWriter, r *http.Request) { - compressed, err := ioutil.ReadAll(r.Body) + compressed, err := io.ReadAll(r.Body) if err != nil { level.Error(logger).Log("msg", "Read error", "err", err.Error()) http.Error(w, err.Error(), http.StatusInternalServerError) diff --git a/documentation/examples/remote_storage/remote_storage_adapter/opentsdb/client.go b/documentation/examples/remote_storage/remote_storage_adapter/opentsdb/client.go index d90ce48095b..4942e65dd74 100644 --- a/documentation/examples/remote_storage/remote_storage_adapter/opentsdb/client.go +++ b/documentation/examples/remote_storage/remote_storage_adapter/opentsdb/client.go @@ -18,7 +18,6 @@ import ( "context" "encoding/json" "io" - "io/ioutil" "math" "net/http" "net/url" @@ -116,7 +115,7 @@ func (c *Client) Write(samples model.Samples) error { return err } defer func() { - io.Copy(ioutil.Discard, resp.Body) + io.Copy(io.Discard, resp.Body) resp.Body.Close() }() @@ -128,7 +127,7 @@ func (c *Client) Write(samples model.Samples) error { // API returns status code 400 on error, encoding error details in the // response content in JSON. - buf, err = ioutil.ReadAll(resp.Body) + buf, err = io.ReadAll(resp.Body) if err != nil { return err } diff --git a/model/rulefmt/rulefmt.go b/model/rulefmt/rulefmt.go index 5332514ed56..46e00800746 100644 --- a/model/rulefmt/rulefmt.go +++ b/model/rulefmt/rulefmt.go @@ -17,7 +17,7 @@ import ( "bytes" "context" "io" - "io/ioutil" + "os" "strings" "time" @@ -304,7 +304,7 @@ func Parse(content []byte) (*RuleGroups, []error) { // ParseFile reads and parses rules from a file. func ParseFile(file string) (*RuleGroups, []error) { - b, err := ioutil.ReadFile(file) + b, err := os.ReadFile(file) if err != nil { return nil, []error{errors.Wrap(err, file)} } diff --git a/model/textparse/promparse_test.go b/model/textparse/promparse_test.go index b9a037de1b6..c6762b545d8 100644 --- a/model/textparse/promparse_test.go +++ b/model/textparse/promparse_test.go @@ -17,7 +17,6 @@ import ( "bytes" "compress/gzip" "io" - "io/ioutil" "os" "testing" @@ -361,7 +360,7 @@ func BenchmarkParse(b *testing.B) { require.NoError(b, err) defer f.Close() - buf, err := ioutil.ReadAll(f) + buf, err := io.ReadAll(f) require.NoError(b, err) b.Run(parserName+"/no-decode-metric/"+fn, func(b *testing.B) { @@ -501,7 +500,7 @@ func BenchmarkGzip(b *testing.B) { require.NoError(b, err) require.NoError(b, gw.Close()) - gbuf, err := ioutil.ReadAll(&buf) + gbuf, err := io.ReadAll(&buf) require.NoError(b, err) k := b.N / promtestdataSampleCount @@ -516,7 +515,7 @@ func BenchmarkGzip(b *testing.B) { gr, err := gzip.NewReader(bytes.NewReader(gbuf)) require.NoError(b, err) - d, err := ioutil.ReadAll(gr) + d, err := io.ReadAll(gr) require.NoError(b, err) require.NoError(b, gr.Close()) diff --git a/notifier/notifier.go b/notifier/notifier.go index 0fca28c3392..88cbbe0aeb6 100644 --- a/notifier/notifier.go +++ b/notifier/notifier.go @@ -19,7 +19,6 @@ import ( "encoding/json" "fmt" "io" - "io/ioutil" "net" "net/http" "net/url" @@ -583,7 +582,7 @@ func (n *Manager) sendOne(ctx context.Context, c *http.Client, url string, b []b return err } defer func() { - io.Copy(ioutil.Discard, resp.Body) + io.Copy(io.Discard, resp.Body) resp.Body.Close() }() diff --git a/notifier/notifier_test.go b/notifier/notifier_test.go index 4a2747efd34..e28a2609c98 100644 --- a/notifier/notifier_test.go +++ b/notifier/notifier_test.go @@ -18,7 +18,7 @@ import ( "context" "encoding/json" "fmt" - "io/ioutil" + "io" "net/http" "net/http/httptest" "net/url" @@ -126,7 +126,7 @@ func TestHandlerSendAll(t *testing.T) { return } - b, err := ioutil.ReadAll(r.Body) + b, err := io.ReadAll(r.Body) if err != nil { err = errors.Errorf("error reading body: %v", err) w.WriteHeader(http.StatusInternalServerError) @@ -221,7 +221,7 @@ func TestCustomDo(t *testing.T) { h := NewManager(&Options{ Do: func(_ context.Context, client *http.Client, req *http.Request) (*http.Response, error) { received = true - body, err := ioutil.ReadAll(req.Body) + body, err := io.ReadAll(req.Body) require.NoError(t, err) @@ -230,7 +230,7 @@ func TestCustomDo(t *testing.T) { require.Equal(t, testURL, req.URL.String()) return &http.Response{ - Body: ioutil.NopCloser(bytes.NewBuffer(nil)), + Body: io.NopCloser(bytes.NewBuffer(nil)), }, nil }, }, nil) @@ -331,7 +331,7 @@ func TestHandlerQueuing(t *testing.T) { case expected := <-expectedc: var alerts []*Alert - b, err := ioutil.ReadAll(r.Body) + b, err := io.ReadAll(r.Body) if err != nil { panic(err) } diff --git a/plugins/generate.go b/plugins/generate.go index 7054b109b8b..32a32d890b6 100644 --- a/plugins/generate.go +++ b/plugins/generate.go @@ -18,7 +18,6 @@ package main import ( "fmt" - "io/ioutil" "log" "os" "path" @@ -30,7 +29,7 @@ import ( //go:generate go run generate.go func main() { - data, err := ioutil.ReadFile(filepath.Join("..", "plugins.yml")) + data, err := os.ReadFile(filepath.Join("..", "plugins.yml")) if err != nil { log.Fatal(err) } diff --git a/promql/engine_test.go b/promql/engine_test.go index 6c32b901d7c..c34caa4bcfe 100644 --- a/promql/engine_test.go +++ b/promql/engine_test.go @@ -16,7 +16,6 @@ package promql import ( "context" "errors" - "io/ioutil" "os" "sort" "testing" @@ -42,7 +41,7 @@ func TestMain(m *testing.M) { func TestQueryConcurrency(t *testing.T) { maxConcurrency := 10 - dir, err := ioutil.TempDir("", "test_concurrency") + dir, err := os.MkdirTemp("", "test_concurrency") require.NoError(t, err) defer os.RemoveAll(dir) queryTracker := NewActiveQueryTracker(dir, maxConcurrency, nil) diff --git a/promql/query_logger_test.go b/promql/query_logger_test.go index 033e012d8c5..ad76fb99291 100644 --- a/promql/query_logger_test.go +++ b/promql/query_logger_test.go @@ -15,7 +15,6 @@ package promql import ( "context" - "io/ioutil" "os" "testing" @@ -105,7 +104,7 @@ func TestIndexReuse(t *testing.T) { } func TestMMapFile(t *testing.T) { - file, err := ioutil.TempFile("", "mmapedFile") + file, err := os.CreateTemp("", "mmapedFile") require.NoError(t, err) filename := file.Name() diff --git a/promql/test.go b/promql/test.go index a9408bc4c53..28bdd058860 100644 --- a/promql/test.go +++ b/promql/test.go @@ -16,8 +16,8 @@ package promql import ( "context" "fmt" - "io/ioutil" "math" + "os" "strconv" "strings" "time" @@ -78,7 +78,7 @@ func NewTest(t testutil.T, input string) (*Test, error) { } func newTestFromFile(t testutil.T, filename string) (*Test, error) { - content, err := ioutil.ReadFile(filename) + content, err := os.ReadFile(filename) if err != nil { return nil, err } diff --git a/rules/manager_test.go b/rules/manager_test.go index 121fee3935d..f69bf109a4f 100644 --- a/rules/manager_test.go +++ b/rules/manager_test.go @@ -16,7 +16,6 @@ package rules import ( "context" "fmt" - "io/ioutil" "math" "os" "sort" @@ -752,7 +751,7 @@ func TestUpdate(t *testing.T) { rgs, errs := rulefmt.ParseFile("fixtures/rules.yaml") require.Equal(t, 0, len(errs), "file parsing failures") - tmpFile, err := ioutil.TempFile("", "rules.test.*.yaml") + tmpFile, err := os.CreateTemp("", "rules.test.*.yaml") require.NoError(t, err) defer os.Remove(tmpFile.Name()) defer tmpFile.Close() diff --git a/scrape/scrape.go b/scrape/scrape.go index 4b045faca94..20633a1c516 100644 --- a/scrape/scrape.go +++ b/scrape/scrape.go @@ -20,7 +20,6 @@ import ( "context" "fmt" "io" - "io/ioutil" "math" "net/http" "reflect" @@ -773,7 +772,7 @@ func (s *targetScraper) scrape(ctx context.Context, w io.Writer) (string, error) return "", err } defer func() { - io.Copy(ioutil.Discard, resp.Body) + io.Copy(io.Discard, resp.Body) resp.Body.Close() }() diff --git a/scrape/scrape_test.go b/scrape/scrape_test.go index 80cbf344a4a..c771ee1c844 100644 --- a/scrape/scrape_test.go +++ b/scrape/scrape_test.go @@ -19,7 +19,6 @@ import ( "context" "fmt" "io" - "io/ioutil" "math" "net/http" "net/http/httptest" @@ -2129,7 +2128,7 @@ func TestTargetScrapeScrapeCancel(t *testing.T) { }() go func() { - _, err := ts.scrape(ctx, ioutil.Discard) + _, err := ts.scrape(ctx, io.Discard) if err == nil { errc <- errors.New("Expected error but got nil") } else if ctx.Err() != context.Canceled { @@ -2173,7 +2172,7 @@ func TestTargetScrapeScrapeNotFound(t *testing.T) { client: http.DefaultClient, } - _, err = ts.scrape(context.Background(), ioutil.Discard) + _, err = ts.scrape(context.Background(), io.Discard) require.Contains(t, err.Error(), "404", "Expected \"404 NotFound\" error but got: %s", err) } diff --git a/scrape/target_test.go b/scrape/target_test.go index 0e02dd8f971..f7733a59863 100644 --- a/scrape/target_test.go +++ b/scrape/target_test.go @@ -17,10 +17,10 @@ import ( "crypto/tls" "crypto/x509" "fmt" - "io/ioutil" "net/http" "net/http/httptest" "net/url" + "os" "strings" "testing" "time" @@ -337,7 +337,7 @@ func TestNewHTTPWithBadServerName(t *testing.T) { func newTLSConfig(certName string, t *testing.T) *tls.Config { tlsConfig := &tls.Config{} caCertPool := x509.NewCertPool() - caCert, err := ioutil.ReadFile(caCertPath) + caCert, err := os.ReadFile(caCertPath) if err != nil { t.Fatalf("Couldn't set up TLS server: %v", err) } diff --git a/scripts/errcheck_excludes.txt b/scripts/errcheck_excludes.txt index 92974d7a5f0..8c77ca148d0 100644 --- a/scripts/errcheck_excludes.txt +++ b/scripts/errcheck_excludes.txt @@ -1,4 +1,4 @@ -// Don't flag lines such as "io.Copy(ioutil.Discard, resp.Body)". +// Don't flag lines such as "io.Copy(io.Discard, resp.Body)". io.Copy // The next two are used in HTTP handlers, any error is handled by the server itself. io.WriteString diff --git a/storage/remote/client.go b/storage/remote/client.go index 622d5e91a6c..7120822d95a 100644 --- a/storage/remote/client.go +++ b/storage/remote/client.go @@ -19,7 +19,6 @@ import ( "context" "fmt" "io" - "io/ioutil" "net/http" "strconv" "strings" @@ -213,7 +212,7 @@ func (c *Client) Store(ctx context.Context, req []byte) error { return RecoverableError{err, defaultBackoff} } defer func() { - io.Copy(ioutil.Discard, httpResp.Body) + io.Copy(io.Discard, httpResp.Body) httpResp.Body.Close() }() @@ -300,13 +299,13 @@ func (c *Client) Read(ctx context.Context, query *prompb.Query) (*prompb.QueryRe return nil, errors.Wrap(err, "error sending request") } defer func() { - io.Copy(ioutil.Discard, httpResp.Body) + io.Copy(io.Discard, httpResp.Body) httpResp.Body.Close() }() c.readQueriesDuration.Observe(time.Since(start).Seconds()) c.readQueriesTotal.WithLabelValues(strconv.Itoa(httpResp.StatusCode)).Inc() - compressed, err = ioutil.ReadAll(httpResp.Body) + compressed, err = io.ReadAll(httpResp.Body) if err != nil { return nil, errors.Wrap(err, fmt.Sprintf("error reading response. HTTP status code: %s", httpResp.Status)) } diff --git a/storage/remote/codec.go b/storage/remote/codec.go index fb4d777a349..f56fc6760f0 100644 --- a/storage/remote/codec.go +++ b/storage/remote/codec.go @@ -16,7 +16,6 @@ package remote import ( "fmt" "io" - "io/ioutil" "net/http" "sort" "strings" @@ -52,7 +51,7 @@ func (e HTTPError) Status() int { // DecodeReadRequest reads a remote.Request from a http.Request. func DecodeReadRequest(r *http.Request) (*prompb.ReadRequest, error) { - compressed, err := ioutil.ReadAll(io.LimitReader(r.Body, decodeReadLimit)) + compressed, err := io.ReadAll(io.LimitReader(r.Body, decodeReadLimit)) if err != nil { return nil, err } @@ -524,7 +523,7 @@ func metricTypeToMetricTypeProto(t textparse.MetricType) prompb.MetricMetadata_M // DecodeWriteRequest from an io.Reader into a prompb.WriteRequest, handling // snappy decompression. func DecodeWriteRequest(r io.Reader) (*prompb.WriteRequest, error) { - compressed, err := ioutil.ReadAll(r) + compressed, err := io.ReadAll(r) if err != nil { return nil, err } diff --git a/storage/remote/queue_manager_test.go b/storage/remote/queue_manager_test.go index ff3f1aaf201..cb5cee9a444 100644 --- a/storage/remote/queue_manager_test.go +++ b/storage/remote/queue_manager_test.go @@ -16,7 +16,6 @@ package remote import ( "context" "fmt" - "io/ioutil" "math" "net/url" "os" @@ -824,7 +823,7 @@ func BenchmarkStartup(b *testing.B) { // Find the second largest segment; we will replay up to this. // (Second largest as WALWatcher will start tailing the largest). - dirents, err := ioutil.ReadDir(dir) + dirents, err := os.ReadDir(dir) require.NoError(b, err) var segments []int diff --git a/storage/remote/read_handler_test.go b/storage/remote/read_handler_test.go index 86edbe0b978..550ac6f6b24 100644 --- a/storage/remote/read_handler_test.go +++ b/storage/remote/read_handler_test.go @@ -16,7 +16,6 @@ package remote import ( "bytes" "io" - "io/ioutil" "net/http" "net/http/httptest" "testing" @@ -84,7 +83,7 @@ func TestSampledReadEndpoint(t *testing.T) { require.Equal(t, "snappy", recorder.Result().Header.Get("Content-Encoding")) // Decode the response. - compressed, err = ioutil.ReadAll(recorder.Result().Body) + compressed, err = io.ReadAll(recorder.Result().Body) require.NoError(t, err) uncompressed, err := snappy.Decode(nil, compressed) diff --git a/storage/remote/write_handler_test.go b/storage/remote/write_handler_test.go index 5eb17d3b878..459910992fd 100644 --- a/storage/remote/write_handler_test.go +++ b/storage/remote/write_handler_test.go @@ -17,7 +17,7 @@ import ( "bytes" "context" "fmt" - "io/ioutil" + "io" "net/http" "net/http/httptest" "testing" @@ -128,7 +128,7 @@ func TestCommitErr(t *testing.T) { handler.ServeHTTP(recorder, req) resp := recorder.Result() - body, err := ioutil.ReadAll(resp.Body) + body, err := io.ReadAll(resp.Body) require.NoError(t, err) require.Equal(t, http.StatusInternalServerError, resp.StatusCode) require.Equal(t, "commit error\n", string(body)) diff --git a/tsdb/block.go b/tsdb/block.go index e4db21f85e7..38ed0635365 100644 --- a/tsdb/block.go +++ b/tsdb/block.go @@ -17,7 +17,6 @@ package tsdb import ( "encoding/json" "io" - "io/ioutil" "os" "path/filepath" "sort" @@ -201,7 +200,7 @@ const ( func chunkDir(dir string) string { return filepath.Join(dir, "chunks") } func readMetaFile(dir string) (*BlockMeta, int64, error) { - b, err := ioutil.ReadFile(filepath.Join(dir, metaFilename)) + b, err := os.ReadFile(filepath.Join(dir, metaFilename)) if err != nil { return nil, 0, err } @@ -636,7 +635,7 @@ func (pb *Block) Snapshot(dir string) error { // Hardlink the chunks curChunkDir := chunkDir(pb.dir) - files, err := ioutil.ReadDir(curChunkDir) + files, err := os.ReadDir(curChunkDir) if err != nil { return errors.Wrap(err, "ReadDir the current chunk dir") } diff --git a/tsdb/blockwriter.go b/tsdb/blockwriter.go index 064cd01c7e2..09b355368db 100644 --- a/tsdb/blockwriter.go +++ b/tsdb/blockwriter.go @@ -15,7 +15,6 @@ package tsdb import ( "context" - "io/ioutil" "math" "os" @@ -64,7 +63,7 @@ func NewBlockWriter(logger log.Logger, dir string, blockSize int64) (*BlockWrite // initHead creates and initialises a new TSDB head. func (w *BlockWriter) initHead() error { - chunkDir, err := ioutil.TempDir(os.TempDir(), "head") + chunkDir, err := os.MkdirTemp(os.TempDir(), "head") if err != nil { return errors.Wrap(err, "create temp dir") } diff --git a/tsdb/chunks/chunks.go b/tsdb/chunks/chunks.go index 2f565fcb17b..4f8f405876b 100644 --- a/tsdb/chunks/chunks.go +++ b/tsdb/chunks/chunks.go @@ -21,7 +21,6 @@ import ( "hash" "hash/crc32" "io" - "io/ioutil" "os" "path/filepath" "strconv" @@ -591,7 +590,7 @@ func (s *Reader) Chunk(ref ChunkRef) (chunkenc.Chunk, error) { } func nextSequenceFile(dir string) (string, int, error) { - files, err := ioutil.ReadDir(dir) + files, err := os.ReadDir(dir) if err != nil { return "", 0, err } @@ -617,7 +616,7 @@ func segmentFile(baseDir string, index int) string { } func sequenceFiles(dir string) ([]string, error) { - files, err := ioutil.ReadDir(dir) + files, err := os.ReadDir(dir) if err != nil { return nil, err } diff --git a/tsdb/chunks/head_chunks.go b/tsdb/chunks/head_chunks.go index 307ecfc96d3..c4b784bea42 100644 --- a/tsdb/chunks/head_chunks.go +++ b/tsdb/chunks/head_chunks.go @@ -19,7 +19,6 @@ import ( "encoding/binary" "hash" "io" - "io/ioutil" "os" "path/filepath" "sort" @@ -330,7 +329,7 @@ func (cdm *ChunkDiskMapper) openMMapFiles() (returnErr error) { } func listChunkFiles(dir string) (map[int]string, error) { - files, err := ioutil.ReadDir(dir) + files, err := os.ReadDir(dir) if err != nil { return nil, err } diff --git a/tsdb/chunks/head_chunks_test.go b/tsdb/chunks/head_chunks_test.go index 57c9c340174..cc4fc2c09ff 100644 --- a/tsdb/chunks/head_chunks_test.go +++ b/tsdb/chunks/head_chunks_test.go @@ -16,7 +16,6 @@ package chunks import ( "encoding/binary" "errors" - "io/ioutil" "math/rand" "os" "strconv" @@ -124,7 +123,7 @@ func TestChunkDiskMapper_WriteChunk_Chunk_IterateChunks(t *testing.T) { require.Equal(t, 3, len(hrw.mmappedChunkFiles), "expected 3 mmapped files, got %d", len(hrw.mmappedChunkFiles)) require.Equal(t, len(hrw.mmappedChunkFiles), len(hrw.closers)) - actualBytes, err := ioutil.ReadFile(firstFileName) + actualBytes, err := os.ReadFile(firstFileName) require.NoError(t, err) // Check header of the segment file. @@ -202,7 +201,7 @@ func TestChunkDiskMapper_Truncate(t *testing.T) { verifyFiles := func(remainingFiles []int) { t.Helper() - files, err := ioutil.ReadDir(hrw.dir.Name()) + files, err := os.ReadDir(hrw.dir.Name()) require.NoError(t, err) require.Equal(t, len(remainingFiles), len(files), "files on disk") require.Equal(t, len(remainingFiles), len(hrw.mmappedChunkFiles), "hrw.mmappedChunkFiles") @@ -320,7 +319,7 @@ func TestChunkDiskMapper_Truncate_PreservesFileSequence(t *testing.T) { verifyFiles := func(remainingFiles []int) { t.Helper() - files, err := ioutil.ReadDir(hrw.dir.Name()) + files, err := os.ReadDir(hrw.dir.Name()) require.NoError(t, err) require.Equal(t, len(remainingFiles), len(files), "files on disk") require.Equal(t, len(remainingFiles), len(hrw.mmappedChunkFiles), "hrw.mmappedChunkFiles") @@ -454,7 +453,7 @@ func TestHeadReadWriter_ReadRepairOnEmptyLastFile(t *testing.T) { } // Removed even from disk. - files, err := ioutil.ReadDir(dir) + files, err := os.ReadDir(dir) require.NoError(t, err) require.Equal(t, 3, len(files)) for _, fi := range files { diff --git a/tsdb/db.go b/tsdb/db.go index d65c0246bf1..ab0822d73be 100644 --- a/tsdb/db.go +++ b/tsdb/db.go @@ -18,7 +18,7 @@ import ( "context" "fmt" "io" - "io/ioutil" + "io/fs" "math" "os" "path/filepath" @@ -761,20 +761,20 @@ func open(dir string, l log.Logger, r prometheus.Registerer, opts *Options, rngs } func removeBestEffortTmpDirs(l log.Logger, dir string) error { - files, err := ioutil.ReadDir(dir) + files, err := os.ReadDir(dir) if os.IsNotExist(err) { return nil } if err != nil { return err } - for _, fi := range files { - if isTmpDir(fi) { - if err := os.RemoveAll(filepath.Join(dir, fi.Name())); err != nil { - level.Error(l).Log("msg", "failed to delete tmp block dir", "dir", filepath.Join(dir, fi.Name()), "err", err) + for _, f := range files { + if isTmpDir(f) { + if err := os.RemoveAll(filepath.Join(dir, f.Name())); err != nil { + level.Error(l).Log("msg", "failed to delete tmp block dir", "dir", filepath.Join(dir, f.Name()), "err", err) continue } - level.Info(l).Log("msg", "Found and deleted tmp block dir", "dir", filepath.Join(dir, fi.Name())) + level.Info(l).Log("msg", "Found and deleted tmp block dir", "dir", filepath.Join(dir, f.Name())) } } return nil @@ -1717,7 +1717,7 @@ func (db *DB) CleanTombstones() (err error) { return nil } -func isBlockDir(fi os.FileInfo) bool { +func isBlockDir(fi fs.DirEntry) bool { if !fi.IsDir() { return false } @@ -1726,7 +1726,7 @@ func isBlockDir(fi os.FileInfo) bool { } // isTmpDir returns true if the given file-info contains a block ULID or checkpoint prefix and a tmp extension. -func isTmpDir(fi os.FileInfo) bool { +func isTmpDir(fi fs.DirEntry) bool { if !fi.IsDir() { return false } @@ -1745,22 +1745,22 @@ func isTmpDir(fi os.FileInfo) bool { } func blockDirs(dir string) ([]string, error) { - files, err := ioutil.ReadDir(dir) + files, err := os.ReadDir(dir) if err != nil { return nil, err } var dirs []string - for _, fi := range files { - if isBlockDir(fi) { - dirs = append(dirs, filepath.Join(dir, fi.Name())) + for _, f := range files { + if isBlockDir(f) { + dirs = append(dirs, filepath.Join(dir, f.Name())) } } return dirs, nil } func sequenceFiles(dir string) ([]string, error) { - files, err := ioutil.ReadDir(dir) + files, err := os.ReadDir(dir) if err != nil { return nil, err } @@ -1776,7 +1776,7 @@ func sequenceFiles(dir string) ([]string, error) { } func nextSequenceFile(dir string) (string, int, error) { - files, err := ioutil.ReadDir(dir) + files, err := os.ReadDir(dir) if err != nil { return "", 0, err } diff --git a/tsdb/db_test.go b/tsdb/db_test.go index ea3ae4d6780..655cf9dacdb 100644 --- a/tsdb/db_test.go +++ b/tsdb/db_test.go @@ -20,7 +20,6 @@ import ( "flag" "fmt" "hash/crc32" - "io/ioutil" "math" "math/rand" "os" @@ -225,7 +224,7 @@ func TestNoPanicAfterWALCorruption(t *testing.T) { // it is not garbage collected. // The repair deletes all WAL records after the corrupted record and these are read from the mmaped chunk. { - walFiles, err := ioutil.ReadDir(path.Join(db.Dir(), "wal")) + walFiles, err := os.ReadDir(path.Join(db.Dir(), "wal")) require.NoError(t, err) f, err := os.OpenFile(path.Join(db.Dir(), "wal", walFiles[0].Name()), os.O_RDWR, 0o666) require.NoError(t, err) @@ -926,12 +925,14 @@ func TestWALSegmentSizeOptions(t *testing.T) { tests := map[int]func(dbdir string, segmentSize int){ // Default Wal Size. 0: func(dbDir string, segmentSize int) { - filesAndDir, err := ioutil.ReadDir(filepath.Join(dbDir, "wal")) + filesAndDir, err := os.ReadDir(filepath.Join(dbDir, "wal")) require.NoError(t, err) files := []os.FileInfo{} for _, f := range filesAndDir { if !f.IsDir() { - files = append(files, f) + fi, err := f.Info() + require.NoError(t, err) + files = append(files, fi) } } // All the full segment files (all but the last) should match the segment size option. @@ -943,12 +944,14 @@ func TestWALSegmentSizeOptions(t *testing.T) { }, // Custom Wal Size. 2 * 32 * 1024: func(dbDir string, segmentSize int) { - filesAndDir, err := ioutil.ReadDir(filepath.Join(dbDir, "wal")) + filesAndDir, err := os.ReadDir(filepath.Join(dbDir, "wal")) require.NoError(t, err) files := []os.FileInfo{} for _, f := range filesAndDir { if !f.IsDir() { - files = append(files, f) + fi, err := f.Info() + require.NoError(t, err) + files = append(files, fi) } } require.Greater(t, len(files), 1, "current WALSegmentSize should result in more than a single WAL file.") @@ -2706,7 +2709,7 @@ func TestChunkWriter_ReadAfterWrite(t *testing.T) { } require.NoError(t, chunkw.Close()) - files, err := ioutil.ReadDir(tempDir) + files, err := os.ReadDir(tempDir) require.NoError(t, err) require.Equal(t, test.expSegmentsCount, len(files), "expected segments count mismatch") @@ -2726,7 +2729,9 @@ func TestChunkWriter_ReadAfterWrite(t *testing.T) { sizeExp += test.expSegmentsCount * chunks.SegmentHeaderSize // The segment header bytes. for i, f := range files { - size := int(f.Size()) + fi, err := f.Info() + require.NoError(t, err) + size := int(fi.Size()) // Verify that the segment is the same or smaller than the expected size. require.GreaterOrEqual(t, chunks.SegmentHeaderSize+test.expSegmentSizes[i], size, "Segment:%v should NOT be bigger than:%v actual:%v", i, chunks.SegmentHeaderSize+test.expSegmentSizes[i], size) @@ -2877,7 +2882,7 @@ func TestCompactHead(t *testing.T) { } func deleteNonBlocks(dbDir string) error { - dirs, err := ioutil.ReadDir(dbDir) + dirs, err := os.ReadDir(dbDir) if err != nil { return err } @@ -2888,7 +2893,7 @@ func deleteNonBlocks(dbDir string) error { } } } - dirs, err = ioutil.ReadDir(dbDir) + dirs, err = os.ReadDir(dbDir) if err != nil { return err } @@ -2995,7 +3000,7 @@ func TestOpen_VariousBlockStates(t *testing.T) { require.Equal(t, len(expectedLoadedDirs), loaded) require.NoError(t, db.Close()) - files, err := ioutil.ReadDir(tmpDir) + files, err := os.ReadDir(tmpDir) require.NoError(t, err) var ignored int diff --git a/tsdb/example_test.go b/tsdb/example_test.go index 1947a48a55f..edb0e3c3920 100644 --- a/tsdb/example_test.go +++ b/tsdb/example_test.go @@ -16,7 +16,6 @@ package tsdb import ( "context" "fmt" - "io/ioutil" "math" "os" "time" @@ -27,7 +26,7 @@ import ( func Example() { // Create a random dir to work in. Open() doesn't require a pre-existing dir, but // we want to make sure not to make a mess where we shouldn't. - dir, err := ioutil.TempDir("", "tsdb-test") + dir, err := os.MkdirTemp("", "tsdb-test") noErr(err) // Open a TSDB for reading and/or writing. diff --git a/tsdb/fileutil/fileutil.go b/tsdb/fileutil/fileutil.go index 8ab8ce3dd1c..5e479f48b97 100644 --- a/tsdb/fileutil/fileutil.go +++ b/tsdb/fileutil/fileutil.go @@ -18,7 +18,6 @@ package fileutil import ( - "io/ioutil" "os" "path/filepath" "strings" @@ -60,12 +59,12 @@ func CopyDirs(src, dest string) error { } func copyFile(src, dest string) error { - data, err := ioutil.ReadFile(src) + data, err := os.ReadFile(src) if err != nil { return err } - err = ioutil.WriteFile(dest, data, 0o666) + err = os.WriteFile(dest, data, 0o666) if err != nil { return err } diff --git a/tsdb/head_test.go b/tsdb/head_test.go index 7cd072a192b..7a2c4399941 100644 --- a/tsdb/head_test.go +++ b/tsdb/head_test.go @@ -17,7 +17,6 @@ import ( "context" "fmt" "io" - "io/ioutil" "math" "math/rand" "os" @@ -1679,7 +1678,7 @@ func TestHeadReadWriterRepair(t *testing.T) { // Verify that there are 6 segment files. // It should only be 6 because the last call to .CutNewFile() won't // take effect without another chunk being written. - files, err := ioutil.ReadDir(mmappedChunksDir(dir)) + files, err := os.ReadDir(mmappedChunksDir(dir)) require.NoError(t, err) require.Equal(t, 6, len(files)) @@ -1705,7 +1704,7 @@ func TestHeadReadWriterRepair(t *testing.T) { // Verify that there are 3 segment files after the repair. // The segments from the corrupt segment should be removed. { - files, err := ioutil.ReadDir(mmappedChunksDir(dir)) + files, err := os.ReadDir(mmappedChunksDir(dir)) require.NoError(t, err) require.Equal(t, 3, len(files)) } @@ -2965,7 +2964,7 @@ func TestChunkSnapshot(t *testing.T) { closeHeadAndCheckSnapshot() // Verify that there is only 1 snapshot. - files, err := ioutil.ReadDir(head.opts.ChunkDirRoot) + files, err := os.ReadDir(head.opts.ChunkDirRoot) require.NoError(t, err) snapshots := 0 for i := len(files) - 1; i >= 0; i-- { @@ -3028,7 +3027,7 @@ func TestSnapshotError(t *testing.T) { // Corrupt the snapshot. snapDir, _, _, err := LastChunkSnapshot(head.opts.ChunkDirRoot) require.NoError(t, err) - files, err := ioutil.ReadDir(snapDir) + files, err := os.ReadDir(snapDir) require.NoError(t, err) f, err := os.OpenFile(path.Join(snapDir, files[0].Name()), os.O_RDWR, 0) require.NoError(t, err) @@ -3093,7 +3092,7 @@ func TestChunkSnapshotReplayBug(t *testing.T) { cpdir := filepath.Join(dir, snapshotName) require.NoError(t, os.MkdirAll(cpdir, 0o777)) - err = ioutil.WriteFile(filepath.Join(cpdir, "00000000"), []byte{1, 5, 3, 5, 6, 7, 4, 2, 2}, 0o777) + err = os.WriteFile(filepath.Join(cpdir, "00000000"), []byte{1, 5, 3, 5, 6, 7, 4, 2, 2}, 0o777) require.NoError(t, err) opts := DefaultHeadOptions() @@ -3264,7 +3263,7 @@ func TestReplayAfterMmapReplayError(t *testing.T) { } } - files, err := ioutil.ReadDir(filepath.Join(dir, "chunks_head")) + files, err := os.ReadDir(filepath.Join(dir, "chunks_head")) require.Equal(t, 5, len(files)) // Corrupt a m-map file. @@ -3278,7 +3277,7 @@ func TestReplayAfterMmapReplayError(t *testing.T) { openHead() // There should be less m-map files due to corruption. - files, err = ioutil.ReadDir(filepath.Join(dir, "chunks_head")) + files, err = os.ReadDir(filepath.Join(dir, "chunks_head")) require.Equal(t, 2, len(files)) // Querying should not panic. diff --git a/tsdb/head_wal.go b/tsdb/head_wal.go index 02f4aeadb0e..6f2fd6eaa4e 100644 --- a/tsdb/head_wal.go +++ b/tsdb/head_wal.go @@ -15,7 +15,6 @@ package tsdb import ( "fmt" - "io/ioutil" "math" "os" "path/filepath" @@ -760,7 +759,7 @@ type ChunkSnapshotStats struct { // LastChunkSnapshot returns the directory name and index of the most recent chunk snapshot. // If dir does not contain any chunk snapshots, ErrNotFound is returned. func LastChunkSnapshot(dir string) (string, int, int, error) { - files, err := ioutil.ReadDir(dir) + files, err := os.ReadDir(dir) if err != nil { return "", 0, 0, err } @@ -805,7 +804,7 @@ func LastChunkSnapshot(dir string) (string, int, int, error) { // DeleteChunkSnapshots deletes all chunk snapshots in a directory below a given index. func DeleteChunkSnapshots(dir string, maxIndex, maxOffset int) error { - files, err := ioutil.ReadDir(dir) + files, err := os.ReadDir(dir) if err != nil { return err } diff --git a/tsdb/index/index.go b/tsdb/index/index.go index 0d2981385d1..fc1faf5eefd 100644 --- a/tsdb/index/index.go +++ b/tsdb/index/index.go @@ -22,7 +22,6 @@ import ( "hash" "hash/crc32" "io" - "io/ioutil" "math" "os" "path/filepath" @@ -1109,7 +1108,7 @@ func (b realByteSlice) Sub(start, end int) ByteSlice { // NewReader returns a new index reader on the given byte slice. It automatically // handles different format versions. func NewReader(b ByteSlice) (*Reader, error) { - return newReader(b, ioutil.NopCloser(nil)) + return newReader(b, io.NopCloser(nil)) } // NewFileReader returns a new index reader against the given index file. diff --git a/tsdb/index/index_test.go b/tsdb/index/index_test.go index 811d859bfd2..7d0f49010c9 100644 --- a/tsdb/index/index_test.go +++ b/tsdb/index/index_test.go @@ -17,7 +17,6 @@ import ( "context" "fmt" "hash/crc32" - "io/ioutil" "math/rand" "os" "path/filepath" @@ -488,7 +487,7 @@ func TestNewFileReaderErrorNoOpenFiles(t *testing.T) { dir := testutil.NewTemporaryDirectory("block", t) idxName := filepath.Join(dir.Path(), "index") - err := ioutil.WriteFile(idxName, []byte("corrupted contents"), 0o666) + err := os.WriteFile(idxName, []byte("corrupted contents"), 0o666) require.NoError(t, err) _, err = NewFileReader(idxName) diff --git a/tsdb/repair.go b/tsdb/repair.go index 8d60cb38177..0c2e08791c4 100644 --- a/tsdb/repair.go +++ b/tsdb/repair.go @@ -16,7 +16,6 @@ package tsdb import ( "encoding/json" "io" - "io/ioutil" "os" "path/filepath" @@ -115,7 +114,7 @@ func repairBadIndexVersion(logger log.Logger, dir string) error { } func readBogusMetaFile(dir string) (*BlockMeta, error) { - b, err := ioutil.ReadFile(filepath.Join(dir, metaFilename)) + b, err := os.ReadFile(filepath.Join(dir, metaFilename)) if err != nil { return nil, err } diff --git a/tsdb/tombstones/tombstones.go b/tsdb/tombstones/tombstones.go index 621e104714d..f7e2a2a1e70 100644 --- a/tsdb/tombstones/tombstones.go +++ b/tsdb/tombstones/tombstones.go @@ -18,7 +18,6 @@ import ( "fmt" "hash" "hash/crc32" - "io/ioutil" "os" "path/filepath" "sort" @@ -190,7 +189,7 @@ type Stone struct { } func ReadTombstones(dir string) (Reader, int64, error) { - b, err := ioutil.ReadFile(filepath.Join(dir, TombstonesFilename)) + b, err := os.ReadFile(filepath.Join(dir, TombstonesFilename)) if os.IsNotExist(err) { return NewMemTombstones(), 0, nil } else if err != nil { diff --git a/tsdb/tsdbutil/dir_locker_testutil.go b/tsdb/tsdbutil/dir_locker_testutil.go index cbb21e254fa..a4cf5abd68c 100644 --- a/tsdb/tsdbutil/dir_locker_testutil.go +++ b/tsdb/tsdbutil/dir_locker_testutil.go @@ -15,7 +15,6 @@ package tsdbutil import ( "fmt" - "io/ioutil" "os" "testing" @@ -61,7 +60,7 @@ func TestDirLockerUsage(t *testing.T, open func(t *testing.T, data string, creat for _, c := range cases { t.Run(fmt.Sprintf("%+v", c), func(t *testing.T) { - tmpdir, err := ioutil.TempDir("", "test") + tmpdir, err := os.MkdirTemp("", "test") require.NoError(t, err) t.Cleanup(func() { require.NoError(t, os.RemoveAll(tmpdir)) @@ -71,7 +70,7 @@ func TestDirLockerUsage(t *testing.T, open func(t *testing.T, data string, creat if c.fileAlreadyExists { tmpLocker, err := NewDirLocker(tmpdir, "tsdb", log.NewNopLogger(), nil) require.NoError(t, err) - err = ioutil.WriteFile(tmpLocker.path, []byte{}, 0o644) + err = os.WriteFile(tmpLocker.path, []byte{}, 0o644) require.NoError(t, err) } diff --git a/tsdb/wal/checkpoint.go b/tsdb/wal/checkpoint.go index 9064beed061..af4bd940c75 100644 --- a/tsdb/wal/checkpoint.go +++ b/tsdb/wal/checkpoint.go @@ -17,7 +17,6 @@ package wal import ( "fmt" "io" - "io/ioutil" "math" "os" "path/filepath" @@ -300,7 +299,7 @@ type checkpointRef struct { } func listCheckpoints(dir string) (refs []checkpointRef, err error) { - files, err := ioutil.ReadDir(dir) + files, err := os.ReadDir(dir) if err != nil { return nil, err } diff --git a/tsdb/wal/checkpoint_test.go b/tsdb/wal/checkpoint_test.go index 3f8ca25e0fc..63f3558afac 100644 --- a/tsdb/wal/checkpoint_test.go +++ b/tsdb/wal/checkpoint_test.go @@ -16,7 +16,6 @@ package wal import ( "fmt" - "io/ioutil" "os" "path/filepath" "strings" @@ -86,7 +85,7 @@ func TestDeleteCheckpoints(t *testing.T) { require.NoError(t, DeleteCheckpoints(dir, 2)) - files, err := ioutil.ReadDir(dir) + files, err := os.ReadDir(dir) require.NoError(t, err) fns := []string{} for _, f := range files { @@ -100,7 +99,7 @@ func TestDeleteCheckpoints(t *testing.T) { require.NoError(t, DeleteCheckpoints(dir, 100000000)) - files, err = ioutil.ReadDir(dir) + files, err = os.ReadDir(dir) require.NoError(t, err) fns = []string{} for _, f := range files { @@ -183,7 +182,7 @@ func TestCheckpoint(t *testing.T) { require.NoError(t, DeleteCheckpoints(w.Dir(), 106)) // Only the new checkpoint should be left. - files, err := ioutil.ReadDir(dir) + files, err := os.ReadDir(dir) require.NoError(t, err) require.Equal(t, 1, len(files)) require.Equal(t, "checkpoint.00000106", files[0].Name()) diff --git a/tsdb/wal/reader_test.go b/tsdb/wal/reader_test.go index a6516367d70..191e54636bd 100644 --- a/tsdb/wal/reader_test.go +++ b/tsdb/wal/reader_test.go @@ -20,7 +20,6 @@ import ( "fmt" "hash/crc32" "io" - "io/ioutil" "math/rand" "os" "path/filepath" @@ -203,7 +202,7 @@ func TestReader_Live(t *testing.T) { for i := range testReaderCases { t.Run(strconv.Itoa(i), func(t *testing.T) { - writeFd, err := ioutil.TempFile("", "TestReader_Live") + writeFd, err := os.CreateTemp("", "TestReader_Live") require.NoError(t, err) defer os.Remove(writeFd.Name()) diff --git a/tsdb/wal/wal.go b/tsdb/wal/wal.go index 3bc2894d322..ace6a99566f 100644 --- a/tsdb/wal/wal.go +++ b/tsdb/wal/wal.go @@ -20,7 +20,6 @@ import ( "fmt" "hash/crc32" "io" - "io/ioutil" "os" "path/filepath" "sort" @@ -802,7 +801,7 @@ type segmentRef struct { } func listSegments(dir string) (refs []segmentRef, err error) { - files, err := ioutil.ReadDir(dir) + files, err := os.ReadDir(dir) if err != nil { return nil, err } diff --git a/tsdb/wal/watcher.go b/tsdb/wal/watcher.go index cdd20626a8b..cde9cfa5ff0 100644 --- a/tsdb/wal/watcher.go +++ b/tsdb/wal/watcher.go @@ -16,7 +16,6 @@ package wal import ( "fmt" "io" - "io/ioutil" "math" "os" "path" @@ -305,7 +304,7 @@ func (w *Watcher) firstAndLast() (int, int, error) { // Copied from tsdb/wal/wal.go so we do not have to open a WAL. // Plan is to move WAL watcher to TSDB and dedupe these implementations. func (w *Watcher) segments(dir string) ([]int, error) { - files, err := ioutil.ReadDir(dir) + files, err := os.ReadDir(dir) if err != nil { return nil, err } diff --git a/tsdb/wal_test.go b/tsdb/wal_test.go index b4ab54d0c09..325e65a92d1 100644 --- a/tsdb/wal_test.go +++ b/tsdb/wal_test.go @@ -19,7 +19,6 @@ package tsdb import ( "encoding/binary" "io" - "io/ioutil" "math/rand" "os" "path" @@ -294,7 +293,7 @@ func TestWALRestoreCorrupted_invalidSegment(t *testing.T) { require.NoError(t, err) defer func(wal *SegmentWAL) { require.NoError(t, wal.Close()) }(wal) - files, err := ioutil.ReadDir(dir) + files, err := os.ReadDir(dir) require.NoError(t, err) fns := []string{} for _, f := range files { diff --git a/util/httputil/compression_test.go b/util/httputil/compression_test.go index f490f7e3019..85127976136 100644 --- a/util/httputil/compression_test.go +++ b/util/httputil/compression_test.go @@ -17,7 +17,7 @@ import ( "bytes" "compress/gzip" "compress/zlib" - "io/ioutil" + "io" "net/http" "net/http/httptest" "testing" @@ -64,7 +64,7 @@ func TestCompressionHandler_PlainText(t *testing.T) { resp, err := client.Get(server.URL + "/foo_endpoint") require.NoError(t, err, "client get failed with unexpected error") defer resp.Body.Close() - contents, err := ioutil.ReadAll(resp.Body) + contents, err := io.ReadAll(resp.Body) require.NoError(t, err, "unexpected error while creating the response body reader") expected := "Hello World!" diff --git a/util/logging/file_test.go b/util/logging/file_test.go index 537a2a713b2..0e760a4848a 100644 --- a/util/logging/file_test.go +++ b/util/logging/file_test.go @@ -14,7 +14,6 @@ package logging import ( - "io/ioutil" "os" "strings" "testing" @@ -24,7 +23,7 @@ import ( ) func TestJSONFileLogger_basic(t *testing.T) { - f, err := ioutil.TempFile("", "logging") + f, err := os.CreateTemp("", "logging") require.NoError(t, err) defer func() { require.NoError(t, f.Close()) @@ -53,7 +52,7 @@ func TestJSONFileLogger_basic(t *testing.T) { } func TestJSONFileLogger_parallel(t *testing.T) { - f, err := ioutil.TempFile("", "logging") + f, err := os.CreateTemp("", "logging") require.NoError(t, err) defer func() { require.NoError(t, f.Close()) diff --git a/util/teststorage/storage.go b/util/teststorage/storage.go index 9f9cb4ceb7c..ff9b33bbdd1 100644 --- a/util/teststorage/storage.go +++ b/util/teststorage/storage.go @@ -14,7 +14,6 @@ package teststorage import ( - "io/ioutil" "os" "time" @@ -31,7 +30,7 @@ import ( // New returns a new TestStorage for testing purposes // that removes all associated files on closing. func New(t testutil.T) *TestStorage { - dir, err := ioutil.TempDir("", "test_storage") + dir, err := os.MkdirTemp("", "test_storage") require.NoError(t, err, "unexpected error while opening test directory") // Tests just load data for a series sequentially. Thus we diff --git a/util/testutil/directory.go b/util/testutil/directory.go index 70cf0422731..71ed74ba552 100644 --- a/util/testutil/directory.go +++ b/util/testutil/directory.go @@ -16,7 +16,6 @@ package testutil import ( "crypto/sha256" "io" - "io/ioutil" "os" "path/filepath" "strconv" @@ -120,7 +119,7 @@ func NewTemporaryDirectory(name string, t T) (handler TemporaryDirectory) { err error ) - directory, err = ioutil.TempDir(defaultDirectory, name) + directory, err = os.MkdirTemp(defaultDirectory, name) require.NoError(t, err) handler = temporaryDirectory{ diff --git a/web/api/v1/api_test.go b/web/api/v1/api_test.go index 55155f8bcfb..1c999ba33c3 100644 --- a/web/api/v1/api_test.go +++ b/web/api/v1/api_test.go @@ -17,7 +17,7 @@ import ( "context" "encoding/json" "fmt" - "io/ioutil" + "io" "math" "net/http" "net/http/httptest" @@ -2288,7 +2288,7 @@ func (f *fakeDB) CleanTombstones() error { return func (f *fakeDB) Delete(mint, maxt int64, ms ...*labels.Matcher) error { return f.err } func (f *fakeDB) Snapshot(dir string, withHead bool) error { return f.err } func (f *fakeDB) Stats(statsByLabelName string) (_ *tsdb.Stats, retErr error) { - dbDir, err := ioutil.TempDir("", "tsdb-api-ready") + dbDir, err := os.MkdirTemp("", "tsdb-api-ready") if err != nil { return nil, err } @@ -2501,7 +2501,7 @@ func TestRespondSuccess(t *testing.T) { if err != nil { t.Fatalf("Error on test request: %s", err) } - body, err := ioutil.ReadAll(resp.Body) + body, err := io.ReadAll(resp.Body) defer resp.Body.Close() if err != nil { t.Fatalf("Error reading response body: %s", err) @@ -2537,7 +2537,7 @@ func TestRespondError(t *testing.T) { if err != nil { t.Fatalf("Error on test request: %s", err) } - body, err := ioutil.ReadAll(resp.Body) + body, err := io.ReadAll(resp.Body) defer resp.Body.Close() if err != nil { t.Fatalf("Error reading response body: %s", err) @@ -2893,7 +2893,7 @@ func TestRespond(t *testing.T) { if err != nil { t.Fatalf("Error on test request: %s", err) } - body, err := ioutil.ReadAll(resp.Body) + body, err := io.ReadAll(resp.Body) defer resp.Body.Close() if err != nil { t.Fatalf("Error reading response body: %s", err) diff --git a/web/web.go b/web/web.go index 0574549e5a9..132582872f1 100644 --- a/web/web.go +++ b/web/web.go @@ -19,7 +19,6 @@ import ( "encoding/json" "fmt" "io" - "io/ioutil" stdlog "log" "math" "net" @@ -386,7 +385,7 @@ func New(logger log.Logger, o *Options) *Handler { return } defer func() { _ = f.Close() }() - idx, err := ioutil.ReadAll(f) + idx, err := io.ReadAll(f) if err != nil { w.WriteHeader(http.StatusInternalServerError) fmt.Fprintf(w, "Error reading React index.html: %v", err) @@ -615,7 +614,7 @@ func (h *Handler) consoles(w http.ResponseWriter, r *http.Request) { return } defer file.Close() - text, err := ioutil.ReadAll(file) + text, err := io.ReadAll(file) if err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) return diff --git a/web/web_test.go b/web/web_test.go index d5683840d57..2ea21a9ecb3 100644 --- a/web/web_test.go +++ b/web/web_test.go @@ -18,7 +18,6 @@ import ( "encoding/json" "fmt" "io" - "io/ioutil" "net" "net/http" "net/http/httptest" @@ -578,7 +577,7 @@ func TestAgentAPIEndPoints(t *testing.T) { } func cleanupTestResponse(t *testing.T, resp *http.Response) { - _, err := io.Copy(ioutil.Discard, resp.Body) + _, err := io.Copy(io.Discard, resp.Body) require.NoError(t, err) require.NoError(t, resp.Body.Close()) } @@ -589,7 +588,7 @@ func cleanupSnapshot(t *testing.T, dbDir string, resp *http.Response) { Name string `json:"name"` } `json:"data"` }{} - b, err := ioutil.ReadAll(resp.Body) + b, err := io.ReadAll(resp.Body) require.NoError(t, err) require.NoError(t, json.Unmarshal(b, snapshot)) require.NotZero(t, snapshot.Data.Name, "snapshot directory not returned") From 74e5b596da3a76a71671a182e3f0d56c687f2bcc Mon Sep 17 00:00:00 2001 From: Ziqi Zhao Date: Wed, 27 Apr 2022 17:30:05 +0800 Subject: [PATCH 028/135] add stripDomain to template function (#10475) * add stripDomain to template function Signed-off-by: Ziqi Zhao --- docs/configuration/template_reference.md | 1 + template/template.go | 15 ++++++++++ template/template_test.go | 35 ++++++++++++++++++++++++ 3 files changed, 51 insertions(+) diff --git a/docs/configuration/template_reference.md b/docs/configuration/template_reference.md index 34557ecd837..5c96ee597b5 100644 --- a/docs/configuration/template_reference.md +++ b/docs/configuration/template_reference.md @@ -76,6 +76,7 @@ versions. | graphLink | expr | string | Returns path to graph view in the [expression browser](https://prometheus.io/docs/visualization/browser/) for the expression. | | tableLink | expr | string | Returns path to tabular ("Table") view in the [expression browser](https://prometheus.io/docs/visualization/browser/) for the expression. | | parseDuration | string | float | Parses a duration string such as "1h" into the number of seconds it represents. | +| stripDomain | string | string | Removes the domain part of a FQDN. Leaves port untouched. | ### Others diff --git a/template/template.go b/template/template.go index 69626399865..4058ad3ae5b 100644 --- a/template/template.go +++ b/template/template.go @@ -196,6 +196,21 @@ func NewTemplateExpander( } return host }, + "stripDomain": func(hostPort string) string { + host, port, err := net.SplitHostPort(hostPort) + if err != nil { + host = hostPort + } + ip := net.ParseIP(host) + if ip != nil { + return hostPort + } + host = strings.Split(host, ".")[0] + if port != "" { + return net.JoinHostPort(host, port) + } + return host + }, "humanize": func(i interface{}) (string, error) { v, err := convertToFloat(i) if err != nil { diff --git a/template/template_test.go b/template/template_test.go index 342a9511220..45d1a66e74f 100644 --- a/template/template_test.go +++ b/template/template_test.go @@ -480,6 +480,41 @@ func TestTemplateExpansion(t *testing.T) { text: "{{ printf \"%0.2f\" (parseDuration \"1h2m10ms\") }}", output: "3720.01", }, + { + // Simple hostname. + text: "{{ \"foo.example.com\" | stripDomain }}", + output: "foo", + }, + { + // Hostname with port. + text: "{{ \"foo.example.com:12345\" | stripDomain }}", + output: "foo:12345", + }, + { + // Simple IPv4 address. + text: "{{ \"192.0.2.1\" | stripDomain }}", + output: "192.0.2.1", + }, + { + // IPv4 address with port. + text: "{{ \"192.0.2.1:12345\" | stripDomain }}", + output: "192.0.2.1:12345", + }, + { + // Simple IPv6 address. + text: "{{ \"2001:0DB8::1\" | stripDomain }}", + output: "2001:0DB8::1", + }, + { + // IPv6 address with port. + text: "{{ \"[2001:0DB8::1]:12345\" | stripDomain }}", + output: "[2001:0DB8::1]:12345", + }, + { + // Value can't be split into host and port. + text: "{{ \"[2001:0DB8::1]::12345\" | stripDomain }}", + output: "[2001:0DB8::1]::12345", + }, }) } From 9558b9b54bd3d0cb1d63b9084f8cbcda6b0d72fb Mon Sep 17 00:00:00 2001 From: Ted Robertson <10043369+tredondo@users.noreply.github.com> Date: Wed, 27 Apr 2022 13:31:01 +0400 Subject: [PATCH 029/135] Examples: explain what the duration in brackets means (#10589) Signed-off-by: Ted Robertson <10043369+tredondo@users.noreply.github.com> --- docs/querying/examples.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/querying/examples.md b/docs/querying/examples.md index 28fa49fe946..a4fd373bf50 100644 --- a/docs/querying/examples.md +++ b/docs/querying/examples.md @@ -17,8 +17,8 @@ Return all time series with the metric `http_requests_total` and the given http_requests_total{job="apiserver", handler="/api/comments"} -Return a whole range of time (in this case 5 minutes) for the same vector, -making it a range vector: +Return a whole range of time (in this case 5 minutes up to the query time) +for the same vector, making it a [range vector](../basics/#range-vector-selectors): http_requests_total{job="apiserver", handler="/api/comments"}[5m] From 5d7b929e77c360f345bbfebfa0ba3cb22ef9c6a2 Mon Sep 17 00:00:00 2001 From: beorn7 Date: Wed, 27 Apr 2022 14:15:39 +0200 Subject: [PATCH 030/135] README.md: Update Godoc link Signed-off-by: beorn7 --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index a0dbef63750..9bc93bb7a93 100644 --- a/README.md +++ b/README.md @@ -159,7 +159,7 @@ For more information on building, running, and developing on the new React-based ## More information - * The source code is periodically indexed, but due to an issue with versioning, the "latest" docs shown on Godoc are outdated. Instead, you can use [the docs for v2.31.1](https://pkg.go.dev/github.com/prometheus/prometheus@v1.8.2-0.20211105201321-411021ada9ab). + * Godoc documentation is available via [pkg.go.dev](https://pkg.go.dev/github.com/prometheus/prometheus). Due to peculiarities of Go Modules, v2.x.y will be displayed as v0.x.y. * You will find a CircleCI configuration in [`.circleci/config.yml`](.circleci/config.yml). * See the [Community page](https://prometheus.io/community) for how to reach the Prometheus developers and users on various communication channels. From 01d90aef3c61cc5f499ffcd4d50cb04f431e6d69 Mon Sep 17 00:00:00 2001 From: beorn7 Date: Wed, 27 Apr 2022 14:18:12 +0200 Subject: [PATCH 031/135] README.md: Cease to call the React UI "new experimental" Signed-off-by: beorn7 --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 9bc93bb7a93..04bc3ef04b5 100644 --- a/README.md +++ b/README.md @@ -70,7 +70,7 @@ and `promtool` binaries into your `GOPATH`: read its web assets from local filesystem directories under `web/ui/static` and `web/ui/templates`. In order for these assets to be found, you will have to run Prometheus from the root of the cloned repository. Note also that these directories do not include the -new experimental React UI unless it has been built explicitly using `make assets` or `make build`. +React UI unless it has been built explicitly using `make assets` or `make build`. An example of the above configuration file can be found [here.](https://github.com/prometheus/prometheus/blob/main/documentation/examples/prometheus.yml) @@ -91,7 +91,7 @@ The Makefile provides several targets: * *test-short*: run the short tests * *format*: format the source code * *vet*: check the source code for common errors - * *assets*: build the new experimental React UI + * *assets*: build the React UI ### Service discovery plugins @@ -155,7 +155,7 @@ zero](https://semver.org/#spec-item-4). ## React UI Development -For more information on building, running, and developing on the new React-based UI, see the React app's [README.md](web/ui/README.md). +For more information on building, running, and developing on the React-based UI, see the React app's [README.md](web/ui/README.md). ## More information From 854d671b6bc5d3ae7960936103ff23863c8a3f91 Mon Sep 17 00:00:00 2001 From: Arunprasad Rajkumar Date: Fri, 29 Apr 2022 01:54:20 +0530 Subject: [PATCH 032/135] chore: remove unused file assets_generate.go (#10638) This file seem to be a remaining of https://github.com/prometheus/prometheus/pull/10220 Signed-off-by: Arunprasad Rajkumar --- web/ui/assets_generate.go | 39 --------------------------------------- 1 file changed, 39 deletions(-) delete mode 100644 web/ui/assets_generate.go diff --git a/web/ui/assets_generate.go b/web/ui/assets_generate.go deleted file mode 100644 index 47f1a43c0a5..00000000000 --- a/web/ui/assets_generate.go +++ /dev/null @@ -1,39 +0,0 @@ -// Copyright 2018 The Prometheus Authors -// 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. - -//go:build ignore -// +build ignore - -package main - -import ( - "log" - "time" - - "github.com/shurcooL/vfsgen" - - "github.com/prometheus/prometheus/util/modtimevfs" - "github.com/prometheus/prometheus/web/ui" -) - -func main() { - fs := modtimevfs.New(ui.Assets, time.Unix(1, 0)) - err := vfsgen.Generate(fs, vfsgen.Options{ - PackageName: "ui", - BuildTags: "builtinassets", - VariableName: "Assets", - }) - if err != nil { - log.Fatalln(err) - } -} From 453e8a61df0c1ae51ce6bd798b2afc7d45894c08 Mon Sep 17 00:00:00 2001 From: Julien Pivotto Date: Fri, 29 Apr 2022 16:21:11 +0200 Subject: [PATCH 033/135] Release Shepherd for 2.37 LTS (#10637) Signed-off-by: Julien Pivotto --- RELEASE.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/RELEASE.md b/RELEASE.md index 65da3c0c3a0..cfbf7d1684a 100644 --- a/RELEASE.md +++ b/RELEASE.md @@ -41,7 +41,9 @@ Release cadence of first pre-releases being cut is 6 weeks. | v2.34 | 2022-02-23 | Chris Marchbanks (GitHub: @csmarchbanks) | | v2.35 | 2022-04-06 | Augustin Husson (GitHub: @nexucis) | | v2.36 | 2022-05-18 | Matthias Loibl (GitHub: @metalmatze) | -| v2.37 | 2022-06-29 | **searching for volunteer** | +| v2.37 LTS | 2022-06-29 | Julien Pivotto (GitHub: @roidelapluie) | +| v2.38 | 2022-08-10 | **searching for volunteer** | +| v2.39 | 2022-09-21 | **searching for volunteer** | If you are interested in volunteering please create a pull request against the [prometheus/prometheus](https://github.com/prometheus/prometheus) repository and propose yourself for the release series of your choice. From b2e2751e23510b8b3b2b276e54bc584a8e8877cd Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 2 May 2022 11:05:23 +0200 Subject: [PATCH 034/135] build(deps): bump google.golang.org/api from 0.74.0 to 0.77.0 (#10647) Bumps [google.golang.org/api](https://github.com/googleapis/google-api-go-client) from 0.74.0 to 0.77.0. - [Release notes](https://github.com/googleapis/google-api-go-client/releases) - [Changelog](https://github.com/googleapis/google-api-go-client/blob/main/CHANGES.md) - [Commits](https://github.com/googleapis/google-api-go-client/compare/v0.74.0...v0.77.0) --- updated-dependencies: - dependency-name: google.golang.org/api dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 10 +++++----- go.sum | 26 ++++++++++++++++++-------- 2 files changed, 23 insertions(+), 13 deletions(-) diff --git a/go.mod b/go.mod index cf9e9dbb3d0..92970f6bc69 100644 --- a/go.mod +++ b/go.mod @@ -65,14 +65,14 @@ require ( go.uber.org/atomic v1.9.0 go.uber.org/automaxprocs v1.5.1 go.uber.org/goleak v1.1.12 - golang.org/x/net v0.0.0-20220325170049-de3da57026de - golang.org/x/oauth2 v0.0.0-20220309155454-6242fa91716a + golang.org/x/net v0.0.0-20220412020605-290c469a71a5 + golang.org/x/oauth2 v0.0.0-20220411215720-9780585627b5 golang.org/x/sync v0.0.0-20210220032951-036812b2e83c - golang.org/x/sys v0.0.0-20220328115105-d36c6a25d886 + golang.org/x/sys v0.0.0-20220412211240-33da011f77ad golang.org/x/time v0.0.0-20220224211638-0e9765cccd65 golang.org/x/tools v0.1.10 - google.golang.org/api v0.74.0 - google.golang.org/genproto v0.0.0-20220324131243-acbaeb5b85eb + google.golang.org/api v0.77.0 + google.golang.org/genproto v0.0.0-20220414192740-2d67ff6cf2b4 google.golang.org/grpc v1.45.0 google.golang.org/protobuf v1.28.0 gopkg.in/alecthomas/kingpin.v2 v2.2.6 diff --git a/go.sum b/go.sum index 54e138a5d5d..4d4f41cf763 100644 --- a/go.sum +++ b/go.sum @@ -37,8 +37,9 @@ cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4g cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= cloud.google.com/go/compute v0.1.0/go.mod h1:GAesmwr110a34z04OlxYkATPBEfVhkymfTBXtfbBFow= cloud.google.com/go/compute v1.3.0/go.mod h1:cCZiE1NHEtai4wiufUhW8I8S1JKkAnhnQJWM7YD99wM= -cloud.google.com/go/compute v1.5.0 h1:b1zWmYuuHz7gO9kDcM/EpHGr06UgsYNRpNJzI2kFiLM= cloud.google.com/go/compute v1.5.0/go.mod h1:9SMHyhJlzhlkJqrPAc839t2BZFTSk6Jdj6mkzQJeu0M= +cloud.google.com/go/compute v1.6.0 h1:XdQIN5mdPTSBVwSIVDuY5e8ZzVAccsHvD3qTEz4zIps= +cloud.google.com/go/compute v1.6.0/go.mod h1:T29tfhtVbq1wvAPo0E3+7vhgmkOYeXjhFvz/FMzPu0s= cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= cloud.google.com/go/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqClKRT5SZwBmk= @@ -658,8 +659,9 @@ github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+ github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= github.com/googleapis/gax-go/v2 v2.1.0/go.mod h1:Q3nei7sK6ybPYH7twZdmQpAd1MKb7pfu6SK+H1/DsU0= github.com/googleapis/gax-go/v2 v2.1.1/go.mod h1:hddJymUZASv3XPyGkUpKj8pPO47Rmb0eJc8R6ouapiM= -github.com/googleapis/gax-go/v2 v2.2.0 h1:s7jOdKSaksJVOxE0Y/S32otcfiP+UQ0cL8/GTKaONwE= github.com/googleapis/gax-go/v2 v2.2.0/go.mod h1:as02EH8zWkzwUoLbBaFeQ+arQaj/OthfcblKl4IGNaM= +github.com/googleapis/gax-go/v2 v2.3.0 h1:nRJtk3y8Fm770D42QV6T90ZnvFZyk7agSo3Q+Z9p3WI= +github.com/googleapis/gax-go/v2 v2.3.0/go.mod h1:b8LNqSzNabLiUpXKkY7HAR5jr6bIT99EXz9pXxye9YM= github.com/googleapis/gnostic v0.4.1/go.mod h1:LRhVm6pbyptWbWbuZ38d1eyptfvIytN3ir6b65WBswg= github.com/googleapis/gnostic v0.5.1/go.mod h1:6U4PtQXGIEt/Z3h5MAT7FNofLnw9vXk2cUuW7uA/OeU= github.com/googleapis/gnostic v0.5.5 h1:9fHAtK0uDfpveeqqo1hkEZJcFvYXAiCN3UutL8F9xHw= @@ -1441,8 +1443,9 @@ golang.org/x/net v0.0.0-20211209124913-491a49abca63/go.mod h1:9nx3DQGgdP8bBQD5qx golang.org/x/net v0.0.0-20211216030914-fe4d6282115f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -golang.org/x/net v0.0.0-20220325170049-de3da57026de h1:pZB1TWnKi+o4bENlbzAgLrEbY4RMYmUIRobMcSmfeYc= golang.org/x/net v0.0.0-20220325170049-de3da57026de/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220412020605-290c469a71a5 h1:bRb386wvrE+oBNdF1d/Xh9mQrfQ4ecYhW5qJ5GvTGT4= +golang.org/x/net v0.0.0-20220412020605-290c469a71a5/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -1460,8 +1463,9 @@ golang.org/x/oauth2 v0.0.0-20210805134026-6f1e6394065a/go.mod h1:KelEdhl1UZF7XfJ golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= -golang.org/x/oauth2 v0.0.0-20220309155454-6242fa91716a h1:qfl7ob3DIEs3Ml9oLuPwY2N04gymzAW04WsUQHIClgM= golang.org/x/oauth2 v0.0.0-20220309155454-6242fa91716a/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= +golang.org/x/oauth2 v0.0.0-20220411215720-9780585627b5 h1:OSnWWcOd/CtWQC2cYSBgbTSJv3ciqd8r54ySIW2y3RE= +golang.org/x/oauth2 v0.0.0-20220411215720-9780585627b5/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -1598,8 +1602,9 @@ golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220128215802-99c3d69c2c27/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220227234510-4e6760a101f9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220328115105-d36c6a25d886 h1:eJv7u3ksNXoLbGSKuv2s/SIO4tJVxc/A+MTpzxDgz/Q= golang.org/x/sys v0.0.0-20220328115105-d36c6a25d886/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220412211240-33da011f77ad h1:ntjMns5wyP/fN65tdBD4g8J5w8n015+iIIs9rtjXkY0= +golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210220032956-6a3ed077a48d/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= @@ -1706,8 +1711,9 @@ golang.org/x/tools v0.1.10/go.mod h1:Uh6Zz+xoGYZom868N8YTex3t7RhtHDBrE8Gzo9bV56E golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20220411194840-2f41105eb62f h1:GGU+dLjvlC3qDwqYgL6UgRmHXhOOgns0bZu2Ty5mm6U= +golang.org/x/xerrors v0.0.0-20220411194840-2f41105eb62f/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= google.golang.org/api v0.0.0-20160322025152-9bf6e6e569ff/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0= google.golang.org/api v0.3.1/go.mod h1:6wY9I6uQWHQ8EM57III9mq/AjF+i8G65rmVagqKMtkk= google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= @@ -1742,8 +1748,9 @@ google.golang.org/api v0.63.0/go.mod h1:gs4ij2ffTRXwuzzgJl/56BdwJaA194ijkfn++9tD google.golang.org/api v0.67.0/go.mod h1:ShHKP8E60yPsKNw/w8w+VYaj9H6buA5UqDp8dhbQZ6g= google.golang.org/api v0.70.0/go.mod h1:Bs4ZM2HGifEvXwd50TtW70ovgJffJYw2oRCOFU/SkfA= google.golang.org/api v0.71.0/go.mod h1:4PyU6e6JogV1f9eA4voyrTY2batOLdgZ5qZ5HOCc4j8= -google.golang.org/api v0.74.0 h1:ExR2D+5TYIrMphWgs5JCgwRhEDlPDXXrLwHHMgPHTXE= google.golang.org/api v0.74.0/go.mod h1:ZpfMZOVRMywNyvJFeqL9HRWBgAuRfSjJFpe9QtRRyDs= +google.golang.org/api v0.77.0 h1:msijLTxwkJ7Jub5tv9KBVCKtHOQwnvnvkX7ErFFCVxY= +google.golang.org/api v0.77.0/go.mod h1:pU9QmyHLnzlpar1Mjt4IbapUCy8J+6HD6GeELN69ljA= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.2.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= @@ -1825,8 +1832,11 @@ google.golang.org/genproto v0.0.0-20220218161850-94dd64e39d7c/go.mod h1:kGP+zUP2 google.golang.org/genproto v0.0.0-20220222213610-43724f9ea8cf/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= google.golang.org/genproto v0.0.0-20220304144024-325a89244dc8/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= google.golang.org/genproto v0.0.0-20220310185008-1973136f34c6/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= -google.golang.org/genproto v0.0.0-20220324131243-acbaeb5b85eb h1:0m9wktIpOxGw+SSKmydXWB3Z3GTfcPP6+q75HCQa6HI= google.golang.org/genproto v0.0.0-20220324131243-acbaeb5b85eb/go.mod h1:hAL49I2IFola2sVEjAn7MEwsja0xp51I0tlGAf9hz4E= +google.golang.org/genproto v0.0.0-20220407144326-9054f6ed7bac/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= +google.golang.org/genproto v0.0.0-20220413183235-5e96e2839df9/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= +google.golang.org/genproto v0.0.0-20220414192740-2d67ff6cf2b4 h1:myaecH64R0bIEDjNORIel4iXubqzaHU1K2z8ajBwWcM= +google.golang.org/genproto v0.0.0-20220414192740-2d67ff6cf2b4/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= google.golang.org/grpc v0.0.0-20160317175043-d3ddb4469d5a/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= From 621afdc804f0b2219c2a589c9b4e6515549915e1 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 2 May 2022 11:05:33 +0200 Subject: [PATCH 035/135] build(deps): bump bufbuild/buf-setup-action from 1.3.1 to 1.4.0 (#10646) Bumps [bufbuild/buf-setup-action](https://github.com/bufbuild/buf-setup-action) from 1.3.1 to 1.4.0. - [Release notes](https://github.com/bufbuild/buf-setup-action/releases) - [Commits](https://github.com/bufbuild/buf-setup-action/compare/v1.3.1...v1.4.0) --- updated-dependencies: - dependency-name: bufbuild/buf-setup-action dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/buf-lint.yml | 2 +- .github/workflows/buf.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/buf-lint.yml b/.github/workflows/buf-lint.yml index e86ea9efc8e..18c9b95e253 100644 --- a/.github/workflows/buf-lint.yml +++ b/.github/workflows/buf-lint.yml @@ -10,7 +10,7 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - - uses: bufbuild/buf-setup-action@v1.3.1 + - uses: bufbuild/buf-setup-action@v1.4.0 - uses: bufbuild/buf-lint-action@v1 with: input: 'prompb' diff --git a/.github/workflows/buf.yml b/.github/workflows/buf.yml index 00d33e070dc..445da66be89 100644 --- a/.github/workflows/buf.yml +++ b/.github/workflows/buf.yml @@ -9,7 +9,7 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - - uses: bufbuild/buf-setup-action@v1.3.1 + - uses: bufbuild/buf-setup-action@v1.4.0 - uses: bufbuild/buf-lint-action@v1 with: input: 'prompb' From d066b9c4c530033f77c20d00ed6816409fbf89a6 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 2 May 2022 11:06:43 +0200 Subject: [PATCH 036/135] build(deps): bump k8s.io/api from 0.23.5 to 0.23.6 (#10649) Bumps [k8s.io/api](https://github.com/kubernetes/api) from 0.23.5 to 0.23.6. - [Release notes](https://github.com/kubernetes/api/releases) - [Commits](https://github.com/kubernetes/api/compare/v0.23.5...v0.23.6) --- updated-dependencies: - dependency-name: k8s.io/api dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 4 ++-- go.sum | 6 ++++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/go.mod b/go.mod index 92970f6bc69..381a7016168 100644 --- a/go.mod +++ b/go.mod @@ -78,8 +78,8 @@ require ( gopkg.in/alecthomas/kingpin.v2 v2.2.6 gopkg.in/yaml.v2 v2.4.0 gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b - k8s.io/api v0.23.5 - k8s.io/apimachinery v0.23.5 + k8s.io/api v0.23.6 + k8s.io/apimachinery v0.23.6 k8s.io/client-go v0.23.5 k8s.io/klog v1.0.0 k8s.io/klog/v2 v2.40.1 diff --git a/go.sum b/go.sum index 4d4f41cf763..bb1d2ee3d6a 100644 --- a/go.sum +++ b/go.sum @@ -1950,15 +1950,17 @@ k8s.io/api v0.20.1/go.mod h1:KqwcCVogGxQY3nBlRpwt+wpAMF/KjaCc7RpywacvqUo= k8s.io/api v0.20.4/go.mod h1:++lNL1AJMkDymriNniQsWRkMDzRaX2Y/POTUi8yvqYQ= k8s.io/api v0.20.6/go.mod h1:X9e8Qag6JV/bL5G6bU8sdVRltWKmdHsFUGS3eVndqE8= k8s.io/api v0.22.5/go.mod h1:mEhXyLaSD1qTOf40rRiKXkc+2iCem09rWLlFwhCEiAs= -k8s.io/api v0.23.5 h1:zno3LUiMubxD/V1Zw3ijyKO3wxrhbUF1Ck+VjBvfaoA= k8s.io/api v0.23.5/go.mod h1:Na4XuKng8PXJ2JsploYYrivXrINeTaycCGcYgF91Xm8= +k8s.io/api v0.23.6 h1:yOK34wbYECH4RsJbQ9sfkFK3O7f/DUHRlzFehkqZyVw= +k8s.io/api v0.23.6/go.mod h1:1kFaYxGCFHYp3qd6a85DAj/yW8aVD6XLZMqJclkoi9g= k8s.io/apimachinery v0.20.1/go.mod h1:WlLqWAHZGg07AeltaI0MV5uk1Omp8xaN0JGLY6gkRpU= k8s.io/apimachinery v0.20.4/go.mod h1:WlLqWAHZGg07AeltaI0MV5uk1Omp8xaN0JGLY6gkRpU= k8s.io/apimachinery v0.20.6/go.mod h1:ejZXtW1Ra6V1O5H8xPBGz+T3+4gfkTCeExAHKU57MAc= k8s.io/apimachinery v0.22.1/go.mod h1:O3oNtNadZdeOMxHFVxOreoznohCpy0z6mocxbZr7oJ0= k8s.io/apimachinery v0.22.5/go.mod h1:xziclGKwuuJ2RM5/rSFQSYAj0zdbci3DH8kj+WvyN0U= -k8s.io/apimachinery v0.23.5 h1:Va7dwhp8wgkUPWsEXk6XglXWU4IKYLKNlv8VkX7SDM0= k8s.io/apimachinery v0.23.5/go.mod h1:BEuFMMBaIbcOqVIJqNZJXGFTP4W6AycEpb5+m/97hrM= +k8s.io/apimachinery v0.23.6 h1:RH1UweWJkWNTlFx0D8uxOpaU1tjIOvVVWV/bu5b3/NQ= +k8s.io/apimachinery v0.23.6/go.mod h1:BEuFMMBaIbcOqVIJqNZJXGFTP4W6AycEpb5+m/97hrM= k8s.io/apiserver v0.20.1/go.mod h1:ro5QHeQkgMS7ZGpvf4tSMx6bBOgPfE+f52KwvXfScaU= k8s.io/apiserver v0.20.4/go.mod h1:Mc80thBKOyy7tbvFtB4kJv1kbdD0eIH8k8vianJcbFM= k8s.io/apiserver v0.20.6/go.mod h1:QIJXNt6i6JB+0YQRNcS0hdRHJlMhflFmsBDeSgT1r8Q= From 51eb754e776a9da76b9757ce1bacc934bf9c1b2e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 2 May 2022 15:47:54 +0200 Subject: [PATCH 037/135] build(deps): bump github.com/linode/linodego from 1.4.0 to 1.4.1 (#10654) Bumps [github.com/linode/linodego](https://github.com/linode/linodego) from 1.4.0 to 1.4.1. - [Release notes](https://github.com/linode/linodego/releases) - [Commits](https://github.com/linode/linodego/compare/v1.4.0...v1.4.1) --- updated-dependencies: - dependency-name: github.com/linode/linodego dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 381a7016168..f94b937afb0 100644 --- a/go.mod +++ b/go.mod @@ -37,7 +37,7 @@ require ( github.com/hetznercloud/hcloud-go v1.33.1 github.com/json-iterator/go v1.1.12 github.com/kolo/xmlrpc v0.0.0-20201022064351-38db28db192b - github.com/linode/linodego v1.4.0 + github.com/linode/linodego v1.4.1 github.com/miekg/dns v1.1.48 github.com/moby/term v0.0.0-20210619224110-3f7ff695adc6 // indirect github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f diff --git a/go.sum b/go.sum index bb1d2ee3d6a..7e56ac6a10b 100644 --- a/go.sum +++ b/go.sum @@ -826,8 +826,8 @@ github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+ github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII= github.com/lightstep/lightstep-tracer-common/golang/gogo v0.0.0-20190605223551-bc2310a04743/go.mod h1:qklhhLq1aX+mtWk9cPHPzaBjWImj5ULL6C7HFJtXQMM= github.com/lightstep/lightstep-tracer-go v0.18.1/go.mod h1:jlF1pusYV4pidLvZ+XD0UBX0ZE6WURAspgAczcDHrL4= -github.com/linode/linodego v1.4.0 h1:jayhYLQOWxvr9fchCuB+OWTL+LP3OUPgdr/bc4YLdls= -github.com/linode/linodego v1.4.0/go.mod h1:PVsRxSlOiJyvG4/scTszpmZDTdgS+to3X6eS8pRrWI8= +github.com/linode/linodego v1.4.1 h1:cgpY1jCZ47wfJvWH5V8in7Tphj8T0sR1URiH9e6G2bA= +github.com/linode/linodego v1.4.1/go.mod h1:PVsRxSlOiJyvG4/scTszpmZDTdgS+to3X6eS8pRrWI8= github.com/linuxkit/virtsock v0.0.0-20201010232012-f8cee7dfc7a3/go.mod h1:3r6x7q95whyfWQpmGZTu3gk3v2YkMi05HEzl7Tf7YEo= github.com/lyft/protoc-gen-star v0.6.0/go.mod h1:TGAoBVkt8w7MPG72TrKIu85MIdXwDuzJYeZuUPFPNwA= github.com/lyft/protoc-gen-validate v0.0.13/go.mod h1:XbGvPuh87YZc5TdIa2/I4pLk0QoUACkjt2znoq26NVQ= From 0e938f89fdc5edbd7a8d54fbb0f80cf5e03cc392 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 2 May 2022 15:48:31 +0200 Subject: [PATCH 038/135] build(deps): bump go.opentelemetry.io/otel from 1.6.1 to 1.7.0 (#10653) Bumps [go.opentelemetry.io/otel](https://github.com/open-telemetry/opentelemetry-go) from 1.6.1 to 1.7.0. - [Release notes](https://github.com/open-telemetry/opentelemetry-go/releases) - [Changelog](https://github.com/open-telemetry/opentelemetry-go/blob/main/CHANGELOG.md) - [Commits](https://github.com/open-telemetry/opentelemetry-go/compare/v1.6.1...v1.7.0) --- updated-dependencies: - dependency-name: go.opentelemetry.io/otel dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 4 ++-- go.sum | 6 ++++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/go.mod b/go.mod index f94b937afb0..5d8f3df24fa 100644 --- a/go.mod +++ b/go.mod @@ -56,12 +56,12 @@ require ( github.com/shurcooL/httpfs v0.0.0-20190707220628-8d4bc4ba7749 github.com/stretchr/testify v1.7.1 go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.31.0 - go.opentelemetry.io/otel v1.6.1 + go.opentelemetry.io/otel v1.7.0 go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.6.1 go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.6.1 go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.6.1 go.opentelemetry.io/otel/sdk v1.6.1 - go.opentelemetry.io/otel/trace v1.6.1 + go.opentelemetry.io/otel/trace v1.7.0 go.uber.org/atomic v1.9.0 go.uber.org/automaxprocs v1.5.1 go.uber.org/goleak v1.1.12 diff --git a/go.sum b/go.sum index 7e56ac6a10b..3084c00b503 100644 --- a/go.sum +++ b/go.sum @@ -1257,8 +1257,9 @@ go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.31.0/go.mod h1: go.opentelemetry.io/otel v0.20.0/go.mod h1:Y3ugLH2oa81t5QO+Lty+zXf8zC9L26ax4Nzoxm/dooo= go.opentelemetry.io/otel v1.3.0/go.mod h1:PWIKzi6JCp7sM0k9yZ43VX+T345uNbAkDKwHVjb2PTs= go.opentelemetry.io/otel v1.6.0/go.mod h1:bfJD2DZVw0LBxghOTlgnlI0CV3hLDu9XF/QKOUXMTQQ= -go.opentelemetry.io/otel v1.6.1 h1:6r1YrcTenBvYa1x491d0GGpTVBsNECmrc/K6b+zDeis= go.opentelemetry.io/otel v1.6.1/go.mod h1:blzUabWHkX6LJewxvadmzafgh/wnvBSDBdOuwkAtrWQ= +go.opentelemetry.io/otel v1.7.0 h1:Z2lA3Tdch0iDcrhJXDIlC94XE+bxok1F9B+4Lz/lGsM= +go.opentelemetry.io/otel v1.7.0/go.mod h1:5BdUoMIz5WEs0vt0CUEMtSSaTSHBBVwrhnz7+nrD5xk= go.opentelemetry.io/otel/exporters/otlp v0.20.0 h1:PTNgq9MRmQqqJY0REVbZFvwkYOA85vbdQU/nVfxDyqg= go.opentelemetry.io/otel/exporters/otlp v0.20.0/go.mod h1:YIieizyaN77rtLJra0buKiNBOm9XQfkPEKBeuhoMwAM= go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.3.0/go.mod h1:VpP4/RMn8bv8gNo9uK7/IMY4mtWLELsS+JIP0inH0h4= @@ -1286,8 +1287,9 @@ go.opentelemetry.io/otel/sdk/metric v0.20.0/go.mod h1:knxiS8Xd4E/N+ZqKmUPf3gTTZ4 go.opentelemetry.io/otel/trace v0.20.0/go.mod h1:6GjCW8zgDjwGHGa6GkyeB8+/5vjT16gUEi0Nf1iBdgw= go.opentelemetry.io/otel/trace v1.3.0/go.mod h1:c/VDhno8888bvQYmbYLqe41/Ldmr/KKunbvWM4/fEjk= go.opentelemetry.io/otel/trace v1.6.0/go.mod h1:qs7BrU5cZ8dXQHBGxHMOxwME/27YH2qEp4/+tZLLwJE= -go.opentelemetry.io/otel/trace v1.6.1 h1:f8c93l5tboBYZna1nWk0W9DYyMzJXDWdZcJZ0Kb400U= go.opentelemetry.io/otel/trace v1.6.1/go.mod h1:RkFRM1m0puWIq10oxImnGEduNBzxiN7TXluRBtE+5j0= +go.opentelemetry.io/otel/trace v1.7.0 h1:O37Iogk1lEkMRXewVtZ1BBTVn5JEp8GrJvP92bJqC6o= +go.opentelemetry.io/otel/trace v1.7.0/go.mod h1:fzLSB9nqR2eXzxPXb2JW9IKE+ScyXA48yyE4TNvoHqU= go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= go.opentelemetry.io/proto/otlp v0.11.0/go.mod h1:QpEjXPrNQzrFDZgoTo49dgHR9RYRSrg3NAKnUGl9YpQ= go.opentelemetry.io/proto/otlp v0.12.1 h1:kfx2sboxOGFvGJcH2C408CiVo2wVHC2av2XHNqj4vEg= From 4e6374180d567dd3f0be9c5549c1cfebf67e8d77 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 2 May 2022 15:48:50 +0200 Subject: [PATCH 039/135] build(deps): bump google.golang.org/grpc from 1.45.0 to 1.46.0 (#10648) Bumps [google.golang.org/grpc](https://github.com/grpc/grpc-go) from 1.45.0 to 1.46.0. - [Release notes](https://github.com/grpc/grpc-go/releases) - [Commits](https://github.com/grpc/grpc-go/compare/v1.45.0...v1.46.0) --- updated-dependencies: - dependency-name: google.golang.org/grpc dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 4 ++-- go.sum | 7 ++++--- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/go.mod b/go.mod index 5d8f3df24fa..d0f12ed7a95 100644 --- a/go.mod +++ b/go.mod @@ -18,7 +18,7 @@ require ( github.com/digitalocean/godo v1.78.0 github.com/docker/docker v20.10.14+incompatible github.com/edsrzf/mmap-go v1.1.0 - github.com/envoyproxy/go-control-plane v0.10.1 + github.com/envoyproxy/go-control-plane v0.10.2-0.20220325020618-49ff273808a1 github.com/envoyproxy/protoc-gen-validate v0.6.7 github.com/fsnotify/fsnotify v1.5.1 github.com/go-kit/log v0.2.0 @@ -73,7 +73,7 @@ require ( golang.org/x/tools v0.1.10 google.golang.org/api v0.77.0 google.golang.org/genproto v0.0.0-20220414192740-2d67ff6cf2b4 - google.golang.org/grpc v1.45.0 + google.golang.org/grpc v1.46.0 google.golang.org/protobuf v1.28.0 gopkg.in/alecthomas/kingpin.v2 v2.2.6 gopkg.in/yaml.v2 v2.4.0 diff --git a/go.sum b/go.sum index 3084c00b503..b9ee09e3fa5 100644 --- a/go.sum +++ b/go.sum @@ -407,8 +407,8 @@ github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.m github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0= -github.com/envoyproxy/go-control-plane v0.10.1 h1:cgDRLG7bs59Zd+apAWuzLQL95obVYAymNJek76W3mgw= -github.com/envoyproxy/go-control-plane v0.10.1/go.mod h1:AY7fTTXNdv/aJ2O5jwpxAPOWUZ7hQAEvzN5Pf27BkQQ= +github.com/envoyproxy/go-control-plane v0.10.2-0.20220325020618-49ff273808a1 h1:xvqufLtNVwAhN8NMyWklVgxnWohi+wtMGQMhtxexlm0= +github.com/envoyproxy/go-control-plane v0.10.2-0.20220325020618-49ff273808a1/go.mod h1:KJwIaB5Mv44NWtYuAOFCVOjcI94vtpEz2JU/D2v6IjE= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/envoyproxy/protoc-gen-validate v0.6.7 h1:qcZcULcd/abmQg6dwigimCNEyi4gg31M/xaciQlDml8= github.com/envoyproxy/protoc-gen-validate v0.6.7/go.mod h1:dyJXwwfPK2VSqiB9Klm1J6romD608Ba7Hij42vrOBCo= @@ -1875,8 +1875,9 @@ google.golang.org/grpc v1.40.1/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9K google.golang.org/grpc v1.42.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= google.golang.org/grpc v1.43.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= google.golang.org/grpc v1.44.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= -google.golang.org/grpc v1.45.0 h1:NEpgUqV3Z+ZjkqMsxMg11IaDrXY4RY6CQukSGK0uI1M= google.golang.org/grpc v1.45.0/go.mod h1:lN7owxKUQEqMfSyQikvvk5tf/6zMPsrK+ONuO11+0rQ= +google.golang.org/grpc v1.46.0 h1:oCjezcn6g6A75TGoKYBPgKmVBLexhYLM6MebdrPApP8= +google.golang.org/grpc v1.46.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= From 71dbb4d0917762f086bb4a13a73c3d3e04db2bd4 Mon Sep 17 00:00:00 2001 From: Julien Pivotto Date: Tue, 3 May 2022 10:09:53 +0200 Subject: [PATCH 040/135] Add lowercase and uppercase relabel action (#10641) Signed-off-by: Julien Pivotto --- config/config_test.go | 35 +++++++++++++++++++++++++++++ config/testdata/conf.good.yml | 4 ++++ config/testdata/lowercase.bad.yml | 5 +++++ config/testdata/lowercase2.bad.yml | 6 +++++ config/testdata/lowercase3.bad.yml | 7 ++++++ config/testdata/uppercase.bad.yml | 5 +++++ config/testdata/uppercase2.bad.yml | 6 +++++ config/testdata/uppercase3.bad.yml | 7 ++++++ docs/configuration/configuration.md | 2 ++ model/relabel/relabel.go | 17 +++++++++++--- model/relabel/relabel_test.go | 22 ++++++++++++++++++ 11 files changed, 113 insertions(+), 3 deletions(-) create mode 100644 config/testdata/lowercase.bad.yml create mode 100644 config/testdata/lowercase2.bad.yml create mode 100644 config/testdata/lowercase3.bad.yml create mode 100644 config/testdata/uppercase.bad.yml create mode 100644 config/testdata/uppercase2.bad.yml create mode 100644 config/testdata/uppercase3.bad.yml diff --git a/config/config_test.go b/config/config_test.go index e0f76219493..ef198d6dd16 100644 --- a/config/config_test.go +++ b/config/config_test.go @@ -858,6 +858,17 @@ var expectedConf = &Config{ Scheme: DefaultScrapeConfig.Scheme, HTTPClientConfig: config.DefaultHTTPClientConfig, + RelabelConfigs: []*relabel.Config{ + { + Action: relabel.Uppercase, + Regex: relabel.DefaultRelabelConfig.Regex, + Replacement: relabel.DefaultRelabelConfig.Replacement, + Separator: relabel.DefaultRelabelConfig.Separator, + SourceLabels: model.LabelNames{"instance"}, + TargetLabel: "instance", + }, + }, + ServiceDiscoveryConfigs: discovery.Configs{ &hetzner.SDConfig{ HTTPClientConfig: config.HTTPClientConfig{ @@ -1197,6 +1208,30 @@ var expectedErrors = []struct { filename: "labelmap.bad.yml", errMsg: "\"l-$1\" is invalid 'replacement' for labelmap action", }, + { + filename: "lowercase.bad.yml", + errMsg: "relabel configuration for lowercase action requires 'target_label' value", + }, + { + filename: "lowercase2.bad.yml", + errMsg: "\"42lab\" is invalid 'target_label' for lowercase action", + }, + { + filename: "lowercase3.bad.yml", + errMsg: "'replacement' can not be set for lowercase action", + }, + { + filename: "uppercase.bad.yml", + errMsg: "relabel configuration for uppercase action requires 'target_label' value", + }, + { + filename: "uppercase2.bad.yml", + errMsg: "\"42lab\" is invalid 'target_label' for uppercase action", + }, + { + filename: "uppercase3.bad.yml", + errMsg: "'replacement' can not be set for uppercase action", + }, { filename: "rules.bad.yml", errMsg: "invalid rule file path", diff --git a/config/testdata/conf.good.yml b/config/testdata/conf.good.yml index 58ef791af75..9b5d4b03922 100644 --- a/config/testdata/conf.good.yml +++ b/config/testdata/conf.good.yml @@ -328,6 +328,10 @@ scrape_configs: key_file: valid_key_file - job_name: hetzner + relabel_configs: + - action: uppercase + source_labels: [instance] + target_label: instance hetzner_sd_configs: - role: hcloud authorization: diff --git a/config/testdata/lowercase.bad.yml b/config/testdata/lowercase.bad.yml new file mode 100644 index 00000000000..9bc95833417 --- /dev/null +++ b/config/testdata/lowercase.bad.yml @@ -0,0 +1,5 @@ +scrape_configs: + - job_name: prometheus + relabel_configs: + - action: lowercase + source_labels: [__name__] diff --git a/config/testdata/lowercase2.bad.yml b/config/testdata/lowercase2.bad.yml new file mode 100644 index 00000000000..bde8862c66c --- /dev/null +++ b/config/testdata/lowercase2.bad.yml @@ -0,0 +1,6 @@ +scrape_configs: + - job_name: prometheus + relabel_configs: + - action: lowercase + source_labels: [__name__] + target_label: 42lab diff --git a/config/testdata/lowercase3.bad.yml b/config/testdata/lowercase3.bad.yml new file mode 100644 index 00000000000..6a19f31f3f5 --- /dev/null +++ b/config/testdata/lowercase3.bad.yml @@ -0,0 +1,7 @@ +scrape_configs: + - job_name: prometheus + relabel_configs: + - action: lowercase + source_labels: [__name__] + target_label: __name__ + replacement: bar diff --git a/config/testdata/uppercase.bad.yml b/config/testdata/uppercase.bad.yml new file mode 100644 index 00000000000..582692b5c7a --- /dev/null +++ b/config/testdata/uppercase.bad.yml @@ -0,0 +1,5 @@ +scrape_configs: + - job_name: prometheus + relabel_configs: + - action: uppercase + source_labels: [__name__] diff --git a/config/testdata/uppercase2.bad.yml b/config/testdata/uppercase2.bad.yml new file mode 100644 index 00000000000..330b9aceb68 --- /dev/null +++ b/config/testdata/uppercase2.bad.yml @@ -0,0 +1,6 @@ +scrape_configs: + - job_name: prometheus + relabel_configs: + - action: uppercase + source_labels: [__name__] + target_label: 42lab diff --git a/config/testdata/uppercase3.bad.yml b/config/testdata/uppercase3.bad.yml new file mode 100644 index 00000000000..9a7b17f40aa --- /dev/null +++ b/config/testdata/uppercase3.bad.yml @@ -0,0 +1,7 @@ +scrape_configs: + - job_name: prometheus + relabel_configs: + - action: uppercase + source_labels: [__name__] + target_label: __name__ + replacement: bar diff --git a/docs/configuration/configuration.md b/docs/configuration/configuration.md index cde1a03b9dc..621fff3dc3b 100644 --- a/docs/configuration/configuration.md +++ b/docs/configuration/configuration.md @@ -2536,6 +2536,8 @@ anchored on both ends. To un-anchor the regex, use `.*.*`. `target_label` to `replacement`, with match group references (`${1}`, `${2}`, ...) in `replacement` substituted by their value. If `regex` does not match, no replacement takes place. +* `lowercase`: Maps the concatenated `source_labels` to their lower case. +* `uppercase`: Maps the concatenated `source_labels` to their upper case. * `keep`: Drop targets for which `regex` does not match the concatenated `source_labels`. * `drop`: Drop targets for which `regex` matches the concatenated `source_labels`. * `hashmod`: Set `target_label` to the `modulus` of a hash of the concatenated `source_labels`. diff --git a/model/relabel/relabel.go b/model/relabel/relabel.go index da21ff9182b..98a245bba62 100644 --- a/model/relabel/relabel.go +++ b/model/relabel/relabel.go @@ -54,6 +54,10 @@ const ( LabelDrop Action = "labeldrop" // LabelKeep drops any label not matching the regex. LabelKeep Action = "labelkeep" + // Lowercase maps input letters to their lower case. + Lowercase Action = "lowercase" + // Uppercase maps input letters to their upper case. + Uppercase Action = "uppercase" ) // UnmarshalYAML implements the yaml.Unmarshaler interface. @@ -63,7 +67,7 @@ func (a *Action) UnmarshalYAML(unmarshal func(interface{}) error) error { return err } switch act := Action(strings.ToLower(s)); act { - case Replace, Keep, Drop, HashMod, LabelMap, LabelDrop, LabelKeep: + case Replace, Keep, Drop, HashMod, LabelMap, LabelDrop, LabelKeep, Lowercase, Uppercase: *a = act return nil } @@ -106,12 +110,15 @@ func (c *Config) UnmarshalYAML(unmarshal func(interface{}) error) error { if c.Modulus == 0 && c.Action == HashMod { return errors.Errorf("relabel configuration for hashmod requires non-zero modulus") } - if (c.Action == Replace || c.Action == HashMod) && c.TargetLabel == "" { + if (c.Action == Replace || c.Action == HashMod || c.Action == Lowercase || c.Action == Uppercase) && c.TargetLabel == "" { return errors.Errorf("relabel configuration for %s action requires 'target_label' value", c.Action) } - if c.Action == Replace && !relabelTarget.MatchString(c.TargetLabel) { + if (c.Action == Replace || c.Action == Lowercase || c.Action == Uppercase) && !relabelTarget.MatchString(c.TargetLabel) { return errors.Errorf("%q is invalid 'target_label' for %s action", c.TargetLabel, c.Action) } + if (c.Action == Lowercase || c.Action == Uppercase) && c.Replacement != DefaultRelabelConfig.Replacement { + return errors.Errorf("'replacement' can not be set for %s action", c.Action) + } if c.Action == LabelMap && !relabelTarget.MatchString(c.Replacement) { return errors.Errorf("%q is invalid 'replacement' for %s action", c.Replacement, c.Action) } @@ -228,6 +235,10 @@ func relabel(lset labels.Labels, cfg *Config) labels.Labels { break } lb.Set(string(target), string(res)) + case Lowercase: + lb.Set(cfg.TargetLabel, strings.ToLower(val)) + case Uppercase: + lb.Set(cfg.TargetLabel, strings.ToUpper(val)) case HashMod: mod := sum64(md5.Sum([]byte(val))) % cfg.Modulus lb.Set(cfg.TargetLabel, fmt.Sprintf("%d", mod)) diff --git a/model/relabel/relabel_test.go b/model/relabel/relabel_test.go index 1e50344a087..4ae1f53445d 100644 --- a/model/relabel/relabel_test.go +++ b/model/relabel/relabel_test.go @@ -428,6 +428,28 @@ func TestRelabel(t *testing.T) { "a": "foo", }), }, + { + input: labels.FromMap(map[string]string{ + "foo": "bAr123Foo", + }), + relabel: []*Config{ + { + SourceLabels: model.LabelNames{"foo"}, + Action: Uppercase, + TargetLabel: "foo_uppercase", + }, + { + SourceLabels: model.LabelNames{"foo"}, + Action: Lowercase, + TargetLabel: "foo_lowercase", + }, + }, + output: labels.FromMap(map[string]string{ + "foo": "bAr123Foo", + "foo_lowercase": "bar123foo", + "foo_uppercase": "BAR123FOO", + }), + }, } for _, test := range tests { From 8cc27af6eb0a3587955897b14c0693b91cb2c99c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Bauer?= Date: Tue, 3 May 2022 10:59:09 +0200 Subject: [PATCH 041/135] fix markdown lint issues (#10591) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: AndrÊ Bauer --- CHANGELOG.md | 55 +++++++++++++++++++------------ CODE_OF_CONDUCT.md | 2 +- CONTRIBUTING.md | 4 +-- MAINTAINERS.md | 2 ++ README.md | 80 +++++++++++++++++++++++++--------------------- RELEASE.md | 18 +++++------ SECURITY.md | 2 +- 7 files changed, 94 insertions(+), 69 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 161c23bf7d0..5f061dcbe5e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,15 +1,17 @@ +# Changelog + ## 2.35.0 / 2022-04-21 This Prometheus release is built with go1.18, which contains two noticeable changes related to TLS: -1. [TLS 1.0 and 1.1 disabled by default client-side](https://go.dev/doc/go1.18#tls10). +1. [TLS 1.0 and 1.1 disabled by default client-side](https://go.dev/doc/go1.18#tls10). Prometheus users can override this with the `min_version` parameter of [tls_config](https://prometheus.io/docs/prometheus/latest/configuration/configuration/#tls_config). 2. [Certificates signed with the SHA-1 hash function are rejected](https://go.dev/doc/go1.18#sha1). This doesn't apply to self-signed root certificates. * [CHANGE] TSDB: Delete `*.tmp` WAL files when Prometheus starts. #10317 * [CHANGE] promtool: Add new flag `--lint` (enabled by default) for the commands `check rules` and `check config`, resulting in a new exit code (`3`) for linter errors. #10435 * [FEATURE] Support for automatically setting the variable `GOMAXPROCS` to the container CPU limit. Enable with the flag `--enable-feature=auto-gomaxprocs`. #10498 -* [FEATURE] PromQL: Extend statistics with total and peak number of samples in a query. Additionally, per-step statistics are available with --enable-feature=promql-per-step-stats and using `stats=all` in the query API. +* [FEATURE] PromQL: Extend statistics with total and peak number of samples in a query. Additionally, per-step statistics are available with --enable-feature=promql-per-step-stats and using `stats=all` in the query API. Enable with the flag `--enable-feature=per-step-stats`. #10369 * [ENHANCEMENT] Prometheus is built with Go 1.18. #10501 * [ENHANCEMENT] TSDB: more efficient sorting of postings read from WAL at startup. #10500 @@ -41,7 +43,7 @@ Enable with the flag `--enable-feature=per-step-stats`. #10369 * [ENHANCEMENT] UI: Optimize the alerts page and add a search bar. #10142 * [ENHANCEMENT] UI: Improve graph colors that were hard to see. #10179 * [ENHANCEMENT] Config: Allow escaping of `$` with `$$` when using environment variables with external labels. #10129 -* [BUGFIX] PromQL: Properly return an error from histogram_quantile when metrics have the same labelset. #10140 +* [BUGFIX] PromQL: Properly return an error from histogram_quantile when metrics have the same labelset. #10140 * [BUGFIX] UI: Fix bug that sets the range input to the resolution. #10227 * [BUGFIX] TSDB: Fix a query panic when `memory-snapshot-on-shutdown` is enabled. #10348 * [BUGFIX] Parser: Specify type in metadata parser errors. #10269 @@ -360,7 +362,7 @@ Alertmanager API v2 was released in Alertmanager v0.16.0 (released in January 2019). * [FEATURE] **experimental** API: Accept remote_write requests. Behind the --enable-feature=remote-write-receiver flag. #8424 -* [FEATURE] **experimental** PromQL: Add '@ ' modifier. Behind the --enable-feature=promql-at-modifier flag. #8121 #8436 #8425 +* [FEATURE] **experimental** PromQL: Add `@ ` modifier. Behind the --enable-feature=promql-at-modifier flag. #8121 #8436 #8425 * [ENHANCEMENT] Add optional name property to testgroup for better test failure output. #8440 * [ENHANCEMENT] Add warnings into React Panel on the Graph page. #8427 * [ENHANCEMENT] TSDB: Increase the number of buckets for the compaction duration metric. #8342 @@ -405,12 +407,12 @@ Alertmanager API v2 was released in Alertmanager v0.16.0 (released in January * [CHANGE] UI: Make the React UI default. #8142 * [CHANGE] Remote write: The following metrics were removed/renamed in remote write. #6815 - - `prometheus_remote_storage_succeeded_samples_total` was removed and `prometheus_remote_storage_samples_total` was introduced for all the samples attempted to send. - - `prometheus_remote_storage_sent_bytes_total` was removed and replaced with `prometheus_remote_storage_samples_bytes_total` and `prometheus_remote_storage_metadata_bytes_total`. - - `prometheus_remote_storage_failed_samples_total` -> `prometheus_remote_storage_samples_failed_total` . - - `prometheus_remote_storage_retried_samples_total` -> `prometheus_remote_storage_samples_retried_total`. - - `prometheus_remote_storage_dropped_samples_total` -> `prometheus_remote_storage_samples_dropped_total`. - - `prometheus_remote_storage_pending_samples` -> `prometheus_remote_storage_samples_pending`. + * `prometheus_remote_storage_succeeded_samples_total` was removed and `prometheus_remote_storage_samples_total` was introduced for all the samples attempted to send. + * `prometheus_remote_storage_sent_bytes_total` was removed and replaced with `prometheus_remote_storage_samples_bytes_total` and `prometheus_remote_storage_metadata_bytes_total`. + * `prometheus_remote_storage_failed_samples_total` -> `prometheus_remote_storage_samples_failed_total` . + * `prometheus_remote_storage_retried_samples_total` -> `prometheus_remote_storage_samples_retried_total`. + * `prometheus_remote_storage_dropped_samples_total` -> `prometheus_remote_storage_samples_dropped_total`. + * `prometheus_remote_storage_pending_samples` -> `prometheus_remote_storage_samples_pending`. * [CHANGE] Remote: Do not collect non-initialized timestamp metrics. #8060 * [FEATURE] [EXPERIMENTAL] Remote write: Allow metric metadata to be propagated via remote write. The following new metrics were introduced: `prometheus_remote_storage_metadata_total`, `prometheus_remote_storage_metadata_failed_total`, `prometheus_remote_storage_metadata_retried_total`, `prometheus_remote_storage_metadata_bytes_total`. #6815 * [ENHANCEMENT] Remote write: Added a metric `prometheus_remote_storage_max_samples_per_send` for remote write. #8102 @@ -586,7 +588,6 @@ This release changes WAL compression from opt-in to default. WAL compression wil * [BUGFIX] Remote Write: Fixed blocked resharding edge case. #7122 * [BUGFIX] Remote Write: Fixed remote write not updating on relabel configs change. #7073 - ## 2.17.2 / 2020-04-20 * [BUGFIX] Federation: Register federation metrics #7081 @@ -1002,10 +1003,10 @@ We're rolling back the Dockerfile changes introduced in 2.6.0. If you made chang ## 2.4.2 / 2018-09-21 - The last release didn't have bugfix included due to a vendoring error. +The last release didn't have bugfix included due to a vendoring error. - * [BUGFIX] Handle WAL corruptions properly prometheus/tsdb#389 - * [BUGFIX] Handle WAL migrations correctly on Windows prometheus/tsdb#392 +* [BUGFIX] Handle WAL corruptions properly prometheus/tsdb#389 +* [BUGFIX] Handle WAL migrations correctly on Windows prometheus/tsdb#392 ## 2.4.1 / 2018-09-19 @@ -1152,15 +1153,14 @@ This release includes multiple bugfixes and features. Further, the WAL implement * [BUGFIX] tsdb: Cleanup and do not retry failing compactions. * [BUGFIX] tsdb: Close WAL while shutting down. - ## 2.0.0 / 2017-11-08 This release includes a completely rewritten storage, huge performance improvements, but also many backwards incompatible changes. For more information, read the announcement blog post and migration guide. -https://prometheus.io/blog/2017/11/08/announcing-prometheus-2-0/ -https://prometheus.io/docs/prometheus/2.0/migration/ + + * [CHANGE] Completely rewritten storage layer, with WAL. This is not backwards compatible with 1.x storage, and many flags have changed/disappeared. * [CHANGE] New staleness behavior. Series now marked stale after target scrapes no longer return them, and soon after targets disappear from service discovery. @@ -1570,7 +1570,7 @@ This release contains multiple breaking changes to the configuration schema. This version contains a breaking change to the query language. Please read the documentation on the grouping behavior of vector matching: -https://prometheus.io/docs/querying/operators/#vector-matching + * [FEATURE] Add experimental Microsoft Azure service discovery * [FEATURE] Add `ignoring` modifier for binary operations @@ -1696,7 +1696,7 @@ BREAKING CHANGES: with InfluxDB 0.9.x. 0.8.x versions of InfluxDB are not supported anymore. * Escape sequences in double- and single-quoted string literals in rules or query expressions are now interpreted like escape sequences in Go string literals - (https://golang.org/ref/spec#String_literals). + (). Future breaking changes / deprecated features: @@ -1832,6 +1832,7 @@ All changes: * [CLEANUP] Resolve relative paths during configuration loading. ## 0.15.1 / 2015-07-27 + * [BUGFIX] Fix vector matching behavior when there is a mix of equality and non-equality matchers in a vector selector and one matcher matches no series. * [ENHANCEMENT] Allow overriding `GOARCH` and `GOOS` in Makefile.INCLUDE. @@ -1949,6 +1950,7 @@ All changes: * [CLEANUP] Use new v1 HTTP API for querying and graphing. ## 0.14.0 / 2015-06-01 + * [CHANGE] Configuration format changed and switched to YAML. (See the provided [migration tool](https://github.com/prometheus/migrate/releases).) * [ENHANCEMENT] Redesign of state-preserving target discovery. @@ -1974,9 +1976,11 @@ All changes: * [ENHANCEMENT] Limit retrievable samples to the storage's retention window. ## 0.13.4 / 2015-05-23 + * [BUGFIX] Fix a race while checkpointing fingerprint mappings. ## 0.13.3 / 2015-05-11 + * [BUGFIX] Handle fingerprint collisions properly. * [CHANGE] Comments in rules file must start with `#`. (The undocumented `//` and `/*...*/` comment styles are no longer supported.) @@ -1987,6 +1991,7 @@ All changes: * [ENHANCEMENT] Terminate running queries during shutdown. ## 0.13.2 / 2015-05-05 + * [MAINTENANCE] Updated vendored dependencies to their newest versions. * [MAINTENANCE] Include rule_checker and console templates in release tarball. * [BUGFIX] Sort NaN as the lowest value. @@ -1997,10 +2002,12 @@ All changes: * [BUGFIX] Show correct error on wrong DNS response. ## 0.13.1 / 2015-04-09 + * [BUGFIX] Treat memory series with zero chunks correctly in series maintenance. * [ENHANCEMENT] Improve readability of usage text even more. ## 0.13.0 / 2015-04-08 + * [ENHANCEMENT] Double-delta encoding for chunks, saving typically 40% of space, both in RAM and on disk. * [ENHANCEMENT] Redesign of chunk persistence queuing, increasing performance @@ -2028,6 +2035,7 @@ All changes: * [MAINTENANCE] Updated vendored dependencies to their newest versions. ## 0.12.0 / 2015-03-04 + * [CHANGE] Use client_golang v0.3.1. THIS CHANGES FINGERPRINTING AND INVALIDATES ALL PERSISTED FINGERPRINTS. You have to wipe your storage to use this or later versions. There is a version guard in place that will prevent you to @@ -2043,6 +2051,7 @@ All changes: * [CHANGE] Makefile uses Go 1.4.2. ## 0.11.1 / 2015-02-27 + * [BUGFIX] Make series maintenance complete again. (Ever since 0.9.0rc4, or commit 0851945, series would not be archived, chunk descriptors would not be evicted, and stale head chunks would never be closed. This happened @@ -2055,6 +2064,7 @@ All changes: * [ENHANCEMENT] Limit the number of 'dirty' series counted during checkpointing. ## 0.11.0 / 2015-02-23 + * [FEATURE] Introduce new metric type Histogram with server-side aggregation. * [FEATURE] Add offset operator. * [FEATURE] Add floor, ceil and round functions. @@ -2079,18 +2089,20 @@ All changes: * [CLEANUP] Various code cleanups. ## 0.10.0 / 2015-01-26 + * [CHANGE] More efficient JSON result format in query API. This requires up-to-date versions of PromDash and prometheus_cli, too. * [ENHANCEMENT] Excluded non-minified Bootstrap assets and the Bootstrap maps from embedding into the binary. Those files are only used for debugging, and then you can use -web.use-local-assets. By including fewer files, the RAM usage during compilation is much more manageable. -* [ENHANCEMENT] Help link points to https://prometheus.github.io now. +* [ENHANCEMENT] Help link points to now. * [FEATURE] Consoles for haproxy and cloudwatch. * [BUGFIX] Several fixes to graphs in consoles. * [CLEANUP] Removed a file size check that did not check anything. ## 0.9.0 / 2015-01-23 + * [CHANGE] Reworked command line flags, now more consistent and taking into account needs of the new storage backend (see below). * [CHANGE] Metric names are dropped after certain transformations. @@ -2132,10 +2144,12 @@ All changes: * [CLEANUP] Removed dead code. ## 0.8.0 / 2014-09-04 + * [ENHANCEMENT] Stagger scrapes to spread out load. * [BUGFIX] Correctly quote HTTP Accept header. ## 0.7.0 / 2014-08-06 + * [FEATURE] Added new functions: abs(), topk(), bottomk(), drop_common_labels(). * [FEATURE] Let console templates get graph links from expressions. * [FEATURE] Allow console templates to dynamically include other templates. @@ -2150,6 +2164,7 @@ All changes: * [ENHANCEMENT] Dockerfile also builds Prometheus support tools now. ## 0.6.0 / 2014-06-30 + * [FEATURE] Added console and alert templates support, along with various template functions. * [PERFORMANCE] Much faster and more memory-efficient flushing to disk. * [ENHANCEMENT] Query results are now only logged when debugging. diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md index 9a1aff41270..3a4934ce6d5 100644 --- a/CODE_OF_CONDUCT.md +++ b/CODE_OF_CONDUCT.md @@ -1,3 +1,3 @@ -## Prometheus Community Code of Conduct +# Prometheus Community Code of Conduct Prometheus follows the [CNCF Code of Conduct](https://github.com/cncf/foundation/blob/master/code-of-conduct.md). diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 1b61c5de0ca..844f8e09fc7 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -21,7 +21,6 @@ Prometheus uses GitHub to manage reviews of pull requests. * Be sure to sign off on the [DCO](https://github.com/probot/dco#how-it-works). - ## Steps to Contribute Should you wish to work on an issue, please claim it first by commenting on the GitHub issue that you want to work on it. This is to prevent duplicated efforts from contributors on the same issue. @@ -33,7 +32,8 @@ You can [spin up a prebuilt dev environment](https://gitpod.io/#https://github.c For complete instructions on how to compile see: [Building From Source](https://github.com/prometheus/prometheus#building-from-source) For quickly compiling and testing your changes do: -``` + +```bash # For building. go build ./cmd/prometheus/ ./prometheus diff --git a/MAINTAINERS.md b/MAINTAINERS.md index f45fa6b346d..d31cf696c26 100644 --- a/MAINTAINERS.md +++ b/MAINTAINERS.md @@ -1,3 +1,5 @@ +# Maintainers + Julien Pivotto ( / @roidelapluie) and Levi Harrison ( / @LeviHarrison) are the main/default maintainers, some parts of the codebase have other maintainers: * `cmd` diff --git a/README.md b/README.md index 04bc3ef04b5..76f4a1f889d 100644 --- a/README.md +++ b/README.md @@ -17,18 +17,18 @@ displays the results, and can trigger alerts when specified conditions are obser The features that distinguish Prometheus from other metrics and monitoring systems are: -- A **multi-dimensional** data model (time series defined by metric name and set of key/value dimensions) -- PromQL, a **powerful and flexible query language** to leverage this dimensionality -- No dependency on distributed storage; **single server nodes are autonomous** -- An HTTP **pull model** for time series collection -- **Pushing time series** is supported via an intermediary gateway for batch jobs -- Targets are discovered via **service discovery** or **static configuration** -- Multiple modes of **graphing and dashboarding support** -- Support for hierarchical and horizontal **federation** +* A **multi-dimensional** data model (time series defined by metric name and set of key/value dimensions) +* PromQL, a **powerful and flexible query language** to leverage this dimensionality +* No dependency on distributed storage; **single server nodes are autonomous** +* An HTTP **pull model** for time series collection +* **Pushing time series** is supported via an intermediary gateway for batch jobs +* Targets are discovered via **service discovery** or **static configuration** +* Multiple modes of **graphing and dashboarding support** +* Support for hierarchical and horizontal **federation** ## Architecture overview -![](https://cdn.jsdelivr.net/gh/prometheus/prometheus@c34257d069c630685da35bcef084632ffd5d6209/documentation/images/architecture.svg) +![Architecture overview](https://cdn.jsdelivr.net/gh/prometheus/prometheus@c34257d069c630685da35bcef084632ffd5d6209/documentation/images/architecture.svg) ## Install @@ -49,13 +49,16 @@ Docker images are available on [Quay.io](https://quay.io/repository/prometheus/p You can launch a Prometheus container for trying it out with - $ docker run --name prometheus -d -p 127.0.0.1:9090:9090 prom/prometheus +```bash +docker run --name prometheus -d -p 127.0.0.1:9090:9090 prom/prometheus +``` -Prometheus will now be reachable at http://localhost:9090/. +Prometheus will now be reachable at . ### Building from source To build Prometheus from source code, You need: + * Go [version 1.16 or greater](https://golang.org/doc/install). * NodeJS [version 16 or greater](https://nodejs.org/). * npm [version 7 or greater](https://www.npmjs.com/). @@ -63,8 +66,10 @@ To build Prometheus from source code, You need: You can directly use the `go` tool to download and install the `prometheus` and `promtool` binaries into your `GOPATH`: - $ GO111MODULE=on go install github.com/prometheus/prometheus/cmd/... - $ prometheus --config.file=your_config.yml +```bash +GO111MODULE=on go install github.com/prometheus/prometheus/cmd/... +prometheus --config.file=your_config.yml +``` *However*, when using `go install` to build Prometheus, Prometheus will expect to be able to read its web assets from local filesystem directories under `web/ui/static` and @@ -77,21 +82,23 @@ An example of the above configuration file can be found [here.](https://github.c You can also clone the repository yourself and build using `make build`, which will compile in the web assets so that Prometheus can be run from anywhere: - $ mkdir -p $GOPATH/src/github.com/prometheus - $ cd $GOPATH/src/github.com/prometheus - $ git clone https://github.com/prometheus/prometheus.git - $ cd prometheus - $ make build - $ ./prometheus --config.file=your_config.yml +```bash +mkdir -p $GOPATH/src/github.com/prometheus +cd $GOPATH/src/github.com/prometheus +git clone https://github.com/prometheus/prometheus.git +cd prometheus +make build +./prometheus --config.file=your_config.yml +``` The Makefile provides several targets: - * *build*: build the `prometheus` and `promtool` binaries (includes building and compiling in web assets) - * *test*: run the tests - * *test-short*: run the short tests - * *format*: format the source code - * *vet*: check the source code for common errors - * *assets*: build the React UI +* *build*: build the `prometheus` and `promtool` binaries (includes building and compiling in web assets) +* *test*: run the tests +* *test-short*: run the short tests +* *format*: format the source code +* *vet*: check the source code for common errors +* *assets*: build the React UI ### Service discovery plugins @@ -115,10 +122,12 @@ always, be extra careful when loading third party code. The `make docker` target is designed for use in our CI system. You can build a docker image locally with the following commands: - $ make promu - $ promu crossbuild -p linux/amd64 - $ make npm_licenses - $ make common-docker-amd64 +```bash +make promu +promu crossbuild -p linux/amd64 +make npm_licenses +make common-docker-amd64 +``` *NB* if you are on a Mac, you will need [gnu-tar](https://formulae.brew.sh/formula/gnu-tar). @@ -132,7 +141,7 @@ We are publishing our Remote Write protobuf independently at You can use that as a library: ```shell -$ go get go.buf.build/protocolbuffers/go/prometheus/prometheus +go get go.buf.build/protocolbuffers/go/prometheus/prometheus ``` This is experimental. @@ -145,8 +154,8 @@ Prometheus v2.y.z releases, we are publishing equivalent v0.y.z tags. Therefore, a user that would want to use Prometheus v2.35.0 as a library could do: -``` -$ go get github.com/prometheus/prometheus@v0.35.0 +```shell +go get github.com/prometheus/prometheus@v0.35.0 ``` This solution makes it clear that we might break our internal Go APIs between @@ -159,9 +168,9 @@ For more information on building, running, and developing on the React-based UI, ## More information - * Godoc documentation is available via [pkg.go.dev](https://pkg.go.dev/github.com/prometheus/prometheus). Due to peculiarities of Go Modules, v2.x.y will be displayed as v0.x.y. - * You will find a CircleCI configuration in [`.circleci/config.yml`](.circleci/config.yml). - * See the [Community page](https://prometheus.io/community) for how to reach the Prometheus developers and users on various communication channels. +* Godoc documentation is available via [pkg.go.dev](https://pkg.go.dev/github.com/prometheus/prometheus). Due to peculiarities of Go Modules, v2.x.y will be displayed as v0.x.y. +* You will find a CircleCI configuration in [`.circleci/config.yml`](.circleci/config.yml). +* See the [Community page](https://prometheus.io/community) for how to reach the Prometheus developers and users on various communication channels. ## Contributing @@ -171,7 +180,6 @@ Refer to [CONTRIBUTING.md](https://github.com/prometheus/prometheus/blob/main/CO Apache License 2.0, see [LICENSE](https://github.com/prometheus/prometheus/blob/main/LICENSE). - [hub]: https://hub.docker.com/r/prom/prometheus/ [circleci]: https://circleci.com/gh/prometheus/prometheus [quay]: https://quay.io/repository/prometheus/prometheus diff --git a/RELEASE.md b/RELEASE.md index cfbf7d1684a..8a2395a5391 100644 --- a/RELEASE.md +++ b/RELEASE.md @@ -97,7 +97,7 @@ of these in pull requests, one per feature. #### Updating Go dependencies -``` +```bash make update-go-deps git add go.mod go.sum git commit -m "Update dependencies" @@ -114,10 +114,10 @@ In case you want to update the UI dependencies, you can run the following comman make update-npm-deps ``` -Once this step completes, please verify that no additional `node_modules` directory was created in any of the module subdirectories +Once this step completes, please verify that no additional `node_modules` directory was created in any of the module subdirectories (which could indicate conflicting dependency versions across modules). Then run `make ui-build` to verify that the build is still working. -Note: Once in a while, the npm dependencies should also be updated to their latest release versions (major or minor) with `make upgrade-npm-deps`, +Note: Once in a while, the npm dependencies should also be updated to their latest release versions (major or minor) with `make upgrade-npm-deps`, though this may be done at convenient times (e.g. by the UI maintainers) that are out-of-sync with Prometheus releases. ### 1. Prepare your release @@ -144,9 +144,9 @@ Entries in the `CHANGELOG.md` are meant to be in this order: Tag the new release via the following commands: ```bash -$ tag="v$(< VERSION)" -$ git tag -s "${tag}" -m "${tag}" -$ git push origin "${tag}" +tag="v$(< VERSION)" +git tag -s "${tag}" -m "${tag}" +git push origin "${tag}" ``` Go modules versioning requires strict use of semver. Because we do not commit to @@ -156,9 +156,9 @@ the Prometheus server, we use major version zero releases for the libraries. Tag the new library release via the following commands: ```bash -$ tag="v$(sed s/2/0/ < VERSION)" -$ git tag -s "${tag}" -m "${tag}" -$ git push origin "${tag}" +tag="v$(sed s/2/0/ < VERSION)" +git tag -s "${tag}" -m "${tag}" +git push origin "${tag}" ``` Optionally, you can use this handy `.gitconfig` alias. diff --git a/SECURITY.md b/SECURITY.md index 67741f015af..fed02d85c79 100644 --- a/SECURITY.md +++ b/SECURITY.md @@ -3,4 +3,4 @@ The Prometheus security policy, including how to report vulnerabilities, can be found here: -https://prometheus.io/docs/operating/security/ + From dd5f9daab95620b4a8f8e85bd2c6c7d9a7398e56 Mon Sep 17 00:00:00 2001 From: Kemal Akkoyun Date: Tue, 3 May 2022 17:32:23 +0100 Subject: [PATCH 042/135] Update link for referenced CNCF code of conduct (#10664) xref: https://github.com/prometheus/client_golang/pull/1041 xref: https://github.com/prometheus/client_golang/pull/1039 xref: https://github.com/prometheus/common/pull/377 Signed-off-by: Kemal Akkoyun --- CODE_OF_CONDUCT.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md index 3a4934ce6d5..d325872bdfa 100644 --- a/CODE_OF_CONDUCT.md +++ b/CODE_OF_CONDUCT.md @@ -1,3 +1,3 @@ # Prometheus Community Code of Conduct -Prometheus follows the [CNCF Code of Conduct](https://github.com/cncf/foundation/blob/master/code-of-conduct.md). +Prometheus follows the [CNCF Code of Conduct](https://github.com/cncf/foundation/blob/main/code-of-conduct.md). From 2381d7be57314df63c17291f22e5e770b44a70f3 Mon Sep 17 00:00:00 2001 From: Goutham Veeramachaneni Date: Tue, 3 May 2022 11:45:52 -0700 Subject: [PATCH 043/135] Send target and metadata cache in context (again) (#10636) * Send target and metadata cache in context (again) The previous attempt was rolled back in #10590 due to memory issues. `sl.parentCtx` and `sl.ctx` both had a copy of the cache and target info in the previous attempt and it was hard to pin-point where the context was being retained causing the memory increase. I've experimented a bunch in #10627 to figure out that this approach doesn't cause memory increase. Beyond that, just using this info in _any_ other context is causing a memory increase. The change fixed a bunch of long-standing in the OTel Collector that the community was waiting on and release is blocked on a few downstream distrubutions of OTel Collector waiting on a fix. I propose to merge this change in while I investigate what is happening. Signed-off-by: Goutham Veeramachaneni * Gate the change behind a manager option Signed-off-by: Goutham Veeramachaneni --- scrape/manager.go | 5 +- scrape/scrape.go | 74 ++++++++++++++++++++++++----- scrape/scrape_test.go | 108 ++++++++++++++++++++++++++++++++++++++---- 3 files changed, 164 insertions(+), 23 deletions(-) diff --git a/scrape/manager.go b/scrape/manager.go index 0e606b45480..dc85f17bb51 100644 --- a/scrape/manager.go +++ b/scrape/manager.go @@ -124,6 +124,9 @@ func NewManager(o *Options, logger log.Logger, app storage.Appendable) *Manager // Options are the configuration parameters to the scrape manager. type Options struct { ExtraMetrics bool + // Option used by downstream scraper users like OpenTelemetry Collector + // to help lookup metric metadata. Should be false for Prometheus. + PassMetadataInContext bool // Optional HTTP client options to use when scraping. HTTPClientOptions []config_util.HTTPClientOption @@ -195,7 +198,7 @@ func (m *Manager) reload() { level.Error(m.logger).Log("msg", "error reloading target set", "err", "invalid config id:"+setName) continue } - sp, err := newScrapePool(scrapeConfig, m.append, m.jitterSeed, log.With(m.logger, "scrape_pool", setName), m.opts.ExtraMetrics, m.opts.HTTPClientOptions) + sp, err := newScrapePool(scrapeConfig, m.append, m.jitterSeed, log.With(m.logger, "scrape_pool", setName), m.opts.ExtraMetrics, m.opts.PassMetadataInContext, m.opts.HTTPClientOptions) if err != nil { level.Error(m.logger).Log("msg", "error creating new scrape pool", "err", err, "scrape_pool", setName) continue diff --git a/scrape/scrape.go b/scrape/scrape.go index 20633a1c516..2febb4390ae 100644 --- a/scrape/scrape.go +++ b/scrape/scrape.go @@ -264,7 +264,7 @@ const maxAheadTime = 10 * time.Minute type labelsMutator func(labels.Labels) labels.Labels -func newScrapePool(cfg *config.ScrapeConfig, app storage.Appendable, jitterSeed uint64, logger log.Logger, reportExtraMetrics bool, httpOpts []config_util.HTTPClientOption) (*scrapePool, error) { +func newScrapePool(cfg *config.ScrapeConfig, app storage.Appendable, jitterSeed uint64, logger log.Logger, reportExtraMetrics, passMetadataInContext bool, httpOpts []config_util.HTTPClientOption) (*scrapePool, error) { targetScrapePools.Inc() if logger == nil { logger = log.NewNopLogger() @@ -315,6 +315,9 @@ func newScrapePool(cfg *config.ScrapeConfig, app storage.Appendable, jitterSeed opts.interval, opts.timeout, reportExtraMetrics, + opts.target, + cache, + passMetadataInContext, ) } @@ -855,10 +858,11 @@ type scrapeLoop struct { sampleMutator labelsMutator reportSampleMutator labelsMutator - parentCtx context.Context - ctx context.Context - cancel func() - stopped chan struct{} + parentCtx context.Context + appenderCtx context.Context + ctx context.Context + cancel func() + stopped chan struct{} disabledEndOfRunStalenessMarkers bool @@ -1124,6 +1128,9 @@ func newScrapeLoop(ctx context.Context, interval time.Duration, timeout time.Duration, reportExtraMetrics bool, + target *Target, + metricMetadataStore MetricMetadataStore, + passMetadataInContext bool, ) *scrapeLoop { if l == nil { l = log.NewNopLogger() @@ -1134,6 +1141,18 @@ func newScrapeLoop(ctx context.Context, if cache == nil { cache = newScrapeCache() } + + appenderCtx := ctx + + if passMetadataInContext { + // Store the cache and target in the context. This is then used by downstream OTel Collector + // to lookup the metadata required to process the samples. Not used by Prometheus itself. + // TODO(gouthamve) We're using a dedicated context because using the parentCtx caused a memory + // leak. We should ideally fix the main leak. See: https://github.com/prometheus/prometheus/pull/10590 + appenderCtx = ContextWithMetricMetadataStore(appenderCtx, cache) + appenderCtx = ContextWithTarget(appenderCtx, target) + } + sl := &scrapeLoop{ scraper: sc, buffers: buffers, @@ -1145,6 +1164,7 @@ func newScrapeLoop(ctx context.Context, jitterSeed: jitterSeed, l: l, parentCtx: ctx, + appenderCtx: appenderCtx, honorTimestamps: honorTimestamps, sampleLimit: sampleLimit, labelLimits: labelLimits, @@ -1223,7 +1243,7 @@ mainLoop: // scrapeAndReport performs a scrape and then appends the result to the storage // together with reporting metrics, by using as few appenders as possible. // In the happy scenario, a single appender is used. -// This function uses sl.parentCtx instead of sl.ctx on purpose. A scrape should +// This function uses sl.appenderCtx instead of sl.ctx on purpose. A scrape should // only be cancelled on shutdown, not on reloads. func (sl *scrapeLoop) scrapeAndReport(last, appendTime time.Time, errc chan<- error) time.Time { start := time.Now() @@ -1242,7 +1262,7 @@ func (sl *scrapeLoop) scrapeAndReport(last, appendTime time.Time, errc chan<- er var total, added, seriesAdded, bytes int var err, appErr, scrapeErr error - app := sl.appender(sl.parentCtx) + app := sl.appender(sl.appenderCtx) defer func() { if err != nil { app.Rollback() @@ -1265,7 +1285,7 @@ func (sl *scrapeLoop) scrapeAndReport(last, appendTime time.Time, errc chan<- er // Add stale markers. if _, _, _, err := sl.append(app, []byte{}, "", appendTime); err != nil { app.Rollback() - app = sl.appender(sl.parentCtx) + app = sl.appender(sl.appenderCtx) level.Warn(sl.l).Log("msg", "Append failed", "err", err) } if errc != nil { @@ -1304,13 +1324,13 @@ func (sl *scrapeLoop) scrapeAndReport(last, appendTime time.Time, errc chan<- er total, added, seriesAdded, appErr = sl.append(app, b, contentType, appendTime) if appErr != nil { app.Rollback() - app = sl.appender(sl.parentCtx) + app = sl.appender(sl.appenderCtx) level.Debug(sl.l).Log("msg", "Append failed", "err", appErr) // The append failed, probably due to a parse error or sample limit. // Call sl.append again with an empty scrape to trigger stale markers. if _, _, _, err := sl.append(app, []byte{}, "", appendTime); err != nil { app.Rollback() - app = sl.appender(sl.parentCtx) + app = sl.appender(sl.appenderCtx) level.Warn(sl.l).Log("msg", "Append failed", "err", err) } } @@ -1374,8 +1394,8 @@ func (sl *scrapeLoop) endOfRunStaleness(last time.Time, ticker *time.Ticker, int // Call sl.append again with an empty scrape to trigger stale markers. // If the target has since been recreated and scraped, the // stale markers will be out of order and ignored. - // sl.context would have been cancelled, hence using sl.parentCtx. - app := sl.appender(sl.parentCtx) + // sl.context would have been cancelled, hence using sl.appenderCtx. + app := sl.appender(sl.appenderCtx) var err error defer func() { if err != nil { @@ -1389,7 +1409,7 @@ func (sl *scrapeLoop) endOfRunStaleness(last time.Time, ticker *time.Ticker, int }() if _, _, _, err = sl.append(app, []byte{}, "", staleTime); err != nil { app.Rollback() - app = sl.appender(sl.parentCtx) + app = sl.appender(sl.appenderCtx) level.Warn(sl.l).Log("msg", "Stale append failed", "err", err) } if err = sl.reportStale(app, staleTime); err != nil { @@ -1791,3 +1811,31 @@ func reusableCache(r, l *config.ScrapeConfig) bool { } return reflect.DeepEqual(zeroConfig(r), zeroConfig(l)) } + +// CtxKey is a dedicated type for keys of context-embedded values propagated +// with the scrape context. +type ctxKey int + +// Valid CtxKey values. +const ( + ctxKeyMetadata ctxKey = iota + 1 + ctxKeyTarget +) + +func ContextWithMetricMetadataStore(ctx context.Context, s MetricMetadataStore) context.Context { + return context.WithValue(ctx, ctxKeyMetadata, s) +} + +func MetricMetadataStoreFromContext(ctx context.Context) (MetricMetadataStore, bool) { + s, ok := ctx.Value(ctxKeyMetadata).(MetricMetadataStore) + return s, ok +} + +func ContextWithTarget(ctx context.Context, t *Target) context.Context { + return context.WithValue(ctx, ctxKeyTarget, t) +} + +func TargetFromContext(ctx context.Context) (*Target, bool) { + t, ok := ctx.Value(ctxKeyTarget).(*Target) + return t, ok +} diff --git a/scrape/scrape_test.go b/scrape/scrape_test.go index c771ee1c844..43200d44005 100644 --- a/scrape/scrape_test.go +++ b/scrape/scrape_test.go @@ -56,7 +56,7 @@ func TestNewScrapePool(t *testing.T) { var ( app = &nopAppendable{} cfg = &config.ScrapeConfig{} - sp, _ = newScrapePool(cfg, app, 0, nil, false, nil) + sp, _ = newScrapePool(cfg, app, 0, nil, false, false, nil) ) if a, ok := sp.appendable.(*nopAppendable); !ok || a != app { @@ -91,7 +91,7 @@ func TestDroppedTargetsList(t *testing.T) { }, }, } - sp, _ = newScrapePool(cfg, app, 0, nil, false, nil) + sp, _ = newScrapePool(cfg, app, 0, nil, false, false, nil) expectedLabelSetString = "{__address__=\"127.0.0.1:9090\", __scrape_interval__=\"0s\", __scrape_timeout__=\"0s\", job=\"dropMe\"}" expectedLength = 1 ) @@ -454,7 +454,7 @@ func TestScrapePoolTargetLimit(t *testing.T) { func TestScrapePoolAppender(t *testing.T) { cfg := &config.ScrapeConfig{} app := &nopAppendable{} - sp, _ := newScrapePool(cfg, app, 0, nil, false, nil) + sp, _ := newScrapePool(cfg, app, 0, nil, false, false, nil) loop := sp.newLoop(scrapeLoopOptions{ target: &Target{}, @@ -496,7 +496,7 @@ func TestScrapePoolRaces(t *testing.T) { newConfig := func() *config.ScrapeConfig { return &config.ScrapeConfig{ScrapeInterval: interval, ScrapeTimeout: timeout} } - sp, _ := newScrapePool(newConfig(), &nopAppendable{}, 0, nil, false, nil) + sp, _ := newScrapePool(newConfig(), &nopAppendable{}, 0, nil, false, false, nil) tgts := []*targetgroup.Group{ { Targets: []model.LabelSet{ @@ -590,6 +590,9 @@ func TestScrapeLoopStopBeforeRun(t *testing.T) { 1, 0, false, + nil, + nil, + false, ) // The scrape pool synchronizes on stopping scrape loops. However, new scrape @@ -659,6 +662,9 @@ func TestScrapeLoopStop(t *testing.T) { 10*time.Millisecond, time.Hour, false, + nil, + nil, + false, ) // Terminate loop after 2 scrapes. @@ -731,6 +737,9 @@ func TestScrapeLoopRun(t *testing.T) { time.Second, time.Hour, false, + nil, + nil, + false, ) // The loop must terminate during the initial offset if the context @@ -783,6 +792,9 @@ func TestScrapeLoopRun(t *testing.T) { time.Second, 100*time.Millisecond, false, + nil, + nil, + false, ) go func() { @@ -839,6 +851,9 @@ func TestScrapeLoopForcedErr(t *testing.T) { time.Second, time.Hour, false, + nil, + nil, + false, ) forcedErr := fmt.Errorf("forced err") @@ -894,6 +909,9 @@ func TestScrapeLoopMetadata(t *testing.T) { 0, 0, false, + nil, + nil, + false, ) defer cancel() @@ -948,6 +966,9 @@ func simpleTestScrapeLoop(t testing.TB) (context.Context, *scrapeLoop) { 0, 0, false, + nil, + nil, + false, ) t.Cleanup(func() { cancel() }) @@ -1038,6 +1059,9 @@ func TestScrapeLoopRunCreatesStaleMarkersOnFailedScrape(t *testing.T) { 10*time.Millisecond, time.Hour, false, + nil, + nil, + false, ) // Succeed once, several failures, then stop. numScrapes := 0 @@ -1097,6 +1121,9 @@ func TestScrapeLoopRunCreatesStaleMarkersOnParseFailure(t *testing.T) { 10*time.Millisecond, time.Hour, false, + nil, + nil, + false, ) // Succeed once, several failures, then stop. @@ -1160,6 +1187,9 @@ func TestScrapeLoopCache(t *testing.T) { 10*time.Millisecond, time.Hour, false, + nil, + nil, + false, ) numScrapes := 0 @@ -1239,6 +1269,9 @@ func TestScrapeLoopCacheMemoryExhaustionProtection(t *testing.T) { 10*time.Millisecond, time.Hour, false, + nil, + nil, + false, ) numScrapes := 0 @@ -1350,6 +1383,9 @@ func TestScrapeLoopAppend(t *testing.T) { 0, 0, false, + nil, + nil, + false, ) now := time.Now() @@ -1437,7 +1473,7 @@ func TestScrapeLoopAppendForConflictingPrefixedLabels(t *testing.T) { return mutateSampleLabels(l, &Target{labels: labels.FromStrings(tc.targetLabels...)}, false, nil) }, nil, - func(ctx context.Context) storage.Appender { return app }, nil, 0, true, 0, nil, 0, 0, false, + func(ctx context.Context) storage.Appender { return app }, nil, 0, true, 0, nil, 0, 0, false, nil, nil, false, ) slApp := sl.appender(context.Background()) _, _, _, err := sl.append(slApp, []byte(tc.exposedLabels), "", time.Date(2000, 1, 1, 1, 0, 0, 0, time.UTC)) @@ -1473,6 +1509,9 @@ func TestScrapeLoopAppendCacheEntryButErrNotFound(t *testing.T) { 0, 0, false, + nil, + nil, + false, ) fakeRef := storage.SeriesRef(1) @@ -1528,6 +1567,9 @@ func TestScrapeLoopAppendSampleLimit(t *testing.T) { 0, 0, false, + nil, + nil, + false, ) // Get the value of the Counter before performing the append. @@ -1602,6 +1644,9 @@ func TestScrapeLoop_ChangingMetricString(t *testing.T) { 0, 0, false, + nil, + nil, + false, ) now := time.Now() @@ -1647,6 +1692,9 @@ func TestScrapeLoopAppendStaleness(t *testing.T) { 0, 0, false, + nil, + nil, + false, ) now := time.Now() @@ -1695,6 +1743,9 @@ func TestScrapeLoopAppendNoStalenessIfTimestamp(t *testing.T) { 0, 0, false, + nil, + nil, + false, ) now := time.Now() @@ -1803,6 +1854,9 @@ metric_total{n="2"} 2 # {t="2"} 2.0 20000 0, 0, false, + nil, + nil, + false, ) now := time.Now() @@ -1865,6 +1919,9 @@ func TestScrapeLoopAppendExemplarSeries(t *testing.T) { 0, 0, false, + nil, + nil, + false, ) now := time.Now() @@ -1914,6 +1971,9 @@ func TestScrapeLoopRunReportsTargetDownOnScrapeError(t *testing.T) { 10*time.Millisecond, time.Hour, false, + nil, + nil, + false, ) scraper.scrapeFunc = func(ctx context.Context, w io.Writer) error { @@ -1947,6 +2007,9 @@ func TestScrapeLoopRunReportsTargetDownOnInvalidUTF8(t *testing.T) { 10*time.Millisecond, time.Hour, false, + nil, + nil, + false, ) scraper.scrapeFunc = func(ctx context.Context, w io.Writer) error { @@ -1993,6 +2056,9 @@ func TestScrapeLoopAppendGracefullyIfAmendOrOutOfOrderOrOutOfBounds(t *testing.T 0, 0, false, + nil, + nil, + false, ) now := time.Unix(1, 0) @@ -2035,6 +2101,9 @@ func TestScrapeLoopOutOfBoundsTimeError(t *testing.T) { 0, 0, false, + nil, + nil, + false, ) now := time.Now().Add(20 * time.Minute) @@ -2289,6 +2358,9 @@ func TestScrapeLoop_RespectTimestamps(t *testing.T) { 0, 0, false, + nil, + nil, + false, ) now := time.Now() @@ -2327,6 +2399,9 @@ func TestScrapeLoop_DiscardTimestamps(t *testing.T) { 0, 0, false, + nil, + nil, + false, ) now := time.Now() @@ -2364,6 +2439,9 @@ func TestScrapeLoopDiscardDuplicateLabels(t *testing.T) { 0, 0, false, + nil, + nil, + false, ) defer cancel() @@ -2419,6 +2497,9 @@ func TestScrapeLoopDiscardUnnamedMetrics(t *testing.T) { 0, 0, false, + nil, + nil, + false, ) defer cancel() @@ -2511,7 +2592,7 @@ func TestReuseScrapeCache(t *testing.T) { ScrapeInterval: model.Duration(5 * time.Second), MetricsPath: "/metrics", } - sp, _ = newScrapePool(cfg, app, 0, nil, false, nil) + sp, _ = newScrapePool(cfg, app, 0, nil, false, false, nil) t1 = &Target{ discoveredLabels: labels.Labels{ labels.Label{ @@ -2692,6 +2773,9 @@ func TestScrapeAddFast(t *testing.T) { 0, 0, false, + nil, + nil, + false, ) defer cancel() @@ -2721,7 +2805,7 @@ func TestReuseCacheRace(t *testing.T) { ScrapeInterval: model.Duration(5 * time.Second), MetricsPath: "/metrics", } - sp, _ = newScrapePool(cfg, app, 0, nil, false, nil) + sp, _ = newScrapePool(cfg, app, 0, nil, false, false, nil) t1 = &Target{ discoveredLabels: labels.Labels{ labels.Label{ @@ -2780,6 +2864,9 @@ func TestScrapeReportSingleAppender(t *testing.T) { 10*time.Millisecond, time.Hour, false, + nil, + nil, + false, ) numScrapes := 0 @@ -2850,7 +2937,7 @@ func TestScrapeReportLimit(t *testing.T) { })) defer ts.Close() - sp, err := newScrapePool(cfg, s, 0, nil, false, nil) + sp, err := newScrapePool(cfg, s, 0, nil, false, false, nil) require.NoError(t, err) defer sp.stop() @@ -2979,6 +3066,9 @@ func TestScrapeLoopLabelLimit(t *testing.T) { 0, 0, false, + nil, + nil, + false, ) slApp := sl.appender(context.Background()) @@ -3017,7 +3107,7 @@ func TestTargetScrapeIntervalAndTimeoutRelabel(t *testing.T) { }, }, } - sp, _ := newScrapePool(config, &nopAppendable{}, 0, nil, false, nil) + sp, _ := newScrapePool(config, &nopAppendable{}, 0, nil, false, false, nil) tgts := []*targetgroup.Group{ { Targets: []model.LabelSet{{model.AddressLabel: "127.0.0.1:9090"}}, From 0a30ac3f9b70dcbfc6ec079278c7aaf67120b20e Mon Sep 17 00:00:00 2001 From: Augustin Husson Date: Wed, 4 May 2022 20:27:56 +0200 Subject: [PATCH 044/135] enable active search through dropped targets (#10668) Signed-off-by: Augustin Husson --- .../src/pages/serviceDiscovery/Services.tsx | 22 +++++++++++++------ 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/web/ui/react-app/src/pages/serviceDiscovery/Services.tsx b/web/ui/react-app/src/pages/serviceDiscovery/Services.tsx index 7664be1f5f4..21bf2259b9e 100644 --- a/web/ui/react-app/src/pages/serviceDiscovery/Services.tsx +++ b/web/ui/react-app/src/pages/serviceDiscovery/Services.tsx @@ -22,11 +22,16 @@ export interface TargetLabels { isDropped: boolean; } -const kvSearch = new KVSearch({ +const activeTargetKVSearch = new KVSearch({ shouldSort: true, indexedKeys: ['labels', 'discoveredLabels', ['discoveredLabels', /.*/], ['labels', /.*/]], }); +const droppedTargetKVSearch = new KVSearch({ + shouldSort: true, + indexedKeys: ['discoveredLabels', ['discoveredLabels', /.*/]], +}); + export const processSummary = ( activeTargets: Target[], droppedTargets: DroppedTarget[] @@ -91,6 +96,7 @@ export const processTargets = (activeTargets: Target[], droppedTargets: DroppedT export const ServiceDiscoveryContent: FC = ({ activeTargets, droppedTargets }) => { const [activeTargetList, setActiveTargetList] = useState(activeTargets); + const [droppedTargetList, setDroppedTargetList] = useState(droppedTargets); const [targetList, setTargetList] = useState(processSummary(activeTargets, droppedTargets)); const [labelList, setLabelList] = useState(processTargets(activeTargets, droppedTargets)); @@ -98,21 +104,23 @@ export const ServiceDiscoveryContent: FC = ({ activeTargets, dropped (value: string) => { setQuerySearchFilter(value); if (value !== '') { - const result = kvSearch.filter(value.trim(), activeTargets); - setActiveTargetList(result.map((value) => value.original)); + const activeTargetResult = activeTargetKVSearch.filter(value.trim(), activeTargets); + const droppedTargetResult = droppedTargetKVSearch.filter(value.trim(), droppedTargets); + setActiveTargetList(activeTargetResult.map((value) => value.original)); + setDroppedTargetList(droppedTargetResult.map((value) => value.original)); } else { setActiveTargetList(activeTargets); } }, - [activeTargets] + [activeTargets, droppedTargets] ); const defaultValue = useMemo(getQuerySearchFilter, []); useEffect(() => { - setTargetList(processSummary(activeTargetList, droppedTargets)); - setLabelList(processTargets(activeTargetList, droppedTargets)); - }, [activeTargetList, droppedTargets]); + setTargetList(processSummary(activeTargetList, droppedTargetList)); + setLabelList(processTargets(activeTargetList, droppedTargetList)); + }, [activeTargetList, droppedTargetList]); return ( <> From b9d4260b81cd6916126c2f820673c0e6c7ec7320 Mon Sep 17 00:00:00 2001 From: Ben Kochie Date: Wed, 4 May 2022 23:30:13 +0200 Subject: [PATCH 045/135] Add deps to golangci-lint (#10659) In order to make the synced version of golangci-lint workflow handle the CGO in snmp_exporter/generator, add some package dependencies. Signed-off-by: SuperQ --- .github/workflows/golangci-lint.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/golangci-lint.yml b/.github/workflows/golangci-lint.yml index 662ea3b6eec..136d7d4b963 100644 --- a/.github/workflows/golangci-lint.yml +++ b/.github/workflows/golangci-lint.yml @@ -21,6 +21,9 @@ jobs: uses: actions/setup-go@v2 with: go-version: 1.18.x + - name: Install snmp_exporter/generator dependencies + run: sudo apt-get update && sudo apt-get -y install libsnmp-dev + if: github.repository == 'prometheus/snmp_exporter' - name: Lint uses: golangci/golangci-lint-action@v3.1.0 with: From 4b9f248e8569fc5163841c2e21b8fa5d3a61b311 Mon Sep 17 00:00:00 2001 From: Bryan Boreham Date: Wed, 4 May 2022 22:41:36 +0100 Subject: [PATCH 046/135] unit tests: make all Labels sorted alphabetically (#10532) "Labels is a sorted set of labels. Order has to be guaranteed upon instantiation." says the comment, so fix all the tests that break this rule. For `BenchmarkLabelValuesWithMatchers()` and `BenchmarkHeadLabelValuesWithMatchers()` the amount of work done changes significantly if you put the labels in order, because all series refs get neatly partitioned by the `tens` label, so I renamed the labels to maintain the previous behaviour. Signed-off-by: Bryan Boreham --- storage/remote/read_handler_test.go | 2 +- storage/remote/read_test.go | 2 +- tsdb/agent/db_test.go | 2 +- tsdb/block_test.go | 18 ++++++++++-------- tsdb/exemplar_test.go | 2 +- tsdb/head_test.go | 18 ++++++++++-------- web/federate_test.go | 2 +- 7 files changed, 25 insertions(+), 21 deletions(-) diff --git a/storage/remote/read_handler_test.go b/storage/remote/read_handler_test.go index 550ac6f6b24..f3447c91887 100644 --- a/storage/remote/read_handler_test.go +++ b/storage/remote/read_handler_test.go @@ -48,8 +48,8 @@ func TestSampledReadEndpoint(t *testing.T) { GlobalConfig: config.GlobalConfig{ ExternalLabels: labels.Labels{ // We expect external labels to be added, with the source labels honored. - {Name: "baz", Value: "a"}, {Name: "b", Value: "c"}, + {Name: "baz", Value: "a"}, {Name: "d", Value: "e"}, }, }, diff --git a/storage/remote/read_test.go b/storage/remote/read_test.go index e2d4e180920..6681b9e9706 100644 --- a/storage/remote/read_test.go +++ b/storage/remote/read_test.go @@ -141,8 +141,8 @@ func TestExternalLabelsQuerierAddExternalLabels(t *testing.T) { }, { el: labels.Labels{ - {Name: "region", Value: "europe"}, {Name: "dc", Value: "berlin-01"}, + {Name: "region", Value: "europe"}, }, inMatchers: []*labels.Matcher{ labels.MustNewMatcher(labels.MatchEqual, "job", "api-server"), diff --git a/tsdb/agent/db_test.go b/tsdb/agent/db_test.go index a8acb64693d..080913a8669 100644 --- a/tsdb/agent/db_test.go +++ b/tsdb/agent/db_test.go @@ -457,8 +457,8 @@ func labelsForTest(lName string, seriesCount int) []labels.Labels { for i := 0; i < seriesCount; i++ { lset := labels.Labels{ {Name: "a", Value: lName}, - {Name: "job", Value: "prometheus"}, {Name: "instance", Value: "localhost" + strconv.Itoa(i)}, + {Name: "job", Value: "prometheus"}, } series = append(series, lset) } diff --git a/tsdb/block_test.go b/tsdb/block_test.go index b957ed65fd5..2d955b4845b 100644 --- a/tsdb/block_test.go +++ b/tsdb/block_test.go @@ -203,8 +203,8 @@ func TestLabelValuesWithMatchers(t *testing.T) { var seriesEntries []storage.Series for i := 0; i < 100; i++ { seriesEntries = append(seriesEntries, storage.NewListSeries(labels.Labels{ - {Name: "unique", Value: fmt.Sprintf("value%d", i)}, {Name: "tens", Value: fmt.Sprintf("value%d", i/10)}, + {Name: "unique", Value: fmt.Sprintf("value%d", i)}, }, []tsdbutil.Sample{sample{100, 0}})) } @@ -357,10 +357,12 @@ func BenchmarkLabelValuesWithMatchers(b *testing.B) { var seriesEntries []storage.Series metricCount := 1000000 for i := 0; i < metricCount; i++ { + // Note these series are not created in sort order: 'value2' sorts after 'value10'. + // This makes a big difference to the benchmark timing. seriesEntries = append(seriesEntries, storage.NewListSeries(labels.Labels{ - {Name: "unique", Value: fmt.Sprintf("value%d", i)}, - {Name: "tens", Value: fmt.Sprintf("value%d", i/(metricCount/10))}, - {Name: "ninety", Value: fmt.Sprintf("value%d", i/(metricCount/10)/9)}, // "0" for the first 90%, then "1" + {Name: "a_unique", Value: fmt.Sprintf("value%d", i)}, + {Name: "b_tens", Value: fmt.Sprintf("value%d", i/(metricCount/10))}, + {Name: "c_ninety", Value: fmt.Sprintf("value%d", i/(metricCount/10)/9)}, // "0" for the first 90%, then "1" }, []tsdbutil.Sample{sample{100, 0}})) } @@ -378,13 +380,13 @@ func BenchmarkLabelValuesWithMatchers(b *testing.B) { require.NoError(b, err) defer func() { require.NoError(b, indexReader.Close()) }() - matchers := []*labels.Matcher{labels.MustNewMatcher(labels.MatchEqual, "ninety", "value0")} + matchers := []*labels.Matcher{labels.MustNewMatcher(labels.MatchEqual, "c_ninety", "value0")} b.ResetTimer() b.ReportAllocs() for benchIdx := 0; benchIdx < b.N; benchIdx++ { - actualValues, err := indexReader.LabelValues("tens", matchers...) + actualValues, err := indexReader.LabelValues("b_tens", matchers...) require.NoError(b, err) require.Equal(b, 9, len(actualValues)) } @@ -401,16 +403,16 @@ func TestLabelNamesWithMatchers(t *testing.T) { if i%10 == 0 { seriesEntries = append(seriesEntries, storage.NewListSeries(labels.Labels{ - {Name: "unique", Value: fmt.Sprintf("value%d", i)}, {Name: "tens", Value: fmt.Sprintf("value%d", i/10)}, + {Name: "unique", Value: fmt.Sprintf("value%d", i)}, }, []tsdbutil.Sample{sample{100, 0}})) } if i%20 == 0 { seriesEntries = append(seriesEntries, storage.NewListSeries(labels.Labels{ - {Name: "unique", Value: fmt.Sprintf("value%d", i)}, {Name: "tens", Value: fmt.Sprintf("value%d", i/10)}, {Name: "twenties", Value: fmt.Sprintf("value%d", i/20)}, + {Name: "unique", Value: fmt.Sprintf("value%d", i)}, }, []tsdbutil.Sample{sample{100, 0}})) } diff --git a/tsdb/exemplar_test.go b/tsdb/exemplar_test.go index 30c497426fc..d04dbd17853 100644 --- a/tsdb/exemplar_test.go +++ b/tsdb/exemplar_test.go @@ -330,8 +330,8 @@ func TestSelectExemplar_DuplicateSeries(t *testing.T) { } l := labels.Labels{ - {Name: "service", Value: "asdf"}, {Name: "cluster", Value: "us-central1"}, + {Name: "service", Value: "asdf"}, } // Lets just assume somehow the PromQL expression generated two separate lists of matchers, diff --git a/tsdb/head_test.go b/tsdb/head_test.go index 7a2c4399941..deda89939fd 100644 --- a/tsdb/head_test.go +++ b/tsdb/head_test.go @@ -2228,8 +2228,8 @@ func TestHeadLabelValuesWithMatchers(t *testing.T) { app := head.Appender(context.Background()) for i := 0; i < 100; i++ { _, err := app.Append(0, labels.Labels{ - {Name: "unique", Value: fmt.Sprintf("value%d", i)}, {Name: "tens", Value: fmt.Sprintf("value%d", i/10)}, + {Name: "unique", Value: fmt.Sprintf("value%d", i)}, }, 100, 0) require.NoError(t, err) } @@ -2295,17 +2295,17 @@ func TestHeadLabelNamesWithMatchers(t *testing.T) { if i%10 == 0 { _, err := app.Append(0, labels.Labels{ - {Name: "unique", Value: fmt.Sprintf("value%d", i)}, {Name: "tens", Value: fmt.Sprintf("value%d", i/10)}, + {Name: "unique", Value: fmt.Sprintf("value%d", i)}, }, 100, 0) require.NoError(t, err) } if i%20 == 0 { _, err := app.Append(0, labels.Labels{ - {Name: "unique", Value: fmt.Sprintf("value%d", i)}, {Name: "tens", Value: fmt.Sprintf("value%d", i/10)}, {Name: "twenties", Value: fmt.Sprintf("value%d", i/20)}, + {Name: "unique", Value: fmt.Sprintf("value%d", i)}, }, 100, 0) require.NoError(t, err) } @@ -2448,23 +2448,25 @@ func BenchmarkHeadLabelValuesWithMatchers(b *testing.B) { metricCount := 1000000 for i := 0; i < metricCount; i++ { + // Note these series are not created in sort order: 'value2' sorts after 'value10'. + // This makes a big difference to the benchmark timing. _, err := app.Append(0, labels.Labels{ - {Name: "unique", Value: fmt.Sprintf("value%d", i)}, - {Name: "tens", Value: fmt.Sprintf("value%d", i/(metricCount/10))}, - {Name: "ninety", Value: fmt.Sprintf("value%d", i/(metricCount/10)/9)}, // "0" for the first 90%, then "1" + {Name: "a_unique", Value: fmt.Sprintf("value%d", i)}, + {Name: "b_tens", Value: fmt.Sprintf("value%d", i/(metricCount/10))}, + {Name: "c_ninety", Value: fmt.Sprintf("value%d", i/(metricCount/10)/9)}, // "0" for the first 90%, then "1" }, 100, 0) require.NoError(b, err) } require.NoError(b, app.Commit()) headIdxReader := head.indexRange(0, 200) - matchers := []*labels.Matcher{labels.MustNewMatcher(labels.MatchEqual, "ninety", "value0")} + matchers := []*labels.Matcher{labels.MustNewMatcher(labels.MatchEqual, "c_ninety", "value0")} b.ResetTimer() b.ReportAllocs() for benchIdx := 0; benchIdx < b.N; benchIdx++ { - actualValues, err := headIdxReader.LabelValues("tens", matchers...) + actualValues, err := headIdxReader.LabelValues("b_tens", matchers...) require.NoError(b, err) require.Equal(b, 9, len(actualValues)) } diff --git a/web/federate_test.go b/web/federate_test.go index 8bdef3fa8ea..d79a77f1997 100644 --- a/web/federate_test.go +++ b/web/federate_test.go @@ -162,7 +162,7 @@ test_metric_without_labels{instance=""} 1001 6000000 }, "external labels are added if not already present": { params: "match[]={__name__=~'.%2b'}", // '%2b' is an URL-encoded '+'. - externalLabels: labels.Labels{{Name: "zone", Value: "ie"}, {Name: "foo", Value: "baz"}}, + externalLabels: labels.Labels{{Name: "foo", Value: "baz"}, {Name: "zone", Value: "ie"}}, code: 200, body: `# TYPE test_metric1 untyped test_metric1{foo="bar",instance="i",zone="ie"} 10000 6000000 From 41630b8e8835585098f345b0d9740d7107ffb6eb Mon Sep 17 00:00:00 2001 From: Alban Hurtaud Date: Fri, 6 May 2022 00:42:04 +0200 Subject: [PATCH 047/135] Add hidden flag to configure discovery loop interval (#10634) * Add hidden flag to configure discovery loop interval Signed-off-by: Alban HURTAUD --- cmd/prometheus/main.go | 3 +++ scrape/manager.go | 11 ++++++++++- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/cmd/prometheus/main.go b/cmd/prometheus/main.go index c0848c766a8..4c6d2c4a89e 100644 --- a/cmd/prometheus/main.go +++ b/cmd/prometheus/main.go @@ -387,6 +387,9 @@ func main() { serverOnlyFlag(a, "query.max-samples", "Maximum number of samples a single query can load into memory. Note that queries will fail if they try to load more samples than this into memory, so this also limits the number of samples a query can return."). Default("50000000").IntVar(&cfg.queryMaxSamples) + a.Flag("scrape.discovery-reload-interval", "Interval used by scrape manager to throttle target groups updates."). + Hidden().Default("5s").SetValue(&cfg.scrape.DiscoveryReloadInterval) + a.Flag("enable-feature", "Comma separated feature names to enable. Valid options: agent, exemplar-storage, expand-external-labels, memory-snapshot-on-shutdown, promql-at-modifier, promql-negative-offset, promql-per-step-stats, remote-write-receiver (DEPRECATED), extra-scrape-metrics, new-service-discovery-manager, auto-gomaxprocs. See https://prometheus.io/docs/prometheus/latest/feature_flags/ for more details."). Default("").StringsVar(&cfg.featureList) diff --git a/scrape/manager.go b/scrape/manager.go index dc85f17bb51..92ecbc31d4d 100644 --- a/scrape/manager.go +++ b/scrape/manager.go @@ -25,6 +25,7 @@ import ( "github.com/pkg/errors" "github.com/prometheus/client_golang/prometheus" config_util "github.com/prometheus/common/config" + "github.com/prometheus/common/model" "github.com/prometheus/prometheus/config" "github.com/prometheus/prometheus/discovery/targetgroup" @@ -127,6 +128,8 @@ type Options struct { // Option used by downstream scraper users like OpenTelemetry Collector // to help lookup metric metadata. Should be false for Prometheus. PassMetadataInContext bool + // Option to increase the interval used by scrape manager to throttle target groups updates. + DiscoveryReloadInterval model.Duration // Optional HTTP client options to use when scraping. HTTPClientOptions []config_util.HTTPClientOption @@ -170,7 +173,13 @@ func (m *Manager) Run(tsets <-chan map[string][]*targetgroup.Group) error { } func (m *Manager) reloader() { - ticker := time.NewTicker(5 * time.Second) + reloadIntervalDuration := m.opts.DiscoveryReloadInterval + if reloadIntervalDuration < model.Duration(5*time.Second) { + reloadIntervalDuration = model.Duration(5 * time.Second) + } + + ticker := time.NewTicker(time.Duration(reloadIntervalDuration)) + defer ticker.Stop() for { From 88f9b248b45a14f76a6b2353c4addbd1e2026815 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Mierzwa?= Date: Thu, 5 May 2022 23:42:31 +0100 Subject: [PATCH 048/135] Correctly format error message (#10669) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Łukasz Mierzwa --- tsdb/chunks/head_chunks.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tsdb/chunks/head_chunks.go b/tsdb/chunks/head_chunks.go index c4b784bea42..edd7dd5419c 100644 --- a/tsdb/chunks/head_chunks.go +++ b/tsdb/chunks/head_chunks.go @@ -656,7 +656,7 @@ func (cdm *ChunkDiskMapper) Chunk(ref ChunkDiskMapperRef) (chunkenc.Chunk, error return nil, &CorruptionErr{ Dir: cdm.dir.Name(), FileIndex: sgmIndex, - Err: errors.New("head chunk file index %d does not exist on disk"), + Err: errors.Errorf("head chunk file index %d does not exist on disk", sgmIndex), } } From a62a9e49429e9dc9d413ee4a34e69603c7a58dec Mon Sep 17 00:00:00 2001 From: SuperQ Date: Fri, 6 May 2022 09:59:59 +0200 Subject: [PATCH 049/135] Relax yamllint Relax indentation to allow non-indented sequences. This helps with generated yaml linke the snmp_exporter config output. Signed-off-by: SuperQ --- .yamllint | 1 + 1 file changed, 1 insertion(+) diff --git a/.yamllint b/.yamllint index 281c9464634..3878a31d308 100644 --- a/.yamllint +++ b/.yamllint @@ -14,6 +14,7 @@ rules: document-start: disable indentation: spaces: consistent + indent-sequences: consistent key-duplicates: ignore: | config/testdata/section_key_dup.bad.yml From 78f264578722493dcd8bf25c43bde7865a18792f Mon Sep 17 00:00:00 2001 From: Matthias Rampke Date: Sun, 8 May 2022 22:39:26 +0000 Subject: [PATCH 050/135] test(tsdb): break up repeated test to avoid timeout (#10671) On macOS, the TestTombstoneCleanRetentionLimitsRace performs very poorly. It takes more than a second to write out one block, and as it writes 400 of them, we run into the 10-minute test timeout frequently. While this doesn't fix the actual performance issue, breaking each iteration into a subtest makes the test pass reliably (because each iteration comfortably finishes in under a minute). Related report: https://groups.google.com/g/prometheus-developers/c/jxQ6Ayg6VJ4/m/03H_DS9PDAAJ Signed-off-by: Matthias Rampke --- tsdb/db_test.go | 58 +++++++++++++++++++++++++------------------------ 1 file changed, 30 insertions(+), 28 deletions(-) diff --git a/tsdb/db_test.go b/tsdb/db_test.go index 655cf9dacdb..ce772acddef 100644 --- a/tsdb/db_test.go +++ b/tsdb/db_test.go @@ -1281,38 +1281,40 @@ func TestTombstoneCleanRetentionLimitsRace(t *testing.T) { // // That is something tricky to trigger, so let's try several times just to make sure. for i := 0; i < 20; i++ { - db := openTestDB(t, opts, nil) - totalBlocks := 20 - dbDir := db.Dir() - // Generate some blocks with old mint (near epoch). - for j := 0; j < totalBlocks; j++ { - blockDir := createBlock(t, dbDir, genSeries(10, 1, int64(j), int64(j)+1)) - block, err := OpenBlock(nil, blockDir, nil) - require.NoError(t, err) - // Cover block with tombstones so it can be deleted with CleanTombstones() as well. - tomb := tombstones.NewMemTombstones() - tomb.AddInterval(0, tombstones.Interval{Mint: int64(j), Maxt: int64(j) + 1}) - block.tombstones = tomb + t.Run(fmt.Sprintf("iteration%d", i), func(t *testing.T) { + db := openTestDB(t, opts, nil) + totalBlocks := 20 + dbDir := db.Dir() + // Generate some blocks with old mint (near epoch). + for j := 0; j < totalBlocks; j++ { + blockDir := createBlock(t, dbDir, genSeries(10, 1, int64(j), int64(j)+1)) + block, err := OpenBlock(nil, blockDir, nil) + require.NoError(t, err) + // Cover block with tombstones so it can be deleted with CleanTombstones() as well. + tomb := tombstones.NewMemTombstones() + tomb.AddInterval(0, tombstones.Interval{Mint: int64(j), Maxt: int64(j) + 1}) + block.tombstones = tomb - db.blocks = append(db.blocks, block) - } + db.blocks = append(db.blocks, block) + } - wg.Add(2) - // Run reload and CleanTombstones together, with a small time window randomization - go func() { - defer wg.Done() - time.Sleep(time.Duration(rand.Float64() * 100 * float64(time.Millisecond))) - require.NoError(t, db.reloadBlocks()) - }() - go func() { - defer wg.Done() - time.Sleep(time.Duration(rand.Float64() * 100 * float64(time.Millisecond))) - require.NoError(t, db.CleanTombstones()) - }() + wg.Add(2) + // Run reload and CleanTombstones together, with a small time window randomization + go func() { + defer wg.Done() + time.Sleep(time.Duration(rand.Float64() * 100 * float64(time.Millisecond))) + require.NoError(t, db.reloadBlocks()) + }() + go func() { + defer wg.Done() + time.Sleep(time.Duration(rand.Float64() * 100 * float64(time.Millisecond))) + require.NoError(t, db.CleanTombstones()) + }() - wg.Wait() + wg.Wait() - require.NoError(t, db.Close()) + require.NoError(t, db.Close()) + }) } } From c40e269c3e514953299e9ba1f6265e067ab43e64 Mon Sep 17 00:00:00 2001 From: TJ Hoplock <33664289+tjhop@users.noreply.github.com> Date: Wed, 11 May 2022 10:54:08 -0400 Subject: [PATCH 051/135] feat: add linode SD failure count metric (#10673) This commit introduces a new metric to count the number of failed requests to Linode's API when using Linode SD. Resolves #10672, inspired by #10476. _Note_: this doens't count failures when polling the `/account/events` endpoint, as a `401` there is how we determine if the supplied token has the needed API scopes to do event polling vs full refreshes each interval. Signed-off-by: TJ Hoplock --- discovery/linode/linode.go | 24 ++++++++++++++++++------ 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/discovery/linode/linode.go b/discovery/linode/linode.go index a673b44c686..0fd0a2c3701 100644 --- a/discovery/linode/linode.go +++ b/discovery/linode/linode.go @@ -25,6 +25,7 @@ import ( "github.com/go-kit/log" "github.com/linode/linodego" + "github.com/prometheus/client_golang/prometheus" "github.com/prometheus/common/config" "github.com/prometheus/common/model" "github.com/prometheus/common/version" @@ -65,15 +66,24 @@ const ( ) // DefaultSDConfig is the default Linode SD configuration. -var DefaultSDConfig = SDConfig{ - TagSeparator: ",", - Port: 80, - RefreshInterval: model.Duration(60 * time.Second), - HTTPClientConfig: config.DefaultHTTPClientConfig, -} +var ( + DefaultSDConfig = SDConfig{ + TagSeparator: ",", + Port: 80, + RefreshInterval: model.Duration(60 * time.Second), + HTTPClientConfig: config.DefaultHTTPClientConfig, + } + + failuresCount = prometheus.NewCounter( + prometheus.CounterOpts{ + Name: "prometheus_sd_linode_failures_total", + Help: "Number of Linode service discovery refresh failures.", + }) +) func init() { discovery.RegisterConfig(&SDConfig{}) + prometheus.MustRegister(failuresCount) } // SDConfig is the configuration for Linode based service discovery. @@ -211,12 +221,14 @@ func (d *Discovery) refreshData(ctx context.Context) ([]*targetgroup.Group, erro // Gather all linode instances. instances, err := d.client.ListInstances(ctx, &linodego.ListOptions{PageSize: 500}) if err != nil { + failuresCount.Inc() return nil, err } // Gather detailed IP address info for all IPs on all linode instances. detailedIPs, err := d.client.ListIPAddresses(ctx, &linodego.ListOptions{PageSize: 500}) if err != nil { + failuresCount.Inc() return nil, err } From 6e3a0efe40918f72edfc89bc150bc0ece1a8c46f Mon Sep 17 00:00:00 2001 From: Julien Pivotto Date: Thu, 12 May 2022 09:12:05 +0200 Subject: [PATCH 052/135] Make necessary change to compile promql parser to wasm (#10683) Signed-off-by: Julien Pivotto --- tsdb/fileutil/flock_js.go | 34 ++++++++++++++++++++++++++++++++++ tsdb/fileutil/mmap_js.go | 30 ++++++++++++++++++++++++++++++ tsdb/fileutil/mmap_unix.go | 4 ++-- 3 files changed, 66 insertions(+), 2 deletions(-) create mode 100644 tsdb/fileutil/flock_js.go create mode 100644 tsdb/fileutil/mmap_js.go diff --git a/tsdb/fileutil/flock_js.go b/tsdb/fileutil/flock_js.go new file mode 100644 index 00000000000..c1876d4bb73 --- /dev/null +++ b/tsdb/fileutil/flock_js.go @@ -0,0 +1,34 @@ +// Copyright 2022 The Prometheus Authors +// 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. + +//go:build js +// +build js + +package fileutil + +import "errors" + +type unixLock struct { +} + +func (l *unixLock) Release() error { + return errors.New("unsupported") +} + +func (l *unixLock) set(lock bool) error { + return errors.New("unsupported") +} + +func newLock(fileName string) (Releaser, error) { + return nil, errors.New("unsupported") +} diff --git a/tsdb/fileutil/mmap_js.go b/tsdb/fileutil/mmap_js.go new file mode 100644 index 00000000000..0c666e8bf5a --- /dev/null +++ b/tsdb/fileutil/mmap_js.go @@ -0,0 +1,30 @@ +// Copyright 2022 The Prometheus Authors +// 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. + +//go:build js +// +build js + +package fileutil + +import ( + "errors" + "os" +) + +func mmap(f *os.File, length int) ([]byte, error) { + return nil, errors.New("unsupported") +} + +func munmap(b []byte) (err error) { + return errors.New("unsupported") +} diff --git a/tsdb/fileutil/mmap_unix.go b/tsdb/fileutil/mmap_unix.go index 9365c62f746..1fd7f48ff58 100644 --- a/tsdb/fileutil/mmap_unix.go +++ b/tsdb/fileutil/mmap_unix.go @@ -11,8 +11,8 @@ // See the License for the specific language governing permissions and // limitations under the License. -//go:build !windows && !plan9 -// +build !windows,!plan9 +//go:build !windows && !plan9 && !js +// +build !windows,!plan9,!js package fileutil From 6bc5186f58d566f0fd6e837e0f09501c01e52552 Mon Sep 17 00:00:00 2001 From: Augustin Husson Date: Fri, 13 May 2022 14:49:38 +0200 Subject: [PATCH 053/135] run sequentially the unit test in codemirror (#10692) Signed-off-by: Augustin Husson --- web/ui/module/codemirror-promql/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web/ui/module/codemirror-promql/package.json b/web/ui/module/codemirror-promql/package.json index fc9837f9de0..9e66f4d759e 100644 --- a/web/ui/module/codemirror-promql/package.json +++ b/web/ui/module/codemirror-promql/package.json @@ -8,7 +8,7 @@ "scripts": { "build": "npm run build:lib", "build:lib": "bash ./build.sh", - "test": "NODE_OPTIONS=--experimental-vm-modules jest", + "test": "NODE_OPTIONS=--experimental-vm-modules jest --runInBand", "lint": "eslint src/ --ext .ts", "lint:fix": "eslint --fix src/ --ext .ts" }, From ff3ba1367719cc9fb232112d26be7879351de33d Mon Sep 17 00:00:00 2001 From: Augustin Husson Date: Tue, 17 May 2022 09:04:57 +0200 Subject: [PATCH 054/135] bump @nexucis/kvsearch v0.6.0 (#10702) Signed-off-by: Augustin Husson --- web/ui/package-lock.json | 16 ++++++++-------- web/ui/react-app/package.json | 2 +- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/web/ui/package-lock.json b/web/ui/package-lock.json index 151912d9e57..df1bd4eeafd 100644 --- a/web/ui/package-lock.json +++ b/web/ui/package-lock.json @@ -2969,9 +2969,9 @@ "integrity": "sha512-Z1+ADKY0fxdBE28REraWhUCNy+Bp5UmpK3Tc/5wdCDpY+6fXh8l2csMtbPGaqEBsyGLxJz9wUYGCf+CW9unyvQ==" }, "node_modules/@nexucis/kvsearch": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/@nexucis/kvsearch/-/kvsearch-0.5.0.tgz", - "integrity": "sha512-7TtH+Ug7o7Cjm8HogsXCgq8JNihINE0zZj7JMJXF5PxhF7MhwC9yHe6Gm4+ckt6seOXOFf+g/cZ6hWtVMiR3cQ==", + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/@nexucis/kvsearch/-/kvsearch-0.6.0.tgz", + "integrity": "sha512-sv2WWXUMRMoM2g3y02m4+9MK08l9nposveNqn5sPKSGpgZ0DxvmD84SAJHb0SvVazgL31C85kST2kySpF0+/Dw==", "dependencies": { "@nexucis/fuzzy": "^0.3.0" } @@ -17341,7 +17341,7 @@ "@fortawesome/free-solid-svg-icons": "6.1.1", "@fortawesome/react-fontawesome": "0.1.17", "@nexucis/fuzzy": "^0.3.0", - "@nexucis/kvsearch": "^0.5.0", + "@nexucis/kvsearch": "^0.6.0", "bootstrap": "^4.6.1", "codemirror-promql": "0.19.0", "css.escape": "^1.5.1", @@ -19509,9 +19509,9 @@ "integrity": "sha512-Z1+ADKY0fxdBE28REraWhUCNy+Bp5UmpK3Tc/5wdCDpY+6fXh8l2csMtbPGaqEBsyGLxJz9wUYGCf+CW9unyvQ==" }, "@nexucis/kvsearch": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/@nexucis/kvsearch/-/kvsearch-0.5.0.tgz", - "integrity": "sha512-7TtH+Ug7o7Cjm8HogsXCgq8JNihINE0zZj7JMJXF5PxhF7MhwC9yHe6Gm4+ckt6seOXOFf+g/cZ6hWtVMiR3cQ==", + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/@nexucis/kvsearch/-/kvsearch-0.6.0.tgz", + "integrity": "sha512-sv2WWXUMRMoM2g3y02m4+9MK08l9nposveNqn5sPKSGpgZ0DxvmD84SAJHb0SvVazgL31C85kST2kySpF0+/Dw==", "requires": { "@nexucis/fuzzy": "^0.3.0" } @@ -23964,7 +23964,7 @@ "@fortawesome/free-solid-svg-icons": "6.1.1", "@fortawesome/react-fontawesome": "0.1.17", "@nexucis/fuzzy": "^0.3.0", - "@nexucis/kvsearch": "^0.5.0", + "@nexucis/kvsearch": "^0.6.0", "@testing-library/react-hooks": "^7.0.1", "@types/enzyme": "^3.10.10", "@types/flot": "0.0.32", diff --git a/web/ui/react-app/package.json b/web/ui/react-app/package.json index 0bbab0ade60..371dda379b5 100644 --- a/web/ui/react-app/package.json +++ b/web/ui/react-app/package.json @@ -20,7 +20,7 @@ "@fortawesome/free-solid-svg-icons": "6.1.1", "@fortawesome/react-fontawesome": "0.1.17", "@nexucis/fuzzy": "^0.3.0", - "@nexucis/kvsearch": "^0.5.0", + "@nexucis/kvsearch": "^0.6.0", "bootstrap": "^4.6.1", "codemirror-promql": "0.19.0", "css.escape": "^1.5.1", From 707600d84f5567354ef48d4593ddab84c4837811 Mon Sep 17 00:00:00 2001 From: wangxiaolei Date: Tue, 17 May 2022 16:20:58 +0800 Subject: [PATCH 055/135] web: Make the dev proxy work with newer Node.js versions (#10690) Signed-off-by: fatelei --- web/ui/package-lock.json | 80 ++++++++++++------------------ web/ui/react-app/package.json | 2 +- web/ui/react-app/src/setupProxy.js | 11 ++++ 3 files changed, 44 insertions(+), 49 deletions(-) create mode 100644 web/ui/react-app/src/setupProxy.js diff --git a/web/ui/package-lock.json b/web/ui/package-lock.json index df1bd4eeafd..ab51ad3d7a1 100644 --- a/web/ui/package-lock.json +++ b/web/ui/package-lock.json @@ -3617,7 +3617,7 @@ "version": "1.19.2", "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==", - "dev": true, + "devOptional": true, "dependencies": { "@types/connect": "*", "@types/node": "*" @@ -3645,7 +3645,7 @@ "version": "3.4.35", "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", - "dev": true, + "devOptional": true, "dependencies": { "@types/node": "*" } @@ -3700,7 +3700,7 @@ "version": "4.17.13", "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.13.tgz", "integrity": "sha512-6bSZTPaTIACxn48l50SR+axgrqm6qXFIxrdAKaG6PaJk3+zuUr35hBlgT7vOmJcum+OEaIBLtHV/qloEAFITeA==", - "dev": true, + "devOptional": true, "dependencies": { "@types/body-parser": "*", "@types/express-serve-static-core": "^4.17.18", @@ -3712,7 +3712,7 @@ "version": "4.17.28", "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.28.tgz", "integrity": "sha512-P1BJAEAW3E2DJUlkgq4tOL3RyMunoWXqbSCygWo5ZIWTjUgN1YnaXWW4VWl/oc8vs/XoYibEGBKP0uZyF4AHig==", - "dev": true, + "devOptional": true, "dependencies": { "@types/node": "*", "@types/qs": "*", @@ -3753,7 +3753,6 @@ "version": "1.17.8", "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.8.tgz", "integrity": "sha512-5kPLG5BKpWYkw/LVOGWpiq3nEVqxiN32rTgI53Sk12/xHFQ2rG3ehI9IO+O3W2QoKeyB92dJkoka8SUm6BX1pA==", - "dev": true, "dependencies": { "@types/node": "*" } @@ -3823,13 +3822,12 @@ "version": "1.3.2", "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz", "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==", - "dev": true + "devOptional": true }, "node_modules/@types/node": { "version": "17.0.23", "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.23.tgz", - "integrity": "sha512-UxDxWn7dl97rKVeVS61vErvw086aCYhDLyvRQZ5Rk65rZKepaFdm53GeqXaKBuOhED4e9uWq34IC3TdSdJJ2Gw==", - "dev": true + "integrity": "sha512-UxDxWn7dl97rKVeVS61vErvw086aCYhDLyvRQZ5Rk65rZKepaFdm53GeqXaKBuOhED4e9uWq34IC3TdSdJJ2Gw==" }, "node_modules/@types/parse-json": { "version": "4.0.0", @@ -3859,13 +3857,13 @@ "version": "6.9.7", "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==", - "dev": true + "devOptional": true }, "node_modules/@types/range-parser": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==", - "dev": true + "devOptional": true }, "node_modules/@types/react": { "version": "17.0.41", @@ -3984,7 +3982,7 @@ "version": "1.13.10", "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.10.tgz", "integrity": "sha512-nCkHGI4w7ZgAdNkrEu0bv+4xNV/XDqW+DydknebMOQwkpDGx8G+HTlj7R7ABI8i8nKxVw0wtKPi1D+lPOkh4YQ==", - "dev": true, + "devOptional": true, "dependencies": { "@types/mime": "^1", "@types/node": "*" @@ -7969,8 +7967,7 @@ "node_modules/eventemitter3": { "version": "4.0.7", "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", - "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", - "dev": true + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==" }, "node_modules/events": { "version": "3.3.0", @@ -8338,7 +8335,6 @@ "version": "1.14.9", "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.9.tgz", "integrity": "sha512-MQDfihBQYMcyy5dhRDJUHcw7lb2Pv/TuE6xP1vyraLukNDHKbDxDNaOE3NbCAdKQApno+GPRyo1YAp89yCjK4w==", - "dev": true, "funding": [ { "type": "individual", @@ -9080,7 +9076,6 @@ "version": "1.18.1", "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", - "dev": true, "dependencies": { "eventemitter3": "^4.0.0", "follow-redirects": "^1.0.0", @@ -9105,10 +9100,9 @@ } }, "node_modules/http-proxy-middleware": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.4.tgz", - "integrity": "sha512-m/4FxX17SUvz4lJ5WPXOHDUuCwIqXLfLHs1s0uZ3oYjhoXlx9csYxaOa0ElDEJ+h8Q4iJ1s+lTMbiCa4EXIJqg==", - "dev": true, + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz", + "integrity": "sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==", "dependencies": { "@types/http-proxy": "^1.17.8", "http-proxy": "^1.18.1", @@ -9542,7 +9536,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", - "dev": true, "engines": { "node": ">=10" }, @@ -11040,7 +11033,6 @@ "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" @@ -14235,8 +14227,7 @@ "node_modules/requires-port": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=", - "dev": true + "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=" }, "node_modules/resize-observer-polyfill": { "version": "1.5.1", @@ -17346,6 +17337,7 @@ "codemirror-promql": "0.19.0", "css.escape": "^1.5.1", "downshift": "^6.1.7", + "http-proxy-middleware": "^2.0.6", "jquery": "^3.5.1", "jquery.flot.tooltip": "^0.9.0", "moment": "^2.29.2", @@ -19941,7 +19933,7 @@ "version": "1.19.2", "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==", - "dev": true, + "devOptional": true, "requires": { "@types/connect": "*", "@types/node": "*" @@ -19969,7 +19961,7 @@ "version": "3.4.35", "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", - "dev": true, + "devOptional": true, "requires": { "@types/node": "*" } @@ -20024,7 +20016,7 @@ "version": "4.17.13", "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.13.tgz", "integrity": "sha512-6bSZTPaTIACxn48l50SR+axgrqm6qXFIxrdAKaG6PaJk3+zuUr35hBlgT7vOmJcum+OEaIBLtHV/qloEAFITeA==", - "dev": true, + "devOptional": true, "requires": { "@types/body-parser": "*", "@types/express-serve-static-core": "^4.17.18", @@ -20036,7 +20028,7 @@ "version": "4.17.28", "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.28.tgz", "integrity": "sha512-P1BJAEAW3E2DJUlkgq4tOL3RyMunoWXqbSCygWo5ZIWTjUgN1YnaXWW4VWl/oc8vs/XoYibEGBKP0uZyF4AHig==", - "dev": true, + "devOptional": true, "requires": { "@types/node": "*", "@types/qs": "*", @@ -20077,7 +20069,6 @@ "version": "1.17.8", "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.8.tgz", "integrity": "sha512-5kPLG5BKpWYkw/LVOGWpiq3nEVqxiN32rTgI53Sk12/xHFQ2rG3ehI9IO+O3W2QoKeyB92dJkoka8SUm6BX1pA==", - "dev": true, "requires": { "@types/node": "*" } @@ -20147,13 +20138,12 @@ "version": "1.3.2", "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz", "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==", - "dev": true + "devOptional": true }, "@types/node": { "version": "17.0.23", "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.23.tgz", - "integrity": "sha512-UxDxWn7dl97rKVeVS61vErvw086aCYhDLyvRQZ5Rk65rZKepaFdm53GeqXaKBuOhED4e9uWq34IC3TdSdJJ2Gw==", - "dev": true + "integrity": "sha512-UxDxWn7dl97rKVeVS61vErvw086aCYhDLyvRQZ5Rk65rZKepaFdm53GeqXaKBuOhED4e9uWq34IC3TdSdJJ2Gw==" }, "@types/parse-json": { "version": "4.0.0", @@ -20183,13 +20173,13 @@ "version": "6.9.7", "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==", - "dev": true + "devOptional": true }, "@types/range-parser": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==", - "dev": true + "devOptional": true }, "@types/react": { "version": "17.0.41", @@ -20307,7 +20297,7 @@ "version": "1.13.10", "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.10.tgz", "integrity": "sha512-nCkHGI4w7ZgAdNkrEu0bv+4xNV/XDqW+DydknebMOQwkpDGx8G+HTlj7R7ABI8i8nKxVw0wtKPi1D+lPOkh4YQ==", - "dev": true, + "devOptional": true, "requires": { "@types/mime": "^1", "@types/node": "*" @@ -23342,8 +23332,7 @@ "eventemitter3": { "version": "4.0.7", "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", - "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", - "dev": true + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==" }, "events": { "version": "3.3.0", @@ -23641,8 +23630,7 @@ "follow-redirects": { "version": "1.14.9", "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.9.tgz", - "integrity": "sha512-MQDfihBQYMcyy5dhRDJUHcw7lb2Pv/TuE6xP1vyraLukNDHKbDxDNaOE3NbCAdKQApno+GPRyo1YAp89yCjK4w==", - "dev": true + "integrity": "sha512-MQDfihBQYMcyy5dhRDJUHcw7lb2Pv/TuE6xP1vyraLukNDHKbDxDNaOE3NbCAdKQApno+GPRyo1YAp89yCjK4w==" }, "fork-ts-checker-webpack-plugin": { "version": "6.5.0", @@ -23984,6 +23972,7 @@ "enzyme": "^3.11.0", "enzyme-to-json": "^3.6.2", "fsevents": "^2.3.2", + "http-proxy-middleware": "^2.0.6", "jquery": "^3.5.1", "jquery.flot.tooltip": "^0.9.0", "moment": "^2.29.2", @@ -24241,7 +24230,6 @@ "version": "1.18.1", "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", - "dev": true, "requires": { "eventemitter3": "^4.0.0", "follow-redirects": "^1.0.0", @@ -24260,10 +24248,9 @@ } }, "http-proxy-middleware": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.4.tgz", - "integrity": "sha512-m/4FxX17SUvz4lJ5WPXOHDUuCwIqXLfLHs1s0uZ3oYjhoXlx9csYxaOa0ElDEJ+h8Q4iJ1s+lTMbiCa4EXIJqg==", - "dev": true, + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz", + "integrity": "sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==", "requires": { "@types/http-proxy": "^1.17.8", "http-proxy": "^1.18.1", @@ -24556,8 +24543,7 @@ "is-plain-obj": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", - "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", - "dev": true + "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==" }, "is-plain-object": { "version": "5.0.0", @@ -25736,7 +25722,6 @@ "version": "4.0.4", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", - "dev": true, "requires": { "braces": "^3.0.1", "picomatch": "^2.2.3" @@ -28005,8 +27990,7 @@ "requires-port": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=", - "dev": true + "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=" }, "resize-observer-polyfill": { "version": "1.5.1", diff --git a/web/ui/react-app/package.json b/web/ui/react-app/package.json index 371dda379b5..1a526d0e49a 100644 --- a/web/ui/react-app/package.json +++ b/web/ui/react-app/package.json @@ -25,6 +25,7 @@ "codemirror-promql": "0.19.0", "css.escape": "^1.5.1", "downshift": "^6.1.7", + "http-proxy-middleware": "^2.0.6", "jquery": "^3.5.1", "jquery.flot.tooltip": "^0.9.0", "moment": "^2.29.2", @@ -83,7 +84,6 @@ "mutationobserver-shim": "^0.3.7", "sinon": "^13.0.1" }, - "proxy": "http://localhost:9090", "jest": { "snapshotSerializers": [ "enzyme-to-json/serializer" diff --git a/web/ui/react-app/src/setupProxy.js b/web/ui/react-app/src/setupProxy.js new file mode 100644 index 00000000000..f7f54c4a271 --- /dev/null +++ b/web/ui/react-app/src/setupProxy.js @@ -0,0 +1,11 @@ +const { createProxyMiddleware } = require('http-proxy-middleware'); + +module.exports = function(app) { + app.use( + '/api', + createProxyMiddleware({ + target: 'http://localhost:9090', + changeOrigin: true, + }) + ); +}; From 4ece54852cafe9ac795ffa2d2b4facde7a7a8f1d Mon Sep 17 00:00:00 2001 From: Augustin Husson Date: Fri, 20 May 2022 09:22:09 +0200 Subject: [PATCH 056/135] bump nexucis deps (#10713) Signed-off-by: Augustin Husson --- web/ui/package-lock.json | 36 +++++++++++++++++------------------ web/ui/react-app/package.json | 4 ++-- 2 files changed, 20 insertions(+), 20 deletions(-) diff --git a/web/ui/package-lock.json b/web/ui/package-lock.json index ab51ad3d7a1..a7d6d74e396 100644 --- a/web/ui/package-lock.json +++ b/web/ui/package-lock.json @@ -2964,16 +2964,16 @@ } }, "node_modules/@nexucis/fuzzy": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@nexucis/fuzzy/-/fuzzy-0.3.0.tgz", - "integrity": "sha512-Z1+ADKY0fxdBE28REraWhUCNy+Bp5UmpK3Tc/5wdCDpY+6fXh8l2csMtbPGaqEBsyGLxJz9wUYGCf+CW9unyvQ==" + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@nexucis/fuzzy/-/fuzzy-0.4.0.tgz", + "integrity": "sha512-VZVzETBXJjFzTd5RmKR+X8V5uM9PKM2yyb7v/aygMF+1iAnZwxzQtxbFx358SNP23eid4s85TIREHw50p8Zugg==" }, "node_modules/@nexucis/kvsearch": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/@nexucis/kvsearch/-/kvsearch-0.6.0.tgz", - "integrity": "sha512-sv2WWXUMRMoM2g3y02m4+9MK08l9nposveNqn5sPKSGpgZ0DxvmD84SAJHb0SvVazgL31C85kST2kySpF0+/Dw==", + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/@nexucis/kvsearch/-/kvsearch-0.7.0.tgz", + "integrity": "sha512-Zl1u0wUpgpfY1JmHIKyLuqDdN5iTm/wuLXbBbm//Qck/un9ivGYtePpT1/BjG/2XisBsvHb7EldMAuRQaUahtg==", "dependencies": { - "@nexucis/fuzzy": "^0.3.0" + "@nexucis/fuzzy": "^0.4.0" } }, "node_modules/@nodelib/fs.scandir": { @@ -17331,8 +17331,8 @@ "@fortawesome/fontawesome-svg-core": "6.1.1", "@fortawesome/free-solid-svg-icons": "6.1.1", "@fortawesome/react-fontawesome": "0.1.17", - "@nexucis/fuzzy": "^0.3.0", - "@nexucis/kvsearch": "^0.6.0", + "@nexucis/fuzzy": "^0.4.0", + "@nexucis/kvsearch": "^0.7.0", "bootstrap": "^4.6.1", "codemirror-promql": "0.19.0", "css.escape": "^1.5.1", @@ -19496,16 +19496,16 @@ } }, "@nexucis/fuzzy": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@nexucis/fuzzy/-/fuzzy-0.3.0.tgz", - "integrity": "sha512-Z1+ADKY0fxdBE28REraWhUCNy+Bp5UmpK3Tc/5wdCDpY+6fXh8l2csMtbPGaqEBsyGLxJz9wUYGCf+CW9unyvQ==" + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@nexucis/fuzzy/-/fuzzy-0.4.0.tgz", + "integrity": "sha512-VZVzETBXJjFzTd5RmKR+X8V5uM9PKM2yyb7v/aygMF+1iAnZwxzQtxbFx358SNP23eid4s85TIREHw50p8Zugg==" }, "@nexucis/kvsearch": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/@nexucis/kvsearch/-/kvsearch-0.6.0.tgz", - "integrity": "sha512-sv2WWXUMRMoM2g3y02m4+9MK08l9nposveNqn5sPKSGpgZ0DxvmD84SAJHb0SvVazgL31C85kST2kySpF0+/Dw==", + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/@nexucis/kvsearch/-/kvsearch-0.7.0.tgz", + "integrity": "sha512-Zl1u0wUpgpfY1JmHIKyLuqDdN5iTm/wuLXbBbm//Qck/un9ivGYtePpT1/BjG/2XisBsvHb7EldMAuRQaUahtg==", "requires": { - "@nexucis/fuzzy": "^0.3.0" + "@nexucis/fuzzy": "^0.4.0" } }, "@nodelib/fs.scandir": { @@ -23951,8 +23951,8 @@ "@fortawesome/fontawesome-svg-core": "6.1.1", "@fortawesome/free-solid-svg-icons": "6.1.1", "@fortawesome/react-fontawesome": "0.1.17", - "@nexucis/fuzzy": "^0.3.0", - "@nexucis/kvsearch": "^0.6.0", + "@nexucis/fuzzy": "^0.4.0", + "@nexucis/kvsearch": "^0.7.0", "@testing-library/react-hooks": "^7.0.1", "@types/enzyme": "^3.10.10", "@types/flot": "0.0.32", diff --git a/web/ui/react-app/package.json b/web/ui/react-app/package.json index 1a526d0e49a..ee2dc8ed772 100644 --- a/web/ui/react-app/package.json +++ b/web/ui/react-app/package.json @@ -19,8 +19,8 @@ "@fortawesome/fontawesome-svg-core": "6.1.1", "@fortawesome/free-solid-svg-icons": "6.1.1", "@fortawesome/react-fontawesome": "0.1.17", - "@nexucis/fuzzy": "^0.3.0", - "@nexucis/kvsearch": "^0.6.0", + "@nexucis/fuzzy": "^0.4.0", + "@nexucis/kvsearch": "^0.7.0", "bootstrap": "^4.6.1", "codemirror-promql": "0.19.0", "css.escape": "^1.5.1", From 89de30a0b754f4eb54fb543037683f3db6cda109 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Mierzwa?= Date: Fri, 20 May 2022 09:18:31 +0100 Subject: [PATCH 057/135] Avoid reallocating map in MatchLabels (#10715) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit We know the max size of our map so we can create it with that information and avoid extra allocations Signed-off-by: Łukasz Mierzwa --- model/labels/labels.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/model/labels/labels.go b/model/labels/labels.go index f1226c0b0c5..34bb878d189 100644 --- a/model/labels/labels.go +++ b/model/labels/labels.go @@ -119,7 +119,7 @@ func (ls *Labels) UnmarshalYAML(unmarshal func(interface{}) error) error { func (ls Labels) MatchLabels(on bool, names ...string) Labels { matchedLabels := Labels{} - nameSet := map[string]struct{}{} + nameSet := make(map[string]struct{}, len(names)) for _, n := range names { nameSet[n] = struct{}{} } From e22b54e253c8d5b90404d19dd7adb585b406b1e4 Mon Sep 17 00:00:00 2001 From: Ivo Gosemann Date: Fri, 20 May 2022 12:24:19 +0200 Subject: [PATCH 058/135] Adds day_of_year function to PromQL Signed-off-by: Ivo Gosemann --- docs/querying/functions.md | 6 ++++++ promql/functions.go | 10 +++++++++- promql/parser/functions.go | 6 ++++++ promql/testdata/functions.test | 14 ++++++++++++++ .../codemirror-promql/src/complete/promql.terms.ts | 6 ++++++ web/ui/module/codemirror-promql/src/promql.ts | 2 +- .../module/codemirror-promql/src/types/function.ts | 7 +++++++ web/ui/module/lezer-promql/src/promql.grammar | 2 ++ 8 files changed, 51 insertions(+), 2 deletions(-) diff --git a/docs/querying/functions.md b/docs/querying/functions.md index 1de8bb2aa9c..94bd48632ef 100644 --- a/docs/querying/functions.md +++ b/docs/querying/functions.md @@ -103,6 +103,12 @@ for each of the given times in UTC. Returned values are from 1 to 31. each of the given times in UTC. Returned values are from 0 to 6, where 0 means Sunday etc. +## `day_of_year()` + +`day_of_year(v=vector(time()) instant-vector)` returns the day of the year for +each of the given times in UTC. Returned values are from 1 to 365 for non-leap years, +and 1 to 366 in leap years. + ## `days_in_month()` `days_in_month(v=vector(time()) instant-vector)` returns number of days in the diff --git a/promql/functions.go b/promql/functions.go index 423c33f6637..0b3a04251e6 100644 --- a/promql/functions.go +++ b/promql/functions.go @@ -1038,6 +1038,13 @@ func funcDayOfWeek(vals []parser.Value, args parser.Expressions, enh *EvalNodeHe }) } +// === day_of_year(v Vector) Scalar === +func funcDayOfYear(vals []parser.Value, args parser.Expressions, enh *EvalNodeHelper) Vector { + return dateWrapper(vals, enh, func(t time.Time) float64 { + return float64(t.YearDay()) + }) +} + // === hour(v Vector) Scalar === func funcHour(vals []parser.Value, args parser.Expressions, enh *EvalNodeHelper) Vector { return dateWrapper(vals, enh, func(t time.Time) float64 { @@ -1089,6 +1096,7 @@ var FunctionCalls = map[string]FunctionCall{ "days_in_month": funcDaysInMonth, "day_of_month": funcDayOfMonth, "day_of_week": funcDayOfWeek, + "day_of_year": funcDayOfYear, "deg": funcDeg, "delta": funcDelta, "deriv": funcDeriv, @@ -1143,7 +1151,7 @@ var FunctionCalls = map[string]FunctionCall{ // that can also change with change in eval time. var AtModifierUnsafeFunctions = map[string]struct{}{ // Step invariant functions. - "days_in_month": {}, "day_of_month": {}, "day_of_week": {}, + "days_in_month": {}, "day_of_month": {}, "day_of_week": {}, "day_of_year": {}, "hour": {}, "minute": {}, "month": {}, "year": {}, "predict_linear": {}, "time": {}, // Uses timestamp of the argument for the result, diff --git a/promql/parser/functions.go b/promql/parser/functions.go index c4bc5ddb8d2..92afff8b238 100644 --- a/promql/parser/functions.go +++ b/promql/parser/functions.go @@ -132,6 +132,12 @@ var Functions = map[string]*Function{ Variadic: 1, ReturnType: ValueTypeVector, }, + "day_of_year": { + Name: "day_of_year", + ArgTypes: []ValueType{ValueTypeVector}, + Variadic: 1, + ReturnType: ValueTypeVector, + }, "deg": { Name: "deg", ArgTypes: []ValueType{ValueTypeVector}, diff --git a/promql/testdata/functions.test b/promql/testdata/functions.test index b216c42c7bb..02e6a32190e 100644 --- a/promql/testdata/functions.test +++ b/promql/testdata/functions.test @@ -704,6 +704,12 @@ eval instant at 0m day_of_month() eval instant at 0m day_of_month(vector(1136239445)) {} 2 +eval instant at 0m day_of_year() + {} 1 + +eval instant at 0m day_of_year(vector(1136239445)) + {} 2 + # Thursday. eval instant at 0m day_of_week() {} 4 @@ -739,6 +745,14 @@ eval instant at 0m month(vector(1456790399)) + day_of_month(vector(1456790399)) eval instant at 0m month(vector(1456790400)) + day_of_month(vector(1456790400)) / 100 {} 3.01 +# 2016-12-31 13:37:00 366th day in leap year. +eval instant at 0m day_of_year(vector(1483191420)) + {} 366 + +# 2022-12-31 13:37:00 365th day in non-leap year. +eval instant at 0m day_of_year(vector(1672493820)) + {} 365 + # February 1st 2016 in leap year. eval instant at 0m days_in_month(vector(1454284800)) {} 29 diff --git a/web/ui/module/codemirror-promql/src/complete/promql.terms.ts b/web/ui/module/codemirror-promql/src/complete/promql.terms.ts index 5b2da2088e4..f793ddbd28c 100644 --- a/web/ui/module/codemirror-promql/src/complete/promql.terms.ts +++ b/web/ui/module/codemirror-promql/src/complete/promql.terms.ts @@ -177,6 +177,12 @@ export const functionIdentifierTerms = [ info: 'Return the day of the week for provided timestamps', type: 'function', }, + { + label: 'day_of_year', + detail: 'function', + info: 'Return the day of the year for provided timestamps', + type: 'function', + }, { label: 'deg', detail: 'function', diff --git a/web/ui/module/codemirror-promql/src/promql.ts b/web/ui/module/codemirror-promql/src/promql.ts index d9b573071a2..e20a15c97f5 100644 --- a/web/ui/module/codemirror-promql/src/promql.ts +++ b/web/ui/module/codemirror-promql/src/promql.ts @@ -35,7 +35,7 @@ export function promQLLanguage(top: LanguageType): LRLanguage { StringLiteral: tags.string, NumberLiteral: tags.number, Duration: tags.number, - 'Abs Absent AbsentOverTime Acos Acosh Asin Asinh Atan Atanh AvgOverTime Ceil Changes Clamp ClampMax ClampMin Cos Cosh CountOverTime DaysInMonth DayOfMonth DayOfWeek Deg Delta Deriv Exp Floor HistogramQuantile HoltWinters Hour Idelta Increase Irate LabelReplace LabelJoin LastOverTime Ln Log10 Log2 MaxOverTime MinOverTime Minute Month Pi PredictLinear PresentOverTime QuantileOverTime Rad Rate Resets Round Scalar Sgn Sin Sinh Sort SortDesc Sqrt StddevOverTime StdvarOverTime SumOverTime Tan Tanh Time Timestamp Vector Year': + 'Abs Absent AbsentOverTime Acos Acosh Asin Asinh Atan Atanh AvgOverTime Ceil Changes Clamp ClampMax ClampMin Cos Cosh CountOverTime DaysInMonth DayOfMonth DayOfWeek DayOfYear Deg Delta Deriv Exp Floor HistogramQuantile HoltWinters Hour Idelta Increase Irate LabelReplace LabelJoin LastOverTime Ln Log10 Log2 MaxOverTime MinOverTime Minute Month Pi PredictLinear PresentOverTime QuantileOverTime Rad Rate Resets Round Scalar Sgn Sin Sinh Sort SortDesc Sqrt StddevOverTime StdvarOverTime SumOverTime Tan Tanh Time Timestamp Vector Year': tags.function(tags.variableName), 'Avg Bottomk Count Count_values Group Max Min Quantile Stddev Stdvar Sum Topk': tags.operatorKeyword, 'By Without Bool On Ignoring GroupLeft GroupRight Offset Start End': tags.modifier, diff --git a/web/ui/module/codemirror-promql/src/types/function.ts b/web/ui/module/codemirror-promql/src/types/function.ts index 2c8723f8c83..9f99d359d04 100644 --- a/web/ui/module/codemirror-promql/src/types/function.ts +++ b/web/ui/module/codemirror-promql/src/types/function.ts @@ -32,6 +32,7 @@ import { CountOverTime, DayOfMonth, DayOfWeek, + DayOfYear, DaysInMonth, Deg, Delta, @@ -224,6 +225,12 @@ const promqlFunctions: { [key: number]: PromQLFunction } = { variadic: 1, returnType: ValueType.vector, }, + [DayOfYear]: { + name: 'day_of_year', + argTypes: [ValueType.vector], + variadic: 1, + returnType: ValueType.vector, + }, [Deg]: { name: 'deg', argTypes: [ValueType.vector], diff --git a/web/ui/module/lezer-promql/src/promql.grammar b/web/ui/module/lezer-promql/src/promql.grammar index 642d25f1090..8efc9a8a16e 100644 --- a/web/ui/module/lezer-promql/src/promql.grammar +++ b/web/ui/module/lezer-promql/src/promql.grammar @@ -140,6 +140,7 @@ FunctionIdentifier { DaysInMonth | DayOfMonth | DayOfWeek | + DayOfYear | Deg | Delta | Deriv | @@ -378,6 +379,7 @@ NumberLiteral { DaysInMonth { condFn<"days_in_month"> } DayOfMonth { condFn<"day_of_month"> } DayOfWeek { condFn<"day_of_week"> } + DayOfYear { condFn<"day_of_year"> } Deg { condFn<"deg"> } Delta { condFn<"delta"> } Deriv { condFn<"deriv"> } From ce3bc818a877b02585eb27a3d7cbfbb3502e5d88 Mon Sep 17 00:00:00 2001 From: Felix Ehrenpfort Date: Fri, 20 May 2022 14:57:23 +0200 Subject: [PATCH 059/135] Add service discovery for IONOS Cloud (#10514) * Add service discovery for IONOS Cloud Signed-off-by: Felix Ehrenpfort --- config/config_test.go | 30 +- config/testdata/conf.good.yml | 6 + config/testdata/ionos_datacenter.bad.yml | 3 + discovery/install/install.go | 1 + discovery/ionos/ionos.go | 111 ++++ discovery/ionos/server.go | 166 ++++++ discovery/ionos/server_test.go | 115 ++++ discovery/ionos/testdata/servers.json | 615 ++++++++++++++++++++ docs/configuration/configuration.md | 89 +++ documentation/examples/prometheus-ionos.yml | 30 + go.mod | 1 + go.sum | 2 + plugins.yml | 1 + plugins/plugins.go | 3 + 14 files changed, 1172 insertions(+), 1 deletion(-) create mode 100644 config/testdata/ionos_datacenter.bad.yml create mode 100644 discovery/ionos/ionos.go create mode 100644 discovery/ionos/server.go create mode 100644 discovery/ionos/server_test.go create mode 100644 discovery/ionos/testdata/servers.json create mode 100644 documentation/examples/prometheus-ionos.yml diff --git a/config/config_test.go b/config/config_test.go index ef198d6dd16..baffa3f879b 100644 --- a/config/config_test.go +++ b/config/config_test.go @@ -40,6 +40,7 @@ import ( "github.com/prometheus/prometheus/discovery/file" "github.com/prometheus/prometheus/discovery/hetzner" "github.com/prometheus/prometheus/discovery/http" + "github.com/prometheus/prometheus/discovery/ionos" "github.com/prometheus/prometheus/discovery/kubernetes" "github.com/prometheus/prometheus/discovery/linode" "github.com/prometheus/prometheus/discovery/marathon" @@ -996,6 +997,29 @@ var expectedConf = &Config{ }, }, }, + { + JobName: "ionos", + HonorTimestamps: true, + ScrapeInterval: model.Duration(15 * time.Second), + ScrapeTimeout: DefaultGlobalConfig.ScrapeTimeout, + + MetricsPath: DefaultScrapeConfig.MetricsPath, + Scheme: DefaultScrapeConfig.Scheme, + HTTPClientConfig: config.DefaultHTTPClientConfig, + + ServiceDiscoveryConfigs: discovery.Configs{ + &ionos.SDConfig{ + DatacenterID: "8feda53f-15f0-447f-badf-ebe32dad2fc0", + HTTPClientConfig: config.HTTPClientConfig{ + Authorization: &config.Authorization{Type: "Bearer", Credentials: "abcdef"}, + FollowRedirects: true, + EnableHTTP2: true, + }, + Port: 80, + RefreshInterval: model.Duration(60 * time.Second), + }, + }, + }, }, AlertingConfig: AlertingConfig{ AlertmanagerConfigs: []*AlertmanagerConfig{ @@ -1093,7 +1117,7 @@ func TestElideSecrets(t *testing.T) { yamlConfig := string(config) matches := secretRe.FindAllStringIndex(yamlConfig, -1) - require.Equal(t, 16, len(matches), "wrong number of secret matches found") + require.Equal(t, 17, len(matches), "wrong number of secret matches found") require.NotContains(t, yamlConfig, "mysecret", "yaml marshal reveals authentication credentials.") } @@ -1532,6 +1556,10 @@ var expectedErrors = []struct { filename: "uyuni_no_server.bad.yml", errMsg: "Uyuni SD configuration requires server host", }, + { + filename: "ionos_datacenter.bad.yml", + errMsg: "datacenter id can't be empty", + }, } func TestBadConfigs(t *testing.T) { diff --git a/config/testdata/conf.good.yml b/config/testdata/conf.good.yml index 9b5d4b03922..b111c1d42ff 100644 --- a/config/testdata/conf.good.yml +++ b/config/testdata/conf.good.yml @@ -367,6 +367,12 @@ scrape_configs: username: gopher password: hole + - job_name: ionos + ionos_sd_configs: + - datacenter_id: 8feda53f-15f0-447f-badf-ebe32dad2fc0 + authorization: + credentials: abcdef + alerting: alertmanagers: - scheme: https diff --git a/config/testdata/ionos_datacenter.bad.yml b/config/testdata/ionos_datacenter.bad.yml new file mode 100644 index 00000000000..e0158cf0b6d --- /dev/null +++ b/config/testdata/ionos_datacenter.bad.yml @@ -0,0 +1,3 @@ +scrape_configs: + - ionos_sd_configs: + - datacenter_id: "" diff --git a/discovery/install/install.go b/discovery/install/install.go index e16b348f6bc..68664b52a63 100644 --- a/discovery/install/install.go +++ b/discovery/install/install.go @@ -26,6 +26,7 @@ import ( _ "github.com/prometheus/prometheus/discovery/gce" // register gce _ "github.com/prometheus/prometheus/discovery/hetzner" // register hetzner _ "github.com/prometheus/prometheus/discovery/http" // register http + _ "github.com/prometheus/prometheus/discovery/ionos" // register ionos _ "github.com/prometheus/prometheus/discovery/kubernetes" // register kubernetes _ "github.com/prometheus/prometheus/discovery/linode" // register linode _ "github.com/prometheus/prometheus/discovery/marathon" // register marathon diff --git a/discovery/ionos/ionos.go b/discovery/ionos/ionos.go new file mode 100644 index 00000000000..a13a000585c --- /dev/null +++ b/discovery/ionos/ionos.go @@ -0,0 +1,111 @@ +// Copyright 2022 The Prometheus Authors +// 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. + +package ionos + +import ( + "time" + + "github.com/go-kit/log" + "github.com/pkg/errors" + "github.com/prometheus/common/config" + "github.com/prometheus/common/model" + + "github.com/prometheus/prometheus/discovery" + "github.com/prometheus/prometheus/discovery/refresh" +) + +const ( + // metaLabelPrefix is the meta prefix used for all meta labels in this + // discovery. + metaLabelPrefix = model.MetaLabelPrefix + "ionos_" + metaLabelSeparator = "," +) + +func init() { + discovery.RegisterConfig(&SDConfig{}) +} + +// Discovery periodically performs IONOS Cloud target discovery. It implements +// the Discoverer interface. +type Discovery struct{} + +// NewDiscovery returns a new refresh.Discovery for IONOS Cloud. +func NewDiscovery(conf *SDConfig, logger log.Logger) (*refresh.Discovery, error) { + if conf.ionosEndpoint == "" { + conf.ionosEndpoint = "https://api.ionos.com" + } + + d, err := newServerDiscovery(conf, logger) + if err != nil { + return nil, err + } + + return refresh.NewDiscovery( + logger, + "ionos", + time.Duration(conf.RefreshInterval), + d.refresh, + ), nil +} + +// DefaultSDConfig is the default IONOS Cloud service discovery configuration. +var DefaultSDConfig = SDConfig{ + HTTPClientConfig: config.DefaultHTTPClientConfig, + RefreshInterval: model.Duration(60 * time.Second), + Port: 80, +} + +// SDConfig configuration to use for IONOS Cloud Discovery. +type SDConfig struct { + // DatacenterID: IONOS Cloud data center ID used to discover targets. + DatacenterID string `yaml:"datacenter_id"` + + HTTPClientConfig config.HTTPClientConfig `yaml:",inline"` + + RefreshInterval model.Duration `yaml:"refresh_interval"` + Port int `yaml:"port"` + + ionosEndpoint string // For tests only. +} + +// Name returns the name of the IONOS Cloud service discovery. +func (c SDConfig) Name() string { + return "ionos" +} + +// NewDiscoverer returns a new discovery.Discoverer for IONOS Cloud. +func (c SDConfig) NewDiscoverer(options discovery.DiscovererOptions) (discovery.Discoverer, error) { + return NewDiscovery(&c, options.Logger) +} + +// UnmarshalYAML implements the yaml.Unmarshaler interface. +func (c *SDConfig) UnmarshalYAML(unmarshal func(interface{}) error) error { + *c = DefaultSDConfig + type plain SDConfig + err := unmarshal((*plain)(c)) + if err != nil { + return err + } + + if c.DatacenterID == "" { + return errors.New("datacenter id can't be empty") + } + + return c.HTTPClientConfig.Validate() +} + +// SetDirectory joins any relative file paths with dir. +func (c *SDConfig) SetDirectory(dir string) { + c.HTTPClientConfig.SetDirectory(dir) +} diff --git a/discovery/ionos/server.go b/discovery/ionos/server.go new file mode 100644 index 00000000000..8ac3639705e --- /dev/null +++ b/discovery/ionos/server.go @@ -0,0 +1,166 @@ +// Copyright 2022 The Prometheus Authors +// 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. + +package ionos + +import ( + "context" + "fmt" + "net" + "net/http" + "strconv" + "strings" + "time" + + "github.com/go-kit/log" + ionoscloud "github.com/ionos-cloud/sdk-go/v6" + "github.com/prometheus/common/config" + "github.com/prometheus/common/model" + "github.com/prometheus/common/version" + + "github.com/prometheus/prometheus/discovery/refresh" + "github.com/prometheus/prometheus/discovery/targetgroup" + "github.com/prometheus/prometheus/util/strutil" +) + +const ( + serverLabelPrefix = metaLabelPrefix + "server_" + + serverAvailabilityZoneLabel = serverLabelPrefix + "availability_zone" + serverBootCDROMIDLabel = serverLabelPrefix + "boot_cdrom_id" + serverBootImageIDLabel = serverLabelPrefix + "boot_image_id" + serverBootVolumeIDLabel = serverLabelPrefix + "boot_volume_id" + serverCPUFamilyLabel = serverLabelPrefix + "cpu_family" + serverIDLabel = serverLabelPrefix + "id" + serverIPLabel = serverLabelPrefix + "ip" + serverLifecycleLabel = serverLabelPrefix + "lifecycle" + serverNameLabel = serverLabelPrefix + "name" + serverNICIPLabelPrefix = serverLabelPrefix + "nic_ip_" + serverServersIDLabel = serverLabelPrefix + "servers_id" + serverStateLabel = serverLabelPrefix + "state" + serverTypeLabel = serverLabelPrefix + "type" + + nicDefaultName = "unnamed" +) + +type serverDiscovery struct { + *refresh.Discovery + client *ionoscloud.APIClient + port int + datacenterID string +} + +func newServerDiscovery(conf *SDConfig, logger log.Logger) (*serverDiscovery, error) { + d := &serverDiscovery{ + port: conf.Port, + datacenterID: conf.DatacenterID, + } + + rt, err := config.NewRoundTripperFromConfig(conf.HTTPClientConfig, "ionos_sd") + if err != nil { + return nil, err + } + + // Username, password and token are set via http client config. + cfg := ionoscloud.NewConfiguration("", "", "", conf.ionosEndpoint) + cfg.HTTPClient = &http.Client{ + Transport: rt, + Timeout: time.Duration(conf.RefreshInterval), + } + cfg.UserAgent = fmt.Sprintf("Prometheus/%s", version.Version) + + d.client = ionoscloud.NewAPIClient(cfg) + + return d, nil +} + +func (d *serverDiscovery) refresh(ctx context.Context) ([]*targetgroup.Group, error) { + api := d.client.ServersApi + + servers, _, err := api.DatacentersServersGet(ctx, d.datacenterID). + Depth(3). + Execute() + if err != nil { + return nil, err + } + + var targets []model.LabelSet + for _, server := range *servers.Items { + var ips []string + ipsByNICName := make(map[string][]string) + + if server.Entities != nil && server.Entities.Nics != nil { + for _, nic := range *server.Entities.Nics.Items { + nicName := nicDefaultName + if name := nic.Properties.Name; name != nil { + nicName = *name + } + + nicIPs := *nic.Properties.Ips + ips = append(nicIPs, ips...) + ipsByNICName[nicName] = append(nicIPs, ipsByNICName[nicName]...) + } + } + + // If a server has no IP addresses, it's being dropped from the targets. + if len(ips) == 0 { + continue + } + + addr := net.JoinHostPort(ips[0], strconv.FormatUint(uint64(d.port), 10)) + labels := model.LabelSet{ + model.AddressLabel: model.LabelValue(addr), + serverAvailabilityZoneLabel: model.LabelValue(*server.Properties.AvailabilityZone), + serverCPUFamilyLabel: model.LabelValue(*server.Properties.CpuFamily), + serverServersIDLabel: model.LabelValue(*servers.Id), + serverIDLabel: model.LabelValue(*server.Id), + serverIPLabel: model.LabelValue(join(ips, metaLabelSeparator)), + serverLifecycleLabel: model.LabelValue(*server.Metadata.State), + serverNameLabel: model.LabelValue(*server.Properties.Name), + serverStateLabel: model.LabelValue(*server.Properties.VmState), + serverTypeLabel: model.LabelValue(*server.Properties.Type), + } + + for nicName, nicIPs := range ipsByNICName { + name := serverNICIPLabelPrefix + strutil.SanitizeLabelName(nicName) + labels[model.LabelName(name)] = model.LabelValue(join(nicIPs, metaLabelSeparator)) + } + + if server.Properties.BootCdrom != nil { + labels[serverBootCDROMIDLabel] = model.LabelValue(*server.Properties.BootCdrom.Id) + } + + if server.Properties.BootVolume != nil { + labels[serverBootVolumeIDLabel] = model.LabelValue(*server.Properties.BootVolume.Id) + } + + if server.Entities != nil && server.Entities.Volumes != nil { + volumes := *server.Entities.Volumes.Items + if len(volumes) > 0 { + image := volumes[0].Properties.Image + if image != nil { + labels[serverBootImageIDLabel] = model.LabelValue(*image) + } + } + } + + targets = append(targets, labels) + } + + return []*targetgroup.Group{{Source: "ionos", Targets: targets}}, nil +} + +// join returns strings.Join with additional separators at beginning and end. +func join(elems []string, sep string) string { + return sep + strings.Join(elems, sep) + sep +} diff --git a/discovery/ionos/server_test.go b/discovery/ionos/server_test.go new file mode 100644 index 00000000000..92f2a96f9d3 --- /dev/null +++ b/discovery/ionos/server_test.go @@ -0,0 +1,115 @@ +// Copyright 2022 The Prometheus Authors +// 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. + +package ionos + +import ( + "context" + "fmt" + "net/http" + "net/http/httptest" + "os" + "testing" + + ionoscloud "github.com/ionos-cloud/sdk-go/v6" + "github.com/prometheus/common/config" + "github.com/prometheus/common/model" + "github.com/stretchr/testify/require" +) + +var ( + ionosTestBearerToken = config.Secret("jwt") + ionosTestDatacenterID = "8feda53f-15f0-447f-badf-ebe32dad2fc0" +) + +func TestIONOSServerRefresh(t *testing.T) { + mock := httptest.NewServer(http.HandlerFunc(mockIONOSServers)) + defer mock.Close() + + cfg := DefaultSDConfig + cfg.DatacenterID = ionosTestDatacenterID + cfg.HTTPClientConfig.BearerToken = ionosTestBearerToken + cfg.ionosEndpoint = mock.URL + + d, err := newServerDiscovery(&cfg, nil) + require.NoError(t, err) + + ctx := context.Background() + tgs, err := d.refresh(ctx) + require.NoError(t, err) + + require.Equal(t, 1, len(tgs)) + + tg := tgs[0] + require.NotNil(t, tg) + require.NotNil(t, tg.Targets) + require.Equal(t, 2, len(tg.Targets)) + + for i, lbls := range []model.LabelSet{ + { + "__address__": "85.215.243.177:80", + "__meta_ionos_server_availability_zone": "ZONE_2", + "__meta_ionos_server_boot_cdrom_id": "0e4d57f9-cd78-11e9-b88c-525400f64d8d", + "__meta_ionos_server_cpu_family": "INTEL_SKYLAKE", + "__meta_ionos_server_id": "b501942c-4e08-43e6-8ec1-00e59c64e0e4", + "__meta_ionos_server_ip": ",85.215.243.177,185.56.150.9,85.215.238.118,", + "__meta_ionos_server_nic_ip_metrics": ",85.215.243.177,", + "__meta_ionos_server_nic_ip_unnamed": ",185.56.150.9,85.215.238.118,", + "__meta_ionos_server_lifecycle": "AVAILABLE", + "__meta_ionos_server_name": "prometheus-2", + "__meta_ionos_server_servers_id": "8feda53f-15f0-447f-badf-ebe32dad2fc0/servers", + "__meta_ionos_server_state": "RUNNING", + "__meta_ionos_server_type": "ENTERPRISE", + }, + { + "__address__": "85.215.248.84:80", + "__meta_ionos_server_availability_zone": "ZONE_1", + "__meta_ionos_server_boot_cdrom_id": "0e4d57f9-cd78-11e9-b88c-525400f64d8d", + "__meta_ionos_server_cpu_family": "INTEL_SKYLAKE", + "__meta_ionos_server_id": "523415e6-ff8c-4dc0-86d3-09c256039b30", + "__meta_ionos_server_ip": ",85.215.248.84,", + "__meta_ionos_server_nic_ip_unnamed": ",85.215.248.84,", + "__meta_ionos_server_lifecycle": "AVAILABLE", + "__meta_ionos_server_name": "prometheus-1", + "__meta_ionos_server_servers_id": "8feda53f-15f0-447f-badf-ebe32dad2fc0/servers", + "__meta_ionos_server_state": "RUNNING", + "__meta_ionos_server_type": "ENTERPRISE", + }, + } { + t.Run(fmt.Sprintf("item %d", i), func(t *testing.T) { + require.Equal(t, lbls, tg.Targets[i]) + }) + } +} + +func mockIONOSServers(w http.ResponseWriter, r *http.Request) { + if r.Header.Get("Authorization") != fmt.Sprintf("Bearer %s", ionosTestBearerToken) { + http.Error(w, "bad token", http.StatusUnauthorized) + return + } + if r.URL.Path != fmt.Sprintf("%s/datacenters/%s/servers", ionoscloud.DefaultIonosBasePath, ionosTestDatacenterID) { + http.Error(w, fmt.Sprintf("bad url: %s", r.URL.Path), http.StatusNotFound) + return + } + w.Header().Set("Content-Type", "application/json") + server, err := os.ReadFile("testdata/servers.json") + if err != nil { + http.Error(w, err.Error(), http.StatusInternalServerError) + return + } + _, err = w.Write(server) + if err != nil { + http.Error(w, err.Error(), http.StatusInternalServerError) + return + } +} diff --git a/discovery/ionos/testdata/servers.json b/discovery/ionos/testdata/servers.json new file mode 100644 index 00000000000..2af80bfa163 --- /dev/null +++ b/discovery/ionos/testdata/servers.json @@ -0,0 +1,615 @@ +{ + "id": "8feda53f-15f0-447f-badf-ebe32dad2fc0/servers", + "type": "collection", + "href": "https://api.ionos.com/cloudapi/v6/datacenters/8feda53f-15f0-447f-badf-ebe32dad2fc0/servers", + "items": [ + { + "id": "d6bf44ee-f7e8-4e19-8716-96fdd18cc697", + "type": "server", + "href": "https://api.ionos.com/cloudapi/v6/datacenters/8feda53f-15f0-447f-badf-ebe32dad2fc0/servers/d6bf44ee-f7e8-4e19-8716-96fdd18cc697", + "metadata": { + "etag": "3bd2cf1f190fdba8502ba8c0cc79433e", + "createdDate": "2019-09-02T11:51:53Z", + "createdBy": "System", + "createdByUserId": "[UNKNOWN]", + "lastModifiedDate": "2019-09-02T11:51:53Z", + "lastModifiedBy": "System", + "lastModifiedByUserId": "[UNKNOWN]", + "state": "AVAILABLE" + }, + "properties": { + "name": "prometheus-3", + "cores": 2, + "ram": 4096, + "availabilityZone": "AUTO", + "vmState": "RUNNING", + "bootCdrom": { + "id": "0e4d57f9-cd78-11e9-b88c-525400f64d8d", + "type": "image", + "href": "https://api.ionos.com/cloudapi/v6/images/0e4d57f9-cd78-11e9-b88c-525400f64d8d", + "metadata": { + "etag": "ca643281fd2a5b68002bc00ac0ecd920", + "createdDate": "2019-09-02T11:51:53Z", + "createdBy": "System", + "createdByUserId": "[UNKNOWN]", + "lastModifiedDate": "2019-09-02T11:51:53Z", + "lastModifiedBy": "System", + "lastModifiedByUserId": "[UNKNOWN]", + "state": "AVAILABLE" + }, + "properties": { + "name": "debian-10.0.0-amd64-netinst.iso", + "description": null, + "location": "de/txl", + "size": 0.33, + "cpuHotPlug": true, + "cpuHotUnplug": false, + "ramHotPlug": true, + "ramHotUnplug": false, + "nicHotPlug": true, + "nicHotUnplug": true, + "discVirtioHotPlug": true, + "discVirtioHotUnplug": true, + "discScsiHotPlug": false, + "discScsiHotUnplug": false, + "licenceType": "LINUX", + "imageType": "CDROM", + "imageAliases": [ + "debian:latest_iso", + "debian:10_iso" + ], + "cloudInit": "NONE", + "public": true + } + }, + "bootVolume": null, + "cpuFamily": "INTEL_SKYLAKE", + "type": "ENTERPRISE" + }, + "entities": { + "cdroms": { + "id": "d6bf44ee-f7e8-4e19-8716-96fdd18cc697/cdroms", + "type": "collection", + "href": "https://api.ionos.com/cloudapi/v6/datacenters/8feda53f-15f0-447f-badf-ebe32dad2fc0/servers/d6bf44ee-f7e8-4e19-8716-96fdd18cc697/cdroms", + "items": [ + { + "id": "0e4d57f9-cd78-11e9-b88c-525400f64d8d", + "type": "image", + "href": "https://api.ionos.com/cloudapi/v6/images/0e4d57f9-cd78-11e9-b88c-525400f64d8d", + "metadata": { + "etag": "ca643281fd2a5b68002bc00ac0ecd920", + "createdDate": "2019-09-02T11:51:53Z", + "createdBy": "System", + "createdByUserId": "[UNKNOWN]", + "lastModifiedDate": "2019-09-02T11:51:53Z", + "lastModifiedBy": "System", + "lastModifiedByUserId": "[UNKNOWN]", + "state": "AVAILABLE" + }, + "properties": { + "name": "debian-10.0.0-amd64-netinst.iso", + "description": null, + "location": "de/txl", + "size": 0.33, + "cpuHotPlug": true, + "cpuHotUnplug": false, + "ramHotPlug": true, + "ramHotUnplug": false, + "nicHotPlug": true, + "nicHotUnplug": true, + "discVirtioHotPlug": true, + "discVirtioHotUnplug": true, + "discScsiHotPlug": false, + "discScsiHotUnplug": false, + "licenceType": "LINUX", + "imageType": "CDROM", + "imageAliases": [ + "debian:10_iso", + "debian:latest_iso" + ], + "cloudInit": "NONE", + "public": true + } + } + ] + }, + "volumes": { + "id": "d6bf44ee-f7e8-4e19-8716-96fdd18cc697/volumes", + "type": "collection", + "href": "https://api.ionos.com/cloudapi/v6/datacenters/8feda53f-15f0-447f-badf-ebe32dad2fc0/servers/d6bf44ee-f7e8-4e19-8716-96fdd18cc697/volumes", + "items": [] + }, + "nics": { + "id": "d6bf44ee-f7e8-4e19-8716-96fdd18cc697/nics", + "type": "collection", + "href": "https://api.ionos.com/cloudapi/v6/datacenters/8feda53f-15f0-447f-badf-ebe32dad2fc0/servers/d6bf44ee-f7e8-4e19-8716-96fdd18cc697/nics", + "items": [] + } + } + }, + { + "id": "b501942c-4e08-43e6-8ec1-00e59c64e0e4", + "type": "server", + "href": "https://api.ionos.com/cloudapi/v6/datacenters/8feda53f-15f0-447f-badf-ebe32dad2fc0/servers/b501942c-4e08-43e6-8ec1-00e59c64e0e4", + "metadata": { + "etag": "fe405a5f2e041d506086ee0c2159b678", + "createdDate": "2019-09-02T11:51:53Z", + "createdBy": "System", + "createdByUserId": "[UNKNOWN]", + "lastModifiedDate": "2019-09-02T11:51:53Z", + "lastModifiedBy": "System", + "lastModifiedByUserId": "[UNKNOWN]", + "state": "AVAILABLE" + }, + "properties": { + "name": "prometheus-2", + "cores": 1, + "ram": 1024, + "availabilityZone": "ZONE_2", + "vmState": "RUNNING", + "bootCdrom": { + "id": "0e4d57f9-cd78-11e9-b88c-525400f64d8d", + "type": "image", + "href": "https://api.ionos.com/cloudapi/v6/images/0e4d57f9-cd78-11e9-b88c-525400f64d8d", + "metadata": { + "etag": "ca643281fd2a5b68002bc00ac0ecd920", + "createdDate": "2019-09-02T11:51:53Z", + "createdBy": "System", + "createdByUserId": "[UNKNOWN]", + "lastModifiedDate": "2019-09-02T11:51:53Z", + "lastModifiedBy": "System", + "lastModifiedByUserId": "[UNKNOWN]", + "state": "AVAILABLE" + }, + "properties": { + "name": "debian-10.0.0-amd64-netinst.iso", + "description": null, + "location": "de/txl", + "size": 0.33, + "cpuHotPlug": true, + "cpuHotUnplug": false, + "ramHotPlug": true, + "ramHotUnplug": false, + "nicHotPlug": true, + "nicHotUnplug": true, + "discVirtioHotPlug": true, + "discVirtioHotUnplug": true, + "discScsiHotPlug": false, + "discScsiHotUnplug": false, + "licenceType": "LINUX", + "imageType": "CDROM", + "imageAliases": [ + "debian:latest_iso", + "debian:10_iso" + ], + "cloudInit": "NONE", + "public": true + } + }, + "bootVolume": null, + "cpuFamily": "INTEL_SKYLAKE", + "type": "ENTERPRISE" + }, + "entities": { + "cdroms": { + "id": "b501942c-4e08-43e6-8ec1-00e59c64e0e4/cdroms", + "type": "collection", + "href": "https://api.ionos.com/cloudapi/v6/datacenters/8feda53f-15f0-447f-badf-ebe32dad2fc0/servers/b501942c-4e08-43e6-8ec1-00e59c64e0e4/cdroms", + "items": [ + { + "id": "0e4d57f9-cd78-11e9-b88c-525400f64d8d", + "type": "image", + "href": "https://api.ionos.com/cloudapi/v6/images/0e4d57f9-cd78-11e9-b88c-525400f64d8d", + "metadata": { + "etag": "ca643281fd2a5b68002bc00ac0ecd920", + "createdDate": "2019-09-02T11:51:53Z", + "createdBy": "System", + "createdByUserId": "[UNKNOWN]", + "lastModifiedDate": "2019-09-02T11:51:53Z", + "lastModifiedBy": "System", + "lastModifiedByUserId": "[UNKNOWN]", + "state": "AVAILABLE" + }, + "properties": { + "name": "debian-10.0.0-amd64-netinst.iso", + "description": null, + "location": "de/txl", + "size": 0.33, + "cpuHotPlug": true, + "cpuHotUnplug": false, + "ramHotPlug": true, + "ramHotUnplug": false, + "nicHotPlug": true, + "nicHotUnplug": true, + "discVirtioHotPlug": true, + "discVirtioHotUnplug": true, + "discScsiHotPlug": false, + "discScsiHotUnplug": false, + "licenceType": "LINUX", + "imageType": "CDROM", + "imageAliases": [ + "debian:10_iso", + "debian:latest_iso" + ], + "cloudInit": "NONE", + "public": true + } + } + ] + }, + "volumes": { + "id": "b501942c-4e08-43e6-8ec1-00e59c64e0e4/volumes", + "type": "collection", + "href": "https://api.ionos.com/cloudapi/v6/datacenters/8feda53f-15f0-447f-badf-ebe32dad2fc0/servers/b501942c-4e08-43e6-8ec1-00e59c64e0e4/volumes", + "items": [ + { + "id": "97a58f00-e2a5-4ebb-8b9a-f694837b0548", + "type": "volume", + "href": "https://api.ionos.com/cloudapi/v6/datacenters/8feda53f-15f0-447f-badf-ebe32dad2fc0/volumes/97a58f00-e2a5-4ebb-8b9a-f694837b0548", + "metadata": { + "etag": "27491713a77c5453c6ae7d0f98a1beec", + "createdDate": "2019-09-02T11:51:53Z", + "createdBy": "System", + "createdByUserId": "[UNKNOWN]", + "lastModifiedDate": "2019-09-02T11:51:53Z", + "lastModifiedBy": "System", + "lastModifiedByUserId": "[UNKNOWN]", + "state": "AVAILABLE" + }, + "properties": { + "name": "prometheus-data-1", + "type": "HDD", + "size": 10, + "availabilityZone": "AUTO", + "image": null, + "imagePassword": null, + "sshKeys": null, + "bus": "VIRTIO", + "licenceType": "UNKNOWN", + "cpuHotPlug": false, + "ramHotPlug": false, + "nicHotPlug": false, + "nicHotUnplug": false, + "discVirtioHotPlug": false, + "discVirtioHotUnplug": false, + "deviceNumber": 1, + "userData": null, + "pciSlot": 6, + "bootServer": "b501942c-4e08-43e6-8ec1-00e59c64e0e4" + } + } + ] + }, + "nics": { + "id": "b501942c-4e08-43e6-8ec1-00e59c64e0e4/nics", + "type": "collection", + "href": "https://api.ionos.com/cloudapi/v6/datacenters/8feda53f-15f0-447f-badf-ebe32dad2fc0/servers/b501942c-4e08-43e6-8ec1-00e59c64e0e4/nics", + "items": [ + { + "id": "206e9a88-097c-4c87-8544-1f5fe0b6b0f1", + "type": "nic", + "href": "https://api.ionos.com/cloudapi/v6/datacenters/8feda53f-15f0-447f-badf-ebe32dad2fc0/servers/b501942c-4e08-43e6-8ec1-00e59c64e0e4/nics/206e9a88-097c-4c87-8544-1f5fe0b6b0f1", + "metadata": { + "etag": "be2b6fff29e7e09c1a4a5ca150876eaa", + "createdDate": "2019-09-02T11:51:53Z", + "createdBy": "System", + "createdByUserId": "[UNKNOWN]", + "lastModifiedDate": "2019-09-02T11:51:53Z", + "lastModifiedBy": "System", + "lastModifiedByUserId": "[UNKNOWN]", + "state": "AVAILABLE" + }, + "properties": { + "name": null, + "mac": "02:01:4b:1c:cf:57", + "ips": [ + "85.215.238.118" + ], + "dhcp": true, + "lan": 1, + "firewallActive": false, + "firewallType": "INGRESS", + "deviceNumber": 1, + "pciSlot": 5 + }, + "entities": { + "firewallrules": { + "id": "206e9a88-097c-4c87-8544-1f5fe0b6b0f1/firewallrules", + "type": "collection", + "href": "https://api.ionos.com/cloudapi/v6/datacenters/8feda53f-15f0-447f-badf-ebe32dad2fc0/servers/b501942c-4e08-43e6-8ec1-00e59c64e0e4/nics/206e9a88-097c-4c87-8544-1f5fe0b6b0f1/firewallrules" + }, + "flowlogs": { + "id": "206e9a88-097c-4c87-8544-1f5fe0b6b0f1/flowlogs", + "type": "collection", + "href": "https://api.ionos.com/cloudapi/v6/datacenters/8feda53f-15f0-447f-badf-ebe32dad2fc0/servers/b501942c-4e08-43e6-8ec1-00e59c64e0e4/nics/206e9a88-097c-4c87-8544-1f5fe0b6b0f1/flowlogs" + } + } + }, + { + "id": "8a568a32-da62-437d-8b73-f580d1a1588f", + "type": "nic", + "href": "https://api.ionos.com/cloudapi/v6/datacenters/8feda53f-15f0-447f-badf-ebe32dad2fc0/servers/b501942c-4e08-43e6-8ec1-00e59c64e0e4/nics/8a568a32-da62-437d-8b73-f580d1a1588f", + "metadata": { + "etag": "2dca0340a0610b1dfdb2e66f6aae3ed3", + "createdDate": "2022-05-05T13:12:31Z", + "createdBy": "felix.ehrenpfort@codecentric.cloud", + "createdByUserId": "cfcb4526-fbe0-461e-9149-ffb00a83fbec", + "lastModifiedDate": "2022-05-05T13:12:31Z", + "lastModifiedBy": "felix.ehrenpfort@codecentric.cloud", + "lastModifiedByUserId": "cfcb4526-fbe0-461e-9149-ffb00a83fbec", + "state": "AVAILABLE" + }, + "properties": { + "name": null, + "mac": "02:01:56:f6:47:a8", + "ips": [ + "185.56.150.9" + ], + "dhcp": true, + "lan": 1, + "firewallActive": false, + "firewallType": "INGRESS", + "deviceNumber": 3, + "pciSlot": 8 + }, + "entities": { + "firewallrules": { + "id": "8a568a32-da62-437d-8b73-f580d1a1588f/firewallrules", + "type": "collection", + "href": "https://api.ionos.com/cloudapi/v6/datacenters/8feda53f-15f0-447f-badf-ebe32dad2fc0/servers/b501942c-4e08-43e6-8ec1-00e59c64e0e4/nics/8a568a32-da62-437d-8b73-f580d1a1588f/firewallrules" + }, + "flowlogs": { + "id": "8a568a32-da62-437d-8b73-f580d1a1588f/flowlogs", + "type": "collection", + "href": "https://api.ionos.com/cloudapi/v6/datacenters/8feda53f-15f0-447f-badf-ebe32dad2fc0/servers/b501942c-4e08-43e6-8ec1-00e59c64e0e4/nics/8a568a32-da62-437d-8b73-f580d1a1588f/flowlogs" + } + } + }, + { + "id": "17ecc866-4a08-4ada-858f-7b726a5f5070", + "type": "nic", + "href": "https://api.ionos.com/cloudapi/v6/datacenters/8feda53f-15f0-447f-badf-ebe32dad2fc0/servers/b501942c-4e08-43e6-8ec1-00e59c64e0e4/nics/17ecc866-4a08-4ada-858f-7b726a5f5070", + "metadata": { + "etag": "f6a82276c6fdb460811d3789e54e0054", + "createdDate": "2022-05-05T11:45:36Z", + "createdBy": "felix.ehrenpfort@codecentric.cloud", + "createdByUserId": "cfcb4526-fbe0-461e-9149-ffb00a83fbec", + "lastModifiedDate": "2022-05-05T11:45:36Z", + "lastModifiedBy": "felix.ehrenpfort@codecentric.cloud", + "lastModifiedByUserId": "cfcb4526-fbe0-461e-9149-ffb00a83fbec", + "state": "AVAILABLE" + }, + "properties": { + "name": "metrics", + "mac": "02:01:93:80:fa:a4", + "ips": [ + "85.215.243.177" + ], + "dhcp": true, + "lan": 1, + "firewallActive": false, + "firewallType": "INGRESS", + "deviceNumber": 2, + "pciSlot": 7 + }, + "entities": { + "firewallrules": { + "id": "17ecc866-4a08-4ada-858f-7b726a5f5070/firewallrules", + "type": "collection", + "href": "https://api.ionos.com/cloudapi/v6/datacenters/8feda53f-15f0-447f-badf-ebe32dad2fc0/servers/b501942c-4e08-43e6-8ec1-00e59c64e0e4/nics/17ecc866-4a08-4ada-858f-7b726a5f5070/firewallrules" + }, + "flowlogs": { + "id": "17ecc866-4a08-4ada-858f-7b726a5f5070/flowlogs", + "type": "collection", + "href": "https://api.ionos.com/cloudapi/v6/datacenters/8feda53f-15f0-447f-badf-ebe32dad2fc0/servers/b501942c-4e08-43e6-8ec1-00e59c64e0e4/nics/17ecc866-4a08-4ada-858f-7b726a5f5070/flowlogs" + } + } + } + ] + } + } + }, + { + "id": "523415e6-ff8c-4dc0-86d3-09c256039b30", + "type": "server", + "href": "https://api.ionos.com/cloudapi/v6/datacenters/8feda53f-15f0-447f-badf-ebe32dad2fc0/servers/523415e6-ff8c-4dc0-86d3-09c256039b30", + "metadata": { + "etag": "fe405a5f2e041d506086ee0c2159b678", + "createdDate": "2019-09-02T11:51:53Z", + "createdBy": "System", + "createdByUserId": "[UNKNOWN]", + "lastModifiedDate": "2019-09-02T11:51:53Z", + "lastModifiedBy": "System", + "lastModifiedByUserId": "[UNKNOWN]", + "state": "AVAILABLE" + }, + "properties": { + "name": "prometheus-1", + "cores": 1, + "ram": 1024, + "availabilityZone": "ZONE_1", + "vmState": "RUNNING", + "bootCdrom": { + "id": "0e4d57f9-cd78-11e9-b88c-525400f64d8d", + "type": "image", + "href": "https://api.ionos.com/cloudapi/v6/images/0e4d57f9-cd78-11e9-b88c-525400f64d8d", + "metadata": { + "etag": "ca643281fd2a5b68002bc00ac0ecd920", + "createdDate": "2019-09-02T11:51:53Z", + "createdBy": "System", + "createdByUserId": "[UNKNOWN]", + "lastModifiedDate": "2019-09-02T11:51:53Z", + "lastModifiedBy": "System", + "lastModifiedByUserId": "[UNKNOWN]", + "state": "AVAILABLE" + }, + "properties": { + "name": "debian-10.0.0-amd64-netinst.iso", + "description": null, + "location": "de/txl", + "size": 0.33, + "cpuHotPlug": true, + "cpuHotUnplug": false, + "ramHotPlug": true, + "ramHotUnplug": false, + "nicHotPlug": true, + "nicHotUnplug": true, + "discVirtioHotPlug": true, + "discVirtioHotUnplug": true, + "discScsiHotPlug": false, + "discScsiHotUnplug": false, + "licenceType": "LINUX", + "imageType": "CDROM", + "imageAliases": [ + "debian:latest_iso", + "debian:10_iso" + ], + "cloudInit": "NONE", + "public": true + } + }, + "bootVolume": null, + "cpuFamily": "INTEL_SKYLAKE", + "type": "ENTERPRISE" + }, + "entities": { + "cdroms": { + "id": "523415e6-ff8c-4dc0-86d3-09c256039b30/cdroms", + "type": "collection", + "href": "https://api.ionos.com/cloudapi/v6/datacenters/8feda53f-15f0-447f-badf-ebe32dad2fc0/servers/523415e6-ff8c-4dc0-86d3-09c256039b30/cdroms", + "items": [ + { + "id": "0e4d57f9-cd78-11e9-b88c-525400f64d8d", + "type": "image", + "href": "https://api.ionos.com/cloudapi/v6/images/0e4d57f9-cd78-11e9-b88c-525400f64d8d", + "metadata": { + "etag": "ca643281fd2a5b68002bc00ac0ecd920", + "createdDate": "2019-09-02T11:51:53Z", + "createdBy": "System", + "createdByUserId": "[UNKNOWN]", + "lastModifiedDate": "2019-09-02T11:51:53Z", + "lastModifiedBy": "System", + "lastModifiedByUserId": "[UNKNOWN]", + "state": "AVAILABLE" + }, + "properties": { + "name": "debian-10.0.0-amd64-netinst.iso", + "description": null, + "location": "de/txl", + "size": 0.33, + "cpuHotPlug": true, + "cpuHotUnplug": false, + "ramHotPlug": true, + "ramHotUnplug": false, + "nicHotPlug": true, + "nicHotUnplug": true, + "discVirtioHotPlug": true, + "discVirtioHotUnplug": true, + "discScsiHotPlug": false, + "discScsiHotUnplug": false, + "licenceType": "LINUX", + "imageType": "CDROM", + "imageAliases": [ + "debian:10_iso", + "debian:latest_iso" + ], + "cloudInit": "NONE", + "public": true + } + } + ] + }, + "volumes": { + "id": "523415e6-ff8c-4dc0-86d3-09c256039b30/volumes", + "type": "collection", + "href": "https://api.ionos.com/cloudapi/v6/datacenters/8feda53f-15f0-447f-badf-ebe32dad2fc0/servers/523415e6-ff8c-4dc0-86d3-09c256039b30/volumes", + "items": [ + { + "id": "5dc21326-7e33-4dc7-84ac-63b02aad4624", + "type": "volume", + "href": "https://api.ionos.com/cloudapi/v6/datacenters/8feda53f-15f0-447f-badf-ebe32dad2fc0/volumes/5dc21326-7e33-4dc7-84ac-63b02aad4624", + "metadata": { + "etag": "27491713a77c5453c6ae7d0f98a1beec", + "createdDate": "2019-09-02T11:51:53Z", + "createdBy": "System", + "createdByUserId": "[UNKNOWN]", + "lastModifiedDate": "2019-09-02T11:51:53Z", + "lastModifiedBy": "System", + "lastModifiedByUserId": "[UNKNOWN]", + "state": "AVAILABLE" + }, + "properties": { + "name": "prometheus-data-2", + "type": "HDD", + "size": 10, + "availabilityZone": "AUTO", + "image": null, + "imagePassword": null, + "sshKeys": null, + "bus": "VIRTIO", + "licenceType": "UNKNOWN", + "cpuHotPlug": false, + "ramHotPlug": false, + "nicHotPlug": false, + "nicHotUnplug": false, + "discVirtioHotPlug": false, + "discVirtioHotUnplug": false, + "deviceNumber": 1, + "userData": null, + "pciSlot": 6, + "bootServer": "523415e6-ff8c-4dc0-86d3-09c256039b30" + } + } + ] + }, + "nics": { + "id": "523415e6-ff8c-4dc0-86d3-09c256039b30/nics", + "type": "collection", + "href": "https://api.ionos.com/cloudapi/v6/datacenters/8feda53f-15f0-447f-badf-ebe32dad2fc0/servers/523415e6-ff8c-4dc0-86d3-09c256039b30/nics", + "items": [ + { + "id": "684033a2-317f-4977-8a01-68263d59336c", + "type": "nic", + "href": "https://api.ionos.com/cloudapi/v6/datacenters/8feda53f-15f0-447f-badf-ebe32dad2fc0/servers/523415e6-ff8c-4dc0-86d3-09c256039b30/nics/684033a2-317f-4977-8a01-68263d59336c", + "metadata": { + "etag": "fe405a5f2e041d506086ee0c2159b678", + "createdDate": "2019-09-02T11:51:53Z", + "createdBy": "System", + "createdByUserId": "[UNKNOWN]", + "lastModifiedDate": "2019-09-02T11:51:53Z", + "lastModifiedBy": "System", + "lastModifiedByUserId": "[UNKNOWN]", + "state": "AVAILABLE" + }, + "properties": { + "name": null, + "mac": "02:01:17:12:27:1b", + "ips": [ + "85.215.248.84" + ], + "dhcp": true, + "lan": 1, + "firewallActive": false, + "firewallType": "INGRESS", + "deviceNumber": 1, + "pciSlot": 5 + }, + "entities": { + "firewallrules": { + "id": "684033a2-317f-4977-8a01-68263d59336c/firewallrules", + "type": "collection", + "href": "https://api.ionos.com/cloudapi/v6/datacenters/8feda53f-15f0-447f-badf-ebe32dad2fc0/servers/523415e6-ff8c-4dc0-86d3-09c256039b30/nics/684033a2-317f-4977-8a01-68263d59336c/firewallrules" + }, + "flowlogs": { + "id": "684033a2-317f-4977-8a01-68263d59336c/flowlogs", + "type": "collection", + "href": "https://api.ionos.com/cloudapi/v6/datacenters/8feda53f-15f0-447f-badf-ebe32dad2fc0/servers/523415e6-ff8c-4dc0-86d3-09c256039b30/nics/684033a2-317f-4977-8a01-68263d59336c/flowlogs" + } + } + } + ] + } + } + } + ] +} diff --git a/docs/configuration/configuration.md b/docs/configuration/configuration.md index 621fff3dc3b..f6719ed7792 100644 --- a/docs/configuration/configuration.md +++ b/docs/configuration/configuration.md @@ -256,6 +256,11 @@ hetzner_sd_configs: http_sd_configs: [ - ... ] + +# List of IONOS service discovery configurations. +ionos_sd_configs: + [ - ... ] + # List of Kubernetes service discovery configurations. kubernetes_sd_configs: [ - ... ] @@ -1539,6 +1544,86 @@ tls_config: [ ] ``` +### `` + +IONOS SD configurations allows retrieving scrape targets from +[IONOS Cloud](https://cloud.ionos.com/) API. This service discovery uses the +first NICs IP address by default, but that can be changed with relabeling. The +following meta labels are available on all targets during +[relabeling](#relabel_config): + +* `__meta_ionos_server_availability_zone`: the availability zone of the server +* `__meta_ionos_server_boot_cdrom_id`: the ID of the CD-ROM the server is booted + from +* `__meta_ionos_server_boot_image_id`: the ID of the boot image or snapshot the + server is booted from +* `__meta_ionos_server_boot_volume_id`: the ID of the boot volume +* `__meta_ionos_server_cpu_family`: the CPU family of the server + to +* `__meta_ionos_server_id`: the ID of the server +* `__meta_ionos_server_ip`: comma seperated list of all IPs assigned to the + server +* `__meta_ionos_server_lifecycle`: the lifecycle state of the server resource +* `__meta_ionos_server_name`: the name of the server +* `__meta_ionos_server_nic_ip_`: comma seperated list of IPs, grouped + by the name of each NIC attached to the server +* `__meta_ionos_server_servers_id`: the ID of the servers the server belongs to +* `__meta_ionos_server_state`: the execution state of the server +* `__meta_ionos_server_type`: the type of the server + +```yaml +# The unique ID of the data center. +datacenter_id: + +# Authentication information used to authenticate to the API server. +# Note that `basic_auth` and `authorization` options are +# mutually exclusive. +# password and password_file are mutually exclusive. + +# Optional HTTP basic authentication information, required when using IONOS +# Cloud username and password as authentication method. +basic_auth: + [ username: ] + [ password: ] + [ password_file: ] + +# Optional `Authorization` header configuration, required when using IONOS +# Cloud token as authentication method. +authorization: + # Sets the authentication type. + [ type: | default: Bearer ] + # Sets the credentials. It is mutually exclusive with + # `credentials_file`. + [ credentials: ] + # Sets the credentials to the credentials read from the configured file. + # It is mutually exclusive with `credentials`. + [ credentials_file: ] + +# Optional OAuth 2.0 configuration. +# Cannot be used at the same time as basic_auth or authorization. +oauth2: + [ ] + +# Optional proxy URL. +[ proxy_url: ] + +# Configure whether HTTP requests follow HTTP 3xx redirects. +[ follow_redirects: | default = true ] + +# Whether to enable HTTP2. +[ enable_http2: | default: true ] + +# TLS configuration. +tls_config: + [ ] + +# The port to scrape metrics from. +[ port: | default = 80 ] + +# The time after which the servers are refreshed. +[ refresh_interval: | default = 60s ] +``` + ### `` Kubernetes SD configurations allow retrieving scrape targets from @@ -2680,6 +2765,10 @@ hetzner_sd_configs: http_sd_configs: [ - ... ] + # List of IONOS service discovery configurations. +ionos_sd_configs: + [ - ... ] + # List of Kubernetes service discovery configurations. kubernetes_sd_configs: [ - ... ] diff --git a/documentation/examples/prometheus-ionos.yml b/documentation/examples/prometheus-ionos.yml new file mode 100644 index 00000000000..45e148091c3 --- /dev/null +++ b/documentation/examples/prometheus-ionos.yml @@ -0,0 +1,30 @@ +# A example scrape configuration for running Prometheus with IONOS Cloud. +scrape_configs: + - job_name: "node" + ionos_sd_configs: + - basic_auth: + # Replace with your username. + username: username + # Replace with your password. + password: password + # You can find your data center unique ID here: https://dcd.ionos.com/latest/ + datacenter_id: 11111111-1111-1111-1111-111111111111 + port: 9100 + relabel_configs: + # Only scrape servers that are available via API. + - source_labels: [__meta_ionos_server_lifecycle] + action: keep + regex: "AVAILABLE" + + # Only scrape servers that are in a running state. + - source_labels: [__meta_ionos_server_state] + action: keep + regex: "RUNNING" + + # Replace instance label with server name. + - source_labels: [__meta_ionos_server_name] + target_label: instance + + # Add server availability zone as label. + - source_labels: [__meta_ionos_availability_zone] + target_label: ionos_zone diff --git a/go.mod b/go.mod index d0f12ed7a95..9144728eee0 100644 --- a/go.mod +++ b/go.mod @@ -35,6 +35,7 @@ require ( github.com/hashicorp/go-hclog v0.12.2 // indirect github.com/hashicorp/go-immutable-radix v1.2.0 // indirect github.com/hetznercloud/hcloud-go v1.33.1 + github.com/ionos-cloud/sdk-go/v6 v6.0.5851 github.com/json-iterator/go v1.1.12 github.com/kolo/xmlrpc v0.0.0-20201022064351-38db28db192b github.com/linode/linodego v1.4.1 diff --git a/go.sum b/go.sum index b9ee09e3fa5..97143e15b44 100644 --- a/go.sum +++ b/go.sum @@ -765,6 +765,8 @@ github.com/imdario/mergo v0.3.12/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= github.com/influxdata/influxdb1-client v0.0.0-20191209144304-8bf82d3c094d/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo= github.com/intel/goresctrl v0.2.0/go.mod h1:+CZdzouYFn5EsxgqAQTEzMfwKwuc0fVdMrT9FCCAVRQ= +github.com/ionos-cloud/sdk-go/v6 v6.0.5851 h1:Xjdta3uR5SDLXXl0oahgVIJ+AQNFCyOCuAwxPAXFUCM= +github.com/ionos-cloud/sdk-go/v6 v6.0.5851/go.mod h1:UE3V/2DjnqD5doOqtjYqzJRMpI1RiwrvuuSEPX1pdnk= github.com/j-keck/arping v0.0.0-20160618110441-2cf9dc699c56/go.mod h1:ymszkNOg6tORTn+6F6j+Jc8TOr5osrynvN6ivFWZ2GA= github.com/j-keck/arping v1.0.2/go.mod h1:aJbELhR92bSk7tp79AWM/ftfc90EfEi2bQJrbBFOsPw= github.com/jessevdk/go-flags v1.5.0/go.mod h1:Fw0T6WPc1dYxT4mKEZRfG5kJhaTDP9pj1c2EWnYs/m4= diff --git a/plugins.yml b/plugins.yml index 498ec22c6fe..ee1809ce42d 100644 --- a/plugins.yml +++ b/plugins.yml @@ -6,6 +6,7 @@ - github.com/prometheus/prometheus/discovery/eureka - github.com/prometheus/prometheus/discovery/gce - github.com/prometheus/prometheus/discovery/hetzner +- github.com/prometheus/prometheus/discovery/ionos - github.com/prometheus/prometheus/discovery/kubernetes - github.com/prometheus/prometheus/discovery/linode - github.com/prometheus/prometheus/discovery/marathon diff --git a/plugins/plugins.go b/plugins/plugins.go index 2247f805adb..ebf46ba5c01 100644 --- a/plugins/plugins.go +++ b/plugins/plugins.go @@ -40,6 +40,9 @@ import ( // Register hetzner plugin. _ "github.com/prometheus/prometheus/discovery/hetzner" + // Register ionos plugin. + _ "github.com/prometheus/prometheus/discovery/ionos" + // Register kubernetes plugin. _ "github.com/prometheus/prometheus/discovery/kubernetes" From 42f574d5ac2e0ae9aaa65db1e40b3b9524d99ab6 Mon Sep 17 00:00:00 2001 From: Julien Pivotto Date: Fri, 20 May 2022 21:43:58 +0200 Subject: [PATCH 060/135] Remove "This function was added in Prometheus 2.0" (#10719) Since Prometheus documentation is versioned, do not write down that a specific function was added in Prom 2.0, for consistency. Signed-off-by: Julien Pivotto --- docs/querying/functions.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/docs/querying/functions.md b/docs/querying/functions.md index 94bd48632ef..d4236f0b86a 100644 --- a/docs/querying/functions.md +++ b/docs/querying/functions.md @@ -411,8 +411,6 @@ expression is to be evaluated. `timestamp(v instant-vector)` returns the timestamp of each of the samples of the given vector as the number of seconds since January 1, 1970 UTC. -*This function was added in Prometheus 2.0* - ## `vector()` `vector(s scalar)` returns the scalar `s` as a vector with no labels. From d3c9c4f57488d924cf9a6ba3b1a7e98f6cf35464 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Mierzwa?= Date: Fri, 20 May 2022 22:26:06 +0100 Subject: [PATCH 061/135] Stop rule manager before TSDB is stopped (#10680) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit During shutdown TSDB is stopped before rule manager is stopped. Since TSDB shutdown can take a long time (minutes or 10s of minutes) it keeps rule manager running while parts of Prometheus are already stopped (most notebly scrape manager). This can cause false positive alerts to fire, mostly those that rely on absent() calls since new sample appends will stop while alert queries are still evaluated. Stop rules before stopping TSDB and scrape manager to avoid this problem. Signed-off-by: Łukasz Mierzwa --- cmd/prometheus/main.go | 27 +++++++++++++++------------ rules/manager.go | 1 + 2 files changed, 16 insertions(+), 12 deletions(-) diff --git a/cmd/prometheus/main.go b/cmd/prometheus/main.go index 4c6d2c4a89e..549a5b3fdd5 100644 --- a/cmd/prometheus/main.go +++ b/cmd/prometheus/main.go @@ -838,6 +838,19 @@ func main() { }, ) } + if !agentMode { + // Rule manager. + g.Add( + func() error { + <-reloadReady.C + ruleManager.Run() + return nil + }, + func(err error) { + ruleManager.Stop() + }, + ) + } { // Scrape manager. g.Add( @@ -855,6 +868,8 @@ func main() { func(err error) { // Scrape manager needs to be stopped before closing the local TSDB // so that it doesn't try to write samples to a closed storage. + // We should also wait for rule manager to be fully stopped to ensure + // we don't trigger any false positive alerts for rules using absent(). level.Info(logger).Log("msg", "Stopping scrape manager...") scrapeManager.Stop() }, @@ -940,18 +955,6 @@ func main() { ) } if !agentMode { - // Rule manager. - g.Add( - func() error { - <-reloadReady.C - ruleManager.Run() - return nil - }, - func(err error) { - ruleManager.Stop() - }, - ) - // TSDB. opts := cfg.tsdb.ToTSDBOptions() cancel := make(chan struct{}) diff --git a/rules/manager.go b/rules/manager.go index 5ca05505d9e..a9179bacf45 100644 --- a/rules/manager.go +++ b/rules/manager.go @@ -934,6 +934,7 @@ func NewManager(o *ManagerOptions) *Manager { // Run starts processing of the rule manager. It is blocking. func (m *Manager) Run() { + level.Info(m.logger).Log("msg", "Starting rule manager...") m.start() <-m.done } From af5ea213f79e9cd0fe74e01bca22cb92f7987e43 Mon Sep 17 00:00:00 2001 From: Ben Ye Date: Sun, 22 May 2022 18:10:45 -0700 Subject: [PATCH 062/135] promtool: support matchers when querying label values (#10727) * promtool: support matchers when querying label values Signed-off-by: Ben Ye * address review comment Signed-off-by: Ben Ye --- cmd/promtool/main.go | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/cmd/promtool/main.go b/cmd/promtool/main.go index 0381a3dc22d..5098a190336 100644 --- a/cmd/promtool/main.go +++ b/cmd/promtool/main.go @@ -151,6 +151,7 @@ func main() { queryLabelsName := queryLabelsCmd.Arg("name", "Label name to provide label values for.").Required().String() queryLabelsBegin := queryLabelsCmd.Flag("start", "Start time (RFC3339 or Unix timestamp).").String() queryLabelsEnd := queryLabelsCmd.Flag("end", "End time (RFC3339 or Unix timestamp).").String() + queryLabelsMatch := queryLabelsCmd.Flag("match", "Series selector. Can be specified multiple times.").Strings() testCmd := app.Command("test", "Unit testing.") testRulesCmd := testCmd.Command("rules", "Unit tests for rules.") @@ -265,7 +266,7 @@ func main() { os.Exit(debugAll(*debugAllServer)) case queryLabelsCmd.FullCommand(): - os.Exit(QueryLabels(*queryLabelsServer, *queryLabelsName, *queryLabelsBegin, *queryLabelsEnd, p)) + os.Exit(QueryLabels(*queryLabelsServer, *queryLabelsMatch, *queryLabelsName, *queryLabelsBegin, *queryLabelsEnd, p)) case testRulesCmd.FullCommand(): os.Exit(RulesUnitTest( @@ -929,7 +930,7 @@ func QuerySeries(url *url.URL, matchers []string, start, end string, p printer) } // QueryLabels queries for label values against a Prometheus server. -func QueryLabels(url *url.URL, name, start, end string, p printer) int { +func QueryLabels(url *url.URL, matchers []string, name, start, end string, p printer) int { if url.Scheme == "" { url.Scheme = "http" } @@ -953,7 +954,7 @@ func QueryLabels(url *url.URL, name, start, end string, p printer) int { // Run query against client. api := v1.NewAPI(c) ctx, cancel := context.WithTimeout(context.Background(), 2*time.Minute) - val, warn, err := api.LabelValues(ctx, name, []string{}, stime, etime) + val, warn, err := api.LabelValues(ctx, name, matchers, stime, etime) cancel() for _, v := range warn { From 8a01943abcf0c6af4bf4c81bb3e41dd1d883e9b9 Mon Sep 17 00:00:00 2001 From: Matthieu MOREL Date: Mon, 23 May 2022 09:54:32 +0200 Subject: [PATCH 063/135] refactor (package config): move from github.com/pkg/errors to 'errors' and 'fmt' packages (#10724) Signed-off-by: Matthieu MOREL --- config/config.go | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/config/config.go b/config/config.go index 6ab790f6106..ce17803f97a 100644 --- a/config/config.go +++ b/config/config.go @@ -14,6 +14,7 @@ package config import ( + "errors" "fmt" "net/url" "os" @@ -25,7 +26,6 @@ import ( "github.com/go-kit/log" "github.com/go-kit/log/level" "github.com/grafana/regexp" - "github.com/pkg/errors" "github.com/prometheus/common/config" "github.com/prometheus/common/model" "github.com/prometheus/common/sigv4" @@ -108,7 +108,7 @@ func LoadFile(filename string, agentMode, expandExternalLabels bool, logger log. } cfg, err := Load(string(content), expandExternalLabels, logger) if err != nil { - return nil, errors.Wrapf(err, "parsing YAML file %s", filename) + return nil, fmt.Errorf("parsing YAML file %s: %w", filename, err) } if agentMode { @@ -276,7 +276,7 @@ func (c *Config) UnmarshalYAML(unmarshal func(interface{}) error) error { for _, rf := range c.RuleFiles { if !patRulePath.MatchString(rf) { - return errors.Errorf("invalid rule file path %q", rf) + return fmt.Errorf("invalid rule file path %q", rf) } } // Do global overrides and validate unique names. @@ -291,7 +291,7 @@ func (c *Config) UnmarshalYAML(unmarshal func(interface{}) error) error { scfg.ScrapeInterval = c.GlobalConfig.ScrapeInterval } if scfg.ScrapeTimeout > scfg.ScrapeInterval { - return errors.Errorf("scrape timeout greater than scrape interval for scrape config with job name %q", scfg.JobName) + return fmt.Errorf("scrape timeout greater than scrape interval for scrape config with job name %q", scfg.JobName) } if scfg.ScrapeTimeout == 0 { if c.GlobalConfig.ScrapeTimeout > scfg.ScrapeInterval { @@ -302,7 +302,7 @@ func (c *Config) UnmarshalYAML(unmarshal func(interface{}) error) error { } if _, ok := jobNames[scfg.JobName]; ok { - return errors.Errorf("found multiple scrape configs with job name %q", scfg.JobName) + return fmt.Errorf("found multiple scrape configs with job name %q", scfg.JobName) } jobNames[scfg.JobName] = struct{}{} } @@ -313,7 +313,7 @@ func (c *Config) UnmarshalYAML(unmarshal func(interface{}) error) error { } // Skip empty names, we fill their name with their config hash in remote write code. if _, ok := rwNames[rwcfg.Name]; ok && rwcfg.Name != "" { - return errors.Errorf("found multiple remote write configs with job name %q", rwcfg.Name) + return fmt.Errorf("found multiple remote write configs with job name %q", rwcfg.Name) } rwNames[rwcfg.Name] = struct{}{} } @@ -324,7 +324,7 @@ func (c *Config) UnmarshalYAML(unmarshal func(interface{}) error) error { } // Skip empty names, we fill their name with their config hash in remote read code. if _, ok := rrNames[rrcfg.Name]; ok && rrcfg.Name != "" { - return errors.Errorf("found multiple remote read configs with job name %q", rrcfg.Name) + return fmt.Errorf("found multiple remote read configs with job name %q", rrcfg.Name) } rrNames[rrcfg.Name] = struct{}{} } @@ -363,10 +363,10 @@ func (c *GlobalConfig) UnmarshalYAML(unmarshal func(interface{}) error) error { for _, l := range gc.ExternalLabels { if !model.LabelName(l.Name).IsValid() { - return errors.Errorf("%q is not a valid label name", l.Name) + return fmt.Errorf("%q is not a valid label name", l.Name) } if !model.LabelValue(l.Value).IsValid() { - return errors.Errorf("%q is not a valid label value", l.Value) + return fmt.Errorf("%q is not a valid label value", l.Value) } } @@ -741,7 +741,7 @@ func checkStaticTargets(configs discovery.Configs) error { func CheckTargetAddress(address model.LabelValue) error { // For now check for a URL, we may want to expand this later. if strings.Contains(string(address), "/") { - return errors.Errorf("%q is not a valid hostname", address) + return fmt.Errorf("%q is not a valid hostname", address) } return nil } @@ -810,7 +810,7 @@ func validateHeadersForTracing(headers map[string]string) error { return errors.New("custom authorization header configuration is not yet supported") } if _, ok := reservedHeaders[strings.ToLower(header)]; ok { - return errors.Errorf("%s is a reserved header. It must not be changed", header) + return fmt.Errorf("%s is a reserved header. It must not be changed", header) } } return nil @@ -822,7 +822,7 @@ func validateHeaders(headers map[string]string) error { return errors.New("authorization header must be changed via the basic_auth, authorization, oauth2, or sigv4 parameter") } if _, ok := reservedHeaders[strings.ToLower(header)]; ok { - return errors.Errorf("%s is a reserved header. It must not be changed", header) + return fmt.Errorf("%s is a reserved header. It must not be changed", header) } } return nil From 070e409dbaf2ca1950e49efb4a16fecfa4dbe04c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Mierzwa?= Date: Mon, 23 May 2022 10:42:01 +0100 Subject: [PATCH 064/135] Add prometheus_ready metric (#10682) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit When Prometheus starts it can take a long time before WAL is replayed and it can do anything useful. While it's starting it exposes metrics and other Prometheus servers can scrape it. We do have alerts that fire if any Prometheus server is not ingesting samples and so far we've been dealing with instances that are starting for a long time by adding a check on Prometheus process uptime. Relying on uptime isn't ideal because the time needed to start depends on the number of metrics scraped, and so on the amount of data in WAL. To help write better alerts it would be great if Prometheus exposed a metric that tells us it's fully started, that way any alert that suppose to notify us about any runtime issue can filter out starting instances. Signed-off-by: Łukasz Mierzwa --- cmd/prometheus/main.go | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/cmd/prometheus/main.go b/cmd/prometheus/main.go index 549a5b3fdd5..ccc41a566c7 100644 --- a/cmd/prometheus/main.go +++ b/cmd/prometheus/main.go @@ -86,6 +86,10 @@ var ( Name: "prometheus_config_last_reload_success_timestamp_seconds", Help: "Timestamp of the last successful configuration reload.", }) + readyStatus = prometheus.NewGauge(prometheus.GaugeOpts{ + Name: "prometheus_ready", + Help: "Whether Prometheus startup was fully completed and the server is ready for normal operation.", + }) defaultRetentionString = "15d" defaultRetentionDuration model.Duration @@ -752,6 +756,7 @@ func main() { prometheus.MustRegister(configSuccess) prometheus.MustRegister(configSuccessTime) + prometheus.MustRegister(readyStatus) // Start all components while we wait for TSDB to open but only load // initial config and mark ourselves as ready after it completed. @@ -946,6 +951,7 @@ func main() { webHandler.Ready() level.Info(logger).Log("msg", "Server is ready to receive web requests.") + readyStatus.Set(1) <-cancel return nil }, From 29b58448e13d9c841683acf194a2aa70cff3a49c Mon Sep 17 00:00:00 2001 From: SuperQ Date: Mon, 23 May 2022 13:33:14 +0200 Subject: [PATCH 065/135] Update Go minimum version * Set Go minimum version to 1.17. * Update go.mod format for 1.17. * Remove unecessary exclude block for k8s.io/client-go. * Remove unecessary retract section. Signed-off-by: SuperQ --- go.mod | 196 ++++++++++++++++++++++++++++----------------------------- 1 file changed, 95 insertions(+), 101 deletions(-) diff --git a/go.mod b/go.mod index 9144728eee0..5f603764012 100644 --- a/go.mod +++ b/go.mod @@ -1,18 +1,14 @@ module github.com/prometheus/prometheus -go 1.16 +go 1.17 require ( github.com/Azure/azure-sdk-for-go v63.0.0+incompatible github.com/Azure/go-autorest/autorest v0.11.25 github.com/Azure/go-autorest/autorest/adal v0.9.18 - github.com/Azure/go-autorest/autorest/to v0.4.0 // indirect - github.com/Azure/go-autorest/autorest/validation v0.3.1 // indirect github.com/alecthomas/units v0.0.0-20211218093645-b94a6e3cc137 - github.com/armon/go-metrics v0.3.3 // indirect github.com/aws/aws-sdk-go v1.43.31 github.com/cespare/xxhash/v2 v2.1.2 - github.com/containerd/containerd v1.6.1 // indirect github.com/dennwc/varint v1.0.0 github.com/dgryski/go-sip13 v0.0.0-20200911182023-62edffca9245 github.com/digitalocean/godo v1.78.0 @@ -32,19 +28,15 @@ require ( github.com/grafana/regexp v0.0.0-20220304095617-2e8d9baf4ac2 github.com/grpc-ecosystem/grpc-gateway v1.16.0 github.com/hashicorp/consul/api v1.12.0 - github.com/hashicorp/go-hclog v0.12.2 // indirect - github.com/hashicorp/go-immutable-radix v1.2.0 // indirect github.com/hetznercloud/hcloud-go v1.33.1 github.com/ionos-cloud/sdk-go/v6 v6.0.5851 github.com/json-iterator/go v1.1.12 github.com/kolo/xmlrpc v0.0.0-20201022064351-38db28db192b github.com/linode/linodego v1.4.1 github.com/miekg/dns v1.1.48 - github.com/moby/term v0.0.0-20210619224110-3f7ff695adc6 // indirect github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f github.com/oklog/run v1.1.0 github.com/oklog/ulid v1.3.1 - github.com/opencontainers/image-spec v1.0.2 // indirect github.com/pkg/errors v0.9.1 github.com/prometheus/alertmanager v0.24.0 github.com/prometheus/client_golang v1.12.1 @@ -86,6 +78,100 @@ require ( k8s.io/klog/v2 v2.40.1 ) +require ( + cloud.google.com/go/compute v1.6.0 // indirect + github.com/Azure/go-autorest v14.2.0+incompatible // indirect + github.com/Azure/go-autorest/autorest/date v0.3.0 // indirect + github.com/Azure/go-autorest/autorest/to v0.4.0 // indirect + github.com/Azure/go-autorest/autorest/validation v0.3.1 // indirect + github.com/Azure/go-autorest/logger v0.2.1 // indirect + github.com/Azure/go-autorest/tracing v0.6.0 // indirect + github.com/Microsoft/go-winio v0.5.1 // indirect + github.com/PuerkitoBio/purell v1.1.1 // indirect + github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 // indirect + github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751 // indirect + github.com/armon/go-metrics v0.3.3 // indirect + github.com/asaskevich/govalidator v0.0.0-20210307081110-f21760c49a8d // indirect + github.com/beorn7/perks v1.0.1 // indirect + github.com/cenkalti/backoff/v4 v4.1.2 // indirect + github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1 // indirect + github.com/containerd/containerd v1.6.1 // indirect + github.com/davecgh/go-spew v1.1.1 // indirect + github.com/docker/distribution v2.7.1+incompatible // indirect + github.com/docker/go-connections v0.4.0 // indirect + github.com/docker/go-units v0.4.0 // indirect + github.com/evanphx/json-patch v4.12.0+incompatible // indirect + github.com/fatih/color v1.13.0 // indirect + github.com/felixge/httpsnoop v1.0.2 // indirect + github.com/ghodss/yaml v1.0.0 // indirect + github.com/go-kit/kit v0.10.0 // indirect + github.com/go-logr/logr v1.2.3 // indirect + github.com/go-logr/stdr v1.2.2 // indirect + github.com/go-openapi/analysis v0.21.2 // indirect + github.com/go-openapi/errors v0.20.2 // indirect + github.com/go-openapi/jsonpointer v0.19.5 // indirect + github.com/go-openapi/jsonreference v0.19.6 // indirect + github.com/go-openapi/loads v0.21.1 // indirect + github.com/go-openapi/spec v0.20.4 // indirect + github.com/go-openapi/swag v0.21.1 // indirect + github.com/go-openapi/validate v0.21.0 // indirect + github.com/go-resty/resty/v2 v2.1.1-0.20191201195748-d7b97669fe48 // indirect + github.com/go-stack/stack v1.8.1 // indirect + github.com/golang-jwt/jwt/v4 v4.2.0 // indirect + github.com/golang/glog v1.0.0 // indirect + github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect + github.com/golang/protobuf v1.5.2 // indirect + github.com/google/go-cmp v0.5.7 // indirect + github.com/google/go-querystring v1.0.0 // indirect + github.com/google/gofuzz v1.2.0 // indirect + github.com/googleapis/gax-go/v2 v2.3.0 // indirect + github.com/googleapis/gnostic v0.5.5 // indirect + github.com/grpc-ecosystem/grpc-gateway/v2 v2.7.0 // indirect + github.com/hashicorp/go-cleanhttp v0.5.1 // indirect + github.com/hashicorp/go-hclog v0.12.2 // indirect + github.com/hashicorp/go-immutable-radix v1.2.0 // indirect + github.com/hashicorp/go-rootcerts v1.0.2 // indirect + github.com/hashicorp/golang-lru v0.5.4 // indirect + github.com/hashicorp/serf v0.9.6 // indirect + github.com/imdario/mergo v0.3.12 // indirect + github.com/jmespath/go-jmespath v0.4.0 // indirect + github.com/josharian/intern v1.0.0 // indirect + github.com/jpillora/backoff v1.0.0 // indirect + github.com/julienschmidt/httprouter v1.3.0 // indirect + github.com/mailru/easyjson v0.7.7 // indirect + github.com/mattn/go-colorable v0.1.12 // indirect + github.com/mattn/go-isatty v0.0.14 // indirect + github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 // indirect + github.com/mitchellh/go-homedir v1.1.0 // indirect + github.com/mitchellh/mapstructure v1.4.3 // indirect + github.com/moby/term v0.0.0-20210619224110-3f7ff695adc6 // indirect + github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect + github.com/modern-go/reflect2 v1.0.2 // indirect + github.com/opencontainers/go-digest v1.0.0 // indirect + github.com/opencontainers/image-spec v1.0.2 // indirect + github.com/pmezard/go-difflib v1.0.0 // indirect + github.com/prometheus/procfs v0.7.3 // indirect + github.com/sirupsen/logrus v1.8.1 // indirect + github.com/spf13/pflag v1.0.5 // indirect + go.mongodb.org/mongo-driver v1.8.3 // indirect + go.opencensus.io v0.23.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.6.1 // indirect + go.opentelemetry.io/otel/metric v0.28.0 // indirect + go.opentelemetry.io/proto/otlp v0.12.1 // indirect + golang.org/x/crypto v0.0.0-20211215153901-e495a2d5b3d3 // indirect + golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3 // indirect + golang.org/x/term v0.0.0-20210927222741-03fcf44c2211 // indirect + golang.org/x/text v0.3.7 // indirect + golang.org/x/xerrors v0.0.0-20220411194840-2f41105eb62f // indirect + google.golang.org/appengine v1.6.7 // indirect + gopkg.in/inf.v0 v0.9.1 // indirect + k8s.io/kube-openapi v0.0.0-20211115234752-e816edb12b65 // indirect + k8s.io/utils v0.0.0-20211116205334-6203023598ed // indirect + sigs.k8s.io/json v0.0.0-20211020170558-c049b76a60c6 // indirect + sigs.k8s.io/structured-merge-diff/v4 v4.2.1 // indirect + sigs.k8s.io/yaml v1.2.0 // indirect +) + replace ( k8s.io/klog => github.com/simonpasquier/klog-gokit v0.3.0 k8s.io/klog/v2 => github.com/simonpasquier/klog-gokit/v3 v3.0.0 @@ -99,95 +185,3 @@ exclude ( github.com/grpc-ecosystem/grpc-gateway v1.14.7 google.golang.org/api v0.30.0 ) - -// Exclude pre-go-mod kubernetes tags, as they are older -// than v0.x releases but are picked when we update the dependencies. -exclude ( - k8s.io/client-go v1.4.0 - k8s.io/client-go v1.4.0+incompatible - k8s.io/client-go v1.5.0 - k8s.io/client-go v1.5.0+incompatible - k8s.io/client-go v1.5.1 - k8s.io/client-go v1.5.1+incompatible - k8s.io/client-go v10.0.0+incompatible - k8s.io/client-go v11.0.0+incompatible - k8s.io/client-go v2.0.0+incompatible - k8s.io/client-go v2.0.0-alpha.1+incompatible - k8s.io/client-go v3.0.0+incompatible - k8s.io/client-go v3.0.0-beta.0+incompatible - k8s.io/client-go v4.0.0+incompatible - k8s.io/client-go v4.0.0-beta.0+incompatible - k8s.io/client-go v5.0.0+incompatible - k8s.io/client-go v5.0.1+incompatible - k8s.io/client-go v6.0.0+incompatible - k8s.io/client-go v7.0.0+incompatible - k8s.io/client-go v8.0.0+incompatible - k8s.io/client-go v9.0.0+incompatible - k8s.io/client-go v9.0.0-invalid+incompatible -) - -retract ( - v2.5.0+incompatible - v2.5.0-rc.2+incompatible - v2.5.0-rc.1+incompatible - v2.5.0-rc.0+incompatible - v2.4.3+incompatible - v2.4.2+incompatible - v2.4.1+incompatible - v2.4.0+incompatible - v2.4.0-rc.0+incompatible - v2.3.2+incompatible - v2.3.1+incompatible - v2.3.0+incompatible - v2.2.1+incompatible - v2.2.0+incompatible - v2.2.0-rc.1+incompatible - v2.2.0-rc.0+incompatible - v2.1.0+incompatible - v2.0.0+incompatible - v2.0.0-rc.3+incompatible - v2.0.0-rc.2+incompatible - v2.0.0-rc.1+incompatible - v2.0.0-rc.0+incompatible - v2.0.0-beta.5+incompatible - v2.0.0-beta.4+incompatible - v2.0.0-beta.3+incompatible - v2.0.0-beta.2+incompatible - v2.0.0-beta.1+incompatible - v2.0.0-beta.0+incompatible - v2.0.0-alpha.3+incompatible - v2.0.0-alpha.2+incompatible - v2.0.0-alpha.1+incompatible - v2.0.0-alpha.0+incompatible - v1.8.2 - v1.8.1 - v1.8.0 - v1.7.2 - v1.7.1 - v1.7.0 - v1.6.3 - v1.6.2 - v1.6.1 - v1.6.0 - v1.5.3 - v1.5.2 - v1.5.1 - v1.5.0 - v1.4.1 - v1.4.0 - v1.3.1 - v1.3.0 - v1.3.0-beta.0 - v1.2.3 - v1.2.2 - v1.2.1 - v1.2.0 - v1.1.3 - v1.1.2 - v1.1.1 - v1.1.0 - v1.0.2 - v1.0.1 - v1.0.0 - v1.0.0-rc.0 -) From 44e5f220c07c88e5e25650f278d3632b9df22cd0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Mierzwa?= Date: Mon, 23 May 2022 15:00:59 +0100 Subject: [PATCH 066/135] Move prometheus_ready metric to web package (#10729) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This moves prometheus_ready to the web package and links it with the ready variable that decides if HTTP requests should return 200 or 503. This is a follow up change from #10682 Signed-off-by: Łukasz Mierzwa --- cmd/prometheus/main.go | 9 ++------- web/web.go | 22 +++++++++++++++++----- web/web_test.go | 22 +++++++++++++++++----- 3 files changed, 36 insertions(+), 17 deletions(-) diff --git a/cmd/prometheus/main.go b/cmd/prometheus/main.go index ccc41a566c7..463b01ea872 100644 --- a/cmd/prometheus/main.go +++ b/cmd/prometheus/main.go @@ -86,10 +86,6 @@ var ( Name: "prometheus_config_last_reload_success_timestamp_seconds", Help: "Timestamp of the last successful configuration reload.", }) - readyStatus = prometheus.NewGauge(prometheus.GaugeOpts{ - Name: "prometheus_ready", - Help: "Whether Prometheus startup was fully completed and the server is ready for normal operation.", - }) defaultRetentionString = "15d" defaultRetentionDuration model.Duration @@ -756,7 +752,6 @@ func main() { prometheus.MustRegister(configSuccess) prometheus.MustRegister(configSuccessTime) - prometheus.MustRegister(readyStatus) // Start all components while we wait for TSDB to open but only load // initial config and mark ourselves as ready after it completed. @@ -812,6 +807,7 @@ func main() { }, func(err error) { close(cancel) + webHandler.SetReady(false) }, ) } @@ -949,9 +945,8 @@ func main() { reloadReady.Close() - webHandler.Ready() + webHandler.SetReady(true) level.Info(logger).Log("msg", "Server is ready to receive web requests.") - readyStatus.Set(1) <-cancel return nil }, diff --git a/web/web.go b/web/web.go index 132582872f1..959e6771c42 100644 --- a/web/web.go +++ b/web/web.go @@ -109,6 +109,7 @@ type metrics struct { requestCounter *prometheus.CounterVec requestDuration *prometheus.HistogramVec responseSize *prometheus.HistogramVec + readyStatus prometheus.Gauge } func newMetrics(r prometheus.Registerer) *metrics { @@ -136,10 +137,14 @@ func newMetrics(r prometheus.Registerer) *metrics { }, []string{"handler"}, ), + readyStatus: prometheus.NewGauge(prometheus.GaugeOpts{ + Name: "prometheus_ready", + Help: "Whether Prometheus startup was fully completed and the server is ready for normal operation.", + }), } if r != nil { - r.MustRegister(m.requestCounter, m.requestDuration, m.responseSize) + r.MustRegister(m.requestCounter, m.requestDuration, m.responseSize, m.readyStatus) registerFederationMetrics(r) } return m @@ -301,7 +306,7 @@ func New(logger log.Logger, o *Options) *Handler { now: model.Now, } - h.ready.Store(0) + h.SetReady(false) factoryTr := func(_ context.Context) api_v1.TargetRetriever { return h.scrapeManager } factoryAr := func(_ context.Context) api_v1.AlertmanagerRetriever { return h.notifier } @@ -503,9 +508,16 @@ func serveDebug(w http.ResponseWriter, req *http.Request) { } } -// Ready sets Handler to be ready. -func (h *Handler) Ready() { - h.ready.Store(1) +// SetReady sets the ready status of our web Handler +func (h *Handler) SetReady(v bool) { + if v { + h.ready.Store(1) + h.metrics.readyStatus.Set(1) + return + } + + h.ready.Store(0) + h.metrics.readyStatus.Set(0) } // Verifies whether the server is ready or not. diff --git a/web/web_test.go b/web/web_test.go index 2ea21a9ecb3..102b30a15bc 100644 --- a/web/web_test.go +++ b/web/web_test.go @@ -146,7 +146,7 @@ func TestReadyAndHealthy(t *testing.T) { cleanupTestResponse(t, resp) // Set to ready. - webHandler.Ready() + webHandler.SetReady(true) for _, u := range []string{ baseURL + "/-/healthy", @@ -245,7 +245,7 @@ func TestRoutePrefix(t *testing.T) { cleanupTestResponse(t, resp) // Set to ready. - webHandler.Ready() + webHandler.SetReady(true) resp, err = http.Get(baseURL + opts.RoutePrefix + "/-/healthy") require.NoError(t, err) @@ -292,7 +292,7 @@ func TestDebugHandler(t *testing.T) { }, } handler := New(nil, opts) - handler.Ready() + handler.SetReady(true) w := httptest.NewRecorder() @@ -329,16 +329,28 @@ func TestHTTPMetrics(t *testing.T) { code := getReady() require.Equal(t, http.StatusServiceUnavailable, code) + ready := handler.metrics.readyStatus + require.Equal(t, 0, int(prom_testutil.ToFloat64(ready))) counter := handler.metrics.requestCounter require.Equal(t, 1, int(prom_testutil.ToFloat64(counter.WithLabelValues("/-/ready", strconv.Itoa(http.StatusServiceUnavailable))))) - handler.Ready() + handler.SetReady(true) for range [2]int{} { code = getReady() require.Equal(t, http.StatusOK, code) } + require.Equal(t, 1, int(prom_testutil.ToFloat64(ready))) require.Equal(t, 2, int(prom_testutil.ToFloat64(counter.WithLabelValues("/-/ready", strconv.Itoa(http.StatusOK))))) require.Equal(t, 1, int(prom_testutil.ToFloat64(counter.WithLabelValues("/-/ready", strconv.Itoa(http.StatusServiceUnavailable))))) + + handler.SetReady(false) + for range [2]int{} { + code = getReady() + require.Equal(t, http.StatusServiceUnavailable, code) + } + require.Equal(t, 0, int(prom_testutil.ToFloat64(ready))) + require.Equal(t, 2, int(prom_testutil.ToFloat64(counter.WithLabelValues("/-/ready", strconv.Itoa(http.StatusOK))))) + require.Equal(t, 3, int(prom_testutil.ToFloat64(counter.WithLabelValues("/-/ready", strconv.Itoa(http.StatusServiceUnavailable))))) } func TestShutdownWithStaleConnection(t *testing.T) { @@ -510,7 +522,7 @@ func TestAgentAPIEndPoints(t *testing.T) { opts.Flags = map[string]string{} webHandler := New(nil, opts) - webHandler.Ready() + webHandler.SetReady(true) webHandler.config = &config.Config{} webHandler.notifier = ¬ifier.Manager{} l, err := webHandler.Listener() From 0d94cdf1076b4eee2e8c3fc994f2acc121794926 Mon Sep 17 00:00:00 2001 From: Julien Pivotto Date: Mon, 23 May 2022 16:21:50 +0200 Subject: [PATCH 067/135] rules: remove classic UI code (#10730) Signed-off-by: Julien Pivotto --- rules/alerting.go | 38 -------------------------------------- rules/alerting_test.go | 18 ------------------ rules/manager.go | 4 ---- rules/recording.go | 24 ------------------------ rules/recording_test.go | 16 ---------------- 5 files changed, 100 deletions(-) diff --git a/rules/alerting.go b/rules/alerting.go index 34155a6dc7d..7fd5c68d78b 100644 --- a/rules/alerting.go +++ b/rules/alerting.go @@ -16,7 +16,6 @@ package rules import ( "context" "fmt" - html_template "html/template" "net/url" "strings" "sync" @@ -35,7 +34,6 @@ import ( "github.com/prometheus/prometheus/promql/parser" "github.com/prometheus/prometheus/storage" "github.com/prometheus/prometheus/template" - "github.com/prometheus/prometheus/util/strutil" ) const ( @@ -44,8 +42,6 @@ const ( // AlertForStateMetricName is the metric name for 'for' state of alert. alertForStateMetricName = "ALERTS_FOR_STATE" - // AlertNameLabel is the label name indicating the name of an alert. - alertNameLabel = "alertname" // AlertStateLabel is the label name indicating the state of an alert. alertStateLabel = "alertstate" ) @@ -548,37 +544,3 @@ func (r *AlertingRule) String() string { return string(byt) } - -// HTMLSnippet returns an HTML snippet representing this alerting rule. The -// resulting snippet is expected to be presented in a
     element, so that
    -// line breaks and other returned whitespace is respected.
    -func (r *AlertingRule) HTMLSnippet(pathPrefix string) html_template.HTML {
    -	alertMetric := model.Metric{
    -		model.MetricNameLabel: alertMetricName,
    -		alertNameLabel:        model.LabelValue(r.name),
    -	}
    -
    -	labelsMap := make(map[string]string, len(r.labels))
    -	for _, l := range r.labels {
    -		labelsMap[l.Name] = html_template.HTMLEscapeString(l.Value)
    -	}
    -
    -	annotationsMap := make(map[string]string, len(r.annotations))
    -	for _, l := range r.annotations {
    -		annotationsMap[l.Name] = html_template.HTMLEscapeString(l.Value)
    -	}
    -
    -	ar := rulefmt.Rule{
    -		Alert:       fmt.Sprintf("%s", pathPrefix+strutil.TableLinkForExpression(alertMetric.String()), r.name),
    -		Expr:        fmt.Sprintf("%s", pathPrefix+strutil.TableLinkForExpression(r.vector.String()), html_template.HTMLEscapeString(r.vector.String())),
    -		For:         model.Duration(r.holdDuration),
    -		Labels:      labelsMap,
    -		Annotations: annotationsMap,
    -	}
    -
    -	byt, err := yaml.Marshal(ar)
    -	if err != nil {
    -		return html_template.HTML(fmt.Sprintf("error marshaling alerting rule: %q", html_template.HTMLEscapeString(err.Error())))
    -	}
    -	return html_template.HTML(byt)
    -}
    diff --git a/rules/alerting_test.go b/rules/alerting_test.go
    index e5650a0ccd2..7e34a3ad138 100644
    --- a/rules/alerting_test.go
    +++ b/rules/alerting_test.go
    @@ -15,7 +15,6 @@ package rules
     
     import (
     	"context"
    -	"html/template"
     	"testing"
     	"time"
     
    @@ -31,23 +30,6 @@ import (
     	"github.com/prometheus/prometheus/util/teststorage"
     )
     
    -func TestAlertingRuleHTMLSnippet(t *testing.T) {
    -	expr, err := parser.ParseExpr(`foo{html="BOLD"}`)
    -	require.NoError(t, err)
    -	rule := NewAlertingRule("testrule", expr, 0, labels.FromStrings("html", "BOLD"), labels.FromStrings("html", "BOLD"), nil, "", false, nil)
    -
    -	const want = template.HTML(`alert: testrule
    -expr: foo{html="<b>BOLD<b>"}
    -labels:
    -  html: '<b>BOLD</b>'
    -annotations:
    -  html: '<b>BOLD</b>'
    -`)
    -
    -	got := rule.HTMLSnippet("/test/prefix")
    -	require.Equal(t, want, got, "incorrect HTML snippet; want:\n\n|%v|\n\ngot:\n\n|%v|", want, got)
    -}
    -
     func TestAlertingRuleState(t *testing.T) {
     	tests := []struct {
     		name   string
    diff --git a/rules/manager.go b/rules/manager.go
    index a9179bacf45..f8e88b510de 100644
    --- a/rules/manager.go
    +++ b/rules/manager.go
    @@ -15,7 +15,6 @@ package rules
     
     import (
     	"context"
    -	html_template "html/template"
     	"math"
     	"net/url"
     	"sort"
    @@ -235,9 +234,6 @@ type Rule interface {
     	// GetEvaluationTimestamp returns last evaluation timestamp.
     	// NOTE: Used dynamically by rules.html template.
     	GetEvaluationTimestamp() time.Time
    -	// HTMLSnippet returns a human-readable string representation of the rule,
    -	// decorated with HTML elements for use the web frontend.
    -	HTMLSnippet(pathPrefix string) html_template.HTML
     }
     
     // Group is a set of rules that have a logical relation.
    diff --git a/rules/recording.go b/rules/recording.go
    index 0681db9a2dd..2ce15979f78 100644
    --- a/rules/recording.go
    +++ b/rules/recording.go
    @@ -16,7 +16,6 @@ package rules
     import (
     	"context"
     	"fmt"
    -	"html/template"
     	"net/url"
     	"sync"
     	"time"
    @@ -27,7 +26,6 @@ import (
     	"github.com/prometheus/prometheus/model/rulefmt"
     	"github.com/prometheus/prometheus/promql"
     	"github.com/prometheus/prometheus/promql/parser"
    -	"github.com/prometheus/prometheus/util/strutil"
     )
     
     // A RecordingRule records its vector expression into new timeseries.
    @@ -179,25 +177,3 @@ func (rule *RecordingRule) GetEvaluationTimestamp() time.Time {
     	defer rule.mtx.Unlock()
     	return rule.evaluationTimestamp
     }
    -
    -// HTMLSnippet returns an HTML snippet representing this rule.
    -func (rule *RecordingRule) HTMLSnippet(pathPrefix string) template.HTML {
    -	ruleExpr := rule.vector.String()
    -	labels := make(map[string]string, len(rule.labels))
    -	for _, l := range rule.labels {
    -		labels[l.Name] = template.HTMLEscapeString(l.Value)
    -	}
    -
    -	r := rulefmt.Rule{
    -		Record: fmt.Sprintf(`%s`, pathPrefix+strutil.TableLinkForExpression(rule.name), rule.name),
    -		Expr:   fmt.Sprintf(`%s`, pathPrefix+strutil.TableLinkForExpression(ruleExpr), template.HTMLEscapeString(ruleExpr)),
    -		Labels: labels,
    -	}
    -
    -	byt, err := yaml.Marshal(r)
    -	if err != nil {
    -		return template.HTML(fmt.Sprintf("error marshaling recording rule: %q", template.HTMLEscapeString(err.Error())))
    -	}
    -
    -	return template.HTML(byt)
    -}
    diff --git a/rules/recording_test.go b/rules/recording_test.go
    index dd06b775fba..366dac52a0f 100644
    --- a/rules/recording_test.go
    +++ b/rules/recording_test.go
    @@ -15,7 +15,6 @@ package rules
     
     import (
     	"context"
    -	"html/template"
     	"testing"
     	"time"
     
    @@ -84,21 +83,6 @@ func TestRuleEval(t *testing.T) {
     	}
     }
     
    -func TestRecordingRuleHTMLSnippet(t *testing.T) {
    -	expr, err := parser.ParseExpr(`foo{html="BOLD"}`)
    -	require.NoError(t, err)
    -	rule := NewRecordingRule("testrule", expr, labels.FromStrings("html", "BOLD"))
    -
    -	const want = template.HTML(`record: testrule
    -expr: foo{html="<b>BOLD<b>"}
    -labels:
    -  html: '<b>BOLD</b>'
    -`)
    -
    -	got := rule.HTMLSnippet("/test/prefix")
    -	require.Equal(t, want, got, "incorrect HTML snippet; want:\n\n%s\n\ngot:\n\n%s", want, got)
    -}
    -
     // TestRuleEvalDuplicate tests for duplicate labels in recorded metrics, see #5529.
     func TestRuleEvalDuplicate(t *testing.T) {
     	storage := teststorage.New(t)
    
    From 4c13d305d3ead32585a6aa75b4c935cc3fdbc6cf Mon Sep 17 00:00:00 2001
    From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
    Date: Mon, 23 May 2022 16:06:42 +0000
    Subject: [PATCH 068/135] build(deps): bump github.com/fsnotify/fsnotify from
     1.5.1 to 1.5.4
    
    Bumps [github.com/fsnotify/fsnotify](https://github.com/fsnotify/fsnotify) from 1.5.1 to 1.5.4.
    - [Release notes](https://github.com/fsnotify/fsnotify/releases)
    - [Changelog](https://github.com/fsnotify/fsnotify/blob/main/CHANGELOG.md)
    - [Commits](https://github.com/fsnotify/fsnotify/compare/v1.5.1...v1.5.4)
    
    ---
    updated-dependencies:
    - dependency-name: github.com/fsnotify/fsnotify
      dependency-type: direct:production
      update-type: version-update:semver-patch
    ...
    
    Signed-off-by: dependabot[bot] 
    ---
     go.mod | 2 +-
     go.sum | 4 ++--
     2 files changed, 3 insertions(+), 3 deletions(-)
    
    diff --git a/go.mod b/go.mod
    index 5f603764012..057b14c00df 100644
    --- a/go.mod
    +++ b/go.mod
    @@ -16,7 +16,7 @@ require (
     	github.com/edsrzf/mmap-go v1.1.0
     	github.com/envoyproxy/go-control-plane v0.10.2-0.20220325020618-49ff273808a1
     	github.com/envoyproxy/protoc-gen-validate v0.6.7
    -	github.com/fsnotify/fsnotify v1.5.1
    +	github.com/fsnotify/fsnotify v1.5.4
     	github.com/go-kit/log v0.2.0
     	github.com/go-logfmt/logfmt v0.5.1
     	github.com/go-openapi/strfmt v0.21.2
    diff --git a/go.sum b/go.sum
    index 97143e15b44..2768826e07a 100644
    --- a/go.sum
    +++ b/go.sum
    @@ -431,8 +431,8 @@ github.com/franela/goreq v0.0.0-20171204163338-bcd34c9993f8/go.mod h1:ZhphrRTfi2
     github.com/frankban/quicktest v1.11.3/go.mod h1:wRf/ReqHper53s+kmmSZizM8NamnL3IM0I9ntUbOk+k=
     github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
     github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ=
    -github.com/fsnotify/fsnotify v1.5.1 h1:mZcQUHVQUQWoPXXtuf9yuEXKudkV2sx1E06UadKWpgI=
    -github.com/fsnotify/fsnotify v1.5.1/go.mod h1:T3375wBYaZdLLcVNkcVbzGHY7f1l/uK5T5Ai1i3InKU=
    +github.com/fsnotify/fsnotify v1.5.4 h1:jRbGcIw6P2Meqdwuo0H1p6JVLbL5DHKAKlYndzMwVZI=
    +github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU=
     github.com/fullsailor/pkcs7 v0.0.0-20190404230743-d7302db945fa/go.mod h1:KnogPXtdwXqoenmZCw6S+25EAm2MkxbG0deNDu4cbSA=
     github.com/garyburd/redigo v0.0.0-20150301180006-535138d7bcd7/go.mod h1:NR3MbYisc3/PwhQ00EMzDiPmrwpPxAn5GI05/YaO1SY=
     github.com/getkin/kin-openapi v0.76.0/go.mod h1:660oXbgy5JFMKreazJaQTw7o+X00qeSyhcnluiMv+Xg=
    
    From 36eee11434477bf9c9740584ac647a612f599c65 Mon Sep 17 00:00:00 2001
    From: Matthieu MOREL 
    Date: Tue, 24 May 2022 08:58:59 +0200
    Subject: [PATCH 069/135] refactor (package cmd): move from
     github.com/pkg/errors to 'errors' and 'fmt' packages (#10733)
    
    Signed-off-by: Matthieu MOREL 
    
    Co-authored-by: Matthieu MOREL 
    ---
     cmd/prometheus/main.go      | 24 ++++++++++-----------
     cmd/prometheus/main_test.go | 13 ++++++++----
     cmd/promtool/archive.go     |  5 ++---
     cmd/promtool/backfill.go    | 42 ++++++++++++++++++++-----------------
     cmd/promtool/debug.go       | 14 ++++++-------
     cmd/promtool/main.go        | 40 +++++++++++++++++------------------
     cmd/promtool/rules.go       | 15 +++++++------
     cmd/promtool/tsdb.go        | 19 ++++++++---------
     cmd/promtool/unittest.go    | 20 +++++++++---------
     9 files changed, 98 insertions(+), 94 deletions(-)
    
    diff --git a/cmd/prometheus/main.go b/cmd/prometheus/main.go
    index 463b01ea872..7246f301247 100644
    --- a/cmd/prometheus/main.go
    +++ b/cmd/prometheus/main.go
    @@ -16,6 +16,7 @@ package main
     
     import (
     	"context"
    +	"errors"
     	"fmt"
     	"math"
     	"math/bits"
    @@ -38,7 +39,6 @@ import (
     	"github.com/grafana/regexp"
     	conntrack "github.com/mwitkow/go-conntrack"
     	"github.com/oklog/run"
    -	"github.com/pkg/errors"
     	"github.com/prometheus/client_golang/prometheus"
     	"github.com/prometheus/common/model"
     	"github.com/prometheus/common/promlog"
    @@ -397,7 +397,7 @@ func main() {
     
     	_, err := a.Parse(os.Args[1:])
     	if err != nil {
    -		fmt.Fprintln(os.Stderr, errors.Wrapf(err, "Error parsing commandline arguments"))
    +		fmt.Fprintln(os.Stderr, fmt.Errorf("Error parsing commandline arguments: %w", err))
     		a.Usage(os.Args[1:])
     		os.Exit(2)
     	}
    @@ -405,7 +405,7 @@ func main() {
     	logger := promlog.New(&cfg.promlogConfig)
     
     	if err := cfg.setFeatureListOptions(logger); err != nil {
    -		fmt.Fprintln(os.Stderr, errors.Wrapf(err, "Error parsing feature list"))
    +		fmt.Fprintln(os.Stderr, fmt.Errorf("Error parsing feature list: %w", err))
     		os.Exit(1)
     	}
     
    @@ -426,13 +426,13 @@ func main() {
     
     	cfg.web.ExternalURL, err = computeExternalURL(cfg.prometheusURL, cfg.web.ListenAddress)
     	if err != nil {
    -		fmt.Fprintln(os.Stderr, errors.Wrapf(err, "parse external URL %q", cfg.prometheusURL))
    +		fmt.Fprintln(os.Stderr, fmt.Errorf("parse external URL %q: %w", cfg.prometheusURL, err))
     		os.Exit(2)
     	}
     
     	cfg.web.CORSOrigin, err = compileCORSRegexString(cfg.corsRegexString)
     	if err != nil {
    -		fmt.Fprintln(os.Stderr, errors.Wrapf(err, "could not compile CORS regex string %q", cfg.corsRegexString))
    +		fmt.Fprintln(os.Stderr, fmt.Errorf("could not compile CORS regex string %q: %w", cfg.corsRegexString, err))
     		os.Exit(2)
     	}
     
    @@ -732,7 +732,7 @@ func main() {
     					fs, err := filepath.Glob(pat)
     					if err != nil {
     						// The only error can be a bad pattern.
    -						return errors.Wrapf(err, "error retrieving rule files for %s", pat)
    +						return fmt.Errorf("error retrieving rule files for %s: %w", pat, err)
     					}
     					files = append(files, fs...)
     				}
    @@ -940,7 +940,7 @@ func main() {
     				}
     
     				if err := reloadConfig(cfg.configFile, cfg.enableExpandExternalLabels, cfg.tsdb.EnableExemplarStorage, logger, noStepSubqueryInterval, reloaders...); err != nil {
    -					return errors.Wrapf(err, "error loading config from %q", cfg.configFile)
    +					return fmt.Errorf("error loading config from %q: %w", cfg.configFile, err)
     				}
     
     				reloadReady.Close()
    @@ -975,7 +975,7 @@ func main() {
     
     				db, err := openDBWithMetrics(localStoragePath, logger, prometheus.DefaultRegisterer, &opts, localStorage.getStats())
     				if err != nil {
    -					return errors.Wrapf(err, "opening storage failed")
    +					return fmt.Errorf("opening storage failed: %w", err)
     				}
     
     				switch fsType := prom_runtime.Statfs(localStoragePath); fsType {
    @@ -1031,7 +1031,7 @@ func main() {
     					&opts,
     				)
     				if err != nil {
    -					return errors.Wrap(err, "opening storage failed")
    +					return fmt.Errorf("opening storage failed: %w", err)
     				}
     
     				switch fsType := prom_runtime.Statfs(localStoragePath); fsType {
    @@ -1069,7 +1069,7 @@ func main() {
     		g.Add(
     			func() error {
     				if err := webHandler.Run(ctxWeb, listener, *webConfig); err != nil {
    -					return errors.Wrapf(err, "error starting web server")
    +					return fmt.Errorf("error starting web server: %w", err)
     				}
     				return nil
     			},
    @@ -1179,7 +1179,7 @@ func reloadConfig(filename string, expandExternalLabels, enableExemplarStorage b
     
     	conf, err := config.LoadFile(filename, agentMode, expandExternalLabels, logger)
     	if err != nil {
    -		return errors.Wrapf(err, "couldn't load configuration (--config.file=%q)", filename)
    +		return fmt.Errorf("couldn't load configuration (--config.file=%q): %w", filename, err)
     	}
     
     	if enableExemplarStorage {
    @@ -1198,7 +1198,7 @@ func reloadConfig(filename string, expandExternalLabels, enableExemplarStorage b
     		timings = append(timings, rl.name, time.Since(rstart))
     	}
     	if failed {
    -		return errors.Errorf("one or more errors occurred while applying the new configuration (--config.file=%q)", filename)
    +		return fmt.Errorf("one or more errors occurred while applying the new configuration (--config.file=%q)", filename)
     	}
     
     	noStepSuqueryInterval.Set(conf.GlobalConfig.EvaluationInterval)
    diff --git a/cmd/prometheus/main_test.go b/cmd/prometheus/main_test.go
    index cfdb5abdf0f..9a6dc667132 100644
    --- a/cmd/prometheus/main_test.go
    +++ b/cmd/prometheus/main_test.go
    @@ -16,6 +16,7 @@ package main
     import (
     	"bytes"
     	"context"
    +	"errors"
     	"fmt"
     	"io"
     	"math"
    @@ -121,7 +122,8 @@ func TestFailedStartupExitCode(t *testing.T) {
     	err := prom.Run()
     	require.Error(t, err)
     
    -	if exitError, ok := err.(*exec.ExitError); ok {
    +	var exitError *exec.ExitError
    +	if errors.As(err, &exitError) {
     		status := exitError.Sys().(syscall.WaitStatus)
     		require.Equal(t, expectedExitStatus, status.ExitStatus())
     	} else {
    @@ -233,7 +235,8 @@ func TestWALSegmentSizeBounds(t *testing.T) {
     
     		err = prom.Wait()
     		require.Error(t, err)
    -		if exitError, ok := err.(*exec.ExitError); ok {
    +		var exitError *exec.ExitError
    +		if errors.As(err, &exitError) {
     			status := exitError.Sys().(syscall.WaitStatus)
     			require.Equal(t, expectedExitStatus, status.ExitStatus())
     		} else {
    @@ -278,7 +281,8 @@ func TestMaxBlockChunkSegmentSizeBounds(t *testing.T) {
     
     		err = prom.Wait()
     		require.Error(t, err)
    -		if exitError, ok := err.(*exec.ExitError); ok {
    +		var exitError *exec.ExitError
    +		if errors.As(err, &exitError) {
     			status := exitError.Sys().(syscall.WaitStatus)
     			require.Equal(t, expectedExitStatus, status.ExitStatus())
     		} else {
    @@ -467,7 +471,8 @@ func TestModeSpecificFlags(t *testing.T) {
     
     			err = prom.Wait()
     			require.Error(t, err)
    -			if exitError, ok := err.(*exec.ExitError); ok {
    +			var exitError *exec.ExitError
    +			if errors.As(err, &exitError) {
     				status := exitError.Sys().(syscall.WaitStatus)
     				require.Equal(t, tc.exitStatus, status.ExitStatus())
     			} else {
    diff --git a/cmd/promtool/archive.go b/cmd/promtool/archive.go
    index cca148cb4d8..6edb741acda 100644
    --- a/cmd/promtool/archive.go
    +++ b/cmd/promtool/archive.go
    @@ -16,9 +16,8 @@ package main
     import (
     	"archive/tar"
     	"compress/gzip"
    +	"fmt"
     	"os"
    -
    -	"github.com/pkg/errors"
     )
     
     const filePerm = 0o666
    @@ -32,7 +31,7 @@ type tarGzFileWriter struct {
     func newTarGzFileWriter(archiveName string) (*tarGzFileWriter, error) {
     	file, err := os.Create(archiveName)
     	if err != nil {
    -		return nil, errors.Wrapf(err, "error creating archive %q", archiveName)
    +		return nil, fmt.Errorf("error creating archive %q: %w", archiveName, err)
     	}
     	gzw := gzip.NewWriter(file)
     	tw := tar.NewWriter(gzw)
    diff --git a/cmd/promtool/backfill.go b/cmd/promtool/backfill.go
    index d1c8f963373..3c23d2c0379 100644
    --- a/cmd/promtool/backfill.go
    +++ b/cmd/promtool/backfill.go
    @@ -15,12 +15,13 @@ package main
     
     import (
     	"context"
    +	"errors"
    +	"fmt"
     	"io"
     	"math"
     	"time"
     
     	"github.com/go-kit/log"
    -	"github.com/pkg/errors"
     
     	"github.com/prometheus/prometheus/model/labels"
     	"github.com/prometheus/prometheus/model/textparse"
    @@ -33,11 +34,11 @@ func getMinAndMaxTimestamps(p textparse.Parser) (int64, int64, error) {
     
     	for {
     		entry, err := p.Next()
    -		if err == io.EOF {
    +		if errors.Is(err, io.EOF) {
     			break
     		}
     		if err != nil {
    -			return 0, 0, errors.Wrap(err, "next")
    +			return 0, 0, fmt.Errorf("next: %w", err)
     		}
     
     		if entry != textparse.EntrySeries {
    @@ -46,7 +47,7 @@ func getMinAndMaxTimestamps(p textparse.Parser) (int64, int64, error) {
     
     		_, ts, _ := p.Series()
     		if ts == nil {
    -			return 0, 0, errors.Errorf("expected timestamp for series got none")
    +			return 0, 0, fmt.Errorf("expected timestamp for series got none")
     		}
     
     		if *ts > maxt {
    @@ -118,7 +119,7 @@ func createBlocks(input []byte, mint, maxt, maxBlockDuration int64, maxSamplesIn
     			// original interval later.
     			w, err := tsdb.NewBlockWriter(log.NewNopLogger(), outputDir, 2*blockDuration)
     			if err != nil {
    -				return errors.Wrap(err, "block writer")
    +				return fmt.Errorf("block writer: %w", err)
     			}
     			defer func() {
     				err = tsdb_errors.NewMulti(err, w.Close()).Err()
    @@ -130,11 +131,11 @@ func createBlocks(input []byte, mint, maxt, maxBlockDuration int64, maxSamplesIn
     			samplesCount := 0
     			for {
     				e, err := p.Next()
    -				if err == io.EOF {
    +				if errors.Is(err, io.EOF) {
     					break
     				}
     				if err != nil {
    -					return errors.Wrap(err, "parse")
    +					return fmt.Errorf("parse: %w", err)
     				}
     				if e != textparse.EntrySeries {
     					continue
    @@ -144,7 +145,7 @@ func createBlocks(input []byte, mint, maxt, maxBlockDuration int64, maxSamplesIn
     				if ts == nil {
     					l := labels.Labels{}
     					p.Metric(&l)
    -					return errors.Errorf("expected timestamp for series %v, got none", l)
    +					return fmt.Errorf("expected timestamp for series %v, got none", l)
     				}
     				if *ts < t {
     					continue
    @@ -160,7 +161,7 @@ func createBlocks(input []byte, mint, maxt, maxBlockDuration int64, maxSamplesIn
     				p.Metric(&l)
     
     				if _, err := app.Append(0, l, *ts, v); err != nil {
    -					return errors.Wrap(err, "add sample")
    +					return fmt.Errorf("add sample: %w", err)
     				}
     
     				samplesCount++
    @@ -172,7 +173,7 @@ func createBlocks(input []byte, mint, maxt, maxBlockDuration int64, maxSamplesIn
     				// Therefore the old appender is committed and a new one is created.
     				// This prevents keeping too many samples lined up in an appender and thus in RAM.
     				if err := app.Commit(); err != nil {
    -					return errors.Wrap(err, "commit")
    +					return fmt.Errorf("commit: %w", err)
     				}
     
     				app = w.Appender(ctx)
    @@ -180,18 +181,18 @@ func createBlocks(input []byte, mint, maxt, maxBlockDuration int64, maxSamplesIn
     			}
     
     			if err := app.Commit(); err != nil {
    -				return errors.Wrap(err, "commit")
    +				return fmt.Errorf("commit: %w", err)
     			}
     
     			block, err := w.Flush(ctx)
    -			switch err {
    -			case nil:
    +			switch {
    +			case err == nil:
     				if quiet {
     					break
     				}
     				blocks, err := db.Blocks()
     				if err != nil {
    -					return errors.Wrap(err, "get blocks")
    +					return fmt.Errorf("get blocks: %w", err)
     				}
     				for _, b := range blocks {
     					if b.Meta().ULID == block {
    @@ -200,15 +201,15 @@ func createBlocks(input []byte, mint, maxt, maxBlockDuration int64, maxSamplesIn
     						break
     					}
     				}
    -			case tsdb.ErrNoSeriesAppended:
    +			case errors.Is(err, tsdb.ErrNoSeriesAppended):
     			default:
    -				return errors.Wrap(err, "flush")
    +				return fmt.Errorf("flush: %w", err)
     			}
     
     			return nil
     		}()
     		if err != nil {
    -			return errors.Wrap(err, "process blocks")
    +			return fmt.Errorf("process blocks: %w", err)
     		}
     	}
     	return nil
    @@ -218,7 +219,10 @@ func backfill(maxSamplesInAppender int, input []byte, outputDir string, humanRea
     	p := textparse.NewOpenMetricsParser(input)
     	maxt, mint, err := getMinAndMaxTimestamps(p)
     	if err != nil {
    -		return errors.Wrap(err, "getting min and max timestamp")
    +		return fmt.Errorf("getting min and max timestamp: %w", err)
     	}
    -	return errors.Wrap(createBlocks(input, mint, maxt, int64(maxBlockDuration/time.Millisecond), maxSamplesInAppender, outputDir, humanReadable, quiet), "block creation")
    +	if err = createBlocks(input, mint, maxt, int64(maxBlockDuration/time.Millisecond), maxSamplesInAppender, outputDir, humanReadable, quiet); err != nil {
    +		return fmt.Errorf("block creation: %w", err)
    +	}
    +	return nil
     }
    diff --git a/cmd/promtool/debug.go b/cmd/promtool/debug.go
    index 310004480a0..6383aaface0 100644
    --- a/cmd/promtool/debug.go
    +++ b/cmd/promtool/debug.go
    @@ -17,8 +17,6 @@ import (
     	"fmt"
     	"io"
     	"net/http"
    -
    -	"github.com/pkg/errors"
     )
     
     type debugWriterConfig struct {
    @@ -30,7 +28,7 @@ type debugWriterConfig struct {
     func debugWrite(cfg debugWriterConfig) error {
     	archiver, err := newTarGzFileWriter(cfg.tarballName)
     	if err != nil {
    -		return errors.Wrap(err, "error creating a new archiver")
    +		return fmt.Errorf("error creating a new archiver: %w", err)
     	}
     
     	for _, endPointGroup := range cfg.endPointGroups {
    @@ -39,28 +37,28 @@ func debugWrite(cfg debugWriterConfig) error {
     			fmt.Println("collecting:", url)
     			res, err := http.Get(url)
     			if err != nil {
    -				return errors.Wrap(err, "error executing HTTP request")
    +				return fmt.Errorf("error executing HTTP request: %w", err)
     			}
     			body, err := io.ReadAll(res.Body)
     			res.Body.Close()
     			if err != nil {
    -				return errors.Wrap(err, "error reading the response body")
    +				return fmt.Errorf("error reading the response body: %w", err)
     			}
     
     			if endPointGroup.postProcess != nil {
     				body, err = endPointGroup.postProcess(body)
     				if err != nil {
    -					return errors.Wrap(err, "error post-processing HTTP response body")
    +					return fmt.Errorf("error post-processing HTTP response body: %w", err)
     				}
     			}
     			if err := archiver.write(filename, body); err != nil {
    -				return errors.Wrap(err, "error writing into the archive")
    +				return fmt.Errorf("error writing into the archive: %w", err)
     			}
     		}
     	}
     
     	if err := archiver.close(); err != nil {
    -		return errors.Wrap(err, "error closing archive writer")
    +		return fmt.Errorf("error closing archive writer: %w", err)
     	}
     
     	fmt.Printf("Compiling debug information complete, all files written in %q.\n", cfg.tarballName)
    diff --git a/cmd/promtool/main.go b/cmd/promtool/main.go
    index 5098a190336..01d953d2049 100644
    --- a/cmd/promtool/main.go
    +++ b/cmd/promtool/main.go
    @@ -17,6 +17,7 @@ import (
     	"bytes"
     	"context"
     	"encoding/json"
    +	"errors"
     	"fmt"
     	"io"
     	"math"
    @@ -32,7 +33,6 @@ import (
     
     	"github.com/go-kit/log"
     	"github.com/google/pprof/profile"
    -	"github.com/pkg/errors"
     	"github.com/prometheus/client_golang/api"
     	v1 "github.com/prometheus/client_golang/api/prometheus/v1"
     	"github.com/prometheus/client_golang/prometheus/promhttp"
    @@ -414,10 +414,10 @@ func checkConfig(agentMode bool, filename string, checkSyntaxOnly bool) ([]strin
     			// If an explicit file was given, error if it is not accessible.
     			if !strings.Contains(rf, "*") {
     				if len(rfs) == 0 {
    -					return nil, errors.Errorf("%q does not point to an existing file", rf)
    +					return nil, fmt.Errorf("%q does not point to an existing file", rf)
     				}
     				if err := checkFileExists(rfs[0]); err != nil {
    -					return nil, errors.Wrapf(err, "error checking rule file %q", rfs[0])
    +					return nil, fmt.Errorf("error checking rule file %q: %w", rfs[0], err)
     				}
     			}
     			ruleFiles = append(ruleFiles, rfs...)
    @@ -427,7 +427,7 @@ func checkConfig(agentMode bool, filename string, checkSyntaxOnly bool) ([]strin
     	for _, scfg := range cfg.ScrapeConfigs {
     		if !checkSyntaxOnly && scfg.HTTPClientConfig.Authorization != nil {
     			if err := checkFileExists(scfg.HTTPClientConfig.Authorization.CredentialsFile); err != nil {
    -				return nil, errors.Wrapf(err, "error checking authorization credentials or bearer token file %q", scfg.HTTPClientConfig.Authorization.CredentialsFile)
    +				return nil, fmt.Errorf("error checking authorization credentials or bearer token file %q: %w", scfg.HTTPClientConfig.Authorization.CredentialsFile, err)
     			}
     		}
     
    @@ -455,7 +455,7 @@ func checkConfig(agentMode bool, filename string, checkSyntaxOnly bool) ([]strin
     							var targetGroups []*targetgroup.Group
     							targetGroups, err = checkSDFile(f)
     							if err != nil {
    -								return nil, errors.Errorf("checking SD file %q: %v", file, err)
    +								return nil, fmt.Errorf("checking SD file %q: %w", file, err)
     							}
     							if err := checkTargetGroupsForScrapeConfig(targetGroups, scfg); err != nil {
     								return nil, err
    @@ -491,7 +491,7 @@ func checkConfig(agentMode bool, filename string, checkSyntaxOnly bool) ([]strin
     							var targetGroups []*targetgroup.Group
     							targetGroups, err = checkSDFile(f)
     							if err != nil {
    -								return nil, errors.Errorf("checking SD file %q: %v", file, err)
    +								return nil, fmt.Errorf("checking SD file %q: %w", file, err)
     							}
     
     							if err := checkTargetGroupsForAlertmanager(targetGroups, amcfg); err != nil {
    @@ -514,10 +514,10 @@ func checkConfig(agentMode bool, filename string, checkSyntaxOnly bool) ([]strin
     
     func checkTLSConfig(tlsConfig config_util.TLSConfig, checkSyntaxOnly bool) error {
     	if len(tlsConfig.CertFile) > 0 && len(tlsConfig.KeyFile) == 0 {
    -		return errors.Errorf("client cert file %q specified without client key file", tlsConfig.CertFile)
    +		return fmt.Errorf("client cert file %q specified without client key file", tlsConfig.CertFile)
     	}
     	if len(tlsConfig.KeyFile) > 0 && len(tlsConfig.CertFile) == 0 {
    -		return errors.Errorf("client key file %q specified without client cert file", tlsConfig.KeyFile)
    +		return fmt.Errorf("client key file %q specified without client cert file", tlsConfig.KeyFile)
     	}
     
     	if checkSyntaxOnly {
    @@ -525,10 +525,10 @@ func checkTLSConfig(tlsConfig config_util.TLSConfig, checkSyntaxOnly bool) error
     	}
     
     	if err := checkFileExists(tlsConfig.CertFile); err != nil {
    -		return errors.Wrapf(err, "error checking client cert file %q", tlsConfig.CertFile)
    +		return fmt.Errorf("error checking client cert file %q: %w", tlsConfig.CertFile, err)
     	}
     	if err := checkFileExists(tlsConfig.KeyFile); err != nil {
    -		return errors.Wrapf(err, "error checking client key file %q", tlsConfig.KeyFile)
    +		return fmt.Errorf("error checking client key file %q: %w", tlsConfig.KeyFile, err)
     	}
     
     	return nil
    @@ -558,12 +558,12 @@ func checkSDFile(filename string) ([]*targetgroup.Group, error) {
     			return nil, err
     		}
     	default:
    -		return nil, errors.Errorf("invalid file extension: %q", ext)
    +		return nil, fmt.Errorf("invalid file extension: %q", ext)
     	}
     
     	for i, tg := range targetGroups {
     		if tg == nil {
    -			return nil, errors.Errorf("nil target group item found (index %d)", i)
    +			return nil, fmt.Errorf("nil target group item found (index %d)", i)
     		}
     	}
     
    @@ -992,14 +992,14 @@ func parseStartTimeAndEndTime(start, end string) (time.Time, time.Time, error) {
     	if start != "" {
     		stime, err = parseTime(start)
     		if err != nil {
    -			return stime, etime, errors.Wrap(err, "error parsing start time")
    +			return stime, etime, fmt.Errorf("error parsing start time: %w", err)
     		}
     	}
     
     	if end != "" {
     		etime, err = parseTime(end)
     		if err != nil {
    -			return stime, etime, errors.Wrap(err, "error parsing end time")
    +			return stime, etime, fmt.Errorf("error parsing end time: %w", err)
     		}
     	}
     	return stime, etime, nil
    @@ -1013,7 +1013,7 @@ func parseTime(s string) (time.Time, error) {
     	if t, err := time.Parse(time.RFC3339Nano, s); err == nil {
     		return t, nil
     	}
    -	return time.Time{}, errors.Errorf("cannot parse %q to a valid timestamp", s)
    +	return time.Time{}, fmt.Errorf("cannot parse %q to a valid timestamp", s)
     }
     
     type endpointsGroup struct {
    @@ -1039,7 +1039,7 @@ var (
     				}
     				var buf bytes.Buffer
     				if err := p.WriteUncompressed(&buf); err != nil {
    -					return nil, errors.Wrap(err, "writing the profile to the buffer")
    +					return nil, fmt.Errorf("writing the profile to the buffer: %w", err)
     				}
     
     				return buf.Bytes(), nil
    @@ -1149,13 +1149,13 @@ func importRules(url *url.URL, start, end, outputDir string, evalInterval, maxBl
     	} else {
     		etime, err = parseTime(end)
     		if err != nil {
    -			return fmt.Errorf("error parsing end time: %v", err)
    +			return fmt.Errorf("error parsing end time: %w", err)
     		}
     	}
     
     	stime, err = parseTime(start)
     	if err != nil {
    -		return fmt.Errorf("error parsing start time: %v", err)
    +		return fmt.Errorf("error parsing start time: %w", err)
     	}
     
     	if !stime.Before(etime) {
    @@ -1173,14 +1173,14 @@ func importRules(url *url.URL, start, end, outputDir string, evalInterval, maxBl
     		Address: url.String(),
     	})
     	if err != nil {
    -		return fmt.Errorf("new api client error: %v", err)
    +		return fmt.Errorf("new api client error: %w", err)
     	}
     
     	ruleImporter := newRuleImporter(log.NewLogfmtLogger(log.NewSyncWriter(os.Stderr)), cfg, v1.NewAPI(client))
     	errs := ruleImporter.loadGroups(ctx, files)
     	for _, err := range errs {
     		if err != nil {
    -			return fmt.Errorf("rule importer parse error: %v", err)
    +			return fmt.Errorf("rule importer parse error: %w", err)
     		}
     	}
     
    diff --git a/cmd/promtool/rules.go b/cmd/promtool/rules.go
    index 760f928330d..20d9fde9a5c 100644
    --- a/cmd/promtool/rules.go
    +++ b/cmd/promtool/rules.go
    @@ -20,7 +20,6 @@ import (
     
     	"github.com/go-kit/log"
     	"github.com/go-kit/log/level"
    -	"github.com/pkg/errors"
     	v1 "github.com/prometheus/client_golang/api/prometheus/v1"
     	"github.com/prometheus/common/model"
     
    @@ -122,7 +121,7 @@ func (importer *ruleImporter) importRule(ctx context.Context, ruleExpr, ruleName
     			},
     		)
     		if err != nil {
    -			return errors.Wrap(err, "query range")
    +			return fmt.Errorf("query range: %w", err)
     		}
     		if warnings != nil {
     			level.Warn(importer.logger).Log("msg", "Range query returned warnings.", "warnings", warnings)
    @@ -136,7 +135,7 @@ func (importer *ruleImporter) importRule(ctx context.Context, ruleExpr, ruleName
     		// original interval later.
     		w, err := tsdb.NewBlockWriter(log.NewNopLogger(), importer.config.outputDir, 2*blockDuration)
     		if err != nil {
    -			return errors.Wrap(err, "new block writer")
    +			return fmt.Errorf("new block writer: %w", err)
     		}
     		var closed bool
     		defer func() {
    @@ -167,7 +166,7 @@ func (importer *ruleImporter) importRule(ctx context.Context, ruleExpr, ruleName
     
     				for _, value := range sample.Values {
     					if err := app.add(ctx, lb.Labels(), timestamp.FromTime(value.Timestamp.Time()), float64(value.Value)); err != nil {
    -						return errors.Wrap(err, "add")
    +						return fmt.Errorf("add: %w", err)
     					}
     				}
     			}
    @@ -176,7 +175,7 @@ func (importer *ruleImporter) importRule(ctx context.Context, ruleExpr, ruleName
     		}
     
     		if err := app.flushAndCommit(ctx); err != nil {
    -			return errors.Wrap(err, "flush and commit")
    +			return fmt.Errorf("flush and commit: %w", err)
     		}
     		err = tsdb_errors.NewMulti(err, w.Close()).Err()
     		closed = true
    @@ -204,7 +203,7 @@ type multipleAppender struct {
     
     func (m *multipleAppender) add(ctx context.Context, l labels.Labels, t int64, v float64) error {
     	if _, err := m.appender.Append(0, l, t, v); err != nil {
    -		return errors.Wrap(err, "multiappender append")
    +		return fmt.Errorf("multiappender append: %w", err)
     	}
     	m.currentSampleCount++
     	if m.currentSampleCount >= m.maxSamplesInMemory {
    @@ -218,7 +217,7 @@ func (m *multipleAppender) commit(ctx context.Context) error {
     		return nil
     	}
     	if err := m.appender.Commit(); err != nil {
    -		return errors.Wrap(err, "multiappender commit")
    +		return fmt.Errorf("multiappender commit: %w", err)
     	}
     	m.appender = m.writer.Appender(ctx)
     	m.currentSampleCount = 0
    @@ -230,7 +229,7 @@ func (m *multipleAppender) flushAndCommit(ctx context.Context) error {
     		return err
     	}
     	if _, err := m.writer.Flush(ctx); err != nil {
    -		return errors.Wrap(err, "multiappender flush")
    +		return fmt.Errorf("multiappender flush: %w", err)
     	}
     	return nil
     }
    diff --git a/cmd/promtool/tsdb.go b/cmd/promtool/tsdb.go
    index 565751f72c7..7707a990435 100644
    --- a/cmd/promtool/tsdb.go
    +++ b/cmd/promtool/tsdb.go
    @@ -35,7 +35,6 @@ import (
     
     	"github.com/alecthomas/units"
     	"github.com/go-kit/log"
    -	"github.com/pkg/errors"
     
     	"github.com/prometheus/prometheus/model/labels"
     	"github.com/prometheus/prometheus/tsdb"
    @@ -236,29 +235,29 @@ func (b *writeBenchmark) startProfiling() error {
     	// Start CPU profiling.
     	b.cpuprof, err = os.Create(filepath.Join(b.outPath, "cpu.prof"))
     	if err != nil {
    -		return fmt.Errorf("bench: could not create cpu profile: %v", err)
    +		return fmt.Errorf("bench: could not create cpu profile: %w", err)
     	}
     	if err := pprof.StartCPUProfile(b.cpuprof); err != nil {
    -		return fmt.Errorf("bench: could not start CPU profile: %v", err)
    +		return fmt.Errorf("bench: could not start CPU profile: %w", err)
     	}
     
     	// Start memory profiling.
     	b.memprof, err = os.Create(filepath.Join(b.outPath, "mem.prof"))
     	if err != nil {
    -		return fmt.Errorf("bench: could not create memory profile: %v", err)
    +		return fmt.Errorf("bench: could not create memory profile: %w", err)
     	}
     	runtime.MemProfileRate = 64 * 1024
     
     	// Start fatal profiling.
     	b.blockprof, err = os.Create(filepath.Join(b.outPath, "block.prof"))
     	if err != nil {
    -		return fmt.Errorf("bench: could not create block profile: %v", err)
    +		return fmt.Errorf("bench: could not create block profile: %w", err)
     	}
     	runtime.SetBlockProfileRate(20)
     
     	b.mtxprof, err = os.Create(filepath.Join(b.outPath, "mutex.prof"))
     	if err != nil {
    -		return fmt.Errorf("bench: could not create mutex profile: %v", err)
    +		return fmt.Errorf("bench: could not create mutex profile: %w", err)
     	}
     	runtime.SetMutexProfileFraction(20)
     	return nil
    @@ -272,14 +271,14 @@ func (b *writeBenchmark) stopProfiling() error {
     	}
     	if b.memprof != nil {
     		if err := pprof.Lookup("heap").WriteTo(b.memprof, 0); err != nil {
    -			return fmt.Errorf("error writing mem profile: %v", err)
    +			return fmt.Errorf("error writing mem profile: %w", err)
     		}
     		b.memprof.Close()
     		b.memprof = nil
     	}
     	if b.blockprof != nil {
     		if err := pprof.Lookup("block").WriteTo(b.blockprof, 0); err != nil {
    -			return fmt.Errorf("error writing block profile: %v", err)
    +			return fmt.Errorf("error writing block profile: %w", err)
     		}
     		b.blockprof.Close()
     		b.blockprof = nil
    @@ -287,7 +286,7 @@ func (b *writeBenchmark) stopProfiling() error {
     	}
     	if b.mtxprof != nil {
     		if err := pprof.Lookup("mutex").WriteTo(b.mtxprof, 0); err != nil {
    -			return fmt.Errorf("error writing mutex profile: %v", err)
    +			return fmt.Errorf("error writing mutex profile: %w", err)
     		}
     		b.mtxprof.Close()
     		b.mtxprof = nil
    @@ -680,7 +679,7 @@ func backfillOpenMetrics(path, outputDir string, humanReadable, quiet bool, maxB
     	defer inputFile.Close()
     
     	if err := os.MkdirAll(outputDir, 0o777); err != nil {
    -		return checkErr(errors.Wrap(err, "create output dir"))
    +		return checkErr(fmt.Errorf("create output dir: %w", err))
     	}
     
     	return checkErr(backfill(5000, inputFile.Bytes(), outputDir, humanReadable, quiet, maxBlockDuration))
    diff --git a/cmd/promtool/unittest.go b/cmd/promtool/unittest.go
    index fd06f0e2d76..f03906089cb 100644
    --- a/cmd/promtool/unittest.go
    +++ b/cmd/promtool/unittest.go
    @@ -15,6 +15,7 @@ package main
     
     import (
     	"context"
    +	"errors"
     	"fmt"
     	"os"
     	"path/filepath"
    @@ -25,7 +26,6 @@ import (
     	"time"
     
     	"github.com/go-kit/log"
    -	"github.com/pkg/errors"
     	"github.com/prometheus/common/model"
     	yaml "gopkg.in/yaml.v2"
     
    @@ -87,7 +87,7 @@ func ruleUnitTest(filename string, queryOpts promql.LazyLoaderOpts) []error {
     	groupOrderMap := make(map[string]int)
     	for i, gn := range unitTestInp.GroupEvalOrder {
     		if _, ok := groupOrderMap[gn]; ok {
    -			return []error{errors.Errorf("group name repeated in evaluation order: %s", gn)}
    +			return []error{fmt.Errorf("group name repeated in evaluation order: %s", gn)}
     		}
     		groupOrderMap[gn] = i
     	}
    @@ -195,7 +195,7 @@ func (tg *testGroup) test(evalInterval time.Duration, groupOrderMap map[string]i
     			if tg.TestGroupName != "" {
     				testGroupLog = fmt.Sprintf(" (in TestGroup %s)", tg.TestGroupName)
     			}
    -			return []error{errors.Errorf("an item under alert_rule_test misses required attribute alertname at eval_time %v%s", alert.EvalTime, testGroupLog)}
    +			return []error{fmt.Errorf("an item under alert_rule_test misses required attribute alertname at eval_time %v%s", alert.EvalTime, testGroupLog)}
     		}
     		alertEvalTimesMap[alert.EvalTime] = struct{}{}
     
    @@ -240,7 +240,7 @@ func (tg *testGroup) test(evalInterval time.Duration, groupOrderMap map[string]i
     				g.Eval(suite.Context(), ts)
     				for _, r := range g.Rules() {
     					if r.LastError() != nil {
    -						evalErrs = append(evalErrs, errors.Errorf("    rule: %s, time: %s, err: %v",
    +						evalErrs = append(evalErrs, fmt.Errorf("    rule: %s, time: %s, err: %v",
     							r.Name(), ts.Sub(time.Unix(0, 0).UTC()), r.LastError()))
     					}
     				}
    @@ -323,7 +323,7 @@ func (tg *testGroup) test(evalInterval time.Duration, groupOrderMap map[string]i
     					}
     					expString := indentLines(expAlerts.String(), "            ")
     					gotString := indentLines(gotAlerts.String(), "            ")
    -					errs = append(errs, errors.Errorf("%s    alertname: %s, time: %s, \n        exp:%v, \n        got:%v",
    +					errs = append(errs, fmt.Errorf("%s    alertname: %s, time: %s, \n        exp:%v, \n        got:%v",
     						testName, testcase.Alertname, testcase.EvalTime.String(), expString, gotString))
     				}
     			}
    @@ -338,7 +338,7 @@ Outer:
     		got, err := query(suite.Context(), testCase.Expr, mint.Add(time.Duration(testCase.EvalTime)),
     			suite.QueryEngine(), suite.Queryable())
     		if err != nil {
    -			errs = append(errs, errors.Errorf("    expr: %q, time: %s, err: %s", testCase.Expr,
    +			errs = append(errs, fmt.Errorf("    expr: %q, time: %s, err: %s", testCase.Expr,
     				testCase.EvalTime.String(), err.Error()))
     			continue
     		}
    @@ -355,9 +355,9 @@ Outer:
     		for _, s := range testCase.ExpSamples {
     			lb, err := parser.ParseMetric(s.Labels)
     			if err != nil {
    -				err = errors.Wrapf(err, "labels %q", s.Labels)
    -				errs = append(errs, errors.Errorf("    expr: %q, time: %s, err: %s", testCase.Expr,
    -					testCase.EvalTime.String(), err.Error()))
    +				err = fmt.Errorf("labels %q: %w", s.Labels, err)
    +				errs = append(errs, fmt.Errorf("    expr: %q, time: %s, err: %w", testCase.Expr,
    +					testCase.EvalTime.String(), err))
     				continue Outer
     			}
     			expSamples = append(expSamples, parsedSample{
    @@ -373,7 +373,7 @@ Outer:
     			return labels.Compare(gotSamples[i].Labels, gotSamples[j].Labels) <= 0
     		})
     		if !reflect.DeepEqual(expSamples, gotSamples) {
    -			errs = append(errs, errors.Errorf("    expr: %q, time: %s,\n        exp: %v\n        got: %v", testCase.Expr,
    +			errs = append(errs, fmt.Errorf("    expr: %q, time: %s,\n        exp: %v\n        got: %v", testCase.Expr,
     				testCase.EvalTime.String(), parsedSamplesString(expSamples), parsedSamplesString(gotSamples)))
     		}
     	}
    
    From ddedb86994ffb23588e10cc97b2fc35040482186 Mon Sep 17 00:00:00 2001
    From: Julien Pivotto 
    Date: Tue, 24 May 2022 09:21:46 +0200
    Subject: [PATCH 070/135] Remove Jessica from maintainers list (#10731)
    
    Signed-off-by: Julien Pivotto 
    ---
     .github/CODEOWNERS | 2 +-
     MAINTAINERS.md     | 2 +-
     2 files changed, 2 insertions(+), 2 deletions(-)
    
    diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS
    index 61c5809dac3..a6df329bebf 100644
    --- a/.github/CODEOWNERS
    +++ b/.github/CODEOWNERS
    @@ -4,4 +4,4 @@
     /discovery/kubernetes @brancz
     /tsdb @codesome
     /promql @codesome @roidelapluie
    -/cmd/promtool @jessicagreben @dgl
    +/cmd/promtool @dgl
    diff --git a/MAINTAINERS.md b/MAINTAINERS.md
    index d31cf696c26..103ebdda648 100644
    --- a/MAINTAINERS.md
    +++ b/MAINTAINERS.md
    @@ -3,7 +3,7 @@
     Julien Pivotto ( / @roidelapluie) and Levi Harrison ( / @LeviHarrison) are the main/default maintainers, some parts of the codebase have other maintainers:
     
     * `cmd`
    -  * `promtool`: David Leadbeater ( / @dgl), Jessica Grebenschikov ( / @jessicagreben)
    +  * `promtool`: David Leadbeater ( / @dgl)
     * `discovery`
       * `k8s`: Frederic Branczyk ( / @brancz)
     * `documentation`
    
    From 5722e6ea99d52fbd97a32a3f0b7e92c8534e275a Mon Sep 17 00:00:00 2001
    From: Julien Pivotto 
    Date: Tue, 24 May 2022 14:17:11 +0200
    Subject: [PATCH 071/135] Update OpenTracing
    
    Signed-off-by: Julien Pivotto 
    ---
     go.mod             | 34 ++++++++++++------------
     go.sum             | 64 +++++++++++++++++++++++++---------------------
     tracing/tracing.go |  2 +-
     3 files changed, 53 insertions(+), 47 deletions(-)
    
    diff --git a/go.mod b/go.mod
    index 057b14c00df..c9ac483ae27 100644
    --- a/go.mod
    +++ b/go.mod
    @@ -48,25 +48,25 @@ require (
     	github.com/scaleway/scaleway-sdk-go v1.0.0-beta.9
     	github.com/shurcooL/httpfs v0.0.0-20190707220628-8d4bc4ba7749
     	github.com/stretchr/testify v1.7.1
    -	go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.31.0
    +	go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.32.0
     	go.opentelemetry.io/otel v1.7.0
    -	go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.6.1
    -	go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.6.1
    -	go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.6.1
    -	go.opentelemetry.io/otel/sdk v1.6.1
    +	go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.7.0
    +	go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.7.0
    +	go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.7.0
    +	go.opentelemetry.io/otel/sdk v1.7.0
     	go.opentelemetry.io/otel/trace v1.7.0
     	go.uber.org/atomic v1.9.0
     	go.uber.org/automaxprocs v1.5.1
     	go.uber.org/goleak v1.1.12
    -	golang.org/x/net v0.0.0-20220412020605-290c469a71a5
    +	golang.org/x/net v0.0.0-20220520000938-2e3eb7b945c2
     	golang.org/x/oauth2 v0.0.0-20220411215720-9780585627b5
     	golang.org/x/sync v0.0.0-20210220032951-036812b2e83c
    -	golang.org/x/sys v0.0.0-20220412211240-33da011f77ad
    +	golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a
     	golang.org/x/time v0.0.0-20220224211638-0e9765cccd65
     	golang.org/x/tools v0.1.10
     	google.golang.org/api v0.77.0
    -	google.golang.org/genproto v0.0.0-20220414192740-2d67ff6cf2b4
    -	google.golang.org/grpc v1.46.0
    +	google.golang.org/genproto v0.0.0-20220524023933-508584e28198
    +	google.golang.org/grpc v1.46.2
     	google.golang.org/protobuf v1.28.0
     	gopkg.in/alecthomas/kingpin.v2 v2.2.6
     	gopkg.in/yaml.v2 v2.4.0
    @@ -93,7 +93,7 @@ require (
     	github.com/armon/go-metrics v0.3.3 // indirect
     	github.com/asaskevich/govalidator v0.0.0-20210307081110-f21760c49a8d // indirect
     	github.com/beorn7/perks v1.0.1 // indirect
    -	github.com/cenkalti/backoff/v4 v4.1.2 // indirect
    +	github.com/cenkalti/backoff/v4 v4.1.3 // indirect
     	github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1 // indirect
     	github.com/containerd/containerd v1.6.1 // indirect
     	github.com/davecgh/go-spew v1.1.1 // indirect
    @@ -102,7 +102,7 @@ require (
     	github.com/docker/go-units v0.4.0 // indirect
     	github.com/evanphx/json-patch v4.12.0+incompatible // indirect
     	github.com/fatih/color v1.13.0 // indirect
    -	github.com/felixge/httpsnoop v1.0.2 // indirect
    +	github.com/felixge/httpsnoop v1.0.3 // indirect
     	github.com/ghodss/yaml v1.0.0 // indirect
     	github.com/go-kit/kit v0.10.0 // indirect
     	github.com/go-logr/logr v1.2.3 // indirect
    @@ -121,12 +121,12 @@ require (
     	github.com/golang/glog v1.0.0 // indirect
     	github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect
     	github.com/golang/protobuf v1.5.2 // indirect
    -	github.com/google/go-cmp v0.5.7 // indirect
    +	github.com/google/go-cmp v0.5.8 // indirect
     	github.com/google/go-querystring v1.0.0 // indirect
     	github.com/google/gofuzz v1.2.0 // indirect
     	github.com/googleapis/gax-go/v2 v2.3.0 // indirect
     	github.com/googleapis/gnostic v0.5.5 // indirect
    -	github.com/grpc-ecosystem/grpc-gateway/v2 v2.7.0 // indirect
    +	github.com/grpc-ecosystem/grpc-gateway/v2 v2.10.2 // indirect
     	github.com/hashicorp/go-cleanhttp v0.5.1 // indirect
     	github.com/hashicorp/go-hclog v0.12.2 // indirect
     	github.com/hashicorp/go-immutable-radix v1.2.0 // indirect
    @@ -155,9 +155,9 @@ require (
     	github.com/spf13/pflag v1.0.5 // indirect
     	go.mongodb.org/mongo-driver v1.8.3 // indirect
     	go.opencensus.io v0.23.0 // indirect
    -	go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.6.1 // indirect
    -	go.opentelemetry.io/otel/metric v0.28.0 // indirect
    -	go.opentelemetry.io/proto/otlp v0.12.1 // indirect
    +	go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.7.0 // indirect
    +	go.opentelemetry.io/otel/metric v0.30.0 // indirect
    +	go.opentelemetry.io/proto/otlp v0.16.0 // indirect
     	golang.org/x/crypto v0.0.0-20211215153901-e495a2d5b3d3 // indirect
     	golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3 // indirect
     	golang.org/x/term v0.0.0-20210927222741-03fcf44c2211 // indirect
    @@ -169,7 +169,7 @@ require (
     	k8s.io/utils v0.0.0-20211116205334-6203023598ed // indirect
     	sigs.k8s.io/json v0.0.0-20211020170558-c049b76a60c6 // indirect
     	sigs.k8s.io/structured-merge-diff/v4 v4.2.1 // indirect
    -	sigs.k8s.io/yaml v1.2.0 // indirect
    +	sigs.k8s.io/yaml v1.3.0 // indirect
     )
     
     replace (
    diff --git a/go.sum b/go.sum
    index 2768826e07a..0be57224234 100644
    --- a/go.sum
    +++ b/go.sum
    @@ -185,8 +185,9 @@ github.com/casbin/casbin/v2 v2.1.2/go.mod h1:YcPU1XXisHhLzuxH9coDNf2FbKpjGlbCg3n
     github.com/cenkalti/backoff v2.2.1+incompatible h1:tNowT99t7UNflLxfYYSlKYsBpXdEet03Pg2g16Swow4=
     github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM=
     github.com/cenkalti/backoff/v4 v4.1.1/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw=
    -github.com/cenkalti/backoff/v4 v4.1.2 h1:6Yo7N8UP2K6LWZnW94DLVSSrbobcWdVzAYOisuDPIFo=
     github.com/cenkalti/backoff/v4 v4.1.2/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw=
    +github.com/cenkalti/backoff/v4 v4.1.3 h1:cFAlzYUlVYDysBEH2T5hyJZMh3+5+WCBvSnK6Q8UtC4=
    +github.com/cenkalti/backoff/v4 v4.1.3/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw=
     github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
     github.com/certifi/gocertifi v0.0.0-20191021191039-0944d244cd40/go.mod h1:sGbDF6GwGcLpkNXPUTkMRoywsNa/ol15pxFe6ERfguA=
     github.com/certifi/gocertifi v0.0.0-20200922220541-2c3bb06c6054/go.mod h1:sGbDF6GwGcLpkNXPUTkMRoywsNa/ol15pxFe6ERfguA=
    @@ -422,8 +423,9 @@ github.com/fatih/color v1.10.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGE
     github.com/fatih/color v1.13.0 h1:8LOYc1KYPPmyKMuN8QV2DNRWNbLo6LZ0iLs8+mlH53w=
     github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk=
     github.com/felixge/httpsnoop v1.0.1/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U=
    -github.com/felixge/httpsnoop v1.0.2 h1:+nS9g82KMXccJ/wp0zyRW9ZBHFETmMGtkk+2CTTrW4o=
     github.com/felixge/httpsnoop v1.0.2/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U=
    +github.com/felixge/httpsnoop v1.0.3 h1:s/nj+GCswXYzN5v2DpNMuMQYe+0DDwt5WVCU6CWBdXk=
    +github.com/felixge/httpsnoop v1.0.3/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U=
     github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k=
     github.com/form3tech-oss/jwt-go v3.2.3+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k=
     github.com/franela/goblin v0.0.0-20200105215937-c9ffbefa60db/go.mod h1:7dvUGVsVBjqR7JHJk0brhHOZYGmfBYOrK0ZhYMEtBr4=
    @@ -620,8 +622,9 @@ github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/
     github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
     github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
     github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
    -github.com/google/go-cmp v0.5.7 h1:81/ik6ipDQS2aGcBfIN5dHDB36BwrStyeAQquSYCV4o=
     github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE=
    +github.com/google/go-cmp v0.5.8 h1:e6P7q2lk1O+qJJb4BtCQXlK8vWEO8V1ZeuEdJNOqZyg=
    +github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
     github.com/google/go-containerregistry v0.5.1/go.mod h1:Ct15B4yir3PLOP5jsy0GNeYVaIZs/MK/Jz5any1wFW0=
     github.com/google/go-querystring v1.0.0 h1:Xkwi/a1rcvNg1PPYe5vI8GbeBY/jrVuDX5ASuANWTrk=
     github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck=
    @@ -690,8 +693,9 @@ github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t
     github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY=
     github.com/grpc-ecosystem/grpc-gateway v1.16.0 h1:gmcG1KaJ57LophUzW0Hy8NmPhnMZb4M0+kPpLofRdBo=
     github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw=
    -github.com/grpc-ecosystem/grpc-gateway/v2 v2.7.0 h1:BZHcxBETFHIdVyhyEfOvn/RdU/QGdLI4y34qQGjGWO0=
     github.com/grpc-ecosystem/grpc-gateway/v2 v2.7.0/go.mod h1:hgWBS7lorOAVIJEQMi4ZsPv9hVvWI6+ch50m39Pf2Ks=
    +github.com/grpc-ecosystem/grpc-gateway/v2 v2.10.2 h1:ERKrevVTnCw3Wu4I3mtR15QU3gtWy86cBo6De0jEohg=
    +github.com/grpc-ecosystem/grpc-gateway/v2 v2.10.2/go.mod h1:chrfS3YoLAlKTRE5cFWvCbt8uGAjshktT4PveTUpsFQ=
     github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q=
     github.com/hashicorp/consul/api v1.3.0/go.mod h1:MmDNSzIMUjNpY/mQ398R4bk2FnqQLoPndWW5VkKPlCE=
     github.com/hashicorp/consul/api v1.12.0 h1:k3y1FYv6nuKyNTqj6w9gXOx5r5CfLj/k/euUeBXj1OY=
    @@ -1254,48 +1258,44 @@ go.opentelemetry.io/contrib v0.20.0/go.mod h1:G/EtFaa6qaN7+LxqfIAT3GiZa7Wv5DTBUz
     go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.20.0/go.mod h1:oVGt1LRbBOBq1A5BQLlUg9UaU/54aiHw8cgjV3aWZ/E=
     go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.28.0/go.mod h1:vEhqr0m4eTc+DWxfsXoXue2GBgV2uUwVznkGIHW/e5w=
     go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.20.0/go.mod h1:2AboqHi0CiIZU0qwhtUfCYD1GeUzvvIXWNkhDt7ZMG4=
    -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.31.0 h1:woM+Mb4d0A+Dxa3rYPenSN5ZeS9qHUvE8rlObiLRXTY=
    -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.31.0/go.mod h1:PFmBsWbldL1kiWZk9+0LBZz2brhByaGsvp6pRICMlPE=
    +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.32.0 h1:mac9BKRqwaX6zxHPDe3pvmWpwuuIM0vuXv2juCnQevE=
    +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.32.0/go.mod h1:5eCOqeGphOyz6TsY3ZDNjE33SM/TFAK3RGuCL2naTgY=
     go.opentelemetry.io/otel v0.20.0/go.mod h1:Y3ugLH2oa81t5QO+Lty+zXf8zC9L26ax4Nzoxm/dooo=
     go.opentelemetry.io/otel v1.3.0/go.mod h1:PWIKzi6JCp7sM0k9yZ43VX+T345uNbAkDKwHVjb2PTs=
    -go.opentelemetry.io/otel v1.6.0/go.mod h1:bfJD2DZVw0LBxghOTlgnlI0CV3hLDu9XF/QKOUXMTQQ=
    -go.opentelemetry.io/otel v1.6.1/go.mod h1:blzUabWHkX6LJewxvadmzafgh/wnvBSDBdOuwkAtrWQ=
     go.opentelemetry.io/otel v1.7.0 h1:Z2lA3Tdch0iDcrhJXDIlC94XE+bxok1F9B+4Lz/lGsM=
     go.opentelemetry.io/otel v1.7.0/go.mod h1:5BdUoMIz5WEs0vt0CUEMtSSaTSHBBVwrhnz7+nrD5xk=
     go.opentelemetry.io/otel/exporters/otlp v0.20.0 h1:PTNgq9MRmQqqJY0REVbZFvwkYOA85vbdQU/nVfxDyqg=
     go.opentelemetry.io/otel/exporters/otlp v0.20.0/go.mod h1:YIieizyaN77rtLJra0buKiNBOm9XQfkPEKBeuhoMwAM=
     go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.3.0/go.mod h1:VpP4/RMn8bv8gNo9uK7/IMY4mtWLELsS+JIP0inH0h4=
    -go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.6.1 h1:T1FtMXHM2YPIUrYxSbTIAYDCvUZVpNdl7hDMDnp09cE=
    -go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.6.1/go.mod h1:NEu79Xo32iVb+0gVNV8PMd7GoWqnyDXRlj04yFjqz40=
    +go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.7.0 h1:7Yxsak1q4XrJ5y7XBnNwqWx9amMZvoidCctv62XOQ6Y=
    +go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.7.0/go.mod h1:M1hVZHNxcbkAlcvrOMlpQ4YOO3Awf+4N2dxkZL3xm04=
     go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.3.0/go.mod h1:hO1KLR7jcKaDDKDkvI9dP/FIhpmna5lkqPUQdEjFAM8=
    -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.6.1 h1:EvIC2jmn1+24OABwtw2Lng5yxy5eYJ8nf461UaHXTms=
    -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.6.1/go.mod h1:YJ/JbY5ag/tSQFXzH3mtDmHqzF3aFn3DI/aB1n7pt4w=
    +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.7.0 h1:cMDtmgJ5FpRvqx9x2Aq+Mm0O6K/zcUkH73SFz20TuBw=
    +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.7.0/go.mod h1:ceUgdyfNv4h4gLxHR0WNfDiiVmZFodZhZSbOLhpxqXE=
     go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.3.0/go.mod h1:keUU7UfnwWTWpJ+FWnyqmogPa82nuU5VUANFq49hlMY=
    -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.6.1 h1:G45R6KdPgxe9UaZJMF4VUnsYgZpOHCSgl7FiOEV6570=
    -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.6.1/go.mod h1:UJJXJj0rltNIemDMwkOJyggsvyMG9QHfJeFH0HS5JjM=
    +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.7.0 h1:MFAyzUPrTwLOwCi+cltN0ZVyy4phU41lwH+lyMyQTS4=
    +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.7.0/go.mod h1:E+/KKhwOSw8yoPxSSuUHG6vKppkvhN+S1Jc7Nib3k3o=
     go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.3.0/go.mod h1:QNX1aly8ehqqX1LEa6YniTU7VY9I6R3X/oPxhGdTceE=
    -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.6.1 h1:EKGJlVkPK5IDR0WOE8eUTKLI4j+JlbboqsoSpttSktY=
    -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.6.1/go.mod h1:DAKwdo06hFLc0U88O10x4xnb5sc7dDRDqRuiN+io8JE=
    +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.7.0 h1:pLP0MH4MAqeTEV0g/4flxw9O8Is48uAIauAnjznbW50=
    +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.7.0/go.mod h1:aFXT9Ng2seM9eizF+LfKiyPBGy8xIZKwhusC1gIu3hA=
     go.opentelemetry.io/otel/metric v0.20.0/go.mod h1:598I5tYlH1vzBjn+BTuhzTCSb/9debfNp6R3s7Pr1eU=
    -go.opentelemetry.io/otel/metric v0.28.0 h1:o5YNh+jxACMODoAo1bI7OES0RUW4jAMae0Vgs2etWAQ=
    -go.opentelemetry.io/otel/metric v0.28.0/go.mod h1:TrzsfQAmQaB1PDcdhBauLMk7nyyg9hm+GoQq/ekE9Iw=
    +go.opentelemetry.io/otel/metric v0.30.0 h1:Hs8eQZ8aQgs0U49diZoaS6Uaxw3+bBE3lcMUKBFIk3c=
    +go.opentelemetry.io/otel/metric v0.30.0/go.mod h1:/ShZ7+TS4dHzDFmfi1kSXMhMVubNoP0oIaBp70J6UXU=
     go.opentelemetry.io/otel/oteltest v0.20.0/go.mod h1:L7bgKf9ZB7qCwT9Up7i9/pn0PWIa9FqQ2IQ8LoxiGnw=
     go.opentelemetry.io/otel/sdk v0.20.0/go.mod h1:g/IcepuwNsoiX5Byy2nNV0ySUF1em498m7hBWC279Yc=
     go.opentelemetry.io/otel/sdk v1.3.0/go.mod h1:rIo4suHNhQwBIPg9axF8V9CA72Wz2mKF1teNrup8yzs=
    -go.opentelemetry.io/otel/sdk v1.6.1 h1:ZmcNyMhcuAYIb/Nr6QhBPTMopMTbov/47wHt1gibkoY=
    -go.opentelemetry.io/otel/sdk v1.6.1/go.mod h1:IVYrddmFZ+eJqu2k38qD3WezFR2pymCzm8tdxyh3R4E=
    +go.opentelemetry.io/otel/sdk v1.7.0 h1:4OmStpcKVOfvDOgCt7UriAPtKolwIhxpnSNI/yK+1B0=
    +go.opentelemetry.io/otel/sdk v1.7.0/go.mod h1:uTEOTwaqIVuTGiJN7ii13Ibp75wJmYUDe374q6cZwUU=
     go.opentelemetry.io/otel/sdk/export/metric v0.20.0/go.mod h1:h7RBNMsDJ5pmI1zExLi+bJK+Dr8NQCh0qGhm1KDnNlE=
     go.opentelemetry.io/otel/sdk/metric v0.20.0/go.mod h1:knxiS8Xd4E/N+ZqKmUPf3gTTZ4/0TjTXukfxjzSTpHE=
     go.opentelemetry.io/otel/trace v0.20.0/go.mod h1:6GjCW8zgDjwGHGa6GkyeB8+/5vjT16gUEi0Nf1iBdgw=
     go.opentelemetry.io/otel/trace v1.3.0/go.mod h1:c/VDhno8888bvQYmbYLqe41/Ldmr/KKunbvWM4/fEjk=
    -go.opentelemetry.io/otel/trace v1.6.0/go.mod h1:qs7BrU5cZ8dXQHBGxHMOxwME/27YH2qEp4/+tZLLwJE=
    -go.opentelemetry.io/otel/trace v1.6.1/go.mod h1:RkFRM1m0puWIq10oxImnGEduNBzxiN7TXluRBtE+5j0=
     go.opentelemetry.io/otel/trace v1.7.0 h1:O37Iogk1lEkMRXewVtZ1BBTVn5JEp8GrJvP92bJqC6o=
     go.opentelemetry.io/otel/trace v1.7.0/go.mod h1:fzLSB9nqR2eXzxPXb2JW9IKE+ScyXA48yyE4TNvoHqU=
     go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI=
     go.opentelemetry.io/proto/otlp v0.11.0/go.mod h1:QpEjXPrNQzrFDZgoTo49dgHR9RYRSrg3NAKnUGl9YpQ=
    -go.opentelemetry.io/proto/otlp v0.12.1 h1:kfx2sboxOGFvGJcH2C408CiVo2wVHC2av2XHNqj4vEg=
    -go.opentelemetry.io/proto/otlp v0.12.1/go.mod h1:H7XAot3MsfNsj7EXtrA2q5xSNQ10UqI405h3+duxN4U=
    +go.opentelemetry.io/proto/otlp v0.16.0 h1:WHzDWdXUvbc5bG2ObdrGfaNpQz7ft7QN9HHmJlbiB1E=
    +go.opentelemetry.io/proto/otlp v0.16.0/go.mod h1:H7XAot3MsfNsj7EXtrA2q5xSNQ10UqI405h3+duxN4U=
     go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
     go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
     go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ=
    @@ -1448,8 +1448,9 @@ golang.org/x/net v0.0.0-20211216030914-fe4d6282115f/go.mod h1:9nx3DQGgdP8bBQD5qx
     golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
     golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
     golang.org/x/net v0.0.0-20220325170049-de3da57026de/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
    -golang.org/x/net v0.0.0-20220412020605-290c469a71a5 h1:bRb386wvrE+oBNdF1d/Xh9mQrfQ4ecYhW5qJ5GvTGT4=
     golang.org/x/net v0.0.0-20220412020605-290c469a71a5/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
    +golang.org/x/net v0.0.0-20220520000938-2e3eb7b945c2 h1:NWy5+hlRbC7HK+PmcXVUmW1IMyFce7to56IUvhUFm7Y=
    +golang.org/x/net v0.0.0-20220520000938-2e3eb7b945c2/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
     golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
     golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
     golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
    @@ -1607,8 +1608,9 @@ golang.org/x/sys v0.0.0-20220128215802-99c3d69c2c27/go.mod h1:oPkhp1MJrh7nUepCBc
     golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
     golang.org/x/sys v0.0.0-20220227234510-4e6760a101f9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
     golang.org/x/sys v0.0.0-20220328115105-d36c6a25d886/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
    -golang.org/x/sys v0.0.0-20220412211240-33da011f77ad h1:ntjMns5wyP/fN65tdBD4g8J5w8n015+iIIs9rtjXkY0=
     golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
    +golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a h1:dGzPydgVsqGcTRVwiLJ1jVbufYwmzD3LfVPLKsKg+0k=
    +golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
     golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw=
     golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
     golang.org/x/term v0.0.0-20210220032956-6a3ed077a48d/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
    @@ -1839,8 +1841,10 @@ google.golang.org/genproto v0.0.0-20220310185008-1973136f34c6/go.mod h1:kGP+zUP2
     google.golang.org/genproto v0.0.0-20220324131243-acbaeb5b85eb/go.mod h1:hAL49I2IFola2sVEjAn7MEwsja0xp51I0tlGAf9hz4E=
     google.golang.org/genproto v0.0.0-20220407144326-9054f6ed7bac/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo=
     google.golang.org/genproto v0.0.0-20220413183235-5e96e2839df9/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo=
    -google.golang.org/genproto v0.0.0-20220414192740-2d67ff6cf2b4 h1:myaecH64R0bIEDjNORIel4iXubqzaHU1K2z8ajBwWcM=
     google.golang.org/genproto v0.0.0-20220414192740-2d67ff6cf2b4/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo=
    +google.golang.org/genproto v0.0.0-20220519153652-3a47de7e79bd/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4=
    +google.golang.org/genproto v0.0.0-20220524023933-508584e28198 h1:a1g7i05I2vUwq5eYrmxBJy6rPbw/yo7WzzwPJmcC0P4=
    +google.golang.org/genproto v0.0.0-20220524023933-508584e28198/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4=
     google.golang.org/grpc v0.0.0-20160317175043-d3ddb4469d5a/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw=
     google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs=
     google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
    @@ -1878,8 +1882,9 @@ google.golang.org/grpc v1.42.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ5
     google.golang.org/grpc v1.43.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU=
     google.golang.org/grpc v1.44.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU=
     google.golang.org/grpc v1.45.0/go.mod h1:lN7owxKUQEqMfSyQikvvk5tf/6zMPsrK+ONuO11+0rQ=
    -google.golang.org/grpc v1.46.0 h1:oCjezcn6g6A75TGoKYBPgKmVBLexhYLM6MebdrPApP8=
     google.golang.org/grpc v1.46.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk=
    +google.golang.org/grpc v1.46.2 h1:u+MLGgVf7vRdjEYZ8wDFhAVNmhkbJ5hmrA1LMWK1CAQ=
    +google.golang.org/grpc v1.46.2/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk=
     google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw=
     google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
     google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=
    @@ -2018,6 +2023,7 @@ sigs.k8s.io/structured-merge-diff/v4 v4.1.2/go.mod h1:j/nl6xW8vLS49O8YvXW1ocPhZa
     sigs.k8s.io/structured-merge-diff/v4 v4.2.1 h1:bKCqE9GvQ5tiVHn5rfn1r+yao3aLQEaLzkkmAkf+A6Y=
     sigs.k8s.io/structured-merge-diff/v4 v4.2.1/go.mod h1:j/nl6xW8vLS49O8YvXW1ocPhZawJtm+Yrr7PPRQ0Vg4=
     sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o=
    -sigs.k8s.io/yaml v1.2.0 h1:kr/MCeFWJWTwyaHoR9c8EjH9OumOmoF9YGiZd7lFm/Q=
     sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc=
    +sigs.k8s.io/yaml v1.3.0 h1:a2VclLzOGrwOHDiV8EfBGhvjHvP46CtW5j6POvhYGGo=
    +sigs.k8s.io/yaml v1.3.0/go.mod h1:GeOyir5tyXNByN85N/dRIT9es5UQNerPYEKK56eTBm8=
     sourcegraph.com/sourcegraph/appdash v0.0.0-20190731080439-ebfcffb1b5c0/go.mod h1:hI742Nqp5OhwiqlzhgfbWU4mW4yO10fP+LoT9WOswdU=
    diff --git a/tracing/tracing.go b/tracing/tracing.go
    index f5ec2895545..7a98de762fa 100644
    --- a/tracing/tracing.go
    +++ b/tracing/tracing.go
    @@ -30,7 +30,7 @@ import (
     	"go.opentelemetry.io/otel/propagation"
     	"go.opentelemetry.io/otel/sdk/resource"
     	tracesdk "go.opentelemetry.io/otel/sdk/trace"
    -	semconv "go.opentelemetry.io/otel/semconv/v1.7.0"
    +	semconv "go.opentelemetry.io/otel/semconv/v1.10.0"
     	"go.opentelemetry.io/otel/trace"
     	"google.golang.org/grpc/credentials"
     
    
    From d11c4181027934814f0e8a0384ab6467f044e663 Mon Sep 17 00:00:00 2001
    From: Matthias Loibl 
    Date: Tue, 24 May 2022 15:18:37 +0200
    Subject: [PATCH 072/135] Update Go dependencies
    
    Signed-off-by: Matthias Loibl 
    ---
     go.mod |  57 +++--
     go.sum | 673 +++++----------------------------------------------------
     2 files changed, 89 insertions(+), 641 deletions(-)
    
    diff --git a/go.mod b/go.mod
    index c9ac483ae27..d085d2dbe44 100644
    --- a/go.mod
    +++ b/go.mod
    @@ -4,42 +4,42 @@ go 1.17
     
     require (
     	github.com/Azure/azure-sdk-for-go v63.0.0+incompatible
    -	github.com/Azure/go-autorest/autorest v0.11.25
    -	github.com/Azure/go-autorest/autorest/adal v0.9.18
    +	github.com/Azure/go-autorest/autorest v0.11.27
    +	github.com/Azure/go-autorest/autorest/adal v0.9.20
     	github.com/alecthomas/units v0.0.0-20211218093645-b94a6e3cc137
    -	github.com/aws/aws-sdk-go v1.43.31
    +	github.com/aws/aws-sdk-go v1.44.20
     	github.com/cespare/xxhash/v2 v2.1.2
     	github.com/dennwc/varint v1.0.0
     	github.com/dgryski/go-sip13 v0.0.0-20200911182023-62edffca9245
    -	github.com/digitalocean/godo v1.78.0
    -	github.com/docker/docker v20.10.14+incompatible
    +	github.com/digitalocean/godo v1.80.0
    +	github.com/docker/docker v20.10.16+incompatible
     	github.com/edsrzf/mmap-go v1.1.0
     	github.com/envoyproxy/go-control-plane v0.10.2-0.20220325020618-49ff273808a1
     	github.com/envoyproxy/protoc-gen-validate v0.6.7
     	github.com/fsnotify/fsnotify v1.5.4
    -	github.com/go-kit/log v0.2.0
    +	github.com/go-kit/log v0.2.1
     	github.com/go-logfmt/logfmt v0.5.1
     	github.com/go-openapi/strfmt v0.21.2
     	github.com/go-zookeeper/zk v1.0.2
     	github.com/gogo/protobuf v1.3.2
     	github.com/golang/snappy v0.0.4
    -	github.com/google/pprof v0.0.0-20220318212150-b2ab0324ddda
    +	github.com/google/pprof v0.0.0-20220520215854-d04f2422c8a1
     	github.com/gophercloud/gophercloud v0.24.0
     	github.com/grafana/regexp v0.0.0-20220304095617-2e8d9baf4ac2
     	github.com/grpc-ecosystem/grpc-gateway v1.16.0
     	github.com/hashicorp/consul/api v1.12.0
    -	github.com/hetznercloud/hcloud-go v1.33.1
    +	github.com/hetznercloud/hcloud-go v1.33.2
     	github.com/ionos-cloud/sdk-go/v6 v6.0.5851
     	github.com/json-iterator/go v1.1.12
     	github.com/kolo/xmlrpc v0.0.0-20201022064351-38db28db192b
    -	github.com/linode/linodego v1.4.1
    -	github.com/miekg/dns v1.1.48
    +	github.com/linode/linodego v1.5.0
    +	github.com/miekg/dns v1.1.49
     	github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f
     	github.com/oklog/run v1.1.0
     	github.com/oklog/ulid v1.3.1
     	github.com/pkg/errors v0.9.1
     	github.com/prometheus/alertmanager v0.24.0
    -	github.com/prometheus/client_golang v1.12.1
    +	github.com/prometheus/client_golang v1.12.2
     	github.com/prometheus/client_model v0.2.0
     	github.com/prometheus/common v0.34.0
     	github.com/prometheus/common/assets v0.1.0
    @@ -70,16 +70,16 @@ require (
     	google.golang.org/protobuf v1.28.0
     	gopkg.in/alecthomas/kingpin.v2 v2.2.6
     	gopkg.in/yaml.v2 v2.4.0
    -	gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b
    -	k8s.io/api v0.23.6
    -	k8s.io/apimachinery v0.23.6
    -	k8s.io/client-go v0.23.5
    +	gopkg.in/yaml.v3 v3.0.0
    +	k8s.io/api v0.24.0
    +	k8s.io/apimachinery v0.24.0
    +	k8s.io/client-go v0.24.0
     	k8s.io/klog v1.0.0
    -	k8s.io/klog/v2 v2.40.1
    +	k8s.io/klog/v2 v2.60.1
     )
     
     require (
    -	cloud.google.com/go/compute v1.6.0 // indirect
    +	cloud.google.com/go/compute v1.6.1 // indirect
     	github.com/Azure/go-autorest v14.2.0+incompatible // indirect
     	github.com/Azure/go-autorest/autorest/date v0.3.0 // indirect
     	github.com/Azure/go-autorest/autorest/to v0.4.0 // indirect
    @@ -95,11 +95,11 @@ require (
     	github.com/beorn7/perks v1.0.1 // indirect
     	github.com/cenkalti/backoff/v4 v4.1.3 // indirect
     	github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1 // indirect
    -	github.com/containerd/containerd v1.6.1 // indirect
     	github.com/davecgh/go-spew v1.1.1 // indirect
     	github.com/docker/distribution v2.7.1+incompatible // indirect
     	github.com/docker/go-connections v0.4.0 // indirect
     	github.com/docker/go-units v0.4.0 // indirect
    +	github.com/emicklei/go-restful v2.9.5+incompatible // indirect
     	github.com/evanphx/json-patch v4.12.0+incompatible // indirect
     	github.com/fatih/color v1.13.0 // indirect
     	github.com/felixge/httpsnoop v1.0.3 // indirect
    @@ -121,15 +121,17 @@ require (
     	github.com/golang/glog v1.0.0 // indirect
     	github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect
     	github.com/golang/protobuf v1.5.2 // indirect
    +	github.com/google/gnostic v0.5.7-v3refs // indirect
     	github.com/google/go-cmp v0.5.8 // indirect
    -	github.com/google/go-querystring v1.0.0 // indirect
    +	github.com/google/go-querystring v1.1.0 // indirect
     	github.com/google/gofuzz v1.2.0 // indirect
    +	github.com/google/uuid v1.2.0 // indirect
     	github.com/googleapis/gax-go/v2 v2.3.0 // indirect
    -	github.com/googleapis/gnostic v0.5.5 // indirect
     	github.com/grpc-ecosystem/grpc-gateway/v2 v2.10.2 // indirect
     	github.com/hashicorp/go-cleanhttp v0.5.1 // indirect
     	github.com/hashicorp/go-hclog v0.12.2 // indirect
     	github.com/hashicorp/go-immutable-radix v1.2.0 // indirect
    +	github.com/hashicorp/go-multierror v1.1.1 // indirect
     	github.com/hashicorp/go-rootcerts v1.0.2 // indirect
     	github.com/hashicorp/golang-lru v0.5.4 // indirect
     	github.com/hashicorp/serf v0.9.6 // indirect
    @@ -147,27 +149,34 @@ require (
     	github.com/moby/term v0.0.0-20210619224110-3f7ff695adc6 // indirect
     	github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
     	github.com/modern-go/reflect2 v1.0.2 // indirect
    +	github.com/morikuni/aec v1.0.0 // indirect
    +	github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect
    +	github.com/onsi/ginkgo v1.16.4 // indirect
    +	github.com/onsi/gomega v1.15.0 // indirect
     	github.com/opencontainers/go-digest v1.0.0 // indirect
     	github.com/opencontainers/image-spec v1.0.2 // indirect
     	github.com/pmezard/go-difflib v1.0.0 // indirect
     	github.com/prometheus/procfs v0.7.3 // indirect
     	github.com/sirupsen/logrus v1.8.1 // indirect
     	github.com/spf13/pflag v1.0.5 // indirect
    +	github.com/stretchr/objx v0.2.0 // indirect
     	go.mongodb.org/mongo-driver v1.8.3 // indirect
     	go.opencensus.io v0.23.0 // indirect
     	go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.7.0 // indirect
     	go.opentelemetry.io/otel/metric v0.30.0 // indirect
     	go.opentelemetry.io/proto/otlp v0.16.0 // indirect
    -	golang.org/x/crypto v0.0.0-20211215153901-e495a2d5b3d3 // indirect
    +	golang.org/x/crypto v0.0.0-20220214200702-86341886e292 // indirect
     	golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3 // indirect
     	golang.org/x/term v0.0.0-20210927222741-03fcf44c2211 // indirect
     	golang.org/x/text v0.3.7 // indirect
     	golang.org/x/xerrors v0.0.0-20220411194840-2f41105eb62f // indirect
     	google.golang.org/appengine v1.6.7 // indirect
    +	gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c // indirect
     	gopkg.in/inf.v0 v0.9.1 // indirect
    -	k8s.io/kube-openapi v0.0.0-20211115234752-e816edb12b65 // indirect
    -	k8s.io/utils v0.0.0-20211116205334-6203023598ed // indirect
    -	sigs.k8s.io/json v0.0.0-20211020170558-c049b76a60c6 // indirect
    +	gotest.tools/v3 v3.0.3 // indirect
    +	k8s.io/kube-openapi v0.0.0-20220328201542-3ee0da9b0b42 // indirect
    +	k8s.io/utils v0.0.0-20220210201930-3a6ce19ff2f9 // indirect
    +	sigs.k8s.io/json v0.0.0-20211208200746-9f7c6b3444d2 // indirect
     	sigs.k8s.io/structured-merge-diff/v4 v4.2.1 // indirect
     	sigs.k8s.io/yaml v1.3.0 // indirect
     )
    diff --git a/go.sum b/go.sum
    index 0be57224234..acb59a9aa6d 100644
    --- a/go.sum
    +++ b/go.sum
    @@ -1,5 +1,3 @@
    -bazil.org/fuse v0.0.0-20160811212531-371fbbdaa898/go.mod h1:Xbm+BRKSBEpa4q4hTSxohYNQpsxXPbPry4JJWOB3LB8=
    -bazil.org/fuse v0.0.0-20200407214033-5883e5a4b512/go.mod h1:FbcW6z/2VytnFDhZfumh8Ss8zxHE6qpMP5sHTRe0EaM=
     cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
     cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
     cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU=
    @@ -38,11 +36,11 @@ cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM7
     cloud.google.com/go/compute v0.1.0/go.mod h1:GAesmwr110a34z04OlxYkATPBEfVhkymfTBXtfbBFow=
     cloud.google.com/go/compute v1.3.0/go.mod h1:cCZiE1NHEtai4wiufUhW8I8S1JKkAnhnQJWM7YD99wM=
     cloud.google.com/go/compute v1.5.0/go.mod h1:9SMHyhJlzhlkJqrPAc839t2BZFTSk6Jdj6mkzQJeu0M=
    -cloud.google.com/go/compute v1.6.0 h1:XdQIN5mdPTSBVwSIVDuY5e8ZzVAccsHvD3qTEz4zIps=
     cloud.google.com/go/compute v1.6.0/go.mod h1:T29tfhtVbq1wvAPo0E3+7vhgmkOYeXjhFvz/FMzPu0s=
    +cloud.google.com/go/compute v1.6.1 h1:2sMmt8prCn7DPaG4Pmh0N3Inmc8cT8ae5k1M6VJ9Wqc=
    +cloud.google.com/go/compute v1.6.1/go.mod h1:g85FgpzFvNULZ+S8AYq87axRKuf2Kh7deLqV/jJ3thU=
     cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE=
     cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk=
    -cloud.google.com/go/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqClKRT5SZwBmk=
     cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I=
     cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw=
     cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA=
    @@ -53,29 +51,21 @@ cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohl
     cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs=
     cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0=
     dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=
    -github.com/AdaLogics/go-fuzz-headers v0.0.0-20210715213245-6c3934b029d8/go.mod h1:CzsSbkDixRphAF5hS6wbMKq0eI6ccJRb7/A0M6JBnwg=
    -github.com/Azure/azure-sdk-for-go v16.2.1+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc=
     github.com/Azure/azure-sdk-for-go v63.0.0+incompatible h1:whPsa+jCHQSo5wGMPNLw4bz8q9Co2+vnXHzXGctoTaQ=
     github.com/Azure/azure-sdk-for-go v63.0.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc=
    -github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78/go.mod h1:LmzpDX56iTiv29bbRTIsUNlaFfuhWRQBWjQdVyAevI8=
    -github.com/Azure/go-ansiterm v0.0.0-20210608223527-2377c96fe795/go.mod h1:LmzpDX56iTiv29bbRTIsUNlaFfuhWRQBWjQdVyAevI8=
     github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 h1:UQHMgLO+TxOElx5B5HZ4hJQsoJ/PvUvKRhJHDQXO8P8=
     github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E=
    -github.com/Azure/go-autorest v10.8.1+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24=
     github.com/Azure/go-autorest v14.2.0+incompatible h1:V5VMDjClD3GiElqLWO7mz2MxNAK/vTfRHdAubSIPRgs=
     github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24=
    -github.com/Azure/go-autorest/autorest v0.11.1/go.mod h1:JFgpikqFJ/MleTTxwepExTKnFUKKszPS8UavbQYUMuw=
     github.com/Azure/go-autorest/autorest v0.11.18/go.mod h1:dSiJPy22c3u0OtOKDNttNgqpNFY/GeWa7GH/Pz56QRA=
    -github.com/Azure/go-autorest/autorest v0.11.25 h1:yp+V8DGur2aIUE87ebP8twPLz6k68jtJTlg61mEoByA=
    -github.com/Azure/go-autorest/autorest v0.11.25/go.mod h1:7l8ybrIdUmGqZMTD0sRtAr8NvbHjfofbf8RSP2q7w7U=
    -github.com/Azure/go-autorest/autorest/adal v0.9.0/go.mod h1:/c022QCutn2P7uY+/oQWWNcK9YU+MH96NgK+jErpbcg=
    -github.com/Azure/go-autorest/autorest/adal v0.9.5/go.mod h1:B7KF7jKIeC9Mct5spmyCB/A8CG/sEz1vwIRGv/bbw7A=
    +github.com/Azure/go-autorest/autorest v0.11.27 h1:F3R3q42aWytozkV8ihzcgMO4OA4cuqr3bNlsEuF6//A=
    +github.com/Azure/go-autorest/autorest v0.11.27/go.mod h1:7l8ybrIdUmGqZMTD0sRtAr8NvbHjfofbf8RSP2q7w7U=
     github.com/Azure/go-autorest/autorest/adal v0.9.13/go.mod h1:W/MM4U6nLxnIskrw4UwWzlHfGjwUS50aOsc/I3yuU8M=
    -github.com/Azure/go-autorest/autorest/adal v0.9.18 h1:kLnPsRjzZZUF3K5REu/Kc+qMQrvuza2bwSnNdhmzLfQ=
     github.com/Azure/go-autorest/autorest/adal v0.9.18/go.mod h1:XVVeme+LZwABT8K5Lc3hA4nAe8LDBVle26gTrguhhPQ=
    +github.com/Azure/go-autorest/autorest/adal v0.9.20 h1:gJ3E98kMpFB1MFqQCvA1yFab8vthOeD4VlFRQULxahg=
    +github.com/Azure/go-autorest/autorest/adal v0.9.20/go.mod h1:XVVeme+LZwABT8K5Lc3hA4nAe8LDBVle26gTrguhhPQ=
     github.com/Azure/go-autorest/autorest/date v0.3.0 h1:7gUk1U5M/CQbp9WoqinNzJar+8KY+LPI6wiWrP/myHw=
     github.com/Azure/go-autorest/autorest/date v0.3.0/go.mod h1:BI0uouVdmngYNUzGWeSYnokU+TrmwEsOqdt8Y6sso74=
    -github.com/Azure/go-autorest/autorest/mocks v0.4.0/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k=
     github.com/Azure/go-autorest/autorest/mocks v0.4.1/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k=
     github.com/Azure/go-autorest/autorest/mocks v0.4.2 h1:PGN4EDXnuQbojHbU0UWoNvmu9AGVwYHG9/fkDYhtAfw=
     github.com/Azure/go-autorest/autorest/mocks v0.4.2/go.mod h1:Vy7OitM9Kei0i1Oj+LvyAWMXJHeKH1MVlzFugfVrmyU=
    @@ -83,7 +73,6 @@ github.com/Azure/go-autorest/autorest/to v0.4.0 h1:oXVqrxakqqV1UZdSazDOPOLvOIz+X
     github.com/Azure/go-autorest/autorest/to v0.4.0/go.mod h1:fE8iZBn7LQR7zH/9XU2NcPR4o9jEImooCeWJcYV/zLE=
     github.com/Azure/go-autorest/autorest/validation v0.3.1 h1:AgyqjAd94fwNAoTjl/WQXg4VvFeRFpO+UhNyRXqF1ac=
     github.com/Azure/go-autorest/autorest/validation v0.3.1/go.mod h1:yhLgjC0Wda5DYXl6JAsWyUe4KVNffhoDhG0zVzUMo3E=
    -github.com/Azure/go-autorest/logger v0.2.0/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8=
     github.com/Azure/go-autorest/logger v0.2.1 h1:IG7i4p/mDa2Ce4TRyAO8IHnVhAVF3RFU+ZtXWSmf4Tg=
     github.com/Azure/go-autorest/logger v0.2.1/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8=
     github.com/Azure/go-autorest/tracing v0.6.0 h1:TYi4+3m5t6K48TGI9AUdb+IzbnSxvnvUMfuitfgcfuo=
    @@ -92,39 +81,14 @@ github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03
     github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=
     github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ=
     github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0=
    -github.com/Microsoft/go-winio v0.4.11/go.mod h1:VhR8bwka0BXejwEJY73c50VrPtXAaKcyvVC4A4RozmA=
    -github.com/Microsoft/go-winio v0.4.14/go.mod h1:qXqCSQ3Xa7+6tgxaGTIe4Kpcdsi+P8jBhyzoq1bpyYA=
    -github.com/Microsoft/go-winio v0.4.15-0.20190919025122-fc70bd9a86b5/go.mod h1:tTuCMEN+UleMWgg9dVx4Hu52b1bJo+59jBh3ajtinzw=
    -github.com/Microsoft/go-winio v0.4.16-0.20201130162521-d1ffc52c7331/go.mod h1:XB6nPKklQyQ7GC9LdcBEcBl8PF76WugXOPRXwdLnMv0=
    -github.com/Microsoft/go-winio v0.4.16/go.mod h1:XB6nPKklQyQ7GC9LdcBEcBl8PF76WugXOPRXwdLnMv0=
    -github.com/Microsoft/go-winio v0.4.17-0.20210211115548-6eac466e5fa3/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84=
    -github.com/Microsoft/go-winio v0.4.17-0.20210324224401-5516f17a5958/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84=
    -github.com/Microsoft/go-winio v0.4.17/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84=
     github.com/Microsoft/go-winio v0.5.1 h1:aPJp2QD7OOrhO5tQXqQoGSJc+DjDtWTGLOmNyAm6FgY=
     github.com/Microsoft/go-winio v0.5.1/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84=
    -github.com/Microsoft/hcsshim v0.8.6/go.mod h1:Op3hHsoHPAvb6lceZHDtd9OkTew38wNoXnJs8iY7rUg=
    -github.com/Microsoft/hcsshim v0.8.7-0.20190325164909-8abdbb8205e4/go.mod h1:Op3hHsoHPAvb6lceZHDtd9OkTew38wNoXnJs8iY7rUg=
    -github.com/Microsoft/hcsshim v0.8.7/go.mod h1:OHd7sQqRFrYd3RmSgbgji+ctCwkbq2wbEYNSzOYtcBQ=
    -github.com/Microsoft/hcsshim v0.8.9/go.mod h1:5692vkUqntj1idxauYlpoINNKeqCiG6Sg38RRsjT5y8=
    -github.com/Microsoft/hcsshim v0.8.14/go.mod h1:NtVKoYxQuTLx6gEq0L96c9Ju4JbRJ4nY2ow3VK6a9Lg=
    -github.com/Microsoft/hcsshim v0.8.15/go.mod h1:x38A4YbHbdxJtc0sF6oIz+RG0npwSCAvn69iY6URG00=
    -github.com/Microsoft/hcsshim v0.8.16/go.mod h1:o5/SZqmR7x9JNKsW3pu+nqHm0MF8vbA+VxGOoXdC600=
    -github.com/Microsoft/hcsshim v0.8.20/go.mod h1:+w2gRZ5ReXQhFOrvSQeNfhrYB/dg3oDwTOcER2fw4I4=
    -github.com/Microsoft/hcsshim v0.8.21/go.mod h1:+w2gRZ5ReXQhFOrvSQeNfhrYB/dg3oDwTOcER2fw4I4=
    -github.com/Microsoft/hcsshim v0.8.23/go.mod h1:4zegtUJth7lAvFyc6cH2gGQ5B3OFQim01nnU2M8jKDg=
    -github.com/Microsoft/hcsshim v0.9.2/go.mod h1:7pLA8lDk46WKDWlVsENo92gC0XFa8rbKfyFRBqxEbCc=
    -github.com/Microsoft/hcsshim/test v0.0.0-20201218223536-d3e5debf77da/go.mod h1:5hlzMzRKMLyo42nCZ9oml8AdTlq/0cvIaBv6tK1RehU=
    -github.com/Microsoft/hcsshim/test v0.0.0-20210227013316-43a75bb4edd3/go.mod h1:mw7qgWloBUl75W/gVH3cQszUg1+gUITj7D6NY7ywVnY=
     github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ=
    -github.com/NYTimes/gziphandler v1.1.1/go.mod h1:n/CVRwUEOgIxrgPvAQhUUr9oeUtvrhMomdKFjzJNB0c=
     github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU=
    -github.com/PuerkitoBio/purell v1.0.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0=
     github.com/PuerkitoBio/purell v1.1.1 h1:WEQqlqaGbrPkxLJWfBwQmfEAE1Z7ONdDLqrN38tNFfI=
     github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0=
    -github.com/PuerkitoBio/urlesc v0.0.0-20160726150825-5bd2802263f2/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE=
     github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 h1:d+Bc7a5rLufV/sSk/8dngufqelfh6jnri85riMAaF/M=
     github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE=
    -github.com/Shopify/logrus-bugsnag v0.0.0-20171204204709-577dee27f20d/go.mod h1:HI8ITrYtUY+O+ZhtlqUnD8+KwNPOyugEhfP9fdUIaEQ=
     github.com/Shopify/sarama v1.19.0/go.mod h1:FVkBWblsNy7DGZRfXLU0O9RCGt5g3g3yEuWXgklEdEo=
     github.com/Shopify/toxiproxy v2.1.4+incompatible/go.mod h1:OXgGpZ6Cli1/URJOF1DMxUHB2q5Ap20/P/eIdh4G0pI=
     github.com/VividCortex/gohistogram v1.0.0/go.mod h1:Pf5mBqqDxYaXu3hDrrU+w6nw50o/4+TcAqDqk/vUH7g=
    @@ -137,77 +101,51 @@ github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRF
     github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho=
     github.com/alecthomas/units v0.0.0-20211218093645-b94a6e3cc137 h1:s6gZFSlWYmbqAuRjVTiNNhvNRfY2Wxp9nhfyel4rklc=
     github.com/alecthomas/units v0.0.0-20211218093645-b94a6e3cc137/go.mod h1:OMCwj8VM1Kc9e19TLln2VL61YJF0x1XFtfdL4JdbSyE=
    -github.com/alexflint/go-filemutex v0.0.0-20171022225611-72bdc8eae2ae/go.mod h1:CgnQgUtFrFz9mxFNtED3jI5tLDjKlOM+oUF/sTk6ps0=
    -github.com/alexflint/go-filemutex v1.1.0/go.mod h1:7P4iRhttt/nUvUOrYIhcpMzv2G6CY9UnI16Z+UJqRyk=
     github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY=
     github.com/apache/thrift v0.12.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ=
     github.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ=
     github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o=
    -github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8=
     github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY=
     github.com/armon/go-metrics v0.3.3 h1:a9F4rlj7EWWrbj7BYw8J8+x+ZZkJeqzNyRk8hdPF+ro=
     github.com/armon/go-metrics v0.3.3/go.mod h1:4O98XIr/9W0sxpJ8UaYkvjk10Iff7SnFrb4QAOwNTFc=
     github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=
     github.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=
    +github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs=
     github.com/aryann/difflib v0.0.0-20170710044230-e206f873d14a/go.mod h1:DAHtR1m6lCRdSC2Tm3DSWRPvIPr6xNKyeHdqDQSQT+A=
     github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY=
     github.com/asaskevich/govalidator v0.0.0-20200907205600-7a23bdc65eef/go.mod h1:WaHUgvxTVq04UNunO+XhnAqY/wQc+bxr74GqbsZ/Jqw=
     github.com/asaskevich/govalidator v0.0.0-20210307081110-f21760c49a8d h1:Byv0BzEl3/e6D5CLfI0j/7hiIEtvGVFPCZ7Ei2oq8iQ=
     github.com/asaskevich/govalidator v0.0.0-20210307081110-f21760c49a8d/go.mod h1:WaHUgvxTVq04UNunO+XhnAqY/wQc+bxr74GqbsZ/Jqw=
     github.com/aws/aws-lambda-go v1.13.3/go.mod h1:4UKl9IzQMoD+QF79YdCuzCwp8VbmG4VAQwij/eHl5CU=
    -github.com/aws/aws-sdk-go v1.15.11/go.mod h1:mFuSZ37Z9YOHbQEwBWztmVzqXrEkub65tZoCYDt7FT0=
     github.com/aws/aws-sdk-go v1.27.0/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo=
     github.com/aws/aws-sdk-go v1.38.35/go.mod h1:hcU610XS61/+aQV88ixoOzUoG7v3b31pl2zKMmprdro=
     github.com/aws/aws-sdk-go v1.43.11/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX4oIKwKHZo=
    -github.com/aws/aws-sdk-go v1.43.31 h1:yJZIr8nMV1hXjAvvOLUFqZRJcHV7udPQBfhJqawDzI0=
    -github.com/aws/aws-sdk-go v1.43.31/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX4oIKwKHZo=
    +github.com/aws/aws-sdk-go v1.44.20 h1:nllTRN24EfhDSeKsNbIc6HoC8Ogd2NCJTRB8l84kDlM=
    +github.com/aws/aws-sdk-go v1.44.20/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX4oIKwKHZo=
     github.com/aws/aws-sdk-go-v2 v0.18.0/go.mod h1:JWVYvqSMppoMJC0x5wdwiImzgXTI9FuZwxzkQq9wy+g=
    -github.com/benbjohnson/clock v1.0.3/go.mod h1:bGMdMPoPVvcYyt1gHDf4J2KE153Yf9BuiUKYMaxlTDM=
    -github.com/beorn7/perks v0.0.0-20160804104726-4c0e84591b9a/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=
     github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=
     github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=
     github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=
     github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=
     github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs=
    -github.com/bitly/go-simplejson v0.5.0/go.mod h1:cXHtHw4XUPsvGaxgjIAn8PhEWG9NfngEKAMDJEczWVA=
    -github.com/bits-and-blooms/bitset v1.2.0/go.mod h1:gIdJ4wp64HaoK2YrL1Q5/N7Y16edYb8uY+O0FJTyyDA=
    -github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJmJgSg28kpZDP6UIiPt0e0Oz0kqKNGyRaWEPv84=
    -github.com/blang/semver v3.1.0+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk=
    -github.com/blang/semver v3.5.1+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk=
    -github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869/go.mod h1:Ekp36dRnpXw/yCqJaO+ZrUyxD+3VXMFFr56k5XYrpB4=
    -github.com/bshuster-repo/logrus-logstash-hook v0.4.1/go.mod h1:zsTqEiSzDgAa/8GZR7E1qaXrhYNDKBYy5/dWPTIflbk=
    -github.com/buger/jsonparser v0.0.0-20180808090653-f4dd9f5a6b44/go.mod h1:bbYlZJ7hK1yFx9hf58LP0zeX7UjIGs20ufpu3evjr+s=
    -github.com/buger/jsonparser v1.1.1/go.mod h1:6RYKKt7H4d4+iWqouImQ9R2FZql3VbhNgx27UK13J/0=
    -github.com/bugsnag/bugsnag-go v0.0.0-20141110184014-b1d153021fcd/go.mod h1:2oa8nejYd4cQ/b0hMIopN0lCRxU0bueqREvZLWFrtK8=
    -github.com/bugsnag/osext v0.0.0-20130617224835-0dd3f918b21b/go.mod h1:obH5gd0BsqsP2LwDJ9aOkm/6J86V6lyAXCoQWGw3K50=
    -github.com/bugsnag/panicwrap v0.0.0-20151223152923-e2c28503fcd0/go.mod h1:D/8v3kj0zr8ZAKg1AQ6crr+5VwKN5eIywRkfhyM/+dE=
     github.com/casbin/casbin/v2 v2.1.2/go.mod h1:YcPU1XXisHhLzuxH9coDNf2FbKpjGlbCg3n9yuLkIJQ=
     github.com/cenkalti/backoff v2.2.1+incompatible h1:tNowT99t7UNflLxfYYSlKYsBpXdEet03Pg2g16Swow4=
     github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM=
    -github.com/cenkalti/backoff/v4 v4.1.1/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw=
     github.com/cenkalti/backoff/v4 v4.1.2/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw=
     github.com/cenkalti/backoff/v4 v4.1.3 h1:cFAlzYUlVYDysBEH2T5hyJZMh3+5+WCBvSnK6Q8UtC4=
     github.com/cenkalti/backoff/v4 v4.1.3/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw=
     github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
    -github.com/certifi/gocertifi v0.0.0-20191021191039-0944d244cd40/go.mod h1:sGbDF6GwGcLpkNXPUTkMRoywsNa/ol15pxFe6ERfguA=
    -github.com/certifi/gocertifi v0.0.0-20200922220541-2c3bb06c6054/go.mod h1:sGbDF6GwGcLpkNXPUTkMRoywsNa/ol15pxFe6ERfguA=
     github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko=
     github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc=
     github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
     github.com/cespare/xxhash/v2 v2.1.2 h1:YRXhKfTDauu4ajMg1TPgFO5jnlC2HCbmLXMcTG5cbYE=
     github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
    -github.com/checkpoint-restore/go-criu/v4 v4.1.0/go.mod h1:xUQBLp4RLc5zJtWY++yjOoMoB5lihDt7fai+75m+rGw=
    -github.com/checkpoint-restore/go-criu/v5 v5.0.0/go.mod h1:cfwC0EG7HMUenopBsUf9d89JlCLQIfgVcNsNN0t6T2M=
    -github.com/checkpoint-restore/go-criu/v5 v5.3.0/go.mod h1:E/eQpaFtUKGOOSEBZgmKAcn+zUUwWxqcaKZlF54wK8E=
     github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=
    +github.com/chzyer/logex v1.2.0/go.mod h1:9+9sk7u7pGNWYMkh0hdiL++6OeibzJccyQU4p4MedaY=
     github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI=
    +github.com/chzyer/readline v1.5.0/go.mod h1:x22KAscuvRqlLoK9CsoYsmxoXZMMFVyOl86cAH8qUic=
     github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=
    -github.com/cilium/ebpf v0.0.0-20200110133405-4032b1d8aae3/go.mod h1:MA5e5Lr8slmEg9bt0VpxxWqJlO4iwu3FBdHUzV7wQVg=
    -github.com/cilium/ebpf v0.0.0-20200702112145-1c8d4c9ef775/go.mod h1:7cR51M8ViRLIdUjrmSXlK9pkrsDlLHbO8jiB8X8JnOc=
    -github.com/cilium/ebpf v0.2.0/go.mod h1:To2CFviqOWL/M0gIMsvSMlqe7em/l1ALkX1PyjrX2Qs=
    -github.com/cilium/ebpf v0.4.0/go.mod h1:4tRaxcgiL706VnOzHOdBlY8IEAIdxINsQBcU4xJJXRs=
    -github.com/cilium/ebpf v0.6.2/go.mod h1:4tRaxcgiL706VnOzHOdBlY8IEAIdxINsQBcU4xJJXRs=
    -github.com/cilium/ebpf v0.7.0/go.mod h1:/oI2+1shJiTGAMgl6/RgJr36Eo1jzrRcAWbcXO2usCA=
    +github.com/chzyer/test v0.0.0-20210722231415-061457976a23/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=
     github.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag=
     github.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I=
     github.com/clbanning/x2j v0.0.0-20191024224557-825249438eec/go.mod h1:jMjuTZXRI4dUb/I5gc9Hdhagfvm9+RyrPryS/auMzxE=
    @@ -223,173 +161,36 @@ github.com/cncf/xds/go v0.0.0-20211001041855-01bcc9b48dfe/go.mod h1:eXthEFrGJvWH
     github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1 h1:zH8ljVhhq7yC0MIeUL/IviMtY8hx2mK8cN9wEYb8ggw=
     github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
     github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8=
    -github.com/cockroachdb/datadriven v0.0.0-20200714090401-bf6692d28da5/go.mod h1:h6jFvWxBdQXxjopDMZyH2UVceIRfR84bdzbkoKrsWNo=
    -github.com/cockroachdb/errors v1.2.4/go.mod h1:rQD95gz6FARkaKkQXUksEje/d9a6wBJoCr5oaCLELYA=
    -github.com/cockroachdb/logtags v0.0.0-20190617123548-eb05cc24525f/go.mod h1:i/u985jwjWRlyHXQbwatDASoW0RMlZ/3i9yJHE2xLkI=
     github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI=
    -github.com/containerd/aufs v0.0.0-20200908144142-dab0cbea06f4/go.mod h1:nukgQABAEopAHvB6j7cnP5zJ+/3aVcE7hCYqvIwAHyE=
    -github.com/containerd/aufs v0.0.0-20201003224125-76a6863f2989/go.mod h1:AkGGQs9NM2vtYHaUen+NljV0/baGCAPELGm2q9ZXpWU=
    -github.com/containerd/aufs v0.0.0-20210316121734-20793ff83c97/go.mod h1:kL5kd6KM5TzQjR79jljyi4olc1Vrx6XBlcyj3gNv2PU=
    -github.com/containerd/aufs v1.0.0/go.mod h1:kL5kd6KM5TzQjR79jljyi4olc1Vrx6XBlcyj3gNv2PU=
    -github.com/containerd/btrfs v0.0.0-20201111183144-404b9149801e/go.mod h1:jg2QkJcsabfHugurUvvPhS3E08Oxiuh5W/g1ybB4e0E=
    -github.com/containerd/btrfs v0.0.0-20210316141732-918d888fb676/go.mod h1:zMcX3qkXTAi9GI50+0HOeuV8LU2ryCE/V2vG/ZBiTss=
    -github.com/containerd/btrfs v1.0.0/go.mod h1:zMcX3qkXTAi9GI50+0HOeuV8LU2ryCE/V2vG/ZBiTss=
    -github.com/containerd/cgroups v0.0.0-20190717030353-c4b9ac5c7601/go.mod h1:X9rLEHIqSf/wfK8NsPqxJmeZgW4pcfzdXITDrUSJ6uI=
    -github.com/containerd/cgroups v0.0.0-20190919134610-bf292b21730f/go.mod h1:OApqhQ4XNSNC13gXIwDjhOQxjWa/NxkwZXJ1EvqT0ko=
    -github.com/containerd/cgroups v0.0.0-20200531161412-0dbf7f05ba59/go.mod h1:pA0z1pT8KYB3TCXK/ocprsh7MAkoW8bZVzPdih9snmM=
    -github.com/containerd/cgroups v0.0.0-20200710171044-318312a37340/go.mod h1:s5q4SojHctfxANBDvMeIaIovkq29IP48TKAxnhYRxvo=
    -github.com/containerd/cgroups v0.0.0-20200824123100-0b889c03f102/go.mod h1:s5q4SojHctfxANBDvMeIaIovkq29IP48TKAxnhYRxvo=
    -github.com/containerd/cgroups v0.0.0-20210114181951-8a68de567b68/go.mod h1:ZJeTFisyysqgcCdecO57Dj79RfL0LNeGiFUqLYQRYLE=
    -github.com/containerd/cgroups v1.0.1/go.mod h1:0SJrPIenamHDcZhEcJMNBB85rHcUsw4f25ZfBiPYRkU=
    -github.com/containerd/cgroups v1.0.3/go.mod h1:/ofk34relqNjSGyqPrmEULrO4Sc8LJhvJmWbUCUKqj8=
    -github.com/containerd/console v0.0.0-20180822173158-c12b1e7919c1/go.mod h1:Tj/on1eG8kiEhd0+fhSDzsPAFESxzBBvdyEgyryXffw=
    -github.com/containerd/console v0.0.0-20181022165439-0650fd9eeb50/go.mod h1:Tj/on1eG8kiEhd0+fhSDzsPAFESxzBBvdyEgyryXffw=
    -github.com/containerd/console v0.0.0-20191206165004-02ecf6a7291e/go.mod h1:8Pf4gM6VEbTNRIT26AyyU7hxdQU3MvAvxVI0sc00XBE=
    -github.com/containerd/console v1.0.1/go.mod h1:XUsP6YE/mKtz6bxc+I8UiKKTP04qjQL4qcS3XoQ5xkw=
    -github.com/containerd/console v1.0.2/go.mod h1:ytZPjGgY2oeTkAONYafi2kSj0aYggsf8acV1PGKCbzQ=
    -github.com/containerd/console v1.0.3/go.mod h1:7LqA/THxQ86k76b8c/EMSiaJ3h1eZkMkXar0TQ1gf3U=
    -github.com/containerd/containerd v1.2.10/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA=
    -github.com/containerd/containerd v1.3.0-beta.2.0.20190828155532-0293cbd26c69/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA=
    -github.com/containerd/containerd v1.3.0/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA=
    -github.com/containerd/containerd v1.3.1-0.20191213020239-082f7e3aed57/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA=
    -github.com/containerd/containerd v1.3.2/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA=
    -github.com/containerd/containerd v1.4.0-beta.2.0.20200729163537-40b22ef07410/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA=
    -github.com/containerd/containerd v1.4.1/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA=
    -github.com/containerd/containerd v1.4.3/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA=
    -github.com/containerd/containerd v1.4.9/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA=
    -github.com/containerd/containerd v1.5.0-beta.1/go.mod h1:5HfvG1V2FsKesEGQ17k5/T7V960Tmcumvqn8Mc+pCYQ=
    -github.com/containerd/containerd v1.5.0-beta.3/go.mod h1:/wr9AVtEM7x9c+n0+stptlo/uBBoBORwEx6ardVcmKU=
    -github.com/containerd/containerd v1.5.0-beta.4/go.mod h1:GmdgZd2zA2GYIBZ0w09ZvgqEq8EfBp/m3lcVZIvPHhI=
    -github.com/containerd/containerd v1.5.0-rc.0/go.mod h1:V/IXoMqNGgBlabz3tHD2TWDoTJseu1FGOKuoA4nNb2s=
    -github.com/containerd/containerd v1.5.1/go.mod h1:0DOxVqwDy2iZvrZp2JUx/E+hS0UNTVn7dJnIOwtYR4g=
    -github.com/containerd/containerd v1.5.7/go.mod h1:gyvv6+ugqY25TiXxcZC3L5yOeYgEw0QMhscqVp1AR9c=
    -github.com/containerd/containerd v1.5.8/go.mod h1:YdFSv5bTFLpG2HIYmfqDpSYYTDX+mc5qtSuYx1YUb/s=
    -github.com/containerd/containerd v1.6.1 h1:oa2uY0/0G+JX4X7hpGCYvkp9FjUancz56kSNnb1sG3o=
    -github.com/containerd/containerd v1.6.1/go.mod h1:1nJz5xCZPusx6jJU8Frfct988y0NpumIq9ODB0kLtoE=
    -github.com/containerd/continuity v0.0.0-20190426062206-aaeac12a7ffc/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y=
    -github.com/containerd/continuity v0.0.0-20190815185530-f2a389ac0a02/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y=
    -github.com/containerd/continuity v0.0.0-20191127005431-f65d91d395eb/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y=
    -github.com/containerd/continuity v0.0.0-20200710164510-efbc4488d8fe/go.mod h1:cECdGN1O8G9bgKTlLhuPJimka6Xb/Gg7vYzCTNVxhvo=
    -github.com/containerd/continuity v0.0.0-20201208142359-180525291bb7/go.mod h1:kR3BEg7bDFaEddKm54WSmrol1fKWDU1nKYkgrcgZT7Y=
    -github.com/containerd/continuity v0.0.0-20210208174643-50096c924a4e/go.mod h1:EXlVlkqNba9rJe3j7w3Xa924itAMLgZH4UD/Q4PExuQ=
    -github.com/containerd/continuity v0.1.0/go.mod h1:ICJu0PwR54nI0yPEnJ6jcS+J7CZAUXrLh8lPo2knzsM=
    -github.com/containerd/continuity v0.2.2/go.mod h1:pWygW9u7LtS1o4N/Tn0FoCFDIXZ7rxcMX7HX1Dmibvk=
    -github.com/containerd/fifo v0.0.0-20180307165137-3d5202aec260/go.mod h1:ODA38xgv3Kuk8dQz2ZQXpnv/UZZUHUCL7pnLehbXgQI=
    -github.com/containerd/fifo v0.0.0-20190226154929-a9fb20d87448/go.mod h1:ODA38xgv3Kuk8dQz2ZQXpnv/UZZUHUCL7pnLehbXgQI=
    -github.com/containerd/fifo v0.0.0-20200410184934-f15a3290365b/go.mod h1:jPQ2IAeZRCYxpS/Cm1495vGFww6ecHmMk1YJH2Q5ln0=
    -github.com/containerd/fifo v0.0.0-20201026212402-0724c46b320c/go.mod h1:jPQ2IAeZRCYxpS/Cm1495vGFww6ecHmMk1YJH2Q5ln0=
    -github.com/containerd/fifo v0.0.0-20210316144830-115abcc95a1d/go.mod h1:ocF/ME1SX5b1AOlWi9r677YJmCPSwwWnQ9O123vzpE4=
    -github.com/containerd/fifo v1.0.0/go.mod h1:ocF/ME1SX5b1AOlWi9r677YJmCPSwwWnQ9O123vzpE4=
    -github.com/containerd/go-cni v1.0.1/go.mod h1:+vUpYxKvAF72G9i1WoDOiPGRtQpqsNW/ZHtSlv++smU=
    -github.com/containerd/go-cni v1.0.2/go.mod h1:nrNABBHzu0ZwCug9Ije8hL2xBCYh/pjfMb1aZGrrohk=
    -github.com/containerd/go-cni v1.1.0/go.mod h1:Rflh2EJ/++BA2/vY5ao3K6WJRR/bZKsX123aPk+kUtA=
    -github.com/containerd/go-cni v1.1.3/go.mod h1:Rflh2EJ/++BA2/vY5ao3K6WJRR/bZKsX123aPk+kUtA=
    -github.com/containerd/go-runc v0.0.0-20180907222934-5a6d9f37cfa3/go.mod h1:IV7qH3hrUgRmyYrtgEeGWJfWbgcHL9CSRruz2Vqcph0=
    -github.com/containerd/go-runc v0.0.0-20190911050354-e029b79d8cda/go.mod h1:IV7qH3hrUgRmyYrtgEeGWJfWbgcHL9CSRruz2Vqcph0=
    -github.com/containerd/go-runc v0.0.0-20200220073739-7016d3ce2328/go.mod h1:PpyHrqVs8FTi9vpyHwPwiNEGaACDxT/N/pLcvMSRA9g=
    -github.com/containerd/go-runc v0.0.0-20201020171139-16b287bc67d0/go.mod h1:cNU0ZbCgCQVZK4lgG3P+9tn9/PaJNmoDXPpoJhDR+Ok=
    -github.com/containerd/go-runc v1.0.0/go.mod h1:cNU0ZbCgCQVZK4lgG3P+9tn9/PaJNmoDXPpoJhDR+Ok=
    -github.com/containerd/imgcrypt v1.0.1/go.mod h1:mdd8cEPW7TPgNG4FpuP3sGBiQ7Yi/zak9TYCG3juvb0=
    -github.com/containerd/imgcrypt v1.0.4-0.20210301171431-0ae5c75f59ba/go.mod h1:6TNsg0ctmizkrOgXRNQjAPFWpMYRWuiB6dSF4Pfa5SA=
    -github.com/containerd/imgcrypt v1.1.1-0.20210312161619-7ed62a527887/go.mod h1:5AZJNI6sLHJljKuI9IHnw1pWqo/F0nGDOuR9zgTs7ow=
    -github.com/containerd/imgcrypt v1.1.1/go.mod h1:xpLnwiQmEUJPvQoAapeb2SNCxz7Xr6PJrXQb0Dpc4ms=
    -github.com/containerd/imgcrypt v1.1.3/go.mod h1:/TPA1GIDXMzbj01yd8pIbQiLdQxed5ue1wb8bP7PQu4=
    -github.com/containerd/nri v0.0.0-20201007170849-eb1350a75164/go.mod h1:+2wGSDGFYfE5+So4M5syatU0N0f0LbWpuqyMi4/BE8c=
    -github.com/containerd/nri v0.0.0-20210316161719-dbaa18c31c14/go.mod h1:lmxnXF6oMkbqs39FiCt1s0R2HSMhcLel9vNL3m4AaeY=
    -github.com/containerd/nri v0.1.0/go.mod h1:lmxnXF6oMkbqs39FiCt1s0R2HSMhcLel9vNL3m4AaeY=
    -github.com/containerd/stargz-snapshotter/estargz v0.4.1/go.mod h1:x7Q9dg9QYb4+ELgxmo4gBUeJB0tl5dqH1Sdz0nJU1QM=
    -github.com/containerd/ttrpc v0.0.0-20190828154514-0e0f228740de/go.mod h1:PvCDdDGpgqzQIzDW1TphrGLssLDZp2GuS+X5DkEJB8o=
    -github.com/containerd/ttrpc v0.0.0-20190828172938-92c8520ef9f8/go.mod h1:PvCDdDGpgqzQIzDW1TphrGLssLDZp2GuS+X5DkEJB8o=
    -github.com/containerd/ttrpc v0.0.0-20191028202541-4f1b8fe65a5c/go.mod h1:LPm1u0xBw8r8NOKoOdNMeVHSawSsltak+Ihv+etqsE8=
    -github.com/containerd/ttrpc v1.0.1/go.mod h1:UAxOpgT9ziI0gJrmKvgcZivgxOp8iFPSk8httJEt98Y=
    -github.com/containerd/ttrpc v1.0.2/go.mod h1:UAxOpgT9ziI0gJrmKvgcZivgxOp8iFPSk8httJEt98Y=
    -github.com/containerd/ttrpc v1.1.0/go.mod h1:XX4ZTnoOId4HklF4edwc4DcqskFZuvXB1Evzy5KFQpQ=
    -github.com/containerd/typeurl v0.0.0-20180627222232-a93fcdb778cd/go.mod h1:Cm3kwCdlkCfMSHURc+r6fwoGH6/F1hH3S4sg0rLFWPc=
    -github.com/containerd/typeurl v0.0.0-20190911142611-5eb25027c9fd/go.mod h1:GeKYzf2pQcqv7tJ0AoCuuhtnqhva5LNU3U+OyKxxJpk=
    -github.com/containerd/typeurl v1.0.1/go.mod h1:TB1hUtrpaiO88KEK56ijojHS1+NeF0izUACaJW2mdXg=
    -github.com/containerd/typeurl v1.0.2/go.mod h1:9trJWW2sRlGub4wZJRTW83VtbOLS6hwcDZXTn6oPz9s=
    -github.com/containerd/zfs v0.0.0-20200918131355-0a33824f23a2/go.mod h1:8IgZOBdv8fAgXddBT4dBXJPtxyRsejFIpXoklgxgEjw=
    -github.com/containerd/zfs v0.0.0-20210301145711-11e8f1707f62/go.mod h1:A9zfAbMlQwE+/is6hi0Xw8ktpL+6glmqZYtevJgaB8Y=
    -github.com/containerd/zfs v0.0.0-20210315114300-dde8f0fda960/go.mod h1:m+m51S1DvAP6r3FcmYCp54bQ34pyOwTieQDNRIRHsFY=
    -github.com/containerd/zfs v0.0.0-20210324211415-d5c4544f0433/go.mod h1:m+m51S1DvAP6r3FcmYCp54bQ34pyOwTieQDNRIRHsFY=
    -github.com/containerd/zfs v1.0.0/go.mod h1:m+m51S1DvAP6r3FcmYCp54bQ34pyOwTieQDNRIRHsFY=
    -github.com/containernetworking/cni v0.7.1/go.mod h1:LGwApLUm2FpoOfxTDEeq8T9ipbpZ61X79hmU3w8FmsY=
    -github.com/containernetworking/cni v0.8.0/go.mod h1:LGwApLUm2FpoOfxTDEeq8T9ipbpZ61X79hmU3w8FmsY=
    -github.com/containernetworking/cni v0.8.1/go.mod h1:LGwApLUm2FpoOfxTDEeq8T9ipbpZ61X79hmU3w8FmsY=
    -github.com/containernetworking/cni v1.0.1/go.mod h1:AKuhXbN5EzmD4yTNtfSsX3tPcmtrBI6QcRV0NiNt15Y=
    -github.com/containernetworking/plugins v0.8.6/go.mod h1:qnw5mN19D8fIwkqW7oHHYDHVlzhJpcY6TQxn/fUyDDM=
    -github.com/containernetworking/plugins v0.9.1/go.mod h1:xP/idU2ldlzN6m4p5LmGiwRDjeJr6FLK6vuiUwoH7P8=
    -github.com/containernetworking/plugins v1.0.1/go.mod h1:QHCfGpaTwYTbbH+nZXKVTxNBDZcxSOplJT5ico8/FLE=
    -github.com/containers/ocicrypt v1.0.1/go.mod h1:MeJDzk1RJHv89LjsH0Sp5KTY3ZYkjXO/C+bKAeWFIrc=
    -github.com/containers/ocicrypt v1.1.0/go.mod h1:b8AOe0YR67uU8OqfVNcznfFpAzu3rdgUV4GP9qXPfu4=
    -github.com/containers/ocicrypt v1.1.1/go.mod h1:Dm55fwWm1YZAjYRaJ94z2mfZikIyIN4B0oB3dj3jFxY=
    -github.com/containers/ocicrypt v1.1.2/go.mod h1:Dm55fwWm1YZAjYRaJ94z2mfZikIyIN4B0oB3dj3jFxY=
    -github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk=
    -github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE=
    -github.com/coreos/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE=
    -github.com/coreos/go-iptables v0.4.5/go.mod h1:/mVI274lEDI2ns62jHCDnCyBF9Iwsmekav8Dbxlm1MU=
    -github.com/coreos/go-iptables v0.5.0/go.mod h1:/mVI274lEDI2ns62jHCDnCyBF9Iwsmekav8Dbxlm1MU=
    -github.com/coreos/go-iptables v0.6.0/go.mod h1:Qe8Bv2Xik5FyTXwgIbLAnv2sWSBmvWdFETJConOQ//Q=
    -github.com/coreos/go-oidc v2.1.0+incompatible/go.mod h1:CgnwVTmzoESiwO9qyAFEMiHoZ1nMCKZlZ9V6mm3/LKc=
     github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk=
    -github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk=
    -github.com/coreos/go-systemd v0.0.0-20161114122254-48702e0da86b/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4=
     github.com/coreos/go-systemd v0.0.0-20180511133405-39ca1b05acc7/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4=
    -github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4=
    -github.com/coreos/go-systemd/v22 v22.0.0/go.mod h1:xO0FLkIi5MaZafQlIrOotqXZ90ih+1atmu1JpKERPPk=
    -github.com/coreos/go-systemd/v22 v22.1.0/go.mod h1:xO0FLkIi5MaZafQlIrOotqXZ90ih+1atmu1JpKERPPk=
    -github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc=
     github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA=
    -github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA=
     github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU=
    -github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU=
     github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY=
     github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
     github.com/creack/pty v1.1.11/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
    -github.com/cyphar/filepath-securejoin v0.2.2/go.mod h1:FpkQEhXnPnOthhzymB7CGsFk2G9VLXONKD9G7QGMM+4=
    -github.com/cyphar/filepath-securejoin v0.2.3/go.mod h1:aPGpWjXOXUn2NCNjFvBE6aRxGGx79pTxQpKOJNYHHl4=
    -github.com/d2g/dhcp4 v0.0.0-20170904100407-a1d1b6c41b1c/go.mod h1:Ct2BUK8SB0YC1SMSibvLzxjeJLnrYEVLULFNiHY9YfQ=
    -github.com/d2g/dhcp4client v1.0.0/go.mod h1:j0hNfjhrt2SxUOw55nL0ATM/z4Yt3t2Kd1mW34z5W5s=
    -github.com/d2g/dhcp4server v0.0.0-20181031114812-7d4a0a7f59a5/go.mod h1:Eo87+Kg/IX2hfWJfwxMzLyuSZyxSoAug2nGa1G2QAi8=
    -github.com/d2g/hardwareaddr v0.0.0-20190221164911-e7d9fbe030e4/go.mod h1:bMl4RjIciD2oAxI7DmWRx6gbeqrkoLqv3MV0vzNad+I=
     github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
     github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
     github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
     github.com/dennwc/varint v1.0.0 h1:kGNFFSSw8ToIy3obO/kKr8U9GZYUAxQEVuix4zfDWzE=
     github.com/dennwc/varint v1.0.0/go.mod h1:hnItb35rvZvJrbTALZtY/iQfDs48JKRG1RPpgziApxA=
    -github.com/denverdino/aliyungo v0.0.0-20190125010748-a747050bb1ba/go.mod h1:dV8lFg6daOBZbT6/BDGIz6Y3WFGn8juu6G+CQ6LHtl0=
    -github.com/dgrijalva/jwt-go v0.0.0-20170104182250-a601269ab70c/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ=
     github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ=
    -github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no=
     github.com/dgryski/go-sip13 v0.0.0-20200911182023-62edffca9245 h1:9cOfvEwjQxdwKuNDTQSaMKNRvwKwgZG+U4HrjeRKHso=
     github.com/dgryski/go-sip13 v0.0.0-20200911182023-62edffca9245/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no=
    -github.com/digitalocean/godo v1.78.0 h1:hKMfHXChSMjZFMSev+m5R4/2rxZ3HPdhlpeA2pJI72M=
    -github.com/digitalocean/godo v1.78.0/go.mod h1:GBmu8MkjZmNARE7IXRPmkbbnocNN8+uBm0xbEVw2LCs=
    -github.com/dnaeon/go-vcr v1.0.1/go.mod h1:aBB1+wY4s93YsC3HHjMBMrwTj2R9FHDzUr9KyGc8n1E=
    +github.com/digitalocean/godo v1.80.0 h1:ZULJ/fWDM97YtO7Fa+K6hzJLd7+smCu4N+0n+B/xtj4=
    +github.com/digitalocean/godo v1.80.0/go.mod h1:BPCqvwbjbGqxuUnIKB4EvS/AX7IDnNmt5fwvIkWo+ew=
     github.com/dnaeon/go-vcr v1.2.0 h1:zHCHvJYTMh1N7xnV7zf1m1GPBF9Ad0Jk/whtQ1663qI=
     github.com/dnaeon/go-vcr v1.2.0/go.mod h1:R4UdLID7HZT3taECzJs4YgbbH6PIGXB6W/sc5OLb6RQ=
    -github.com/docker/cli v0.0.0-20191017083524-a8ff7f821017/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8=
    -github.com/docker/distribution v0.0.0-20190905152932-14b96e55d84c/go.mod h1:0+TTO4EOBfRPhZXAeF1Vu+W3hHZ8eLp8PgKVZlcvtFY=
    -github.com/docker/distribution v2.7.1-0.20190205005809-0d3efadf0154+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w=
     github.com/docker/distribution v2.7.1+incompatible h1:a5mlkVzth6W5A4fOsS3D2EO5BUmsJpcB+cRlLU7cSug=
     github.com/docker/distribution v2.7.1+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w=
    -github.com/docker/docker v1.4.2-0.20190924003213-a8608b5b67c7/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk=
    -github.com/docker/docker v20.10.14+incompatible h1:+T9/PRYWNDo5SZl5qS1r9Mo/0Q8AwxKKPtu9S1yxM0w=
    -github.com/docker/docker v20.10.14+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk=
    -github.com/docker/docker-credential-helpers v0.6.3/go.mod h1:WRaJzqw3CTB9bk10avuGsjVBZsD05qeibJ1/TYlvc0Y=
    +github.com/docker/docker v20.10.16+incompatible h1:2Db6ZR/+FUR3hqPMwnogOPHFn405crbpxvWzKovETOQ=
    +github.com/docker/docker v20.10.16+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk=
     github.com/docker/go-connections v0.4.0 h1:El9xVISelRB7BuFusrZozjnkIM5YnzCViNKohAFqRJQ=
     github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec=
    -github.com/docker/go-events v0.0.0-20170721190031-9461782956ad/go.mod h1:Uw6UezgYA44ePAFQYUehOuCzmy5zmg/+nl2ZfMWGkpA=
    -github.com/docker/go-events v0.0.0-20190806004212-e31b211e4f1c/go.mod h1:Uw6UezgYA44ePAFQYUehOuCzmy5zmg/+nl2ZfMWGkpA=
    -github.com/docker/go-metrics v0.0.0-20180209012529-399ea8c73916/go.mod h1:/u0gXw0Gay3ceNrsHubL3BtdOL2fHf93USgMTe0W5dI=
    -github.com/docker/go-metrics v0.0.1/go.mod h1:cG1hvH2utMXtqgqqYE9plW6lDxS3/5ayHzueweSI3Vw=
     github.com/docker/go-units v0.4.0 h1:3uh0PgVws3nIA0Q+MwDC8yjEPf9zjRfZZWXZYDct3Tw=
     github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk=
    -github.com/docker/libtrust v0.0.0-20150114040149-fa567046d9b1/go.mod h1:cyGadeNEkKy96OOhEzfZl+yxihPEzKnqJwvfuSUqbZE=
    -github.com/docker/spdystream v0.0.0-20160310174837-449fdfce4d96/go.mod h1:Qh8CwZgvJUkLughtfhJv5dyTYa91l1fOUCrgjqmcifM=
     github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE=
     github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk=
    -github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk=
     github.com/eapache/go-resiliency v1.1.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5mFgVsvEsIPBvNs=
     github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21/go.mod h1:+020luEh2TKB4/GOp8oxxtq0Daoen/Cii55CzbTV6DU=
     github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I=
    @@ -398,6 +199,7 @@ github.com/edsrzf/mmap-go v1.1.0 h1:6EUwBLQ/Mcr1EYLE4Tn1VdW1A4ckqCQWZBw8Hr0kjpQ=
     github.com/edsrzf/mmap-go v1.1.0/go.mod h1:19H/e8pUPLicwkyNgOykDXkJ9F0MHE+Z52B8EIth78Q=
     github.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc=
     github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs=
    +github.com/emicklei/go-restful v2.9.5+incompatible h1:spTtZBk5DYEvbxMVutUuTyh1Ao2r4iyvLdACqsl/Ljk=
     github.com/emicklei/go-restful v2.9.5+incompatible/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs=
     github.com/envoyproxy/go-control-plane v0.6.9/go.mod h1:SBwIajubJHhxtWwsL9s8ss4safvEdbitLhGGK48rN6g=
     github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
    @@ -413,8 +215,6 @@ github.com/envoyproxy/go-control-plane v0.10.2-0.20220325020618-49ff273808a1/go.
     github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
     github.com/envoyproxy/protoc-gen-validate v0.6.7 h1:qcZcULcd/abmQg6dwigimCNEyi4gg31M/xaciQlDml8=
     github.com/envoyproxy/protoc-gen-validate v0.6.7/go.mod h1:dyJXwwfPK2VSqiB9Klm1J6romD608Ba7Hij42vrOBCo=
    -github.com/evanphx/json-patch v4.9.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk=
    -github.com/evanphx/json-patch v4.11.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk=
     github.com/evanphx/json-patch v4.12.0+incompatible h1:4onqiflcdA9EOZ4RxV643DvftH5pOlLGNtQ5lPWQu84=
     github.com/evanphx/json-patch v4.12.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk=
     github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=
    @@ -422,7 +222,6 @@ github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL
     github.com/fatih/color v1.10.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM=
     github.com/fatih/color v1.13.0 h1:8LOYc1KYPPmyKMuN8QV2DNRWNbLo6LZ0iLs8+mlH53w=
     github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk=
    -github.com/felixge/httpsnoop v1.0.1/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U=
     github.com/felixge/httpsnoop v1.0.2/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U=
     github.com/felixge/httpsnoop v1.0.3 h1:s/nj+GCswXYzN5v2DpNMuMQYe+0DDwt5WVCU6CWBdXk=
     github.com/felixge/httpsnoop v1.0.3/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U=
    @@ -430,42 +229,32 @@ github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoD
     github.com/form3tech-oss/jwt-go v3.2.3+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k=
     github.com/franela/goblin v0.0.0-20200105215937-c9ffbefa60db/go.mod h1:7dvUGVsVBjqR7JHJk0brhHOZYGmfBYOrK0ZhYMEtBr4=
     github.com/franela/goreq v0.0.0-20171204163338-bcd34c9993f8/go.mod h1:ZhphrRTfi2rbfLwlschooIH4+wKKDR4Pdxhh+TRoA20=
    -github.com/frankban/quicktest v1.11.3/go.mod h1:wRf/ReqHper53s+kmmSZizM8NamnL3IM0I9ntUbOk+k=
     github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
     github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ=
     github.com/fsnotify/fsnotify v1.5.4 h1:jRbGcIw6P2Meqdwuo0H1p6JVLbL5DHKAKlYndzMwVZI=
     github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU=
    -github.com/fullsailor/pkcs7 v0.0.0-20190404230743-d7302db945fa/go.mod h1:KnogPXtdwXqoenmZCw6S+25EAm2MkxbG0deNDu4cbSA=
    -github.com/garyburd/redigo v0.0.0-20150301180006-535138d7bcd7/go.mod h1:NR3MbYisc3/PwhQ00EMzDiPmrwpPxAn5GI05/YaO1SY=
     github.com/getkin/kin-openapi v0.76.0/go.mod h1:660oXbgy5JFMKreazJaQTw7o+X00qeSyhcnluiMv+Xg=
    -github.com/getsentry/raven-go v0.2.0/go.mod h1:KungGk8q33+aIAZUIVWZDr2OfAEBsO49PX4NzFV5kcQ=
    -github.com/ghodss/yaml v0.0.0-20150909031657-73d445a93680/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
     github.com/ghodss/yaml v1.0.0 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk=
     github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
     github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=
     github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
     github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
    -github.com/go-ini/ini v1.25.4/go.mod h1:ByCAeIL28uOIIG0E3PJtZPDL8WnHpFKFOtgjp+3Ies8=
     github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
     github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
     github.com/go-kit/kit v0.10.0 h1:dXFJfIHVvUcpSgDOV+Ne6t7jXri8Tfv2uOLHUZ2XNuo=
     github.com/go-kit/kit v0.10.0/go.mod h1:xUsJbQ/Fp4kEt7AFgCuvyX4a71u8h9jB8tj/ORgOZ7o=
     github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY=
    -github.com/go-kit/log v0.2.0 h1:7i2K3eKTos3Vc0enKCfnVcgHh2olr/MyfboYq7cAcFw=
     github.com/go-kit/log v0.2.0/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0=
    +github.com/go-kit/log v0.2.1 h1:MRVx0/zhvdseW+Gza6N9rVzU/IVzaeE1SFI4raAhmBU=
    +github.com/go-kit/log v0.2.1/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0=
     github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=
     github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=
     github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A=
     github.com/go-logfmt/logfmt v0.5.1 h1:otpy5pqBCBZ1ng9RQ0dPu4PN7ba75Y/aA+UpowDyNVA=
     github.com/go-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs=
    -github.com/go-logr/logr v0.2.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU=
    -github.com/go-logr/logr v0.4.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU=
    -github.com/go-logr/logr v1.2.0/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
    -github.com/go-logr/logr v1.2.1/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
     github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
     github.com/go-logr/logr v1.2.3 h1:2DntVwHkVopvECVRSlL5PSo9eG+cAkDCuckLubN+rq0=
     github.com/go-logr/logr v1.2.3/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
    -github.com/go-logr/stdr v1.2.0/go.mod h1:YkVgnZu1ZjjL7xTxrfm/LLZBfkhTqSR1ydtm6jTKKwI=
     github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=
     github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=
     github.com/go-openapi/analysis v0.21.2 h1:hXFrOYFHUAMQdu6zwAiKKJHJQ8kqZs1ux/ru1P1wLJU=
    @@ -474,13 +263,9 @@ github.com/go-openapi/errors v0.19.8/go.mod h1:cM//ZKUKyO06HSwqAelJ5NsEMMcpa6VpX
     github.com/go-openapi/errors v0.19.9/go.mod h1:cM//ZKUKyO06HSwqAelJ5NsEMMcpa6VpXe8DOa1Mi1M=
     github.com/go-openapi/errors v0.20.2 h1:dxy7PGTqEh94zj2E3h1cUmQQWiM1+aeCROfAr02EmK8=
     github.com/go-openapi/errors v0.20.2/go.mod h1:cM//ZKUKyO06HSwqAelJ5NsEMMcpa6VpXe8DOa1Mi1M=
    -github.com/go-openapi/jsonpointer v0.0.0-20160704185906-46af16f9f7b1/go.mod h1:+35s3my2LFTysnkMfxsJBAMHj/DoqoB9knIWoYG/Vk0=
    -github.com/go-openapi/jsonpointer v0.19.2/go.mod h1:3akKfEdA7DF1sugOqz1dVQHBcuDBPKZGEoHC/NkiQRg=
     github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg=
     github.com/go-openapi/jsonpointer v0.19.5 h1:gZr+CIYByUqjcgeLXnQu2gHYQC9o73G2XUeOFYEICuY=
     github.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg=
    -github.com/go-openapi/jsonreference v0.0.0-20160704190145-13c6e3589ad9/go.mod h1:W3Z9FmVs9qj+KR4zFKmDPGiLdk1D9Rlm7cyMvf57TTg=
    -github.com/go-openapi/jsonreference v0.19.2/go.mod h1:jMjeRr2HHw6nAVajTXJ4eiUwohSTlpa0o73RUL1owJc=
     github.com/go-openapi/jsonreference v0.19.3/go.mod h1:rjx6GuL8TTa9VaixXglHmQmIL98+wF9xc8zWvFonSJ8=
     github.com/go-openapi/jsonreference v0.19.5/go.mod h1:RdybgQwPxbL4UEjuAruzK1x3nE69AqPYEJeo/TWfEeg=
     github.com/go-openapi/jsonreference v0.19.6 h1:UBIxjkht+AWIgYzCDSv2GN+E/togfwXUJFRTWhl2Jjs=
    @@ -488,16 +273,12 @@ github.com/go-openapi/jsonreference v0.19.6/go.mod h1:diGHMEHg2IqXZGKxqyvWdfWU/a
     github.com/go-openapi/loads v0.21.1 h1:Wb3nVZpdEzDTcly8S4HMkey6fjARRzb7iEaySimlDW0=
     github.com/go-openapi/loads v0.21.1/go.mod h1:/DtAMXXneXFjbQMGEtbamCZb+4x7eGwkvZCvBmwUG+g=
     github.com/go-openapi/runtime v0.23.1/go.mod h1:AKurw9fNre+h3ELZfk6ILsfvPN+bvvlaU/M9q/r9hpk=
    -github.com/go-openapi/spec v0.0.0-20160808142527-6aced65f8501/go.mod h1:J8+jY1nAiCcj+friV/PDoE1/3eeccG9LYBs0tYvLOWc=
    -github.com/go-openapi/spec v0.19.3/go.mod h1:FpwSN1ksY1eteniUU7X0N/BgJ7a4WvBFVA8Lj9mJglo=
     github.com/go-openapi/spec v0.20.4 h1:O8hJrt0UMnhHcluhIdUgCLRWyM2x7QkBXRvOs7m+O1M=
     github.com/go-openapi/spec v0.20.4/go.mod h1:faYFR1CvsJZ0mNsmsphTMSoRrNV3TEDoAM7FOEWeq8I=
     github.com/go-openapi/strfmt v0.21.0/go.mod h1:ZRQ409bWMj+SOgXofQAGTIo2Ebu72Gs+WaRADcS5iNg=
     github.com/go-openapi/strfmt v0.21.1/go.mod h1:I/XVKeLc5+MM5oPNN7P6urMOpuLXEcNrCX/rPGuWb0k=
     github.com/go-openapi/strfmt v0.21.2 h1:5NDNgadiX1Vhemth/TH4gCGopWSTdDjxl60H3B7f+os=
     github.com/go-openapi/strfmt v0.21.2/go.mod h1:I/XVKeLc5+MM5oPNN7P6urMOpuLXEcNrCX/rPGuWb0k=
    -github.com/go-openapi/swag v0.0.0-20160704191624-1d0bd113de87/go.mod h1:DXUve3Dpr1UfpPtxFw+EFuQ41HhCWZfha5jSVRG7C7I=
    -github.com/go-openapi/swag v0.19.2/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk=
     github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk=
     github.com/go-openapi/swag v0.19.14/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ=
     github.com/go-openapi/swag v0.19.15/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ=
    @@ -543,22 +324,11 @@ github.com/gobuffalo/packr/v2 v2.0.9/go.mod h1:emmyGweYTm6Kdper+iywB6YK5YzuKchGt
     github.com/gobuffalo/packr/v2 v2.2.0/go.mod h1:CaAwI0GPIAv+5wKLtv8Afwl+Cm78K/I/VCm/3ptBN+0=
     github.com/gobuffalo/syncx v0.0.0-20190224160051-33c29581e754/go.mod h1:HhnNqWY95UYwwW3uSASeV7vtgYkT2t16hJgV3AEPUpw=
     github.com/goccy/go-yaml v1.9.5/go.mod h1:U/jl18uSupI5rdI2jmuCswEA2htH9eXfferR3KfscvA=
    -github.com/godbus/dbus v0.0.0-20151105175453-c7fdd8b5cd55/go.mod h1:/YcGZj5zSblfDWMMoOzV4fas9FZnQYTkDnsGvmh2Grw=
    -github.com/godbus/dbus v0.0.0-20180201030542-885f9cc04c9c/go.mod h1:/YcGZj5zSblfDWMMoOzV4fas9FZnQYTkDnsGvmh2Grw=
    -github.com/godbus/dbus v0.0.0-20190422162347-ade71ed3457e/go.mod h1:bBOAhwG1umN6/6ZUMtDFBMQR8jRg9O75tm9K00oMsK4=
    -github.com/godbus/dbus/v5 v5.0.3/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
    -github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
    -github.com/godbus/dbus/v5 v5.0.6/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
     github.com/gofrs/uuid v4.2.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM=
     github.com/gogo/googleapis v1.1.0/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s=
    -github.com/gogo/googleapis v1.2.0/go.mod h1:Njal3psf3qN6dwBtQfUmBZh2ybovJ0tlu3o/AC7HYjU=
    -github.com/gogo/googleapis v1.4.0/go.mod h1:5YRNX2z1oM5gXdAkurHa942MDgEJyk02w4OecKY87+c=
     github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
     github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
     github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4=
    -github.com/gogo/protobuf v1.2.2-0.20190723190241-65acae22fc9d/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o=
    -github.com/gogo/protobuf v1.3.0/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o=
    -github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o=
     github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q=
     github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=
     github.com/golang-jwt/jwt/v4 v4.0.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg=
    @@ -568,7 +338,6 @@ github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfU
     github.com/golang/glog v1.0.0 h1:nfP3RFugxnNRyKgeWd4oI1nYvXpxrx8ck8ZrcizshdQ=
     github.com/golang/glog v1.0.0/go.mod h1:EWib/APOK0SL3dFbYqvxE3UYd8E6s1ouQ7iEp/0LWV4=
     github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
    -github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
     github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
     github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
     github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
    @@ -610,6 +379,8 @@ github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Z
     github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
     github.com/google/btree v1.0.1 h1:gK4Kx5IaGY9CD5sPJ36FHiBJ6ZXl0kilRiiCj+jdYp4=
     github.com/google/btree v1.0.1/go.mod h1:xXMiIv4Fb/0kKde4SpL7qlzvu5cMJDRkFDxJfI9uaxA=
    +github.com/google/gnostic v0.5.7-v3refs h1:FhTMOKj2VhjpouxvWJAV1TL304uMlb9zcDqkl6cEI54=
    +github.com/google/gnostic v0.5.7-v3refs/go.mod h1:73MKFl6jIHelAJNaBGFzt3SPtZULs9dYrGFt8OiIsHQ=
     github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
     github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
     github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
    @@ -625,9 +396,8 @@ github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/
     github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE=
     github.com/google/go-cmp v0.5.8 h1:e6P7q2lk1O+qJJb4BtCQXlK8vWEO8V1ZeuEdJNOqZyg=
     github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
    -github.com/google/go-containerregistry v0.5.1/go.mod h1:Ct15B4yir3PLOP5jsy0GNeYVaIZs/MK/Jz5any1wFW0=
    -github.com/google/go-querystring v1.0.0 h1:Xkwi/a1rcvNg1PPYe5vI8GbeBY/jrVuDX5ASuANWTrk=
    -github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck=
    +github.com/google/go-querystring v1.1.0 h1:AnCroh3fv4ZBgVIf1Iwtovgjaw/GiKJo8M8yD/fhyJ8=
    +github.com/google/go-querystring v1.1.0/go.mod h1:Kcdr2DB4koayq7X8pmAG4sNG59So17icRSOU623lUBU=
     github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
     github.com/google/gofuzz v1.1.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
     github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0=
    @@ -650,8 +420,8 @@ github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLe
     github.com/google/pprof v0.0.0-20210601050228-01bbb1931b22/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
     github.com/google/pprof v0.0.0-20210609004039-a478d1d731e9/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
     github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
    -github.com/google/pprof v0.0.0-20220318212150-b2ab0324ddda h1:KdHPvlgeNEDs8rae032MqFG8LVwcSEivcCjNdVOXRmg=
    -github.com/google/pprof v0.0.0-20220318212150-b2ab0324ddda/go.mod h1:KgnwoLYCZ8IQu3XUZ8Nc/bM9CCZFOyjUNOSygVozoDg=
    +github.com/google/pprof v0.0.0-20220520215854-d04f2422c8a1 h1:K4bn56FHdjFCfjSo3wWaD6rJL8r9yvmmncJNMhdkKrw=
    +github.com/google/pprof v0.0.0-20220520215854-d04f2422c8a1/go.mod h1:gSuNB+gJaOiQKLEZ+q+PK9Mq3SOzhRcw2GsGS/FhYDk=
     github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=
     github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
     github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
    @@ -665,49 +435,34 @@ github.com/googleapis/gax-go/v2 v2.1.1/go.mod h1:hddJymUZASv3XPyGkUpKj8pPO47Rmb0
     github.com/googleapis/gax-go/v2 v2.2.0/go.mod h1:as02EH8zWkzwUoLbBaFeQ+arQaj/OthfcblKl4IGNaM=
     github.com/googleapis/gax-go/v2 v2.3.0 h1:nRJtk3y8Fm770D42QV6T90ZnvFZyk7agSo3Q+Z9p3WI=
     github.com/googleapis/gax-go/v2 v2.3.0/go.mod h1:b8LNqSzNabLiUpXKkY7HAR5jr6bIT99EXz9pXxye9YM=
    -github.com/googleapis/gnostic v0.4.1/go.mod h1:LRhVm6pbyptWbWbuZ38d1eyptfvIytN3ir6b65WBswg=
    -github.com/googleapis/gnostic v0.5.1/go.mod h1:6U4PtQXGIEt/Z3h5MAT7FNofLnw9vXk2cUuW7uA/OeU=
    -github.com/googleapis/gnostic v0.5.5 h1:9fHAtK0uDfpveeqqo1hkEZJcFvYXAiCN3UutL8F9xHw=
    -github.com/googleapis/gnostic v0.5.5/go.mod h1:7+EbHbldMins07ALC74bsA81Ovc97DwqyJO1AENw9kA=
     github.com/gophercloud/gophercloud v0.24.0 h1:jDsIMGJ1KZpAjYfQgGI2coNQj5Q83oPzuiGJRFWgMzw=
     github.com/gophercloud/gophercloud v0.24.0/go.mod h1:Q8fZtyi5zZxPS/j9aj3sSxtvj41AdQMDwyo1myduD5c=
     github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
     github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg=
    -github.com/gorilla/handlers v0.0.0-20150720190736-60c7bfde3e33/go.mod h1:Qkdc/uu4tH4g6mTK6auzZ766c4CA0Ng8+o/OAirnOIQ=
     github.com/gorilla/mux v1.6.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs=
    -github.com/gorilla/mux v1.7.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs=
     github.com/gorilla/mux v1.7.3/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs=
    -github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI=
     github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So=
     github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ=
    -github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ=
     github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
     github.com/grafana/regexp v0.0.0-20220304095617-2e8d9baf4ac2 h1:uirlL/j72L93RhV4+mkWhjv0cov2I0MIgPOG9rMDr1k=
     github.com/grafana/regexp v0.0.0-20220304095617-2e8d9baf4ac2/go.mod h1:M5qHK+eWfAv8VR/265dIuEpL3fNfeC21tXXp9itM24A=
     github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA=
    -github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs=
     github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de4/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs=
    -github.com/grpc-ecosystem/go-grpc-middleware v1.3.0/go.mod h1:z0ButlSOZa5vEBq9m2m2hlwIgKw+rp3sdCBRoJY+30Y=
     github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk=
    -github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY=
     github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY=
     github.com/grpc-ecosystem/grpc-gateway v1.16.0 h1:gmcG1KaJ57LophUzW0Hy8NmPhnMZb4M0+kPpLofRdBo=
     github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw=
     github.com/grpc-ecosystem/grpc-gateway/v2 v2.7.0/go.mod h1:hgWBS7lorOAVIJEQMi4ZsPv9hVvWI6+ch50m39Pf2Ks=
     github.com/grpc-ecosystem/grpc-gateway/v2 v2.10.2 h1:ERKrevVTnCw3Wu4I3mtR15QU3gtWy86cBo6De0jEohg=
     github.com/grpc-ecosystem/grpc-gateway/v2 v2.10.2/go.mod h1:chrfS3YoLAlKTRE5cFWvCbt8uGAjshktT4PveTUpsFQ=
    -github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q=
     github.com/hashicorp/consul/api v1.3.0/go.mod h1:MmDNSzIMUjNpY/mQ398R4bk2FnqQLoPndWW5VkKPlCE=
     github.com/hashicorp/consul/api v1.12.0 h1:k3y1FYv6nuKyNTqj6w9gXOx5r5CfLj/k/euUeBXj1OY=
     github.com/hashicorp/consul/api v1.12.0/go.mod h1:6pVBMo0ebnYdt2S3H87XhekM/HHrUoTD2XXb/VrZVy0=
    -github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8=
     github.com/hashicorp/consul/sdk v0.3.0/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8=
     github.com/hashicorp/consul/sdk v0.8.0 h1:OJtKBtEjboEZvG6AOUdh4Z1Zbyu0WcxQ0qatRrZHTVU=
     github.com/hashicorp/consul/sdk v0.8.0/go.mod h1:GBvyrGALthsZObzUGsfgHZQDXjg4lOjagTIwIR1vPms=
    -github.com/hashicorp/errwrap v0.0.0-20141028054710-7554cd9344ce/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=
    +github.com/hashicorp/errwrap v1.0.0 h1:hLrqtEDnRye3+sgx6z4qVLNuviH3MR5aQ0ykNJa/UYA=
     github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=
    -github.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I=
    -github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=
     github.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=
     github.com/hashicorp/go-cleanhttp v0.5.1 h1:dH3aiDG9Jvb5r5+bYHsikaOUIpcM0xvgMXVoDkXMzJM=
     github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=
    @@ -719,7 +474,6 @@ github.com/hashicorp/go-immutable-radix v1.2.0 h1:l6UW37iCXwZkZoAbEYnptSHVE/cQ5b
     github.com/hashicorp/go-immutable-radix v1.2.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=
     github.com/hashicorp/go-msgpack v0.5.3 h1:zKjpN5BK/P5lMYrLmBHdBULWbJ0XpYR+7NGzqkZzoD4=
     github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM=
    -github.com/hashicorp/go-multierror v0.0.0-20161216184304-ed905158d874/go.mod h1:JMRHfdO9jKNzS/+BTlxCjKNQHg/jZAft8U7LloJvN7I=
     github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk=
     github.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA=
     github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo=
    @@ -741,7 +495,6 @@ github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ
     github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
     github.com/hashicorp/golang-lru v0.5.4 h1:YDjusn29QI/Das2iO9M0BHnIbxPeyuCHsjMW+lJfyTc=
     github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=
    -github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ=
     github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64=
     github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ=
     github.com/hashicorp/mdns v1.0.4/go.mod h1:mtBihi+LeNXGtG8L9dX59gAEa12BDtBQSp4v/YAJqrc=
    @@ -752,39 +505,29 @@ github.com/hashicorp/memberlist v0.3.1/go.mod h1:MS2lj3INKhZjWNqd3N0m3J+Jxf3DAOn
     github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc=
     github.com/hashicorp/serf v0.9.6 h1:uuEX1kLR6aoda1TBttmJQKDLZE1Ob7KN0NPdE7EtCDc=
     github.com/hashicorp/serf v0.9.6/go.mod h1:TXZNMjZQijwlDvp+r0b63xZ45H7JmCmgg4gpTwn9UV4=
    -github.com/hetznercloud/hcloud-go v1.33.1 h1:W1HdO2bRLTKU4WsyqAasDSpt54fYO4WNckWYfH5AuCQ=
    -github.com/hetznercloud/hcloud-go v1.33.1/go.mod h1:XX/TQub3ge0yWR2yHWmnDVIrB+MQbda1pHxkUmDlUME=
    +github.com/hetznercloud/hcloud-go v1.33.2 h1:ptWKVYLW7YtjXzsqTFKFxwpVo3iM9UMkVPBYQE4teLU=
    +github.com/hetznercloud/hcloud-go v1.33.2/go.mod h1:XX/TQub3ge0yWR2yHWmnDVIrB+MQbda1pHxkUmDlUME=
     github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
     github.com/hudl/fargo v1.3.0/go.mod h1:y3CKSmjA+wD2gak7sUSXTAoopbhU08POFhmITJgmKTg=
     github.com/iancoleman/strcase v0.2.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho=
     github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=
     github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=
    -github.com/ianlancetaylor/demangle v0.0.0-20210905161508-09a460cdf81d/go.mod h1:aYm2/VgdVmcIU8iMfdMvDMsRAQjcfZSKFby6HOFvi/w=
    +github.com/ianlancetaylor/demangle v0.0.0-20220319035150-800ac71e25c2/go.mod h1:aYm2/VgdVmcIU8iMfdMvDMsRAQjcfZSKFby6HOFvi/w=
     github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA=
    -github.com/imdario/mergo v0.3.8/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA=
    -github.com/imdario/mergo v0.3.10/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA=
    -github.com/imdario/mergo v0.3.11/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA=
     github.com/imdario/mergo v0.3.12 h1:b6R2BslTbIEToALKP7LxUvijTsNI9TAe80pLWN2g/HU=
     github.com/imdario/mergo v0.3.12/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA=
     github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8=
     github.com/influxdata/influxdb1-client v0.0.0-20191209144304-8bf82d3c094d/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo=
    -github.com/intel/goresctrl v0.2.0/go.mod h1:+CZdzouYFn5EsxgqAQTEzMfwKwuc0fVdMrT9FCCAVRQ=
     github.com/ionos-cloud/sdk-go/v6 v6.0.5851 h1:Xjdta3uR5SDLXXl0oahgVIJ+AQNFCyOCuAwxPAXFUCM=
     github.com/ionos-cloud/sdk-go/v6 v6.0.5851/go.mod h1:UE3V/2DjnqD5doOqtjYqzJRMpI1RiwrvuuSEPX1pdnk=
    -github.com/j-keck/arping v0.0.0-20160618110441-2cf9dc699c56/go.mod h1:ymszkNOg6tORTn+6F6j+Jc8TOr5osrynvN6ivFWZ2GA=
    -github.com/j-keck/arping v1.0.2/go.mod h1:aJbELhR92bSk7tp79AWM/ftfc90EfEi2bQJrbBFOsPw=
     github.com/jessevdk/go-flags v1.5.0/go.mod h1:Fw0T6WPc1dYxT4mKEZRfG5kJhaTDP9pj1c2EWnYs/m4=
    -github.com/jmespath/go-jmespath v0.0.0-20160202185014-0b12d6b521d8/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k=
    -github.com/jmespath/go-jmespath v0.0.0-20160803190731-bd40a432e4c7/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k=
     github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k=
     github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg=
     github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo=
     github.com/jmespath/go-jmespath/internal/testify v1.5.1 h1:shLQSRRSCCPj3f2gpwzGwWFoC7ycTf1rcQZHOlsJ6N8=
     github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U=
    -github.com/joefitzgerald/rainbow-reporter v0.1.0/go.mod h1:481CNgqmVHQZzdIbN52CupLJyoVwB10FQ/IQlF1pdL8=
     github.com/joho/godotenv v1.3.0/go.mod h1:7hK45KPybAkOC6peb+G5yklZfMxEjkZhHbwpqxOKXbg=
     github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo=
    -github.com/jonboulle/clockwork v0.2.2/go.mod h1:Pkfl5aHPm1nk2H9h0bjmnJD/BcgbGXUBGnn1kMkgxc8=
     github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY=
     github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y=
     github.com/jpillora/backoff v1.0.0 h1:uvFg412JmmHBHw7iwprIxkPMI+sGQ4kzOWsMeHnm2EA=
    @@ -806,11 +549,8 @@ github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8
     github.com/karrick/godirwalk v1.8.0/go.mod h1:H5KPZjojv4lE+QYImBI8xVtrBRgYrIVsaRPx4tDPEn4=
     github.com/karrick/godirwalk v1.10.3/go.mod h1:RoGL9dQei4vP9ilrpETWE8CLOZ1kiN0LhBygSwrAsHA=
     github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q=
    -github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00=
     github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=
     github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
    -github.com/klauspost/compress v1.11.3/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs=
    -github.com/klauspost/compress v1.11.13/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs=
     github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk=
     github.com/kolo/xmlrpc v0.0.0-20201022064351-38db28db192b h1:iNjcivnc6lhbvJA3LD622NPrUponluJrBWPIwGG/3Bg=
     github.com/kolo/xmlrpc v0.0.0-20201022064351-38db28db192b/go.mod h1:pcaDhQK0/NJZEvtCO0qQPPropqV0sJOJ6YW7X+9kRwM=
    @@ -824,7 +564,6 @@ github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfn
     github.com/kr/pretty v0.2.1 h1:Fmg33tUaq4/8ym9TJN1x7sLJnHVwhP33CNkpYV/7rwI=
     github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
     github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
    -github.com/kr/pty v1.1.5/go.mod h1:9r2w37qlBe7rQ6e1fg1S/9xpWHSnaqNdHD3WcMdbPDA=
     github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
     github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
     github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
    @@ -832,23 +571,17 @@ github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+
     github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII=
     github.com/lightstep/lightstep-tracer-common/golang/gogo v0.0.0-20190605223551-bc2310a04743/go.mod h1:qklhhLq1aX+mtWk9cPHPzaBjWImj5ULL6C7HFJtXQMM=
     github.com/lightstep/lightstep-tracer-go v0.18.1/go.mod h1:jlF1pusYV4pidLvZ+XD0UBX0ZE6WURAspgAczcDHrL4=
    -github.com/linode/linodego v1.4.1 h1:cgpY1jCZ47wfJvWH5V8in7Tphj8T0sR1URiH9e6G2bA=
    -github.com/linode/linodego v1.4.1/go.mod h1:PVsRxSlOiJyvG4/scTszpmZDTdgS+to3X6eS8pRrWI8=
    -github.com/linuxkit/virtsock v0.0.0-20201010232012-f8cee7dfc7a3/go.mod h1:3r6x7q95whyfWQpmGZTu3gk3v2YkMi05HEzl7Tf7YEo=
    +github.com/linode/linodego v1.5.0 h1:p1TgkDsz0ubaIPLNviZBTIjlsX3PdvqZQ4eO2r0L1Hk=
    +github.com/linode/linodego v1.5.0/go.mod h1:9lmhBsOupR6ke7D9Ioj1bq/ny9pfgFkCLiX7ubq0r08=
     github.com/lyft/protoc-gen-star v0.6.0/go.mod h1:TGAoBVkt8w7MPG72TrKIu85MIdXwDuzJYeZuUPFPNwA=
     github.com/lyft/protoc-gen-validate v0.0.13/go.mod h1:XbGvPuh87YZc5TdIa2/I4pLk0QoUACkjt2znoq26NVQ=
    -github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ=
    -github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ=
    -github.com/mailru/easyjson v0.0.0-20160728113105-d5b7844b561a/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
     github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
     github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
    -github.com/mailru/easyjson v0.7.0/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7ldAVICs=
     github.com/mailru/easyjson v0.7.6/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc=
     github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0=
     github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc=
     github.com/markbates/oncer v0.0.0-20181203154359-bf2de49a0be2/go.mod h1:Ld9puTsIW75CHf65OeIOkyKbteujpZVXDpWK6YGZbxE=
     github.com/markbates/safe v1.0.1/go.mod h1:nAqgmRi7cY2nqMc92/bSEeQA+R4OheNU2T1kNSCBdG0=
    -github.com/marstr/guid v1.1.0/go.mod h1:74gB1z2wpxxInTG6yaqA7KrtM0NZ+RbrcqDvYHefzho=
     github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=
     github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=
     github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=
    @@ -865,20 +598,14 @@ github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Ky
     github.com/mattn/go-isatty v0.0.14 h1:yVuAays6BHfxijgZPzw+3Zlu5yQgKGP2/hcQbHb7S9Y=
     github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94=
     github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU=
    -github.com/mattn/go-shellwords v1.0.3/go.mod h1:3xCvwCdWdlDJUrvuMn7Wuy9eWs4pE8vqg+NOMyg4B2o=
    -github.com/mattn/go-shellwords v1.0.6/go.mod h1:3xCvwCdWdlDJUrvuMn7Wuy9eWs4pE8vqg+NOMyg4B2o=
    -github.com/mattn/go-shellwords v1.0.12/go.mod h1:EZzvwXDESEeg03EKmM+RmDnNOPKG4lLtQsUlTZDWQ8Y=
     github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=
     github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 h1:I0XW9+e1XWDxdcEniV4rQAIOPUGDq67JSCiRCgGCZLI=
     github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4=
    -github.com/maxbrunsfeld/counterfeiter/v6 v6.2.2/go.mod h1:eD9eIE7cdwcMi9rYluz88Jz2VyhSmden33/aXg4oVIY=
     github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg=
     github.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso=
     github.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI=
    -github.com/miekg/dns v1.1.48 h1:Ucfr7IIVyMBz4lRE8qmGUuZ4Wt3/ZGu9hmcMT3Uu4tQ=
    -github.com/miekg/dns v1.1.48/go.mod h1:e3IlAVfNqAllflbibAZEWOXOQ+Ynzk/dDozDxY7XnME=
    -github.com/miekg/pkcs11 v1.0.3/go.mod h1:XsNlhZGX73bx86s2hdc/FuaLm2CPZJemRLMA+WTFxgs=
    -github.com/mistifyio/go-zfs v2.1.2-0.20190413222219-f784269be439+incompatible/go.mod h1:8AuVvqP/mXw1px98n46wfvcGfQ4ci2FwoAjKYxuo3Z4=
    +github.com/miekg/dns v1.1.49 h1:qe0mQU3Z/XpFeE+AEBo2rqaS1IPBJ3anmqZ4XiZJVG8=
    +github.com/miekg/dns v1.1.49/go.mod h1:e3IlAVfNqAllflbibAZEWOXOQ+Ynzk/dDozDxY7XnME=
     github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc=
     github.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI=
     github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=
    @@ -895,17 +622,7 @@ github.com/mitchellh/mapstructure v1.3.3/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RR
     github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=
     github.com/mitchellh/mapstructure v1.4.3 h1:OVowDSCllw/YjdLkam3/sm7wEtOy59d8ndGgCcyj8cs=
     github.com/mitchellh/mapstructure v1.4.3/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=
    -github.com/mitchellh/osext v0.0.0-20151018003038-5e2d6d41470f/go.mod h1:OkQIRizQZAeMln+1tSwduZz7+Af5oFlKirV/MSYes2A=
    -github.com/moby/locker v1.0.1/go.mod h1:S7SDdo5zpBK84bzzVlKr2V0hz+7x9hWbYC/kq7oQppc=
     github.com/moby/spdystream v0.2.0/go.mod h1:f7i0iNDQJ059oMTcWxx8MA/zKFIuD/lY+0GqbN2Wy8c=
    -github.com/moby/sys/mountinfo v0.4.0/go.mod h1:rEr8tzG/lsIZHBtN/JjGG+LMYx9eXgW2JI+6q0qou+A=
    -github.com/moby/sys/mountinfo v0.4.1/go.mod h1:rEr8tzG/lsIZHBtN/JjGG+LMYx9eXgW2JI+6q0qou+A=
    -github.com/moby/sys/mountinfo v0.5.0/go.mod h1:3bMD3Rg+zkqx8MRYPi7Pyb0Ie97QEBmdxbhnCLlSvSU=
    -github.com/moby/sys/signal v0.6.0/go.mod h1:GQ6ObYZfqacOwTtlXvcmh9A26dVRul/hbOZn88Kg8Tg=
    -github.com/moby/sys/symlink v0.1.0/go.mod h1:GGDODQmbFOjFsXvfLVn3+ZRxkch54RkSiGqsZeMYowQ=
    -github.com/moby/sys/symlink v0.2.0/go.mod h1:7uZVF2dqJjG/NsClqul95CqKOBRQyYSNnJ6BMgR/gFs=
    -github.com/moby/term v0.0.0-20200312100748-672ec06f55cd/go.mod h1:DdlQx2hp0Ss5/fLikoLlEeIYiATotOjgB//nb973jeo=
    -github.com/moby/term v0.0.0-20210610120745-9d4ed1856297/go.mod h1:vgPCkQMyxTZ7IDy8SXRufE172gr8+K/JE/7hHFxHW3A=
     github.com/moby/term v0.0.0-20210619224110-3f7ff695adc6 h1:dcztxKSvZ4Id8iPpHERQBbIJfabdt4wUm5qy3wOL2Zc=
     github.com/moby/term v0.0.0-20210619224110-3f7ff695adc6/go.mod h1:E2VnQOmVuvZB6UYnnDB0qG5Nq/1tD9acaOpo6xmt0Kw=
     github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
    @@ -919,8 +636,8 @@ github.com/modocache/gover v0.0.0-20171022184752-b58185e213c5/go.mod h1:caMODM3P
     github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc=
     github.com/morikuni/aec v1.0.0 h1:nP9CBfwrvYnBRgY6qfDQkygYDmYwOilePFkwzv4dU8A=
     github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc=
    -github.com/mrunalp/fileutils v0.5.0/go.mod h1:M1WthSahJixYnrXQl/DFQuteStB1weuxD2QJNHXfbSQ=
     github.com/munnerz/goautoneg v0.0.0-20120707110453-a547fc61f48d/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ=
    +github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA=
     github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ=
     github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
     github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f h1:KUppIJq7/+SVif2QVs3tOP0zanoHgBEVAwHxUSIzRqU=
    @@ -933,7 +650,6 @@ github.com/nats-io/nats.go v1.9.1/go.mod h1:ZjDU1L/7fJ09jvUSRVBR2e7+RnLiiIQyqyzE
     github.com/nats-io/nkeys v0.1.0/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w=
     github.com/nats-io/nkeys v0.1.3/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w=
     github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c=
    -github.com/ncw/swift v1.0.47/go.mod h1:23YIA4yWVnGwv2dQlN4bB7egfYX6YLn0Yo/S6zZO/ZM=
     github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno=
     github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A=
     github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE=
    @@ -945,61 +661,24 @@ github.com/oklog/run v1.1.0/go.mod h1:sVPdnTZT1zYwAJeCMu2Th4T21pA3FPOQRfWjQlk7DV
     github.com/oklog/ulid v1.3.1 h1:EGfNDEx6MqHz8B3uNV6QAib1UR2Lm97sHi3ocA6ESJ4=
     github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U=
     github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo=
    -github.com/onsi/ginkgo v0.0.0-20151202141238-7f8ab55aaf3b/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
     github.com/onsi/ginkgo v0.0.0-20170829012221-11459a886d9c/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
     github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
     github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
    -github.com/onsi/ginkgo v1.8.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
    -github.com/onsi/ginkgo v1.10.1/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
    -github.com/onsi/ginkgo v1.10.3/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
    -github.com/onsi/ginkgo v1.11.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
    -github.com/onsi/ginkgo v1.12.0/go.mod h1:oUhWkIvk5aDxtKvDDuw8gItl8pKl42LzjC9KZE0HfGg=
     github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk=
    -github.com/onsi/ginkgo v1.13.0/go.mod h1:+REjRxOmWfHCjfv9TTWB1jD1Frx4XydAD3zm1lskyM0=
     github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY=
     github.com/onsi/ginkgo v1.16.4 h1:29JGrr5oVBm5ulCWet69zQkzWipVXIol6ygQUe/EzNc=
     github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0=
    -github.com/onsi/gomega v0.0.0-20151007035656-2152b45fa28a/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA=
     github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA=
     github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=
    -github.com/onsi/gomega v1.5.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=
    -github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=
     github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY=
    -github.com/onsi/gomega v1.9.0/go.mod h1:Ho0h+IUsWyvy1OpqCwxlQ/21gkhVunqlU8fDGcoTdcA=
     github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo=
    -github.com/onsi/gomega v1.10.3/go.mod h1:V9xEwhxec5O8UDM77eCW8vLymOMltsqPVYWrpDsH8xc=
     github.com/onsi/gomega v1.15.0 h1:WjP/FQ/sk43MRmnEcT+MlDw2TFvkrXlprrPST/IudjU=
     github.com/onsi/gomega v1.15.0/go.mod h1:cIuvLEne0aoVhAgh/O6ac0Op8WWw9H6eYCriF+tEHG0=
     github.com/op/go-logging v0.0.0-20160315200505-970db520ece7/go.mod h1:HzydrMdWErDVzsI23lYNej1Htcns9BCg93Dk0bBINWk=
    -github.com/opencontainers/go-digest v0.0.0-20170106003457-a6d0ee40d420/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s=
    -github.com/opencontainers/go-digest v0.0.0-20180430190053-c9281466c8b2/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s=
    -github.com/opencontainers/go-digest v1.0.0-rc1/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s=
    -github.com/opencontainers/go-digest v1.0.0-rc1.0.20180430190053-c9281466c8b2/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s=
     github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U=
     github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM=
    -github.com/opencontainers/image-spec v1.0.0/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0=
    -github.com/opencontainers/image-spec v1.0.1/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0=
    -github.com/opencontainers/image-spec v1.0.2-0.20211117181255-693428a734f5/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0=
     github.com/opencontainers/image-spec v1.0.2 h1:9yCKha/T5XdGtO0q9Q9a6T5NUCsTn/DrBg0D7ufOcFM=
     github.com/opencontainers/image-spec v1.0.2/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0=
    -github.com/opencontainers/runc v0.0.0-20190115041553-12f6a991201f/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U=
    -github.com/opencontainers/runc v0.1.1/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U=
    -github.com/opencontainers/runc v1.0.0-rc8.0.20190926000215-3e425f80a8c9/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U=
    -github.com/opencontainers/runc v1.0.0-rc9/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U=
    -github.com/opencontainers/runc v1.0.0-rc93/go.mod h1:3NOsor4w32B2tC0Zbl8Knk4Wg84SM2ImC1fxBuqJ/H0=
    -github.com/opencontainers/runc v1.0.2/go.mod h1:aTaHFFwQXuA71CiyxOdFFIorAoemI04suvGRQFzWTD0=
    -github.com/opencontainers/runc v1.1.0/go.mod h1:Tj1hFw6eFWp/o33uxGf5yF2BX5yz2Z6iptFpuvbbKqc=
    -github.com/opencontainers/runtime-spec v0.1.2-0.20190507144316-5b71a03e2700/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0=
    -github.com/opencontainers/runtime-spec v1.0.1/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0=
    -github.com/opencontainers/runtime-spec v1.0.2-0.20190207185410-29686dbc5559/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0=
    -github.com/opencontainers/runtime-spec v1.0.2/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0=
    -github.com/opencontainers/runtime-spec v1.0.3-0.20200929063507-e6143ca7d51d/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0=
    -github.com/opencontainers/runtime-spec v1.0.3-0.20210326190908-1c3f411f0417/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0=
    -github.com/opencontainers/runtime-tools v0.0.0-20181011054405-1d69bd0f9c39/go.mod h1:r3f7wjNzSs2extwzU3Y+6pKfobzPh+kKFJ3ofN+3nfs=
    -github.com/opencontainers/selinux v1.6.0/go.mod h1:VVGKuOLlE7v4PJyT6h7mNWvq1rzqiriPsEqVhc+svHE=
    -github.com/opencontainers/selinux v1.8.0/go.mod h1:RScLhm78qiWa2gbVCcGkC7tCGdgk3ogry1nUQF8Evvo=
    -github.com/opencontainers/selinux v1.8.2/go.mod h1:MUIHuUEvKB1wtJjQdOyYRgOnLD2xAPP8dBsCoU0KuF8=
    -github.com/opencontainers/selinux v1.10.0/go.mod h1:2i0OySw99QjzBBQByd1Gr9gSjvuho1lHsJxIJ3gGbJI=
     github.com/opentracing-contrib/go-observer v0.0.0-20170622124052-a52f23424492/go.mod h1:Ngi6UdF0k5OKD5t5wlmGhe/EDKPoUM3BXZSSfIuJbis=
     github.com/opentracing/basictracer-go v1.0.0/go.mod h1:QfBfYuafItcjQuMwinw9GhYKwFXS9KnPs5lxoYwgW74=
     github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o=
    @@ -1014,16 +693,12 @@ github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FI
     github.com/pascaldekloe/goe v0.1.0 h1:cBOtyMzM9HTpWjXfbbunk26uA6nG3a8n06Wieeh0MwY=
     github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=
     github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k=
    -github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic=
     github.com/pelletier/go-toml v1.7.0/go.mod h1:vwGMzjaWMwyfHwgIBhI2YUM4fB6nL6lVAvS1LBMMhTE=
    -github.com/pelletier/go-toml v1.8.1/go.mod h1:T2/BmBdy8dvIRq1a/8aqjN41wvWlN4lrapLU/GW4pbc=
    -github.com/pelletier/go-toml v1.9.3/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c=
     github.com/performancecopilot/speed v3.0.0+incompatible/go.mod h1:/CLtqpZ5gBg1M9iaPbIdPPGyKcA8hKdoy6hAWba7Yac=
     github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU=
     github.com/pierrec/lz4 v1.0.2-0.20190131084431-473cd7ce01a1/go.mod h1:3/3N9NVKO0jef7pBehbT1qWhCMrIgbYNnFAZCqQ5LRc=
     github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY=
     github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
    -github.com/pkg/errors v0.8.1-0.20171018195549-f15c970de5b7/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
     github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
     github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
     github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
    @@ -1033,24 +708,20 @@ github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZb
     github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
     github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI=
     github.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s=
    -github.com/pquerna/cachecontrol v0.0.0-20171018203845-0dec1b30a021/go.mod h1:prYjPmNq4d1NPVmpShWobRqXY3q7Vp+80DqgxxUrUIA=
     github.com/prashantv/gostub v1.1.0 h1:BTyx3RfQjRHnUWaGF9oQos79AlQ5k8WNktv7VGvVH4g=
     github.com/prashantv/gostub v1.1.0/go.mod h1:A5zLQHz7ieHGG7is6LLXLz7I8+3LZzsrV0P1IAHhP5U=
     github.com/prometheus/alertmanager v0.24.0 h1:HBWR3lk4uy3ys+naDZthDdV7yEsxpaNeZuUS+hJgrOw=
     github.com/prometheus/alertmanager v0.24.0/go.mod h1:r6fy/D7FRuZh5YbnX6J3MBY0eI4Pb5yPYS7/bPSXXqI=
    -github.com/prometheus/client_golang v0.0.0-20180209125602-c332b6f63c06/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=
     github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=
     github.com/prometheus/client_golang v0.9.3-0.20190127221311-3c4408c8b829/go.mod h1:p2iRAGwDERtqlqzRXnrOVns+ignqQo//hLXqYxZYVNs=
    -github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso=
     github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo=
    -github.com/prometheus/client_golang v1.1.0/go.mod h1:I1FGZT9+L76gKKOs5djB6ezCbFQP1xR9D75/vuwEF3g=
     github.com/prometheus/client_golang v1.3.0/go.mod h1:hJaj2vgQTGQmVCsAACORcieXFeDPbaTKGT+JTgUa3og=
     github.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU=
     github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M=
     github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0=
    -github.com/prometheus/client_golang v1.12.1 h1:ZiaPsmm9uiBeaSMRznKsCDNtPCS0T3JVDGF+06gjBzk=
     github.com/prometheus/client_golang v1.12.1/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY=
    -github.com/prometheus/client_model v0.0.0-20171117100541-99fa1f4be8e5/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
    +github.com/prometheus/client_golang v1.12.2 h1:51L9cDoUHVrXx4zWYlcLQIZ+d+VXHgqnYKkIuq4g/34=
    +github.com/prometheus/client_golang v1.12.2/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY=
     github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
     github.com/prometheus/client_model v0.0.0-20190115171406-56726106282f/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
     github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
    @@ -1058,18 +729,13 @@ github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:
     github.com/prometheus/client_model v0.1.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
     github.com/prometheus/client_model v0.2.0 h1:uq5h0d+GuxiXLJLNABMgp2qUWDPiLvgCzz2dUR+/W/M=
     github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
    -github.com/prometheus/common v0.0.0-20180110214958-89604d197083/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro=
    -github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro=
     github.com/prometheus/common v0.2.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=
    -github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=
     github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=
    -github.com/prometheus/common v0.6.0/go.mod h1:eBmuwkDJBwy6iBfxCBob6t6dR6ENT/y+J+Zk0j9GMYc=
     github.com/prometheus/common v0.7.0/go.mod h1:DjGbpBbp5NYNiECxcL/VnbXCCaQpKd3tt26CguLLsqA=
     github.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4=
     github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo=
     github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc=
     github.com/prometheus/common v0.29.0/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls=
    -github.com/prometheus/common v0.30.0/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls=
     github.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls=
     github.com/prometheus/common v0.34.0 h1:RBmGO9d/FVjqHT0yUGQwBJhkwKV+wPCn7KGpvfab0uE=
     github.com/prometheus/common v0.34.0/go.mod h1:gB3sOl7P0TvJabZpLY5uQMpUqRCPPCyRLCZYc7JZTNE=
    @@ -1079,21 +745,14 @@ github.com/prometheus/common/sigv4 v0.1.0 h1:qoVebwtwwEhS85Czm2dSROY5fTo2PAPEVdD
     github.com/prometheus/common/sigv4 v0.1.0/go.mod h1:2Jkxxk9yYvCkE5G1sQT7GuEXm57JrvHu9k5YwTjsNtI=
     github.com/prometheus/exporter-toolkit v0.7.1 h1:c6RXaK8xBVercEeUQ4tRNL8UGWzDHfvj9dseo1FcK1Y=
     github.com/prometheus/exporter-toolkit v0.7.1/go.mod h1:ZUBIj498ePooX9t/2xtDjeQYwvRpiPP2lh5u4iblj2g=
    -github.com/prometheus/procfs v0.0.0-20180125133057-cb4147076ac7/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
     github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
     github.com/prometheus/procfs v0.0.0-20190117184657-bf6a532e95b1/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
    -github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=
    -github.com/prometheus/procfs v0.0.0-20190522114515-bc1a522cf7b1/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=
     github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=
    -github.com/prometheus/procfs v0.0.3/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDaekg4FpcdQ=
    -github.com/prometheus/procfs v0.0.5/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDaekg4FpcdQ=
     github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A=
     github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU=
    -github.com/prometheus/procfs v0.2.0/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU=
     github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA=
     github.com/prometheus/procfs v0.7.3 h1:4jVXhlkAyzOScmCkXBTOLRLTz8EeU+eyjrwB/EPq0VU=
     github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA=
    -github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU=
     github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4=
     github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg=
     github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ=
    @@ -1104,18 +763,11 @@ github.com/rs/cors v1.8.2/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU=
     github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
     github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=
     github.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=
    -github.com/safchain/ethtool v0.0.0-20190326074333-42ed695e3de8/go.mod h1:Z0q5wiBQGYcxhMZ6gUqHn6pYNLypFAvaL3UvgZLR0U4=
    -github.com/safchain/ethtool v0.0.0-20210803160452-9aa261dae9b1/go.mod h1:Z0q5wiBQGYcxhMZ6gUqHn6pYNLypFAvaL3UvgZLR0U4=
     github.com/samuel/go-zookeeper v0.0.0-20190923202752-2cc03de413da/go.mod h1:gi+0XIa01GRL2eRQVjQkKGqKF3SF9vZR/HnPullcV2E=
    -github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0=
     github.com/scaleway/scaleway-sdk-go v1.0.0-beta.9 h1:0roa6gXKgyta64uqh52AQG3wzZXH21unn+ltzQSXML0=
     github.com/scaleway/scaleway-sdk-go v1.0.0-beta.9/go.mod h1:fCa7OJZ/9DRTnOKmxvT6pn+LPWUptQAmHF/SBJUGEcg=
    -github.com/sclevine/agouti v3.0.0+incompatible/go.mod h1:b4WX9W9L1sfQKXeJf1mUTLZKJ48R1S7H23Ji7oFO5Bw=
    -github.com/sclevine/spec v1.2.0/go.mod h1:W4J29eT/Kzv7/b9IWLB055Z+qvVC9vt0Arko24q7p+U=
     github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529 h1:nn5Wsu0esKSJiIVhscUtVbo7ada43DJhG55ua/hjS5I=
     github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc=
    -github.com/seccomp/libseccomp-golang v0.9.1/go.mod h1:GbW5+tmTXfcxTToHLXlScSlAvWlF4P2Ca7zGrPiEpWo=
    -github.com/seccomp/libseccomp-golang v0.9.2-0.20210429002308-3879420cc921/go.mod h1:JA8cRccbGaA1s33RQf7Y1+q9gHmZX1yB/z9WDN1C6fg=
     github.com/shurcooL/httpfs v0.0.0-20190707220628-8d4bc4ba7749 h1:bUGsEnyNbVPw06Bs80sCeARAlK8lhwqGyi6UT8ymuGk=
     github.com/shurcooL/httpfs v0.0.0-20190707220628-8d4bc4ba7749/go.mod h1:ZY1cvUeJuFPAdZ/B6v7RHavJWZn2YPVFQ1OSXhCGOkg=
     github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc=
    @@ -1124,8 +776,6 @@ github.com/simonpasquier/klog-gokit v0.3.0 h1:TkFK21cbwDRS+CiystjqbAiq5ubJcVTk9h
     github.com/simonpasquier/klog-gokit v0.3.0/go.mod h1:+SUlDQNrhVtGt2FieaqNftzzk8P72zpWlACateWxA9k=
     github.com/simonpasquier/klog-gokit/v3 v3.0.0 h1:J0QrVhAULISHWN05PeXX/xMqJBjnpl2fAuO8uHdQGsA=
     github.com/simonpasquier/klog-gokit/v3 v3.0.0/go.mod h1:+WRhGy707Lp2Q4r727m9Oc7FxazOHgW76FIyCr23nus=
    -github.com/sirupsen/logrus v1.0.4-0.20170822132746-89742aefa4b2/go.mod h1:pMByvHTf9Beacp5x1UXfOR9xyW/9antXMhjMPG0dEzc=
    -github.com/sirupsen/logrus v1.0.6/go.mod h1:pMByvHTf9Beacp5x1UXfOR9xyW/9antXMhjMPG0dEzc=
     github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=
     github.com/sirupsen/logrus v1.4.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=
     github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q=
    @@ -1135,42 +785,27 @@ github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic
     github.com/sirupsen/logrus v1.8.1 h1:dJKuHgqk1NNQlqoA6BTlM1Wf9DOH3NBjQyu0h9+AZZE=
     github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0=
     github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=
    -github.com/smartystreets/goconvey v0.0.0-20190330032615-68dc04aab96a/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=
     github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=
     github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM=
    -github.com/soheilhy/cmux v0.1.5/go.mod h1:T7TcVDs9LWfQgPlPsdngu6I6QIoyIFZDDC6sNE1GqG0=
     github.com/sony/gobreaker v0.4.1/go.mod h1:ZKptC7FHNvhBz7dN2LGjPVBz2sZJmc0/PkyDJOjmxWY=
     github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA=
    -github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ=
     github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk=
     github.com/spf13/afero v1.3.3/go.mod h1:5KUK8ByomD5Ti5Artl0RtHeI5pTF7MIDuXL3yY520V4=
     github.com/spf13/afero v1.6.0/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I=
    -github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE=
     github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE=
    -github.com/spf13/cobra v0.0.2-0.20171109065643-2da4a54c5cee/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ=
     github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ=
    -github.com/spf13/cobra v1.0.0/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE=
    -github.com/spf13/cobra v1.1.3/go.mod h1:pGADOWyqRD/YMrPZigI/zbliZ2wVD/23d+is3pSWzOo=
    -github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo=
    -github.com/spf13/pflag v0.0.0-20170130214245-9ff6c6923cff/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
    -github.com/spf13/pflag v1.0.1-0.20171106142849-4c012f6dcd95/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
     github.com/spf13/pflag v1.0.1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
     github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
     github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA=
     github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
    -github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE=
    -github.com/spf13/viper v1.7.0/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg=
    -github.com/stefanberger/go-pkcs11uri v0.0.0-20201008174630-78d3cae3a980/go.mod h1:AO3tvPzVZ/ayst6UlUKUv6rcPQInYe3IknH3jYhAKu8=
     github.com/stoewer/go-strcase v1.2.0/go.mod h1:IBiWB2sKIp3wVVQ3Y035++gc+knqhUQag1KpM8ahLw8=
     github.com/streadway/amqp v0.0.0-20190404075320-75d898a42a94/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw=
     github.com/streadway/amqp v0.0.0-20190827072141-edfb9018d271/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw=
     github.com/streadway/handy v0.0.0-20190108123426-d5acb3125c2a/go.mod h1:qNTQ5P5JnDBl6z3cMAg/SywNDC5ABu5ApDIw6lUbRmI=
    -github.com/stretchr/objx v0.0.0-20180129172003-8a3f7159479f/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
     github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
     github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
     github.com/stretchr/objx v0.2.0 h1:Hbg2NidpLE8veEBkEZTL3CvlkUIVzuU9jDplZO54c48=
     github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE=
    -github.com/stretchr/testify v0.0.0-20180303142811-b89eecf5ca5d/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
     github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
     github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
     github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
    @@ -1179,42 +814,17 @@ github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/
     github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
     github.com/stretchr/testify v1.7.1 h1:5TQK59W5E3v0r2duFAb7P95B6hEeOyEnHRa8MjYSMTY=
     github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
    -github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw=
    -github.com/syndtr/gocapability v0.0.0-20170704070218-db04d3cc01c8/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww=
    -github.com/syndtr/gocapability v0.0.0-20180916011248-d98352740cb2/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww=
    -github.com/syndtr/gocapability v0.0.0-20200815063812-42c35b437635/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww=
    -github.com/tchap/go-patricia v2.2.6+incompatible/go.mod h1:bmLyhP68RS6kStMGxByiQ23RP/odRBOTVjwp2cDyi6I=
     github.com/tidwall/pretty v1.0.0 h1:HsD+QiTn7sK6flMKIvNmpqz1qrpP3Ps6jOKIKMooyg4=
     github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk=
     github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U=
    -github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U=
    -github.com/tmc/grpc-websocket-proxy v0.0.0-20201229170055-e5319fda7802/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U=
     github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM=
    -github.com/tv42/httpunix v0.0.0-20191220191345-2ba4b9c3382c/go.mod h1:hzIxponao9Kjc7aWznkXaL4U4TWaDSs8zcsY4Ka08nM=
    -github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc=
    -github.com/urfave/cli v0.0.0-20171014202726-7bc6a0acffa5/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA=
     github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA=
     github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0=
    -github.com/urfave/cli v1.22.2/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0=
    -github.com/vishvananda/netlink v0.0.0-20181108222139-023a6dafdcdf/go.mod h1:+SR5DhBJrl6ZM7CoCKvpw5BKroDKQ+PJqOg65H/2ktk=
    -github.com/vishvananda/netlink v1.1.0/go.mod h1:cTgwzPIzzgDAYoQrMm0EdrjRUBkTqKYppBueQtXaqoE=
    -github.com/vishvananda/netlink v1.1.1-0.20201029203352-d40f9887b852/go.mod h1:twkDnbuQxJYemMlGd4JFIcuhgX83tXhKS2B/PRMpOho=
    -github.com/vishvananda/netlink v1.1.1-0.20210330154013-f5de75959ad5/go.mod h1:twkDnbuQxJYemMlGd4JFIcuhgX83tXhKS2B/PRMpOho=
    -github.com/vishvananda/netns v0.0.0-20180720170159-13995c7128cc/go.mod h1:ZjcWmFBXmLKZu9Nxj3WKYEafiSqer2rnvPr0en9UNpI=
    -github.com/vishvananda/netns v0.0.0-20191106174202-0a2b9b5464df/go.mod h1:JP3t17pCcGlemwknint6hfoeCVQrEMVwxRLRjXpq+BU=
    -github.com/vishvananda/netns v0.0.0-20200728191858-db3c7e526aae/go.mod h1:DD4vA1DwXk04H54A1oHXtwZmA0grkVMdPxx/VGLCah0=
    -github.com/vishvananda/netns v0.0.0-20210104183010-2eb08e3e575f/go.mod h1:DD4vA1DwXk04H54A1oHXtwZmA0grkVMdPxx/VGLCah0=
    -github.com/willf/bitset v1.1.11-0.20200630133818-d5bec3311243/go.mod h1:RjeCKbqT1RxIR/KWY6phxZiaY1IyutSBfGjNPySAYV4=
    -github.com/willf/bitset v1.1.11/go.mod h1:83CECat5yLh5zVOf4P1ErAgKA5UDvKtgyUABdr3+MjI=
     github.com/xdg-go/pbkdf2 v1.0.0/go.mod h1:jrpuAogTd400dnrH08LKmI/xc1MbPOebTwRqcT5RDeI=
     github.com/xdg-go/scram v1.0.2/go.mod h1:1WAq6h33pAW+iRreB34OORO2Nf7qel3VV3fjBj+hCSs=
     github.com/xdg-go/stringprep v1.0.2/go.mod h1:8F9zXuvzgwmyT5DUm4GUfZGDdT3W+LCvS6+da4O5kxM=
    -github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU=
    -github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ=
    -github.com/xeipuuv/gojsonschema v0.0.0-20180618132009-1d523034197f/go.mod h1:5yf86TLmAcydyeJq5YvxkGPE2fm/u4myDekKRoLuqhs=
     github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU=
     github.com/xlab/treeprint v1.1.0/go.mod h1:gj5Gd3gPdKtR1ikdDK6fnFLdmIS0X30kTTuNd/WEJu0=
    -github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q=
     github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d/go.mod h1:rHwXgn7JulP+udvsHwJoVG1YGAP6VLg4y9I5dyZdqmA=
     github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
     github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
    @@ -1222,27 +832,12 @@ github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9de
     github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
     github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=
     github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=
    -github.com/yvasiyarov/go-metrics v0.0.0-20140926110328-57bccd1ccd43/go.mod h1:aX5oPXxHm3bOH+xeAttToC8pqch2ScQN/JoXYupl6xs=
    -github.com/yvasiyarov/gorelic v0.0.0-20141212073537-a9bba5b9ab50/go.mod h1:NUSPSUX/bi6SeDMUh6brw0nXpxHnc96TguQh0+r/ssA=
    -github.com/yvasiyarov/newrelic_platform_go v0.0.0-20140908184405-b21fdbd4370f/go.mod h1:GlGEuHIJweS1mbCqG+7vt2nvWLzLLnRHbXz5JKd/Qbg=
    -go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU=
     go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU=
    -go.etcd.io/bbolt v1.3.5/go.mod h1:G5EMThwa9y8QZGBClrRx5EY+Yw9kAhnjy3bSjsnlVTQ=
    -go.etcd.io/bbolt v1.3.6/go.mod h1:qXsaaIqmgQH0T+OPdb99Bf+PKfBBQVAdyD6TY9G8XM4=
     go.etcd.io/etcd v0.0.0-20191023171146-3cf2f69b5738/go.mod h1:dnLIgRNXwCJa5e+c6mIZCrds/GIG4ncV9HhK5PX7jPg=
    -go.etcd.io/etcd v0.5.0-alpha.5.0.20200910180754-dd1b699fc489/go.mod h1:yVHk9ub3CSBatqGNg7GRmsnfLWtoW60w4eDYfh7vHDg=
    -go.etcd.io/etcd/api/v3 v3.5.0/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs=
    -go.etcd.io/etcd/client/pkg/v3 v3.5.0/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g=
    -go.etcd.io/etcd/client/v2 v2.305.0/go.mod h1:h9puh54ZTgAKtEbut2oe9P4L/oqKCVB6xsXlzd7alYQ=
    -go.etcd.io/etcd/client/v3 v3.5.0/go.mod h1:AIKXXVX/DQXtfTEqBryiLTUXwON+GuvO6Z7lLS/oTh0=
    -go.etcd.io/etcd/pkg/v3 v3.5.0/go.mod h1:UzJGatBQ1lXChBkQF0AuAtkRQMYnHubxAEYIrC3MSsE=
    -go.etcd.io/etcd/raft/v3 v3.5.0/go.mod h1:UFOHSIvO/nKwd4lhkwabrTD3cqW5yVyYYf/KlD00Szc=
    -go.etcd.io/etcd/server/v3 v3.5.0/go.mod h1:3Ah5ruV+M+7RZr0+Y/5mNLwC+eQlni+mQmOVdCRJoS4=
     go.mongodb.org/mongo-driver v1.7.3/go.mod h1:NqaYOwnXWr5Pm7AOpO5QFxKJ503nbMse/R79oO62zWg=
     go.mongodb.org/mongo-driver v1.7.5/go.mod h1:VXEWRZ6URJIkUq2SCAyapmhH0ZLRBP+FT4xhp5Zvxng=
     go.mongodb.org/mongo-driver v1.8.3 h1:TDKlTkGDKm9kkJVUOAXDK5/fkqKHJVwYQSpoRfB43R4=
     go.mongodb.org/mongo-driver v1.8.3/go.mod h1:0sQWfOeY63QTntERDJJ/0SuKK0T1uVSgKCuAROlKEPY=
    -go.mozilla.org/pkcs7 v0.0.0-20200128120323-432b2356ecb1/go.mod h1:SNgMg+EgDFwmvSmLRTNKC5fegJjB7v23qTQ0XLGUNHk=
     go.opencensus.io v0.20.1/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk=
     go.opencensus.io v0.20.2/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk=
     go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU=
    @@ -1253,93 +848,60 @@ go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
     go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk=
     go.opencensus.io v0.23.0 h1:gqCw0LfLxScz8irSi8exQc7fyQ0fKQU/qnC/X8+V/1M=
     go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E=
    -go.opentelemetry.io/contrib v0.20.0 h1:ubFQUn0VCZ0gPwIoJfBJVpeBlyRMxu8Mm/huKWYd9p0=
    -go.opentelemetry.io/contrib v0.20.0/go.mod h1:G/EtFaa6qaN7+LxqfIAT3GiZa7Wv5DTBUzl5H4LY0Kc=
    -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.20.0/go.mod h1:oVGt1LRbBOBq1A5BQLlUg9UaU/54aiHw8cgjV3aWZ/E=
    -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.28.0/go.mod h1:vEhqr0m4eTc+DWxfsXoXue2GBgV2uUwVznkGIHW/e5w=
    -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.20.0/go.mod h1:2AboqHi0CiIZU0qwhtUfCYD1GeUzvvIXWNkhDt7ZMG4=
     go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.32.0 h1:mac9BKRqwaX6zxHPDe3pvmWpwuuIM0vuXv2juCnQevE=
     go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.32.0/go.mod h1:5eCOqeGphOyz6TsY3ZDNjE33SM/TFAK3RGuCL2naTgY=
    -go.opentelemetry.io/otel v0.20.0/go.mod h1:Y3ugLH2oa81t5QO+Lty+zXf8zC9L26ax4Nzoxm/dooo=
    -go.opentelemetry.io/otel v1.3.0/go.mod h1:PWIKzi6JCp7sM0k9yZ43VX+T345uNbAkDKwHVjb2PTs=
     go.opentelemetry.io/otel v1.7.0 h1:Z2lA3Tdch0iDcrhJXDIlC94XE+bxok1F9B+4Lz/lGsM=
     go.opentelemetry.io/otel v1.7.0/go.mod h1:5BdUoMIz5WEs0vt0CUEMtSSaTSHBBVwrhnz7+nrD5xk=
    -go.opentelemetry.io/otel/exporters/otlp v0.20.0 h1:PTNgq9MRmQqqJY0REVbZFvwkYOA85vbdQU/nVfxDyqg=
    -go.opentelemetry.io/otel/exporters/otlp v0.20.0/go.mod h1:YIieizyaN77rtLJra0buKiNBOm9XQfkPEKBeuhoMwAM=
    -go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.3.0/go.mod h1:VpP4/RMn8bv8gNo9uK7/IMY4mtWLELsS+JIP0inH0h4=
     go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.7.0 h1:7Yxsak1q4XrJ5y7XBnNwqWx9amMZvoidCctv62XOQ6Y=
     go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.7.0/go.mod h1:M1hVZHNxcbkAlcvrOMlpQ4YOO3Awf+4N2dxkZL3xm04=
    -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.3.0/go.mod h1:hO1KLR7jcKaDDKDkvI9dP/FIhpmna5lkqPUQdEjFAM8=
     go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.7.0 h1:cMDtmgJ5FpRvqx9x2Aq+Mm0O6K/zcUkH73SFz20TuBw=
     go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.7.0/go.mod h1:ceUgdyfNv4h4gLxHR0WNfDiiVmZFodZhZSbOLhpxqXE=
    -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.3.0/go.mod h1:keUU7UfnwWTWpJ+FWnyqmogPa82nuU5VUANFq49hlMY=
     go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.7.0 h1:MFAyzUPrTwLOwCi+cltN0ZVyy4phU41lwH+lyMyQTS4=
     go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.7.0/go.mod h1:E+/KKhwOSw8yoPxSSuUHG6vKppkvhN+S1Jc7Nib3k3o=
    -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.3.0/go.mod h1:QNX1aly8ehqqX1LEa6YniTU7VY9I6R3X/oPxhGdTceE=
     go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.7.0 h1:pLP0MH4MAqeTEV0g/4flxw9O8Is48uAIauAnjznbW50=
     go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.7.0/go.mod h1:aFXT9Ng2seM9eizF+LfKiyPBGy8xIZKwhusC1gIu3hA=
    -go.opentelemetry.io/otel/metric v0.20.0/go.mod h1:598I5tYlH1vzBjn+BTuhzTCSb/9debfNp6R3s7Pr1eU=
     go.opentelemetry.io/otel/metric v0.30.0 h1:Hs8eQZ8aQgs0U49diZoaS6Uaxw3+bBE3lcMUKBFIk3c=
     go.opentelemetry.io/otel/metric v0.30.0/go.mod h1:/ShZ7+TS4dHzDFmfi1kSXMhMVubNoP0oIaBp70J6UXU=
    -go.opentelemetry.io/otel/oteltest v0.20.0/go.mod h1:L7bgKf9ZB7qCwT9Up7i9/pn0PWIa9FqQ2IQ8LoxiGnw=
    -go.opentelemetry.io/otel/sdk v0.20.0/go.mod h1:g/IcepuwNsoiX5Byy2nNV0ySUF1em498m7hBWC279Yc=
    -go.opentelemetry.io/otel/sdk v1.3.0/go.mod h1:rIo4suHNhQwBIPg9axF8V9CA72Wz2mKF1teNrup8yzs=
     go.opentelemetry.io/otel/sdk v1.7.0 h1:4OmStpcKVOfvDOgCt7UriAPtKolwIhxpnSNI/yK+1B0=
     go.opentelemetry.io/otel/sdk v1.7.0/go.mod h1:uTEOTwaqIVuTGiJN7ii13Ibp75wJmYUDe374q6cZwUU=
    -go.opentelemetry.io/otel/sdk/export/metric v0.20.0/go.mod h1:h7RBNMsDJ5pmI1zExLi+bJK+Dr8NQCh0qGhm1KDnNlE=
    -go.opentelemetry.io/otel/sdk/metric v0.20.0/go.mod h1:knxiS8Xd4E/N+ZqKmUPf3gTTZ4/0TjTXukfxjzSTpHE=
    -go.opentelemetry.io/otel/trace v0.20.0/go.mod h1:6GjCW8zgDjwGHGa6GkyeB8+/5vjT16gUEi0Nf1iBdgw=
    -go.opentelemetry.io/otel/trace v1.3.0/go.mod h1:c/VDhno8888bvQYmbYLqe41/Ldmr/KKunbvWM4/fEjk=
     go.opentelemetry.io/otel/trace v1.7.0 h1:O37Iogk1lEkMRXewVtZ1BBTVn5JEp8GrJvP92bJqC6o=
     go.opentelemetry.io/otel/trace v1.7.0/go.mod h1:fzLSB9nqR2eXzxPXb2JW9IKE+ScyXA48yyE4TNvoHqU=
     go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI=
    -go.opentelemetry.io/proto/otlp v0.11.0/go.mod h1:QpEjXPrNQzrFDZgoTo49dgHR9RYRSrg3NAKnUGl9YpQ=
     go.opentelemetry.io/proto/otlp v0.16.0 h1:WHzDWdXUvbc5bG2ObdrGfaNpQz7ft7QN9HHmJlbiB1E=
     go.opentelemetry.io/proto/otlp v0.16.0/go.mod h1:H7XAot3MsfNsj7EXtrA2q5xSNQ10UqI405h3+duxN4U=
     go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
    -go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
     go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ=
    -go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=
     go.uber.org/atomic v1.9.0 h1:ECmE8Bn/WFTYwEW/bpKD3M8VtR/zQVbavAoalC1PYyE=
     go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=
     go.uber.org/automaxprocs v1.5.1 h1:e1YG66Lrk73dn4qhg8WFSvhF0JuFQF0ERIp4rpuV8Qk=
     go.uber.org/automaxprocs v1.5.1/go.mod h1:BF4eumQw0P9GtnuxxovUd06vwm1o18oMzFtK66vU6XU=
    -go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A=
     go.uber.org/goleak v1.1.12 h1:gZAh5/EyT/HQwlpkCy6wTpqfH9H8Lz8zbm3dZh+OyzA=
     go.uber.org/goleak v1.1.12/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ=
     go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0=
     go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4=
    -go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU=
     go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA=
     go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q=
     go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM=
    -go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo=
    -golang.org/x/crypto v0.0.0-20171113213409-9f005a07e0d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
     golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
    -golang.org/x/crypto v0.0.0-20181009213950-7c1a557ab941/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
     golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
     golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
     golang.org/x/crypto v0.0.0-20190422162423-af44ce270edf/go.mod h1:WFFai1msRO1wXaEeE5yQxYXgSfI8pQAWXbQop6sCtWE=
     golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
     golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
    -golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
     golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
     golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
     golang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY=
     golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
     golang.org/x/crypto v0.0.0-20200302210943-78000ba7a073/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
     golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
    -golang.org/x/crypto v0.0.0-20200728195943-123391ffb6de/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
     golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
     golang.org/x/crypto v0.0.0-20201216223049-8b5274cf687f/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I=
    -golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I=
    -golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4=
     golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
    -golang.org/x/crypto v0.0.0-20210817164053-32db794688a5/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
     golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
     golang.org/x/crypto v0.0.0-20211202192323-5770296d904e/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
    -golang.org/x/crypto v0.0.0-20211215153901-e495a2d5b3d3 h1:0es+/5331RGQPcXlMfP+WrnIIS6dNnNRe0WB02W0F4M=
     golang.org/x/crypto v0.0.0-20211215153901-e495a2d5b3d3/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
    +golang.org/x/crypto v0.0.0-20220214200702-86341886e292 h1:f+lwQ+GtmgoY+A2YaQxlSOnDjXcQ7ZRLWOHbC6HtRqE=
    +golang.org/x/crypto v0.0.0-20220214200702-86341886e292/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
     golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
     golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
     golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=
    @@ -1383,7 +945,6 @@ golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3/go.mod h1:3p9vT2HGsQu2
     golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
     golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
     golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
    -golang.org/x/net v0.0.0-20181011144130-49bb7cea24b1/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
     golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
     golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
     golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
    @@ -1395,17 +956,14 @@ golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn
     golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
     golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
     golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
    -golang.org/x/net v0.0.0-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=
     golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=
     golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
    -golang.org/x/net v0.0.0-20190619014844-b5b0513f8c1b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
     golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
     golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
     golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
     golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
     golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
     golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
    -golang.org/x/net v0.0.0-20191004110552-13f9640d40b9/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
     golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
     golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
     golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
    @@ -1419,15 +977,11 @@ golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/
     golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
     golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
     golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
    -golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
     golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
    -golang.org/x/net v0.0.0-20201006153459-a7d1128ccaa0/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
     golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
     golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
     golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
    -golang.org/x/net v0.0.0-20201202161906-c7110b5ffcbb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
     golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
    -golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
     golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
     golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
     golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc=
    @@ -1436,15 +990,11 @@ golang.org/x/net v0.0.0-20210410081132-afb366fc7cd1/go.mod h1:9tjilg8BloeKEkVJvy
     golang.org/x/net v0.0.0-20210421230115-4e50805a0758/go.mod h1:72T/g9IO56b78aLF+1Kcs5dz7/ng1VjMUvfKvpfy+jM=
     golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk=
     golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
    -golang.org/x/net v0.0.0-20210520170846-37e1c6afe023/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
     golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
     golang.org/x/net v0.0.0-20210726213435-c6fcb2dbf985/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
     golang.org/x/net v0.0.0-20210813160813-60bc85c4be6d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
    -golang.org/x/net v0.0.0-20210825183410-e898025ed96a/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
     golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
     golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
    -golang.org/x/net v0.0.0-20211209124913-491a49abca63/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
    -golang.org/x/net v0.0.0-20211216030914-fe4d6282115f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
     golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
     golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
     golang.org/x/net v0.0.0-20220325170049-de3da57026de/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
    @@ -1501,43 +1051,29 @@ golang.org/x/sys v0.0.0-20190419153524-e8e3143a4f4a/go.mod h1:h1NjWce9XRLGQEsW7w
     golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
     golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
     golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
    -golang.org/x/sys v0.0.0-20190514135907-3a4b5fb9f71f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
    -golang.org/x/sys v0.0.0-20190522044717-8097e1b27ff5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
     golang.org/x/sys v0.0.0-20190531175056-4c3a928424d2/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
    -golang.org/x/sys v0.0.0-20190602015325-4c4f7f33c9ed/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
     golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
    -golang.org/x/sys v0.0.0-20190606203320-7fc4e5ec1444/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
    -golang.org/x/sys v0.0.0-20190616124812-15dcb6c0061f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
     golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
    -golang.org/x/sys v0.0.0-20190626221950-04f50cda93cb/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
     golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
    -golang.org/x/sys v0.0.0-20190801041406-cbf593c0f2f3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
    -golang.org/x/sys v0.0.0-20190812073006-9eafafc0a87e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
     golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
     golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
    -golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
     golang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
     golang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
     golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
     golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
     golang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
    -golang.org/x/sys v0.0.0-20191022100944-742c48ecaeb7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
     golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
    -golang.org/x/sys v0.0.0-20191115151921-52ab43148777/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
     golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
     golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
    -golang.org/x/sys v0.0.0-20191210023423-ac6580df4449/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
     golang.org/x/sys v0.0.0-20191220142924-d4481acd189f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
     golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
     golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
     golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
     golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
    -golang.org/x/sys v0.0.0-20200120151820-655fe14d7479/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
     golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
     golang.org/x/sys v0.0.0-20200124204421-9fbb57f87de9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
     golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
     golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
    -golang.org/x/sys v0.0.0-20200217220822-9197077df867/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
     golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
     golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
     golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
    @@ -1548,22 +1084,11 @@ golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7w
     golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
     golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
     golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
    -golang.org/x/sys v0.0.0-20200622214017-ed371f2e16b4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
     golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
    -golang.org/x/sys v0.0.0-20200728102440-3e129f6d46b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
    -golang.org/x/sys v0.0.0-20200817155316-9781c653f443/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
    -golang.org/x/sys v0.0.0-20200831180312-196b9ba8737a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
     golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
    -golang.org/x/sys v0.0.0-20200909081042-eff7692f9009/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
    -golang.org/x/sys v0.0.0-20200916030750-2334cc1a136f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
    -golang.org/x/sys v0.0.0-20200922070232-aee5d888a860/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
    -golang.org/x/sys v0.0.0-20200923182605-d9f96fdee20d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
     golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
    -golang.org/x/sys v0.0.0-20201112073958-5cba982894dd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
    -golang.org/x/sys v0.0.0-20201117170446-d9b008d0a637/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
     golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
     golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
    -golang.org/x/sys v0.0.0-20201202213521-69691e467435/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
     golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
     golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
     golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
    @@ -1573,13 +1098,10 @@ golang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7w
     golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
     golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
     golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
    -golang.org/x/sys v0.0.0-20210324051608-47abb6519492/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
     golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
    -golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
     golang.org/x/sys v0.0.0-20210420072515-93ed5bcd2bfe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
     golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
     golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
    -golang.org/x/sys v0.0.0-20210426230700-d19ff857e887/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
     golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
     golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
     golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
    @@ -1588,18 +1110,11 @@ golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBc
     golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
     golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
     golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
    -golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
     golang.org/x/sys v0.0.0-20210816183151-1e6c022a8912/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
     golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
    -golang.org/x/sys v0.0.0-20210831042530-f4d43177bf5e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
    -golang.org/x/sys v0.0.0-20210903071746-97244b99971b/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
    -golang.org/x/sys v0.0.0-20210906170528-6f6e22806c34/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
     golang.org/x/sys v0.0.0-20210908233432-aa78b53d3365/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
     golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
    -golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
     golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
    -golang.org/x/sys v0.0.0-20211025201205-69cdffdb9359/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
    -golang.org/x/sys v0.0.0-20211116061358-0a5406a5449c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
     golang.org/x/sys v0.0.0-20211124211545-fe61309f8881/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
     golang.org/x/sys v0.0.0-20211210111614-af8b64212486/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
     golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
    @@ -1607,14 +1122,13 @@ golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBc
     golang.org/x/sys v0.0.0-20220128215802-99c3d69c2c27/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
     golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
     golang.org/x/sys v0.0.0-20220227234510-4e6760a101f9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
    +golang.org/x/sys v0.0.0-20220310020820-b874c991c1a5/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
     golang.org/x/sys v0.0.0-20220328115105-d36c6a25d886/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
     golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
     golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a h1:dGzPydgVsqGcTRVwiLJ1jVbufYwmzD3LfVPLKsKg+0k=
     golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
     golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw=
     golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
    -golang.org/x/term v0.0.0-20210220032956-6a3ed077a48d/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
    -golang.org/x/term v0.0.0-20210615171337-6886f2dfbf5b/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
     golang.org/x/term v0.0.0-20210927222741-03fcf44c2211 h1:JGgROgKl9N8DuW20oFS5gxc+lE67/N3FcwmBPMe7ArY=
     golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
     golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
    @@ -1631,17 +1145,12 @@ golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxb
     golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
     golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
     golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
    -golang.org/x/time v0.0.0-20200416051211-89c76fbcd5d1/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
    -golang.org/x/time v0.0.0-20200630173020-3af7569d3a1e/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
    -golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
    -golang.org/x/time v0.0.0-20210723032227-1f47c861a9ac/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
    +golang.org/x/time v0.0.0-20220210224613-90d013bbcef8/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
     golang.org/x/time v0.0.0-20220224211638-0e9765cccd65 h1:M73Iuj3xbbb9Uk1DYhzydthsj6oOd6l9bpuFcNoUvTs=
     golang.org/x/time v0.0.0-20220224211638-0e9765cccd65/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
     golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
     golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
     golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
    -golang.org/x/tools v0.0.0-20181011042414-1f849cf54d09/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
    -golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
     golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
     golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=
     golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
    @@ -1656,19 +1165,15 @@ golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBn
     golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
     golang.org/x/tools v0.0.0-20190531172133-b3315ee88b7d/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
     golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
    -golang.org/x/tools v0.0.0-20190614205625-5aca471b1d59/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
     golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
     golang.org/x/tools v0.0.0-20190624222133-a101b041ded4/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
     golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
    -golang.org/x/tools v0.0.0-20190706070813-72ffa07ba3db/go.mod h1:jcCCGcm9btYwXyDqrUWc6MKQKKGJCWEQ3AfLSRIbEuI=
     golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
     golang.org/x/tools v0.0.0-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
     golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
     golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
     golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
     golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
    -golang.org/x/tools v0.0.0-20191108193012-7d206e10da11/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
    -golang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
     golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
     golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
     golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
    @@ -1692,12 +1197,10 @@ golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roY
     golang.org/x/tools v0.0.0-20200505023115-26f46d2f7ef8/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
     golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
     golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
    -golang.org/x/tools v0.0.0-20200616133436-c1934b75d054/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
     golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
     golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
     golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
     golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE=
    -golang.org/x/tools v0.0.0-20200916195026-c9a70fc28ce3/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU=
     golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
     golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
     golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
    @@ -1720,7 +1223,6 @@ golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8T
     golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
     golang.org/x/xerrors v0.0.0-20220411194840-2f41105eb62f h1:GGU+dLjvlC3qDwqYgL6UgRmHXhOOgns0bZu2Ty5mm6U=
     golang.org/x/xerrors v0.0.0-20220411194840-2f41105eb62f/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
    -google.golang.org/api v0.0.0-20160322025152-9bf6e6e569ff/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0=
     google.golang.org/api v0.3.1/go.mod h1:6wY9I6uQWHQ8EM57III9mq/AjF+i8G65rmVagqKMtkk=
     google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE=
     google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M=
    @@ -1755,6 +1257,7 @@ google.golang.org/api v0.67.0/go.mod h1:ShHKP8E60yPsKNw/w8w+VYaj9H6buA5UqDp8dhbQ
     google.golang.org/api v0.70.0/go.mod h1:Bs4ZM2HGifEvXwd50TtW70ovgJffJYw2oRCOFU/SkfA=
     google.golang.org/api v0.71.0/go.mod h1:4PyU6e6JogV1f9eA4voyrTY2batOLdgZ5qZ5HOCc4j8=
     google.golang.org/api v0.74.0/go.mod h1:ZpfMZOVRMywNyvJFeqL9HRWBgAuRfSjJFpe9QtRRyDs=
    +google.golang.org/api v0.75.0/go.mod h1:pU9QmyHLnzlpar1Mjt4IbapUCy8J+6HD6GeELN69ljA=
     google.golang.org/api v0.77.0 h1:msijLTxwkJ7Jub5tv9KBVCKtHOQwnvnvkX7ErFFCVxY=
     google.golang.org/api v0.77.0/go.mod h1:pU9QmyHLnzlpar1Mjt4IbapUCy8J+6HD6GeELN69ljA=
     google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
    @@ -1766,13 +1269,11 @@ google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCID
     google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=
     google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c=
     google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=
    -google.golang.org/cloud v0.0.0-20151119220103-975617b05ea8/go.mod h1:0H1ncTHf11KCFhTc/+EFRbzSCOZx+VUbRMk55Yv5MYk=
     google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
     google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
     google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
     google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
     google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
    -google.golang.org/genproto v0.0.0-20190522204451-c2c4e71fbf69/go.mod h1:z3L6/3dTEVtUr6QSP8miRzeRqwQOioJ9I66odjN4I7s=
     google.golang.org/genproto v0.0.0-20190530194941-fb225487d101/go.mod h1:z3L6/3dTEVtUr6QSP8miRzeRqwQOioJ9I66odjN4I7s=
     google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
     google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
    @@ -1782,7 +1283,6 @@ google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvx
     google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
     google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
     google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
    -google.golang.org/genproto v0.0.0-20200117163144-32f20d992d24/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
     google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
     google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA=
     google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
    @@ -1791,19 +1291,16 @@ google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfG
     google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
     google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
     google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
    -google.golang.org/genproto v0.0.0-20200423170343-7949de9c1215/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
     google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
     google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
     google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
     google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U=
     google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=
    -google.golang.org/genproto v0.0.0-20200527145253-8367513e4ece/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA=
     google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA=
     google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
     google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
     google.golang.org/genproto v0.0.0-20201019141844-1ed22bb0c154/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
     google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
    -google.golang.org/genproto v0.0.0-20201110150050-8816d57aaa9a/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
     google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
     google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
     google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
    @@ -1842,10 +1339,10 @@ google.golang.org/genproto v0.0.0-20220324131243-acbaeb5b85eb/go.mod h1:hAL49I2I
     google.golang.org/genproto v0.0.0-20220407144326-9054f6ed7bac/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo=
     google.golang.org/genproto v0.0.0-20220413183235-5e96e2839df9/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo=
     google.golang.org/genproto v0.0.0-20220414192740-2d67ff6cf2b4/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo=
    +google.golang.org/genproto v0.0.0-20220421151946-72621c1f0bd3/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo=
     google.golang.org/genproto v0.0.0-20220519153652-3a47de7e79bd/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4=
     google.golang.org/genproto v0.0.0-20220524023933-508584e28198 h1:a1g7i05I2vUwq5eYrmxBJy6rPbw/yo7WzzwPJmcC0P4=
     google.golang.org/genproto v0.0.0-20220524023933-508584e28198/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4=
    -google.golang.org/grpc v0.0.0-20160317175043-d3ddb4469d5a/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw=
     google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs=
     google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
     google.golang.org/grpc v1.20.0/go.mod h1:chYK+tFQF0nDUGJgXMSgLCQk3phJEuONr2DCgLDdAQM=
    @@ -1855,14 +1352,12 @@ google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ij
     google.golang.org/grpc v1.22.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=
     google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=
     google.golang.org/grpc v1.23.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=
    -google.golang.org/grpc v1.24.0/go.mod h1:XDChyiUovWa60DnaeDeZmSW86xtLtjtZbwvSiRnRtcA=
     google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=
     google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
     google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
     google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
     google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60=
     google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk=
    -google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=
     google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=
     google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=
     google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0=
    @@ -1879,7 +1374,6 @@ google.golang.org/grpc v1.39.1/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnD
     google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34=
     google.golang.org/grpc v1.40.1/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34=
     google.golang.org/grpc v1.42.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU=
    -google.golang.org/grpc v1.43.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU=
     google.golang.org/grpc v1.44.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU=
     google.golang.org/grpc v1.45.0/go.mod h1:lN7owxKUQEqMfSyQikvvk5tf/6zMPsrK+ONuO11+0rQ=
     google.golang.org/grpc v1.46.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk=
    @@ -1901,11 +1395,9 @@ google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQ
     google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
     google.golang.org/protobuf v1.28.0 h1:w43yiav+6bVFTBQFZX0r7ipe9JQ1QsbMgHwbBziscLw=
     google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
    -gopkg.in/airbrake/gobrake.v2 v2.0.9/go.mod h1:/h5ZAUhDkGaJfjzjKLSjv6zCL6O0LLBxU4K+aSYdM/U=
     gopkg.in/alecthomas/kingpin.v2 v2.2.6 h1:jMFz6MfLP0/4fUyZle81rXUoxOBFi19VUFKVDOQfozc=
     gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=
     gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
    -gopkg.in/check.v1 v1.0.0-20141024133853-64131543e789/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
     gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
     gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
     gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
    @@ -1915,15 +1407,9 @@ gopkg.in/cheggaaa/pb.v1 v1.0.25/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qS
     gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=
     gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys=
     gopkg.in/gcfg.v1 v1.2.3/go.mod h1:yesOnuUOFQAhST5vPY4nbZsb/huCgGGXlipJsBn0b3o=
    -gopkg.in/gemnasium/logrus-airbrake-hook.v2 v2.1.2/go.mod h1:Xk6kEKp8OKb+X14hQBKWaSkCsqBpgog8nAV2xsGOxlo=
     gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc=
     gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw=
    -gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
    -gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k=
     gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo=
    -gopkg.in/square/go-jose.v2 v2.2.2/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI=
    -gopkg.in/square/go-jose.v2 v2.3.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI=
    -gopkg.in/square/go-jose.v2 v2.5.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI=
     gopkg.in/telebot.v3 v3.0.0/go.mod h1:7rExV8/0mDDNu9epSrDm/8j22KLaActH1Tbee6YjzWg=
     gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ=
     gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw=
    @@ -1941,10 +1427,9 @@ gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
     gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
     gopkg.in/yaml.v3 v3.0.0-20200605160147-a5ece683394c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
     gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
    -gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b h1:h8qDotaEPuJATrMmW04NCwg7v22aHH28wwpauUhK9Oo=
     gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
    -gotest.tools v2.2.0+incompatible h1:VsBPFP1AI068pPrMxtb/S8Zkgf9xEmTLJjfM+P5UIEo=
    -gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw=
    +gopkg.in/yaml.v3 v3.0.0 h1:hjy8E9ON/egN1tAYqKb61G10WtihqetD4sz2H+8nIeA=
    +gopkg.in/yaml.v3 v3.0.0/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
     gotest.tools/v3 v3.0.2/go.mod h1:3SzNCllyD9/Y+b5r9JIKQ474KzkZyqLqEfYqMsX94Bk=
     gotest.tools/v3 v3.0.3 h1:4AuOwCGf4lLR9u3YOe2awrHygurzhO/HeQ6laiA6Sx0=
     gotest.tools/v3 v3.0.3/go.mod h1:Z7Lb0S5l+klDB31fvDQX8ss/FlKDxtlFlw3Oa8Ymbl8=
    @@ -1956,70 +1441,24 @@ honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWh
     honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg=
     honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=
     honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=
    -k8s.io/api v0.20.1/go.mod h1:KqwcCVogGxQY3nBlRpwt+wpAMF/KjaCc7RpywacvqUo=
    -k8s.io/api v0.20.4/go.mod h1:++lNL1AJMkDymriNniQsWRkMDzRaX2Y/POTUi8yvqYQ=
    -k8s.io/api v0.20.6/go.mod h1:X9e8Qag6JV/bL5G6bU8sdVRltWKmdHsFUGS3eVndqE8=
    -k8s.io/api v0.22.5/go.mod h1:mEhXyLaSD1qTOf40rRiKXkc+2iCem09rWLlFwhCEiAs=
    -k8s.io/api v0.23.5/go.mod h1:Na4XuKng8PXJ2JsploYYrivXrINeTaycCGcYgF91Xm8=
    -k8s.io/api v0.23.6 h1:yOK34wbYECH4RsJbQ9sfkFK3O7f/DUHRlzFehkqZyVw=
    -k8s.io/api v0.23.6/go.mod h1:1kFaYxGCFHYp3qd6a85DAj/yW8aVD6XLZMqJclkoi9g=
    -k8s.io/apimachinery v0.20.1/go.mod h1:WlLqWAHZGg07AeltaI0MV5uk1Omp8xaN0JGLY6gkRpU=
    -k8s.io/apimachinery v0.20.4/go.mod h1:WlLqWAHZGg07AeltaI0MV5uk1Omp8xaN0JGLY6gkRpU=
    -k8s.io/apimachinery v0.20.6/go.mod h1:ejZXtW1Ra6V1O5H8xPBGz+T3+4gfkTCeExAHKU57MAc=
    -k8s.io/apimachinery v0.22.1/go.mod h1:O3oNtNadZdeOMxHFVxOreoznohCpy0z6mocxbZr7oJ0=
    -k8s.io/apimachinery v0.22.5/go.mod h1:xziclGKwuuJ2RM5/rSFQSYAj0zdbci3DH8kj+WvyN0U=
    -k8s.io/apimachinery v0.23.5/go.mod h1:BEuFMMBaIbcOqVIJqNZJXGFTP4W6AycEpb5+m/97hrM=
    -k8s.io/apimachinery v0.23.6 h1:RH1UweWJkWNTlFx0D8uxOpaU1tjIOvVVWV/bu5b3/NQ=
    -k8s.io/apimachinery v0.23.6/go.mod h1:BEuFMMBaIbcOqVIJqNZJXGFTP4W6AycEpb5+m/97hrM=
    -k8s.io/apiserver v0.20.1/go.mod h1:ro5QHeQkgMS7ZGpvf4tSMx6bBOgPfE+f52KwvXfScaU=
    -k8s.io/apiserver v0.20.4/go.mod h1:Mc80thBKOyy7tbvFtB4kJv1kbdD0eIH8k8vianJcbFM=
    -k8s.io/apiserver v0.20.6/go.mod h1:QIJXNt6i6JB+0YQRNcS0hdRHJlMhflFmsBDeSgT1r8Q=
    -k8s.io/apiserver v0.22.5/go.mod h1:s2WbtgZAkTKt679sYtSudEQrTGWUSQAPe6MupLnlmaQ=
    -k8s.io/client-go v0.20.1/go.mod h1:/zcHdt1TeWSd5HoUe6elJmHSQ6uLLgp4bIJHVEuy+/Y=
    -k8s.io/client-go v0.20.4/go.mod h1:LiMv25ND1gLUdBeYxBIwKpkSC5IsozMMmOOeSJboP+k=
    -k8s.io/client-go v0.20.6/go.mod h1:nNQMnOvEUEsOzRRFIIkdmYOjAZrC8bgq0ExboWSU1I0=
    -k8s.io/client-go v0.22.5/go.mod h1:cs6yf/61q2T1SdQL5Rdcjg9J1ElXSwbjSrW2vFImM4Y=
    -k8s.io/client-go v0.23.5 h1:zUXHmEuqx0RY4+CsnkOn5l0GU+skkRXKGJrhmE2SLd8=
    -k8s.io/client-go v0.23.5/go.mod h1:flkeinTO1CirYgzMPRWxUCnV0G4Fbu2vLhYCObnt/r4=
    -k8s.io/code-generator v0.19.7/go.mod h1:lwEq3YnLYb/7uVXLorOJfxg+cUu2oihFhHZ0n9NIla0=
    -k8s.io/component-base v0.20.1/go.mod h1:guxkoJnNoh8LNrbtiQOlyp2Y2XFCZQmrcg2n/DeYNLk=
    -k8s.io/component-base v0.20.4/go.mod h1:t4p9EdiagbVCJKrQ1RsA5/V4rFQNDfRlevJajlGwgjI=
    -k8s.io/component-base v0.20.6/go.mod h1:6f1MPBAeI+mvuts3sIdtpjljHWBQ2cIy38oBIWMYnrM=
    -k8s.io/component-base v0.22.5/go.mod h1:VK3I+TjuF9eaa+Ln67dKxhGar5ynVbwnGrUiNF4MqCI=
    -k8s.io/cri-api v0.17.3/go.mod h1:X1sbHmuXhwaHs9xxYffLqJogVsnI+f6cPRcgPel7ywM=
    -k8s.io/cri-api v0.20.1/go.mod h1:2JRbKt+BFLTjtrILYVqQK5jqhI+XNdF6UiGMgczeBCI=
    -k8s.io/cri-api v0.20.4/go.mod h1:2JRbKt+BFLTjtrILYVqQK5jqhI+XNdF6UiGMgczeBCI=
    -k8s.io/cri-api v0.20.6/go.mod h1:ew44AjNXwyn1s0U4xCKGodU7J1HzBeZ1MpGrpa5r8Yc=
    -k8s.io/cri-api v0.23.1/go.mod h1:REJE3PSU0h/LOV1APBrupxrEJqnoxZC8KWzkBUHwrK4=
    -k8s.io/gengo v0.0.0-20200413195148-3a45101e95ac/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0=
    -k8s.io/gengo v0.0.0-20200428234225-8167cfdcfc14/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0=
    -k8s.io/gengo v0.0.0-20201113003025-83324d819ded/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E=
    +k8s.io/api v0.24.0 h1:J0hann2hfxWr1hinZIDefw7Q96wmCBx6SSB8IY0MdDg=
    +k8s.io/api v0.24.0/go.mod h1:5Jl90IUrJHUJYEMANRURMiVvJ0g7Ax7r3R1bqO8zx8I=
    +k8s.io/apimachinery v0.24.0 h1:ydFCyC/DjCvFCHK5OPMKBlxayQytB8pxy8YQInd5UyQ=
    +k8s.io/apimachinery v0.24.0/go.mod h1:82Bi4sCzVBdpYjyI4jY6aHX+YCUchUIrZrXKedjd2UM=
    +k8s.io/client-go v0.24.0 h1:lbE4aB1gTHvYFSwm6eD3OF14NhFDKCejlnsGYlSJe5U=
    +k8s.io/client-go v0.24.0/go.mod h1:VFPQET+cAFpYxh6Bq6f4xyMY80G6jKKktU6G0m00VDw=
     k8s.io/gengo v0.0.0-20210813121822-485abfe95c7c/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E=
    -k8s.io/kube-openapi v0.0.0-20200805222855-6aeccd4b50c6/go.mod h1:UuqjUnNftUyPE5H64/qeyjQoUZhGpeFDVdxjTeEVN2o=
    -k8s.io/kube-openapi v0.0.0-20201113171705-d219536bb9fd/go.mod h1:WOJ3KddDSol4tAGcJo0Tvi+dK12EcqSLqcWsryKMpfM=
    -k8s.io/kube-openapi v0.0.0-20210421082810-95288971da7e/go.mod h1:vHXdDvt9+2spS2Rx9ql3I8tycm3H9FDfdUoIuKCefvw=
    -k8s.io/kube-openapi v0.0.0-20211109043538-20434351676c/go.mod h1:vHXdDvt9+2spS2Rx9ql3I8tycm3H9FDfdUoIuKCefvw=
    -k8s.io/kube-openapi v0.0.0-20211115234752-e816edb12b65 h1:E3J9oCLlaobFUqsjG9DfKbP2BmgwBL2p7pn0A3dG9W4=
    -k8s.io/kube-openapi v0.0.0-20211115234752-e816edb12b65/go.mod h1:sX9MT8g7NVZM5lVL/j8QyCCJe8YSMW30QvGZWaCIDIk=
    -k8s.io/kubernetes v1.13.0/go.mod h1:ocZa8+6APFNC2tX1DZASIbocyYT5jHzqFVsY5aoB7Jk=
    -k8s.io/utils v0.0.0-20201110183641-67b214c5f920/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA=
    +k8s.io/kube-openapi v0.0.0-20220328201542-3ee0da9b0b42 h1:Gii5eqf+GmIEwGNKQYQClCayuJCe2/4fZUvF7VG99sU=
    +k8s.io/kube-openapi v0.0.0-20220328201542-3ee0da9b0b42/go.mod h1:Z/45zLw8lUo4wdiUkI+v/ImEGAvu3WatcZl3lPMR4Rk=
     k8s.io/utils v0.0.0-20210802155522-efc7438f0176/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA=
    -k8s.io/utils v0.0.0-20210819203725-bdf08cb9a70a/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA=
    -k8s.io/utils v0.0.0-20210930125809-cb0fa318a74b/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA=
    -k8s.io/utils v0.0.0-20211116205334-6203023598ed h1:ck1fRPWPJWsMd8ZRFsWc6mh/zHp5fZ/shhbrgPUxDAE=
    -k8s.io/utils v0.0.0-20211116205334-6203023598ed/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA=
    +k8s.io/utils v0.0.0-20220210201930-3a6ce19ff2f9 h1:HNSDgDCrr/6Ly3WEGKZftiE7IY19Vz2GdbOCyI4qqhc=
    +k8s.io/utils v0.0.0-20220210201930-3a6ce19ff2f9/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA=
     rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8=
     rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0=
     rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA=
    -sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.14/go.mod h1:LEScyzhFmoF5pso/YSeBstl57mOzx9xlU9n85RGrDQg=
    -sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.15/go.mod h1:LEScyzhFmoF5pso/YSeBstl57mOzx9xlU9n85RGrDQg=
    -sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.22/go.mod h1:LEScyzhFmoF5pso/YSeBstl57mOzx9xlU9n85RGrDQg=
    -sigs.k8s.io/json v0.0.0-20211020170558-c049b76a60c6 h1:fD1pz4yfdADVNfFmcP2aBEtudwUQ1AlLnRBALr33v3s=
    -sigs.k8s.io/json v0.0.0-20211020170558-c049b76a60c6/go.mod h1:p4QtZmO4uMYipTQNzagwnNoseA6OxSUutVw05NhYDRs=
    -sigs.k8s.io/structured-merge-diff/v4 v4.0.1/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw=
    +sigs.k8s.io/json v0.0.0-20211208200746-9f7c6b3444d2 h1:kDi4JBNAsJWfz1aEXhO8Jg87JJaPNLh5tIzYHgStQ9Y=
    +sigs.k8s.io/json v0.0.0-20211208200746-9f7c6b3444d2/go.mod h1:B+TnT182UBxE84DiCz4CVE26eOSDAeYCpfDnC2kdKMY=
     sigs.k8s.io/structured-merge-diff/v4 v4.0.2/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw=
    -sigs.k8s.io/structured-merge-diff/v4 v4.0.3/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw=
    -sigs.k8s.io/structured-merge-diff/v4 v4.1.2/go.mod h1:j/nl6xW8vLS49O8YvXW1ocPhZawJtm+Yrr7PPRQ0Vg4=
     sigs.k8s.io/structured-merge-diff/v4 v4.2.1 h1:bKCqE9GvQ5tiVHn5rfn1r+yao3aLQEaLzkkmAkf+A6Y=
     sigs.k8s.io/structured-merge-diff/v4 v4.2.1/go.mod h1:j/nl6xW8vLS49O8YvXW1ocPhZawJtm+Yrr7PPRQ0Vg4=
     sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o=
    
    From 3ef153b00cdd8842b49b5abe721418fa5e5de9e0 Mon Sep 17 00:00:00 2001
    From: David Dymko 
    Date: Tue, 24 May 2022 12:03:49 -0400
    Subject: [PATCH 073/135] vultr integration
    
    Signed-off-by: David Dymko 
    ---
     config/config_test.go                       |  29 ++-
     config/testdata/conf.good.yml               |   5 +
     discovery/install/install.go                |   1 +
     discovery/vultr/mock_test.go                | 170 ++++++++++++++++
     discovery/vultr/vultr.go                    | 212 ++++++++++++++++++++
     discovery/vultr/vultr_test.go               | 128 ++++++++++++
     docs/configuration/configuration.md         |  81 ++++++++
     documentation/examples/prometheus-vultr.yml |  24 +++
     go.mod                                      |   4 +-
     go.sum                                      |   8 +-
     plugins/plugins.go                          |   3 +
     11 files changed, 662 insertions(+), 3 deletions(-)
     create mode 100644 discovery/vultr/mock_test.go
     create mode 100644 discovery/vultr/vultr.go
     create mode 100644 discovery/vultr/vultr_test.go
     create mode 100644 documentation/examples/prometheus-vultr.yml
    
    diff --git a/config/config_test.go b/config/config_test.go
    index baffa3f879b..acf339393c4 100644
    --- a/config/config_test.go
    +++ b/config/config_test.go
    @@ -51,6 +51,7 @@ import (
     	"github.com/prometheus/prometheus/discovery/targetgroup"
     	"github.com/prometheus/prometheus/discovery/triton"
     	"github.com/prometheus/prometheus/discovery/uyuni"
    +	"github.com/prometheus/prometheus/discovery/vultr"
     	"github.com/prometheus/prometheus/discovery/xds"
     	"github.com/prometheus/prometheus/discovery/zookeeper"
     	"github.com/prometheus/prometheus/model/labels"
    @@ -1020,6 +1021,32 @@ var expectedConf = &Config{
     				},
     			},
     		},
    +		{
    +			JobName: "vultr",
    +
    +			HonorTimestamps: true,
    +			ScrapeInterval:  model.Duration(15 * time.Second),
    +			ScrapeTimeout:   DefaultGlobalConfig.ScrapeTimeout,
    +
    +			MetricsPath:      DefaultScrapeConfig.MetricsPath,
    +			Scheme:           DefaultScrapeConfig.Scheme,
    +			HTTPClientConfig: config.DefaultHTTPClientConfig,
    +
    +			ServiceDiscoveryConfigs: discovery.Configs{
    +				&vultr.SDConfig{
    +					HTTPClientConfig: config.HTTPClientConfig{
    +						Authorization: &config.Authorization{
    +							Type:        "Bearer",
    +							Credentials: "abcdef",
    +						},
    +						FollowRedirects: true,
    +						EnableHTTP2:     true,
    +					},
    +					Port:            80,
    +					RefreshInterval: model.Duration(60 * time.Second),
    +				},
    +			},
    +		},
     	},
     	AlertingConfig: AlertingConfig{
     		AlertmanagerConfigs: []*AlertmanagerConfig{
    @@ -1117,7 +1144,7 @@ func TestElideSecrets(t *testing.T) {
     	yamlConfig := string(config)
     
     	matches := secretRe.FindAllStringIndex(yamlConfig, -1)
    -	require.Equal(t, 17, len(matches), "wrong number of secret matches found")
    +	require.Equal(t, 18, len(matches), "wrong number of secret matches found")
     	require.NotContains(t, yamlConfig, "mysecret",
     		"yaml marshal reveals authentication credentials.")
     }
    diff --git a/config/testdata/conf.good.yml b/config/testdata/conf.good.yml
    index b111c1d42ff..e217a82ead9 100644
    --- a/config/testdata/conf.good.yml
    +++ b/config/testdata/conf.good.yml
    @@ -373,6 +373,11 @@ scrape_configs:
             authorization:
               credentials: abcdef
     
    +  - job_name: vultr
    +    vultr_sd_configs:
    +      - authorization:
    +          credentials: abcdef
    +
     alerting:
       alertmanagers:
         - scheme: https
    diff --git a/discovery/install/install.go b/discovery/install/install.go
    index 68664b52a63..d8a5a82cb46 100644
    --- a/discovery/install/install.go
    +++ b/discovery/install/install.go
    @@ -36,6 +36,7 @@ import (
     	_ "github.com/prometheus/prometheus/discovery/scaleway"     // register scaleway
     	_ "github.com/prometheus/prometheus/discovery/triton"       // register triton
     	_ "github.com/prometheus/prometheus/discovery/uyuni"        // register uyuni
    +	_ "github.com/prometheus/prometheus/discovery/vultr"        // register vultr
     	_ "github.com/prometheus/prometheus/discovery/xds"          // register xds
     	_ "github.com/prometheus/prometheus/discovery/zookeeper"    // register zookeeper
     )
    diff --git a/discovery/vultr/mock_test.go b/discovery/vultr/mock_test.go
    new file mode 100644
    index 00000000000..639234e2864
    --- /dev/null
    +++ b/discovery/vultr/mock_test.go
    @@ -0,0 +1,170 @@
    +// Copyright 2022 The Prometheus Authors
    +// 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.
    +
    +package vultr
    +
    +import (
    +	"fmt"
    +	"net/http"
    +	"net/http/httptest"
    +	"testing"
    +)
    +
    +// SDMock is the interface for the Vultr mock
    +type SDMock struct {
    +	t      *testing.T
    +	Server *httptest.Server
    +	Mux    *http.ServeMux
    +}
    +
    +// NewSDMock returns a new SDMock.
    +func NewSDMock(t *testing.T) *SDMock {
    +	return &SDMock{
    +		t: t,
    +	}
    +}
    +
    +// Endpoint returns the URI to the mock server
    +func (m *SDMock) Endpoint() string {
    +	return m.Server.URL + "/"
    +}
    +
    +// Setup creates the mock server
    +func (m *SDMock) Setup() {
    +	m.Mux = http.NewServeMux()
    +	m.Server = httptest.NewServer(m.Mux)
    +}
    +
    +// ShutdownServer creates the mock server
    +func (m *SDMock) ShutdownServer() {
    +	m.Server.Close()
    +}
    +
    +const APIKey = "ABCBTDG35OTGH2UKCC3S6CNMDUPCN3ZWSGFQ"
    +
    +// HandleInstanceList mocks vultr instances list.
    +func (m *SDMock) HandleInstanceList() {
    +	m.Mux.HandleFunc("/v2/instances", func(w http.ResponseWriter, r *http.Request) {
    +		if r.Header.Get("Authorization") != fmt.Sprintf("Bearer %s", APIKey) {
    +			w.WriteHeader(http.StatusForbidden)
    +			return
    +		}
    +
    +		w.Header().Add("content-type", "application/json; charset=utf-8")
    +		w.WriteHeader(http.StatusOK)
    +
    +		fmt.Fprint(w, `
    +{
    +    "instances": [
    +        {
    +            "id": "dbdbd38c-9884-4c92-95fe-899e50dee717",
    +            "os": "Marketplace",
    +            "ram": 4096,
    +            "disk": 128,
    +            "main_ip": "149.28.234.27",
    +            "vcpu_count": 2,
    +            "region": "ewr",
    +            "plan": "vhf-2c-4gb",
    +            "date_created": "2022-03-10T02:25:30+00:00",
    +            "status": "active",
    +            "allowed_bandwidth": 3000,
    +            "netmask_v4": "255.255.254.0",
    +            "gateway_v4": "149.28.234.1",
    +            "power_status": "running",
    +            "server_status": "ok",
    +            "v6_network": "",
    +            "v6_main_ip": "",
    +            "v6_network_size": 0,
    +            "label": "np-2-eae38a19b0f3",
    +            "internal_ip": "10.1.96.5",
    +            "kvm": "https://my.vultr.com/subs/vps/novnc/api.php?data=djJ8Q2k2NlVpNUlZNE5kM3NZMWdBNzFKUkVadDBDU3ItTEJ8-yNWBdMn1AWPqX-EnpTVbA1qBeP0txBZbahSOh3UtHIL2p0fZKEdFJwFNjWtvBKC9BGvJkoJdWBoo7hF-6RzavdUKPD3KIU5xD_T6keV8X-PPukPgXMuSUaAqurAuJvwAWXcTcodBjaIH961xgbvfkFyqVl0ZgHf3ErZQE-EmpZ0Jc3uF1DO2McJ4UL8KUvHLwa-ZDUZ_AtWJjQWsjNkxjvOiA",
    +            "hostname": "np-2-eae38a19b0f3",
    +            "os_id": 426,
    +            "app_id": 0,
    +            "image_id": "vke-worker",
    +            "firewall_group_id": "",
    +            "features": ["backups"],
    +            "tags": ["tag1", "tag2", "tag3"]
    +        },
    +        {
    +            "id": "fccb117c-62f7-4b17-995d-a8e56dd30b33",
    +            "os": "Marketplace",
    +            "ram": 4096,
    +            "disk": 128,
    +            "main_ip": "45.63.1.222",
    +            "vcpu_count": 2,
    +            "region": "ewr",
    +            "plan": "vhf-2c-4gb",
    +            "date_created": "2022-03-10T02:25:32+00:00",
    +            "status": "active",
    +            "allowed_bandwidth": 3000,
    +            "netmask_v4": "255.255.254.0",
    +            "gateway_v4": "45.63.0.1",
    +            "power_status": "running",
    +            "server_status": "ok",
    +            "v6_network": "",
    +            "v6_main_ip": "",
    +            "v6_network_size": 0,
    +            "label": "np-2-fd0714b5fe42",
    +            "internal_ip": "10.1.96.6",
    +            "kvm": "https://my.vultr.com/subs/vps/novnc/api.php?data=djJ8R0tzbmI0VWVfSDR6VE51Q0FGUTBCamwyTFNzZDNkVTF8Zwm93t6L2BLTYSNmM0g0Ppf43r71aIbqLiJCx6_1NuCugUqIKz8POshH91vi6XXDorpb3hYTk8RrJWQbaFMak7XbbfMObzsrFxKAQUVGfbjTBIHCKftxNIXeQOp1fEIDa3p-vkfSxEpx6ZX8nChGYYSVuOjS1twV6oI_IKtHXKdFJiVFz0Unay_K3HuXW_H2wrYSjmAChloR-eA1jSmBXLccJQ",
    +            "hostname": "np-2-fd0714b5fe42",
    +            "os_id": 426,
    +            "app_id": 0,
    +            "image_id": "vke-worker",
    +            "firewall_group_id": "",
    +            "features": [],
    +            "tags": []
    +        },
    +        {
    +            "id": "c4e58767-f61b-4c5e-9bce-43761cc04868",
    +            "os": "Marketplace",
    +            "ram": 4096,
    +            "disk": 128,
    +            "main_ip": "149.28.237.151",
    +            "vcpu_count": 2,
    +            "region": "ewr",
    +            "plan": "vhf-2c-4gb",
    +            "date_created": "2022-03-10T02:25:33+00:00",
    +            "status": "active",
    +            "allowed_bandwidth": 3000,
    +            "netmask_v4": "255.255.254.0",
    +            "gateway_v4": "149.28.236.1",
    +            "power_status": "running",
    +            "server_status": "ok",
    +            "v6_network": "",
    +            "v6_main_ip": "",
    +            "v6_network_size": 0,
    +            "label": "np-2-d04e7829fa43",
    +            "internal_ip": "10.1.96.7",
    +            "kvm": "https://my.vultr.com/subs/vps/novnc/api.php?data=djJ8NFEzbFZmV2hOUWNrc2R4bndnckhFQTJ3ME1yWmxVeW98P-p-KeyNtP73wzVvuWZSOrV5PvQDiBmYyB3cp99btIy5nczmvX8DOGSChbEldk3idKNdFLQMIieWnpR5xU5K-dMYlL6n6oYv2u-rh8zxS6-8hQsSbL2OsoywNPoLpQ3xPkT9Rb-yPrZX4fDLbt8yPVKDHqHO0GB-TxVPemueovfkkUZMXSraAXgHtl1YgK2uLMQf1WBFVzgwnQ7MYcfMGGYFQw",
    +            "hostname": "np-2-d04e7829fa43",
    +            "os_id": 426,
    +            "app_id": 0,
    +            "image_id": "vke-worker",
    +            "firewall_group_id": "",
    +            "features": [],
    +            "tags": []
    +        }
    +    ],
    +    "meta": {
    +        "total": 3,
    +        "links": {
    +            "next": "",
    +            "prev": ""
    +        }
    +    }
    +}
    +`)
    +	})
    +}
    diff --git a/discovery/vultr/vultr.go b/discovery/vultr/vultr.go
    new file mode 100644
    index 00000000000..5c26c5d31d6
    --- /dev/null
    +++ b/discovery/vultr/vultr.go
    @@ -0,0 +1,212 @@
    +// Copyright 2022 The Prometheus Authors
    +// 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.
    +
    +package vultr
    +
    +import (
    +	"context"
    +	"fmt"
    +	"net"
    +	"net/http"
    +	"strconv"
    +	"strings"
    +	"time"
    +
    +	"github.com/go-kit/log"
    +	"github.com/prometheus/common/config"
    +	"github.com/prometheus/common/model"
    +	"github.com/prometheus/common/version"
    +	"github.com/vultr/govultr/v2"
    +
    +	"github.com/prometheus/prometheus/discovery"
    +	"github.com/prometheus/prometheus/discovery/refresh"
    +	"github.com/prometheus/prometheus/discovery/targetgroup"
    +)
    +
    +const (
    +	vultrInstanceLabel             = model.MetaLabelPrefix + "vultr_instance_"
    +	vultrInstanceLabelID           = vultrInstanceLabel + "id"
    +	vultrInstanceLabelLabel        = vultrInstanceLabel + "label"
    +	vultrInstanceLabelOS           = vultrInstanceLabel + "os"
    +	vultrInstanceLabelOSID         = vultrInstanceLabel + "os_id"
    +	vultrInstanceLabelRegion       = vultrInstanceLabel + "region"
    +	vultrInstanceLabelPlan         = vultrInstanceLabel + "plan"
    +	vultrInstanceLabelMainIP       = vultrInstanceLabel + "main_ip"
    +	vultrInstanceLabelMainIPV6     = vultrInstanceLabel + "main_ipv6"
    +	vultrInstanceLabelInternalIP   = vultrInstanceLabel + "internal_ip"
    +	vultrInstanceLabelFeatures     = vultrInstanceLabel + "features"
    +	vultrInstanceLabelTags         = vultrInstanceLabel + "tags"
    +	vultrInstanceLabelHostname     = vultrInstanceLabel + "hostname"
    +	vultrInstanceLabelServerStatus = vultrInstanceLabel + "server_status"
    +	vultrInstanceLabelVCPU         = vultrInstanceLabel + "vcpu_count"
    +	vultrInstanceLabelMemory       = vultrInstanceLabel + "ram_bytes"
    +	vultrInstanceLabelBandwidth    = vultrInstanceLabel + "allowed_bandwidth_gb"
    +	vultrInstanceLabelDisk         = vultrInstanceLabel + "disk_gb"
    +	separator                      = ","
    +)
    +
    +// DefaultSDConfig is the default Vultr SD configuration.
    +var DefaultSDConfig = SDConfig{
    +	Port:             80,
    +	RefreshInterval:  model.Duration(60 * time.Second),
    +	HTTPClientConfig: config.DefaultHTTPClientConfig,
    +}
    +
    +func init() {
    +	discovery.RegisterConfig(&SDConfig{})
    +}
    +
    +type SDConfig struct {
    +	HTTPClientConfig config.HTTPClientConfig `yaml:",inline"`
    +
    +	RefreshInterval model.Duration `yaml:"refresh_interval"`
    +	Port            int            `yaml:"port"`
    +}
    +
    +// Name returns the name of the Config.
    +func (*SDConfig) Name() string { return "vultr" }
    +
    +// NewDiscoverer returns a Discoverer for the Config.
    +func (c *SDConfig) NewDiscoverer(opts discovery.DiscovererOptions) (discovery.Discoverer, error) {
    +	return NewDiscovery(c, opts.Logger)
    +}
    +
    +// SetDirectory joins any relative file paths with dir.
    +func (c *SDConfig) SetDirectory(dir string) {
    +	c.HTTPClientConfig.SetDirectory(dir)
    +}
    +
    +// UnmarshalYAML implements the yaml.Unmarshaler interface.
    +func (c *SDConfig) UnmarshalYAML(unmarshal func(interface{}) error) error {
    +	*c = DefaultSDConfig
    +	type plain SDConfig
    +	if err := unmarshal((*plain)(c)); err != nil {
    +		return err
    +	}
    +
    +	return c.HTTPClientConfig.Validate()
    +}
    +
    +// Discovery periodically performs Vultr requests. It implements
    +// the Discoverer interface.
    +type Discovery struct {
    +	*refresh.Discovery
    +	client *govultr.Client
    +	port   int
    +}
    +
    +// NewDiscovery returns a new Discovery which periodically refreshes its targets.
    +func NewDiscovery(conf *SDConfig, logger log.Logger) (*Discovery, error) {
    +	d := &Discovery{
    +		port: conf.Port,
    +	}
    +
    +	rt, err := config.NewRoundTripperFromConfig(conf.HTTPClientConfig, "vultr_sd")
    +	if err != nil {
    +		return nil, err
    +	}
    +
    +	d.client = govultr.NewClient(&http.Client{
    +		Transport: rt,
    +		Timeout:   time.Duration(conf.RefreshInterval),
    +	})
    +
    +	d.client.SetUserAgent(fmt.Sprintf("Prometheus/%s", version.Version))
    +
    +	if err != nil {
    +		return nil, fmt.Errorf("error setting up vultr agent: %w", err)
    +	}
    +
    +	d.Discovery = refresh.NewDiscovery(
    +		logger,
    +		"vultr",
    +		time.Duration(conf.RefreshInterval),
    +		d.refresh,
    +	)
    +	return d, nil
    +}
    +
    +func (d *Discovery) refresh(ctx context.Context) ([]*targetgroup.Group, error) {
    +	tg := &targetgroup.Group{
    +		Source: "Vultr",
    +	}
    +
    +	instances, err := d.listInstances(ctx)
    +	if err != nil {
    +		return nil, err
    +	}
    +
    +	for _, instance := range instances {
    +		labels := model.LabelSet{
    +			vultrInstanceLabelID:           model.LabelValue(instance.ID),
    +			vultrInstanceLabelLabel:        model.LabelValue(instance.Label),
    +			vultrInstanceLabelOS:           model.LabelValue(instance.Os),
    +			vultrInstanceLabelOSID:         model.LabelValue(strconv.Itoa(instance.OsID)),
    +			vultrInstanceLabelRegion:       model.LabelValue(instance.Region),
    +			vultrInstanceLabelPlan:         model.LabelValue(instance.Plan),
    +			vultrInstanceLabelVCPU:         model.LabelValue(strconv.Itoa(instance.VCPUCount)),
    +			vultrInstanceLabelMemory:       model.LabelValue(strconv.Itoa(instance.RAM)),
    +			vultrInstanceLabelBandwidth:    model.LabelValue(strconv.Itoa(instance.AllowedBandwidth)),
    +			vultrInstanceLabelDisk:         model.LabelValue(strconv.Itoa(instance.Disk)),
    +			vultrInstanceLabelMainIP:       model.LabelValue(instance.MainIP),
    +			vultrInstanceLabelMainIPV6:     model.LabelValue(instance.V6MainIP),
    +			vultrInstanceLabelInternalIP:   model.LabelValue(instance.InternalIP),
    +			vultrInstanceLabelHostname:     model.LabelValue(instance.Hostname),
    +			vultrInstanceLabelServerStatus: model.LabelValue(instance.ServerStatus),
    +		}
    +
    +		addr := net.JoinHostPort(instance.MainIP, strconv.FormatUint(uint64(d.port), 10))
    +		labels[model.AddressLabel] = model.LabelValue(addr)
    +
    +		// We surround the separated list with the separator as well. This way regular expressions
    +		// in relabeling rules don't have to consider feature positions.
    +		if len(instance.Features) > 0 {
    +			features := separator + strings.Join(instance.Features, separator) + separator
    +			labels[vultrInstanceLabelFeatures] = model.LabelValue(features)
    +		}
    +
    +		if len(instance.Tags) > 0 {
    +			tags := separator + strings.Join(instance.Tags, separator) + separator
    +			labels[vultrInstanceLabelTags] = model.LabelValue(tags)
    +		}
    +
    +		tg.Targets = append(tg.Targets, labels)
    +	}
    +
    +	return []*targetgroup.Group{tg}, nil
    +}
    +
    +func (d *Discovery) listInstances(ctx context.Context) ([]govultr.Instance, error) {
    +	var instances []govultr.Instance
    +
    +	listOptions := &govultr.ListOptions{
    +		PerPage: 100,
    +	}
    +
    +	for {
    +		pagedInstances, meta, err := d.client.Instance.List(ctx, listOptions)
    +		if err != nil {
    +			return nil, err
    +		}
    +		instances = append(instances, pagedInstances...)
    +
    +		if meta.Links.Next == "" {
    +			break
    +		} else {
    +			listOptions.Cursor = meta.Links.Next
    +			continue
    +		}
    +	}
    +
    +	return instances, nil
    +}
    diff --git a/discovery/vultr/vultr_test.go b/discovery/vultr/vultr_test.go
    new file mode 100644
    index 00000000000..272accbc2fe
    --- /dev/null
    +++ b/discovery/vultr/vultr_test.go
    @@ -0,0 +1,128 @@
    +// Copyright 2022 The Prometheus Authors
    +// 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.
    +
    +package vultr
    +
    +import (
    +	"context"
    +	"fmt"
    +	"net/url"
    +	"testing"
    +
    +	"github.com/go-kit/log"
    +	"github.com/prometheus/common/model"
    +	"github.com/stretchr/testify/require"
    +)
    +
    +type VultrSDTestSuite struct {
    +	Mock *SDMock
    +}
    +
    +func (s *VultrSDTestSuite) TearDownSuite() {
    +	s.Mock.ShutdownServer()
    +}
    +
    +func (s *VultrSDTestSuite) SetupTest(t *testing.T) {
    +	s.Mock = NewSDMock(t)
    +	s.Mock.Setup()
    +
    +	s.Mock.HandleInstanceList()
    +}
    +
    +func TestVultrSDRefresh(t *testing.T) {
    +	sdMock := &VultrSDTestSuite{}
    +	sdMock.SetupTest(t)
    +	t.Cleanup(sdMock.TearDownSuite)
    +
    +	cfg := DefaultSDConfig
    +	cfg.HTTPClientConfig.BearerToken = APIKey
    +	d, err := NewDiscovery(&cfg, log.NewNopLogger())
    +	require.NoError(t, err)
    +	endpoint, err := url.Parse(sdMock.Mock.Endpoint())
    +	require.NoError(t, err)
    +	d.client.BaseURL = endpoint
    +
    +	ctx := context.Background()
    +	tgs, err := d.refresh(ctx)
    +	require.NoError(t, err)
    +
    +	require.Equal(t, 1, len(tgs))
    +
    +	tg := tgs[0]
    +	require.NotNil(t, tg)
    +	require.NotNil(t, tg.Targets)
    +	require.Equal(t, 3, len(tg.Targets))
    +
    +	for i, k := range []model.LabelSet{
    +		{
    +			"__address__":                                model.LabelValue("149.28.234.27:80"),
    +			"__meta_vultr_instance_id":                   model.LabelValue("dbdbd38c-9884-4c92-95fe-899e50dee717"),
    +			"__meta_vultr_instance_label":                model.LabelValue("np-2-eae38a19b0f3"),
    +			"__meta_vultr_instance_os":                   model.LabelValue("Marketplace"),
    +			"__meta_vultr_instance_os_id":                model.LabelValue("426"),
    +			"__meta_vultr_instance_region":               model.LabelValue("ewr"),
    +			"__meta_vultr_instance_plan":                 model.LabelValue("vhf-2c-4gb"),
    +			"__meta_vultr_instance_main_ip":              model.LabelValue("149.28.234.27"),
    +			"__meta_vultr_instance_internal_ip":          model.LabelValue("10.1.96.5"),
    +			"__meta_vultr_instance_main_ipv6":            model.LabelValue(""),
    +			"__meta_vultr_instance_features":             model.LabelValue(",backups,"),
    +			"__meta_vultr_instance_tags":                 model.LabelValue(",tag1,tag2,tag3,"),
    +			"__meta_vultr_instance_hostname":             model.LabelValue("np-2-eae38a19b0f3"),
    +			"__meta_vultr_instance_server_status":        model.LabelValue("ok"),
    +			"__meta_vultr_instance_vcpu_count":           model.LabelValue("2"),
    +			"__meta_vultr_instance_ram_bytes":            model.LabelValue("4096"),
    +			"__meta_vultr_instance_disk_gb":              model.LabelValue("128"),
    +			"__meta_vultr_instance_allowed_bandwidth_gb": model.LabelValue("3000"),
    +		},
    +		{
    +			"__address__":                                model.LabelValue("45.63.1.222:80"),
    +			"__meta_vultr_instance_id":                   model.LabelValue("fccb117c-62f7-4b17-995d-a8e56dd30b33"),
    +			"__meta_vultr_instance_label":                model.LabelValue("np-2-fd0714b5fe42"),
    +			"__meta_vultr_instance_os":                   model.LabelValue("Marketplace"),
    +			"__meta_vultr_instance_os_id":                model.LabelValue("426"),
    +			"__meta_vultr_instance_region":               model.LabelValue("ewr"),
    +			"__meta_vultr_instance_plan":                 model.LabelValue("vhf-2c-4gb"),
    +			"__meta_vultr_instance_main_ip":              model.LabelValue("45.63.1.222"),
    +			"__meta_vultr_instance_internal_ip":          model.LabelValue("10.1.96.6"),
    +			"__meta_vultr_instance_main_ipv6":            model.LabelValue(""),
    +			"__meta_vultr_instance_hostname":             model.LabelValue("np-2-fd0714b5fe42"),
    +			"__meta_vultr_instance_server_status":        model.LabelValue("ok"),
    +			"__meta_vultr_instance_vcpu_count":           model.LabelValue("2"),
    +			"__meta_vultr_instance_ram_bytes":            model.LabelValue("4096"),
    +			"__meta_vultr_instance_disk_gb":              model.LabelValue("128"),
    +			"__meta_vultr_instance_allowed_bandwidth_gb": model.LabelValue("3000"),
    +		},
    +		{
    +			"__address__":                                model.LabelValue("149.28.237.151:80"),
    +			"__meta_vultr_instance_id":                   model.LabelValue("c4e58767-f61b-4c5e-9bce-43761cc04868"),
    +			"__meta_vultr_instance_label":                model.LabelValue("np-2-d04e7829fa43"),
    +			"__meta_vultr_instance_os":                   model.LabelValue("Marketplace"),
    +			"__meta_vultr_instance_os_id":                model.LabelValue("426"),
    +			"__meta_vultr_instance_region":               model.LabelValue("ewr"),
    +			"__meta_vultr_instance_plan":                 model.LabelValue("vhf-2c-4gb"),
    +			"__meta_vultr_instance_main_ip":              model.LabelValue("149.28.237.151"),
    +			"__meta_vultr_instance_internal_ip":          model.LabelValue("10.1.96.7"),
    +			"__meta_vultr_instance_main_ipv6":            model.LabelValue(""),
    +			"__meta_vultr_instance_hostname":             model.LabelValue("np-2-d04e7829fa43"),
    +			"__meta_vultr_instance_server_status":        model.LabelValue("ok"),
    +			"__meta_vultr_instance_vcpu_count":           model.LabelValue("2"),
    +			"__meta_vultr_instance_ram_bytes":            model.LabelValue("4096"),
    +			"__meta_vultr_instance_disk_gb":              model.LabelValue("128"),
    +			"__meta_vultr_instance_allowed_bandwidth_gb": model.LabelValue("3000"),
    +		},
    +	} {
    +		t.Run(fmt.Sprintf("item %d", i), func(t *testing.T) {
    +			require.Equal(t, k, tg.Targets[i])
    +		})
    +	}
    +}
    diff --git a/docs/configuration/configuration.md b/docs/configuration/configuration.md
    index f6719ed7792..4044263a1b7 100644
    --- a/docs/configuration/configuration.md
    +++ b/docs/configuration/configuration.md
    @@ -2538,6 +2538,83 @@ tls_config:
     See [the Prometheus uyuni-sd configuration file](/documentation/examples/prometheus-uyuni.yml)
     for a practical example on how to set up Uyuni Prometheus configuration.
     
    +### ``
    +
    +Vultr SD configurations allow retrieving scrape targets from [Vultr](https://www.vultr.com/).
    +
    +This service discovery uses the main IPv4 address by default, which that be
    +changed with relabelling, as demonstrated in [the Prometheus vultr-sd
    +configuration file](/documentation/examples/prometheus-vultr.yml).
    +
    +The following meta labels are available on targets during [relabeling](#relabel_config):
    +
    +* `__meta_vultr_instance_id` : A unique ID for the vultr Instance.
    +* `__meta_vultr_instance_label` : The user-supplied label for this instance.
    +* `__meta_vultr_instance_os` : The Operating System name.
    +* `__meta_vultr_instance_os_id` : The Operating System id used by this instance.
    +* `__meta_vultr_instance_region` : The Region id where the Instance is located.
    +* `__meta_vultr_instance_plan` : A unique ID for the Plan.
    +* `__meta_vultr_instance_main_ip` : The main IPv4 address.
    +* `__meta_vultr_instance_internal_ip` : The private IP address.
    +* `__meta_vultr_instance_main_ipv6` : The main IPv6 address.
    +* `__meta_vultr_instance_features` : List of features that are available to the instance.
    +* `__meta_vultr_instance_tags` : List of tags associated with the instance.
    +* `__meta_vultr_instance_hostname` : The hostname for this instance.
    +* `__meta_vultr_instance_server_status` : The server health status.
    +* `__meta_vultr_instance_vcpu_count` : Number of vCPUs.
    +* `__meta_vultr_instance_ram_bytes` : The amount of RAM in MB.
    +* `__meta_vultr_instance_disk_gb` : The size of the disk in GB.
    +* `__meta_vultr_instance_allowed_bandwidth_gb` : Monthly bandwidth quota in GB.
    +
    +```yaml
    +# Authentication information used to authenticate to the API server.
    +# Note that `basic_auth` and `authorization` options are
    +# mutually exclusive.
    +# password and password_file are mutually exclusive.
    +
    +# Optional HTTP basic authentication information, not currently supported by Vultr.
    +basic_auth:
    +  [ username:  ]
    +  [ password:  ]
    +  [ password_file:  ]
    +
    +# Optional `Authorization` header configuration.
    +authorization:
    +  # Sets the authentication type.
    +  [ type:  | default: Bearer ]
    +  # Sets the credentials. It is mutually exclusive with
    +  # `credentials_file`.
    +  [ credentials:  ]
    +  # Sets the credentials to the credentials read from the configured file.
    +  # It is mutually exclusive with `credentials`.
    +  [ credentials_file:  ]
    +
    +# Optional OAuth 2.0 configuration.
    +# Cannot be used at the same time as basic_auth or authorization.
    +oauth2:
    +  [  ]
    +
    +# Optional proxy URL.
    +  [ proxy_url:  ]
    +
    +# Configure whether HTTP requests follow HTTP 3xx redirects.
    +  [ follow_redirects:  | default = true ]
    +
    +# Whether to enable HTTP2.
    +  [ enable_http2:  | default: true ]
    +
    +# TLS configuration.
    +tls_config:
    +  [  ]
    +
    +# The port to scrape metrics from.
    +  [ port:  | default = 80 ]
    +
    +# The time after which the instances are refreshed.
    +  [ refresh_interval:  | default = 60s ]
    +```
    +
    +
     ### ``
     
     A `static_config` allows specifying a list of targets and a common label set
    @@ -2813,6 +2890,10 @@ triton_sd_configs:
     uyuni_sd_configs:
       [ -  ... ]
     
    +# List of Vultr service discovery configurations.
    +vultr_sd_configs:
    +  [ -  ... ]
    +
     # List of labeled statically configured Alertmanagers.
     static_configs:
       [ -  ... ]
    diff --git a/documentation/examples/prometheus-vultr.yml b/documentation/examples/prometheus-vultr.yml
    new file mode 100644
    index 00000000000..5370c363171
    --- /dev/null
    +++ b/documentation/examples/prometheus-vultr.yml
    @@ -0,0 +1,24 @@
    +# An example scrape configuration for running Prometheus with
    +# Vultr.
    +
    +scrape_configs:
    +  # Make Prometheus scrape itself for metrics.
    +  - job_name: "prometheus"
    +    static_configs:
    +      - targets: ["localhost:9090"]
    +
    +  # Discover Node Exporter instances to scrape.
    +  - job_name: "node"
    +    vultr_sd_configs:
    +      - authorization:
    +        credentials: ""
    +    relabel_configs:
    +      # Only scrape targets that have a tag 'monitoring'.
    +      - source_labels: [__meta_vultr_instance_tags]
    +        regex: ".*,monitoring,.*"
    +        action: keep
    +
    +      # Use the public IPv6 address and port 9100 to scrape the target.
    +      - source_labels: [__meta_vultr_instance_main_ipv6]
    +        target_label: __address__
    +        replacement: "[$1]:9100"
    diff --git a/go.mod b/go.mod
    index d085d2dbe44..a8e907219d7 100644
    --- a/go.mod
    +++ b/go.mod
    @@ -48,6 +48,7 @@ require (
     	github.com/scaleway/scaleway-sdk-go v1.0.0-beta.9
     	github.com/shurcooL/httpfs v0.0.0-20190707220628-8d4bc4ba7749
     	github.com/stretchr/testify v1.7.1
    +	github.com/vultr/govultr/v2 v2.17.0
     	go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.32.0
     	go.opentelemetry.io/otel v1.7.0
     	go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.7.0
    @@ -128,10 +129,11 @@ require (
     	github.com/google/uuid v1.2.0 // indirect
     	github.com/googleapis/gax-go/v2 v2.3.0 // indirect
     	github.com/grpc-ecosystem/grpc-gateway/v2 v2.10.2 // indirect
    -	github.com/hashicorp/go-cleanhttp v0.5.1 // indirect
    +	github.com/hashicorp/go-cleanhttp v0.5.2 // indirect
     	github.com/hashicorp/go-hclog v0.12.2 // indirect
     	github.com/hashicorp/go-immutable-radix v1.2.0 // indirect
     	github.com/hashicorp/go-multierror v1.1.1 // indirect
    +	github.com/hashicorp/go-retryablehttp v0.7.1 // indirect
     	github.com/hashicorp/go-rootcerts v1.0.2 // indirect
     	github.com/hashicorp/golang-lru v0.5.4 // indirect
     	github.com/hashicorp/serf v0.9.6 // indirect
    diff --git a/go.sum b/go.sum
    index acb59a9aa6d..db5ea94bfbb 100644
    --- a/go.sum
    +++ b/go.sum
    @@ -464,8 +464,10 @@ github.com/hashicorp/consul/sdk v0.8.0/go.mod h1:GBvyrGALthsZObzUGsfgHZQDXjg4lOj
     github.com/hashicorp/errwrap v1.0.0 h1:hLrqtEDnRye3+sgx6z4qVLNuviH3MR5aQ0ykNJa/UYA=
     github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=
     github.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=
    -github.com/hashicorp/go-cleanhttp v0.5.1 h1:dH3aiDG9Jvb5r5+bYHsikaOUIpcM0xvgMXVoDkXMzJM=
     github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=
    +github.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ=
    +github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48=
    +github.com/hashicorp/go-hclog v0.9.2/go.mod h1:5CU+agLiy3J7N7QjHK5d05KxGsuXiQLrjA0H7acj2lQ=
     github.com/hashicorp/go-hclog v0.12.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ=
     github.com/hashicorp/go-hclog v0.12.2 h1:F1fdYblUEsxKiailtkhCCG2g4bipEgaHiDc8vffNpD4=
     github.com/hashicorp/go-hclog v0.12.2/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ=
    @@ -479,6 +481,8 @@ github.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+
     github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo=
     github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM=
     github.com/hashicorp/go-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs=
    +github.com/hashicorp/go-retryablehttp v0.7.1 h1:sUiuQAnLlbvmExtFQs72iFW/HXeUn8Z1aJLQ4LJJbTQ=
    +github.com/hashicorp/go-retryablehttp v0.7.1/go.mod h1:vAew36LZh98gCBJNLH42IQ1ER/9wtLZZ8meHqQvEYWY=
     github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU=
     github.com/hashicorp/go-rootcerts v1.0.2 h1:jzhAVGtqPKbwpyCPELlgNWhE1znq+qwJtW5Oi2viEzc=
     github.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8=
    @@ -820,6 +824,8 @@ github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1
     github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM=
     github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA=
     github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0=
    +github.com/vultr/govultr/v2 v2.17.0 h1:BHa6MQvQn4YNOw+ecfrbISOf4+3cvgofEQHKBSXt6t0=
    +github.com/vultr/govultr/v2 v2.17.0/go.mod h1:ZFOKGWmgjytfyjeyAdhQlSWwTjh2ig+X49cAp50dzXI=
     github.com/xdg-go/pbkdf2 v1.0.0/go.mod h1:jrpuAogTd400dnrH08LKmI/xc1MbPOebTwRqcT5RDeI=
     github.com/xdg-go/scram v1.0.2/go.mod h1:1WAq6h33pAW+iRreB34OORO2Nf7qel3VV3fjBj+hCSs=
     github.com/xdg-go/stringprep v1.0.2/go.mod h1:8F9zXuvzgwmyT5DUm4GUfZGDdT3W+LCvS6+da4O5kxM=
    diff --git a/plugins/plugins.go b/plugins/plugins.go
    index ebf46ba5c01..6a7b6e53153 100644
    --- a/plugins/plugins.go
    +++ b/plugins/plugins.go
    @@ -70,6 +70,9 @@ import (
     	// Register uyuni plugin.
     	_ "github.com/prometheus/prometheus/discovery/uyuni"
     
    +	// Register vultr plugin.
    +	_ "github.com/prometheus/prometheus/discovery/vultr"
    +
     	// Register xds plugin.
     	_ "github.com/prometheus/prometheus/discovery/xds"
     
    
    From c9d4e5fc948ed6cc996c4dac455f73bd009737c2 Mon Sep 17 00:00:00 2001
    From: Julien Pivotto 
    Date: Tue, 24 May 2022 18:12:13 +0200
    Subject: [PATCH 074/135] vultr: minor fixups
    
    Signed-off-by: Julien Pivotto 
    ---
     discovery/vultr/mock_test.go        |  8 ++++----
     docs/configuration/configuration.md | 10 +++++-----
     2 files changed, 9 insertions(+), 9 deletions(-)
    
    diff --git a/discovery/vultr/mock_test.go b/discovery/vultr/mock_test.go
    index 639234e2864..417866fcef8 100644
    --- a/discovery/vultr/mock_test.go
    +++ b/discovery/vultr/mock_test.go
    @@ -27,25 +27,25 @@ type SDMock struct {
     	Mux    *http.ServeMux
     }
     
    -// NewSDMock returns a new SDMock.
    +// NewSDMock returns a new Vultr mock server.
     func NewSDMock(t *testing.T) *SDMock {
     	return &SDMock{
     		t: t,
     	}
     }
     
    -// Endpoint returns the URI to the mock server
    +// Endpoint returns the URI to the mock server.
     func (m *SDMock) Endpoint() string {
     	return m.Server.URL + "/"
     }
     
    -// Setup creates the mock server
    +// Setup creates the mock server.
     func (m *SDMock) Setup() {
     	m.Mux = http.NewServeMux()
     	m.Server = httptest.NewServer(m.Mux)
     }
     
    -// ShutdownServer creates the mock server
    +// ShutdownServer shuts down the mock server.
     func (m *SDMock) ShutdownServer() {
     	m.Server.Close()
     }
    diff --git a/docs/configuration/configuration.md b/docs/configuration/configuration.md
    index 4044263a1b7..3ceee1acb4b 100644
    --- a/docs/configuration/configuration.md
    +++ b/docs/configuration/configuration.md
    @@ -2595,23 +2595,23 @@ oauth2:
       [  ]
     
     # Optional proxy URL.
    -  [ proxy_url:  ]
    +[ proxy_url:  ]
     
     # Configure whether HTTP requests follow HTTP 3xx redirects.
    -  [ follow_redirects:  | default = true ]
    +[ follow_redirects:  | default = true ]
     
     # Whether to enable HTTP2.
    -  [ enable_http2:  | default: true ]
    +[ enable_http2:  | default: true ]
     
     # TLS configuration.
     tls_config:
       [  ]
     
     # The port to scrape metrics from.
    -  [ port:  | default = 80 ]
    +[ port:  | default = 80 ]
     
     # The time after which the instances are refreshed.
    -  [ refresh_interval:  | default = 60s ]
    +[ refresh_interval:  | default = 60s ]
     ```
     
     
    
    From 1afe72f0afc29f638371a3a3243455a0150323ff Mon Sep 17 00:00:00 2001
    From: Julien Pivotto 
    Date: Tue, 24 May 2022 18:19:05 +0200
    Subject: [PATCH 075/135] vultr: ram is in mb, not bytes
    
    Signed-off-by: Julien Pivotto 
    ---
     discovery/vultr/vultr.go            | 2 +-
     discovery/vultr/vultr_test.go       | 6 +++---
     docs/configuration/configuration.md | 2 +-
     3 files changed, 5 insertions(+), 5 deletions(-)
    
    diff --git a/discovery/vultr/vultr.go b/discovery/vultr/vultr.go
    index 5c26c5d31d6..2f489e7d45f 100644
    --- a/discovery/vultr/vultr.go
    +++ b/discovery/vultr/vultr.go
    @@ -49,7 +49,7 @@ const (
     	vultrInstanceLabelHostname     = vultrInstanceLabel + "hostname"
     	vultrInstanceLabelServerStatus = vultrInstanceLabel + "server_status"
     	vultrInstanceLabelVCPU         = vultrInstanceLabel + "vcpu_count"
    -	vultrInstanceLabelMemory       = vultrInstanceLabel + "ram_bytes"
    +	vultrInstanceLabelMemory       = vultrInstanceLabel + "ram_mb"
     	vultrInstanceLabelBandwidth    = vultrInstanceLabel + "allowed_bandwidth_gb"
     	vultrInstanceLabelDisk         = vultrInstanceLabel + "disk_gb"
     	separator                      = ","
    diff --git a/discovery/vultr/vultr_test.go b/discovery/vultr/vultr_test.go
    index 272accbc2fe..b7295415314 100644
    --- a/discovery/vultr/vultr_test.go
    +++ b/discovery/vultr/vultr_test.go
    @@ -80,7 +80,7 @@ func TestVultrSDRefresh(t *testing.T) {
     			"__meta_vultr_instance_hostname":             model.LabelValue("np-2-eae38a19b0f3"),
     			"__meta_vultr_instance_server_status":        model.LabelValue("ok"),
     			"__meta_vultr_instance_vcpu_count":           model.LabelValue("2"),
    -			"__meta_vultr_instance_ram_bytes":            model.LabelValue("4096"),
    +			"__meta_vultr_instance_ram_mb":               model.LabelValue("4096"),
     			"__meta_vultr_instance_disk_gb":              model.LabelValue("128"),
     			"__meta_vultr_instance_allowed_bandwidth_gb": model.LabelValue("3000"),
     		},
    @@ -98,7 +98,7 @@ func TestVultrSDRefresh(t *testing.T) {
     			"__meta_vultr_instance_hostname":             model.LabelValue("np-2-fd0714b5fe42"),
     			"__meta_vultr_instance_server_status":        model.LabelValue("ok"),
     			"__meta_vultr_instance_vcpu_count":           model.LabelValue("2"),
    -			"__meta_vultr_instance_ram_bytes":            model.LabelValue("4096"),
    +			"__meta_vultr_instance_ram_mb":               model.LabelValue("4096"),
     			"__meta_vultr_instance_disk_gb":              model.LabelValue("128"),
     			"__meta_vultr_instance_allowed_bandwidth_gb": model.LabelValue("3000"),
     		},
    @@ -116,7 +116,7 @@ func TestVultrSDRefresh(t *testing.T) {
     			"__meta_vultr_instance_hostname":             model.LabelValue("np-2-d04e7829fa43"),
     			"__meta_vultr_instance_server_status":        model.LabelValue("ok"),
     			"__meta_vultr_instance_vcpu_count":           model.LabelValue("2"),
    -			"__meta_vultr_instance_ram_bytes":            model.LabelValue("4096"),
    +			"__meta_vultr_instance_ram_mb":               model.LabelValue("4096"),
     			"__meta_vultr_instance_disk_gb":              model.LabelValue("128"),
     			"__meta_vultr_instance_allowed_bandwidth_gb": model.LabelValue("3000"),
     		},
    diff --git a/docs/configuration/configuration.md b/docs/configuration/configuration.md
    index 3ceee1acb4b..4dd8209eb4a 100644
    --- a/docs/configuration/configuration.md
    +++ b/docs/configuration/configuration.md
    @@ -2562,7 +2562,7 @@ The following meta labels are available on targets during [relabeling](#relabel_
     * `__meta_vultr_instance_hostname` : The hostname for this instance.
     * `__meta_vultr_instance_server_status` : The server health status.
     * `__meta_vultr_instance_vcpu_count` : Number of vCPUs.
    -* `__meta_vultr_instance_ram_bytes` : The amount of RAM in MB.
    +* `__meta_vultr_instance_ram_mb` : The amount of RAM in MB.
     * `__meta_vultr_instance_disk_gb` : The size of the disk in GB.
     * `__meta_vultr_instance_allowed_bandwidth_gb` : Monthly bandwidth quota in GB.
     
    
    From b532be625233a046fe88defbd7fc91c049bd772e Mon Sep 17 00:00:00 2001
    From: SuperQ 
    Date: Thu, 6 Jan 2022 17:17:17 +0100
    Subject: [PATCH 076/135] Update release documentation
    
    Update the release documentation about dependencies.
    * We now have dependabot to auto-update things.
    * Add note about some manual dependency work.
    
    Signed-off-by: SuperQ 
    ---
     RELEASE.md | 11 ++++++++---
     1 file changed, 8 insertions(+), 3 deletions(-)
    
    diff --git a/RELEASE.md b/RELEASE.md
    index 8a2395a5391..077dabe4769 100644
    --- a/RELEASE.md
    +++ b/RELEASE.md
    @@ -80,7 +80,10 @@ Maintaining the release branches for older minor releases happens on a best effo
     
     A few days before a major or minor release, consider updating the dependencies.
     
    -Then create a pull request against the main branch.
    +Note that we use [Dependabot](.github/dependabot.yml) to continuously update most things automatically. Therefore, most dependencies should be up to date.
    +Check the [dependencies GitHub label](https://github.com/prometheus/prometheus/labels/dependencies) to see if there are any pending updates.
    +
    +This bot currently does not manage `+incompatible` and `v0.0.0` in the version specifier for Go modules.
     
     Note that after a dependency update, you should look out for any weirdness that
     might have happened. Such weirdnesses include but are not limited to: flaky
    @@ -95,7 +98,9 @@ This is also a good time to consider any experimental features and feature
     flags for promotion to stable or for deprecation or ultimately removal. Do any
     of these in pull requests, one per feature.
     
    -#### Updating Go dependencies
    +#### Manually updating Go dependencies
    +
    +This is usually only needed for `+incompatible` and `v0.0.0` non-semver updates.
     
     ```bash
     make update-go-deps
    @@ -103,7 +108,7 @@ git add go.mod go.sum
     git commit -m "Update dependencies"
     ```
     
    -#### Updating React dependencies
    +#### Manually updating React dependencies
     
     The React application recently moved to a monorepo system with multiple internal npm packages. Dependency upgrades are
     quite sensitive for the time being.
    
    From 4ac961c040919ec9f5e61a31e1e84b37e293e57f Mon Sep 17 00:00:00 2001
    From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
    Date: Tue, 24 May 2022 16:40:04 +0000
    Subject: [PATCH 077/135] build(deps): bump google.golang.org/api from 0.77.0
     to 0.80.0
    
    Bumps [google.golang.org/api](https://github.com/googleapis/google-api-go-client) from 0.77.0 to 0.80.0.
    - [Release notes](https://github.com/googleapis/google-api-go-client/releases)
    - [Changelog](https://github.com/googleapis/google-api-go-client/blob/main/CHANGES.md)
    - [Commits](https://github.com/googleapis/google-api-go-client/compare/v0.77.0...v0.80.0)
    
    ---
    updated-dependencies:
    - dependency-name: google.golang.org/api
      dependency-type: direct:production
      update-type: version-update:semver-minor
    ...
    
    Signed-off-by: dependabot[bot] 
    ---
     go.mod | 2 +-
     go.sum | 7 +++++--
     2 files changed, 6 insertions(+), 3 deletions(-)
    
    diff --git a/go.mod b/go.mod
    index a8e907219d7..6bc71b471e4 100644
    --- a/go.mod
    +++ b/go.mod
    @@ -65,7 +65,7 @@ require (
     	golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a
     	golang.org/x/time v0.0.0-20220224211638-0e9765cccd65
     	golang.org/x/tools v0.1.10
    -	google.golang.org/api v0.77.0
    +	google.golang.org/api v0.80.0
     	google.golang.org/genproto v0.0.0-20220524023933-508584e28198
     	google.golang.org/grpc v1.46.2
     	google.golang.org/protobuf v1.28.0
    diff --git a/go.sum b/go.sum
    index db5ea94bfbb..eb68880e72c 100644
    --- a/go.sum
    +++ b/go.sum
    @@ -1005,6 +1005,7 @@ golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su
     golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
     golang.org/x/net v0.0.0-20220325170049-de3da57026de/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
     golang.org/x/net v0.0.0-20220412020605-290c469a71a5/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
    +golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
     golang.org/x/net v0.0.0-20220520000938-2e3eb7b945c2 h1:NWy5+hlRbC7HK+PmcXVUmW1IMyFce7to56IUvhUFm7Y=
     golang.org/x/net v0.0.0-20220520000938-2e3eb7b945c2/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
     golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
    @@ -1131,6 +1132,7 @@ golang.org/x/sys v0.0.0-20220227234510-4e6760a101f9/go.mod h1:oPkhp1MJrh7nUepCBc
     golang.org/x/sys v0.0.0-20220310020820-b874c991c1a5/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
     golang.org/x/sys v0.0.0-20220328115105-d36c6a25d886/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
     golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
    +golang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
     golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a h1:dGzPydgVsqGcTRVwiLJ1jVbufYwmzD3LfVPLKsKg+0k=
     golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
     golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw=
    @@ -1264,8 +1266,8 @@ google.golang.org/api v0.70.0/go.mod h1:Bs4ZM2HGifEvXwd50TtW70ovgJffJYw2oRCOFU/S
     google.golang.org/api v0.71.0/go.mod h1:4PyU6e6JogV1f9eA4voyrTY2batOLdgZ5qZ5HOCc4j8=
     google.golang.org/api v0.74.0/go.mod h1:ZpfMZOVRMywNyvJFeqL9HRWBgAuRfSjJFpe9QtRRyDs=
     google.golang.org/api v0.75.0/go.mod h1:pU9QmyHLnzlpar1Mjt4IbapUCy8J+6HD6GeELN69ljA=
    -google.golang.org/api v0.77.0 h1:msijLTxwkJ7Jub5tv9KBVCKtHOQwnvnvkX7ErFFCVxY=
    -google.golang.org/api v0.77.0/go.mod h1:pU9QmyHLnzlpar1Mjt4IbapUCy8J+6HD6GeELN69ljA=
    +google.golang.org/api v0.80.0 h1:IQWaGVCYnsm4MO3hh+WtSXMzMzuyFx/fuR8qkN3A0Qo=
    +google.golang.org/api v0.80.0/go.mod h1:xY3nI94gbvBrE0J6NHXhxOmW97HG7Khjkku6AFB3Hyg=
     google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
     google.golang.org/appengine v1.2.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
     google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
    @@ -1346,6 +1348,7 @@ google.golang.org/genproto v0.0.0-20220407144326-9054f6ed7bac/go.mod h1:8w6bsBMX
     google.golang.org/genproto v0.0.0-20220413183235-5e96e2839df9/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo=
     google.golang.org/genproto v0.0.0-20220414192740-2d67ff6cf2b4/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo=
     google.golang.org/genproto v0.0.0-20220421151946-72621c1f0bd3/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo=
    +google.golang.org/genproto v0.0.0-20220505152158-f39f71e6c8f3/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4=
     google.golang.org/genproto v0.0.0-20220519153652-3a47de7e79bd/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4=
     google.golang.org/genproto v0.0.0-20220524023933-508584e28198 h1:a1g7i05I2vUwq5eYrmxBJy6rPbw/yo7WzzwPJmcC0P4=
     google.golang.org/genproto v0.0.0-20220524023933-508584e28198/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4=
    
    From 6ee4b5211686ee288f269a566c1d6d002922f0a6 Mon Sep 17 00:00:00 2001
    From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
    Date: Tue, 24 May 2022 16:40:09 +0000
    Subject: [PATCH 078/135] build(deps): bump github.com/Azure/azure-sdk-for-go
    
    Bumps [github.com/Azure/azure-sdk-for-go](https://github.com/Azure/azure-sdk-for-go) from 63.0.0+incompatible to 65.0.0+incompatible.
    - [Release notes](https://github.com/Azure/azure-sdk-for-go/releases)
    - [Changelog](https://github.com/Azure/azure-sdk-for-go/blob/main/CHANGELOG.md)
    - [Commits](https://github.com/Azure/azure-sdk-for-go/compare/v63.0.0...v65.0.0)
    
    ---
    updated-dependencies:
    - dependency-name: github.com/Azure/azure-sdk-for-go
      dependency-type: direct:production
      update-type: version-update:semver-major
    ...
    
    Signed-off-by: dependabot[bot] 
    ---
     go.mod | 2 +-
     go.sum | 4 ++--
     2 files changed, 3 insertions(+), 3 deletions(-)
    
    diff --git a/go.mod b/go.mod
    index 6bc71b471e4..a5a13b7aaec 100644
    --- a/go.mod
    +++ b/go.mod
    @@ -3,7 +3,7 @@ module github.com/prometheus/prometheus
     go 1.17
     
     require (
    -	github.com/Azure/azure-sdk-for-go v63.0.0+incompatible
    +	github.com/Azure/azure-sdk-for-go v65.0.0+incompatible
     	github.com/Azure/go-autorest/autorest v0.11.27
     	github.com/Azure/go-autorest/autorest/adal v0.9.20
     	github.com/alecthomas/units v0.0.0-20211218093645-b94a6e3cc137
    diff --git a/go.sum b/go.sum
    index eb68880e72c..6b939336f38 100644
    --- a/go.sum
    +++ b/go.sum
    @@ -51,8 +51,8 @@ cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohl
     cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs=
     cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0=
     dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=
    -github.com/Azure/azure-sdk-for-go v63.0.0+incompatible h1:whPsa+jCHQSo5wGMPNLw4bz8q9Co2+vnXHzXGctoTaQ=
    -github.com/Azure/azure-sdk-for-go v63.0.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc=
    +github.com/Azure/azure-sdk-for-go v65.0.0+incompatible h1:HzKLt3kIwMm4KeJYTdx9EbjRYTySD/t8i1Ee/W5EGXw=
    +github.com/Azure/azure-sdk-for-go v65.0.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc=
     github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 h1:UQHMgLO+TxOElx5B5HZ4hJQsoJ/PvUvKRhJHDQXO8P8=
     github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E=
     github.com/Azure/go-autorest v14.2.0+incompatible h1:V5VMDjClD3GiElqLWO7mz2MxNAK/vTfRHdAubSIPRgs=
    
    From 3a56817a30688ae37d3588369605390909874634 Mon Sep 17 00:00:00 2001
    From: Julien Pivotto 
    Date: Wed, 25 May 2022 10:06:17 +0200
    Subject: [PATCH 079/135] Rules: set otel status to ERROR when a rule fails
     (#10745)
    
    Signed-off-by: Julien Pivotto 
    ---
     rules/manager.go | 4 ++++
     1 file changed, 4 insertions(+)
    
    diff --git a/rules/manager.go b/rules/manager.go
    index f8e88b510de..4fdc1357962 100644
    --- a/rules/manager.go
    +++ b/rules/manager.go
    @@ -28,6 +28,7 @@ import (
     	"github.com/prometheus/common/model"
     	"go.opentelemetry.io/otel"
     	"go.opentelemetry.io/otel/attribute"
    +	"go.opentelemetry.io/otel/codes"
     
     	"github.com/prometheus/prometheus/model/labels"
     	"github.com/prometheus/prometheus/model/rulefmt"
    @@ -624,6 +625,7 @@ func (g *Group) Eval(ctx context.Context, ts time.Time) {
     			if err != nil {
     				rule.SetHealth(HealthBad)
     				rule.SetLastError(err)
    +				sp.SetStatus(codes.Error, err.Error())
     				g.metrics.EvalFailures.WithLabelValues(GroupKey(g.File(), g.Name())).Inc()
     
     				// Canceled queries are intentional termination of queries. This normally
    @@ -651,6 +653,7 @@ func (g *Group) Eval(ctx context.Context, ts time.Time) {
     				if err := app.Commit(); err != nil {
     					rule.SetHealth(HealthBad)
     					rule.SetLastError(err)
    +					sp.SetStatus(codes.Error, err.Error())
     					g.metrics.EvalFailures.WithLabelValues(GroupKey(g.File(), g.Name())).Inc()
     
     					level.Warn(g.logger).Log("name", rule.Name(), "index", i, "msg", "Rule sample appending failed", "err", err)
    @@ -663,6 +666,7 @@ func (g *Group) Eval(ctx context.Context, ts time.Time) {
     				if _, err := app.Append(0, s.Metric, s.T, s.V); err != nil {
     					rule.SetHealth(HealthBad)
     					rule.SetLastError(err)
    +					sp.SetStatus(codes.Error, err.Error())
     
     					switch errors.Cause(err) {
     					case storage.ErrOutOfOrderSample:
    
    From d3cb39044e7e2e49888c102b6afaf34cabb75a51 Mon Sep 17 00:00:00 2001
    From: Filip Petkovski 
    Date: Wed, 25 May 2022 10:40:36 +0200
    Subject: [PATCH 080/135] Fix typo in symbol table size exceeded error message
     (#10746)
    
    This commit fixes a typo when reporting an error that the the symbols
    table size has been exceeded.
    
    Signed-off-by: Filip Petkovski 
    ---
     tsdb/index/index.go | 2 +-
     1 file changed, 1 insertion(+), 1 deletion(-)
    
    diff --git a/tsdb/index/index.go b/tsdb/index/index.go
    index fc1faf5eefd..29295c45f54 100644
    --- a/tsdb/index/index.go
    +++ b/tsdb/index/index.go
    @@ -526,7 +526,7 @@ func (w *Writer) finishSymbols() error {
     	symbolTableSize := w.f.pos - w.toc.Symbols - 4
     	// The symbol table's  part is 4 bytes. So the total symbol table size must be less than or equal to 2^32-1
     	if symbolTableSize > math.MaxUint32 {
    -		return errors.Errorf("symbol table size exceeds 4 bytes: %d", symbolTableSize)
    +		return errors.Errorf("symbol table size exceeds %d bytes: %d", uint32(math.MaxUint32), symbolTableSize)
     	}
     
     	// Write out the length and symbol count.
    
    From 34820f54053d1e6213ea1ded5f8b307e28638c5a Mon Sep 17 00:00:00 2001
    From: Matthias Loibl 
    Date: Wed, 25 May 2022 11:33:46 +0200
    Subject: [PATCH 081/135] Update CHANGELOG for v2.36
    
    Signed-off-by: Matthias Loibl 
    ---
     CHANGELOG.md | 18 ++++++++++++++++++
     VERSION      |  2 +-
     2 files changed, 19 insertions(+), 1 deletion(-)
    
    diff --git a/CHANGELOG.md b/CHANGELOG.md
    index 5f061dcbe5e..24cc5766f6b 100644
    --- a/CHANGELOG.md
    +++ b/CHANGELOG.md
    @@ -1,5 +1,23 @@
     # Changelog
     
    +## 2.36.0-rc0 / 2022-05-25
    +
    +This Prometheus release uses go 1.18 and needs at least go1.17 going forward.
    +
    +* [FEATURE] Add lowercase and uppercase relabel action. #10641
    +* [FEATURE] SD: Add IONOS Cloud integration. #10514
    +* [FEATURE] SD: Add Vultr integration. #10714
    +* [FEATURE] SD: Add Linode SD failure count metric. #10673
    +* [FEATURE] Add prometheus_ready metric. #10682
    +* [ENHANCEMENT] Add stripDomain to template function. #10475
    +* [ENHANCEMENT] UI: Enable active search through dropped targets. #10668
    +* [ENHANCEMENT] promtool: support matchers when querying label values. #10727
    +* [ENHANCEMENT] Add agent mode identifier. #9638
    +* [BUGFIX] Changing TotalQueryableSamples from int to int64. #10549
    +* [BUGFIX] tsdb/agent: Ignore duplicate exemplars. #10595
    +* [BUGFIX] TSDB: Fix chunk overflow appending samples at a variable rate. #10607
    +* [BUGFIX] Stop rule manager before TSDB is stopped. #10680
    +
     ## 2.35.0 / 2022-04-21
     
     This Prometheus release is built with go1.18, which contains two noticeable changes related to TLS:
    diff --git a/VERSION b/VERSION
    index aa5388f6376..ca754a232b8 100644
    --- a/VERSION
    +++ b/VERSION
    @@ -1 +1 @@
    -2.35.0
    +2.36.0-rc0
    
    From 08262454a3b6045734b271c2505ad89834a5c40a Mon Sep 17 00:00:00 2001
    From: =?UTF-8?q?=C5=81ukasz=20Mierzwa?= 
    Date: Wed, 25 May 2022 15:22:47 +0100
    Subject: [PATCH 082/135] Preallocate Labels in labels.Builder (#10749)
    MIME-Version: 1.0
    Content-Type: text/plain; charset=UTF-8
    Content-Transfer-Encoding: 8bit
    
    This tries to avoid re-allocations of labels slice since we know possible max size
    
    Signed-off-by: Łukasz Mierzwa 
    ---
     model/labels/labels.go |  4 ++--
     promql/engine_test.go  | 36 +++++++++++++++++++-----------------
     2 files changed, 21 insertions(+), 19 deletions(-)
    
    diff --git a/model/labels/labels.go b/model/labels/labels.go
    index 34bb878d189..af321a37c61 100644
    --- a/model/labels/labels.go
    +++ b/model/labels/labels.go
    @@ -349,7 +349,7 @@ func FromStrings(ss ...string) Labels {
     	if len(ss)%2 != 0 {
     		panic("invalid number of strings")
     	}
    -	var res Labels
    +	res := make(Labels, 0, len(ss)/2)
     	for i := 0; i < len(ss); i += 2 {
     		res = append(res, Label{Name: ss[i], Value: ss[i+1]})
     	}
    @@ -452,7 +452,7 @@ func (b *Builder) Labels() Labels {
     
     	// In the general case, labels are removed, modified or moved
     	// rather than added.
    -	res := make(Labels, 0, len(b.base))
    +	res := make(Labels, 0, len(b.base)+len(b.add))
     Outer:
     	for _, l := range b.base {
     		for _, n := range b.del {
    diff --git a/promql/engine_test.go b/promql/engine_test.go
    index c34caa4bcfe..201676b4338 100644
    --- a/promql/engine_test.go
    +++ b/promql/engine_test.go
    @@ -16,6 +16,7 @@ package promql
     import (
     	"context"
     	"errors"
    +	"fmt"
     	"os"
     	"sort"
     	"testing"
    @@ -680,7 +681,6 @@ load 10s
     			Result: Matrix{
     				Series{
     					Points: []Point{{V: 1, T: 0}, {V: 1, T: 1000}, {V: 1, T: 2000}},
    -					Metric: labels.FromStrings(),
     				},
     			},
     			Start:    time.Unix(0, 0),
    @@ -717,24 +717,26 @@ load 10s
     		},
     	}
     
    -	for _, c := range cases {
    -		var err error
    -		var qry Query
    -		if c.Interval == 0 {
    -			qry, err = test.QueryEngine().NewInstantQuery(test.Queryable(), nil, c.Query, c.Start)
    -		} else {
    -			qry, err = test.QueryEngine().NewRangeQuery(test.Queryable(), nil, c.Query, c.Start, c.End, c.Interval)
    -		}
    -		require.NoError(t, err)
    +	for i, c := range cases {
    +		t.Run(fmt.Sprintf("%d query=%s", i, c.Query), func(t *testing.T) {
    +			var err error
    +			var qry Query
    +			if c.Interval == 0 {
    +				qry, err = test.QueryEngine().NewInstantQuery(test.Queryable(), nil, c.Query, c.Start)
    +			} else {
    +				qry, err = test.QueryEngine().NewRangeQuery(test.Queryable(), nil, c.Query, c.Start, c.End, c.Interval)
    +			}
    +			require.NoError(t, err)
     
    -		res := qry.Exec(test.Context())
    -		if c.ShouldError {
    -			require.Error(t, res.Err, "expected error for the query %q", c.Query)
    -			continue
    -		}
    +			res := qry.Exec(test.Context())
    +			if c.ShouldError {
    +				require.Error(t, res.Err, "expected error for the query %q", c.Query)
    +				return
    +			}
     
    -		require.NoError(t, res.Err)
    -		require.Equal(t, c.Result, res.Value, "query %q failed", c.Query)
    +			require.NoError(t, res.Err)
    +			require.Equal(t, c.Result, res.Value, "query %q failed", c.Query)
    +		})
     	}
     }
     
    
    From 10b677b826cf50170013be7d214c659f52800e81 Mon Sep 17 00:00:00 2001
    From: maizige <37949155+wsx864321@users.noreply.github.com>
    Date: Thu, 26 May 2022 00:01:45 +0800
    Subject: [PATCH 083/135] fix typo (#10696)
    
    Update doc comment
    
    Signed-off-by: gemaizi <864321211@qq.com>
    ---
     tsdb/block.go | 4 ++--
     1 file changed, 2 insertions(+), 2 deletions(-)
    
    diff --git a/tsdb/block.go b/tsdb/block.go
    index 38ed0635365..6b8b65dda7a 100644
    --- a/tsdb/block.go
    +++ b/tsdb/block.go
    @@ -40,8 +40,8 @@ import (
     // IndexWriter serializes the index for a block of series data.
     // The methods must be called in the order they are specified in.
     type IndexWriter interface {
    -	// AddSymbols registers all string symbols that are encountered in series
    -	// and other indices. Symbols must be added in sorted order.
    +	// AddSymbol registers a single symbol.
    +	// Symbols must be registered in sorted order.
     	AddSymbol(sym string) error
     
     	// AddSeries populates the index writer with a series and its offsets
    
    From 0505ba81e18069e4c1d4af8e2153cd143dd1eb4e Mon Sep 17 00:00:00 2001
    From: Ryan Lonergan 
    Date: Wed, 25 May 2022 16:46:02 -0400
    Subject: [PATCH 084/135] =?UTF-8?q?Fixed=20spacing=20causing=20"field=20cr?=
     =?UTF-8?q?edentials=20not=20found=20in=20type=20linode.plain=E2=80=9D=20e?=
     =?UTF-8?q?rror=20(#10752)?=
    MIME-Version: 1.0
    Content-Type: text/plain; charset=UTF-8
    Content-Transfer-Encoding: 8bit
    
    Signed-off-by: Ryan Lonergan 
    
    Co-authored-by: Ryan Lonergan 
    ---
     documentation/examples/prometheus-linode.yml | 2 +-
     1 file changed, 1 insertion(+), 1 deletion(-)
    
    diff --git a/documentation/examples/prometheus-linode.yml b/documentation/examples/prometheus-linode.yml
    index a19b2c3a854..993b6a5c12f 100644
    --- a/documentation/examples/prometheus-linode.yml
    +++ b/documentation/examples/prometheus-linode.yml
    @@ -11,7 +11,7 @@ scrape_configs:
       - job_name: "node"
         linode_sd_configs:
           - authorization:
    -        credentials: ""
    +          credentials: ""
         relabel_configs:
           # Only scrape targets that have a tag 'monitoring'.
           - source_labels: [__meta_linode_tags]
    
    From fba3e847dc5ef8dea7cc8e38fba16fa544b2ba30 Mon Sep 17 00:00:00 2001
    From: David Leadbeater 
    Date: Thu, 26 May 2022 18:17:21 +1000
    Subject: [PATCH 085/135] Check syntax of example configurations (#10753)
    
    * Check syntax of example configurations
    
    Fix a mistake in the hetzner and vultr configs.
    
    Also it's easier not to fight the build system, and this will lint
    example code, so ignore a lint issue in custom-sd.
    
    Signed-off-by: David Leadbeater 
    
    * No need to import Makefile.common, it just complicates things
    
    Signed-off-by: David Leadbeater 
    ---
     .circleci/config.yml                          |  1 +
     documentation/examples/Makefile               | 20 +++++++++++++++++++
     .../examples/custom-sd/adapter/adapter.go     |  1 +
     documentation/examples/prometheus-hetzner.yml |  6 +++---
     documentation/examples/prometheus-vultr.yml   |  2 +-
     5 files changed, 26 insertions(+), 4 deletions(-)
     create mode 100644 documentation/examples/Makefile
    
    diff --git a/.circleci/config.yml b/.circleci/config.yml
    index 5bbeecedf53..d6fd0875583 100644
    --- a/.circleci/config.yml
    +++ b/.circleci/config.yml
    @@ -38,6 +38,7 @@ jobs:
                 GO111MODULE: "on"
           - run: go test ./tsdb/ -test.tsdb-isolation=false
           - run: make -C documentation/examples/remote_storage
    +      - run: make -C documentation/examples
           - prometheus/check_proto:
               version: "3.15.8"
           - prometheus/store_artifact:
    diff --git a/documentation/examples/Makefile b/documentation/examples/Makefile
    new file mode 100644
    index 00000000000..4085155f806
    --- /dev/null
    +++ b/documentation/examples/Makefile
    @@ -0,0 +1,20 @@
    +# Copyright 2022 The Prometheus Authors
    +# 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.
    +
    +.PHONY: all
    +all: check-examples-syntax
    +
    +.PHONY: check-examples-syntax
    +check-examples-syntax: prometheus-*.yml
    +	@echo ">> check example configurations syntax"
    +	@set -e; for file in $^; do ../../promtool check config --syntax-only $$file; done
    diff --git a/documentation/examples/custom-sd/adapter/adapter.go b/documentation/examples/custom-sd/adapter/adapter.go
    index b0ed5ab9aa0..57c32ce4928 100644
    --- a/documentation/examples/custom-sd/adapter/adapter.go
    +++ b/documentation/examples/custom-sd/adapter/adapter.go
    @@ -155,6 +155,7 @@ func (a *Adapter) runCustomSD(ctx context.Context) {
     
     // Run starts a Discovery Manager and the custom service discovery implementation.
     func (a *Adapter) Run() {
    +	//nolint:errcheck
     	go a.manager.Run()
     	a.manager.StartCustomProvider(a.ctx, a.name, a.disc)
     	go a.runCustomSD(a.ctx)
    diff --git a/documentation/examples/prometheus-hetzner.yml b/documentation/examples/prometheus-hetzner.yml
    index ccc1ffc287f..1638efab699 100644
    --- a/documentation/examples/prometheus-hetzner.yml
    +++ b/documentation/examples/prometheus-hetzner.yml
    @@ -13,7 +13,7 @@ scrape_configs:
         hetzner_sd_configs:
           - authorization:
               credentials: ""
    -        platform: "hcloud"
    +        role: "hcloud"
         relabel_configs:
           # Use the public IPv4 and port 9100 to scrape the target.
           - source_labels: [__meta_hetzner_public_ipv4]
    @@ -26,7 +26,7 @@ scrape_configs:
         hetzner_sd_configs:
           - authorization:
               credentials: ""
    -        platform: "hcloud"
    +        role: "hcloud"
         relabel_configs:
           # Use the private IPv4 within the Hetzner Cloud Network and port 9100 to scrape the target.
           - source_labels: [__meta_hetzner_hcloud_private_ipv4_mynet]
    @@ -40,7 +40,7 @@ scrape_configs:
           - basic_auth:
               username: ""
               password: ""
    -        platform: "robot"
    +        role: "robot"
         relabel_configs:
           # Use the public IPv4 and port 9100 to scrape the target.
           - source_labels: [__meta_hetzner_public_ipv4]
    diff --git a/documentation/examples/prometheus-vultr.yml b/documentation/examples/prometheus-vultr.yml
    index 5370c363171..1b2e8ff8c8e 100644
    --- a/documentation/examples/prometheus-vultr.yml
    +++ b/documentation/examples/prometheus-vultr.yml
    @@ -11,7 +11,7 @@ scrape_configs:
       - job_name: "node"
         vultr_sd_configs:
           - authorization:
    -        credentials: ""
    +          credentials: ""
         relabel_configs:
           # Only scrape targets that have a tag 'monitoring'.
           - source_labels: [__meta_vultr_instance_tags]
    
    From 57f4aab27d53872b109c8513846765df6b51eb57 Mon Sep 17 00:00:00 2001
    From: David Leadbeater 
    Date: Thu, 26 May 2022 18:34:43 +1000
    Subject: [PATCH 086/135] Update godoc links and remove note about TSDB
     versioning (#10754)
    
    Signed-off-by: David Leadbeater 
    ---
     discovery/README.md |  2 +-
     tsdb/README.md      |  5 +----
     tsdb/docs/refs.md   |  4 ++--
     tsdb/docs/usage.md  | 24 ++++++++++++------------
     4 files changed, 16 insertions(+), 19 deletions(-)
    
    diff --git a/discovery/README.md b/discovery/README.md
    index 8854981a041..19b579b3998 100644
    --- a/discovery/README.md
    +++ b/discovery/README.md
    @@ -131,7 +131,7 @@ the Prometheus server will be able to see them.
     
     ### The SD interface
     
    -A Service Discovery (SD) mechanism has to discover targets and provide them to Prometheus. We expect similar targets to be grouped together, in the form of a [target group](https://pkg.go.dev/github.com/prometheus/prometheus@v1.8.2-0.20211105201321-411021ada9ab/discovery/targetgroup#Group). The SD mechanism sends the targets down to prometheus as list of target groups.
    +A Service Discovery (SD) mechanism has to discover targets and provide them to Prometheus. We expect similar targets to be grouped together, in the form of a [target group](https://pkg.go.dev/github.com/prometheus/prometheus/discovery/targetgroup#Group). The SD mechanism sends the targets down to prometheus as list of target groups.
     
     An SD mechanism has to implement the `Discoverer` Interface:
     ```go
    diff --git a/tsdb/README.md b/tsdb/README.md
    index a8dfdc5406b..ad9354586cd 100644
    --- a/tsdb/README.md
    +++ b/tsdb/README.md
    @@ -1,13 +1,10 @@
     # TSDB 
     
    -[![GoPkg](https://pkg.go.dev/badge/github.com/prometheus/prometheus/tsdb.svg)](https://pkg.go.dev/github.com/prometheus/prometheus@v1.8.2-0.20211105201321-411021ada9ab/tsdb)
    +[![GoPkg](https://pkg.go.dev/badge/github.com/prometheus/prometheus/tsdb.svg)](https://pkg.go.dev/github.com/prometheus/prometheus/tsdb)
     
     This directory contains the Prometheus TSDB (Time Series DataBase) library,
     which handles storage and querying of all Prometheus v2 data.
     
    -Due to an issue with versioning, the "latest" docs shown on Godoc are outdated.
    -Instead you may use [the docs for v2.31.1](https://pkg.go.dev/github.com/prometheus/prometheus@v1.8.2-0.20211105201321-411021ada9ab)
    -
     ## Documentation
     
     * [Data format](docs/format/README.md).
    diff --git a/tsdb/docs/refs.md b/tsdb/docs/refs.md
    index b070b5c7a3e..058f943da90 100644
    --- a/tsdb/docs/refs.md
    +++ b/tsdb/docs/refs.md
    @@ -84,8 +84,8 @@ The `ChunkRef` types allow retrieving the chunk data as efficiently as possible.
     
     ## Used internally in TSDB
     
    -* [`HeadChunkID`](https://pkg.go.dev/github.com/prometheus/prometheus@v1.8.2-0.20211105201321-411021ada9ab/tsdb/chunks#HeadChunkID) references a chunk of a `memSeries` (either an `mmappedChunk` or `headChunk`).
    +* [`HeadChunkID`](https://pkg.go.dev/github.com/prometheus/prometheus/tsdb/chunks#HeadChunkID) references a chunk of a `memSeries` (either an `mmappedChunk` or `headChunk`).
       If a caller has, for whatever reason, an "old" `HeadChunkID` that refers to a chunk that has been compacted into a block, querying the memSeries for it will not return any data.
    -* [`ChunkDiskMapperRef`](https://pkg.go.dev/github.com/prometheus/prometheus@v1.8.2-0.20211105201321-411021ada9ab/tsdb/chunks#ChunkDiskMapperRef) is an 8 Byte integer.
    +* [`ChunkDiskMapperRef`](https://pkg.go.dev/github.com/prometheus/prometheus/tsdb/chunks#ChunkDiskMapperRef) is an 8 Byte integer.
       4 Bytes are used to refer to a chunks file number and 4 bytes serve as byte offset (similar to `BlockChunkRef`).  `mmappedChunk` provide this value such that callers can load the mmapped chunk from disk.
     
    diff --git a/tsdb/docs/usage.md b/tsdb/docs/usage.md
    index 600973089b6..e70b248137c 100644
    --- a/tsdb/docs/usage.md
    +++ b/tsdb/docs/usage.md
    @@ -3,24 +3,24 @@
     TSDB can be - and is - used by other applications such as [Cortex](https://cortexmetrics.io/) and [Thanos](https://thanos.io/).
     This directory contains documentation for any developers who wish to work on or with TSDB.
     
    -For a full example of instantiating a database, adding and querying data, see the [tsdb example in the docs](https://pkg.go.dev/github.com/prometheus/prometheus@v1.8.2-0.20211105201321-411021ada9ab/tsdb).
    +For a full example of instantiating a database, adding and querying data, see the [tsdb example in the docs](https://pkg.go.dev/github.com/prometheus/prometheus/tsdb).
     `tsdb/db_test.go` also demonstrates various specific usages of the TSDB library.
     
     ## Instantiating a database
     
    -Callers should use [`tsdb.Open`](https://pkg.go.dev/github.com/prometheus/prometheus@v1.8.2-0.20211105201321-411021ada9ab/tsdb#Open) to open a TSDB
    +Callers should use [`tsdb.Open`](https://pkg.go.dev/github.com/prometheus/prometheus/tsdb#Open) to open a TSDB
     (the directory may be new or pre-existing).
    -This returns a [`*tsdb.DB`](https://pkg.go.dev/github.com/prometheus/prometheus@v1.8.2-0.20211105201321-411021ada9ab/tsdb#DB) which is the actual database.
    +This returns a [`*tsdb.DB`](https://pkg.go.dev/github.com/prometheus/prometheus/tsdb#DB) which is the actual database.
     
     A `DB` has the following main components:
     
    -* Compactor: a [leveled compactor](https://pkg.go.dev/github.com/prometheus/prometheus@v1.8.2-0.20211105201321-411021ada9ab/tsdb#LeveledCompactor). Note: it is currently the only compactor implementation. It runs automatically.
    -* [`Head`](https://pkg.go.dev/github.com/prometheus/prometheus@v1.8.2-0.20211105201321-411021ada9ab/tsdb#DB.Head)
    -* [Blocks (persistent blocks)](https://pkg.go.dev/github.com/prometheus/prometheus@v1.8.2-0.20211105201321-411021ada9ab/tsdb#DB.Blocks)
    +* Compactor: a [leveled compactor](https://pkg.go.dev/github.com/prometheus/prometheus/tsdb#LeveledCompactor). Note: it is currently the only compactor implementation. It runs automatically.
    +* [`Head`](https://pkg.go.dev/github.com/prometheus/prometheus/tsdb#DB.Head)
    +* [Blocks (persistent blocks)](https://pkg.go.dev/github.com/prometheus/prometheus/tsdb#DB.Blocks)
     
     The `Head` is responsible for a lot.  Here are its main components:
     
    -* [WAL](https://pkg.go.dev/github.com/prometheus/prometheus@v1.8.2-0.20211105201321-411021ada9ab/tsdb/wal#WAL) (Write Ahead Log).
    +* [WAL](https://pkg.go.dev/github.com/prometheus/prometheus/tsdb/wal#WAL) (Write Ahead Log).
     * [`stripeSeries`](https://github.com/prometheus/prometheus/blob/411021ada9ab41095923b8d2df9365b632fd40c3/tsdb/head.go#L1292):
       this holds all the active series by linking to [`memSeries`](https://github.com/prometheus/prometheus/blob/411021ada9ab41095923b8d2df9365b632fd40c3/tsdb/head.go#L1462)
       by an ID (aka "ref") and by labels hash.
    @@ -29,8 +29,8 @@ The `Head` is responsible for a lot.  Here are its main components:
     
     ## Adding data
     
    -Use [`db.Appender()`](https://pkg.go.dev/github.com/prometheus/prometheus@v1.8.2-0.20211105201321-411021ada9ab/tsdb#DB.Appender) to obtain an "appender".
    -The [golang docs](https://pkg.go.dev/github.com/prometheus/prometheus@v1.8.2-0.20211105201321-411021ada9ab/storage#Appender) speak mostly for themselves.
    +Use [`db.Appender()`](https://pkg.go.dev/github.com/prometheus/prometheus/tsdb#DB.Appender) to obtain an "appender".
    +The [golang docs](https://pkg.go.dev/github.com/prometheus/prometheus/storage#Appender) speak mostly for themselves.
     
     Remember:
     
    @@ -43,7 +43,7 @@ Remember:
     Append may reject data due to these conditions:
     
     1) `timestamp < minValidTime` where `minValidTime` is the highest of:
    -  * the maxTime of the last block (i.e. the last truncation time of Head) - updated via [`Head.Truncate()`](https://pkg.go.dev/github.com/prometheus/prometheus@v1.8.2-0.20211105201321-411021ada9ab/tsdb#Head.Truncate) and [`DB.compactHead()`](https://github.com/prometheus/prometheus/blob/411021ada9ab41095923b8d2df9365b632fd40c3/tsdb/db.go#L968)
    +  * the maxTime of the last block (i.e. the last truncation time of Head) - updated via [`Head.Truncate()`](https://pkg.go.dev/github.com/prometheus/prometheus/tsdb#Head.Truncate) and [`DB.compactHead()`](https://github.com/prometheus/prometheus/blob/411021ada9ab41095923b8d2df9365b632fd40c3/tsdb/db.go#L968)
       * `tsdb.min-block-duration/2` older than the max time in the Head block. Note that while technically `storage.tsdb.min-block-duration` is configurable, it's a hidden option and changing it is discouraged.  So We can assume this value to be 2h.
     
       Breaching this condition results in "out of bounds" errors.  
    @@ -56,8 +56,8 @@ Append may reject data due to these conditions:
     
     ## Querying data
     
    -Use [`db.Querier()`](https://pkg.go.dev/github.com/prometheus/prometheus@v1.8.2-0.20211105201321-411021ada9ab/tsdb#DB.Querier) to obtain a "querier".
    -The [golang docs](https://pkg.go.dev/github.com/prometheus/prometheus@v1.8.2-0.20211105201321-411021ada9ab/storage#Querier) speak mostly for themselves.
    +Use [`db.Querier()`](https://pkg.go.dev/github.com/prometheus/prometheus/tsdb#DB.Querier) to obtain a "querier".
    +The [golang docs](https://pkg.go.dev/github.com/prometheus/prometheus/storage#Querier) speak mostly for themselves.
     
     Remember:
     
    
    From 4dc148113ec98adca70b68b994150abc0c416fb2 Mon Sep 17 00:00:00 2001
    From: Matthias Loibl 
    Date: Mon, 30 May 2022 15:16:57 +0200
    Subject: [PATCH 087/135] Cut v2.36.0
    
    Signed-off-by: Matthias Loibl 
    ---
     CHANGELOG.md | 2 +-
     VERSION      | 2 +-
     2 files changed, 2 insertions(+), 2 deletions(-)
    
    diff --git a/CHANGELOG.md b/CHANGELOG.md
    index 24cc5766f6b..2fc1a8bae7a 100644
    --- a/CHANGELOG.md
    +++ b/CHANGELOG.md
    @@ -1,6 +1,6 @@
     # Changelog
     
    -## 2.36.0-rc0 / 2022-05-25
    +## 2.36.0 / 2022-05-30
     
     This Prometheus release uses go 1.18 and needs at least go1.17 going forward.
     
    diff --git a/VERSION b/VERSION
    index ca754a232b8..3a05135cd86 100644
    --- a/VERSION
    +++ b/VERSION
    @@ -1 +1 @@
    -2.36.0-rc0
    +2.36.0
    
    From 1dd247f68bb1612469e703f1c363fe70597b0be2 Mon Sep 17 00:00:00 2001
    From: Matej Gera <38492574+matej-g@users.noreply.github.com>
    Date: Tue, 31 May 2022 06:45:30 +0200
    Subject: [PATCH 088/135] Remote Write: Rename confusing `walDir` parameter to
     `dir` (#10464)
    
    * Rename walDir parameter to dir
    
    Signed-off-by: Matej Gera 
    
    * Improve NewQueueManager comment
    
    Signed-off-by: Matej Gera 
    ---
     storage/remote/queue_manager.go | 10 +++++++---
     storage/remote/write.go         |  8 ++++----
     tsdb/wal/watcher.go             |  4 ++--
     3 files changed, 13 insertions(+), 9 deletions(-)
    
    diff --git a/storage/remote/queue_manager.go b/storage/remote/queue_manager.go
    index 46bd7e1ff22..420a2d11ae2 100644
    --- a/storage/remote/queue_manager.go
    +++ b/storage/remote/queue_manager.go
    @@ -374,13 +374,17 @@ type QueueManager struct {
     	highestRecvTimestamp *maxTimestamp
     }
     
    -// NewQueueManager builds a new QueueManager.
    +// NewQueueManager builds a new QueueManager and starts a new
    +// WAL watcher with queue manager as the WriteTo destination.
    +// The WAL watcher takes the dir parameter as the base directory
    +// for where the WAL shall be located. Note that the full path to
    +// the WAL directory will be constructed as /wal.
     func NewQueueManager(
     	metrics *queueManagerMetrics,
     	watcherMetrics *wal.WatcherMetrics,
     	readerMetrics *wal.LiveReaderMetrics,
     	logger log.Logger,
    -	walDir string,
    +	dir string,
     	samplesIn *ewmaRate,
     	cfg config.QueueConfig,
     	mCfg config.MetadataConfig,
    @@ -426,7 +430,7 @@ func NewQueueManager(
     		highestRecvTimestamp: highestRecvTimestamp,
     	}
     
    -	t.watcher = wal.NewWatcher(watcherMetrics, readerMetrics, logger, client.Name(), t, walDir, enableExemplarRemoteWrite)
    +	t.watcher = wal.NewWatcher(watcherMetrics, readerMetrics, logger, client.Name(), t, dir, enableExemplarRemoteWrite)
     	if t.mcfg.Send {
     		t.metadataWatcher = NewMetadataWatcher(logger, sm, client.Name(), t, t.mcfg.SendInterval, flushDeadline)
     	}
    diff --git a/storage/remote/write.go b/storage/remote/write.go
    index bd330fe8b4b..a7399ee5325 100644
    --- a/storage/remote/write.go
    +++ b/storage/remote/write.go
    @@ -55,7 +55,7 @@ type WriteStorage struct {
     	watcherMetrics    *wal.WatcherMetrics
     	liveReaderMetrics *wal.LiveReaderMetrics
     	externalLabels    labels.Labels
    -	walDir            string
    +	dir               string
     	queues            map[string]*QueueManager
     	samplesIn         *ewmaRate
     	flushDeadline     time.Duration
    @@ -68,7 +68,7 @@ type WriteStorage struct {
     }
     
     // NewWriteStorage creates and runs a WriteStorage.
    -func NewWriteStorage(logger log.Logger, reg prometheus.Registerer, walDir string, flushDeadline time.Duration, sm ReadyScrapeManager) *WriteStorage {
    +func NewWriteStorage(logger log.Logger, reg prometheus.Registerer, dir string, flushDeadline time.Duration, sm ReadyScrapeManager) *WriteStorage {
     	if logger == nil {
     		logger = log.NewNopLogger()
     	}
    @@ -80,7 +80,7 @@ func NewWriteStorage(logger log.Logger, reg prometheus.Registerer, walDir string
     		reg:               reg,
     		flushDeadline:     flushDeadline,
     		samplesIn:         newEWMARate(ewmaWeight, shardUpdateDuration),
    -		walDir:            walDir,
    +		dir:               dir,
     		interner:          newPool(),
     		scraper:           sm,
     		quit:              make(chan struct{}),
    @@ -175,7 +175,7 @@ func (rws *WriteStorage) ApplyConfig(conf *config.Config) error {
     			rws.watcherMetrics,
     			rws.liveReaderMetrics,
     			rws.logger,
    -			rws.walDir,
    +			rws.dir,
     			rws.samplesIn,
     			rwConf.QueueConfig,
     			rwConf.MetadataConfig,
    diff --git a/tsdb/wal/watcher.go b/tsdb/wal/watcher.go
    index cde9cfa5ff0..7b026b4ea8f 100644
    --- a/tsdb/wal/watcher.go
    +++ b/tsdb/wal/watcher.go
    @@ -144,7 +144,7 @@ func NewWatcherMetrics(reg prometheus.Registerer) *WatcherMetrics {
     }
     
     // NewWatcher creates a new WAL watcher for a given WriteTo.
    -func NewWatcher(metrics *WatcherMetrics, readerMetrics *LiveReaderMetrics, logger log.Logger, name string, writer WriteTo, walDir string, sendExemplars bool) *Watcher {
    +func NewWatcher(metrics *WatcherMetrics, readerMetrics *LiveReaderMetrics, logger log.Logger, name string, writer WriteTo, dir string, sendExemplars bool) *Watcher {
     	if logger == nil {
     		logger = log.NewNopLogger()
     	}
    @@ -153,7 +153,7 @@ func NewWatcher(metrics *WatcherMetrics, readerMetrics *LiveReaderMetrics, logge
     		writer:        writer,
     		metrics:       metrics,
     		readerMetrics: readerMetrics,
    -		walDir:        path.Join(walDir, "wal"),
    +		walDir:        path.Join(dir, "wal"),
     		name:          name,
     		sendExemplars: sendExemplars,
     
    
    From 69beb3f23dbc4a86f1bb2535745ad503b8159abe Mon Sep 17 00:00:00 2001
    From: TJ Hoplock <33664289+tjhop@users.noreply.github.com>
    Date: Tue, 31 May 2022 07:37:05 -0400
    Subject: [PATCH 089/135] fix: update docs to reflect new go 1.17 version
     minimum (#10780)
    
    The minimum go version was bumped to 1.17 in
    29b58448e13d9c841683acf194a2aa70cff3a49c, but the main README still
    referenced go 1.16 as the minimum version required. This updates that.
    
    I took a quick look through the other docs in the repo (ie, I did some
    naive grepping), and this is the only reference I spotted.
    
    Signed-off-by: TJ Hoplock 
    ---
     README.md | 2 +-
     1 file changed, 1 insertion(+), 1 deletion(-)
    
    diff --git a/README.md b/README.md
    index 76f4a1f889d..3a1784f629c 100644
    --- a/README.md
    +++ b/README.md
    @@ -59,7 +59,7 @@ Prometheus will now be reachable at .
     
     To build Prometheus from source code, You need:
     
    -* Go [version 1.16 or greater](https://golang.org/doc/install).
    +* Go [version 1.17 or greater](https://golang.org/doc/install).
     * NodeJS [version 16 or greater](https://nodejs.org/).
     * npm [version 7 or greater](https://www.npmjs.com/).
     
    
    From 31cffd9e9214785f9d92f34ca7f025dfcb43b522 Mon Sep 17 00:00:00 2001
    From: Hu Shuai 
    Date: Wed, 1 Jun 2022 10:31:18 +0800
    Subject: [PATCH 090/135] Fix a small typo (#10771)
    
    Signed-off-by: Hu Shuai 
    ---
     docs/configuration/configuration.md | 4 ++--
     1 file changed, 2 insertions(+), 2 deletions(-)
    
    diff --git a/docs/configuration/configuration.md b/docs/configuration/configuration.md
    index 4dd8209eb4a..b1d59158229 100644
    --- a/docs/configuration/configuration.md
    +++ b/docs/configuration/configuration.md
    @@ -1561,11 +1561,11 @@ following meta labels are available on all targets during
     * `__meta_ionos_server_cpu_family`: the CPU family of the server
       to
     * `__meta_ionos_server_id`: the ID of the server
    -* `__meta_ionos_server_ip`: comma seperated list of all IPs assigned to the
    +* `__meta_ionos_server_ip`: comma separated list of all IPs assigned to the
       server
     * `__meta_ionos_server_lifecycle`: the lifecycle state of the server resource
     * `__meta_ionos_server_name`: the name of the server
    -* `__meta_ionos_server_nic_ip_`: comma seperated list of IPs, grouped
    +* `__meta_ionos_server_nic_ip_`: comma separated list of IPs, grouped
       by the name of each NIC attached to the server
     * `__meta_ionos_server_servers_id`: the ID of the servers the server belongs to
     * `__meta_ionos_server_state`: the execution state of the server
    
    From b84494d50da1ccb0f20cd1a4848902e04533b341 Mon Sep 17 00:00:00 2001
    From: David Leadbeater 
    Date: Thu, 2 Jun 2022 10:16:44 +1000
    Subject: [PATCH 091/135] Update go-yaml v3 to 3.0.1 (#10786)
    
    Picks up the fix for https://github.com/go-yaml/yaml/issues/665 -- we
    picked up the important fix for CVE-2022-28948 already.
    
    This only affects go-yaml *v3*; the only user of v3 in Prometheus itself
    is rulefmt so the impact seems limited.
    
    Signed-off-by: David Leadbeater 
    ---
     go.mod | 2 +-
     go.sum | 4 ++--
     2 files changed, 3 insertions(+), 3 deletions(-)
    
    diff --git a/go.mod b/go.mod
    index a5a13b7aaec..ea079b834a9 100644
    --- a/go.mod
    +++ b/go.mod
    @@ -71,7 +71,7 @@ require (
     	google.golang.org/protobuf v1.28.0
     	gopkg.in/alecthomas/kingpin.v2 v2.2.6
     	gopkg.in/yaml.v2 v2.4.0
    -	gopkg.in/yaml.v3 v3.0.0
    +	gopkg.in/yaml.v3 v3.0.1
     	k8s.io/api v0.24.0
     	k8s.io/apimachinery v0.24.0
     	k8s.io/client-go v0.24.0
    diff --git a/go.sum b/go.sum
    index 6b939336f38..fb6daada5c5 100644
    --- a/go.sum
    +++ b/go.sum
    @@ -1437,8 +1437,8 @@ gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C
     gopkg.in/yaml.v3 v3.0.0-20200605160147-a5ece683394c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
     gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
     gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
    -gopkg.in/yaml.v3 v3.0.0 h1:hjy8E9ON/egN1tAYqKb61G10WtihqetD4sz2H+8nIeA=
    -gopkg.in/yaml.v3 v3.0.0/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
    +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
    +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
     gotest.tools/v3 v3.0.2/go.mod h1:3SzNCllyD9/Y+b5r9JIKQ474KzkZyqLqEfYqMsX94Bk=
     gotest.tools/v3 v3.0.3 h1:4AuOwCGf4lLR9u3YOe2awrHygurzhO/HeQ6laiA6Sx0=
     gotest.tools/v3 v3.0.3/go.mod h1:Z7Lb0S5l+klDB31fvDQX8ss/FlKDxtlFlw3Oa8Ymbl8=
    
    From d713e39865be0bd950404d1d0bb90a60ab4804e7 Mon Sep 17 00:00:00 2001
    From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
    Date: Thu, 2 Jun 2022 16:42:59 +0200
    Subject: [PATCH 092/135] build(deps): bump golangci/golangci-lint-action from
     3.1.0 to 3.2.0 (#10791)
    
    Bumps [golangci/golangci-lint-action](https://github.com/golangci/golangci-lint-action) from 3.1.0 to 3.2.0.
    - [Release notes](https://github.com/golangci/golangci-lint-action/releases)
    - [Commits](https://github.com/golangci/golangci-lint-action/compare/v3.1.0...v3.2.0)
    
    ---
    updated-dependencies:
    - dependency-name: golangci/golangci-lint-action
      dependency-type: direct:production
      update-type: version-update:semver-minor
    ...
    
    Signed-off-by: dependabot[bot] 
    
    Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
    ---
     .github/workflows/golangci-lint.yml | 2 +-
     1 file changed, 1 insertion(+), 1 deletion(-)
    
    diff --git a/.github/workflows/golangci-lint.yml b/.github/workflows/golangci-lint.yml
    index 136d7d4b963..6034bcbf8b9 100644
    --- a/.github/workflows/golangci-lint.yml
    +++ b/.github/workflows/golangci-lint.yml
    @@ -25,6 +25,6 @@ jobs:
             run: sudo apt-get update && sudo apt-get -y install libsnmp-dev
             if: github.repository == 'prometheus/snmp_exporter'
           - name: Lint
    -        uses: golangci/golangci-lint-action@v3.1.0
    +        uses: golangci/golangci-lint-action@v3.2.0
             with:
               version: v1.45.2
    
    From 03e5603d39997400b3d99ccc76f04dfd19f3666b Mon Sep 17 00:00:00 2001
    From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
    Date: Thu, 2 Jun 2022 16:43:31 +0200
    Subject: [PATCH 093/135] build(deps): bump bufbuild/buf-setup-action from
     1.4.0 to 1.5.0 (#10790)
    
    Bumps [bufbuild/buf-setup-action](https://github.com/bufbuild/buf-setup-action) from 1.4.0 to 1.5.0.
    - [Release notes](https://github.com/bufbuild/buf-setup-action/releases)
    - [Commits](https://github.com/bufbuild/buf-setup-action/compare/v1.4.0...v1.5.0)
    
    ---
    updated-dependencies:
    - dependency-name: bufbuild/buf-setup-action
      dependency-type: direct:production
      update-type: version-update:semver-minor
    ...
    
    Signed-off-by: dependabot[bot] 
    
    Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
    ---
     .github/workflows/buf-lint.yml | 2 +-
     .github/workflows/buf.yml      | 2 +-
     2 files changed, 2 insertions(+), 2 deletions(-)
    
    diff --git a/.github/workflows/buf-lint.yml b/.github/workflows/buf-lint.yml
    index 18c9b95e253..9826693eb66 100644
    --- a/.github/workflows/buf-lint.yml
    +++ b/.github/workflows/buf-lint.yml
    @@ -10,7 +10,7 @@ jobs:
         runs-on: ubuntu-latest
         steps:
           - uses: actions/checkout@v3
    -      - uses: bufbuild/buf-setup-action@v1.4.0
    +      - uses: bufbuild/buf-setup-action@v1.5.0
           - uses: bufbuild/buf-lint-action@v1
             with:
               input: 'prompb'
    diff --git a/.github/workflows/buf.yml b/.github/workflows/buf.yml
    index 445da66be89..11126f83dc2 100644
    --- a/.github/workflows/buf.yml
    +++ b/.github/workflows/buf.yml
    @@ -9,7 +9,7 @@ jobs:
         runs-on: ubuntu-latest
         steps:
           - uses: actions/checkout@v3
    -      - uses: bufbuild/buf-setup-action@v1.4.0
    +      - uses: bufbuild/buf-setup-action@v1.5.0
           - uses: bufbuild/buf-lint-action@v1
             with:
               input: 'prompb'
    
    From 4cb32a001e152e798a0a79d105a5aff043b789af Mon Sep 17 00:00:00 2001
    From: Julien Pivotto 
    Date: Fri, 3 Jun 2022 00:26:06 +0200
    Subject: [PATCH 094/135] Remove go version wording from changelog (#10778)
    
    Signed-off-by: Julien Pivotto 
    ---
     CHANGELOG.md | 2 --
     1 file changed, 2 deletions(-)
    
    diff --git a/CHANGELOG.md b/CHANGELOG.md
    index 2fc1a8bae7a..fd107d12fe7 100644
    --- a/CHANGELOG.md
    +++ b/CHANGELOG.md
    @@ -2,8 +2,6 @@
     
     ## 2.36.0 / 2022-05-30
     
    -This Prometheus release uses go 1.18 and needs at least go1.17 going forward.
    -
     * [FEATURE] Add lowercase and uppercase relabel action. #10641
     * [FEATURE] SD: Add IONOS Cloud integration. #10514
     * [FEATURE] SD: Add Vultr integration. #10714
    
    From c7298b4b088b5f4c0a1a86247afd9f5dba17c132 Mon Sep 17 00:00:00 2001
    From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
    Date: Fri, 3 Jun 2022 10:11:06 +0200
    Subject: [PATCH 095/135] build(deps): bump github.com/hashicorp/consul/api
     from 1.12.0 to 1.13.0 (#10794)
    
    Bumps [github.com/hashicorp/consul/api](https://github.com/hashicorp/consul) from 1.12.0 to 1.13.0.
    - [Release notes](https://github.com/hashicorp/consul/releases)
    - [Changelog](https://github.com/hashicorp/consul/blob/main/CHANGELOG.md)
    - [Commits](https://github.com/hashicorp/consul/compare/v1.12.0...api/v1.13.0)
    
    ---
    updated-dependencies:
    - dependency-name: github.com/hashicorp/consul/api
      dependency-type: direct:production
      update-type: version-update:semver-minor
    ...
    
    Signed-off-by: dependabot[bot] 
    
    Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
    ---
     go.mod | 2 +-
     go.sum | 4 ++--
     2 files changed, 3 insertions(+), 3 deletions(-)
    
    diff --git a/go.mod b/go.mod
    index ea079b834a9..1e254a673a6 100644
    --- a/go.mod
    +++ b/go.mod
    @@ -27,7 +27,7 @@ require (
     	github.com/gophercloud/gophercloud v0.24.0
     	github.com/grafana/regexp v0.0.0-20220304095617-2e8d9baf4ac2
     	github.com/grpc-ecosystem/grpc-gateway v1.16.0
    -	github.com/hashicorp/consul/api v1.12.0
    +	github.com/hashicorp/consul/api v1.13.0
     	github.com/hetznercloud/hcloud-go v1.33.2
     	github.com/ionos-cloud/sdk-go/v6 v6.0.5851
     	github.com/json-iterator/go v1.1.12
    diff --git a/go.sum b/go.sum
    index fb6daada5c5..7cac7523bbe 100644
    --- a/go.sum
    +++ b/go.sum
    @@ -456,8 +456,8 @@ github.com/grpc-ecosystem/grpc-gateway/v2 v2.7.0/go.mod h1:hgWBS7lorOAVIJEQMi4Zs
     github.com/grpc-ecosystem/grpc-gateway/v2 v2.10.2 h1:ERKrevVTnCw3Wu4I3mtR15QU3gtWy86cBo6De0jEohg=
     github.com/grpc-ecosystem/grpc-gateway/v2 v2.10.2/go.mod h1:chrfS3YoLAlKTRE5cFWvCbt8uGAjshktT4PveTUpsFQ=
     github.com/hashicorp/consul/api v1.3.0/go.mod h1:MmDNSzIMUjNpY/mQ398R4bk2FnqQLoPndWW5VkKPlCE=
    -github.com/hashicorp/consul/api v1.12.0 h1:k3y1FYv6nuKyNTqj6w9gXOx5r5CfLj/k/euUeBXj1OY=
    -github.com/hashicorp/consul/api v1.12.0/go.mod h1:6pVBMo0ebnYdt2S3H87XhekM/HHrUoTD2XXb/VrZVy0=
    +github.com/hashicorp/consul/api v1.13.0 h1:2hnLQ0GjQvw7f3O61jMO8gbasZviZTrt9R8WzgiirHc=
    +github.com/hashicorp/consul/api v1.13.0/go.mod h1:ZlVrynguJKcYr54zGaDbaL3fOvKC9m72FhPvA8T35KQ=
     github.com/hashicorp/consul/sdk v0.3.0/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8=
     github.com/hashicorp/consul/sdk v0.8.0 h1:OJtKBtEjboEZvG6AOUdh4Z1Zbyu0WcxQ0qatRrZHTVU=
     github.com/hashicorp/consul/sdk v0.8.0/go.mod h1:GBvyrGALthsZObzUGsfgHZQDXjg4lOjagTIwIR1vPms=
    
    From ad198b081b577cef999e3778ab2cacbbfe874f43 Mon Sep 17 00:00:00 2001
    From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
    Date: Fri, 3 Jun 2022 10:11:16 +0200
    Subject: [PATCH 096/135] build(deps): bump github.com/linode/linodego from
     1.5.0 to 1.6.0 (#10792)
    
    Bumps [github.com/linode/linodego](https://github.com/linode/linodego) from 1.5.0 to 1.6.0.
    - [Release notes](https://github.com/linode/linodego/releases)
    - [Commits](https://github.com/linode/linodego/compare/v1.5.0...v1.6.0)
    
    ---
    updated-dependencies:
    - dependency-name: github.com/linode/linodego
      dependency-type: direct:production
      update-type: version-update:semver-minor
    ...
    
    Signed-off-by: dependabot[bot] 
    
    Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
    ---
     go.mod | 2 +-
     go.sum | 4 ++--
     2 files changed, 3 insertions(+), 3 deletions(-)
    
    diff --git a/go.mod b/go.mod
    index 1e254a673a6..b5e2c6570ce 100644
    --- a/go.mod
    +++ b/go.mod
    @@ -32,7 +32,7 @@ require (
     	github.com/ionos-cloud/sdk-go/v6 v6.0.5851
     	github.com/json-iterator/go v1.1.12
     	github.com/kolo/xmlrpc v0.0.0-20201022064351-38db28db192b
    -	github.com/linode/linodego v1.5.0
    +	github.com/linode/linodego v1.6.0
     	github.com/miekg/dns v1.1.49
     	github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f
     	github.com/oklog/run v1.1.0
    diff --git a/go.sum b/go.sum
    index 7cac7523bbe..47785695a58 100644
    --- a/go.sum
    +++ b/go.sum
    @@ -575,8 +575,8 @@ github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+
     github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII=
     github.com/lightstep/lightstep-tracer-common/golang/gogo v0.0.0-20190605223551-bc2310a04743/go.mod h1:qklhhLq1aX+mtWk9cPHPzaBjWImj5ULL6C7HFJtXQMM=
     github.com/lightstep/lightstep-tracer-go v0.18.1/go.mod h1:jlF1pusYV4pidLvZ+XD0UBX0ZE6WURAspgAczcDHrL4=
    -github.com/linode/linodego v1.5.0 h1:p1TgkDsz0ubaIPLNviZBTIjlsX3PdvqZQ4eO2r0L1Hk=
    -github.com/linode/linodego v1.5.0/go.mod h1:9lmhBsOupR6ke7D9Ioj1bq/ny9pfgFkCLiX7ubq0r08=
    +github.com/linode/linodego v1.6.0 h1:y3KgXttj0v6V3HyGtsvdkTl0gIzaAAOdrDXCIwGeh2g=
    +github.com/linode/linodego v1.6.0/go.mod h1:9lmhBsOupR6ke7D9Ioj1bq/ny9pfgFkCLiX7ubq0r08=
     github.com/lyft/protoc-gen-star v0.6.0/go.mod h1:TGAoBVkt8w7MPG72TrKIu85MIdXwDuzJYeZuUPFPNwA=
     github.com/lyft/protoc-gen-validate v0.0.13/go.mod h1:XbGvPuh87YZc5TdIa2/I4pLk0QoUACkjt2znoq26NVQ=
     github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
    
    From 12de742ae444155746313ae99c561bf954c24ae1 Mon Sep 17 00:00:00 2001
    From: Matthieu MOREL 
    Date: Fri, 3 Jun 2022 13:27:01 +0200
    Subject: [PATCH 097/135] refactor (documentation): move from
     github.com/pkg/errors to 'errors' and 'fmt' (#10808)
    
    Signed-off-by: Matthieu MOREL 
    
    Co-authored-by: Matthieu MOREL 
    ---
     documentation/examples/remote_storage/go.mod       |  2 +-
     .../remote_storage_adapter/influxdb/client.go      | 14 +++++++-------
     .../remote_storage/remote_storage_adapter/main.go  |  3 +--
     .../remote_storage_adapter/opentsdb/client.go      |  4 ++--
     .../remote_storage_adapter/opentsdb/tagvalue.go    |  9 ++++-----
     5 files changed, 15 insertions(+), 17 deletions(-)
    
    diff --git a/documentation/examples/remote_storage/go.mod b/documentation/examples/remote_storage/go.mod
    index f73948111a2..a2a5067ef49 100644
    --- a/documentation/examples/remote_storage/go.mod
    +++ b/documentation/examples/remote_storage/go.mod
    @@ -7,7 +7,6 @@ require (
     	github.com/gogo/protobuf v1.3.2
     	github.com/golang/snappy v0.0.4
     	github.com/influxdata/influxdb v1.9.5
    -	github.com/pkg/errors v0.9.1
     	github.com/prometheus/client_golang v1.12.1
     	github.com/prometheus/common v0.32.1
     	github.com/prometheus/prometheus v1.8.2-0.20220202104425-d819219dd438
    @@ -30,6 +29,7 @@ require (
     	github.com/jpillora/backoff v1.0.0 // indirect
     	github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 // indirect
     	github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f // indirect
    +	github.com/pkg/errors v0.9.1 // indirect
     	github.com/pmezard/go-difflib v1.0.0 // indirect
     	github.com/prometheus/client_model v0.2.0 // indirect
     	github.com/prometheus/common/sigv4 v0.1.0 // indirect
    diff --git a/documentation/examples/remote_storage/remote_storage_adapter/influxdb/client.go b/documentation/examples/remote_storage/remote_storage_adapter/influxdb/client.go
    index f0ee58c5a2f..fffbc9c2ae4 100644
    --- a/documentation/examples/remote_storage/remote_storage_adapter/influxdb/client.go
    +++ b/documentation/examples/remote_storage/remote_storage_adapter/influxdb/client.go
    @@ -15,6 +15,7 @@ package influxdb
     
     import (
     	"encoding/json"
    +	"errors"
     	"fmt"
     	"math"
     	"os"
    @@ -23,7 +24,6 @@ import (
     	"github.com/go-kit/log"
     	"github.com/go-kit/log/level"
     	influx "github.com/influxdata/influxdb/client/v2"
    -	"github.com/pkg/errors"
     	"github.com/prometheus/client_golang/prometheus"
     	"github.com/prometheus/common/model"
     
    @@ -174,7 +174,7 @@ func (c *Client) buildCommand(q *prompb.Query) (string, error) {
     		case prompb.LabelMatcher_NRE:
     			matchers = append(matchers, fmt.Sprintf("%q !~ /^%s$/", m.Name, escapeSlashes(m.Value)))
     		default:
    -			return "", errors.Errorf("unknown match type %v", m.Type)
    +			return "", fmt.Errorf("unknown match type %v", m.Type)
     		}
     	}
     	matchers = append(matchers, fmt.Sprintf("time >= %vms", q.StartTimestampMs))
    @@ -253,27 +253,27 @@ func valuesToSamples(values [][]interface{}) ([]prompb.Sample, error) {
     	samples := make([]prompb.Sample, 0, len(values))
     	for _, v := range values {
     		if len(v) != 2 {
    -			return nil, errors.Errorf("bad sample tuple length, expected [, ], got %v", v)
    +			return nil, fmt.Errorf("bad sample tuple length, expected [, ], got %v", v)
     		}
     
     		jsonTimestamp, ok := v[0].(json.Number)
     		if !ok {
    -			return nil, errors.Errorf("bad timestamp: %v", v[0])
    +			return nil, fmt.Errorf("bad timestamp: %v", v[0])
     		}
     
     		jsonValue, ok := v[1].(json.Number)
     		if !ok {
    -			return nil, errors.Errorf("bad sample value: %v", v[1])
    +			return nil, fmt.Errorf("bad sample value: %v", v[1])
     		}
     
     		timestamp, err := jsonTimestamp.Int64()
     		if err != nil {
    -			return nil, errors.Wrap(err, "unable to convert sample timestamp to int64")
    +			return nil, fmt.Errorf("unable to convert sample timestamp to int64: %w", err)
     		}
     
     		value, err := jsonValue.Float64()
     		if err != nil {
    -			return nil, errors.Wrap(err, "unable to convert sample value to float64")
    +			return nil, fmt.Errorf("unable to convert sample value to float64: %w", err)
     		}
     
     		samples = append(samples, prompb.Sample{
    diff --git a/documentation/examples/remote_storage/remote_storage_adapter/main.go b/documentation/examples/remote_storage/remote_storage_adapter/main.go
    index 548d0c5d9b3..eac2ec409ca 100644
    --- a/documentation/examples/remote_storage/remote_storage_adapter/main.go
    +++ b/documentation/examples/remote_storage/remote_storage_adapter/main.go
    @@ -30,7 +30,6 @@ import (
     	"github.com/gogo/protobuf/proto"
     	"github.com/golang/snappy"
     	influx "github.com/influxdata/influxdb/client/v2"
    -	"github.com/pkg/errors"
     	"github.com/prometheus/client_golang/prometheus"
     	"github.com/prometheus/client_golang/prometheus/promhttp"
     	"github.com/prometheus/common/model"
    @@ -148,7 +147,7 @@ func parseFlags() *config {
     
     	_, err := a.Parse(os.Args[1:])
     	if err != nil {
    -		fmt.Fprintln(os.Stderr, errors.Wrapf(err, "Error parsing commandline arguments"))
    +		fmt.Fprintln(os.Stderr, fmt.Errorf("Error parsing commandline arguments: %w", err))
     		a.Usage(os.Args[1:])
     		os.Exit(2)
     	}
    diff --git a/documentation/examples/remote_storage/remote_storage_adapter/opentsdb/client.go b/documentation/examples/remote_storage/remote_storage_adapter/opentsdb/client.go
    index 4942e65dd74..0fa7c5a4b72 100644
    --- a/documentation/examples/remote_storage/remote_storage_adapter/opentsdb/client.go
    +++ b/documentation/examples/remote_storage/remote_storage_adapter/opentsdb/client.go
    @@ -17,6 +17,7 @@ import (
     	"bytes"
     	"context"
     	"encoding/json"
    +	"fmt"
     	"io"
     	"math"
     	"net/http"
    @@ -25,7 +26,6 @@ import (
     
     	"github.com/go-kit/log"
     	"github.com/go-kit/log/level"
    -	"github.com/pkg/errors"
     	"github.com/prometheus/common/model"
     )
     
    @@ -136,7 +136,7 @@ func (c *Client) Write(samples model.Samples) error {
     	if err := json.Unmarshal(buf, &r); err != nil {
     		return err
     	}
    -	return errors.Errorf("failed to write %d samples to OpenTSDB, %d succeeded", r["failed"], r["success"])
    +	return fmt.Errorf("failed to write %d samples to OpenTSDB, %d succeeded", r["failed"], r["success"])
     }
     
     // Name identifies the client as an OpenTSDB client.
    diff --git a/documentation/examples/remote_storage/remote_storage_adapter/opentsdb/tagvalue.go b/documentation/examples/remote_storage/remote_storage_adapter/opentsdb/tagvalue.go
    index f5c2009ba08..d96f9017afe 100644
    --- a/documentation/examples/remote_storage/remote_storage_adapter/opentsdb/tagvalue.go
    +++ b/documentation/examples/remote_storage/remote_storage_adapter/opentsdb/tagvalue.go
    @@ -17,7 +17,6 @@ import (
     	"bytes"
     	"fmt"
     
    -	"github.com/pkg/errors"
     	"github.com/prometheus/common/model"
     )
     
    @@ -98,13 +97,13 @@ func (tv *TagValue) UnmarshalJSON(json []byte) error {
     	for i, b := range json {
     		if i == 0 {
     			if b != '"' {
    -				return errors.Errorf("expected '\"', got %q", b)
    +				return fmt.Errorf("expected '\"', got %q", b)
     			}
     			continue
     		}
     		if i == len(json)-1 {
     			if b != '"' {
    -				return errors.Errorf("expected '\"', got %q", b)
    +				return fmt.Errorf("expected '\"', got %q", b)
     			}
     			break
     		}
    @@ -130,7 +129,7 @@ func (tv *TagValue) UnmarshalJSON(json []byte) error {
     				parsedByte = (b - 55) << 4
     				escapeLevel = 2
     			default:
    -				return errors.Errorf(
    +				return fmt.Errorf(
     					"illegal escape sequence at byte %d (%c)",
     					i, b,
     				)
    @@ -142,7 +141,7 @@ func (tv *TagValue) UnmarshalJSON(json []byte) error {
     			case b >= 'A' && b <= 'F': // A-F
     				parsedByte += b - 55
     			default:
    -				return errors.Errorf(
    +				return fmt.Errorf(
     					"illegal escape sequence at byte %d (%c)",
     					i, b,
     				)
    
    From f43749e82f16f36f7d7cc2d3280eaec9cb4cb9a1 Mon Sep 17 00:00:00 2001
    From: Matthieu MOREL 
    Date: Fri, 3 Jun 2022 13:47:14 +0200
    Subject: [PATCH 098/135] refactor (discovery): move from github.com/pkg/errors
     to 'errors' and 'fmt' (#10807)
    
    Signed-off-by: Matthieu MOREL 
    
    Co-authored-by: Matthieu MOREL 
    ---
     discovery/aws/ec2.go                    |  9 ++++---
     discovery/aws/lightsail.go              |  9 ++++---
     discovery/azure/azure.go                | 36 ++++++++++++-------------
     discovery/consul/consul.go              |  4 +--
     discovery/dns/dns.go                    | 12 ++++-----
     discovery/eureka/client.go              |  5 ++--
     discovery/eureka/eureka.go              |  2 +-
     discovery/file/file.go                  |  6 ++---
     discovery/gce/gce.go                    |  8 +++---
     discovery/hetzner/hetzner.go            |  5 ++--
     discovery/hetzner/robot.go              |  3 +--
     discovery/http/http.go                  |  6 ++---
     discovery/kubernetes/endpoints.go       |  7 ++---
     discovery/kubernetes/endpointslice.go   |  4 +--
     discovery/kubernetes/ingress.go         |  7 ++---
     discovery/kubernetes/kubernetes.go      | 22 +++++++--------
     discovery/kubernetes/kubernetes_test.go |  2 +-
     discovery/kubernetes/node.go            |  7 ++---
     discovery/kubernetes/pod.go             |  7 ++---
     discovery/kubernetes/service.go         |  7 ++---
     discovery/legacymanager/registry.go     |  4 ++-
     discovery/marathon/marathon.go          | 10 +++----
     discovery/marathon/marathon_test.go     |  2 +-
     discovery/openstack/hypervisor.go       |  7 +++--
     discovery/openstack/instance.go         | 11 ++++----
     discovery/openstack/openstack.go        |  4 +--
     discovery/puppetdb/puppetdb.go          |  5 ++--
     discovery/refresh/refresh.go            |  5 ++--
     discovery/registry.go                   |  4 ++-
     discovery/scaleway/scaleway.go          |  9 ++++---
     discovery/triton/triton.go              | 10 +++----
     discovery/uyuni/uyuni.go                | 12 ++++-----
     discovery/xds/kuma.go                   |  7 +++--
     discovery/xds/kuma_test.go              |  2 +-
     discovery/zookeeper/zookeeper.go        | 10 +++----
     35 files changed, 139 insertions(+), 131 deletions(-)
    
    diff --git a/discovery/aws/ec2.go b/discovery/aws/ec2.go
    index 8984035e24b..9ae964c8346 100644
    --- a/discovery/aws/ec2.go
    +++ b/discovery/aws/ec2.go
    @@ -15,6 +15,7 @@ package aws
     
     import (
     	"context"
    +	"errors"
     	"fmt"
     	"net"
     	"strings"
    @@ -29,7 +30,6 @@ import (
     	"github.com/aws/aws-sdk-go/service/ec2"
     	"github.com/go-kit/log"
     	"github.com/go-kit/log/level"
    -	"github.com/pkg/errors"
     	"github.com/prometheus/common/config"
     	"github.com/prometheus/common/model"
     
    @@ -179,7 +179,7 @@ func (d *EC2Discovery) ec2Client(ctx context.Context) (*ec2.EC2, error) {
     		Profile: d.cfg.Profile,
     	})
     	if err != nil {
    -		return nil, errors.Wrap(err, "could not create aws session")
    +		return nil, fmt.Errorf("could not create aws session: %w", err)
     	}
     
     	if d.cfg.RoleARN != "" {
    @@ -328,10 +328,11 @@ func (d *EC2Discovery) refresh(ctx context.Context) ([]*targetgroup.Group, error
     		}
     		return true
     	}); err != nil {
    -		if awsErr, ok := err.(awserr.Error); ok && (awsErr.Code() == "AuthFailure" || awsErr.Code() == "UnauthorizedOperation") {
    +		var awsErr awserr.Error
    +		if errors.As(err, &awsErr) && (awsErr.Code() == "AuthFailure" || awsErr.Code() == "UnauthorizedOperation") {
     			d.ec2 = nil
     		}
    -		return nil, errors.Wrap(err, "could not describe instances")
    +		return nil, fmt.Errorf("could not describe instances: %w", err)
     	}
     	return []*targetgroup.Group{tg}, nil
     }
    diff --git a/discovery/aws/lightsail.go b/discovery/aws/lightsail.go
    index e5165776f62..7f89312b336 100644
    --- a/discovery/aws/lightsail.go
    +++ b/discovery/aws/lightsail.go
    @@ -15,6 +15,7 @@ package aws
     
     import (
     	"context"
    +	"errors"
     	"fmt"
     	"net"
     	"strings"
    @@ -28,7 +29,6 @@ import (
     	"github.com/aws/aws-sdk-go/aws/session"
     	"github.com/aws/aws-sdk-go/service/lightsail"
     	"github.com/go-kit/log"
    -	"github.com/pkg/errors"
     	"github.com/prometheus/common/config"
     	"github.com/prometheus/common/model"
     
    @@ -152,7 +152,7 @@ func (d *LightsailDiscovery) lightsailClient() (*lightsail.Lightsail, error) {
     		Profile: d.cfg.Profile,
     	})
     	if err != nil {
    -		return nil, errors.Wrap(err, "could not create aws session")
    +		return nil, fmt.Errorf("could not create aws session: %w", err)
     	}
     
     	if d.cfg.RoleARN != "" {
    @@ -179,10 +179,11 @@ func (d *LightsailDiscovery) refresh(ctx context.Context) ([]*targetgroup.Group,
     
     	output, err := lightsailClient.GetInstancesWithContext(ctx, input)
     	if err != nil {
    -		if awsErr, ok := err.(awserr.Error); ok && (awsErr.Code() == "AuthFailure" || awsErr.Code() == "UnauthorizedOperation") {
    +		var awsErr awserr.Error
    +		if errors.As(err, &awsErr) && (awsErr.Code() == "AuthFailure" || awsErr.Code() == "UnauthorizedOperation") {
     			d.lightsail = nil
     		}
    -		return nil, errors.Wrap(err, "could not get instances")
    +		return nil, fmt.Errorf("could not get instances: %w", err)
     	}
     
     	for _, inst := range output.Instances {
    diff --git a/discovery/azure/azure.go b/discovery/azure/azure.go
    index e7ab63a21e6..44576c79b97 100644
    --- a/discovery/azure/azure.go
    +++ b/discovery/azure/azure.go
    @@ -15,6 +15,7 @@ package azure
     
     import (
     	"context"
    +	"errors"
     	"fmt"
     	"net"
     	"net/http"
    @@ -29,7 +30,6 @@ import (
     	"github.com/Azure/go-autorest/autorest/azure"
     	"github.com/go-kit/log"
     	"github.com/go-kit/log/level"
    -	"github.com/pkg/errors"
     	"github.com/prometheus/client_golang/prometheus"
     	config_util "github.com/prometheus/common/config"
     	"github.com/prometheus/common/model"
    @@ -109,7 +109,7 @@ func (c *SDConfig) NewDiscoverer(opts discovery.DiscovererOptions) (discovery.Di
     
     func validateAuthParam(param, name string) error {
     	if len(param) == 0 {
    -		return errors.Errorf("azure SD configuration requires a %s", name)
    +		return fmt.Errorf("azure SD configuration requires a %s", name)
     	}
     	return nil
     }
    @@ -140,7 +140,7 @@ func (c *SDConfig) UnmarshalYAML(unmarshal func(interface{}) error) error {
     	}
     
     	if c.AuthenticationMethod != authMethodOAuth && c.AuthenticationMethod != authMethodManagedIdentity {
    -		return errors.Errorf("unknown authentication_type %q. Supported types are %q or %q", c.AuthenticationMethod, authMethodOAuth, authMethodManagedIdentity)
    +		return fmt.Errorf("unknown authentication_type %q. Supported types are %q or %q", c.AuthenticationMethod, authMethodOAuth, authMethodManagedIdentity)
     	}
     
     	return nil
    @@ -271,7 +271,7 @@ func newAzureResourceFromID(id string, logger log.Logger) (azureResource, error)
     	// /subscriptions/SUBSCRIPTION_ID/resourceGroups/RESOURCE_GROUP/providers/PROVIDER/TYPE/NAME/TYPE/NAME
     	s := strings.Split(id, "/")
     	if len(s) != 9 && len(s) != 11 {
    -		err := errors.Errorf("invalid ID '%s'. Refusing to create azureResource", id)
    +		err := fmt.Errorf("invalid ID '%s'. Refusing to create azureResource", id)
     		level.Error(logger).Log("err", err)
     		return azureResource{}, err
     	}
    @@ -288,13 +288,13 @@ func (d *Discovery) refresh(ctx context.Context) ([]*targetgroup.Group, error) {
     	client, err := createAzureClient(*d.cfg)
     	if err != nil {
     		failuresCount.Inc()
    -		return nil, errors.Wrap(err, "could not create Azure client")
    +		return nil, fmt.Errorf("could not create Azure client: %w", err)
     	}
     
     	machines, err := client.getVMs(ctx, d.cfg.ResourceGroup)
     	if err != nil {
     		failuresCount.Inc()
    -		return nil, errors.Wrap(err, "could not get virtual machines")
    +		return nil, fmt.Errorf("could not get virtual machines: %w", err)
     	}
     
     	level.Debug(d.logger).Log("msg", "Found virtual machines during Azure discovery.", "count", len(machines))
    @@ -303,14 +303,14 @@ func (d *Discovery) refresh(ctx context.Context) ([]*targetgroup.Group, error) {
     	scaleSets, err := client.getScaleSets(ctx, d.cfg.ResourceGroup)
     	if err != nil {
     		failuresCount.Inc()
    -		return nil, errors.Wrap(err, "could not get virtual machine scale sets")
    +		return nil, fmt.Errorf("could not get virtual machine scale sets: %w", err)
     	}
     
     	for _, scaleSet := range scaleSets {
     		scaleSetVms, err := client.getScaleSetVMs(ctx, scaleSet)
     		if err != nil {
     			failuresCount.Inc()
    -			return nil, errors.Wrap(err, "could not get virtual machine scale set vms")
    +			return nil, fmt.Errorf("could not get virtual machine scale set vms: %w", err)
     		}
     		machines = append(machines, scaleSetVms...)
     	}
    @@ -396,7 +396,7 @@ func (d *Discovery) refresh(ctx context.Context) ([]*targetgroup.Group, error) {
     						}
     						// If we made it here, we don't have a private IP which should be impossible.
     						// Return an empty target and error to ensure an all or nothing situation.
    -						err = errors.Errorf("unable to find a private IP for VM %s", vm.Name)
    +						err = fmt.Errorf("unable to find a private IP for VM %s", vm.Name)
     						ch <- target{labelSet: nil, err: err}
     						return
     					}
    @@ -412,7 +412,7 @@ func (d *Discovery) refresh(ctx context.Context) ([]*targetgroup.Group, error) {
     	for tgt := range ch {
     		if tgt.err != nil {
     			failuresCount.Inc()
    -			return nil, errors.Wrap(tgt.err, "unable to complete Azure service discovery")
    +			return nil, fmt.Errorf("unable to complete Azure service discovery: %w", tgt.err)
     		}
     		if tgt.labelSet != nil {
     			tg.Targets = append(tg.Targets, tgt.labelSet)
    @@ -432,7 +432,7 @@ func (client *azureClient) getVMs(ctx context.Context, resourceGroup string) ([]
     		result, err = client.vm.List(ctx, resourceGroup)
     	}
     	if err != nil {
    -		return nil, errors.Wrap(err, "could not list virtual machines")
    +		return nil, fmt.Errorf("could not list virtual machines: %w", err)
     	}
     	for result.NotDone() {
     		for _, vm := range result.Values() {
    @@ -440,7 +440,7 @@ func (client *azureClient) getVMs(ctx context.Context, resourceGroup string) ([]
     		}
     		err = result.NextWithContext(ctx)
     		if err != nil {
    -			return nil, errors.Wrap(err, "could not list virtual machines")
    +			return nil, fmt.Errorf("could not list virtual machines: %w", err)
     		}
     	}
     
    @@ -461,14 +461,14 @@ func (client *azureClient) getScaleSets(ctx context.Context, resourceGroup strin
     		var rtn compute.VirtualMachineScaleSetListWithLinkResultPage
     		rtn, err = client.vmss.ListAll(ctx)
     		if err != nil {
    -			return nil, errors.Wrap(err, "could not list virtual machine scale sets")
    +			return nil, fmt.Errorf("could not list virtual machine scale sets: %w", err)
     		}
     		result = &rtn
     	} else {
     		var rtn compute.VirtualMachineScaleSetListResultPage
     		rtn, err = client.vmss.List(ctx, resourceGroup)
     		if err != nil {
    -			return nil, errors.Wrap(err, "could not list virtual machine scale sets")
    +			return nil, fmt.Errorf("could not list virtual machine scale sets: %w", err)
     		}
     		result = &rtn
     	}
    @@ -477,7 +477,7 @@ func (client *azureClient) getScaleSets(ctx context.Context, resourceGroup strin
     		scaleSets = append(scaleSets, result.Values()...)
     		err = result.NextWithContext(ctx)
     		if err != nil {
    -			return nil, errors.Wrap(err, "could not list virtual machine scale sets")
    +			return nil, fmt.Errorf("could not list virtual machine scale sets: %w", err)
     		}
     	}
     
    @@ -489,12 +489,12 @@ func (client *azureClient) getScaleSetVMs(ctx context.Context, scaleSet compute.
     	// TODO do we really need to fetch the resourcegroup this way?
     	r, err := newAzureResourceFromID(*scaleSet.ID, nil)
     	if err != nil {
    -		return nil, errors.Wrap(err, "could not parse scale set ID")
    +		return nil, fmt.Errorf("could not parse scale set ID: %w", err)
     	}
     
     	result, err := client.vmssvm.List(ctx, r.ResourceGroup, *(scaleSet.Name), "", "", "")
     	if err != nil {
    -		return nil, errors.Wrap(err, "could not list virtual machine scale set vms")
    +		return nil, fmt.Errorf("could not list virtual machine scale set vms: %w", err)
     	}
     	for result.NotDone() {
     		for _, vm := range result.Values() {
    @@ -502,7 +502,7 @@ func (client *azureClient) getScaleSetVMs(ctx context.Context, scaleSet compute.
     		}
     		err = result.NextWithContext(ctx)
     		if err != nil {
    -			return nil, errors.Wrap(err, "could not list virtual machine scale set vms")
    +			return nil, fmt.Errorf("could not list virtual machine scale set vms: %w", err)
     		}
     	}
     
    diff --git a/discovery/consul/consul.go b/discovery/consul/consul.go
    index d07db786758..8d0a1fea486 100644
    --- a/discovery/consul/consul.go
    +++ b/discovery/consul/consul.go
    @@ -15,6 +15,7 @@ package consul
     
     import (
     	"context"
    +	"errors"
     	"fmt"
     	"net"
     	"strconv"
    @@ -24,7 +25,6 @@ import (
     	"github.com/go-kit/log"
     	"github.com/go-kit/log/level"
     	consul "github.com/hashicorp/consul/api"
    -	"github.com/pkg/errors"
     	"github.com/prometheus/client_golang/prometheus"
     	"github.com/prometheus/common/config"
     	"github.com/prometheus/common/model"
    @@ -291,7 +291,7 @@ func (d *Discovery) getDatacenter() error {
     
     	dc, ok := info["Config"]["Datacenter"].(string)
     	if !ok {
    -		err := errors.Errorf("invalid value '%v' for Config.Datacenter", info["Config"]["Datacenter"])
    +		err := fmt.Errorf("invalid value '%v' for Config.Datacenter", info["Config"]["Datacenter"])
     		level.Error(d.logger).Log("msg", "Error retrieving datacenter name", "err", err)
     		return err
     	}
    diff --git a/discovery/dns/dns.go b/discovery/dns/dns.go
    index 6b9860d629e..a2294d93071 100644
    --- a/discovery/dns/dns.go
    +++ b/discovery/dns/dns.go
    @@ -15,6 +15,7 @@ package dns
     
     import (
     	"context"
    +	"errors"
     	"fmt"
     	"net"
     	"strings"
    @@ -24,7 +25,6 @@ import (
     	"github.com/go-kit/log"
     	"github.com/go-kit/log/level"
     	"github.com/miekg/dns"
    -	"github.com/pkg/errors"
     	"github.com/prometheus/client_golang/prometheus"
     	"github.com/prometheus/common/model"
     
    @@ -105,7 +105,7 @@ func (c *SDConfig) UnmarshalYAML(unmarshal func(interface{}) error) error {
     			return errors.New("a port is required in DNS-SD configs for all record types except SRV")
     		}
     	default:
    -		return errors.Errorf("invalid DNS-SD records type %s", c.Type)
    +		return fmt.Errorf("invalid DNS-SD records type %s", c.Type)
     	}
     	return nil
     }
    @@ -163,7 +163,7 @@ func (d *Discovery) refresh(ctx context.Context) ([]*targetgroup.Group, error) {
     	wg.Add(len(d.names))
     	for _, name := range d.names {
     		go func(n string) {
    -			if err := d.refreshOne(ctx, n, ch); err != nil && err != context.Canceled {
    +			if err := d.refreshOne(ctx, n, ch); err != nil && !errors.Is(err, context.Canceled) {
     				level.Error(d.logger).Log("msg", "Error refreshing DNS targets", "err", err)
     			}
     			wg.Done()
    @@ -265,7 +265,7 @@ func (d *Discovery) refreshOne(ctx context.Context, name string, ch chan<- *targ
     func lookupWithSearchPath(name string, qtype uint16, logger log.Logger) (*dns.Msg, error) {
     	conf, err := dns.ClientConfigFromFile(resolvConf)
     	if err != nil {
    -		return nil, errors.Wrap(err, "could not load resolv.conf")
    +		return nil, fmt.Errorf("could not load resolv.conf: %w", err)
     	}
     
     	allResponsesValid := true
    @@ -291,7 +291,7 @@ func lookupWithSearchPath(name string, qtype uint16, logger log.Logger) (*dns.Ms
     		return &dns.Msg{}, nil
     	}
     	// Outcome 3: boned.
    -	return nil, errors.Errorf("could not resolve %q: all servers responded with errors to at least one search domain", name)
    +	return nil, fmt.Errorf("could not resolve %q: all servers responded with errors to at least one search domain", name)
     }
     
     // lookupFromAnyServer uses all configured servers to try and resolve a specific
    @@ -327,7 +327,7 @@ func lookupFromAnyServer(name string, qtype uint16, conf *dns.ClientConfig, logg
     		}
     	}
     
    -	return nil, errors.Errorf("could not resolve %s: no servers returned a viable answer", name)
    +	return nil, fmt.Errorf("could not resolve %s: no servers returned a viable answer", name)
     }
     
     // askServerForName makes a request to a specific DNS server for a specific
    diff --git a/discovery/eureka/client.go b/discovery/eureka/client.go
    index 071743d7974..a833415a537 100644
    --- a/discovery/eureka/client.go
    +++ b/discovery/eureka/client.go
    @@ -20,7 +20,6 @@ import (
     	"io"
     	"net/http"
     
    -	"github.com/pkg/errors"
     	"github.com/prometheus/common/version"
     )
     
    @@ -99,13 +98,13 @@ func fetchApps(ctx context.Context, server string, client *http.Client) (*Applic
     	}()
     
     	if resp.StatusCode/100 != 2 {
    -		return nil, errors.Errorf("non 2xx status '%d' response during eureka service discovery", resp.StatusCode)
    +		return nil, fmt.Errorf("non 2xx status '%d' response during eureka service discovery", resp.StatusCode)
     	}
     
     	var apps Applications
     	err = xml.NewDecoder(resp.Body).Decode(&apps)
     	if err != nil {
    -		return nil, errors.Wrapf(err, "%q", url)
    +		return nil, fmt.Errorf("%q: %w", url, err)
     	}
     	return &apps, nil
     }
    diff --git a/discovery/eureka/eureka.go b/discovery/eureka/eureka.go
    index 110a5d86222..5d9d8d552d6 100644
    --- a/discovery/eureka/eureka.go
    +++ b/discovery/eureka/eureka.go
    @@ -15,6 +15,7 @@ package eureka
     
     import (
     	"context"
    +	"errors"
     	"net"
     	"net/http"
     	"net/url"
    @@ -22,7 +23,6 @@ import (
     	"time"
     
     	"github.com/go-kit/log"
    -	"github.com/pkg/errors"
     	"github.com/prometheus/common/config"
     	"github.com/prometheus/common/model"
     
    diff --git a/discovery/file/file.go b/discovery/file/file.go
    index 0e8e7fd4754..8fa1d974374 100644
    --- a/discovery/file/file.go
    +++ b/discovery/file/file.go
    @@ -16,6 +16,7 @@ package file
     import (
     	"context"
     	"encoding/json"
    +	"errors"
     	"fmt"
     	"io"
     	"os"
    @@ -28,7 +29,6 @@ import (
     	"github.com/go-kit/log"
     	"github.com/go-kit/log/level"
     	"github.com/grafana/regexp"
    -	"github.com/pkg/errors"
     	"github.com/prometheus/client_golang/prometheus"
     	"github.com/prometheus/common/config"
     	"github.com/prometheus/common/model"
    @@ -99,7 +99,7 @@ func (c *SDConfig) UnmarshalYAML(unmarshal func(interface{}) error) error {
     	}
     	for _, name := range c.Files {
     		if !patFileSDName.MatchString(name) {
    -			return errors.Errorf("path name %q is not valid for file discovery", name)
    +			return fmt.Errorf("path name %q is not valid for file discovery", name)
     		}
     	}
     	return nil
    @@ -398,7 +398,7 @@ func (d *Discovery) readFile(filename string) ([]*targetgroup.Group, error) {
     			return nil, err
     		}
     	default:
    -		panic(errors.Errorf("discovery.File.readFile: unhandled file extension %q", ext))
    +		panic(fmt.Errorf("discovery.File.readFile: unhandled file extension %q", ext))
     	}
     
     	for i, tg := range targetGroups {
    diff --git a/discovery/gce/gce.go b/discovery/gce/gce.go
    index e17c60f71d0..887188e2dbe 100644
    --- a/discovery/gce/gce.go
    +++ b/discovery/gce/gce.go
    @@ -15,6 +15,7 @@ package gce
     
     import (
     	"context"
    +	"errors"
     	"fmt"
     	"net/http"
     	"strconv"
    @@ -22,7 +23,6 @@ import (
     	"time"
     
     	"github.com/go-kit/log"
    -	"github.com/pkg/errors"
     	"github.com/prometheus/common/model"
     	"golang.org/x/oauth2/google"
     	compute "google.golang.org/api/compute/v1"
    @@ -132,11 +132,11 @@ func NewDiscovery(conf SDConfig, logger log.Logger) (*Discovery, error) {
     	var err error
     	d.client, err = google.DefaultClient(context.Background(), compute.ComputeReadonlyScope)
     	if err != nil {
    -		return nil, errors.Wrap(err, "error setting up communication with GCE service")
    +		return nil, fmt.Errorf("error setting up communication with GCE service: %w", err)
     	}
     	d.svc, err = compute.NewService(context.Background(), option.WithHTTPClient(d.client))
     	if err != nil {
    -		return nil, errors.Wrap(err, "error setting up communication with GCE service")
    +		return nil, fmt.Errorf("error setting up communication with GCE service: %w", err)
     	}
     	d.isvc = compute.NewInstancesService(d.svc)
     
    @@ -221,7 +221,7 @@ func (d *Discovery) refresh(ctx context.Context) ([]*targetgroup.Group, error) {
     		return nil
     	})
     	if err != nil {
    -		return nil, errors.Wrap(err, "error retrieving refresh targets from gce")
    +		return nil, fmt.Errorf("error retrieving refresh targets from gce: %w", err)
     	}
     	return []*targetgroup.Group{tg}, nil
     }
    diff --git a/discovery/hetzner/hetzner.go b/discovery/hetzner/hetzner.go
    index b7c7578e2a9..f4fe243b49e 100644
    --- a/discovery/hetzner/hetzner.go
    +++ b/discovery/hetzner/hetzner.go
    @@ -15,11 +15,12 @@ package hetzner
     
     import (
     	"context"
    +	"errors"
    +	"fmt"
     	"time"
     
     	"github.com/go-kit/log"
     	"github.com/hetznercloud/hcloud-go/hcloud"
    -	"github.com/pkg/errors"
     	"github.com/prometheus/common/config"
     	"github.com/prometheus/common/model"
     
    @@ -95,7 +96,7 @@ func (c *role) UnmarshalYAML(unmarshal func(interface{}) error) error {
     	case hetznerRoleRobot, hetznerRoleHcloud:
     		return nil
     	default:
    -		return errors.Errorf("unknown role %q", *c)
    +		return fmt.Errorf("unknown role %q", *c)
     	}
     }
     
    diff --git a/discovery/hetzner/robot.go b/discovery/hetzner/robot.go
    index 73d896450d1..4b7abaf77fa 100644
    --- a/discovery/hetzner/robot.go
    +++ b/discovery/hetzner/robot.go
    @@ -25,7 +25,6 @@ import (
     	"time"
     
     	"github.com/go-kit/log"
    -	"github.com/pkg/errors"
     	"github.com/prometheus/common/config"
     	"github.com/prometheus/common/model"
     	"github.com/prometheus/common/version"
    @@ -89,7 +88,7 @@ func (d *robotDiscovery) refresh(ctx context.Context) ([]*targetgroup.Group, err
     	}()
     
     	if resp.StatusCode/100 != 2 {
    -		return nil, errors.Errorf("non 2xx status '%d' response during hetzner service discovery with role robot", resp.StatusCode)
    +		return nil, fmt.Errorf("non 2xx status '%d' response during hetzner service discovery with role robot", resp.StatusCode)
     	}
     
     	b, err := io.ReadAll(resp.Body)
    diff --git a/discovery/http/http.go b/discovery/http/http.go
    index f9380ddba5d..b091461837e 100644
    --- a/discovery/http/http.go
    +++ b/discovery/http/http.go
    @@ -16,6 +16,7 @@ package http
     import (
     	"context"
     	"encoding/json"
    +	"errors"
     	"fmt"
     	"io"
     	"net/http"
    @@ -26,7 +27,6 @@ import (
     
     	"github.com/go-kit/log"
     	"github.com/grafana/regexp"
    -	"github.com/pkg/errors"
     	"github.com/prometheus/client_golang/prometheus"
     	"github.com/prometheus/common/config"
     	"github.com/prometheus/common/model"
    @@ -162,12 +162,12 @@ func (d *Discovery) refresh(ctx context.Context) ([]*targetgroup.Group, error) {
     
     	if resp.StatusCode != http.StatusOK {
     		failuresCount.Inc()
    -		return nil, errors.Errorf("server returned HTTP status %s", resp.Status)
    +		return nil, fmt.Errorf("server returned HTTP status %s", resp.Status)
     	}
     
     	if !matchContentType.MatchString(strings.TrimSpace(resp.Header.Get("Content-Type"))) {
     		failuresCount.Inc()
    -		return nil, errors.Errorf("unsupported content type %q", resp.Header.Get("Content-Type"))
    +		return nil, fmt.Errorf("unsupported content type %q", resp.Header.Get("Content-Type"))
     	}
     
     	b, err := io.ReadAll(resp.Body)
    diff --git a/discovery/kubernetes/endpoints.go b/discovery/kubernetes/endpoints.go
    index 510b33f4489..14615a09c74 100644
    --- a/discovery/kubernetes/endpoints.go
    +++ b/discovery/kubernetes/endpoints.go
    @@ -15,12 +15,13 @@ package kubernetes
     
     import (
     	"context"
    +	"errors"
    +	"fmt"
     	"net"
     	"strconv"
     
     	"github.com/go-kit/log"
     	"github.com/go-kit/log/level"
    -	"github.com/pkg/errors"
     	"github.com/prometheus/common/model"
     	apiv1 "k8s.io/api/core/v1"
     	"k8s.io/client-go/tools/cache"
    @@ -135,7 +136,7 @@ func (e *Endpoints) Run(ctx context.Context, ch chan<- []*targetgroup.Group) {
     	defer e.queue.ShutDown()
     
     	if !cache.WaitForCacheSync(ctx.Done(), e.endpointsInf.HasSynced, e.serviceInf.HasSynced, e.podInf.HasSynced) {
    -		if ctx.Err() != context.Canceled {
    +		if !errors.Is(ctx.Err(), context.Canceled) {
     			level.Error(e.logger).Log("msg", "endpoints informer unable to sync cache")
     		}
     		return
    @@ -188,7 +189,7 @@ func convertToEndpoints(o interface{}) (*apiv1.Endpoints, error) {
     		return endpoints, nil
     	}
     
    -	return nil, errors.Errorf("received unexpected object: %v", o)
    +	return nil, fmt.Errorf("received unexpected object: %v", o)
     }
     
     func endpointsSource(ep *apiv1.Endpoints) string {
    diff --git a/discovery/kubernetes/endpointslice.go b/discovery/kubernetes/endpointslice.go
    index e0ff30546e8..31bc14dd77a 100644
    --- a/discovery/kubernetes/endpointslice.go
    +++ b/discovery/kubernetes/endpointslice.go
    @@ -15,12 +15,12 @@ package kubernetes
     
     import (
     	"context"
    +	"fmt"
     	"net"
     	"strconv"
     
     	"github.com/go-kit/log"
     	"github.com/go-kit/log/level"
    -	"github.com/pkg/errors"
     	"github.com/prometheus/common/model"
     	apiv1 "k8s.io/api/core/v1"
     	v1 "k8s.io/api/discovery/v1"
    @@ -193,7 +193,7 @@ func (e *EndpointSlice) getEndpointSliceAdaptor(o interface{}) (endpointSliceAda
     	case *v1beta1.EndpointSlice:
     		return newEndpointSliceAdaptorFromV1beta1(endpointSlice), nil
     	default:
    -		return nil, errors.Errorf("received unexpected object: %v", o)
    +		return nil, fmt.Errorf("received unexpected object: %v", o)
     	}
     }
     
    diff --git a/discovery/kubernetes/ingress.go b/discovery/kubernetes/ingress.go
    index 070785f29fb..de6d2a0b4d4 100644
    --- a/discovery/kubernetes/ingress.go
    +++ b/discovery/kubernetes/ingress.go
    @@ -15,11 +15,12 @@ package kubernetes
     
     import (
     	"context"
    +	"errors"
    +	"fmt"
     	"strings"
     
     	"github.com/go-kit/log"
     	"github.com/go-kit/log/level"
    -	"github.com/pkg/errors"
     	"github.com/prometheus/common/model"
     	v1 "k8s.io/api/networking/v1"
     	"k8s.io/api/networking/v1beta1"
    @@ -78,7 +79,7 @@ func (i *Ingress) Run(ctx context.Context, ch chan<- []*targetgroup.Group) {
     	defer i.queue.ShutDown()
     
     	if !cache.WaitForCacheSync(ctx.Done(), i.informer.HasSynced) {
    -		if ctx.Err() != context.Canceled {
    +		if !errors.Is(ctx.Err(), context.Canceled) {
     			level.Error(i.logger).Log("msg", "ingress informer unable to sync cache")
     		}
     		return
    @@ -123,7 +124,7 @@ func (i *Ingress) process(ctx context.Context, ch chan<- []*targetgroup.Group) b
     		ia = newIngressAdaptorFromV1beta1(ingress)
     	default:
     		level.Error(i.logger).Log("msg", "converting to Ingress object failed", "err",
    -			errors.Errorf("received unexpected object: %v", o))
    +			fmt.Errorf("received unexpected object: %v", o))
     		return true
     	}
     	send(ctx, ch, i.buildIngress(ia))
    diff --git a/discovery/kubernetes/kubernetes.go b/discovery/kubernetes/kubernetes.go
    index b90e6a74ef4..3f417c49b3c 100644
    --- a/discovery/kubernetes/kubernetes.go
    +++ b/discovery/kubernetes/kubernetes.go
    @@ -15,6 +15,7 @@ package kubernetes
     
     import (
     	"context"
    +	"errors"
     	"fmt"
     	"os"
     	"reflect"
    @@ -24,7 +25,6 @@ import (
     
     	"github.com/go-kit/log"
     	"github.com/go-kit/log/level"
    -	"github.com/pkg/errors"
     	"github.com/prometheus/client_golang/prometheus"
     	"github.com/prometheus/common/config"
     	"github.com/prometheus/common/model"
    @@ -114,7 +114,7 @@ func (c *Role) UnmarshalYAML(unmarshal func(interface{}) error) error {
     	case RoleNode, RolePod, RoleService, RoleEndpoint, RoleEndpointSlice, RoleIngress:
     		return nil
     	default:
    -		return errors.Errorf("unknown Kubernetes SD role %q", *c)
    +		return fmt.Errorf("unknown Kubernetes SD role %q", *c)
     	}
     }
     
    @@ -178,7 +178,7 @@ func (c *SDConfig) UnmarshalYAML(unmarshal func(interface{}) error) error {
     		return err
     	}
     	if c.Role == "" {
    -		return errors.Errorf("role missing (one of: pod, service, endpoints, endpointslice, node, ingress)")
    +		return fmt.Errorf("role missing (one of: pod, service, endpoints, endpointslice, node, ingress)")
     	}
     	err = c.HTTPClientConfig.Validate()
     	if err != nil {
    @@ -186,20 +186,20 @@ func (c *SDConfig) UnmarshalYAML(unmarshal func(interface{}) error) error {
     	}
     	if c.APIServer.URL != nil && c.KubeConfig != "" {
     		// Api-server and kubeconfig_file are mutually exclusive
    -		return errors.Errorf("cannot use 'kubeconfig_file' and 'api_server' simultaneously")
    +		return fmt.Errorf("cannot use 'kubeconfig_file' and 'api_server' simultaneously")
     	}
     	if c.KubeConfig != "" && !reflect.DeepEqual(c.HTTPClientConfig, config.DefaultHTTPClientConfig) {
     		// Kubeconfig_file and custom http config are mutually exclusive
    -		return errors.Errorf("cannot use a custom HTTP client configuration together with 'kubeconfig_file'")
    +		return fmt.Errorf("cannot use a custom HTTP client configuration together with 'kubeconfig_file'")
     	}
     	if c.APIServer.URL == nil && !reflect.DeepEqual(c.HTTPClientConfig, config.DefaultHTTPClientConfig) {
    -		return errors.Errorf("to use custom HTTP client configuration please provide the 'api_server' URL explicitly")
    +		return fmt.Errorf("to use custom HTTP client configuration please provide the 'api_server' URL explicitly")
     	}
     	if c.APIServer.URL != nil && c.NamespaceDiscovery.IncludeOwnNamespace {
    -		return errors.Errorf("cannot use 'api_server' and 'namespaces.own_namespace' simultaneously")
    +		return fmt.Errorf("cannot use 'api_server' and 'namespaces.own_namespace' simultaneously")
     	}
     	if c.KubeConfig != "" && c.NamespaceDiscovery.IncludeOwnNamespace {
    -		return errors.Errorf("cannot use 'kubeconfig_file' and 'namespaces.own_namespace' simultaneously")
    +		return fmt.Errorf("cannot use 'kubeconfig_file' and 'namespaces.own_namespace' simultaneously")
     	}
     
     	foundSelectorRoles := make(map[Role]struct{})
    @@ -214,12 +214,12 @@ func (c *SDConfig) UnmarshalYAML(unmarshal func(interface{}) error) error {
     
     	for _, selector := range c.Selectors {
     		if _, ok := foundSelectorRoles[selector.Role]; ok {
    -			return errors.Errorf("duplicated selector role: %s", selector.Role)
    +			return fmt.Errorf("duplicated selector role: %s", selector.Role)
     		}
     		foundSelectorRoles[selector.Role] = struct{}{}
     
     		if _, ok := allowedSelectors[c.Role]; !ok {
    -			return errors.Errorf("invalid role: %q, expecting one of: pod, service, endpoints, endpointslice, node or ingress", c.Role)
    +			return fmt.Errorf("invalid role: %q, expecting one of: pod, service, endpoints, endpointslice, node or ingress", c.Role)
     		}
     		var allowed bool
     		for _, role := range allowedSelectors[c.Role] {
    @@ -230,7 +230,7 @@ func (c *SDConfig) UnmarshalYAML(unmarshal func(interface{}) error) error {
     		}
     
     		if !allowed {
    -			return errors.Errorf("%s role supports only %s selectors", c.Role, strings.Join(allowedSelectors[c.Role], ", "))
    +			return fmt.Errorf("%s role supports only %s selectors", c.Role, strings.Join(allowedSelectors[c.Role], ", "))
     		}
     
     		_, err := fields.ParseSelector(selector.Field)
    diff --git a/discovery/kubernetes/kubernetes_test.go b/discovery/kubernetes/kubernetes_test.go
    index 3e41c6b5844..1c6c2378050 100644
    --- a/discovery/kubernetes/kubernetes_test.go
    +++ b/discovery/kubernetes/kubernetes_test.go
    @@ -16,11 +16,11 @@ package kubernetes
     import (
     	"context"
     	"encoding/json"
    +	"errors"
     	"testing"
     	"time"
     
     	"github.com/go-kit/log"
    -	"github.com/pkg/errors"
     	"github.com/stretchr/testify/require"
     	"k8s.io/apimachinery/pkg/runtime"
     	"k8s.io/apimachinery/pkg/version"
    diff --git a/discovery/kubernetes/node.go b/discovery/kubernetes/node.go
    index 13ead155236..ebb6bbced7f 100644
    --- a/discovery/kubernetes/node.go
    +++ b/discovery/kubernetes/node.go
    @@ -15,12 +15,13 @@ package kubernetes
     
     import (
     	"context"
    +	"errors"
    +	"fmt"
     	"net"
     	"strconv"
     
     	"github.com/go-kit/log"
     	"github.com/go-kit/log/level"
    -	"github.com/pkg/errors"
     	"github.com/prometheus/common/model"
     	apiv1 "k8s.io/api/core/v1"
     	"k8s.io/client-go/tools/cache"
    @@ -85,7 +86,7 @@ func (n *Node) Run(ctx context.Context, ch chan<- []*targetgroup.Group) {
     	defer n.queue.ShutDown()
     
     	if !cache.WaitForCacheSync(ctx.Done(), n.informer.HasSynced) {
    -		if ctx.Err() != context.Canceled {
    +		if !errors.Is(ctx.Err(), context.Canceled) {
     			level.Error(n.logger).Log("msg", "node informer unable to sync cache")
     		}
     		return
    @@ -136,7 +137,7 @@ func convertToNode(o interface{}) (*apiv1.Node, error) {
     		return node, nil
     	}
     
    -	return nil, errors.Errorf("received unexpected object: %v", o)
    +	return nil, fmt.Errorf("received unexpected object: %v", o)
     }
     
     func nodeSource(n *apiv1.Node) string {
    diff --git a/discovery/kubernetes/pod.go b/discovery/kubernetes/pod.go
    index d118b4761fd..10ec4512a2c 100644
    --- a/discovery/kubernetes/pod.go
    +++ b/discovery/kubernetes/pod.go
    @@ -15,13 +15,14 @@ package kubernetes
     
     import (
     	"context"
    +	"errors"
    +	"fmt"
     	"net"
     	"strconv"
     	"strings"
     
     	"github.com/go-kit/log"
     	"github.com/go-kit/log/level"
    -	"github.com/pkg/errors"
     	"github.com/prometheus/common/model"
     	apiv1 "k8s.io/api/core/v1"
     	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
    @@ -118,7 +119,7 @@ func (p *Pod) Run(ctx context.Context, ch chan<- []*targetgroup.Group) {
     	}
     
     	if !cache.WaitForCacheSync(ctx.Done(), cacheSyncs...) {
    -		if ctx.Err() != context.Canceled {
    +		if !errors.Is(ctx.Err(), context.Canceled) {
     			level.Error(p.logger).Log("msg", "pod informer unable to sync cache")
     		}
     		return
    @@ -169,7 +170,7 @@ func convertToPod(o interface{}) (*apiv1.Pod, error) {
     		return pod, nil
     	}
     
    -	return nil, errors.Errorf("received unexpected object: %v", o)
    +	return nil, fmt.Errorf("received unexpected object: %v", o)
     }
     
     const (
    diff --git a/discovery/kubernetes/service.go b/discovery/kubernetes/service.go
    index 10753454044..4b3c4de5109 100644
    --- a/discovery/kubernetes/service.go
    +++ b/discovery/kubernetes/service.go
    @@ -15,12 +15,13 @@ package kubernetes
     
     import (
     	"context"
    +	"errors"
    +	"fmt"
     	"net"
     	"strconv"
     
     	"github.com/go-kit/log"
     	"github.com/go-kit/log/level"
    -	"github.com/pkg/errors"
     	"github.com/prometheus/common/model"
     	apiv1 "k8s.io/api/core/v1"
     	"k8s.io/client-go/tools/cache"
    @@ -81,7 +82,7 @@ func (s *Service) Run(ctx context.Context, ch chan<- []*targetgroup.Group) {
     	defer s.queue.ShutDown()
     
     	if !cache.WaitForCacheSync(ctx.Done(), s.informer.HasSynced) {
    -		if ctx.Err() != context.Canceled {
    +		if !errors.Is(ctx.Err(), context.Canceled) {
     			level.Error(s.logger).Log("msg", "service informer unable to sync cache")
     		}
     		return
    @@ -131,7 +132,7 @@ func convertToService(o interface{}) (*apiv1.Service, error) {
     	if ok {
     		return service, nil
     	}
    -	return nil, errors.Errorf("received unexpected object: %v", o)
    +	return nil, fmt.Errorf("received unexpected object: %v", o)
     }
     
     func serviceSource(s *apiv1.Service) string {
    diff --git a/discovery/legacymanager/registry.go b/discovery/legacymanager/registry.go
    index fb01e16488f..687f093829e 100644
    --- a/discovery/legacymanager/registry.go
    +++ b/discovery/legacymanager/registry.go
    @@ -14,6 +14,7 @@
     package legacymanager
     
     import (
    +	"errors"
     	"fmt"
     	"reflect"
     	"sort"
    @@ -248,7 +249,8 @@ func writeConfigs(structVal reflect.Value, configs discovery.Configs) error {
     }
     
     func replaceYAMLTypeError(err error, oldTyp, newTyp reflect.Type) error {
    -	if e, ok := err.(*yaml.TypeError); ok {
    +	var e *yaml.TypeError
    +	if errors.As(err, &e) {
     		oldStr := oldTyp.String()
     		newStr := newTyp.String()
     		for i, s := range e.Errors {
    diff --git a/discovery/marathon/marathon.go b/discovery/marathon/marathon.go
    index a84313c3880..079f93ad0be 100644
    --- a/discovery/marathon/marathon.go
    +++ b/discovery/marathon/marathon.go
    @@ -16,6 +16,7 @@ package marathon
     import (
     	"context"
     	"encoding/json"
    +	"errors"
     	"fmt"
     	"io"
     	"math/rand"
    @@ -27,7 +28,6 @@ import (
     	"time"
     
     	"github.com/go-kit/log"
    -	"github.com/pkg/errors"
     	"github.com/prometheus/common/config"
     	"github.com/prometheus/common/model"
     
    @@ -188,7 +188,7 @@ func newAuthTokenFileRoundTripper(tokenFile string, rt http.RoundTripper) (http.
     	// fail-fast if we can't read the file.
     	_, err := os.ReadFile(tokenFile)
     	if err != nil {
    -		return nil, errors.Wrapf(err, "unable to read auth token file %s", tokenFile)
    +		return nil, fmt.Errorf("unable to read auth token file %s: %w", tokenFile, err)
     	}
     	return &authTokenFileRoundTripper{tokenFile, rt}, nil
     }
    @@ -196,7 +196,7 @@ func newAuthTokenFileRoundTripper(tokenFile string, rt http.RoundTripper) (http.
     func (rt *authTokenFileRoundTripper) RoundTrip(request *http.Request) (*http.Response, error) {
     	b, err := os.ReadFile(rt.authTokenFile)
     	if err != nil {
    -		return nil, errors.Wrapf(err, "unable to read auth token file %s", rt.authTokenFile)
    +		return nil, fmt.Errorf("unable to read auth token file %s: %w", rt.authTokenFile, err)
     	}
     	authToken := strings.TrimSpace(string(b))
     
    @@ -336,7 +336,7 @@ func fetchApps(ctx context.Context, client *http.Client, url string) (*appList,
     	}()
     
     	if (resp.StatusCode < 200) || (resp.StatusCode >= 300) {
    -		return nil, errors.Errorf("non 2xx status '%v' response during marathon service discovery", resp.StatusCode)
    +		return nil, fmt.Errorf("non 2xx status '%v' response during marathon service discovery", resp.StatusCode)
     	}
     
     	b, err := io.ReadAll(resp.Body)
    @@ -347,7 +347,7 @@ func fetchApps(ctx context.Context, client *http.Client, url string) (*appList,
     	var apps appList
     	err = json.Unmarshal(b, &apps)
     	if err != nil {
    -		return nil, errors.Wrapf(err, "%q", url)
    +		return nil, fmt.Errorf("%q: %w", url, err)
     	}
     	return &apps, nil
     }
    diff --git a/discovery/marathon/marathon_test.go b/discovery/marathon/marathon_test.go
    index 4310ed847ce..415456c7ac5 100644
    --- a/discovery/marathon/marathon_test.go
    +++ b/discovery/marathon/marathon_test.go
    @@ -54,7 +54,7 @@ func TestMarathonSDHandleError(t *testing.T) {
     		}
     	)
     	tgs, err := testUpdateServices(client)
    -	if err != errTesting {
    +	if !errors.Is(err, errTesting) {
     		t.Fatalf("Expected error: %s", err)
     	}
     	if len(tgs) != 0 {
    diff --git a/discovery/openstack/hypervisor.go b/discovery/openstack/hypervisor.go
    index 94d47d3604c..16964cfb620 100644
    --- a/discovery/openstack/hypervisor.go
    +++ b/discovery/openstack/hypervisor.go
    @@ -23,7 +23,6 @@ import (
     	"github.com/gophercloud/gophercloud/openstack"
     	"github.com/gophercloud/gophercloud/openstack/compute/v2/extensions/hypervisors"
     	"github.com/gophercloud/gophercloud/pagination"
    -	"github.com/pkg/errors"
     	"github.com/prometheus/common/model"
     
     	"github.com/prometheus/prometheus/discovery/targetgroup"
    @@ -62,14 +61,14 @@ func (h *HypervisorDiscovery) refresh(ctx context.Context) ([]*targetgroup.Group
     	h.provider.Context = ctx
     	err := openstack.Authenticate(h.provider, *h.authOpts)
     	if err != nil {
    -		return nil, errors.Wrap(err, "could not authenticate to OpenStack")
    +		return nil, fmt.Errorf("could not authenticate to OpenStack: %w", err)
     	}
     
     	client, err := openstack.NewComputeV2(h.provider, gophercloud.EndpointOpts{
     		Region: h.region, Availability: h.availability,
     	})
     	if err != nil {
    -		return nil, errors.Wrap(err, "could not create OpenStack compute session")
    +		return nil, fmt.Errorf("could not create OpenStack compute session: %w", err)
     	}
     
     	tg := &targetgroup.Group{
    @@ -81,7 +80,7 @@ func (h *HypervisorDiscovery) refresh(ctx context.Context) ([]*targetgroup.Group
     	err = pagerHypervisors.EachPage(func(page pagination.Page) (bool, error) {
     		hypervisorList, err := hypervisors.ExtractHypervisors(page)
     		if err != nil {
    -			return false, errors.Wrap(err, "could not extract hypervisors")
    +			return false, fmt.Errorf("could not extract hypervisors: %w", err)
     		}
     		for _, hypervisor := range hypervisorList {
     			labels := model.LabelSet{}
    diff --git a/discovery/openstack/instance.go b/discovery/openstack/instance.go
    index b4e67825a4c..2f7e99a0712 100644
    --- a/discovery/openstack/instance.go
    +++ b/discovery/openstack/instance.go
    @@ -25,7 +25,6 @@ import (
     	"github.com/gophercloud/gophercloud/openstack/compute/v2/extensions/floatingips"
     	"github.com/gophercloud/gophercloud/openstack/compute/v2/servers"
     	"github.com/gophercloud/gophercloud/pagination"
    -	"github.com/pkg/errors"
     	"github.com/prometheus/common/model"
     
     	"github.com/prometheus/prometheus/discovery/targetgroup"
    @@ -79,14 +78,14 @@ func (i *InstanceDiscovery) refresh(ctx context.Context) ([]*targetgroup.Group,
     	i.provider.Context = ctx
     	err := openstack.Authenticate(i.provider, *i.authOpts)
     	if err != nil {
    -		return nil, errors.Wrap(err, "could not authenticate to OpenStack")
    +		return nil, fmt.Errorf("could not authenticate to OpenStack: %w", err)
     	}
     
     	client, err := openstack.NewComputeV2(i.provider, gophercloud.EndpointOpts{
     		Region: i.region, Availability: i.availability,
     	})
     	if err != nil {
    -		return nil, errors.Wrap(err, "could not create OpenStack compute session")
    +		return nil, fmt.Errorf("could not create OpenStack compute session: %w", err)
     	}
     
     	// OpenStack API reference
    @@ -97,7 +96,7 @@ func (i *InstanceDiscovery) refresh(ctx context.Context) ([]*targetgroup.Group,
     	err = pagerFIP.EachPage(func(page pagination.Page) (bool, error) {
     		result, err := floatingips.ExtractFloatingIPs(page)
     		if err != nil {
    -			return false, errors.Wrap(err, "could not extract floatingips")
    +			return false, fmt.Errorf("could not extract floatingips: %w", err)
     		}
     		for _, ip := range result {
     			// Skip not associated ips
    @@ -124,11 +123,11 @@ func (i *InstanceDiscovery) refresh(ctx context.Context) ([]*targetgroup.Group,
     	}
     	err = pager.EachPage(func(page pagination.Page) (bool, error) {
     		if ctx.Err() != nil {
    -			return false, errors.Wrap(ctx.Err(), "could not extract instances")
    +			return false, fmt.Errorf("could not extract instances: %w", ctx.Err())
     		}
     		instanceList, err := servers.ExtractServers(page)
     		if err != nil {
    -			return false, errors.Wrap(err, "could not extract instances")
    +			return false, fmt.Errorf("could not extract instances: %w", err)
     		}
     
     		for _, s := range instanceList {
    diff --git a/discovery/openstack/openstack.go b/discovery/openstack/openstack.go
    index 932a4f5c2fb..2505542abe1 100644
    --- a/discovery/openstack/openstack.go
    +++ b/discovery/openstack/openstack.go
    @@ -15,6 +15,7 @@ package openstack
     
     import (
     	"context"
    +	"errors"
     	"fmt"
     	"net/http"
     	"time"
    @@ -23,7 +24,6 @@ import (
     	"github.com/gophercloud/gophercloud"
     	"github.com/gophercloud/gophercloud/openstack"
     	conntrack "github.com/mwitkow/go-conntrack"
    -	"github.com/pkg/errors"
     	"github.com/prometheus/common/config"
     	"github.com/prometheus/common/model"
     
    @@ -100,7 +100,7 @@ func (c *Role) UnmarshalYAML(unmarshal func(interface{}) error) error {
     	case OpenStackRoleHypervisor, OpenStackRoleInstance:
     		return nil
     	default:
    -		return errors.Errorf("unknown OpenStack SD role %q", *c)
    +		return fmt.Errorf("unknown OpenStack SD role %q", *c)
     	}
     }
     
    diff --git a/discovery/puppetdb/puppetdb.go b/discovery/puppetdb/puppetdb.go
    index 19ee7a205c2..62449168e0d 100644
    --- a/discovery/puppetdb/puppetdb.go
    +++ b/discovery/puppetdb/puppetdb.go
    @@ -29,7 +29,6 @@ import (
     
     	"github.com/go-kit/log"
     	"github.com/grafana/regexp"
    -	"github.com/pkg/errors"
     	"github.com/prometheus/common/config"
     	"github.com/prometheus/common/model"
     	"github.com/prometheus/common/version"
    @@ -191,11 +190,11 @@ func (d *Discovery) refresh(ctx context.Context) ([]*targetgroup.Group, error) {
     	}()
     
     	if resp.StatusCode != http.StatusOK {
    -		return nil, errors.Errorf("server returned HTTP status %s", resp.Status)
    +		return nil, fmt.Errorf("server returned HTTP status %s", resp.Status)
     	}
     
     	if ct := resp.Header.Get("Content-Type"); !matchContentType.MatchString(ct) {
    -		return nil, errors.Errorf("unsupported content type %s", resp.Header.Get("Content-Type"))
    +		return nil, fmt.Errorf("unsupported content type %s", resp.Header.Get("Content-Type"))
     	}
     
     	b, err := io.ReadAll(resp.Body)
    diff --git a/discovery/refresh/refresh.go b/discovery/refresh/refresh.go
    index 1b42a70c58c..043b2f7ba87 100644
    --- a/discovery/refresh/refresh.go
    +++ b/discovery/refresh/refresh.go
    @@ -15,6 +15,7 @@ package refresh
     
     import (
     	"context"
    +	"errors"
     	"time"
     
     	"github.com/go-kit/log"
    @@ -75,7 +76,7 @@ func (d *Discovery) Run(ctx context.Context, ch chan<- []*targetgroup.Group) {
     	// Get an initial set right away.
     	tgs, err := d.refresh(ctx)
     	if err != nil {
    -		if ctx.Err() != context.Canceled {
    +		if !errors.Is(ctx.Err(), context.Canceled) {
     			level.Error(d.logger).Log("msg", "Unable to refresh target groups", "err", err.Error())
     		}
     	} else {
    @@ -94,7 +95,7 @@ func (d *Discovery) Run(ctx context.Context, ch chan<- []*targetgroup.Group) {
     		case <-ticker.C:
     			tgs, err := d.refresh(ctx)
     			if err != nil {
    -				if ctx.Err() != context.Canceled {
    +				if !errors.Is(ctx.Err(), context.Canceled) {
     					level.Error(d.logger).Log("msg", "Unable to refresh target groups", "err", err.Error())
     				}
     				continue
    diff --git a/discovery/registry.go b/discovery/registry.go
    index 2ebb36cb290..8274628c234 100644
    --- a/discovery/registry.go
    +++ b/discovery/registry.go
    @@ -14,6 +14,7 @@
     package discovery
     
     import (
    +	"errors"
     	"fmt"
     	"reflect"
     	"sort"
    @@ -247,7 +248,8 @@ func writeConfigs(structVal reflect.Value, configs Configs) error {
     }
     
     func replaceYAMLTypeError(err error, oldTyp, newTyp reflect.Type) error {
    -	if e, ok := err.(*yaml.TypeError); ok {
    +	var e *yaml.TypeError
    +	if errors.As(err, &e) {
     		oldStr := oldTyp.String()
     		newStr := newTyp.String()
     		for i, s := range e.Errors {
    diff --git a/discovery/scaleway/scaleway.go b/discovery/scaleway/scaleway.go
    index d4ed8a69d34..90091b31725 100644
    --- a/discovery/scaleway/scaleway.go
    +++ b/discovery/scaleway/scaleway.go
    @@ -15,13 +15,14 @@ package scaleway
     
     import (
     	"context"
    +	"errors"
    +	"fmt"
     	"net/http"
     	"os"
     	"strings"
     	"time"
     
     	"github.com/go-kit/log"
    -	"github.com/pkg/errors"
     	"github.com/prometheus/common/config"
     	"github.com/prometheus/common/model"
     	"github.com/scaleway/scaleway-sdk-go/scw"
    @@ -61,7 +62,7 @@ func (c *role) UnmarshalYAML(unmarshal func(interface{}) error) error {
     	case roleInstance, roleBaremetal:
     		return nil
     	default:
    -		return errors.Errorf("unknown role %q", *c)
    +		return fmt.Errorf("unknown role %q", *c)
     	}
     }
     
    @@ -228,7 +229,7 @@ func newAuthTokenFileRoundTripper(tokenFile string, rt http.RoundTripper) (http.
     	// fail-fast if we can't read the file.
     	_, err := os.ReadFile(tokenFile)
     	if err != nil {
    -		return nil, errors.Wrapf(err, "unable to read auth token file %s", tokenFile)
    +		return nil, fmt.Errorf("unable to read auth token file %s: %w", tokenFile, err)
     	}
     	return &authTokenFileRoundTripper{tokenFile, rt}, nil
     }
    @@ -236,7 +237,7 @@ func newAuthTokenFileRoundTripper(tokenFile string, rt http.RoundTripper) (http.
     func (rt *authTokenFileRoundTripper) RoundTrip(request *http.Request) (*http.Response, error) {
     	b, err := os.ReadFile(rt.authTokenFile)
     	if err != nil {
    -		return nil, errors.Wrapf(err, "unable to read auth token file %s", rt.authTokenFile)
    +		return nil, fmt.Errorf("unable to read auth token file %s: %w", rt.authTokenFile, err)
     	}
     	authToken := strings.TrimSpace(string(b))
     
    diff --git a/discovery/triton/triton.go b/discovery/triton/triton.go
    index ef3bcca6366..54c67b121f6 100644
    --- a/discovery/triton/triton.go
    +++ b/discovery/triton/triton.go
    @@ -16,6 +16,7 @@ package triton
     import (
     	"context"
     	"encoding/json"
    +	"errors"
     	"fmt"
     	"io"
     	"net/http"
    @@ -25,7 +26,6 @@ import (
     
     	"github.com/go-kit/log"
     	conntrack "github.com/mwitkow/go-conntrack"
    -	"github.com/pkg/errors"
     	"github.com/prometheus/common/config"
     	"github.com/prometheus/common/model"
     
    @@ -202,7 +202,7 @@ func (d *Discovery) refresh(ctx context.Context) ([]*targetgroup.Group, error) {
     	req = req.WithContext(ctx)
     	resp, err := d.client.Do(req)
     	if err != nil {
    -		return nil, errors.Wrap(err, "an error occurred when requesting targets from the discovery endpoint")
    +		return nil, fmt.Errorf("an error occurred when requesting targets from the discovery endpoint: %w", err)
     	}
     
     	defer func() {
    @@ -212,7 +212,7 @@ func (d *Discovery) refresh(ctx context.Context) ([]*targetgroup.Group, error) {
     
     	data, err := io.ReadAll(resp.Body)
     	if err != nil {
    -		return nil, errors.Wrap(err, "an error occurred when reading the response body")
    +		return nil, fmt.Errorf("an error occurred when reading the response body: %w", err)
     	}
     
     	// The JSON response body is different so it needs to be processed/mapped separately.
    @@ -234,7 +234,7 @@ func (d *Discovery) processContainerResponse(data []byte, endpoint string) ([]*t
     	dr := DiscoveryResponse{}
     	err := json.Unmarshal(data, &dr)
     	if err != nil {
    -		return nil, errors.Wrap(err, "an error occurred unmarshaling the discovery response json")
    +		return nil, fmt.Errorf("an error occurred unmarshaling the discovery response json: %w", err)
     	}
     
     	for _, container := range dr.Containers {
    @@ -267,7 +267,7 @@ func (d *Discovery) processComputeNodeResponse(data []byte, endpoint string) ([]
     	dr := ComputeNodeDiscoveryResponse{}
     	err := json.Unmarshal(data, &dr)
     	if err != nil {
    -		return nil, errors.Wrap(err, "an error occurred unmarshaling the compute node discovery response json")
    +		return nil, fmt.Errorf("an error occurred unmarshaling the compute node discovery response json: %w", err)
     	}
     
     	for _, cn := range dr.ComputeNodes {
    diff --git a/discovery/uyuni/uyuni.go b/discovery/uyuni/uyuni.go
    index b60ef2a4d1d..f9630ce3570 100644
    --- a/discovery/uyuni/uyuni.go
    +++ b/discovery/uyuni/uyuni.go
    @@ -15,6 +15,7 @@ package uyuni
     
     import (
     	"context"
    +	"errors"
     	"fmt"
     	"net/http"
     	"net/url"
    @@ -24,7 +25,6 @@ import (
     
     	"github.com/go-kit/log"
     	"github.com/kolo/xmlrpc"
    -	"github.com/pkg/errors"
     	"github.com/prometheus/common/config"
     	"github.com/prometheus/common/model"
     
    @@ -131,7 +131,7 @@ func (c *SDConfig) UnmarshalYAML(unmarshal func(interface{}) error) error {
     
     	_, err = url.Parse(c.Server)
     	if err != nil {
    -		return errors.Wrap(err, "Uyuni Server URL is not valid")
    +		return fmt.Errorf("Uyuni Server URL is not valid: %w", err)
     	}
     
     	if c.Username == "" {
    @@ -276,7 +276,7 @@ func (d *Discovery) getTargetsForSystems(
     
     	systemGroupIDsBySystemID, err := getSystemGroupsInfoOfMonitoredClients(rpcClient, d.token, entitlement)
     	if err != nil {
    -		return nil, errors.Wrap(err, "unable to get the managed system groups information of monitored clients")
    +		return nil, fmt.Errorf("unable to get the managed system groups information of monitored clients: %w", err)
     	}
     
     	systemIDs := make([]int, 0, len(systemGroupIDsBySystemID))
    @@ -286,12 +286,12 @@ func (d *Discovery) getTargetsForSystems(
     
     	endpointInfos, err := getEndpointInfoForSystems(rpcClient, d.token, systemIDs)
     	if err != nil {
    -		return nil, errors.Wrap(err, "unable to get endpoints information")
    +		return nil, fmt.Errorf("unable to get endpoints information: %w", err)
     	}
     
     	networkInfoBySystemID, err := getNetworkInformationForSystems(rpcClient, d.token, systemIDs)
     	if err != nil {
    -		return nil, errors.Wrap(err, "unable to get the systems network information")
    +		return nil, fmt.Errorf("unable to get the systems network information: %w", err)
     	}
     
     	for _, endpoint := range endpointInfos {
    @@ -317,7 +317,7 @@ func (d *Discovery) refresh(_ context.Context) ([]*targetgroup.Group, error) {
     		// Uyuni API takes duration in seconds.
     		d.token, err = login(rpcClient, d.username, d.password, int(tokenDuration.Seconds()))
     		if err != nil {
    -			return nil, errors.Wrap(err, "unable to login to Uyuni API")
    +			return nil, fmt.Errorf("unable to login to Uyuni API: %w", err)
     		}
     		// Login again at half the token lifetime.
     		d.tokenExpiration = time.Now().Add(tokenDuration / 2)
    diff --git a/discovery/xds/kuma.go b/discovery/xds/kuma.go
    index 03816e76278..bc88ba55404 100644
    --- a/discovery/xds/kuma.go
    +++ b/discovery/xds/kuma.go
    @@ -20,7 +20,6 @@ import (
     
     	"github.com/go-kit/log"
     	"github.com/go-kit/log/level"
    -	"github.com/pkg/errors"
     	"github.com/prometheus/client_golang/prometheus"
     	"github.com/prometheus/common/config"
     	"github.com/prometheus/common/model"
    @@ -92,7 +91,7 @@ func (c *KumaSDConfig) UnmarshalYAML(unmarshal func(interface{}) error) error {
     	}
     
     	if len(c.Server) == 0 {
    -		return errors.Errorf("kuma SD server must not be empty: %s", c.Server)
    +		return fmt.Errorf("kuma SD server must not be empty: %s", c.Server)
     	}
     	parsedURL, err := url.Parse(c.Server)
     	if err != nil {
    @@ -100,7 +99,7 @@ func (c *KumaSDConfig) UnmarshalYAML(unmarshal func(interface{}) error) error {
     	}
     
     	if len(parsedURL.Scheme) == 0 || len(parsedURL.Host) == 0 {
    -		return errors.Errorf("kuma SD server must not be empty and have a scheme: %s", c.Server)
    +		return fmt.Errorf("kuma SD server must not be empty and have a scheme: %s", c.Server)
     	}
     
     	return c.HTTPClientConfig.Validate()
    @@ -159,7 +158,7 @@ func convertKumaUserLabels(labels map[string]string) model.LabelSet {
     // kumaMadsV1ResourceParser is an xds.resourceParser.
     func kumaMadsV1ResourceParser(resources []*anypb.Any, typeURL string) ([]model.LabelSet, error) {
     	if typeURL != KumaMadsV1ResourceTypeURL {
    -		return nil, errors.Errorf("received invalid typeURL for Kuma MADS v1 Resource: %s", typeURL)
    +		return nil, fmt.Errorf("received invalid typeURL for Kuma MADS v1 Resource: %s", typeURL)
     	}
     
     	var targets []model.LabelSet
    diff --git a/discovery/xds/kuma_test.go b/discovery/xds/kuma_test.go
    index 008d63a3713..1db0a0831d4 100644
    --- a/discovery/xds/kuma_test.go
    +++ b/discovery/xds/kuma_test.go
    @@ -15,12 +15,12 @@ package xds
     
     import (
     	"context"
    +	"errors"
     	"fmt"
     	"testing"
     	"time"
     
     	v3 "github.com/envoyproxy/go-control-plane/envoy/service/discovery/v3"
    -	"github.com/pkg/errors"
     	"github.com/prometheus/common/model"
     	"github.com/stretchr/testify/require"
     	"google.golang.org/protobuf/proto"
    diff --git a/discovery/zookeeper/zookeeper.go b/discovery/zookeeper/zookeeper.go
    index 528bdf073d4..308d63a5fcf 100644
    --- a/discovery/zookeeper/zookeeper.go
    +++ b/discovery/zookeeper/zookeeper.go
    @@ -16,6 +16,7 @@ package zookeeper
     import (
     	"context"
     	"encoding/json"
    +	"errors"
     	"fmt"
     	"net"
     	"strconv"
    @@ -24,7 +25,6 @@ import (
     
     	"github.com/go-kit/log"
     	"github.com/go-zookeeper/zk"
    -	"github.com/pkg/errors"
     	"github.com/prometheus/common/model"
     
     	"github.com/prometheus/prometheus/discovery"
    @@ -80,7 +80,7 @@ func (c *ServersetSDConfig) UnmarshalYAML(unmarshal func(interface{}) error) err
     	}
     	for _, path := range c.Paths {
     		if !strings.HasPrefix(path, "/") {
    -			return errors.Errorf("serverset SD config paths must begin with '/': %s", path)
    +			return fmt.Errorf("serverset SD config paths must begin with '/': %s", path)
     		}
     	}
     	return nil
    @@ -117,7 +117,7 @@ func (c *NerveSDConfig) UnmarshalYAML(unmarshal func(interface{}) error) error {
     	}
     	for _, path := range c.Paths {
     		if !strings.HasPrefix(path, "/") {
    -			return errors.Errorf("nerve SD config paths must begin with '/': %s", path)
    +			return fmt.Errorf("nerve SD config paths must begin with '/': %s", path)
     		}
     	}
     	return nil
    @@ -263,7 +263,7 @@ func parseServersetMember(data []byte, path string) (model.LabelSet, error) {
     	member := serversetMember{}
     
     	if err := json.Unmarshal(data, &member); err != nil {
    -		return nil, errors.Wrapf(err, "error unmarshaling serverset member %q", path)
    +		return nil, fmt.Errorf("error unmarshaling serverset member %q: %w", path, err)
     	}
     
     	labels := model.LabelSet{}
    @@ -305,7 +305,7 @@ func parseNerveMember(data []byte, path string) (model.LabelSet, error) {
     	member := nerveMember{}
     	err := json.Unmarshal(data, &member)
     	if err != nil {
    -		return nil, errors.Wrapf(err, "error unmarshaling nerve member %q", path)
    +		return nil, fmt.Errorf("error unmarshaling nerve member %q: %w", path, err)
     	}
     
     	labels := model.LabelSet{}
    
    From 636f7e5483966fd6cb39b424984353653ec7d563 Mon Sep 17 00:00:00 2001
    From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
    Date: Fri, 3 Jun 2022 13:48:47 +0200
    Subject: [PATCH 099/135] build(deps): bump k8s.io/apimachinery from 0.24.0 to
     0.24.1 (#10806)
    
    Bumps [k8s.io/apimachinery](https://github.com/kubernetes/apimachinery) from 0.24.0 to 0.24.1.
    - [Release notes](https://github.com/kubernetes/apimachinery/releases)
    - [Commits](https://github.com/kubernetes/apimachinery/compare/v0.24.0...v0.24.1)
    
    ---
    updated-dependencies:
    - dependency-name: k8s.io/apimachinery
      dependency-type: direct:production
      update-type: version-update:semver-patch
    ...
    
    Signed-off-by: dependabot[bot] 
    
    Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
    ---
     go.mod | 2 +-
     go.sum | 3 ++-
     2 files changed, 3 insertions(+), 2 deletions(-)
    
    diff --git a/go.mod b/go.mod
    index b5e2c6570ce..dce9a524b0a 100644
    --- a/go.mod
    +++ b/go.mod
    @@ -73,7 +73,7 @@ require (
     	gopkg.in/yaml.v2 v2.4.0
     	gopkg.in/yaml.v3 v3.0.1
     	k8s.io/api v0.24.0
    -	k8s.io/apimachinery v0.24.0
    +	k8s.io/apimachinery v0.24.1
     	k8s.io/client-go v0.24.0
     	k8s.io/klog v1.0.0
     	k8s.io/klog/v2 v2.60.1
    diff --git a/go.sum b/go.sum
    index 47785695a58..ee2bcdfb2ea 100644
    --- a/go.sum
    +++ b/go.sum
    @@ -1452,8 +1452,9 @@ honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9
     honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=
     k8s.io/api v0.24.0 h1:J0hann2hfxWr1hinZIDefw7Q96wmCBx6SSB8IY0MdDg=
     k8s.io/api v0.24.0/go.mod h1:5Jl90IUrJHUJYEMANRURMiVvJ0g7Ax7r3R1bqO8zx8I=
    -k8s.io/apimachinery v0.24.0 h1:ydFCyC/DjCvFCHK5OPMKBlxayQytB8pxy8YQInd5UyQ=
     k8s.io/apimachinery v0.24.0/go.mod h1:82Bi4sCzVBdpYjyI4jY6aHX+YCUchUIrZrXKedjd2UM=
    +k8s.io/apimachinery v0.24.1 h1:ShD4aDxTQKN5zNf8K1RQ2u98ELLdIW7jEnlO9uAMX/I=
    +k8s.io/apimachinery v0.24.1/go.mod h1:82Bi4sCzVBdpYjyI4jY6aHX+YCUchUIrZrXKedjd2UM=
     k8s.io/client-go v0.24.0 h1:lbE4aB1gTHvYFSwm6eD3OF14NhFDKCejlnsGYlSJe5U=
     k8s.io/client-go v0.24.0/go.mod h1:VFPQET+cAFpYxh6Bq6f4xyMY80G6jKKktU6G0m00VDw=
     k8s.io/gengo v0.0.0-20210813121822-485abfe95c7c/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E=
    
    From 355b8bcf0b974e806352bbf12bbe8f7bcec2319b Mon Sep 17 00:00:00 2001
    From: David Leadbeater 
    Date: Fri, 3 Jun 2022 23:33:39 +1000
    Subject: [PATCH 100/135] Add --lint-fatal option (#10815)
    
    This keeps the previous behaviour of printing details about duplicate
    rules but doesn't exit with a fatal exit code unless turned on.
    
    Signed-off-by: David Leadbeater 
    ---
     cmd/promtool/main.go | 41 +++++++++++++++++++++++++----------------
     1 file changed, 25 insertions(+), 16 deletions(-)
    
    diff --git a/cmd/promtool/main.go b/cmd/promtool/main.go
    index 01d953d2049..ad802e48240 100644
    --- a/cmd/promtool/main.go
    +++ b/cmd/promtool/main.go
    @@ -95,6 +95,9 @@ func main() {
     		"lint",
     		"Linting checks to apply to the rules specified in the config. Available options are: "+strings.Join(lintOptions, ", ")+". Use --lint=none to disable linting",
     	).Default(lintOptionDuplicateRules).String()
    +	checkConfigLintFatal := checkConfigCmd.Flag(
    +		"lint-fatal",
    +		"Make lint errors exit with exit code 3.").Default("false").Bool()
     
     	checkWebConfigCmd := checkCmd.Command("web-config", "Check if the web config files are valid or not.")
     	webConfigFiles := checkWebConfigCmd.Arg(
    @@ -111,6 +114,9 @@ func main() {
     		"lint",
     		"Linting checks to apply. Available options are: "+strings.Join(lintOptions, ", ")+". Use --lint=none to disable linting",
     	).Default(lintOptionDuplicateRules).String()
    +	checkRulesLintFatal := checkRulesCmd.Flag(
    +		"lint-fatal",
    +		"Make lint errors exit with exit code 3.").Default("false").Bool()
     
     	checkMetricsCmd := checkCmd.Command("metrics", checkMetricsUsage)
     	checkMetricsExtended := checkCmd.Flag("extended", "Print extended information related to the cardinality of the metrics.").Bool()
    @@ -236,13 +242,13 @@ func main() {
     		os.Exit(CheckSD(*sdConfigFile, *sdJobName, *sdTimeout))
     
     	case checkConfigCmd.FullCommand():
    -		os.Exit(CheckConfig(*agentMode, *checkConfigSyntaxOnly, newLintConfig(*checkConfigLint), *configFiles...))
    +		os.Exit(CheckConfig(*agentMode, *checkConfigSyntaxOnly, newLintConfig(*checkConfigLint, *checkConfigLintFatal), *configFiles...))
     
     	case checkWebConfigCmd.FullCommand():
     		os.Exit(CheckWebConfig(*webConfigFiles...))
     
     	case checkRulesCmd.FullCommand():
    -		os.Exit(CheckRules(newLintConfig(*checkRulesLint), *ruleFiles...))
    +		os.Exit(CheckRules(newLintConfig(*checkRulesLint, *checkRulesLintFatal), *ruleFiles...))
     
     	case checkMetricsCmd.FullCommand():
     		os.Exit(CheckMetrics(*checkMetricsExtended))
    @@ -303,11 +309,14 @@ var lintError = fmt.Errorf("lint error")
     type lintConfig struct {
     	all            bool
     	duplicateRules bool
    +	fatal          bool
     }
     
    -func newLintConfig(stringVal string) lintConfig {
    +func newLintConfig(stringVal string, fatal bool) lintConfig {
     	items := strings.Split(stringVal, ",")
    -	ls := lintConfig{}
    +	ls := lintConfig{
    +		fatal: fatal,
    +	}
     	for _, setting := range items {
     		switch setting {
     		case lintOptionAll:
    @@ -329,7 +338,7 @@ func (ls lintConfig) lintDuplicateRules() bool {
     // CheckConfig validates configuration files.
     func CheckConfig(agentMode, checkSyntaxOnly bool, lintSettings lintConfig, files ...string) int {
     	failed := false
    -	hasLintErrors := false
    +	hasErrors := false
     
     	for _, f := range files {
     		ruleFiles, err := checkConfig(agentMode, f, checkSyntaxOnly)
    @@ -352,7 +361,7 @@ func CheckConfig(agentMode, checkSyntaxOnly bool, lintSettings lintConfig, files
     				}
     				failed = true
     				for _, err := range errs {
    -					hasLintErrors = hasLintErrors || errors.Is(err, lintError)
    +					hasErrors = hasErrors || !errors.Is(err, lintError)
     				}
     			} else {
     				fmt.Printf("  SUCCESS: %d rules found\n", n)
    @@ -360,12 +369,12 @@ func CheckConfig(agentMode, checkSyntaxOnly bool, lintSettings lintConfig, files
     			fmt.Println()
     		}
     	}
    -	if failed && hasLintErrors {
    -		return lintErrExitCode
    -	}
    -	if failed {
    +	if failed && hasErrors {
     		return failureExitCode
     	}
    +	if failed && lintSettings.fatal {
    +		return lintErrExitCode
    +	}
     	return successExitCode
     }
     
    @@ -573,7 +582,7 @@ func checkSDFile(filename string) ([]*targetgroup.Group, error) {
     // CheckRules validates rule files.
     func CheckRules(ls lintConfig, files ...string) int {
     	failed := false
    -	hasLintErrors := false
    +	hasErrors := false
     
     	for _, f := range files {
     		if n, errs := checkRules(f, ls); errs != nil {
    @@ -583,19 +592,19 @@ func CheckRules(ls lintConfig, files ...string) int {
     			}
     			failed = true
     			for _, err := range errs {
    -				hasLintErrors = hasLintErrors || errors.Is(err, lintError)
    +				hasErrors = hasErrors || !errors.Is(err, lintError)
     			}
     		} else {
     			fmt.Printf("  SUCCESS: %d rules found\n", n)
     		}
     		fmt.Println()
     	}
    -	if failed && hasLintErrors {
    -		return lintErrExitCode
    -	}
    -	if failed {
    +	if failed && hasErrors {
     		return failureExitCode
     	}
    +	if failed && ls.fatal {
    +		return lintErrExitCode
    +	}
     	return successExitCode
     }
     
    
    From b11062bfccc9c8b2f7827aa2dc611b005025ad40 Mon Sep 17 00:00:00 2001
    From: =?UTF-8?q?=C5=81ukasz=20Mierzwa?= 
    Date: Sat, 4 Jun 2022 04:15:02 +0100
    Subject: [PATCH 101/135] Don't count added labels when initializing slice
     (#10756)
    MIME-Version: 1.0
    Content-Type: text/plain; charset=UTF-8
    Content-Transfer-Encoding: 8bit
    
    This was added in #10749 but based on feedback it might be over-allocating so worth removing.
    
    Signed-off-by: Łukasz Mierzwa 
    ---
     model/labels/labels.go | 2 +-
     1 file changed, 1 insertion(+), 1 deletion(-)
    
    diff --git a/model/labels/labels.go b/model/labels/labels.go
    index af321a37c61..29b7385c8d9 100644
    --- a/model/labels/labels.go
    +++ b/model/labels/labels.go
    @@ -452,7 +452,7 @@ func (b *Builder) Labels() Labels {
     
     	// In the general case, labels are removed, modified or moved
     	// rather than added.
    -	res := make(Labels, 0, len(b.base)+len(b.add))
    +	res := make(Labels, 0, len(b.base))
     Outer:
     	for _, l := range b.base {
     		for _, n := range b.del {
    
    From 143a760e769d482914cf9ac587750092a95b05ca Mon Sep 17 00:00:00 2001
    From: Julien Pivotto 
    Date: Sun, 5 Jun 2022 07:54:43 +0200
    Subject: [PATCH 102/135] Hetzner SD: Implement set directory (#10813)
    
    Makes path relative to Prometheus config file.
    
    Signed-off-by: Julien Pivotto 
    ---
     discovery/hetzner/hetzner.go | 5 +++++
     1 file changed, 5 insertions(+)
    
    diff --git a/discovery/hetzner/hetzner.go b/discovery/hetzner/hetzner.go
    index f4fe243b49e..084319d9592 100644
    --- a/discovery/hetzner/hetzner.go
    +++ b/discovery/hetzner/hetzner.go
    @@ -115,6 +115,11 @@ func (c *SDConfig) UnmarshalYAML(unmarshal func(interface{}) error) error {
     	return c.HTTPClientConfig.Validate()
     }
     
    +// SetDirectory joins any relative file paths with dir.
    +func (c *SDConfig) SetDirectory(dir string) {
    +	c.HTTPClientConfig.SetDirectory(dir)
    +}
    +
     // Discovery periodically performs Hetzner requests. It implements
     // the Discoverer interface.
     type Discovery struct {
    
    From 2e2c014d52756a8379381c838b80f84d12f6d91b Mon Sep 17 00:00:00 2001
    From: Bryan Boreham 
    Date: Tue, 7 Jun 2022 05:38:27 +0100
    Subject: [PATCH 103/135] Labels: optimise creation of signature with/without
     labels (#10667)
    
    * Labels: create signature with/without labels
    
    Instead of creating a new Labels slice then converting to signature,
    go directly to the signature and save time.
    
    Signed-off-by: Bryan Boreham 
    
    * Labels: refactor Builder tests
    
    Have one test with a range of cases, and have them check the final
    output rather than checking the internal structure of the Builder.
    
    Also add a couple of cases where the value is "", which should be
    interpreted as 'delete'.
    
    Signed-off-by: Bryan Boreham 
    
    * Labels: add 'Keep' function to Builder
    
    This lets us replace `Labels.WithLabels` with the more general `Builder`.
    
    In `engine.resultMetric()` we can call `Keep()` instead of checking
    and calling `Del()`.
    
    Avoid calling `Sort()` in `Builder.Labels()` if we didn't add anything,
    so that `Keep()` has the same performance as `WithLabels()`.
    
    Signed-off-by: Bryan Boreham 
    ---
     model/labels/labels.go      |  57 ++++++++++----
     model/labels/labels_test.go | 151 ++++++++++++++++++++----------------
     promql/engine.go            |  26 +++----
     promql/functions.go         |  11 +--
     4 files changed, 135 insertions(+), 110 deletions(-)
    
    diff --git a/model/labels/labels.go b/model/labels/labels.go
    index 29b7385c8d9..27423d19c2f 100644
    --- a/model/labels/labels.go
    +++ b/model/labels/labels.go
    @@ -202,11 +202,11 @@ func (ls Labels) HashWithoutLabels(b []byte, names ...string) (uint64, []byte) {
     	return xxhash.Sum64(b), b
     }
     
    -// WithLabels returns a new labels.Labels from ls that only contains labels matching names.
    +// BytesWithLabels is just as Bytes(), but only for labels matching names.
     // 'names' have to be sorted in ascending order.
    -func (ls Labels) WithLabels(names ...string) Labels {
    -	ret := make([]Label, 0, len(ls))
    -
    +func (ls Labels) BytesWithLabels(buf []byte, names ...string) []byte {
    +	b := bytes.NewBuffer(buf[:0])
    +	b.WriteByte(labelSep)
     	i, j := 0, 0
     	for i < len(ls) && j < len(names) {
     		if names[j] < ls[i].Name {
    @@ -214,30 +214,40 @@ func (ls Labels) WithLabels(names ...string) Labels {
     		} else if ls[i].Name < names[j] {
     			i++
     		} else {
    -			ret = append(ret, ls[i])
    +			if b.Len() > 1 {
    +				b.WriteByte(seps[0])
    +			}
    +			b.WriteString(ls[i].Name)
    +			b.WriteByte(seps[0])
    +			b.WriteString(ls[i].Value)
     			i++
     			j++
     		}
     	}
    -	return ret
    +	return b.Bytes()
     }
     
    -// WithoutLabels returns a new labels.Labels from ls that contains labels not matching names.
    +// BytesWithoutLabels is just as Bytes(), but only for labels not matching names.
     // 'names' have to be sorted in ascending order.
    -func (ls Labels) WithoutLabels(names ...string) Labels {
    -	ret := make([]Label, 0, len(ls))
    -
    +func (ls Labels) BytesWithoutLabels(buf []byte, names ...string) []byte {
    +	b := bytes.NewBuffer(buf[:0])
    +	b.WriteByte(labelSep)
     	j := 0
     	for i := range ls {
     		for j < len(names) && names[j] < ls[i].Name {
     			j++
     		}
    -		if ls[i].Name == MetricName || (j < len(names) && ls[i].Name == names[j]) {
    +		if j < len(names) && ls[i].Name == names[j] {
     			continue
     		}
    -		ret = append(ret, ls[i])
    +		if b.Len() > 1 {
    +			b.WriteByte(seps[0])
    +		}
    +		b.WriteString(ls[i].Name)
    +		b.WriteByte(seps[0])
    +		b.WriteString(ls[i].Value)
     	}
    -	return ret
    +	return b.Bytes()
     }
     
     // Copy returns a copy of the labels.
    @@ -426,6 +436,20 @@ func (b *Builder) Del(ns ...string) *Builder {
     	return b
     }
     
    +// Keep removes all labels from the base except those with the given names.
    +func (b *Builder) Keep(ns ...string) *Builder {
    +Outer:
    +	for _, l := range b.base {
    +		for _, n := range ns {
    +			if l.Name == n {
    +				continue Outer
    +			}
    +		}
    +		b.del = append(b.del, l.Name)
    +	}
    +	return b
    +}
    +
     // Set the name/value pair as a label.
     func (b *Builder) Set(n, v string) *Builder {
     	if v == "" {
    @@ -467,8 +491,9 @@ Outer:
     		}
     		res = append(res, l)
     	}
    -	res = append(res, b.add...)
    -	sort.Sort(res)
    -
    +	if len(b.add) > 0 { // Base is already in order, so we only need to sort if we add to it.
    +		res = append(res, b.add...)
    +		sort.Sort(res)
    +	}
     	return res
     }
    diff --git a/model/labels/labels_test.go b/model/labels/labels_test.go
    index da4d80b58ec..5d5fdd47555 100644
    --- a/model/labels/labels_test.go
    +++ b/model/labels/labels_test.go
    @@ -624,81 +624,94 @@ func TestLabels_Map(t *testing.T) {
     	require.Equal(t, map[string]string{"aaa": "111", "bbb": "222"}, Labels{{"aaa", "111"}, {"bbb", "222"}}.Map())
     }
     
    -func TestLabels_WithLabels(t *testing.T) {
    -	require.Equal(t, Labels{{"aaa", "111"}, {"bbb", "222"}}, Labels{{"aaa", "111"}, {"bbb", "222"}, {"ccc", "333"}}.WithLabels("aaa", "bbb"))
    +func TestLabels_BytesWithLabels(t *testing.T) {
    +	require.Equal(t, Labels{{"aaa", "111"}, {"bbb", "222"}}.Bytes(nil), Labels{{"aaa", "111"}, {"bbb", "222"}, {"ccc", "333"}}.BytesWithLabels(nil, "aaa", "bbb"))
    +	require.Equal(t, Labels{}.Bytes(nil), Labels{{"aaa", "111"}, {"bbb", "222"}, {"ccc", "333"}}.BytesWithLabels(nil))
     }
     
    -func TestLabels_WithoutLabels(t *testing.T) {
    -	require.Equal(t, Labels{{"aaa", "111"}}, Labels{{"aaa", "111"}, {"bbb", "222"}, {"ccc", "333"}}.WithoutLabels("bbb", "ccc"))
    -	require.Equal(t, Labels{{"aaa", "111"}}, Labels{{"aaa", "111"}, {"bbb", "222"}, {MetricName, "333"}}.WithoutLabels("bbb"))
    +func TestLabels_BytesWithoutLabels(t *testing.T) {
    +	require.Equal(t, Labels{{"aaa", "111"}}.Bytes(nil), Labels{{"aaa", "111"}, {"bbb", "222"}, {"ccc", "333"}}.BytesWithoutLabels(nil, "bbb", "ccc"))
    +	require.Equal(t, Labels{{"aaa", "111"}}.Bytes(nil), Labels{{MetricName, "333"}, {"aaa", "111"}, {"bbb", "222"}}.BytesWithoutLabels(nil, MetricName, "bbb"))
     }
     
    -func TestBulider_NewBulider(t *testing.T) {
    -	require.Equal(
    -		t,
    -		&Builder{
    -			base: Labels{{"aaa", "111"}},
    -			del:  []string{},
    -			add:  []Label{},
    +func TestBuilder(t *testing.T) {
    +	for i, tcase := range []struct {
    +		base Labels
    +		del  []string
    +		keep []string
    +		set  []Label
    +		want Labels
    +	}{
    +		{
    +			base: FromStrings("aaa", "111"),
    +			want: FromStrings("aaa", "111"),
     		},
    -		NewBuilder(Labels{{"aaa", "111"}}),
    -	)
    -}
    -
    -func TestBuilder_Del(t *testing.T) {
    -	require.Equal(
    -		t,
    -		&Builder{
    -			del: []string{"bbb"},
    -			add: []Label{{"aaa", "111"}, {"ccc", "333"}},
    -		},
    -		(&Builder{
    -			del: []string{},
    -			add: []Label{{"aaa", "111"}, {"bbb", "222"}, {"ccc", "333"}},
    -		}).Del("bbb"),
    -	)
    -}
    -
    -func TestBuilder_Set(t *testing.T) {
    -	require.Equal(
    -		t,
    -		&Builder{
    -			base: Labels{{"aaa", "111"}},
    -			del:  []string{},
    -			add:  []Label{{"bbb", "222"}},
    -		},
    -		(&Builder{
    -			base: Labels{{"aaa", "111"}},
    -			del:  []string{},
    -			add:  []Label{},
    -		}).Set("bbb", "222"),
    -	)
    -
    -	require.Equal(
    -		t,
    -		&Builder{
    -			base: Labels{{"aaa", "111"}},
    -			del:  []string{},
    -			add:  []Label{{"bbb", "333"}},
    -		},
    -		(&Builder{
    -			base: Labels{{"aaa", "111"}},
    -			del:  []string{},
    -			add:  []Label{{"bbb", "222"}},
    -		}).Set("bbb", "333"),
    -	)
    -}
    -
    -func TestBuilder_Labels(t *testing.T) {
    -	require.Equal(
    -		t,
    -		Labels{{"aaa", "111"}, {"ccc", "333"}, {"ddd", "444"}},
    -		(&Builder{
    -			base: Labels{{"aaa", "111"}, {"bbb", "222"}, {"ccc", "333"}},
    +		{
    +			base: FromStrings("aaa", "111", "bbb", "222", "ccc", "333"),
     			del:  []string{"bbb"},
    -			add:  []Label{{"ddd", "444"}},
    -		}).Labels(),
    -	)
    +			want: FromStrings("aaa", "111", "ccc", "333"),
    +		},
    +		{
    +			base: nil,
    +			set:  []Label{{"aaa", "111"}, {"bbb", "222"}, {"ccc", "333"}},
    +			del:  []string{"bbb"},
    +			want: FromStrings("aaa", "111", "ccc", "333"),
    +		},
    +		{
    +			base: FromStrings("aaa", "111"),
    +			set:  []Label{{"bbb", "222"}},
    +			want: FromStrings("aaa", "111", "bbb", "222"),
    +		},
    +		{
    +			base: FromStrings("aaa", "111"),
    +			set:  []Label{{"bbb", "222"}, {"bbb", "333"}},
    +			want: FromStrings("aaa", "111", "bbb", "333"),
    +		},
    +		{
    +			base: FromStrings("aaa", "111", "bbb", "222", "ccc", "333"),
    +			del:  []string{"bbb"},
    +			set:  []Label{{"ddd", "444"}},
    +			want: FromStrings("aaa", "111", "ccc", "333", "ddd", "444"),
    +		},
    +		{ // Blank value is interpreted as delete.
    +			base: FromStrings("aaa", "111", "bbb", "", "ccc", "333"),
    +			want: FromStrings("aaa", "111", "ccc", "333"),
    +		},
    +		{
    +			base: FromStrings("aaa", "111", "bbb", "222", "ccc", "333"),
    +			set:  []Label{{"bbb", ""}},
    +			want: FromStrings("aaa", "111", "ccc", "333"),
    +		},
    +		{
    +			base: FromStrings("aaa", "111", "bbb", "222", "ccc", "333"),
    +			keep: []string{"bbb"},
    +			want: FromStrings("bbb", "222"),
    +		},
    +		{
    +			base: FromStrings("aaa", "111", "bbb", "222", "ccc", "333"),
    +			keep: []string{"aaa", "ccc"},
    +			want: FromStrings("aaa", "111", "ccc", "333"),
    +		},
    +		{
    +			base: FromStrings("aaa", "111", "bbb", "222", "ccc", "333"),
    +			del:  []string{"bbb"},
    +			set:  []Label{{"ddd", "444"}},
    +			keep: []string{"aaa", "ddd"},
    +			want: FromStrings("aaa", "111", "ddd", "444"),
    +		},
    +	} {
    +		t.Run(fmt.Sprint(i), func(t *testing.T) {
    +			b := NewBuilder(tcase.base)
    +			for _, lbl := range tcase.set {
    +				b.Set(lbl.Name, lbl.Value)
    +			}
    +			if len(tcase.keep) > 0 {
    +				b.Keep(tcase.keep...)
    +			}
    +			b.Del(tcase.del...)
    +			require.Equal(t, tcase.want, b.Labels())
    +		})
    +	}
     }
     
     func TestLabels_Hash(t *testing.T) {
    diff --git a/promql/engine.go b/promql/engine.go
    index 8e5fcea95dc..7711223d6a1 100644
    --- a/promql/engine.go
    +++ b/promql/engine.go
    @@ -2050,14 +2050,16 @@ func (ev *evaluator) VectorBinop(op parser.ItemType, lhs, rhs Vector, matching *
     }
     
     func signatureFunc(on bool, b []byte, names ...string) func(labels.Labels) string {
    -	sort.Strings(names)
     	if on {
    +		sort.Strings(names)
     		return func(lset labels.Labels) string {
    -			return string(lset.WithLabels(names...).Bytes(b))
    +			return string(lset.BytesWithLabels(b, names...))
     		}
     	}
    +	names = append([]string{labels.MetricName}, names...)
    +	sort.Strings(names)
     	return func(lset labels.Labels) string {
    -		return string(lset.WithoutLabels(names...).Bytes(b))
    +		return string(lset.BytesWithoutLabels(b, names...))
     	}
     }
     
    @@ -2092,15 +2094,7 @@ func resultMetric(lhs, rhs labels.Labels, op parser.ItemType, matching *parser.V
     
     	if matching.Card == parser.CardOneToOne {
     		if matching.On {
    -		Outer:
    -			for _, l := range lhs {
    -				for _, n := range matching.MatchingLabels {
    -					if l.Name == n {
    -						continue Outer
    -					}
    -				}
    -				enh.lb.Del(l.Name)
    -			}
    +			enh.lb.Keep(matching.MatchingLabels...)
     		} else {
     			enh.lb.Del(matching.MatchingLabels...)
     		}
    @@ -2295,16 +2289,14 @@ func (ev *evaluator) aggregation(op parser.ItemType, grouping []string, without
     		group, ok := result[groupingKey]
     		// Add a new group if it doesn't exist.
     		if !ok {
    -			var m labels.Labels
    -
    +			lb.Reset(metric)
     			if without {
    -				lb.Reset(metric)
     				lb.Del(grouping...)
     				lb.Del(labels.MetricName)
    -				m = lb.Labels()
     			} else {
    -				m = metric.WithLabels(grouping...)
    +				lb.Keep(grouping...)
     			}
    +			m := lb.Labels()
     			newAgg := &groupedAggregation{
     				labels:     m,
     				value:      s.V,
    diff --git a/promql/functions.go b/promql/functions.go
    index 0b3a04251e6..18c8e63a354 100644
    --- a/promql/functions.go
    +++ b/promql/functions.go
    @@ -791,7 +791,6 @@ func funcPredictLinear(vals []parser.Value, args parser.Expressions, enh *EvalNo
     func funcHistogramQuantile(vals []parser.Value, args parser.Expressions, enh *EvalNodeHelper) Vector {
     	q := vals[0].(Vector)[0].V
     	inVec := vals[1].(Vector)
    -	sigf := signatureFunc(false, enh.lblBuf, labels.BucketLabel)
     
     	if enh.signatureToMetricWithBuckets == nil {
     		enh.signatureToMetricWithBuckets = map[string]*metricWithBuckets{}
    @@ -809,19 +808,15 @@ func funcHistogramQuantile(vals []parser.Value, args parser.Expressions, enh *Ev
     			// TODO(beorn7): Issue a warning somehow.
     			continue
     		}
    -		l := sigf(el.Metric)
    -		// Add the metric name (which is always removed) to the signature to prevent combining multiple histograms
    -		// with the same label set. See https://github.com/prometheus/prometheus/issues/9910
    -		l = l + el.Metric.Get(model.MetricNameLabel)
    -
    -		mb, ok := enh.signatureToMetricWithBuckets[l]
    +		enh.lblBuf = el.Metric.BytesWithoutLabels(enh.lblBuf, labels.BucketLabel)
    +		mb, ok := enh.signatureToMetricWithBuckets[string(enh.lblBuf)]
     		if !ok {
     			el.Metric = labels.NewBuilder(el.Metric).
     				Del(excludedLabels...).
     				Labels()
     
     			mb = &metricWithBuckets{el.Metric, nil}
    -			enh.signatureToMetricWithBuckets[l] = mb
    +			enh.signatureToMetricWithBuckets[string(enh.lblBuf)] = mb
     		}
     		mb.buckets = append(mb.buckets, bucket{upperBound, el.V})
     	}
    
    From a56731126dc02b79d7d351caa5ec1ddef275b3dd Mon Sep 17 00:00:00 2001
    From: Filip Petkovski 
    Date: Tue, 7 Jun 2022 17:13:21 +0200
    Subject: [PATCH 104/135] Export TSDB status structs (#10783)
    
    We would like to implement the tsdb/status API in certain Thanos
    components.
    
    In order to match the Prometheus API and avoid duplicating code,
    this commit makes the structs used in the status API public.
    
    Signed-off-by: Filip Petkovski 
    ---
     web/api/v1/api.go | 37 +++++++++++++++++++------------------
     1 file changed, 19 insertions(+), 18 deletions(-)
    
    diff --git a/web/api/v1/api.go b/web/api/v1/api.go
    index 2c50297f1d7..88bedd46a51 100644
    --- a/web/api/v1/api.go
    +++ b/web/api/v1/api.go
    @@ -1317,8 +1317,8 @@ func (api *API) serveFlags(_ *http.Request) apiFuncResult {
     	return apiFuncResult{api.flagsMap, nil, nil, nil}
     }
     
    -// stat holds the information about individual cardinality.
    -type stat struct {
    +// TSDBStat holds the information about individual cardinality.
    +type TSDBStat struct {
     	Name  string `json:"name"`
     	Value uint64 `json:"value"`
     }
    @@ -1332,26 +1332,27 @@ type HeadStats struct {
     	MaxTime       int64  `json:"maxTime"`
     }
     
    -// tsdbStatus has information of cardinality statistics from postings.
    -type tsdbStatus struct {
    -	HeadStats                   HeadStats `json:"headStats"`
    -	SeriesCountByMetricName     []stat    `json:"seriesCountByMetricName"`
    -	LabelValueCountByLabelName  []stat    `json:"labelValueCountByLabelName"`
    -	MemoryInBytesByLabelName    []stat    `json:"memoryInBytesByLabelName"`
    -	SeriesCountByLabelValuePair []stat    `json:"seriesCountByLabelValuePair"`
    +// TSDBStatus has information of cardinality statistics from postings.
    +type TSDBStatus struct {
    +	HeadStats                   HeadStats  `json:"headStats"`
    +	SeriesCountByMetricName     []TSDBStat `json:"seriesCountByMetricName"`
    +	LabelValueCountByLabelName  []TSDBStat `json:"labelValueCountByLabelName"`
    +	MemoryInBytesByLabelName    []TSDBStat `json:"memoryInBytesByLabelName"`
    +	SeriesCountByLabelValuePair []TSDBStat `json:"seriesCountByLabelValuePair"`
     }
     
    -func convertStats(stats []index.Stat) []stat {
    -	result := make([]stat, 0, len(stats))
    +// TSDBStatsFromIndexStats converts a index.Stat slice to a TSDBStat slice.
    +func TSDBStatsFromIndexStats(stats []index.Stat) []TSDBStat {
    +	result := make([]TSDBStat, 0, len(stats))
     	for _, item := range stats {
    -		item := stat{Name: item.Name, Value: item.Count}
    +		item := TSDBStat{Name: item.Name, Value: item.Count}
     		result = append(result, item)
     	}
     	return result
     }
     
     func (api *API) serveTSDBStatus(*http.Request) apiFuncResult {
    -	s, err := api.db.Stats("__name__")
    +	s, err := api.db.Stats(labels.MetricName)
     	if err != nil {
     		return apiFuncResult{nil, &apiError{errorInternal, err}, nil, nil}
     	}
    @@ -1369,7 +1370,7 @@ func (api *API) serveTSDBStatus(*http.Request) apiFuncResult {
     			}
     		}
     	}
    -	return apiFuncResult{tsdbStatus{
    +	return apiFuncResult{TSDBStatus{
     		HeadStats: HeadStats{
     			NumSeries:     s.NumSeries,
     			ChunkCount:    chunkCount,
    @@ -1377,10 +1378,10 @@ func (api *API) serveTSDBStatus(*http.Request) apiFuncResult {
     			MaxTime:       s.MaxTime,
     			NumLabelPairs: s.IndexPostingStats.NumLabelPairs,
     		},
    -		SeriesCountByMetricName:     convertStats(s.IndexPostingStats.CardinalityMetricsStats),
    -		LabelValueCountByLabelName:  convertStats(s.IndexPostingStats.CardinalityLabelStats),
    -		MemoryInBytesByLabelName:    convertStats(s.IndexPostingStats.LabelValueStats),
    -		SeriesCountByLabelValuePair: convertStats(s.IndexPostingStats.LabelValuePairsStats),
    +		SeriesCountByMetricName:     TSDBStatsFromIndexStats(s.IndexPostingStats.CardinalityMetricsStats),
    +		LabelValueCountByLabelName:  TSDBStatsFromIndexStats(s.IndexPostingStats.CardinalityLabelStats),
    +		MemoryInBytesByLabelName:    TSDBStatsFromIndexStats(s.IndexPostingStats.LabelValueStats),
    +		SeriesCountByLabelValuePair: TSDBStatsFromIndexStats(s.IndexPostingStats.LabelValuePairsStats),
     	}, nil, nil, nil}
     }
     
    
    From 7a78897d0b6e8994c5c9151748be40dc6d6d9933 Mon Sep 17 00:00:00 2001
    From: Filip Petkovski 
    Date: Tue, 7 Jun 2022 17:19:40 +0200
    Subject: [PATCH 105/135] Improve reliability of Kubernetes SD tests (#10761)
    
    The tests for Kubernetes SD rely on comparing target groups by first
    serializing them to JSON. However, the target group MarshalJSON function
    only serializes the __address__ label, which makes eliminates all other
    labels from the comparison.
    
    This commit implements a separate marshaling function intended for use in
    Kubernetes SD tests. The function serializes all target labels, making
    comparisons much more reliable. The commit also fixes all tests that
    started to fail due to the newly introduced change.
    
    Signed-off-by: Filip Petkovski 
    ---
     discovery/kubernetes/endpointslice_test.go | 48 ++++++++++++++++------
     discovery/kubernetes/kubernetes_test.go    | 20 ++++++++-
     2 files changed, 54 insertions(+), 14 deletions(-)
    
    diff --git a/discovery/kubernetes/endpointslice_test.go b/discovery/kubernetes/endpointslice_test.go
    index 0065bdd06bb..16148d2a0f5 100644
    --- a/discovery/kubernetes/endpointslice_test.go
    +++ b/discovery/kubernetes/endpointslice_test.go
    @@ -644,10 +644,16 @@ func TestEndpointSliceDiscoveryWithServiceUpdate(t *testing.T) {
     				Targets: []model.LabelSet{
     					{
     						"__address__": "1.2.3.4:9000",
    -						"__meta_kubernetes_endpointslice_endpoint_hostname": "testendpoint1",
    -						"__meta_kubernetes_endpointslice_port":              "9000",
    -						"__meta_kubernetes_endpointslice_port_name":         "testport",
    -						"__meta_kubernetes_endpointslice_port_protocol":     "TCP",
    +						"__meta_kubernetes_endpointslice_address_target_kind":                "",
    +						"__meta_kubernetes_endpointslice_address_target_name":                "",
    +						"__meta_kubernetes_endpointslice_endpoint_conditions_ready":          "true",
    +						"__meta_kubernetes_endpointslice_endpoint_hostname":                  "testendpoint1",
    +						"__meta_kubernetes_endpointslice_endpoint_topology_present_topology": "true",
    +						"__meta_kubernetes_endpointslice_endpoint_topology_topology":         "value",
    +						"__meta_kubernetes_endpointslice_port":                               "9000",
    +						"__meta_kubernetes_endpointslice_port_app_protocol":                  "http",
    +						"__meta_kubernetes_endpointslice_port_name":                          "testport",
    +						"__meta_kubernetes_endpointslice_port_protocol":                      "TCP",
     					},
     					{
     						"__address__": "2.3.4.5:9000",
    @@ -655,6 +661,7 @@ func TestEndpointSliceDiscoveryWithServiceUpdate(t *testing.T) {
     						"__meta_kubernetes_endpointslice_port":                      "9000",
     						"__meta_kubernetes_endpointslice_port_name":                 "testport",
     						"__meta_kubernetes_endpointslice_port_protocol":             "TCP",
    +						"__meta_kubernetes_endpointslice_port_app_protocol":         "http",
     					},
     					{
     						"__address__": "3.4.5.6:9000",
    @@ -662,6 +669,7 @@ func TestEndpointSliceDiscoveryWithServiceUpdate(t *testing.T) {
     						"__meta_kubernetes_endpointslice_port":                      "9000",
     						"__meta_kubernetes_endpointslice_port_name":                 "testport",
     						"__meta_kubernetes_endpointslice_port_protocol":             "TCP",
    +						"__meta_kubernetes_endpointslice_port_app_protocol":         "http",
     					},
     				},
     				Labels: model.LabelSet{
    @@ -755,10 +763,16 @@ func TestEndpointSliceDiscoveryNamespaces(t *testing.T) {
     				Targets: []model.LabelSet{
     					{
     						"__address__": "1.2.3.4:9000",
    -						"__meta_kubernetes_endpointslice_endpoint_hostname": "testendpoint1",
    -						"__meta_kubernetes_endpointslice_port":              "9000",
    -						"__meta_kubernetes_endpointslice_port_name":         "testport",
    -						"__meta_kubernetes_endpointslice_port_protocol":     "TCP",
    +						"__meta_kubernetes_endpointslice_address_target_kind":                "",
    +						"__meta_kubernetes_endpointslice_address_target_name":                "",
    +						"__meta_kubernetes_endpointslice_endpoint_conditions_ready":          "true",
    +						"__meta_kubernetes_endpointslice_endpoint_hostname":                  "testendpoint1",
    +						"__meta_kubernetes_endpointslice_endpoint_topology_present_topology": "true",
    +						"__meta_kubernetes_endpointslice_endpoint_topology_topology":         "value",
    +						"__meta_kubernetes_endpointslice_port":                               "9000",
    +						"__meta_kubernetes_endpointslice_port_app_protocol":                  "http",
    +						"__meta_kubernetes_endpointslice_port_name":                          "testport",
    +						"__meta_kubernetes_endpointslice_port_protocol":                      "TCP",
     					},
     					{
     						"__address__": "2.3.4.5:9000",
    @@ -766,6 +780,7 @@ func TestEndpointSliceDiscoveryNamespaces(t *testing.T) {
     						"__meta_kubernetes_endpointslice_port":                      "9000",
     						"__meta_kubernetes_endpointslice_port_name":                 "testport",
     						"__meta_kubernetes_endpointslice_port_protocol":             "TCP",
    +						"__meta_kubernetes_endpointslice_port_app_protocol":         "http",
     					},
     					{
     						"__address__": "3.4.5.6:9000",
    @@ -773,6 +788,7 @@ func TestEndpointSliceDiscoveryNamespaces(t *testing.T) {
     						"__meta_kubernetes_endpointslice_port":                      "9000",
     						"__meta_kubernetes_endpointslice_port_name":                 "testport",
     						"__meta_kubernetes_endpointslice_port_protocol":             "TCP",
    +						"__meta_kubernetes_endpointslice_port_app_protocol":         "http",
     					},
     				},
     				Labels: model.LabelSet{
    @@ -871,10 +887,16 @@ func TestEndpointSliceDiscoveryOwnNamespace(t *testing.T) {
     				Targets: []model.LabelSet{
     					{
     						"__address__": "1.2.3.4:9000",
    -						"__meta_kubernetes_endpointslice_endpoint_hostname": "testendpoint1",
    -						"__meta_kubernetes_endpointslice_port":              "9000",
    -						"__meta_kubernetes_endpointslice_port_name":         "testport",
    -						"__meta_kubernetes_endpointslice_port_protocol":     "TCP",
    +						"__meta_kubernetes_endpointslice_address_target_kind":                "",
    +						"__meta_kubernetes_endpointslice_address_target_name":                "",
    +						"__meta_kubernetes_endpointslice_endpoint_conditions_ready":          "true",
    +						"__meta_kubernetes_endpointslice_endpoint_hostname":                  "testendpoint1",
    +						"__meta_kubernetes_endpointslice_endpoint_topology_present_topology": "true",
    +						"__meta_kubernetes_endpointslice_endpoint_topology_topology":         "value",
    +						"__meta_kubernetes_endpointslice_port":                               "9000",
    +						"__meta_kubernetes_endpointslice_port_app_protocol":                  "http",
    +						"__meta_kubernetes_endpointslice_port_name":                          "testport",
    +						"__meta_kubernetes_endpointslice_port_protocol":                      "TCP",
     					},
     					{
     						"__address__": "2.3.4.5:9000",
    @@ -882,6 +904,7 @@ func TestEndpointSliceDiscoveryOwnNamespace(t *testing.T) {
     						"__meta_kubernetes_endpointslice_port":                      "9000",
     						"__meta_kubernetes_endpointslice_port_name":                 "testport",
     						"__meta_kubernetes_endpointslice_port_protocol":             "TCP",
    +						"__meta_kubernetes_endpointslice_port_app_protocol":         "http",
     					},
     					{
     						"__address__": "3.4.5.6:9000",
    @@ -889,6 +912,7 @@ func TestEndpointSliceDiscoveryOwnNamespace(t *testing.T) {
     						"__meta_kubernetes_endpointslice_port":                      "9000",
     						"__meta_kubernetes_endpointslice_port_name":                 "testport",
     						"__meta_kubernetes_endpointslice_port_protocol":             "TCP",
    +						"__meta_kubernetes_endpointslice_port_app_protocol":         "http",
     					},
     				},
     				Labels: model.LabelSet{
    diff --git a/discovery/kubernetes/kubernetes_test.go b/discovery/kubernetes/kubernetes_test.go
    index 1c6c2378050..d0ed4c6ca16 100644
    --- a/discovery/kubernetes/kubernetes_test.go
    +++ b/discovery/kubernetes/kubernetes_test.go
    @@ -163,11 +163,11 @@ Loop:
     
     func requireTargetGroups(t *testing.T, expected, res map[string]*targetgroup.Group) {
     	t.Helper()
    -	b1, err := json.Marshal(expected)
    +	b1, err := marshalTargetGroups(expected)
     	if err != nil {
     		panic(err)
     	}
    -	b2, err := json.Marshal(res)
    +	b2, err := marshalTargetGroups(res)
     	if err != nil {
     		panic(err)
     	}
    @@ -175,6 +175,22 @@ func requireTargetGroups(t *testing.T, expected, res map[string]*targetgroup.Gro
     	require.Equal(t, string(b1), string(b2))
     }
     
    +// marshalTargetGroups serializes a set of target groups to JSON, ignoring the
    +// custom MarshalJSON function defined on the targetgroup.Group struct.
    +// marshalTargetGroups can be used for making exact comparisons between target groups
    +// as it will serialize all target labels.
    +func marshalTargetGroups(tgs map[string]*targetgroup.Group) ([]byte, error) {
    +	type targetGroupAlias targetgroup.Group
    +
    +	aliases := make(map[string]*targetGroupAlias, len(tgs))
    +	for k, v := range tgs {
    +		tg := targetGroupAlias(*v)
    +		aliases[k] = &tg
    +	}
    +
    +	return json.Marshal(aliases)
    +}
    +
     type hasSynced interface {
     	// hasSynced returns true if all informers synced.
     	// This is only used in testing to determine when discoverer synced to
    
    From 9f79a6f4b56fd879161ad26a17e4a2ca7eb849a9 Mon Sep 17 00:00:00 2001
    From: Bryan Boreham 
    Date: Wed, 8 Jun 2022 03:30:59 +0100
    Subject: [PATCH 106/135] tsdb: faster CRC check by avoiding allocations
     (#10789)
    
    Instead of creating a new hashing object every time, call `crc32.Checksum`
    which computes the answer without allocations.
    
    Signed-off-by: Bryan Boreham 
    ---
     tsdb/chunks/chunks.go | 19 ++++++++++++-------
     1 file changed, 12 insertions(+), 7 deletions(-)
    
    diff --git a/tsdb/chunks/chunks.go b/tsdb/chunks/chunks.go
    index 4f8f405876b..72cb0311bc0 100644
    --- a/tsdb/chunks/chunks.go
    +++ b/tsdb/chunks/chunks.go
    @@ -15,7 +15,6 @@ package chunks
     
     import (
     	"bufio"
    -	"bytes"
     	"encoding/binary"
     	"fmt"
     	"hash"
    @@ -166,6 +165,17 @@ func newCRC32() hash.Hash32 {
     	return crc32.New(castagnoliTable)
     }
     
    +// Check if the CRC of data matches that stored in sum, computed when the chunk was stored.
    +func checkCRC32(data, sum []byte) error {
    +	got := crc32.Checksum(data, castagnoliTable)
    +	// This combination of shifts is the inverse of digest.Sum() in go/src/hash/crc32.
    +	want := uint32(sum[0])<<24 + uint32(sum[1])<<16 + uint32(sum[2])<<8 + uint32(sum[3])
    +	if got != want {
    +		return errors.Errorf("checksum mismatch expected:%x, actual:%x", want, got)
    +	}
    +	return nil
    +}
    +
     // Writer implements the ChunkWriter interface for the standard
     // serialization format.
     type Writer struct {
    @@ -547,7 +557,6 @@ func (s *Reader) Size() int64 {
     // Chunk returns a chunk from a given reference.
     func (s *Reader) Chunk(ref ChunkRef) (chunkenc.Chunk, error) {
     	sgmIndex, chkStart := BlockChunkRef(ref).Unpack()
    -	chkCRC32 := newCRC32()
     
     	if sgmIndex >= len(s.bs) {
     		return nil, errors.Errorf("segment index %d out of range", sgmIndex)
    @@ -576,14 +585,10 @@ func (s *Reader) Chunk(ref ChunkRef) (chunkenc.Chunk, error) {
     	}
     
     	sum := sgmBytes.Range(chkDataEnd, chkEnd)
    -	if _, err := chkCRC32.Write(sgmBytes.Range(chkEncStart, chkDataEnd)); err != nil {
    +	if err := checkCRC32(sgmBytes.Range(chkEncStart, chkDataEnd), sum); err != nil {
     		return nil, err
     	}
     
    -	if act := chkCRC32.Sum(nil); !bytes.Equal(act, sum) {
    -		return nil, errors.Errorf("checksum mismatch expected:%x, actual:%x", sum, act)
    -	}
    -
     	chkData := sgmBytes.Range(chkDataStart, chkDataEnd)
     	chkEnc := sgmBytes.Range(chkEncStart, chkEncStart+ChunkEncodingSize)[0]
     	return s.pool.Get(chunkenc.Encoding(chkEnc), chkData)
    
    From 15aeadedbe15dd1cba97a1d3685b8bdf0781ec26 Mon Sep 17 00:00:00 2001
    From: Matthieu MOREL 
    Date: Wed, 8 Jun 2022 10:28:21 +0200
    Subject: [PATCH 107/135] enable dependabot for
     github.com/prometheus/prometheus/documentation/examples/remote_storage module
     (#10821)
    
    Signed-off-by: Matthieu MOREL 
    
    Co-authored-by: Matthieu MOREL 
    ---
     .github/dependabot.yml | 4 ++++
     1 file changed, 4 insertions(+)
    
    diff --git a/.github/dependabot.yml b/.github/dependabot.yml
    index ce621be9c64..4c4b4a5fba7 100644
    --- a/.github/dependabot.yml
    +++ b/.github/dependabot.yml
    @@ -4,6 +4,10 @@ updates:
         directory: "/"
         schedule:
           interval: "monthly"
    +  - package-ecosystem: "gomod"
    +    directory: "/documentation/examples/remote_storage"
    +    schedule:
    +      interval: "monthly"
       - package-ecosystem: "npm"
         directory: "/web/ui"
         schedule:
    
    From 554f3f32f8e4a0917340900f6918b954f3dd0440 Mon Sep 17 00:00:00 2001
    From: Matthieu MOREL 
    Date: Wed, 8 Jun 2022 10:44:08 +0200
    Subject: [PATCH 108/135] refactor (template): move from github.com/pkg/errors
     to 'errors' and 'fmt' (#10818)
    
    Signed-off-by: Matthieu MOREL 
    
    Co-authored-by: Matthieu MOREL 
    ---
     template/template.go | 16 ++++++++--------
     1 file changed, 8 insertions(+), 8 deletions(-)
    
    diff --git a/template/template.go b/template/template.go
    index 4058ad3ae5b..0b1659ce029 100644
    --- a/template/template.go
    +++ b/template/template.go
    @@ -16,6 +16,7 @@ package template
     import (
     	"bytes"
     	"context"
    +	"errors"
     	"fmt"
     	html_template "html/template"
     	"math"
    @@ -28,7 +29,6 @@ import (
     	"time"
     
     	"github.com/grafana/regexp"
    -	"github.com/pkg/errors"
     	"github.com/prometheus/client_golang/prometheus"
     	"github.com/prometheus/common/model"
     
    @@ -375,7 +375,7 @@ func (te Expander) Expand() (result string, resultErr error) {
     			var ok bool
     			resultErr, ok = r.(error)
     			if !ok {
    -				resultErr = errors.Errorf("panic expanding template %v: %v", te.name, r)
    +				resultErr = fmt.Errorf("panic expanding template %v: %v", te.name, r)
     			}
     		}
     		if resultErr != nil {
    @@ -389,12 +389,12 @@ func (te Expander) Expand() (result string, resultErr error) {
     	tmpl.Option(te.options...)
     	tmpl, err := tmpl.Parse(te.text)
     	if err != nil {
    -		return "", errors.Wrapf(err, "error parsing template %v", te.name)
    +		return "", fmt.Errorf("error parsing template %v: %w", te.name, err)
     	}
     	var buffer bytes.Buffer
     	err = tmpl.Execute(&buffer, te.data)
     	if err != nil {
    -		return "", errors.Wrapf(err, "error executing template %v", te.name)
    +		return "", fmt.Errorf("error executing template %v: %w", te.name, err)
     	}
     	return buffer.String(), nil
     }
    @@ -406,7 +406,7 @@ func (te Expander) ExpandHTML(templateFiles []string) (result string, resultErr
     			var ok bool
     			resultErr, ok = r.(error)
     			if !ok {
    -				resultErr = errors.Errorf("panic expanding template %s: %v", te.name, r)
    +				resultErr = fmt.Errorf("panic expanding template %s: %v", te.name, r)
     			}
     		}
     	}()
    @@ -422,18 +422,18 @@ func (te Expander) ExpandHTML(templateFiles []string) (result string, resultErr
     	})
     	tmpl, err := tmpl.Parse(te.text)
     	if err != nil {
    -		return "", errors.Wrapf(err, "error parsing template %v", te.name)
    +		return "", fmt.Errorf("error parsing template %v: %w", te.name, err)
     	}
     	if len(templateFiles) > 0 {
     		_, err = tmpl.ParseFiles(templateFiles...)
     		if err != nil {
    -			return "", errors.Wrapf(err, "error parsing template files for %v", te.name)
    +			return "", fmt.Errorf("error parsing template files for %v: %w", te.name, err)
     		}
     	}
     	var buffer bytes.Buffer
     	err = tmpl.Execute(&buffer, te.data)
     	if err != nil {
    -		return "", errors.Wrapf(err, "error executing template %v", te.name)
    +		return "", fmt.Errorf("error executing template %v: %w", te.name, err)
     	}
     	return buffer.String(), nil
     }
    
    From 47e13b26c137b7e7fb8a0b27f7f02ecbe80f9688 Mon Sep 17 00:00:00 2001
    From: Matthieu MOREL 
    Date: Wed, 8 Jun 2022 10:44:42 +0200
    Subject: [PATCH 109/135] refactor (tracing): move from github.com/pkg/errors
     to 'errors' and 'fmt' (#10819)
    
    Signed-off-by: Matthieu MOREL 
    
    Co-authored-by: Matthieu MOREL 
    ---
     tracing/tracing.go | 6 +++---
     1 file changed, 3 insertions(+), 3 deletions(-)
    
    diff --git a/tracing/tracing.go b/tracing/tracing.go
    index 7a98de762fa..7728dcb1dcb 100644
    --- a/tracing/tracing.go
    +++ b/tracing/tracing.go
    @@ -15,12 +15,12 @@ package tracing
     
     import (
     	"context"
    +	"fmt"
     	"reflect"
     	"time"
     
     	"github.com/go-kit/log"
     	"github.com/go-kit/log/level"
    -	"github.com/pkg/errors"
     	config_util "github.com/prometheus/common/config"
     	"github.com/prometheus/common/version"
     	"go.opentelemetry.io/otel"
    @@ -79,7 +79,7 @@ func (m *Manager) ApplyConfig(cfg *config.Config) error {
     
     	if m.shutdownFunc != nil {
     		if err := m.shutdownFunc(); err != nil {
    -			return errors.Wrap(err, "failed to shut down the tracer provider")
    +			return fmt.Errorf("failed to shut down the tracer provider: %w", err)
     		}
     	}
     
    @@ -94,7 +94,7 @@ func (m *Manager) ApplyConfig(cfg *config.Config) error {
     
     	tp, shutdownFunc, err := buildTracerProvider(context.Background(), cfg.TracingConfig)
     	if err != nil {
    -		return errors.Wrap(err, "failed to install a new tracer provider")
    +		return fmt.Errorf("failed to install a new tracer provider: %w", err)
     	}
     
     	m.shutdownFunc = shutdownFunc
    
    From 0906f2eafa3506d411f2053ecba160a6c5ca0387 Mon Sep 17 00:00:00 2001
    From: Matthieu MOREL 
    Date: Wed, 8 Jun 2022 10:47:52 +0200
    Subject: [PATCH 110/135] refactor (promql): move from github.com/pkg/errors to
     'errors' and 'fmt' (#10817)
    
    Signed-off-by: Matthieu MOREL 
    
    Co-authored-by: Matthieu MOREL 
    ---
     promql/engine.go            | 42 ++++++++++++++++++-------------------
     promql/functions.go         | 14 ++++++-------
     promql/fuzz.go              |  3 ++-
     promql/parser/ast.go        |  5 ++---
     promql/parser/parse.go      |  6 +++---
     promql/parser/parse_test.go |  5 +++--
     promql/test.go              | 37 +++++++++++++++++---------------
     promql/value.go             |  3 +--
     8 files changed, 59 insertions(+), 56 deletions(-)
    
    diff --git a/promql/engine.go b/promql/engine.go
    index 7711223d6a1..3cb1c95683c 100644
    --- a/promql/engine.go
    +++ b/promql/engine.go
    @@ -17,6 +17,7 @@ import (
     	"bytes"
     	"container/heap"
     	"context"
    +	"errors"
     	"fmt"
     	"math"
     	"reflect"
    @@ -29,7 +30,6 @@ import (
     	"github.com/go-kit/log"
     	"github.com/go-kit/log/level"
     	"github.com/grafana/regexp"
    -	"github.com/pkg/errors"
     	"github.com/prometheus/client_golang/prometheus"
     	"github.com/prometheus/common/model"
     	"go.opentelemetry.io/otel"
    @@ -208,10 +208,10 @@ func contextDone(ctx context.Context, env string) error {
     }
     
     func contextErr(err error, env string) error {
    -	switch err {
    -	case context.Canceled:
    +	switch {
    +	case errors.Is(err, context.Canceled):
     		return ErrQueryCanceled(env)
    -	case context.DeadlineExceeded:
    +	case errors.Is(err, context.DeadlineExceeded):
     		return ErrQueryTimeout(env)
     	default:
     		return err
    @@ -416,7 +416,7 @@ func (ng *Engine) NewRangeQuery(q storage.Queryable, opts *QueryOpts, qs string,
     		return nil, err
     	}
     	if expr.Type() != parser.ValueTypeVector && expr.Type() != parser.ValueTypeScalar {
    -		return nil, errors.Errorf("invalid expression type %q for range query, must be Scalar or instant Vector", parser.DocumentedType(expr.Type()))
    +		return nil, fmt.Errorf("invalid expression type %q for range query, must be Scalar or instant Vector", parser.DocumentedType(expr.Type()))
     	}
     	qry, err := ng.newQuery(q, opts, expr, start, end, interval)
     	if err != nil {
    @@ -597,7 +597,7 @@ func (ng *Engine) exec(ctx context.Context, q *query) (v parser.Value, ws storag
     		return nil, nil, s(ctx)
     	}
     
    -	panic(errors.Errorf("promql.Engine.exec: unhandled statement of type %T", q.Statement()))
    +	panic(fmt.Errorf("promql.Engine.exec: unhandled statement of type %T", q.Statement()))
     }
     
     func timeMilliseconds(t time.Time) int64 {
    @@ -657,7 +657,7 @@ func (ng *Engine) execEvalStmt(ctx context.Context, query *query, s *parser.Eval
     		case String:
     			return result, warnings, nil
     		default:
    -			panic(errors.Errorf("promql.Engine.exec: invalid expression type %q", val.Type()))
    +			panic(fmt.Errorf("promql.Engine.exec: invalid expression type %q", val.Type()))
     		}
     
     		query.matrix = mat
    @@ -676,7 +676,7 @@ func (ng *Engine) execEvalStmt(ctx context.Context, query *query, s *parser.Eval
     		case parser.ValueTypeMatrix:
     			return mat, warnings, nil
     		default:
    -			panic(errors.Errorf("promql.Engine.exec: unexpected expression type %q", s.Expr.Type()))
    +			panic(fmt.Errorf("promql.Engine.exec: unexpected expression type %q", s.Expr.Type()))
     		}
     	}
     
    @@ -701,7 +701,7 @@ func (ng *Engine) execEvalStmt(ctx context.Context, query *query, s *parser.Eval
     
     	mat, ok := val.(Matrix)
     	if !ok {
    -		panic(errors.Errorf("promql.Engine.exec: invalid expression type %q", val.Type()))
    +		panic(fmt.Errorf("promql.Engine.exec: invalid expression type %q", val.Type()))
     	}
     	query.matrix = mat
     
    @@ -928,7 +928,7 @@ type evaluator struct {
     
     // errorf causes a panic with the input formatted into an error.
     func (ev *evaluator) errorf(format string, args ...interface{}) {
    -	ev.error(errors.Errorf(format, args...))
    +	ev.error(fmt.Errorf(format, args...))
     }
     
     // error causes a panic with the given error.
    @@ -950,7 +950,7 @@ func (ev *evaluator) recover(ws *storage.Warnings, errp *error) {
     		buf = buf[:runtime.Stack(buf, false)]
     
     		level.Error(ev.logger).Log("msg", "runtime panic in parser", "err", e, "stacktrace", string(buf))
    -		*errp = errors.Wrap(err, "unexpected error")
    +		*errp = fmt.Errorf("unexpected error: %w", err)
     	case errWithWarnings:
     		*errp = err.err
     		*ws = append(*ws, err.warnings...)
    @@ -1344,7 +1344,7 @@ func (ev *evaluator) eval(expr parser.Expr) (parser.Value, storage.Warnings) {
     		ws, err := checkAndExpandSeriesSet(ev.ctx, sel)
     		warnings = append(warnings, ws...)
     		if err != nil {
    -			ev.error(errWithWarnings{errors.Wrap(err, "expanding series"), warnings})
    +			ev.error(errWithWarnings{fmt.Errorf("expanding series: %w", err), warnings})
     		}
     		mat := make(Matrix, 0, len(selVS.Series)) // Output matrix.
     		offset := durationMilliseconds(selVS.Offset)
    @@ -1541,7 +1541,7 @@ func (ev *evaluator) eval(expr parser.Expr) (parser.Value, storage.Warnings) {
     	case *parser.VectorSelector:
     		ws, err := checkAndExpandSeriesSet(ev.ctx, e)
     		if err != nil {
    -			ev.error(errWithWarnings{errors.Wrap(err, "expanding series"), ws})
    +			ev.error(errWithWarnings{fmt.Errorf("expanding series: %w", err), ws})
     		}
     		mat := make(Matrix, 0, len(e.Series))
     		it := storage.NewMemoizedEmptyIterator(durationMilliseconds(ev.lookbackDelta))
    @@ -1657,11 +1657,11 @@ func (ev *evaluator) eval(expr parser.Expr) (parser.Value, storage.Warnings) {
     		// with changed timestamps.
     		mat, ok := res.(Matrix)
     		if !ok {
    -			panic(errors.Errorf("unexpected result in StepInvariantExpr evaluation: %T", expr))
    +			panic(fmt.Errorf("unexpected result in StepInvariantExpr evaluation: %T", expr))
     		}
     		for i := range mat {
     			if len(mat[i].Points) != 1 {
    -				panic(errors.Errorf("unexpected number of samples"))
    +				panic(fmt.Errorf("unexpected number of samples"))
     			}
     			for ts := ev.startTimestamp + ev.interval; ts <= ev.endTimestamp; ts = ts + ev.interval {
     				mat[i].Points = append(mat[i].Points, Point{
    @@ -1678,14 +1678,14 @@ func (ev *evaluator) eval(expr parser.Expr) (parser.Value, storage.Warnings) {
     		return res, ws
     	}
     
    -	panic(errors.Errorf("unhandled expression of type: %T", expr))
    +	panic(fmt.Errorf("unhandled expression of type: %T", expr))
     }
     
     // vectorSelector evaluates a *parser.VectorSelector expression.
     func (ev *evaluator) vectorSelector(node *parser.VectorSelector, ts int64) (Vector, storage.Warnings) {
     	ws, err := checkAndExpandSeriesSet(ev.ctx, node)
     	if err != nil {
    -		ev.error(errWithWarnings{errors.Wrap(err, "expanding series"), ws})
    +		ev.error(errWithWarnings{fmt.Errorf("expanding series: %w", err), ws})
     	}
     	vec := make(Vector, 0, len(node.Series))
     	it := storage.NewMemoizedEmptyIterator(durationMilliseconds(ev.lookbackDelta))
    @@ -1769,7 +1769,7 @@ func (ev *evaluator) matrixSelector(node *parser.MatrixSelector) (Matrix, storag
     	)
     	ws, err := checkAndExpandSeriesSet(ev.ctx, node)
     	if err != nil {
    -		ev.error(errWithWarnings{errors.Wrap(err, "expanding series"), ws})
    +		ev.error(errWithWarnings{fmt.Errorf("expanding series: %w", err), ws})
     	}
     
     	series := vs.Series
    @@ -2181,7 +2181,7 @@ func scalarBinop(op parser.ItemType, lhs, rhs float64) float64 {
     	case parser.ATAN2:
     		return math.Atan2(lhs, rhs)
     	}
    -	panic(errors.Errorf("operator %q not allowed for Scalar operations", op))
    +	panic(fmt.Errorf("operator %q not allowed for Scalar operations", op))
     }
     
     // vectorElemBinop evaluates a binary operation between two Vector elements.
    @@ -2214,7 +2214,7 @@ func vectorElemBinop(op parser.ItemType, lhs, rhs float64) (float64, bool) {
     	case parser.ATAN2:
     		return math.Atan2(lhs, rhs), true
     	}
    -	panic(errors.Errorf("operator %q not allowed for operations between Vectors", op))
    +	panic(fmt.Errorf("operator %q not allowed for operations between Vectors", op))
     }
     
     type groupedAggregation struct {
    @@ -2423,7 +2423,7 @@ func (ev *evaluator) aggregation(op parser.ItemType, grouping []string, without
     			group.heap = append(group.heap, s)
     
     		default:
    -			panic(errors.Errorf("expected aggregation operator but got %q", op))
    +			panic(fmt.Errorf("expected aggregation operator but got %q", op))
     		}
     	}
     
    diff --git a/promql/functions.go b/promql/functions.go
    index 18c8e63a354..d133fef051d 100644
    --- a/promql/functions.go
    +++ b/promql/functions.go
    @@ -14,6 +14,7 @@
     package promql
     
     import (
    +	"fmt"
     	"math"
     	"sort"
     	"strconv"
    @@ -21,7 +22,6 @@ import (
     	"time"
     
     	"github.com/grafana/regexp"
    -	"github.com/pkg/errors"
     	"github.com/prometheus/common/model"
     
     	"github.com/prometheus/prometheus/model/labels"
    @@ -223,10 +223,10 @@ func funcHoltWinters(vals []parser.Value, args parser.Expressions, enh *EvalNode
     
     	// Sanity check the input.
     	if sf <= 0 || sf >= 1 {
    -		panic(errors.Errorf("invalid smoothing factor. Expected: 0 < sf < 1, got: %f", sf))
    +		panic(fmt.Errorf("invalid smoothing factor. Expected: 0 < sf < 1, got: %f", sf))
     	}
     	if tf <= 0 || tf >= 1 {
    -		panic(errors.Errorf("invalid trend factor. Expected: 0 < tf < 1, got: %f", tf))
    +		panic(fmt.Errorf("invalid trend factor. Expected: 0 < tf < 1, got: %f", tf))
     	}
     
     	l := len(samples.Points)
    @@ -885,10 +885,10 @@ func funcLabelReplace(vals []parser.Value, args parser.Expressions, enh *EvalNod
     		var err error
     		enh.regex, err = regexp.Compile("^(?:" + regexStr + ")$")
     		if err != nil {
    -			panic(errors.Errorf("invalid regular expression in label_replace(): %s", regexStr))
    +			panic(fmt.Errorf("invalid regular expression in label_replace(): %s", regexStr))
     		}
     		if !model.LabelNameRE.MatchString(dst) {
    -			panic(errors.Errorf("invalid destination label name in label_replace(): %s", dst))
    +			panic(fmt.Errorf("invalid destination label name in label_replace(): %s", dst))
     		}
     		enh.Dmn = make(map[uint64]labels.Labels, len(enh.Out))
     	}
    @@ -950,13 +950,13 @@ func funcLabelJoin(vals []parser.Value, args parser.Expressions, enh *EvalNodeHe
     	for i := 3; i < len(args); i++ {
     		src := stringFromArg(args[i])
     		if !model.LabelName(src).IsValid() {
    -			panic(errors.Errorf("invalid source label name in label_join(): %s", src))
    +			panic(fmt.Errorf("invalid source label name in label_join(): %s", src))
     		}
     		srcLabels[i-3] = src
     	}
     
     	if !model.LabelName(dst).IsValid() {
    -		panic(errors.Errorf("invalid destination label name in label_join(): %s", dst))
    +		panic(fmt.Errorf("invalid destination label name in label_join(): %s", dst))
     	}
     
     	srcVals := make([]string, len(srcLabels))
    diff --git a/promql/fuzz.go b/promql/fuzz.go
    index 6b7c16e2d51..39933378e69 100644
    --- a/promql/fuzz.go
    +++ b/promql/fuzz.go
    @@ -18,6 +18,7 @@
     package promql
     
     import (
    +	"errors"
     	"io"
     
     	"github.com/prometheus/prometheus/model/textparse"
    @@ -71,7 +72,7 @@ func fuzzParseMetricWithContentType(in []byte, contentType string) int {
     			break
     		}
     	}
    -	if err == io.EOF {
    +	if errors.Is(err, io.EOF) {
     		err = nil
     	}
     
    diff --git a/promql/parser/ast.go b/promql/parser/ast.go
    index fc144cbbc4a..d5a2335abb5 100644
    --- a/promql/parser/ast.go
    +++ b/promql/parser/ast.go
    @@ -15,10 +15,9 @@ package parser
     
     import (
     	"context"
    +	"fmt"
     	"time"
     
    -	"github.com/pkg/errors"
    -
     	"github.com/prometheus/prometheus/model/labels"
     	"github.com/prometheus/prometheus/storage"
     )
    @@ -394,7 +393,7 @@ func Children(node Node) []Node {
     		// nothing to do
     		return []Node{}
     	default:
    -		panic(errors.Errorf("promql.Children: unhandled node type %T", node))
    +		panic(fmt.Errorf("promql.Children: unhandled node type %T", node))
     	}
     }
     
    diff --git a/promql/parser/parse.go b/promql/parser/parse.go
    index 5b60c5ed518..7a0e48464be 100644
    --- a/promql/parser/parse.go
    +++ b/promql/parser/parse.go
    @@ -14,6 +14,7 @@
     package parser
     
     import (
    +	"errors"
     	"fmt"
     	"math"
     	"os"
    @@ -23,7 +24,6 @@ import (
     	"sync"
     	"time"
     
    -	"github.com/pkg/errors"
     	"github.com/prometheus/common/model"
     
     	"github.com/prometheus/prometheus/model/labels"
    @@ -224,7 +224,7 @@ func ParseSeriesDesc(input string) (labels labels.Labels, values []SequenceValue
     
     // addParseErrf formats the error and appends it to the list of parsing errors.
     func (p *parser) addParseErrf(positionRange PositionRange, format string, args ...interface{}) {
    -	p.addParseErr(positionRange, errors.Errorf(format, args...))
    +	p.addParseErr(positionRange, fmt.Errorf(format, args...))
     }
     
     // addParseErr appends the provided error to the list of parsing errors.
    @@ -801,7 +801,7 @@ func MustLabelMatcher(mt labels.MatchType, name, val string) *labels.Matcher {
     func MustGetFunction(name string) *Function {
     	f, ok := getFunction(name)
     	if !ok {
    -		panic(errors.Errorf("function %q does not exist", name))
    +		panic(fmt.Errorf("function %q does not exist", name))
     	}
     	return f
     }
    diff --git a/promql/parser/parse_test.go b/promql/parser/parse_test.go
    index 790064d373c..548fb5aa92f 100644
    --- a/promql/parser/parse_test.go
    +++ b/promql/parser/parse_test.go
    @@ -14,13 +14,13 @@
     package parser
     
     import (
    +	"errors"
     	"fmt"
     	"math"
     	"strings"
     	"testing"
     	"time"
     
    -	"github.com/pkg/errors"
     	"github.com/prometheus/common/model"
     	"github.com/stretchr/testify/require"
     
    @@ -3570,7 +3570,8 @@ func TestParseExpressions(t *testing.T) {
     				require.Error(t, err)
     				require.Contains(t, err.Error(), test.errMsg, "unexpected error on input '%s', expected '%s', got '%s'", test.input, test.errMsg, err.Error())
     
    -				errorList, ok := err.(ParseErrors)
    +				var errorList ParseErrors
    +				ok := errors.As(err, &errorList)
     
     				require.True(t, ok, "unexpected error type")
     
    diff --git a/promql/test.go b/promql/test.go
    index 28bdd058860..22144fe3587 100644
    --- a/promql/test.go
    +++ b/promql/test.go
    @@ -15,6 +15,7 @@ package promql
     
     import (
     	"context"
    +	"errors"
     	"fmt"
     	"math"
     	"os"
    @@ -23,7 +24,6 @@ import (
     	"time"
     
     	"github.com/grafana/regexp"
    -	"github.com/pkg/errors"
     	"github.com/prometheus/common/model"
     	"github.com/stretchr/testify/require"
     
    @@ -122,7 +122,7 @@ func (t *Test) ExemplarQueryable() storage.ExemplarQueryable {
     func raise(line int, format string, v ...interface{}) error {
     	return &parser.ParseErr{
     		LineOffset: line,
    -		Err:        errors.Errorf(format, v...),
    +		Err:        fmt.Errorf(format, v...),
     	}
     }
     
    @@ -146,7 +146,8 @@ func parseLoad(lines []string, i int) (int, *loadCmd, error) {
     		}
     		metric, vals, err := parser.ParseSeriesDesc(defLine)
     		if err != nil {
    -			if perr, ok := err.(*parser.ParseErr); ok {
    +			var perr *parser.ParseErr
    +			if errors.As(err, &perr) {
     				perr.LineOffset = i
     			}
     			return i, nil, err
    @@ -168,7 +169,8 @@ func (t *Test) parseEval(lines []string, i int) (int, *evalCmd, error) {
     	)
     	_, err := parser.ParseExpr(expr)
     	if err != nil {
    -		if perr, ok := err.(*parser.ParseErr); ok {
    +		var perr *parser.ParseErr
    +		if errors.As(err, &perr) {
     			perr.LineOffset = i
     			posOffset := parser.Pos(strings.Index(lines[i], expr))
     			perr.PositionRange.Start += posOffset
    @@ -205,7 +207,8 @@ func (t *Test) parseEval(lines []string, i int) (int, *evalCmd, error) {
     		}
     		metric, vals, err := parser.ParseSeriesDesc(defLine)
     		if err != nil {
    -			if perr, ok := err.(*parser.ParseErr); ok {
    +			var perr *parser.ParseErr
    +			if errors.As(err, &perr) {
     				perr.LineOffset = i
     			}
     			return i, nil, err
    @@ -388,14 +391,14 @@ func (ev *evalCmd) compareResult(result parser.Value) error {
     		for pos, v := range val {
     			fp := v.Metric.Hash()
     			if _, ok := ev.metrics[fp]; !ok {
    -				return errors.Errorf("unexpected metric %s in result", v.Metric)
    +				return fmt.Errorf("unexpected metric %s in result", v.Metric)
     			}
     			exp := ev.expected[fp]
     			if ev.ordered && exp.pos != pos+1 {
    -				return errors.Errorf("expected metric %s with %v at position %d but was at %d", v.Metric, exp.vals, exp.pos, pos+1)
    +				return fmt.Errorf("expected metric %s with %v at position %d but was at %d", v.Metric, exp.vals, exp.pos, pos+1)
     			}
     			if !almostEqual(exp.vals[0].Value, v.V) {
    -				return errors.Errorf("expected %v for %s but got %v", exp.vals[0].Value, v.Metric, v.V)
    +				return fmt.Errorf("expected %v for %s but got %v", exp.vals[0].Value, v.Metric, v.V)
     			}
     
     			seen[fp] = true
    @@ -406,17 +409,17 @@ func (ev *evalCmd) compareResult(result parser.Value) error {
     				for _, ss := range val {
     					fmt.Println("    ", ss.Metric, ss.Point)
     				}
    -				return errors.Errorf("expected metric %s with %v not found", ev.metrics[fp], expVals)
    +				return fmt.Errorf("expected metric %s with %v not found", ev.metrics[fp], expVals)
     			}
     		}
     
     	case Scalar:
     		if !almostEqual(ev.expected[0].vals[0].Value, val.V) {
    -			return errors.Errorf("expected Scalar %v but got %v", val.V, ev.expected[0].vals[0].Value)
    +			return fmt.Errorf("expected Scalar %v but got %v", val.V, ev.expected[0].vals[0].Value)
     		}
     
     	default:
    -		panic(errors.Errorf("promql.Test.compareResult: unexpected result type %T", result))
    +		panic(fmt.Errorf("promql.Test.compareResult: unexpected result type %T", result))
     	}
     	return nil
     }
    @@ -543,14 +546,14 @@ func (t *Test) exec(tc testCommand) error {
     				if cmd.fail {
     					continue
     				}
    -				return errors.Wrapf(res.Err, "error evaluating query %q (line %d)", iq.expr, cmd.line)
    +				return fmt.Errorf("error evaluating query %q (line %d): %w", iq.expr, cmd.line, res.Err)
     			}
     			if res.Err == nil && cmd.fail {
    -				return errors.Errorf("expected error evaluating query %q (line %d) but got none", iq.expr, cmd.line)
    +				return fmt.Errorf("expected error evaluating query %q (line %d) but got none", iq.expr, cmd.line)
     			}
     			err = cmd.compareResult(res.Value)
     			if err != nil {
    -				return errors.Wrapf(err, "error in %s %s", cmd, iq.expr)
    +				return fmt.Errorf("error in %s %s: %w", cmd, iq.expr, err)
     			}
     
     			// Check query returns same result in range mode,
    @@ -561,7 +564,7 @@ func (t *Test) exec(tc testCommand) error {
     			}
     			rangeRes := q.Exec(t.context)
     			if rangeRes.Err != nil {
    -				return errors.Wrapf(rangeRes.Err, "error evaluating query %q (line %d) in range mode", iq.expr, cmd.line)
    +				return fmt.Errorf("error evaluating query %q (line %d) in range mode: %w", iq.expr, cmd.line, rangeRes.Err)
     			}
     			defer q.Close()
     			if cmd.ordered {
    @@ -584,7 +587,7 @@ func (t *Test) exec(tc testCommand) error {
     				err = cmd.compareResult(vec)
     			}
     			if err != nil {
    -				return errors.Wrapf(err, "error in %s %s (line %d) range mode", cmd, iq.expr, cmd.line)
    +				return fmt.Errorf("error in %s %s (line %d) range mode: %w", cmd, iq.expr, cmd.line, err)
     			}
     
     		}
    @@ -658,7 +661,7 @@ func parseNumber(s string) (float64, error) {
     		f, err = strconv.ParseFloat(s, 64)
     	}
     	if err != nil {
    -		return 0, errors.Wrap(err, "error parsing number")
    +		return 0, fmt.Errorf("error parsing number: %w", err)
     	}
     	return f, nil
     }
    diff --git a/promql/value.go b/promql/value.go
    index 55cdc44d357..5b0bd8fa823 100644
    --- a/promql/value.go
    +++ b/promql/value.go
    @@ -15,12 +15,11 @@ package promql
     
     import (
     	"encoding/json"
    +	"errors"
     	"fmt"
     	"strconv"
     	"strings"
     
    -	"github.com/pkg/errors"
    -
     	"github.com/prometheus/prometheus/model/labels"
     	"github.com/prometheus/prometheus/promql/parser"
     	"github.com/prometheus/prometheus/storage"
    
    From 2bf9d26732a4b5e42a7616e65d15aec119285519 Mon Sep 17 00:00:00 2001
    From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
    Date: Wed, 8 Jun 2022 10:50:54 +0200
    Subject: [PATCH 111/135] build(deps): bump k8s.io/api from 0.24.0 to 0.24.1
     (#10812)
    
    Bumps [k8s.io/api](https://github.com/kubernetes/api) from 0.24.0 to 0.24.1.
    - [Release notes](https://github.com/kubernetes/api/releases)
    - [Commits](https://github.com/kubernetes/api/compare/v0.24.0...v0.24.1)
    
    ---
    updated-dependencies:
    - dependency-name: k8s.io/api
      dependency-type: direct:production
      update-type: version-update:semver-patch
    ...
    
    Signed-off-by: dependabot[bot] 
    
    Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
    ---
     go.mod | 2 +-
     go.sum | 3 ++-
     2 files changed, 3 insertions(+), 2 deletions(-)
    
    diff --git a/go.mod b/go.mod
    index dce9a524b0a..ced99e726d6 100644
    --- a/go.mod
    +++ b/go.mod
    @@ -72,7 +72,7 @@ require (
     	gopkg.in/alecthomas/kingpin.v2 v2.2.6
     	gopkg.in/yaml.v2 v2.4.0
     	gopkg.in/yaml.v3 v3.0.1
    -	k8s.io/api v0.24.0
    +	k8s.io/api v0.24.1
     	k8s.io/apimachinery v0.24.1
     	k8s.io/client-go v0.24.0
     	k8s.io/klog v1.0.0
    diff --git a/go.sum b/go.sum
    index ee2bcdfb2ea..e9a6d72fbdd 100644
    --- a/go.sum
    +++ b/go.sum
    @@ -1450,8 +1450,9 @@ honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWh
     honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg=
     honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=
     honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=
    -k8s.io/api v0.24.0 h1:J0hann2hfxWr1hinZIDefw7Q96wmCBx6SSB8IY0MdDg=
     k8s.io/api v0.24.0/go.mod h1:5Jl90IUrJHUJYEMANRURMiVvJ0g7Ax7r3R1bqO8zx8I=
    +k8s.io/api v0.24.1 h1:BjCMRDcyEYz03joa3K1+rbshwh1Ay6oB53+iUx2H8UY=
    +k8s.io/api v0.24.1/go.mod h1:JhoOvNiLXKTPQ60zh2g0ewpA+bnEYf5q44Flhquh4vQ=
     k8s.io/apimachinery v0.24.0/go.mod h1:82Bi4sCzVBdpYjyI4jY6aHX+YCUchUIrZrXKedjd2UM=
     k8s.io/apimachinery v0.24.1 h1:ShD4aDxTQKN5zNf8K1RQ2u98ELLdIW7jEnlO9uAMX/I=
     k8s.io/apimachinery v0.24.1/go.mod h1:82Bi4sCzVBdpYjyI4jY6aHX+YCUchUIrZrXKedjd2UM=
    
    From 80eded08f6f0bae79cd98baafd077fd9fa878976 Mon Sep 17 00:00:00 2001
    From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
    Date: Wed, 8 Jun 2022 10:54:05 +0200
    Subject: [PATCH 112/135] build(deps): bump google.golang.org/api from 0.80.0
     to 0.83.0 (#10830)
    
    Bumps [google.golang.org/api](https://github.com/googleapis/google-api-go-client) from 0.80.0 to 0.83.0.
    - [Release notes](https://github.com/googleapis/google-api-go-client/releases)
    - [Changelog](https://github.com/googleapis/google-api-go-client/blob/main/CHANGES.md)
    - [Commits](https://github.com/googleapis/google-api-go-client/compare/v0.80.0...v0.83.0)
    
    ---
    updated-dependencies:
    - dependency-name: google.golang.org/api
      dependency-type: direct:production
      update-type: version-update:semver-minor
    ...
    
    Signed-off-by: dependabot[bot] 
    
    Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
    ---
     go.mod | 16 ++++++++--------
     go.sum | 31 +++++++++++++++++++------------
     2 files changed, 27 insertions(+), 20 deletions(-)
    
    diff --git a/go.mod b/go.mod
    index ced99e726d6..3fcc47555c7 100644
    --- a/go.mod
    +++ b/go.mod
    @@ -59,15 +59,15 @@ require (
     	go.uber.org/atomic v1.9.0
     	go.uber.org/automaxprocs v1.5.1
     	go.uber.org/goleak v1.1.12
    -	golang.org/x/net v0.0.0-20220520000938-2e3eb7b945c2
    -	golang.org/x/oauth2 v0.0.0-20220411215720-9780585627b5
    -	golang.org/x/sync v0.0.0-20210220032951-036812b2e83c
    +	golang.org/x/net v0.0.0-20220607020251-c690dde0001d
    +	golang.org/x/oauth2 v0.0.0-20220524215830-622c5d57e401
    +	golang.org/x/sync v0.0.0-20220601150217-0de741cfad7f
     	golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a
     	golang.org/x/time v0.0.0-20220224211638-0e9765cccd65
     	golang.org/x/tools v0.1.10
    -	google.golang.org/api v0.80.0
    -	google.golang.org/genproto v0.0.0-20220524023933-508584e28198
    -	google.golang.org/grpc v1.46.2
    +	google.golang.org/api v0.83.0
    +	google.golang.org/genproto v0.0.0-20220602131408-e326c6e8e9c8
    +	google.golang.org/grpc v1.47.0
     	google.golang.org/protobuf v1.28.0
     	gopkg.in/alecthomas/kingpin.v2 v2.2.6
     	gopkg.in/yaml.v2 v2.4.0
    @@ -127,7 +127,7 @@ require (
     	github.com/google/go-querystring v1.1.0 // indirect
     	github.com/google/gofuzz v1.2.0 // indirect
     	github.com/google/uuid v1.2.0 // indirect
    -	github.com/googleapis/gax-go/v2 v2.3.0 // indirect
    +	github.com/googleapis/gax-go/v2 v2.4.0 // indirect
     	github.com/grpc-ecosystem/grpc-gateway/v2 v2.10.2 // indirect
     	github.com/hashicorp/go-cleanhttp v0.5.2 // indirect
     	github.com/hashicorp/go-hclog v0.12.2 // indirect
    @@ -171,7 +171,7 @@ require (
     	golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3 // indirect
     	golang.org/x/term v0.0.0-20210927222741-03fcf44c2211 // indirect
     	golang.org/x/text v0.3.7 // indirect
    -	golang.org/x/xerrors v0.0.0-20220411194840-2f41105eb62f // indirect
    +	golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df // indirect
     	google.golang.org/appengine v1.6.7 // indirect
     	gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c // indirect
     	gopkg.in/inf.v0 v0.9.1 // indirect
    diff --git a/go.sum b/go.sum
    index e9a6d72fbdd..fa11dfc4304 100644
    --- a/go.sum
    +++ b/go.sum
    @@ -433,8 +433,9 @@ github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5m
     github.com/googleapis/gax-go/v2 v2.1.0/go.mod h1:Q3nei7sK6ybPYH7twZdmQpAd1MKb7pfu6SK+H1/DsU0=
     github.com/googleapis/gax-go/v2 v2.1.1/go.mod h1:hddJymUZASv3XPyGkUpKj8pPO47Rmb0eJc8R6ouapiM=
     github.com/googleapis/gax-go/v2 v2.2.0/go.mod h1:as02EH8zWkzwUoLbBaFeQ+arQaj/OthfcblKl4IGNaM=
    -github.com/googleapis/gax-go/v2 v2.3.0 h1:nRJtk3y8Fm770D42QV6T90ZnvFZyk7agSo3Q+Z9p3WI=
     github.com/googleapis/gax-go/v2 v2.3.0/go.mod h1:b8LNqSzNabLiUpXKkY7HAR5jr6bIT99EXz9pXxye9YM=
    +github.com/googleapis/gax-go/v2 v2.4.0 h1:dS9eYAjhrE2RjmzYw2XAPvcXfmcQLtFEQWn0CR82awk=
    +github.com/googleapis/gax-go/v2 v2.4.0/go.mod h1:XOTVJ59hdnfJLIP/dh8n5CGryZR2LxK9wbMD5+iXC6c=
     github.com/gophercloud/gophercloud v0.24.0 h1:jDsIMGJ1KZpAjYfQgGI2coNQj5Q83oPzuiGJRFWgMzw=
     github.com/gophercloud/gophercloud v0.24.0/go.mod h1:Q8fZtyi5zZxPS/j9aj3sSxtvj41AdQMDwyo1myduD5c=
     github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
    @@ -1006,8 +1007,8 @@ golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su
     golang.org/x/net v0.0.0-20220325170049-de3da57026de/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
     golang.org/x/net v0.0.0-20220412020605-290c469a71a5/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
     golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
    -golang.org/x/net v0.0.0-20220520000938-2e3eb7b945c2 h1:NWy5+hlRbC7HK+PmcXVUmW1IMyFce7to56IUvhUFm7Y=
    -golang.org/x/net v0.0.0-20220520000938-2e3eb7b945c2/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
    +golang.org/x/net v0.0.0-20220607020251-c690dde0001d h1:4SFsTMi4UahlKoloni7L4eYzhFRifURQLw+yv0QDCx8=
    +golang.org/x/net v0.0.0-20220607020251-c690dde0001d/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
     golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
     golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
     golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
    @@ -1026,8 +1027,9 @@ golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f/go.mod h1:KelEdhl1UZF7XfJ
     golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
     golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc=
     golang.org/x/oauth2 v0.0.0-20220309155454-6242fa91716a/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc=
    -golang.org/x/oauth2 v0.0.0-20220411215720-9780585627b5 h1:OSnWWcOd/CtWQC2cYSBgbTSJv3ciqd8r54ySIW2y3RE=
     golang.org/x/oauth2 v0.0.0-20220411215720-9780585627b5/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc=
    +golang.org/x/oauth2 v0.0.0-20220524215830-622c5d57e401 h1:zwrSfklXn0gxyLRX/aR+q6cgHbV/ItVyzbPlbA+dkAw=
    +golang.org/x/oauth2 v0.0.0-20220524215830-622c5d57e401/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc=
     golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
     golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
     golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
    @@ -1039,8 +1041,9 @@ golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJ
     golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
     golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
     golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
    -golang.org/x/sync v0.0.0-20210220032951-036812b2e83c h1:5KslGYwFpkhGh+Q16bwMP3cOontH8FOep7tGV86Y7SQ=
     golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
    +golang.org/x/sync v0.0.0-20220601150217-0de741cfad7f h1:Ax0t5p6N38Ga0dThY21weqDEyz2oklo4IvDkpigvkD8=
    +golang.org/x/sync v0.0.0-20220601150217-0de741cfad7f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
     golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
     golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
     golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
    @@ -1132,7 +1135,7 @@ golang.org/x/sys v0.0.0-20220227234510-4e6760a101f9/go.mod h1:oPkhp1MJrh7nUepCBc
     golang.org/x/sys v0.0.0-20220310020820-b874c991c1a5/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
     golang.org/x/sys v0.0.0-20220328115105-d36c6a25d886/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
     golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
    -golang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
    +golang.org/x/sys v0.0.0-20220502124256-b6088ccd6cba/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
     golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a h1:dGzPydgVsqGcTRVwiLJ1jVbufYwmzD3LfVPLKsKg+0k=
     golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
     golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw=
    @@ -1229,8 +1232,9 @@ golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8T
     golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
     golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
     golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
    -golang.org/x/xerrors v0.0.0-20220411194840-2f41105eb62f h1:GGU+dLjvlC3qDwqYgL6UgRmHXhOOgns0bZu2Ty5mm6U=
     golang.org/x/xerrors v0.0.0-20220411194840-2f41105eb62f/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
    +golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df h1:5Pf6pFKu98ODmgnpvkJ3kFUOQGGLIzLIkbzUHp47618=
    +golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8=
     google.golang.org/api v0.3.1/go.mod h1:6wY9I6uQWHQ8EM57III9mq/AjF+i8G65rmVagqKMtkk=
     google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE=
     google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M=
    @@ -1266,8 +1270,9 @@ google.golang.org/api v0.70.0/go.mod h1:Bs4ZM2HGifEvXwd50TtW70ovgJffJYw2oRCOFU/S
     google.golang.org/api v0.71.0/go.mod h1:4PyU6e6JogV1f9eA4voyrTY2batOLdgZ5qZ5HOCc4j8=
     google.golang.org/api v0.74.0/go.mod h1:ZpfMZOVRMywNyvJFeqL9HRWBgAuRfSjJFpe9QtRRyDs=
     google.golang.org/api v0.75.0/go.mod h1:pU9QmyHLnzlpar1Mjt4IbapUCy8J+6HD6GeELN69ljA=
    -google.golang.org/api v0.80.0 h1:IQWaGVCYnsm4MO3hh+WtSXMzMzuyFx/fuR8qkN3A0Qo=
    -google.golang.org/api v0.80.0/go.mod h1:xY3nI94gbvBrE0J6NHXhxOmW97HG7Khjkku6AFB3Hyg=
    +google.golang.org/api v0.78.0/go.mod h1:1Sg78yoMLOhlQTeF+ARBoytAcH1NNyyl390YMy6rKmw=
    +google.golang.org/api v0.83.0 h1:pMvST+6v+46Gabac4zlJlalxZjCeRcepwg2EdBU+nCc=
    +google.golang.org/api v0.83.0/go.mod h1:CNywQoj/AfhTw26ZWAa6LwOv+6WFxHmeLPZq2uncLZk=
     google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
     google.golang.org/appengine v1.2.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
     google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
    @@ -1348,10 +1353,11 @@ google.golang.org/genproto v0.0.0-20220407144326-9054f6ed7bac/go.mod h1:8w6bsBMX
     google.golang.org/genproto v0.0.0-20220413183235-5e96e2839df9/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo=
     google.golang.org/genproto v0.0.0-20220414192740-2d67ff6cf2b4/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo=
     google.golang.org/genproto v0.0.0-20220421151946-72621c1f0bd3/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo=
    +google.golang.org/genproto v0.0.0-20220429170224-98d788798c3e/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo=
     google.golang.org/genproto v0.0.0-20220505152158-f39f71e6c8f3/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4=
     google.golang.org/genproto v0.0.0-20220519153652-3a47de7e79bd/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4=
    -google.golang.org/genproto v0.0.0-20220524023933-508584e28198 h1:a1g7i05I2vUwq5eYrmxBJy6rPbw/yo7WzzwPJmcC0P4=
    -google.golang.org/genproto v0.0.0-20220524023933-508584e28198/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4=
    +google.golang.org/genproto v0.0.0-20220602131408-e326c6e8e9c8 h1:qRu95HZ148xXw+XeZ3dvqe85PxH4X8+jIo0iRPKcEnM=
    +google.golang.org/genproto v0.0.0-20220602131408-e326c6e8e9c8/go.mod h1:yKyY4AMRwFiC8yMMNaMi+RkCnjZJt9LoWuvhXjMs+To=
     google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs=
     google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
     google.golang.org/grpc v1.20.0/go.mod h1:chYK+tFQF0nDUGJgXMSgLCQk3phJEuONr2DCgLDdAQM=
    @@ -1386,8 +1392,9 @@ google.golang.org/grpc v1.42.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ5
     google.golang.org/grpc v1.44.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU=
     google.golang.org/grpc v1.45.0/go.mod h1:lN7owxKUQEqMfSyQikvvk5tf/6zMPsrK+ONuO11+0rQ=
     google.golang.org/grpc v1.46.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk=
    -google.golang.org/grpc v1.46.2 h1:u+MLGgVf7vRdjEYZ8wDFhAVNmhkbJ5hmrA1LMWK1CAQ=
     google.golang.org/grpc v1.46.2/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk=
    +google.golang.org/grpc v1.47.0 h1:9n77onPX5F3qfFCqjy9dhn8PbNQsIKeVU04J9G7umt8=
    +google.golang.org/grpc v1.47.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk=
     google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw=
     google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
     google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=
    
    From 28322709eb9f9a4eebb71d4d89cd3af3aa9d18c2 Mon Sep 17 00:00:00 2001
    From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
    Date: Wed, 8 Jun 2022 10:58:30 +0200
    Subject: [PATCH 113/135] build(deps): bump github.com/aws/aws-sdk-go from
     1.44.20 to 1.44.29 (#10832)
    
    Bumps [github.com/aws/aws-sdk-go](https://github.com/aws/aws-sdk-go) from 1.44.20 to 1.44.29.
    - [Release notes](https://github.com/aws/aws-sdk-go/releases)
    - [Changelog](https://github.com/aws/aws-sdk-go/blob/main/CHANGELOG.md)
    - [Commits](https://github.com/aws/aws-sdk-go/compare/v1.44.20...v1.44.29)
    
    ---
    updated-dependencies:
    - dependency-name: github.com/aws/aws-sdk-go
      dependency-type: direct:production
      update-type: version-update:semver-patch
    ...
    
    Signed-off-by: dependabot[bot] 
    
    Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
    ---
     go.mod | 2 +-
     go.sum | 4 ++--
     2 files changed, 3 insertions(+), 3 deletions(-)
    
    diff --git a/go.mod b/go.mod
    index 3fcc47555c7..76abda1a523 100644
    --- a/go.mod
    +++ b/go.mod
    @@ -7,7 +7,7 @@ require (
     	github.com/Azure/go-autorest/autorest v0.11.27
     	github.com/Azure/go-autorest/autorest/adal v0.9.20
     	github.com/alecthomas/units v0.0.0-20211218093645-b94a6e3cc137
    -	github.com/aws/aws-sdk-go v1.44.20
    +	github.com/aws/aws-sdk-go v1.44.29
     	github.com/cespare/xxhash/v2 v2.1.2
     	github.com/dennwc/varint v1.0.0
     	github.com/dgryski/go-sip13 v0.0.0-20200911182023-62edffca9245
    diff --git a/go.sum b/go.sum
    index fa11dfc4304..e3a7f0de51b 100644
    --- a/go.sum
    +++ b/go.sum
    @@ -120,8 +120,8 @@ github.com/aws/aws-lambda-go v1.13.3/go.mod h1:4UKl9IzQMoD+QF79YdCuzCwp8VbmG4VAQ
     github.com/aws/aws-sdk-go v1.27.0/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo=
     github.com/aws/aws-sdk-go v1.38.35/go.mod h1:hcU610XS61/+aQV88ixoOzUoG7v3b31pl2zKMmprdro=
     github.com/aws/aws-sdk-go v1.43.11/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX4oIKwKHZo=
    -github.com/aws/aws-sdk-go v1.44.20 h1:nllTRN24EfhDSeKsNbIc6HoC8Ogd2NCJTRB8l84kDlM=
    -github.com/aws/aws-sdk-go v1.44.20/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX4oIKwKHZo=
    +github.com/aws/aws-sdk-go v1.44.29 h1:53YWlelsMiYmGxuTRpAq7Xp+pE+0esAVqNFiNyekU+A=
    +github.com/aws/aws-sdk-go v1.44.29/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX4oIKwKHZo=
     github.com/aws/aws-sdk-go-v2 v0.18.0/go.mod h1:JWVYvqSMppoMJC0x5wdwiImzgXTI9FuZwxzkQq9wy+g=
     github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=
     github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=
    
    From 6bd75d5ba7a0ed6329c8ccb77c9d7c8a698babfa Mon Sep 17 00:00:00 2001
    From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
    Date: Wed, 8 Jun 2022 11:14:29 +0200
    Subject: [PATCH 114/135] build(deps): bump github.com/stretchr/testify
     (#10829)
    
    Bumps [github.com/stretchr/testify](https://github.com/stretchr/testify) from 1.7.0 to 1.7.2.
    - [Release notes](https://github.com/stretchr/testify/releases)
    - [Commits](https://github.com/stretchr/testify/compare/v1.7.0...v1.7.2)
    
    ---
    updated-dependencies:
    - dependency-name: github.com/stretchr/testify
      dependency-type: direct:production
      update-type: version-update:semver-patch
    ...
    
    Signed-off-by: dependabot[bot] 
    
    Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
    ---
     documentation/examples/remote_storage/go.mod | 4 ++--
     documentation/examples/remote_storage/go.sum | 6 ++++--
     2 files changed, 6 insertions(+), 4 deletions(-)
    
    diff --git a/documentation/examples/remote_storage/go.mod b/documentation/examples/remote_storage/go.mod
    index a2a5067ef49..7ccb7616db9 100644
    --- a/documentation/examples/remote_storage/go.mod
    +++ b/documentation/examples/remote_storage/go.mod
    @@ -10,7 +10,7 @@ require (
     	github.com/prometheus/client_golang v1.12.1
     	github.com/prometheus/common v0.32.1
     	github.com/prometheus/prometheus v1.8.2-0.20220202104425-d819219dd438
    -	github.com/stretchr/testify v1.7.0
    +	github.com/stretchr/testify v1.7.2
     	gopkg.in/alecthomas/kingpin.v2 v2.2.6
     )
     
    @@ -49,5 +49,5 @@ require (
     	google.golang.org/appengine v1.6.7 // indirect
     	google.golang.org/protobuf v1.27.1 // indirect
     	gopkg.in/yaml.v2 v2.4.0 // indirect
    -	gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b // indirect
    +	gopkg.in/yaml.v3 v3.0.1 // indirect
     )
    diff --git a/documentation/examples/remote_storage/go.sum b/documentation/examples/remote_storage/go.sum
    index eb2c31ccf27..f4abeac996c 100644
    --- a/documentation/examples/remote_storage/go.sum
    +++ b/documentation/examples/remote_storage/go.sum
    @@ -1228,8 +1228,9 @@ github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UV
     github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
     github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=
     github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
    -github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY=
     github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
    +github.com/stretchr/testify v1.7.2 h1:4jaiDzPyXQvSd7D0EjG45355tLlV3VOECpq10pLC+8s=
    +github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals=
     github.com/syndtr/gocapability v0.0.0-20170704070218-db04d3cc01c8/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww=
     github.com/syndtr/gocapability v0.0.0-20180916011248-d98352740cb2/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww=
     github.com/syndtr/gocapability v0.0.0-20200815063812-42c35b437635/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww=
    @@ -1975,8 +1976,9 @@ gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
     gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
     gopkg.in/yaml.v3 v3.0.0-20200605160147-a5ece683394c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
     gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
    -gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b h1:h8qDotaEPuJATrMmW04NCwg7v22aHH28wwpauUhK9Oo=
     gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
    +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
    +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
     gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw=
     gotest.tools/v3 v3.0.2/go.mod h1:3SzNCllyD9/Y+b5r9JIKQ474KzkZyqLqEfYqMsX94Bk=
     gotest.tools/v3 v3.0.3/go.mod h1:Z7Lb0S5l+klDB31fvDQX8ss/FlKDxtlFlw3Oa8Ymbl8=
    
    From eef02a03345b519e31793bc364229213345b86a9 Mon Sep 17 00:00:00 2001
    From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
    Date: Wed, 8 Jun 2022 11:14:39 +0200
    Subject: [PATCH 115/135] build(deps): bump github.com/prometheus/client_golang
     (#10828)
    
    Bumps [github.com/prometheus/client_golang](https://github.com/prometheus/client_golang) from 1.12.1 to 1.12.2.
    - [Release notes](https://github.com/prometheus/client_golang/releases)
    - [Changelog](https://github.com/prometheus/client_golang/blob/main/CHANGELOG.md)
    - [Commits](https://github.com/prometheus/client_golang/compare/v1.12.1...v1.12.2)
    
    ---
    updated-dependencies:
    - dependency-name: github.com/prometheus/client_golang
      dependency-type: direct:production
      update-type: version-update:semver-patch
    ...
    
    Signed-off-by: dependabot[bot] 
    
    Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
    ---
     documentation/examples/remote_storage/go.mod | 2 +-
     documentation/examples/remote_storage/go.sum | 3 ++-
     2 files changed, 3 insertions(+), 2 deletions(-)
    
    diff --git a/documentation/examples/remote_storage/go.mod b/documentation/examples/remote_storage/go.mod
    index 7ccb7616db9..c6dd8dcdbca 100644
    --- a/documentation/examples/remote_storage/go.mod
    +++ b/documentation/examples/remote_storage/go.mod
    @@ -7,7 +7,7 @@ require (
     	github.com/gogo/protobuf v1.3.2
     	github.com/golang/snappy v0.0.4
     	github.com/influxdata/influxdb v1.9.5
    -	github.com/prometheus/client_golang v1.12.1
    +	github.com/prometheus/client_golang v1.12.2
     	github.com/prometheus/common v0.32.1
     	github.com/prometheus/prometheus v1.8.2-0.20220202104425-d819219dd438
     	github.com/stretchr/testify v1.7.2
    diff --git a/documentation/examples/remote_storage/go.sum b/documentation/examples/remote_storage/go.sum
    index f4abeac996c..0a58fd13c57 100644
    --- a/documentation/examples/remote_storage/go.sum
    +++ b/documentation/examples/remote_storage/go.sum
    @@ -1104,8 +1104,9 @@ github.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3O
     github.com/prometheus/client_golang v1.5.1/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU=
     github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M=
     github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0=
    -github.com/prometheus/client_golang v1.12.1 h1:ZiaPsmm9uiBeaSMRznKsCDNtPCS0T3JVDGF+06gjBzk=
     github.com/prometheus/client_golang v1.12.1/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY=
    +github.com/prometheus/client_golang v1.12.2 h1:51L9cDoUHVrXx4zWYlcLQIZ+d+VXHgqnYKkIuq4g/34=
    +github.com/prometheus/client_golang v1.12.2/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY=
     github.com/prometheus/client_model v0.0.0-20171117100541-99fa1f4be8e5/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
     github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
     github.com/prometheus/client_model v0.0.0-20190115171406-56726106282f/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
    
    From e4a09f2b4b4772a886a694eb29a90712d41d63df Mon Sep 17 00:00:00 2001
    From: Julien Pivotto 
    Date: Wed, 8 Jun 2022 11:29:44 +0200
    Subject: [PATCH 116/135] uyuni: Use default HTTP client and set relative paths
     (#10814)
    
    Signed-off-by: Julien Pivotto 
    ---
     config/config_test.go    | 13 +++++++------
     discovery/uyuni/uyuni.go | 12 +++++++++---
     2 files changed, 16 insertions(+), 9 deletions(-)
    
    diff --git a/config/config_test.go b/config/config_test.go
    index acf339393c4..dc8ab742bac 100644
    --- a/config/config_test.go
    +++ b/config/config_test.go
    @@ -989,12 +989,13 @@ var expectedConf = &Config{
     			Scheme:           DefaultScrapeConfig.Scheme,
     			ServiceDiscoveryConfigs: discovery.Configs{
     				&uyuni.SDConfig{
    -					Server:          "https://localhost:1234",
    -					Username:        "gopher",
    -					Password:        "hole",
    -					Entitlement:     "monitoring_entitled",
    -					Separator:       ",",
    -					RefreshInterval: model.Duration(60 * time.Second),
    +					Server:           "https://localhost:1234",
    +					Username:         "gopher",
    +					Password:         "hole",
    +					Entitlement:      "monitoring_entitled",
    +					Separator:        ",",
    +					RefreshInterval:  model.Duration(60 * time.Second),
    +					HTTPClientConfig: config.DefaultHTTPClientConfig,
     				},
     			},
     		},
    diff --git a/discovery/uyuni/uyuni.go b/discovery/uyuni/uyuni.go
    index f9630ce3570..e37acbf98ad 100644
    --- a/discovery/uyuni/uyuni.go
    +++ b/discovery/uyuni/uyuni.go
    @@ -52,9 +52,10 @@ const (
     
     // DefaultSDConfig is the default Uyuni SD configuration.
     var DefaultSDConfig = SDConfig{
    -	Entitlement:     "monitoring_entitled",
    -	Separator:       ",",
    -	RefreshInterval: model.Duration(1 * time.Minute),
    +	Entitlement:      "monitoring_entitled",
    +	Separator:        ",",
    +	RefreshInterval:  model.Duration(1 * time.Minute),
    +	HTTPClientConfig: config.DefaultHTTPClientConfig,
     }
     
     func init() {
    @@ -117,6 +118,11 @@ func (c *SDConfig) NewDiscoverer(opts discovery.DiscovererOptions) (discovery.Di
     	return NewDiscovery(c, opts.Logger)
     }
     
    +// SetDirectory joins any relative file paths with dir.
    +func (c *SDConfig) SetDirectory(dir string) {
    +	c.HTTPClientConfig.SetDirectory(dir)
    +}
    +
     // UnmarshalYAML implements the yaml.Unmarshaler interface.
     func (c *SDConfig) UnmarshalYAML(unmarshal func(interface{}) error) error {
     	*c = DefaultSDConfig
    
    From c92d571e5dcfc656219d975f79daf2e11d0d696e Mon Sep 17 00:00:00 2001
    From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
    Date: Wed, 8 Jun 2022 15:54:38 +0200
    Subject: [PATCH 117/135] build(deps): bump github.com/gophercloud/gophercloud
     (#10834)
    
    Bumps [github.com/gophercloud/gophercloud](https://github.com/gophercloud/gophercloud) from 0.24.0 to 0.25.0.
    - [Release notes](https://github.com/gophercloud/gophercloud/releases)
    - [Changelog](https://github.com/gophercloud/gophercloud/blob/master/CHANGELOG.md)
    - [Commits](https://github.com/gophercloud/gophercloud/compare/v0.24.0...v0.25.0)
    
    ---
    updated-dependencies:
    - dependency-name: github.com/gophercloud/gophercloud
      dependency-type: direct:production
      update-type: version-update:semver-minor
    ...
    
    Signed-off-by: dependabot[bot] 
    
    Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
    ---
     go.mod | 2 +-
     go.sum | 4 ++--
     2 files changed, 3 insertions(+), 3 deletions(-)
    
    diff --git a/go.mod b/go.mod
    index 76abda1a523..8725a51a2a4 100644
    --- a/go.mod
    +++ b/go.mod
    @@ -24,7 +24,7 @@ require (
     	github.com/gogo/protobuf v1.3.2
     	github.com/golang/snappy v0.0.4
     	github.com/google/pprof v0.0.0-20220520215854-d04f2422c8a1
    -	github.com/gophercloud/gophercloud v0.24.0
    +	github.com/gophercloud/gophercloud v0.25.0
     	github.com/grafana/regexp v0.0.0-20220304095617-2e8d9baf4ac2
     	github.com/grpc-ecosystem/grpc-gateway v1.16.0
     	github.com/hashicorp/consul/api v1.13.0
    diff --git a/go.sum b/go.sum
    index e3a7f0de51b..cc27d3644a9 100644
    --- a/go.sum
    +++ b/go.sum
    @@ -436,8 +436,8 @@ github.com/googleapis/gax-go/v2 v2.2.0/go.mod h1:as02EH8zWkzwUoLbBaFeQ+arQaj/Oth
     github.com/googleapis/gax-go/v2 v2.3.0/go.mod h1:b8LNqSzNabLiUpXKkY7HAR5jr6bIT99EXz9pXxye9YM=
     github.com/googleapis/gax-go/v2 v2.4.0 h1:dS9eYAjhrE2RjmzYw2XAPvcXfmcQLtFEQWn0CR82awk=
     github.com/googleapis/gax-go/v2 v2.4.0/go.mod h1:XOTVJ59hdnfJLIP/dh8n5CGryZR2LxK9wbMD5+iXC6c=
    -github.com/gophercloud/gophercloud v0.24.0 h1:jDsIMGJ1KZpAjYfQgGI2coNQj5Q83oPzuiGJRFWgMzw=
    -github.com/gophercloud/gophercloud v0.24.0/go.mod h1:Q8fZtyi5zZxPS/j9aj3sSxtvj41AdQMDwyo1myduD5c=
    +github.com/gophercloud/gophercloud v0.25.0 h1:C3Oae7y0fUVQGSsBrb3zliAjdX+riCSEh4lNMejFNI4=
    +github.com/gophercloud/gophercloud v0.25.0/go.mod h1:Q8fZtyi5zZxPS/j9aj3sSxtvj41AdQMDwyo1myduD5c=
     github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
     github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg=
     github.com/gorilla/mux v1.6.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs=
    
    From 7b8ed5d36bc64a13d62c6ec2a3ce40f54ccdb5b3 Mon Sep 17 00:00:00 2001
    From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
    Date: Wed, 8 Jun 2022 15:55:01 +0200
    Subject: [PATCH 118/135] build(deps): bump github.com/prometheus/common
     (#10826)
    
    Bumps [github.com/prometheus/common](https://github.com/prometheus/common) from 0.32.1 to 0.34.0.
    - [Release notes](https://github.com/prometheus/common/releases)
    - [Commits](https://github.com/prometheus/common/compare/v0.32.1...v0.34.0)
    
    ---
    updated-dependencies:
    - dependency-name: github.com/prometheus/common
      dependency-type: direct:production
      update-type: version-update:semver-minor
    ...
    
    Signed-off-by: dependabot[bot] 
    
    Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
    ---
     documentation/examples/remote_storage/go.mod |  6 +++---
     documentation/examples/remote_storage/go.sum | 13 +++++++++----
     2 files changed, 12 insertions(+), 7 deletions(-)
    
    diff --git a/documentation/examples/remote_storage/go.mod b/documentation/examples/remote_storage/go.mod
    index c6dd8dcdbca..28e3e00c0ee 100644
    --- a/documentation/examples/remote_storage/go.mod
    +++ b/documentation/examples/remote_storage/go.mod
    @@ -8,7 +8,7 @@ require (
     	github.com/golang/snappy v0.0.4
     	github.com/influxdata/influxdb v1.9.5
     	github.com/prometheus/client_golang v1.12.2
    -	github.com/prometheus/common v0.32.1
    +	github.com/prometheus/common v0.34.0
     	github.com/prometheus/prometheus v1.8.2-0.20220202104425-d819219dd438
     	github.com/stretchr/testify v1.7.2
     	gopkg.in/alecthomas/kingpin.v2 v2.2.6
    @@ -41,8 +41,8 @@ require (
     	go.opentelemetry.io/otel/trace v1.2.0 // indirect
     	go.uber.org/atomic v1.9.0 // indirect
     	go.uber.org/goleak v1.1.12 // indirect
    -	golang.org/x/net v0.0.0-20220105145211-5b0dc2dfae98 // indirect
    -	golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8 // indirect
    +	golang.org/x/net v0.0.0-20220225172249-27dd8689420f // indirect
    +	golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b // indirect
     	golang.org/x/sys v0.0.0-20220114195835-da31bd327af9 // indirect
     	golang.org/x/text v0.3.7 // indirect
     	golang.org/x/time v0.0.0-20211116232009-f0f3c7e86c11 // indirect
    diff --git a/documentation/examples/remote_storage/go.sum b/documentation/examples/remote_storage/go.sum
    index 0a58fd13c57..85613e638e0 100644
    --- a/documentation/examples/remote_storage/go.sum
    +++ b/documentation/examples/remote_storage/go.sum
    @@ -1127,8 +1127,9 @@ github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB8
     github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc=
     github.com/prometheus/common v0.29.0/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls=
     github.com/prometheus/common v0.30.0/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls=
    -github.com/prometheus/common v0.32.1 h1:hWIdL3N2HoUx3B8j3YN9mWor0qhY/NlEKZEaXxuIRh4=
     github.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls=
    +github.com/prometheus/common v0.34.0 h1:RBmGO9d/FVjqHT0yUGQwBJhkwKV+wPCn7KGpvfab0uE=
    +github.com/prometheus/common v0.34.0/go.mod h1:gB3sOl7P0TvJabZpLY5uQMpUqRCPPCyRLCZYc7JZTNE=
     github.com/prometheus/common/sigv4 v0.1.0 h1:qoVebwtwwEhS85Czm2dSROY5fTo2PAPEVdDeppTwGX4=
     github.com/prometheus/common/sigv4 v0.1.0/go.mod h1:2Jkxxk9yYvCkE5G1sQT7GuEXm57JrvHu9k5YwTjsNtI=
     github.com/prometheus/exporter-toolkit v0.6.1/go.mod h1:ZUBIj498ePooX9t/2xtDjeQYwvRpiPP2lh5u4iblj2g=
    @@ -1504,8 +1505,10 @@ golang.org/x/net v0.0.0-20210813160813-60bc85c4be6d/go.mod h1:9nx3DQGgdP8bBQD5qx
     golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
     golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
     golang.org/x/net v0.0.0-20211216030914-fe4d6282115f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
    -golang.org/x/net v0.0.0-20220105145211-5b0dc2dfae98 h1:+6WJMRLHlD7X7frgp7TUZ36RnQzSf9wVVTNakEp+nqY=
     golang.org/x/net v0.0.0-20220105145211-5b0dc2dfae98/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
    +golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
    +golang.org/x/net v0.0.0-20220225172249-27dd8689420f h1:oA4XRj0qtSt8Yo1Zms0CUlsT3KG69V2UGQWPBxujDmc=
    +golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
     golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
     golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
     golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
    @@ -1521,8 +1524,9 @@ golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ
     golang.org/x/oauth2 v0.0.0-20210628180205-a41e5a781914/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
     golang.org/x/oauth2 v0.0.0-20210805134026-6f1e6394065a/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
     golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
    -golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8 h1:RerP+noqYHUQ8CMRcPlC2nvTa4dcBIjegkuWdcUDuqg=
     golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
    +golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b h1:clP8eMhB30EHdc0bd2Twtq6kgU7yl5ub2cQLSdrv1Dg=
    +golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc=
     golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
     golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
     golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
    @@ -1655,8 +1659,9 @@ golang.org/x/sys v0.0.0-20220114195835-da31bd327af9 h1:XfKQ4OlFl8okEOr5UvAqFRVj8
     golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
     golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw=
     golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
    -golang.org/x/term v0.0.0-20210220032956-6a3ed077a48d h1:SZxvLBoTP5yHO3Frd4z4vrF+DBX9vMVanchswa69toE=
     golang.org/x/term v0.0.0-20210220032956-6a3ed077a48d/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
    +golang.org/x/term v0.0.0-20210927222741-03fcf44c2211 h1:JGgROgKl9N8DuW20oFS5gxc+lE67/N3FcwmBPMe7ArY=
    +golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
     golang.org/x/text v0.0.0-20160726164857-2910a502d2bf/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
     golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
     golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
    
    From c2d6acdcc52161b4551533c9e55f797697c19e13 Mon Sep 17 00:00:00 2001
    From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
    Date: Wed, 8 Jun 2022 15:55:12 +0200
    Subject: [PATCH 119/135] build(deps): bump github.com/vultr/govultr/v2 from
     2.17.0 to 2.17.1 (#10811)
    
    Bumps [github.com/vultr/govultr/v2](https://github.com/vultr/govultr) from 2.17.0 to 2.17.1.
    - [Release notes](https://github.com/vultr/govultr/releases)
    - [Changelog](https://github.com/vultr/govultr/blob/master/CHANGELOG.md)
    - [Commits](https://github.com/vultr/govultr/compare/v2.17.0...v2.17.1)
    
    ---
    updated-dependencies:
    - dependency-name: github.com/vultr/govultr/v2
      dependency-type: direct:production
      update-type: version-update:semver-patch
    ...
    
    Signed-off-by: dependabot[bot] 
    
    Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
    ---
     go.mod | 2 +-
     go.sum | 4 ++--
     2 files changed, 3 insertions(+), 3 deletions(-)
    
    diff --git a/go.mod b/go.mod
    index 8725a51a2a4..867873aadc8 100644
    --- a/go.mod
    +++ b/go.mod
    @@ -48,7 +48,7 @@ require (
     	github.com/scaleway/scaleway-sdk-go v1.0.0-beta.9
     	github.com/shurcooL/httpfs v0.0.0-20190707220628-8d4bc4ba7749
     	github.com/stretchr/testify v1.7.1
    -	github.com/vultr/govultr/v2 v2.17.0
    +	github.com/vultr/govultr/v2 v2.17.1
     	go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.32.0
     	go.opentelemetry.io/otel v1.7.0
     	go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.7.0
    diff --git a/go.sum b/go.sum
    index cc27d3644a9..45d50e78617 100644
    --- a/go.sum
    +++ b/go.sum
    @@ -825,8 +825,8 @@ github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1
     github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM=
     github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA=
     github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0=
    -github.com/vultr/govultr/v2 v2.17.0 h1:BHa6MQvQn4YNOw+ecfrbISOf4+3cvgofEQHKBSXt6t0=
    -github.com/vultr/govultr/v2 v2.17.0/go.mod h1:ZFOKGWmgjytfyjeyAdhQlSWwTjh2ig+X49cAp50dzXI=
    +github.com/vultr/govultr/v2 v2.17.1 h1:UBmotwA0mkGtyJMakUF9jhLH/W3mN5wfGRn543i/BCA=
    +github.com/vultr/govultr/v2 v2.17.1/go.mod h1:ZFOKGWmgjytfyjeyAdhQlSWwTjh2ig+X49cAp50dzXI=
     github.com/xdg-go/pbkdf2 v1.0.0/go.mod h1:jrpuAogTd400dnrH08LKmI/xc1MbPOebTwRqcT5RDeI=
     github.com/xdg-go/scram v1.0.2/go.mod h1:1WAq6h33pAW+iRreB34OORO2Nf7qel3VV3fjBj+hCSs=
     github.com/xdg-go/stringprep v1.0.2/go.mod h1:8F9zXuvzgwmyT5DUm4GUfZGDdT3W+LCvS6+da4O5kxM=
    
    From 867d3bd78f514ffffcfd5da751cb2bd84c6aba72 Mon Sep 17 00:00:00 2001
    From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
    Date: Wed, 8 Jun 2022 15:55:35 +0200
    Subject: [PATCH 120/135] build(deps): bump github.com/go-kit/log (#10827)
    
    Bumps [github.com/go-kit/log](https://github.com/go-kit/log) from 0.2.0 to 0.2.1.
    - [Release notes](https://github.com/go-kit/log/releases)
    - [Commits](https://github.com/go-kit/log/compare/v0.2.0...v0.2.1)
    
    ---
    updated-dependencies:
    - dependency-name: github.com/go-kit/log
      dependency-type: direct:production
      update-type: version-update:semver-patch
    ...
    
    Signed-off-by: dependabot[bot] 
    
    Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
    ---
     documentation/examples/remote_storage/go.mod | 2 +-
     documentation/examples/remote_storage/go.sum | 3 ++-
     2 files changed, 3 insertions(+), 2 deletions(-)
    
    diff --git a/documentation/examples/remote_storage/go.mod b/documentation/examples/remote_storage/go.mod
    index 28e3e00c0ee..10b33e51f28 100644
    --- a/documentation/examples/remote_storage/go.mod
    +++ b/documentation/examples/remote_storage/go.mod
    @@ -3,7 +3,7 @@ module github.com/prometheus/prometheus/documentation/examples/remote_storage
     go 1.17
     
     require (
    -	github.com/go-kit/log v0.2.0
    +	github.com/go-kit/log v0.2.1
     	github.com/gogo/protobuf v1.3.2
     	github.com/golang/snappy v0.0.4
     	github.com/influxdata/influxdb v1.9.5
    diff --git a/documentation/examples/remote_storage/go.sum b/documentation/examples/remote_storage/go.sum
    index 85613e638e0..bedf519ed00 100644
    --- a/documentation/examples/remote_storage/go.sum
    +++ b/documentation/examples/remote_storage/go.sum
    @@ -458,8 +458,9 @@ github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2
     github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
     github.com/go-kit/kit v0.10.0/go.mod h1:xUsJbQ/Fp4kEt7AFgCuvyX4a71u8h9jB8tj/ORgOZ7o=
     github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY=
    -github.com/go-kit/log v0.2.0 h1:7i2K3eKTos3Vc0enKCfnVcgHh2olr/MyfboYq7cAcFw=
     github.com/go-kit/log v0.2.0/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0=
    +github.com/go-kit/log v0.2.1 h1:MRVx0/zhvdseW+Gza6N9rVzU/IVzaeE1SFI4raAhmBU=
    +github.com/go-kit/log v0.2.1/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0=
     github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=
     github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=
     github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A=
    
    From b8724ca763a9e8fdd08c22301d4e113eb654c02b Mon Sep 17 00:00:00 2001
    From: Julien Pivotto 
    Date: Thu, 9 Jun 2022 15:11:45 +0200
    Subject: [PATCH 121/135] Fix UI build (#10842)
    
    Signed-off-by: Julien Pivotto 
    ---
     web/ui/build_ui.sh | 4 ++++
     1 file changed, 4 insertions(+)
    
    diff --git a/web/ui/build_ui.sh b/web/ui/build_ui.sh
    index 59ed811366e..d395fc0ecdf 100644
    --- a/web/ui/build_ui.sh
    +++ b/web/ui/build_ui.sh
    @@ -15,6 +15,10 @@
     
     set -e
     current=$(pwd)
    +if ! [[ -w  $HOME ]]
    +then
    +  export npm_config_cache=$(mktemp -d)
    +fi
     
     buildOrder=(module/lezer-promql module/codemirror-promql)
     
    
    From f2ba2a0800ac953eb078248eecab7f11791ee454 Mon Sep 17 00:00:00 2001
    From: Julien Pivotto 
    Date: Thu, 9 Jun 2022 15:11:46 +0200
    Subject: [PATCH 122/135] Fix UI build (#10843)
    
    Signed-off-by: Julien Pivotto 
    ---
     web/ui/build_ui.sh | 4 ++++
     1 file changed, 4 insertions(+)
    
    diff --git a/web/ui/build_ui.sh b/web/ui/build_ui.sh
    index 59ed811366e..d395fc0ecdf 100644
    --- a/web/ui/build_ui.sh
    +++ b/web/ui/build_ui.sh
    @@ -15,6 +15,10 @@
     
     set -e
     current=$(pwd)
    +if ! [[ -w  $HOME ]]
    +then
    +  export npm_config_cache=$(mktemp -d)
    +fi
     
     buildOrder=(module/lezer-promql module/codemirror-promql)
     
    
    From 8ac4e50ec43937aea0e08fc4eb8c7f2f0388e8c0 Mon Sep 17 00:00:00 2001
    From: Julien Pivotto 
    Date: Thu, 9 Jun 2022 15:33:31 +0200
    Subject: [PATCH 123/135] Add --lint-fatal option (#10815) (#10840)
    
    This keeps the previous behaviour of printing details about duplicate
    rules but doesn't exit with a fatal exit code unless turned on.
    
    Signed-off-by: David Leadbeater 
    
    Co-authored-by: David Leadbeater 
    ---
     cmd/promtool/main.go | 41 +++++++++++++++++++++++++----------------
     1 file changed, 25 insertions(+), 16 deletions(-)
    
    diff --git a/cmd/promtool/main.go b/cmd/promtool/main.go
    index 01d953d2049..ad802e48240 100644
    --- a/cmd/promtool/main.go
    +++ b/cmd/promtool/main.go
    @@ -95,6 +95,9 @@ func main() {
     		"lint",
     		"Linting checks to apply to the rules specified in the config. Available options are: "+strings.Join(lintOptions, ", ")+". Use --lint=none to disable linting",
     	).Default(lintOptionDuplicateRules).String()
    +	checkConfigLintFatal := checkConfigCmd.Flag(
    +		"lint-fatal",
    +		"Make lint errors exit with exit code 3.").Default("false").Bool()
     
     	checkWebConfigCmd := checkCmd.Command("web-config", "Check if the web config files are valid or not.")
     	webConfigFiles := checkWebConfigCmd.Arg(
    @@ -111,6 +114,9 @@ func main() {
     		"lint",
     		"Linting checks to apply. Available options are: "+strings.Join(lintOptions, ", ")+". Use --lint=none to disable linting",
     	).Default(lintOptionDuplicateRules).String()
    +	checkRulesLintFatal := checkRulesCmd.Flag(
    +		"lint-fatal",
    +		"Make lint errors exit with exit code 3.").Default("false").Bool()
     
     	checkMetricsCmd := checkCmd.Command("metrics", checkMetricsUsage)
     	checkMetricsExtended := checkCmd.Flag("extended", "Print extended information related to the cardinality of the metrics.").Bool()
    @@ -236,13 +242,13 @@ func main() {
     		os.Exit(CheckSD(*sdConfigFile, *sdJobName, *sdTimeout))
     
     	case checkConfigCmd.FullCommand():
    -		os.Exit(CheckConfig(*agentMode, *checkConfigSyntaxOnly, newLintConfig(*checkConfigLint), *configFiles...))
    +		os.Exit(CheckConfig(*agentMode, *checkConfigSyntaxOnly, newLintConfig(*checkConfigLint, *checkConfigLintFatal), *configFiles...))
     
     	case checkWebConfigCmd.FullCommand():
     		os.Exit(CheckWebConfig(*webConfigFiles...))
     
     	case checkRulesCmd.FullCommand():
    -		os.Exit(CheckRules(newLintConfig(*checkRulesLint), *ruleFiles...))
    +		os.Exit(CheckRules(newLintConfig(*checkRulesLint, *checkRulesLintFatal), *ruleFiles...))
     
     	case checkMetricsCmd.FullCommand():
     		os.Exit(CheckMetrics(*checkMetricsExtended))
    @@ -303,11 +309,14 @@ var lintError = fmt.Errorf("lint error")
     type lintConfig struct {
     	all            bool
     	duplicateRules bool
    +	fatal          bool
     }
     
    -func newLintConfig(stringVal string) lintConfig {
    +func newLintConfig(stringVal string, fatal bool) lintConfig {
     	items := strings.Split(stringVal, ",")
    -	ls := lintConfig{}
    +	ls := lintConfig{
    +		fatal: fatal,
    +	}
     	for _, setting := range items {
     		switch setting {
     		case lintOptionAll:
    @@ -329,7 +338,7 @@ func (ls lintConfig) lintDuplicateRules() bool {
     // CheckConfig validates configuration files.
     func CheckConfig(agentMode, checkSyntaxOnly bool, lintSettings lintConfig, files ...string) int {
     	failed := false
    -	hasLintErrors := false
    +	hasErrors := false
     
     	for _, f := range files {
     		ruleFiles, err := checkConfig(agentMode, f, checkSyntaxOnly)
    @@ -352,7 +361,7 @@ func CheckConfig(agentMode, checkSyntaxOnly bool, lintSettings lintConfig, files
     				}
     				failed = true
     				for _, err := range errs {
    -					hasLintErrors = hasLintErrors || errors.Is(err, lintError)
    +					hasErrors = hasErrors || !errors.Is(err, lintError)
     				}
     			} else {
     				fmt.Printf("  SUCCESS: %d rules found\n", n)
    @@ -360,12 +369,12 @@ func CheckConfig(agentMode, checkSyntaxOnly bool, lintSettings lintConfig, files
     			fmt.Println()
     		}
     	}
    -	if failed && hasLintErrors {
    -		return lintErrExitCode
    -	}
    -	if failed {
    +	if failed && hasErrors {
     		return failureExitCode
     	}
    +	if failed && lintSettings.fatal {
    +		return lintErrExitCode
    +	}
     	return successExitCode
     }
     
    @@ -573,7 +582,7 @@ func checkSDFile(filename string) ([]*targetgroup.Group, error) {
     // CheckRules validates rule files.
     func CheckRules(ls lintConfig, files ...string) int {
     	failed := false
    -	hasLintErrors := false
    +	hasErrors := false
     
     	for _, f := range files {
     		if n, errs := checkRules(f, ls); errs != nil {
    @@ -583,19 +592,19 @@ func CheckRules(ls lintConfig, files ...string) int {
     			}
     			failed = true
     			for _, err := range errs {
    -				hasLintErrors = hasLintErrors || errors.Is(err, lintError)
    +				hasErrors = hasErrors || !errors.Is(err, lintError)
     			}
     		} else {
     			fmt.Printf("  SUCCESS: %d rules found\n", n)
     		}
     		fmt.Println()
     	}
    -	if failed && hasLintErrors {
    -		return lintErrExitCode
    -	}
    -	if failed {
    +	if failed && hasErrors {
     		return failureExitCode
     	}
    +	if failed && ls.fatal {
    +		return lintErrExitCode
    +	}
     	return successExitCode
     }
     
    
    From e5b794293fcd879a94b8e26c0c7ec2b45568d95a Mon Sep 17 00:00:00 2001
    From: Matthias Loibl 
    Date: Thu, 9 Jun 2022 16:14:29 +0200
    Subject: [PATCH 124/135] Add v2.36.1 CHANGELOG and VERSION update
    
    Signed-off-by: Matthias Loibl 
    ---
     CHANGELOG.md | 4 ++++
     VERSION      | 2 +-
     2 files changed, 5 insertions(+), 1 deletion(-)
    
    diff --git a/CHANGELOG.md b/CHANGELOG.md
    index fd107d12fe7..9215f67bc7c 100644
    --- a/CHANGELOG.md
    +++ b/CHANGELOG.md
    @@ -1,5 +1,9 @@
     # Changelog
     
    +## 2.36.1 / 2022-06-09
    +
    +* [BUGFIX] promtool: Add --lint-fatal option #10840
    +
     ## 2.36.0 / 2022-05-30
     
     * [FEATURE] Add lowercase and uppercase relabel action. #10641
    diff --git a/VERSION b/VERSION
    index 3a05135cd86..089d1d4e029 100644
    --- a/VERSION
    +++ b/VERSION
    @@ -1 +1 @@
    -2.36.0
    +2.36.1
    
    From 00982ce4d3c5a68e950e60b18626acd19cb4df73 Mon Sep 17 00:00:00 2001
    From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
    Date: Thu, 9 Jun 2022 14:37:17 +0000
    Subject: [PATCH 125/135] build(deps): bump github.com/stretchr/testify from
     1.7.1 to 1.7.2
    
    Bumps [github.com/stretchr/testify](https://github.com/stretchr/testify) from 1.7.1 to 1.7.2.
    - [Release notes](https://github.com/stretchr/testify/releases)
    - [Commits](https://github.com/stretchr/testify/compare/v1.7.1...v1.7.2)
    
    ---
    updated-dependencies:
    - dependency-name: github.com/stretchr/testify
      dependency-type: direct:production
      update-type: version-update:semver-patch
    ...
    
    Signed-off-by: dependabot[bot] 
    ---
     go.mod | 2 +-
     go.sum | 3 ++-
     2 files changed, 3 insertions(+), 2 deletions(-)
    
    diff --git a/go.mod b/go.mod
    index 867873aadc8..8ce34ebc6ab 100644
    --- a/go.mod
    +++ b/go.mod
    @@ -47,7 +47,7 @@ require (
     	github.com/prometheus/exporter-toolkit v0.7.1
     	github.com/scaleway/scaleway-sdk-go v1.0.0-beta.9
     	github.com/shurcooL/httpfs v0.0.0-20190707220628-8d4bc4ba7749
    -	github.com/stretchr/testify v1.7.1
    +	github.com/stretchr/testify v1.7.2
     	github.com/vultr/govultr/v2 v2.17.1
     	go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.32.0
     	go.opentelemetry.io/otel v1.7.0
    diff --git a/go.sum b/go.sum
    index 45d50e78617..6d70f092da7 100644
    --- a/go.sum
    +++ b/go.sum
    @@ -817,8 +817,9 @@ github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81P
     github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=
     github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
     github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
    -github.com/stretchr/testify v1.7.1 h1:5TQK59W5E3v0r2duFAb7P95B6hEeOyEnHRa8MjYSMTY=
     github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
    +github.com/stretchr/testify v1.7.2 h1:4jaiDzPyXQvSd7D0EjG45355tLlV3VOECpq10pLC+8s=
    +github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals=
     github.com/tidwall/pretty v1.0.0 h1:HsD+QiTn7sK6flMKIvNmpqz1qrpP3Ps6jOKIKMooyg4=
     github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk=
     github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U=
    
    From 542b9ecdbd758009d52402f6a486d1237a6647b7 Mon Sep 17 00:00:00 2001
    From: Bryan Boreham 
    Date: Sun, 12 Jun 2022 07:24:11 +0100
    Subject: [PATCH 126/135] tsdb: reduce sleep time when reading WAL (#10859)
    
    The code sleeps for a short time to allow goroutines to finish, however
    it seems the duration can be reduced a lot, speeding up the reading
    process.
    
    I checked using some WAL data from production, and the queue is almost
    always empty at the time we enter `waitForIdle()` so there is no danger
    of spinning in the tight loop.
    
    Signed-off-by: Bryan Boreham 
    ---
     tsdb/head_wal.go | 2 +-
     1 file changed, 1 insertion(+), 1 deletion(-)
    
    diff --git a/tsdb/head_wal.go b/tsdb/head_wal.go
    index 6f2fd6eaa4e..a8232ff7d34 100644
    --- a/tsdb/head_wal.go
    +++ b/tsdb/head_wal.go
    @@ -438,7 +438,7 @@ func (wp *walSubsetProcessor) waitUntilIdle() {
     	}
     	wp.input <- []record.RefSample{}
     	for len(wp.input) != 0 {
    -		time.Sleep(1 * time.Millisecond)
    +		time.Sleep(10 * time.Microsecond)
     		select {
     		case <-wp.output: // Allow output side to drain to avoid deadlock.
     		default:
    
    From e166cf402a9d2b838d5fba72d5b60117e9265898 Mon Sep 17 00:00:00 2001
    From: Augustin Husson 
    Date: Mon, 13 Jun 2022 10:53:46 +0200
    Subject: [PATCH 127/135] use npm workspace flag for the build instead of
     manually navigate through the folders (#10854)
    
    Signed-off-by: Augustin Husson 
    ---
     web/ui/build_ui.sh | 12 ++++--------
     1 file changed, 4 insertions(+), 8 deletions(-)
    
    diff --git a/web/ui/build_ui.sh b/web/ui/build_ui.sh
    index d395fc0ecdf..b59d81de41d 100644
    --- a/web/ui/build_ui.sh
    +++ b/web/ui/build_ui.sh
    @@ -14,28 +14,24 @@
     # limitations under the License.
     
     set -e
    -current=$(pwd)
    +
     if ! [[ -w  $HOME ]]
     then
       export npm_config_cache=$(mktemp -d)
     fi
     
    -buildOrder=(module/lezer-promql module/codemirror-promql)
    +buildOrder=(lezer-promql codemirror-promql)
     
     function buildModule() {
       for module in "${buildOrder[@]}"; do
    -    cd "${module}"
         echo "build ${module}"
    -    npm run build
    -    cd "${current}"
    +    npm run build -w "${module}"
       done
     }
     
     function buildReactApp() {
    -  cd react-app
       echo "build react-app"
    -  npm run build
    -  cd "${current}"
    +  npm run build -w react-app
       rm -rf ./static/react
       mv ./react-app/build ./static/react
     }
    
    From f4ea0709f932eca72d3ffbf8c173c258380a35cf Mon Sep 17 00:00:00 2001
    From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
    Date: Mon, 13 Jun 2022 09:42:48 +0000
    Subject: [PATCH 128/135] build(deps): bump k8s.io/client-go from 0.24.0 to
     0.24.1
    
    Bumps [k8s.io/client-go](https://github.com/kubernetes/client-go) from 0.24.0 to 0.24.1.
    - [Release notes](https://github.com/kubernetes/client-go/releases)
    - [Changelog](https://github.com/kubernetes/client-go/blob/master/CHANGELOG.md)
    - [Commits](https://github.com/kubernetes/client-go/compare/v0.24.0...v0.24.1)
    
    ---
    updated-dependencies:
    - dependency-name: k8s.io/client-go
      dependency-type: direct:production
      update-type: version-update:semver-patch
    ...
    
    Signed-off-by: dependabot[bot] 
    ---
     go.mod | 2 +-
     go.sum | 6 ++----
     2 files changed, 3 insertions(+), 5 deletions(-)
    
    diff --git a/go.mod b/go.mod
    index 8ce34ebc6ab..9c0c83bfb0d 100644
    --- a/go.mod
    +++ b/go.mod
    @@ -74,7 +74,7 @@ require (
     	gopkg.in/yaml.v3 v3.0.1
     	k8s.io/api v0.24.1
     	k8s.io/apimachinery v0.24.1
    -	k8s.io/client-go v0.24.0
    +	k8s.io/client-go v0.24.1
     	k8s.io/klog v1.0.0
     	k8s.io/klog/v2 v2.60.1
     )
    diff --git a/go.sum b/go.sum
    index 6d70f092da7..f997a5d6b10 100644
    --- a/go.sum
    +++ b/go.sum
    @@ -1458,14 +1458,12 @@ honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWh
     honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg=
     honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=
     honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=
    -k8s.io/api v0.24.0/go.mod h1:5Jl90IUrJHUJYEMANRURMiVvJ0g7Ax7r3R1bqO8zx8I=
     k8s.io/api v0.24.1 h1:BjCMRDcyEYz03joa3K1+rbshwh1Ay6oB53+iUx2H8UY=
     k8s.io/api v0.24.1/go.mod h1:JhoOvNiLXKTPQ60zh2g0ewpA+bnEYf5q44Flhquh4vQ=
    -k8s.io/apimachinery v0.24.0/go.mod h1:82Bi4sCzVBdpYjyI4jY6aHX+YCUchUIrZrXKedjd2UM=
     k8s.io/apimachinery v0.24.1 h1:ShD4aDxTQKN5zNf8K1RQ2u98ELLdIW7jEnlO9uAMX/I=
     k8s.io/apimachinery v0.24.1/go.mod h1:82Bi4sCzVBdpYjyI4jY6aHX+YCUchUIrZrXKedjd2UM=
    -k8s.io/client-go v0.24.0 h1:lbE4aB1gTHvYFSwm6eD3OF14NhFDKCejlnsGYlSJe5U=
    -k8s.io/client-go v0.24.0/go.mod h1:VFPQET+cAFpYxh6Bq6f4xyMY80G6jKKktU6G0m00VDw=
    +k8s.io/client-go v0.24.1 h1:w1hNdI9PFrzu3OlovVeTnf4oHDt+FJLd9Ndluvnb42E=
    +k8s.io/client-go v0.24.1/go.mod h1:f1kIDqcEYmwXS/vTbbhopMUbhKp2JhOeVTfxgaCIlF8=
     k8s.io/gengo v0.0.0-20210813121822-485abfe95c7c/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E=
     k8s.io/kube-openapi v0.0.0-20220328201542-3ee0da9b0b42 h1:Gii5eqf+GmIEwGNKQYQClCayuJCe2/4fZUvF7VG99sU=
     k8s.io/kube-openapi v0.0.0-20220328201542-3ee0da9b0b42/go.mod h1:Z/45zLw8lUo4wdiUkI+v/ImEGAvu3WatcZl3lPMR4Rk=
    
    From f609b7bbcc6ec91cce261a4542bf5b65b92d1010 Mon Sep 17 00:00:00 2001
    From: Augustin Husson 
    Date: Mon, 13 Jun 2022 13:08:59 +0200
    Subject: [PATCH 129/135] remove GO111MODULE and GOVENDOR usage (#10836)
    
    Signed-off-by: Augustin Husson 
    ---
     Makefile.common | 75 ++++++++-----------------------------------------
     1 file changed, 11 insertions(+), 64 deletions(-)
    
    diff --git a/Makefile.common b/Makefile.common
    index c263b733fbc..6c8e3e21979 100644
    --- a/Makefile.common
    +++ b/Makefile.common
    @@ -36,29 +36,6 @@ GO_VERSION        ?= $(shell $(GO) version)
     GO_VERSION_NUMBER ?= $(word 3, $(GO_VERSION))
     PRE_GO_111        ?= $(shell echo $(GO_VERSION_NUMBER) | grep -E 'go1\.(10|[0-9])\.')
     
    -GOVENDOR :=
    -GO111MODULE :=
    -ifeq (, $(PRE_GO_111))
    -	ifneq (,$(wildcard go.mod))
    -		# Enforce Go modules support just in case the directory is inside GOPATH (and for Travis CI).
    -		GO111MODULE := on
    -
    -		ifneq (,$(wildcard vendor))
    -			# Always use the local vendor/ directory to satisfy the dependencies.
    -			GOOPTS := $(GOOPTS) -mod=vendor
    -		endif
    -	endif
    -else
    -	ifneq (,$(wildcard go.mod))
    -		ifneq (,$(wildcard vendor))
    -$(warning This repository requires Go >= 1.11 because of Go modules)
    -$(warning Some recipes may not work as expected as the current Go runtime is '$(GO_VERSION_NUMBER)')
    -		endif
    -	else
    -		# This repository isn't using Go modules (yet).
    -		GOVENDOR := $(FIRST_GOPATH)/bin/govendor
    -	endif
    -endif
     PROMU        := $(FIRST_GOPATH)/bin/promu
     pkgs          = ./...
     
    @@ -150,11 +127,7 @@ common-check_license:
     .PHONY: common-deps
     common-deps:
     	@echo ">> getting dependencies"
    -ifdef GO111MODULE
    -	GO111MODULE=$(GO111MODULE) $(GO) mod download
    -else
    -	$(GO) get $(GOOPTS) -t ./...
    -endif
    +	$(GO) mod download
     
     .PHONY: update-go-deps
     update-go-deps:
    @@ -162,20 +135,17 @@ update-go-deps:
     	@for m in $$($(GO) list -mod=readonly -m -f '{{ if and (not .Indirect) (not .Main)}}{{.Path}}{{end}}' all); do \
     		$(GO) get -d $$m; \
     	done
    -	GO111MODULE=$(GO111MODULE) $(GO) mod tidy
    -ifneq (,$(wildcard vendor))
    -	GO111MODULE=$(GO111MODULE) $(GO) mod vendor
    -endif
    +	$(GO) mod tidy
     
     .PHONY: common-test-short
     common-test-short: $(GOTEST_DIR)
     	@echo ">> running short tests"
    -	GO111MODULE=$(GO111MODULE) $(GOTEST) -short $(GOOPTS) $(pkgs)
    +	$(GOTEST) -short $(GOOPTS) $(pkgs)
     
     .PHONY: common-test
     common-test: $(GOTEST_DIR)
     	@echo ">> running all tests"
    -	GO111MODULE=$(GO111MODULE) $(GOTEST) $(test-flags) $(GOOPTS) $(pkgs)
    +	$(GOTEST) $(test-flags) $(GOOPTS) $(pkgs)
     
     $(GOTEST_DIR):
     	@mkdir -p $@
    @@ -183,25 +153,21 @@ $(GOTEST_DIR):
     .PHONY: common-format
     common-format:
     	@echo ">> formatting code"
    -	GO111MODULE=$(GO111MODULE) $(GO) fmt $(pkgs)
    +	$(GO) fmt $(pkgs)
     
     .PHONY: common-vet
     common-vet:
     	@echo ">> vetting code"
    -	GO111MODULE=$(GO111MODULE) $(GO) vet $(GOOPTS) $(pkgs)
    +	$(GO) vet $(GOOPTS) $(pkgs)
     
     .PHONY: common-lint
     common-lint: $(GOLANGCI_LINT)
     ifdef GOLANGCI_LINT
     	@echo ">> running golangci-lint"
    -ifdef GO111MODULE
     # 'go list' needs to be executed before staticcheck to prepopulate the modules cache.
     # Otherwise staticcheck might fail randomly for some reason not yet explained.
    -	GO111MODULE=$(GO111MODULE) $(GO) list -e -compiled -test=true -export=false -deps=true -find=false -tags= -- ./... > /dev/null
    -	GO111MODULE=$(GO111MODULE) $(GOLANGCI_LINT) run $(GOLANGCI_LINT_OPTS) $(pkgs)
    -else
    -	$(GOLANGCI_LINT) run $(pkgs)
    -endif
    +	$(GO) list -e -compiled -test=true -export=false -deps=true -find=false -tags= -- ./... > /dev/null
    +	$(GOLANGCI_LINT) run $(GOLANGCI_LINT_OPTS) $(pkgs)
     endif
     
     .PHONY: common-yamllint
    @@ -218,28 +184,15 @@ endif
     common-staticcheck: lint
     
     .PHONY: common-unused
    -common-unused: $(GOVENDOR)
    -ifdef GOVENDOR
    -	@echo ">> running check for unused packages"
    -	@$(GOVENDOR) list +unused | grep . && exit 1 || echo 'No unused packages'
    -else
    -ifdef GO111MODULE
    +common-unused:
     	@echo ">> running check for unused/missing packages in go.mod"
    -	GO111MODULE=$(GO111MODULE) $(GO) mod tidy
    -ifeq (,$(wildcard vendor))
    +	$(GO) mod tidy
     	@git diff --exit-code -- go.sum go.mod
    -else
    -	@echo ">> running check for unused packages in vendor/"
    -	GO111MODULE=$(GO111MODULE) $(GO) mod vendor
    -	@git diff --exit-code -- go.sum go.mod vendor/
    -endif
    -endif
    -endif
     
     .PHONY: common-build
     common-build: promu
     	@echo ">> building binaries"
    -	GO111MODULE=$(GO111MODULE) $(PROMU) build --prefix $(PREFIX) $(PROMU_BINARIES)
    +	$(PROMU) build --prefix $(PREFIX) $(PROMU_BINARIES)
     
     .PHONY: common-tarball
     common-tarball: promu
    @@ -295,12 +248,6 @@ $(GOLANGCI_LINT):
     		| sh -s -- -b $(FIRST_GOPATH)/bin $(GOLANGCI_LINT_VERSION)
     endif
     
    -ifdef GOVENDOR
    -.PHONY: $(GOVENDOR)
    -$(GOVENDOR):
    -	GOOS= GOARCH= $(GO) get -u github.com/kardianos/govendor
    -endif
    -
     .PHONY: precheck
     precheck::
     
    
    From 4f3791024af4e1233505d47b14e75486f8b3a5b9 Mon Sep 17 00:00:00 2001
    From: Paschalis Tsilias 
    Date: Mon, 13 Jun 2022 16:00:48 +0300
    Subject: [PATCH 130/135] Drop extra string held in relabel.Regexp struct
     (#10846)
    
    * Drop extra string held in relabel.Regexp struct
    
    Signed-off-by: Paschalis Tsilias 
    
    * Use slice operations instead of TrimPrefix/TrimSuffix; Override String() method
    
    Signed-off-by: Paschalis Tsilias 
    ---
     model/relabel/relabel.go      | 17 ++++++++++-------
     model/relabel/relabel_test.go |  2 +-
     2 files changed, 11 insertions(+), 8 deletions(-)
    
    diff --git a/model/relabel/relabel.go b/model/relabel/relabel.go
    index 98a245bba62..687ac03d083 100644
    --- a/model/relabel/relabel.go
    +++ b/model/relabel/relabel.go
    @@ -142,17 +142,13 @@ func (c *Config) UnmarshalYAML(unmarshal func(interface{}) error) error {
     // Regexp encapsulates a regexp.Regexp and makes it YAML marshalable.
     type Regexp struct {
     	*regexp.Regexp
    -	original string
     }
     
     // NewRegexp creates a new anchored Regexp and returns an error if the
     // passed-in regular expression does not compile.
     func NewRegexp(s string) (Regexp, error) {
     	regex, err := regexp.Compile("^(?:" + s + ")$")
    -	return Regexp{
    -		Regexp:   regex,
    -		original: s,
    -	}, err
    +	return Regexp{Regexp: regex}, err
     }
     
     // MustNewRegexp works like NewRegexp, but panics if the regular expression does not compile.
    @@ -180,12 +176,19 @@ func (re *Regexp) UnmarshalYAML(unmarshal func(interface{}) error) error {
     
     // MarshalYAML implements the yaml.Marshaler interface.
     func (re Regexp) MarshalYAML() (interface{}, error) {
    -	if re.original != "" {
    -		return re.original, nil
    +	if re.String() != "" {
    +		return re.String(), nil
     	}
     	return nil, nil
     }
     
    +// String returns the original string used to compile the regular expression.
    +func (re Regexp) String() string {
    +	str := re.Regexp.String()
    +	// Trim the anchor `^(?:` prefix and `)$` suffix.
    +	return str[4 : len(str)-2]
    +}
    +
     // Process returns a relabeled copy of the given label set. The relabel configurations
     // are applied in order of input.
     // If a label set is dropped, nil is returned.
    diff --git a/model/relabel/relabel_test.go b/model/relabel/relabel_test.go
    index 4ae1f53445d..5e9bd1438e2 100644
    --- a/model/relabel/relabel_test.go
    +++ b/model/relabel/relabel_test.go
    @@ -461,7 +461,7 @@ func TestRelabel(t *testing.T) {
     			if cfg.Separator == "" {
     				cfg.Separator = DefaultRelabelConfig.Separator
     			}
    -			if cfg.Regex.original == "" {
    +			if cfg.Regex.Regexp == nil || cfg.Regex.String() == "" {
     				cfg.Regex = DefaultRelabelConfig.Regex
     			}
     			if cfg.Replacement == "" {
    
    From 5184f49a2aca0afa66d2246f1112355fb7f3551a Mon Sep 17 00:00:00 2001
    From: Augustin Husson 
    Date: Mon, 13 Jun 2022 15:19:07 +0200
    Subject: [PATCH 131/135] put every packages under the prometheus-io
     organization (#10849)
    
    Signed-off-by: Augustin Husson 
    ---
     .../module/codemirror-promql/jest.config.cjs  |   4 +-
     web/ui/module/codemirror-promql/package.json  |   4 +-
     .../src/complete/hybrid.test.ts               |   2 +-
     .../codemirror-promql/src/complete/hybrid.ts  |   2 +-
     .../src/parser/matcher.test.ts                |   2 +-
     .../codemirror-promql/src/parser/matcher.ts   |   2 +-
     .../codemirror-promql/src/parser/parser.ts    |   2 +-
     .../src/parser/path-finder.test.ts            |   2 +-
     .../codemirror-promql/src/parser/type.ts      |   2 +-
     .../src/parser/vector.test.ts                 |   2 +-
     .../codemirror-promql/src/parser/vector.ts    |   2 +-
     web/ui/module/codemirror-promql/src/promql.ts |   2 +-
     .../codemirror-promql/src/test/utils-test.ts  |   2 +-
     .../codemirror-promql/src/types/function.ts   |   2 +-
     .../codemirror-promql/src/types/matcher.ts    |   2 +-
     web/ui/module/lezer-promql/package.json       |   2 +-
     web/ui/package-lock.json                      | 210 +++++++++---------
     web/ui/package.json                           |   2 +-
     web/ui/react-app/package.json                 |  10 +-
     .../src/pages/graph/ExpressionInput.tsx       |   4 +-
     20 files changed, 132 insertions(+), 130 deletions(-)
    
    diff --git a/web/ui/module/codemirror-promql/jest.config.cjs b/web/ui/module/codemirror-promql/jest.config.cjs
    index bf1adc69ccc..611315f791a 100644
    --- a/web/ui/module/codemirror-promql/jest.config.cjs
    +++ b/web/ui/module/codemirror-promql/jest.config.cjs
    @@ -12,7 +12,7 @@ module.exports = {
             },
         },
         moduleNameMapper: {
    -        'lezer-promql': '/../../node_modules/lezer-promql/dist/index.es.js'
    +        'lezer-promql': '/../../node_modules/@prometheus-io/lezer-promql/dist/index.es.js'
         },
    -    transformIgnorePatterns: ["/../../node_modules/(?!lezer-promql)/"]
    +    transformIgnorePatterns: ["/../../node_modules/(?!@prometheus-io/lezer-promql)/"]
     };
    diff --git a/web/ui/module/codemirror-promql/package.json b/web/ui/module/codemirror-promql/package.json
    index 9e66f4d759e..84cdc74dad1 100644
    --- a/web/ui/module/codemirror-promql/package.json
    +++ b/web/ui/module/codemirror-promql/package.json
    @@ -1,5 +1,5 @@
     {
    -  "name": "codemirror-promql",
    +  "name": "@prometheus-io/codemirror-promql",
       "version": "0.19.0",
       "description": "a CodeMirror mode for the PromQL language",
       "types": "dist/esm/index.d.ts",
    @@ -29,7 +29,7 @@
       },
       "homepage": "https://github.com/prometheus/prometheus/blob/main/web/ui/module/codemirror-promql/README.md",
       "dependencies": {
    -    "lezer-promql": "0.23.0",
    +    "@prometheus-io/lezer-promql": "0.23.0",
         "lru-cache": "^6.0.0"
       },
       "devDependencies": {
    diff --git a/web/ui/module/codemirror-promql/src/complete/hybrid.test.ts b/web/ui/module/codemirror-promql/src/complete/hybrid.test.ts
    index 99a21f3639b..2f02c0a3d9d 100644
    --- a/web/ui/module/codemirror-promql/src/complete/hybrid.test.ts
    +++ b/web/ui/module/codemirror-promql/src/complete/hybrid.test.ts
    @@ -26,7 +26,7 @@ import {
       numberTerms,
       snippets,
     } from './promql.terms';
    -import { EqlSingle, Neq } from 'lezer-promql';
    +import { EqlSingle, Neq } from '@prometheus-io/lezer-promql';
     import { syntaxTree } from '@codemirror/language';
     import { newCompleteStrategy } from './index';
     
    diff --git a/web/ui/module/codemirror-promql/src/complete/hybrid.ts b/web/ui/module/codemirror-promql/src/complete/hybrid.ts
    index 3cc2817aabb..fbcac0c9b06 100644
    --- a/web/ui/module/codemirror-promql/src/complete/hybrid.ts
    +++ b/web/ui/module/codemirror-promql/src/complete/hybrid.ts
    @@ -58,7 +58,7 @@ import {
       SubqueryExpr,
       Unless,
       VectorSelector,
    -} from 'lezer-promql';
    +} from '@prometheus-io/lezer-promql';
     import { Completion, CompletionContext, CompletionResult } from '@codemirror/autocomplete';
     import { EditorState } from '@codemirror/state';
     import { buildLabelMatchers, containsAtLeastOneChild, containsChild, retrieveAllRecursiveNodes, walkBackward, walkThrough } from '../parser';
    diff --git a/web/ui/module/codemirror-promql/src/parser/matcher.test.ts b/web/ui/module/codemirror-promql/src/parser/matcher.test.ts
    index 4f8f7a7877d..7e5f92ed3e0 100644
    --- a/web/ui/module/codemirror-promql/src/parser/matcher.test.ts
    +++ b/web/ui/module/codemirror-promql/src/parser/matcher.test.ts
    @@ -11,7 +11,7 @@
     // See the License for the specific language governing permissions and
     // limitations under the License.
     
    -import { EqlRegex, EqlSingle, Neq, NeqRegex } from 'lezer-promql';
    +import { EqlRegex, EqlSingle, Neq, NeqRegex } from '@prometheus-io/lezer-promql';
     import { labelMatchersToString } from './matcher';
     import { Matcher } from '../types';
     
    diff --git a/web/ui/module/codemirror-promql/src/parser/matcher.ts b/web/ui/module/codemirror-promql/src/parser/matcher.ts
    index 2950b4fca94..d9590d78e60 100644
    --- a/web/ui/module/codemirror-promql/src/parser/matcher.ts
    +++ b/web/ui/module/codemirror-promql/src/parser/matcher.ts
    @@ -12,7 +12,7 @@
     // limitations under the License.
     
     import { SyntaxNode } from '@lezer/common';
    -import { EqlRegex, EqlSingle, LabelName, MatchOp, Neq, NeqRegex, StringLiteral } from 'lezer-promql';
    +import { EqlRegex, EqlSingle, LabelName, MatchOp, Neq, NeqRegex, StringLiteral } from '@prometheus-io/lezer-promql';
     import { EditorState } from '@codemirror/state';
     import { Matcher } from '../types';
     
    diff --git a/web/ui/module/codemirror-promql/src/parser/parser.ts b/web/ui/module/codemirror-promql/src/parser/parser.ts
    index 3f782b978e0..bc9fcd035ac 100644
    --- a/web/ui/module/codemirror-promql/src/parser/parser.ts
    +++ b/web/ui/module/codemirror-promql/src/parser/parser.ts
    @@ -47,7 +47,7 @@ import {
       UnaryExpr,
       Unless,
       VectorSelector,
    -} from 'lezer-promql';
    +} from '@prometheus-io/lezer-promql';
     import { containsAtLeastOneChild, retrieveAllRecursiveNodes, walkThrough } from './path-finder';
     import { getType } from './type';
     import { buildLabelMatchers } from './matcher';
    diff --git a/web/ui/module/codemirror-promql/src/parser/path-finder.test.ts b/web/ui/module/codemirror-promql/src/parser/path-finder.test.ts
    index 39764efd03f..514dddf107c 100644
    --- a/web/ui/module/codemirror-promql/src/parser/path-finder.test.ts
    +++ b/web/ui/module/codemirror-promql/src/parser/path-finder.test.ts
    @@ -31,7 +31,7 @@ import {
       NumberLiteral,
       Sub,
       VectorSelector,
    -} from 'lezer-promql';
    +} from '@prometheus-io/lezer-promql';
     import { createEditorState } from '../test/utils-test';
     import { containsAtLeastOneChild, containsChild, retrieveAllRecursiveNodes, walkBackward, walkThrough } from './path-finder';
     import { SyntaxNode } from '@lezer/common';
    diff --git a/web/ui/module/codemirror-promql/src/parser/type.ts b/web/ui/module/codemirror-promql/src/parser/type.ts
    index 989756b17a6..9bcb74843b9 100644
    --- a/web/ui/module/codemirror-promql/src/parser/type.ts
    +++ b/web/ui/module/codemirror-promql/src/parser/type.ts
    @@ -26,7 +26,7 @@ import {
       SubqueryExpr,
       UnaryExpr,
       VectorSelector,
    -} from 'lezer-promql';
    +} from '@prometheus-io/lezer-promql';
     import { walkThrough } from './path-finder';
     import { getFunction, ValueType } from '../types';
     
    diff --git a/web/ui/module/codemirror-promql/src/parser/vector.test.ts b/web/ui/module/codemirror-promql/src/parser/vector.test.ts
    index 43e7deeaa1d..c4f2a8f03ab 100644
    --- a/web/ui/module/codemirror-promql/src/parser/vector.test.ts
    +++ b/web/ui/module/codemirror-promql/src/parser/vector.test.ts
    @@ -14,7 +14,7 @@
     import { buildVectorMatching } from './vector';
     import { createEditorState } from '../test/utils-test';
     import { walkThrough } from './path-finder';
    -import { BinaryExpr, Expr } from 'lezer-promql';
    +import { BinaryExpr, Expr } from '@prometheus-io/lezer-promql';
     import { syntaxTree } from '@codemirror/language';
     import { VectorMatchCardinality } from '../types';
     
    diff --git a/web/ui/module/codemirror-promql/src/parser/vector.ts b/web/ui/module/codemirror-promql/src/parser/vector.ts
    index 58d1edd44d7..c1a59dfb4b4 100644
    --- a/web/ui/module/codemirror-promql/src/parser/vector.ts
    +++ b/web/ui/module/codemirror-promql/src/parser/vector.ts
    @@ -26,7 +26,7 @@ import {
       OnOrIgnoring,
       Or,
       Unless,
    -} from 'lezer-promql';
    +} from '@prometheus-io/lezer-promql';
     import { VectorMatchCardinality, VectorMatching } from '../types';
     import { containsAtLeastOneChild, retrieveAllRecursiveNodes } from './path-finder';
     
    diff --git a/web/ui/module/codemirror-promql/src/promql.ts b/web/ui/module/codemirror-promql/src/promql.ts
    index e20a15c97f5..86fb413ad44 100644
    --- a/web/ui/module/codemirror-promql/src/promql.ts
    +++ b/web/ui/module/codemirror-promql/src/promql.ts
    @@ -11,7 +11,7 @@
     // See the License for the specific language governing permissions and
     // limitations under the License.
     
    -import { parser } from 'lezer-promql';
    +import { parser } from '@prometheus-io/lezer-promql';
     import { styleTags, tags } from '@codemirror/highlight';
     import { Extension } from '@codemirror/state';
     import { CompleteConfiguration, CompleteStrategy, newCompleteStrategy } from './complete';
    diff --git a/web/ui/module/codemirror-promql/src/test/utils-test.ts b/web/ui/module/codemirror-promql/src/test/utils-test.ts
    index 5e1e7fa8f54..094b6a56960 100644
    --- a/web/ui/module/codemirror-promql/src/test/utils-test.ts
    +++ b/web/ui/module/codemirror-promql/src/test/utils-test.ts
    @@ -11,7 +11,7 @@
     // See the License for the specific language governing permissions and
     // limitations under the License.
     
    -import { parser } from 'lezer-promql';
    +import { parser } from '@prometheus-io/lezer-promql';
     import { EditorState } from '@codemirror/state';
     import { LRLanguage } from '@codemirror/language';
     import nock from 'nock';
    diff --git a/web/ui/module/codemirror-promql/src/types/function.ts b/web/ui/module/codemirror-promql/src/types/function.ts
    index 9f99d359d04..a8d1329a911 100644
    --- a/web/ui/module/codemirror-promql/src/types/function.ts
    +++ b/web/ui/module/codemirror-promql/src/types/function.ts
    @@ -79,7 +79,7 @@ import {
       Timestamp,
       Vector,
       Year,
    -} from 'lezer-promql';
    +} from '@prometheus-io/lezer-promql';
     
     export enum ValueType {
       none = 'none',
    diff --git a/web/ui/module/codemirror-promql/src/types/matcher.ts b/web/ui/module/codemirror-promql/src/types/matcher.ts
    index be3c06eaf5b..a830aca6934 100644
    --- a/web/ui/module/codemirror-promql/src/types/matcher.ts
    +++ b/web/ui/module/codemirror-promql/src/types/matcher.ts
    @@ -11,7 +11,7 @@
     // See the License for the specific language governing permissions and
     // limitations under the License.
     
    -import { EqlSingle, Neq } from 'lezer-promql';
    +import { EqlSingle, Neq } from '@prometheus-io/lezer-promql';
     
     export class Matcher {
       type: number;
    diff --git a/web/ui/module/lezer-promql/package.json b/web/ui/module/lezer-promql/package.json
    index 42b3b28a12a..91c10fa7a19 100644
    --- a/web/ui/module/lezer-promql/package.json
    +++ b/web/ui/module/lezer-promql/package.json
    @@ -1,5 +1,5 @@
     {
    -  "name": "lezer-promql",
    +  "name": "@prometheus-io/lezer-promql",
       "version": "0.23.0",
       "description": "lezer-based PromQL grammar",
       "main": "index.cjs",
    diff --git a/web/ui/package-lock.json b/web/ui/package-lock.json
    index a7d6d74e396..35fbcb58715 100644
    --- a/web/ui/package-lock.json
    +++ b/web/ui/package-lock.json
    @@ -1,10 +1,10 @@
     {
    -  "name": "prometheus",
    +  "name": "prometheus-io",
       "lockfileVersion": 2,
       "requires": true,
       "packages": {
         "": {
    -      "name": "prometheus",
    +      "name": "prometheus-io",
           "workspaces": [
             "react-app",
             "module/*"
    @@ -27,10 +27,11 @@
           }
         },
         "module/codemirror-promql": {
    +      "name": "@prometheus-io/codemirror-promql",
           "version": "0.19.0",
           "license": "Apache-2.0",
           "dependencies": {
    -        "lezer-promql": "0.23.0",
    +        "@prometheus-io/lezer-promql": "0.23.0",
             "lru-cache": "^6.0.0"
           },
           "devDependencies": {
    @@ -60,6 +61,7 @@
           }
         },
         "module/lezer-promql": {
    +      "name": "@prometheus-io/lezer-promql",
           "version": "0.23.0",
           "license": "Apache-2.0",
           "devDependencies": {
    @@ -3140,6 +3142,18 @@
             "node": ">= 8"
           }
         },
    +    "node_modules/@prometheus-io/app": {
    +      "resolved": "react-app",
    +      "link": true
    +    },
    +    "node_modules/@prometheus-io/codemirror-promql": {
    +      "resolved": "module/codemirror-promql",
    +      "link": true
    +    },
    +    "node_modules/@prometheus-io/lezer-promql": {
    +      "resolved": "module/lezer-promql",
    +      "link": true
    +    },
         "node_modules/@rollup/plugin-babel": {
           "version": "5.3.1",
           "resolved": "https://registry.npmjs.org/@rollup/plugin-babel/-/plugin-babel-5.3.1.tgz",
    @@ -5858,10 +5872,6 @@
             "node": ">=4"
           }
         },
    -    "node_modules/codemirror-promql": {
    -      "resolved": "module/codemirror-promql",
    -      "link": true
    -    },
         "node_modules/collect-v8-coverage": {
           "version": "1.0.1",
           "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz",
    @@ -8775,10 +8785,6 @@
           "integrity": "sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ==",
           "dev": true
         },
    -    "node_modules/graph": {
    -      "resolved": "react-app",
    -      "link": true
    -    },
         "node_modules/gud": {
           "version": "1.0.0",
           "resolved": "https://registry.npmjs.org/gud/-/gud-1.0.0.tgz",
    @@ -10782,10 +10788,6 @@
             "node": ">= 0.8.0"
           }
         },
    -    "node_modules/lezer-promql": {
    -      "resolved": "module/lezer-promql",
    -      "link": true
    -    },
         "node_modules/lilconfig": {
           "version": "2.0.4",
           "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.4.tgz",
    @@ -17312,7 +17314,7 @@
           }
         },
         "react-app": {
    -      "name": "graph",
    +      "name": "@prometheus-io/app",
           "version": "0.1.0",
           "dependencies": {
             "@codemirror/autocomplete": "^0.19.9",
    @@ -17333,8 +17335,8 @@
             "@fortawesome/react-fontawesome": "0.1.17",
             "@nexucis/fuzzy": "^0.4.0",
             "@nexucis/kvsearch": "^0.7.0",
    +        "@prometheus-io/codemirror-promql": "0.19.0",
             "bootstrap": "^4.6.1",
    -        "codemirror-promql": "0.19.0",
             "css.escape": "^1.5.1",
             "downshift": "^6.1.7",
             "http-proxy-middleware": "^2.0.6",
    @@ -19602,6 +19604,93 @@
             }
           }
         },
    +    "@prometheus-io/app": {
    +      "version": "file:react-app",
    +      "requires": {
    +        "@codemirror/autocomplete": "^0.19.9",
    +        "@codemirror/closebrackets": "^0.19.0",
    +        "@codemirror/commands": "^0.19.5",
    +        "@codemirror/comment": "^0.19.0",
    +        "@codemirror/highlight": "^0.19.6",
    +        "@codemirror/history": "^0.19.2",
    +        "@codemirror/language": "^0.19.7",
    +        "@codemirror/lint": "^0.19.3",
    +        "@codemirror/matchbrackets": "^0.19.3",
    +        "@codemirror/search": "^0.19.3",
    +        "@codemirror/state": "^0.19.6",
    +        "@codemirror/view": "^0.19.27",
    +        "@forevolve/bootstrap-dark": "^1.0.0",
    +        "@fortawesome/fontawesome-svg-core": "6.1.1",
    +        "@fortawesome/free-solid-svg-icons": "6.1.1",
    +        "@fortawesome/react-fontawesome": "0.1.17",
    +        "@nexucis/fuzzy": "^0.4.0",
    +        "@nexucis/kvsearch": "^0.7.0",
    +        "@prometheus-io/codemirror-promql": "0.19.0",
    +        "@testing-library/react-hooks": "^7.0.1",
    +        "@types/enzyme": "^3.10.10",
    +        "@types/flot": "0.0.32",
    +        "@types/jquery": "^3.5.9",
    +        "@types/react": "^17.0.39",
    +        "@types/react-copy-to-clipboard": "^5.0.2",
    +        "@types/react-dom": "^17.0.11",
    +        "@types/react-resize-detector": "^6.1.0",
    +        "@types/react-router-dom": "^5.3.2",
    +        "@types/sanitize-html": "^2.6.1",
    +        "@types/sinon": "^10.0.6",
    +        "@wojtekmaj/enzyme-adapter-react-17": "^0.6.6",
    +        "bootstrap": "^4.6.1",
    +        "css.escape": "^1.5.1",
    +        "downshift": "^6.1.7",
    +        "enzyme": "^3.11.0",
    +        "enzyme-to-json": "^3.6.2",
    +        "fsevents": "^2.3.2",
    +        "http-proxy-middleware": "^2.0.6",
    +        "jquery": "^3.5.1",
    +        "jquery.flot.tooltip": "^0.9.0",
    +        "moment": "^2.29.2",
    +        "moment-timezone": "^0.5.34",
    +        "mutationobserver-shim": "^0.3.7",
    +        "popper.js": "^1.14.3",
    +        "react": "^17.0.2",
    +        "react-copy-to-clipboard": "^5.0.4",
    +        "react-dom": "^17.0.2",
    +        "react-infinite-scroll-component": "^6.1.0",
    +        "react-resize-detector": "^6.7.6",
    +        "react-router-dom": "^5.2.1",
    +        "react-test-renderer": "^17.0.2",
    +        "reactstrap": "^8.9.0",
    +        "sanitize-html": "^2.6.0",
    +        "sass": "1.49.11",
    +        "sinon": "^13.0.1",
    +        "tempusdominus-bootstrap-4": "^5.1.2",
    +        "tempusdominus-core": "^5.0.3"
    +      }
    +    },
    +    "@prometheus-io/codemirror-promql": {
    +      "version": "file:module/codemirror-promql",
    +      "requires": {
    +        "@codemirror/autocomplete": "^0.19.15",
    +        "@codemirror/highlight": "^0.19.8",
    +        "@codemirror/language": "^0.19.10",
    +        "@codemirror/lint": "^0.19.6",
    +        "@codemirror/state": "^0.19.9",
    +        "@codemirror/view": "^0.19.48",
    +        "@lezer/common": "^0.15.12",
    +        "@lezer/lr": "^0.15.8",
    +        "@prometheus-io/lezer-promql": "0.23.0",
    +        "@types/lru-cache": "^5.1.1",
    +        "isomorphic-fetch": "^3.0.0",
    +        "lru-cache": "^6.0.0",
    +        "nock": "^13.2.4"
    +      }
    +    },
    +    "@prometheus-io/lezer-promql": {
    +      "version": "file:module/lezer-promql",
    +      "requires": {
    +        "@lezer/generator": "^0.15.4",
    +        "@lezer/lr": "^0.15.8"
    +      }
    +    },
         "@rollup/plugin-babel": {
           "version": "5.3.1",
           "resolved": "https://registry.npmjs.org/@rollup/plugin-babel/-/plugin-babel-5.3.1.tgz",
    @@ -21720,24 +21809,6 @@
             }
           }
         },
    -    "codemirror-promql": {
    -      "version": "file:module/codemirror-promql",
    -      "requires": {
    -        "@codemirror/autocomplete": "^0.19.15",
    -        "@codemirror/highlight": "^0.19.8",
    -        "@codemirror/language": "^0.19.10",
    -        "@codemirror/lint": "^0.19.6",
    -        "@codemirror/state": "^0.19.9",
    -        "@codemirror/view": "^0.19.48",
    -        "@lezer/common": "^0.15.12",
    -        "@lezer/lr": "^0.15.8",
    -        "@types/lru-cache": "^5.1.1",
    -        "isomorphic-fetch": "^3.0.0",
    -        "lezer-promql": "0.23.0",
    -        "lru-cache": "^6.0.0",
    -        "nock": "^13.2.4"
    -      }
    -    },
         "collect-v8-coverage": {
           "version": "1.0.1",
           "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz",
    @@ -23932,68 +24003,6 @@
           "integrity": "sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ==",
           "dev": true
         },
    -    "graph": {
    -      "version": "file:react-app",
    -      "requires": {
    -        "@codemirror/autocomplete": "^0.19.9",
    -        "@codemirror/closebrackets": "^0.19.0",
    -        "@codemirror/commands": "^0.19.5",
    -        "@codemirror/comment": "^0.19.0",
    -        "@codemirror/highlight": "^0.19.6",
    -        "@codemirror/history": "^0.19.2",
    -        "@codemirror/language": "^0.19.7",
    -        "@codemirror/lint": "^0.19.3",
    -        "@codemirror/matchbrackets": "^0.19.3",
    -        "@codemirror/search": "^0.19.3",
    -        "@codemirror/state": "^0.19.6",
    -        "@codemirror/view": "^0.19.27",
    -        "@forevolve/bootstrap-dark": "^1.0.0",
    -        "@fortawesome/fontawesome-svg-core": "6.1.1",
    -        "@fortawesome/free-solid-svg-icons": "6.1.1",
    -        "@fortawesome/react-fontawesome": "0.1.17",
    -        "@nexucis/fuzzy": "^0.4.0",
    -        "@nexucis/kvsearch": "^0.7.0",
    -        "@testing-library/react-hooks": "^7.0.1",
    -        "@types/enzyme": "^3.10.10",
    -        "@types/flot": "0.0.32",
    -        "@types/jquery": "^3.5.9",
    -        "@types/react": "^17.0.39",
    -        "@types/react-copy-to-clipboard": "^5.0.2",
    -        "@types/react-dom": "^17.0.11",
    -        "@types/react-resize-detector": "^6.1.0",
    -        "@types/react-router-dom": "^5.3.2",
    -        "@types/sanitize-html": "^2.6.1",
    -        "@types/sinon": "^10.0.6",
    -        "@wojtekmaj/enzyme-adapter-react-17": "^0.6.6",
    -        "bootstrap": "^4.6.1",
    -        "codemirror-promql": "0.19.0",
    -        "css.escape": "^1.5.1",
    -        "downshift": "^6.1.7",
    -        "enzyme": "^3.11.0",
    -        "enzyme-to-json": "^3.6.2",
    -        "fsevents": "^2.3.2",
    -        "http-proxy-middleware": "^2.0.6",
    -        "jquery": "^3.5.1",
    -        "jquery.flot.tooltip": "^0.9.0",
    -        "moment": "^2.29.2",
    -        "moment-timezone": "^0.5.34",
    -        "mutationobserver-shim": "^0.3.7",
    -        "popper.js": "^1.14.3",
    -        "react": "^17.0.2",
    -        "react-copy-to-clipboard": "^5.0.4",
    -        "react-dom": "^17.0.2",
    -        "react-infinite-scroll-component": "^6.1.0",
    -        "react-resize-detector": "^6.7.6",
    -        "react-router-dom": "^5.2.1",
    -        "react-test-renderer": "^17.0.2",
    -        "reactstrap": "^8.9.0",
    -        "sanitize-html": "^2.6.0",
    -        "sass": "1.49.11",
    -        "sinon": "^13.0.1",
    -        "tempusdominus-bootstrap-4": "^5.1.2",
    -        "tempusdominus-core": "^5.0.3"
    -      }
    -    },
         "gud": {
           "version": "1.0.0",
           "resolved": "https://registry.npmjs.org/gud/-/gud-1.0.0.tgz",
    @@ -25504,13 +25513,6 @@
             "type-check": "~0.4.0"
           }
         },
    -    "lezer-promql": {
    -      "version": "file:module/lezer-promql",
    -      "requires": {
    -        "@lezer/generator": "^0.15.4",
    -        "@lezer/lr": "^0.15.8"
    -      }
    -    },
         "lilconfig": {
           "version": "2.0.4",
           "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.4.tgz",
    diff --git a/web/ui/package.json b/web/ui/package.json
    index 4273108b4db..d5437a0f99f 100644
    --- a/web/ui/package.json
    +++ b/web/ui/package.json
    @@ -1,5 +1,5 @@
     {
    -  "name": "prometheus",
    +  "name": "prometheus-io",
       "private": true,
       "scripts": {
         "build": "bash build_ui.sh --all",
    diff --git a/web/ui/react-app/package.json b/web/ui/react-app/package.json
    index ee2dc8ed772..aaf8166e52b 100644
    --- a/web/ui/react-app/package.json
    +++ b/web/ui/react-app/package.json
    @@ -1,5 +1,5 @@
     {
    -  "name": "graph",
    +  "name": "@prometheus-io/app",
       "version": "0.1.0",
       "private": true,
       "dependencies": {
    @@ -21,8 +21,8 @@
         "@fortawesome/react-fontawesome": "0.1.17",
         "@nexucis/fuzzy": "^0.4.0",
         "@nexucis/kvsearch": "^0.7.0",
    +    "@prometheus-io/codemirror-promql": "0.19.0",
         "bootstrap": "^4.6.1",
    -    "codemirror-promql": "0.19.0",
         "css.escape": "^1.5.1",
         "downshift": "^6.1.7",
         "http-proxy-middleware": "^2.0.6",
    @@ -89,11 +89,11 @@
           "enzyme-to-json/serializer"
         ],
         "transformIgnorePatterns": [
    -      "/../node_modules/(?!codemirror-promql)/",
    -      "/../node_modules/(?!lezer-promql)/"
    +      "/../node_modules/(?!@prometheus-io/codemirror-promql)/",
    +      "/../node_modules/(?!@prometheus-io/lezer-promql)/"
         ],
         "moduleNameMapper": {
    -      "lezer-promql": "/../node_modules/lezer-promql/dist/index.cjs"
    +      "lezer-promql": "/../node_modules/@prometheus-io/lezer-promql/dist/index.cjs"
         }
       },
       "optionalDependencies": {
    diff --git a/web/ui/react-app/src/pages/graph/ExpressionInput.tsx b/web/ui/react-app/src/pages/graph/ExpressionInput.tsx
    index a4448b4e894..05f4c7ba6e9 100644
    --- a/web/ui/react-app/src/pages/graph/ExpressionInput.tsx
    +++ b/web/ui/react-app/src/pages/graph/ExpressionInput.tsx
    @@ -19,8 +19,8 @@ import { faSearch, faSpinner, faGlobeEurope } from '@fortawesome/free-solid-svg-
     import MetricsExplorer from './MetricsExplorer';
     import { usePathPrefix } from '../../contexts/PathPrefixContext';
     import { useTheme } from '../../contexts/ThemeContext';
    -import { CompleteStrategy, PromQLExtension } from 'codemirror-promql';
    -import { newCompleteStrategy } from 'codemirror-promql/dist/esm/complete';
    +import { CompleteStrategy, PromQLExtension } from '@prometheus-io/codemirror-promql';
    +import { newCompleteStrategy } from '@prometheus-io/codemirror-promql/dist/esm/complete';
     
     const promqlExtension = new PromQLExtension();
     
    
    From 3dad28fcbdbd6d9be76630cc432143e81cfb06f2 Mon Sep 17 00:00:00 2001
    From: Augustin Husson 
    Date: Mon, 13 Jun 2022 16:40:08 +0200
    Subject: [PATCH 132/135] UI: fix build (#10862)
    
    Signed-off-by: Augustin Husson 
    ---
     web/ui/build_ui.sh | 4 ++--
     1 file changed, 2 insertions(+), 2 deletions(-)
    
    diff --git a/web/ui/build_ui.sh b/web/ui/build_ui.sh
    index b59d81de41d..8761bfa1e3d 100644
    --- a/web/ui/build_ui.sh
    +++ b/web/ui/build_ui.sh
    @@ -25,13 +25,13 @@ buildOrder=(lezer-promql codemirror-promql)
     function buildModule() {
       for module in "${buildOrder[@]}"; do
         echo "build ${module}"
    -    npm run build -w "${module}"
    +    npm run build -w "@prometheus-io/${module}"
       done
     }
     
     function buildReactApp() {
       echo "build react-app"
    -  npm run build -w react-app
    +  npm run build -w @prometheus-io/app
       rm -rf ./static/react
       mv ./react-app/build ./static/react
     }
    
    From 5bd761fbfce6bf2ebc660b705f9a55477057b0c5 Mon Sep 17 00:00:00 2001
    From: =?UTF-8?q?Peter=20=C5=A0tibran=C3=BD?= 
    Date: Mon, 13 Jun 2022 17:45:35 +0200
    Subject: [PATCH 133/135] Merge pull request #10857 from
     pstibrany/fix-errors-handling
    
    API: Fix errors handling
    ---
     web/api/v1/api.go         |   7 +-
     web/api/v1/api_test.go    |  12 +-
     web/api/v1/errors_test.go | 236 ++++++++++++++++++++++++++++++++++++++
     3 files changed, 248 insertions(+), 7 deletions(-)
     create mode 100644 web/api/v1/errors_test.go
    
    diff --git a/web/api/v1/api.go b/web/api/v1/api.go
    index 88bedd46a51..0ad24abdbfb 100644
    --- a/web/api/v1/api.go
    +++ b/web/api/v1/api.go
    @@ -553,7 +553,12 @@ func returnAPIError(err error) *apiError {
     		return nil
     	}
     
    -	switch errors.Cause(err).(type) {
    +	cause := errors.Unwrap(err)
    +	if cause == nil {
    +		cause = err
    +	}
    +
    +	switch cause.(type) {
     	case promql.ErrQueryCanceled:
     		return &apiError{errorCanceled, err}
     	case promql.ErrQueryTimeout:
    diff --git a/web/api/v1/api_test.go b/web/api/v1/api_test.go
    index 1c999ba33c3..8df755a1ffd 100644
    --- a/web/api/v1/api_test.go
    +++ b/web/api/v1/api_test.go
    @@ -2948,19 +2948,19 @@ func TestReturnAPIError(t *testing.T) {
     			err:      promql.ErrStorage{Err: errors.New("storage error")},
     			expected: errorInternal,
     		}, {
    -			err:      errors.Wrap(promql.ErrStorage{Err: errors.New("storage error")}, "wrapped"),
    +			err:      fmt.Errorf("wrapped: %w", promql.ErrStorage{Err: errors.New("storage error")}),
     			expected: errorInternal,
     		}, {
     			err:      promql.ErrQueryTimeout("timeout error"),
     			expected: errorTimeout,
     		}, {
    -			err:      errors.Wrap(promql.ErrQueryTimeout("timeout error"), "wrapped"),
    +			err:      fmt.Errorf("wrapped: %w", promql.ErrQueryTimeout("timeout error")),
     			expected: errorTimeout,
     		}, {
     			err:      promql.ErrQueryCanceled("canceled error"),
     			expected: errorCanceled,
     		}, {
    -			err:      errors.Wrap(promql.ErrQueryCanceled("canceled error"), "wrapped"),
    +			err:      fmt.Errorf("wrapped: %w", promql.ErrQueryCanceled("canceled error")),
     			expected: errorCanceled,
     		}, {
     			err:      errors.New("exec error"),
    @@ -2968,10 +2968,10 @@ func TestReturnAPIError(t *testing.T) {
     		},
     	}
     
    -	for _, c := range cases {
    +	for ix, c := range cases {
     		actual := returnAPIError(c.err)
    -		require.Error(t, actual)
    -		require.Equal(t, c.expected, actual.typ)
    +		require.Error(t, actual, ix)
    +		require.Equal(t, c.expected, actual.typ, ix)
     	}
     }
     
    diff --git a/web/api/v1/errors_test.go b/web/api/v1/errors_test.go
    new file mode 100644
    index 00000000000..3c40c803aff
    --- /dev/null
    +++ b/web/api/v1/errors_test.go
    @@ -0,0 +1,236 @@
    +// Copyright 2022 The Prometheus Authors
    +// 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.
    +
    +package v1
    +
    +import (
    +	"context"
    +	"fmt"
    +	"net/http"
    +	"net/http/httptest"
    +	"net/url"
    +	"testing"
    +	"time"
    +
    +	"github.com/go-kit/log"
    +	"github.com/grafana/regexp"
    +	"github.com/pkg/errors"
    +	"github.com/prometheus/client_golang/prometheus"
    +	"github.com/prometheus/common/route"
    +	"github.com/stretchr/testify/require"
    +
    +	"github.com/prometheus/prometheus/config"
    +	"github.com/prometheus/prometheus/model/labels"
    +	"github.com/prometheus/prometheus/promql"
    +	"github.com/prometheus/prometheus/rules"
    +	"github.com/prometheus/prometheus/scrape"
    +	"github.com/prometheus/prometheus/storage"
    +)
    +
    +func TestApiStatusCodes(t *testing.T) {
    +	for name, tc := range map[string]struct {
    +		err            error
    +		expectedString string
    +		expectedCode   int
    +	}{
    +		"random error": {
    +			err:            errors.New("some random error"),
    +			expectedString: "some random error",
    +			expectedCode:   http.StatusUnprocessableEntity,
    +		},
    +
    +		"promql.ErrTooManySamples": {
    +			err:            promql.ErrTooManySamples("some error"),
    +			expectedString: "too many samples",
    +			expectedCode:   http.StatusUnprocessableEntity,
    +		},
    +
    +		"promql.ErrQueryCanceled": {
    +			err:            promql.ErrQueryCanceled("some error"),
    +			expectedString: "query was canceled",
    +			expectedCode:   http.StatusServiceUnavailable,
    +		},
    +
    +		"promql.ErrQueryTimeout": {
    +			err:            promql.ErrQueryTimeout("some error"),
    +			expectedString: "query timed out",
    +			expectedCode:   http.StatusServiceUnavailable,
    +		},
    +
    +		"context.DeadlineExceeded": {
    +			err:            context.DeadlineExceeded,
    +			expectedString: "context deadline exceeded",
    +			expectedCode:   http.StatusUnprocessableEntity,
    +		},
    +
    +		"context.Canceled": {
    +			err:            context.Canceled,
    +			expectedString: "context canceled",
    +			expectedCode:   http.StatusUnprocessableEntity,
    +		},
    +	} {
    +		for k, q := range map[string]storage.SampleAndChunkQueryable{
    +			"error from queryable": errorTestQueryable{err: tc.err},
    +			"error from querier":   errorTestQueryable{q: errorTestQuerier{err: tc.err}},
    +			"error from seriesset": errorTestQueryable{q: errorTestQuerier{s: errorTestSeriesSet{err: tc.err}}},
    +		} {
    +			t.Run(fmt.Sprintf("%s/%s", name, k), func(t *testing.T) {
    +				r := createPrometheusAPI(q)
    +				rec := httptest.NewRecorder()
    +
    +				req := httptest.NewRequest("GET", "/api/v1/query?query=up", nil)
    +
    +				r.ServeHTTP(rec, req)
    +
    +				require.Equal(t, tc.expectedCode, rec.Code)
    +				require.Contains(t, rec.Body.String(), tc.expectedString)
    +			})
    +		}
    +	}
    +}
    +
    +func createPrometheusAPI(q storage.SampleAndChunkQueryable) *route.Router {
    +	engine := promql.NewEngine(promql.EngineOpts{
    +		Logger:             log.NewNopLogger(),
    +		Reg:                nil,
    +		ActiveQueryTracker: nil,
    +		MaxSamples:         100,
    +		Timeout:            5 * time.Second,
    +	})
    +
    +	api := NewAPI(
    +		engine,
    +		q,
    +		nil,
    +		nil,
    +		func(context.Context) TargetRetriever { return &DummyTargetRetriever{} },
    +		func(context.Context) AlertmanagerRetriever { return &DummyAlertmanagerRetriever{} },
    +		func() config.Config { return config.Config{} },
    +		map[string]string{}, // TODO: include configuration flags
    +		GlobalURLOptions{},
    +		func(f http.HandlerFunc) http.HandlerFunc { return f },
    +		nil,   // Only needed for admin APIs.
    +		"",    // This is for snapshots, which is disabled when admin APIs are disabled. Hence empty.
    +		false, // Disable admin APIs.
    +		log.NewNopLogger(),
    +		func(context.Context) RulesRetriever { return &DummyRulesRetriever{} },
    +		0, 0, 0, // Remote read samples and concurrency limit.
    +		false, // Not an agent.
    +		regexp.MustCompile(".*"),
    +		func() (RuntimeInfo, error) { return RuntimeInfo{}, errors.New("not implemented") },
    +		&PrometheusVersion{},
    +		prometheus.DefaultGatherer,
    +		nil,
    +		nil,
    +	)
    +
    +	promRouter := route.New().WithPrefix("/api/v1")
    +	api.Register(promRouter)
    +
    +	return promRouter
    +}
    +
    +type errorTestQueryable struct {
    +	q   storage.Querier
    +	err error
    +}
    +
    +func (t errorTestQueryable) ChunkQuerier(ctx context.Context, mint, maxt int64) (storage.ChunkQuerier, error) {
    +	return nil, t.err
    +}
    +
    +func (t errorTestQueryable) Querier(ctx context.Context, mint, maxt int64) (storage.Querier, error) {
    +	if t.q != nil {
    +		return t.q, nil
    +	}
    +	return nil, t.err
    +}
    +
    +type errorTestQuerier struct {
    +	s   storage.SeriesSet
    +	err error
    +}
    +
    +func (t errorTestQuerier) LabelValues(name string, matchers ...*labels.Matcher) ([]string, storage.Warnings, error) {
    +	return nil, nil, t.err
    +}
    +
    +func (t errorTestQuerier) LabelNames(matchers ...*labels.Matcher) ([]string, storage.Warnings, error) {
    +	return nil, nil, t.err
    +}
    +
    +func (t errorTestQuerier) Close() error {
    +	return nil
    +}
    +
    +func (t errorTestQuerier) Select(sortSeries bool, hints *storage.SelectHints, matchers ...*labels.Matcher) storage.SeriesSet {
    +	if t.s != nil {
    +		return t.s
    +	}
    +	return storage.ErrSeriesSet(t.err)
    +}
    +
    +type errorTestSeriesSet struct {
    +	err error
    +}
    +
    +func (t errorTestSeriesSet) Next() bool {
    +	return false
    +}
    +
    +func (t errorTestSeriesSet) At() storage.Series {
    +	return nil
    +}
    +
    +func (t errorTestSeriesSet) Err() error {
    +	return t.err
    +}
    +
    +func (t errorTestSeriesSet) Warnings() storage.Warnings {
    +	return nil
    +}
    +
    +// DummyTargetRetriever implements github.com/prometheus/prometheus/web/api/v1.targetRetriever.
    +type DummyTargetRetriever struct{}
    +
    +// TargetsActive implements targetRetriever.
    +func (DummyTargetRetriever) TargetsActive() map[string][]*scrape.Target {
    +	return map[string][]*scrape.Target{}
    +}
    +
    +// TargetsDropped implements targetRetriever.
    +func (DummyTargetRetriever) TargetsDropped() map[string][]*scrape.Target {
    +	return map[string][]*scrape.Target{}
    +}
    +
    +// DummyAlertmanagerRetriever implements AlertmanagerRetriever.
    +type DummyAlertmanagerRetriever struct{}
    +
    +// Alertmanagers implements AlertmanagerRetriever.
    +func (DummyAlertmanagerRetriever) Alertmanagers() []*url.URL { return nil }
    +
    +// DroppedAlertmanagers implements AlertmanagerRetriever.
    +func (DummyAlertmanagerRetriever) DroppedAlertmanagers() []*url.URL { return nil }
    +
    +// DummyRulesRetriever implements RulesRetriever.
    +type DummyRulesRetriever struct{}
    +
    +// RuleGroups implements RulesRetriever.
    +func (DummyRulesRetriever) RuleGroups() []*rules.Group {
    +	return nil
    +}
    +
    +// AlertingRules implements RulesRetriever.
    +func (DummyRulesRetriever) AlertingRules() []*rules.AlertingRule {
    +	return nil
    +}
    
    From 5d1756c8228f457fb08b63e537ceadba2d0b96ec Mon Sep 17 00:00:00 2001
    From: Augustin Husson 
    Date: Mon, 13 Jun 2022 17:55:06 +0200
    Subject: [PATCH 134/135] Upgrade codemirror and lezer to the latest version
     (#10841)
    
    * bump codemirror to v0.20.x and lezer to v.0.16.x
    
    Signed-off-by: Augustin Husson 
    
    * bump codemirror to v6 and lezer to v1
    
    Signed-off-by: Augustin Husson 
    
    * stop treating warning as error for UI
    
    Signed-off-by: Augustin Husson 
    ---
     Makefile                                      |    2 +-
     .../module/codemirror-promql/jest.config.cjs  |    2 +-
     web/ui/module/codemirror-promql/package.json  |   29 +-
     .../src/complete/hybrid.test.ts               |   92 +-
     .../codemirror-promql/src/complete/hybrid.ts  |    2 +-
     .../codemirror-promql/src/parser/matcher.ts   |    2 +-
     .../src/parser/path-finder.ts                 |    8 +-
     web/ui/module/codemirror-promql/src/promql.ts |   21 -
     web/ui/module/lezer-promql/package.json       |    8 +-
     web/ui/module/lezer-promql/src/highlight.js   |   33 +
     web/ui/module/lezer-promql/src/promql.grammar |    2 +
     web/ui/package-lock.json                      | 9360 +++++++++--------
     web/ui/react-app/package.json                 |   22 +-
     web/ui/react-app/src/pages/graph/CMTheme.tsx  |    3 +-
     .../src/pages/graph/ExpressionInput.tsx       |   32 +-
     15 files changed, 4929 insertions(+), 4689 deletions(-)
     create mode 100644 web/ui/module/lezer-promql/src/highlight.js
    
    diff --git a/Makefile b/Makefile
    index 7e64708a208..71d3e949e5e 100644
    --- a/Makefile
    +++ b/Makefile
    @@ -45,7 +45,7 @@ ui-install:
     
     .PHONY: ui-build
     ui-build:
    -	cd $(UI_PATH) && npm run build
    +	cd $(UI_PATH) && CI="" npm run build
     
     .PHONY: ui-build-module
     ui-build-module:
    diff --git a/web/ui/module/codemirror-promql/jest.config.cjs b/web/ui/module/codemirror-promql/jest.config.cjs
    index 611315f791a..48acf25768e 100644
    --- a/web/ui/module/codemirror-promql/jest.config.cjs
    +++ b/web/ui/module/codemirror-promql/jest.config.cjs
    @@ -12,7 +12,7 @@ module.exports = {
             },
         },
         moduleNameMapper: {
    -        'lezer-promql': '/../../node_modules/@prometheus-io/lezer-promql/dist/index.es.js'
    +        'lezer-promql': '/../../node_modules/@prometheus-io/lezer-promql/dist/index.cjs'
         },
         transformIgnorePatterns: ["/../../node_modules/(?!@prometheus-io/lezer-promql)/"]
     };
    diff --git a/web/ui/module/codemirror-promql/package.json b/web/ui/module/codemirror-promql/package.json
    index 84cdc74dad1..e4a1cf8f748 100644
    --- a/web/ui/module/codemirror-promql/package.json
    +++ b/web/ui/module/codemirror-promql/package.json
    @@ -33,26 +33,25 @@
         "lru-cache": "^6.0.0"
       },
       "devDependencies": {
    -    "@codemirror/autocomplete": "^0.19.15",
    -    "@codemirror/highlight": "^0.19.8",
    -    "@codemirror/language": "^0.19.10",
    -    "@codemirror/lint": "^0.19.6",
    -    "@codemirror/state": "^0.19.9",
    -    "@codemirror/view": "^0.19.48",
    -    "@lezer/common": "^0.15.12",
    -    "@lezer/lr": "^0.15.8",
    +    "@codemirror/autocomplete": "^6.0.0",
    +    "@codemirror/language": "^6.0.0",
    +    "@codemirror/lint": "^6.0.0",
    +    "@codemirror/state": "^6.0.0",
    +    "@codemirror/view": "^6.0.0",
    +    "@lezer/common": "^1.0.0",
    +    "@lezer/lr": "^1.0.0",
    +    "@lezer/highlight": "^1.0.0",
         "@types/lru-cache": "^5.1.1",
         "isomorphic-fetch": "^3.0.0",
         "nock": "^13.2.4"
       },
       "peerDependencies": {
    -    "@codemirror/autocomplete": "^0.19.15",
    -    "@codemirror/highlight": "^0.19.8",
    -    "@codemirror/language": "^0.19.10",
    -    "@codemirror/lint": "^0.19.6",
    -    "@codemirror/state": "^0.19.9",
    -    "@codemirror/view": "^0.19.48",
    -    "@lezer/common": "^0.15.12"
    +    "@codemirror/autocomplete": "^6.0.0",
    +    "@codemirror/language": "^6.0.0",
    +    "@codemirror/lint": "^6.0.0",
    +    "@codemirror/state": "^6.0.0",
    +    "@codemirror/view": "^6.0.0",
    +    "@lezer/common": "^1.0.0"
       },
       "prettier": {
         "singleQuote": true,
    diff --git a/web/ui/module/codemirror-promql/src/complete/hybrid.test.ts b/web/ui/module/codemirror-promql/src/complete/hybrid.test.ts
    index 2f02c0a3d9d..a09a118a16e 100644
    --- a/web/ui/module/codemirror-promql/src/complete/hybrid.test.ts
    +++ b/web/ui/module/codemirror-promql/src/complete/hybrid.test.ts
    @@ -734,7 +734,7 @@ describe('autocomplete promQL test', () => {
             options: ([] as Completion[]).concat(functionIdentifierTerms, aggregateOpTerms, numberTerms, snippets),
             from: 0,
             to: 0,
    -        span: /^[a-zA-Z0-9_:]+$/,
    +        validFor: /^[a-zA-Z0-9_:]+$/,
           },
         },
         {
    @@ -745,7 +745,7 @@ describe('autocomplete promQL test', () => {
             options: ([] as Completion[]).concat(functionIdentifierTerms, aggregateOpTerms, numberTerms, snippets),
             from: 0,
             to: 3,
    -        span: /^[a-zA-Z0-9_:]+$/,
    +        validFor: /^[a-zA-Z0-9_:]+$/,
           },
         },
         {
    @@ -756,7 +756,7 @@ describe('autocomplete promQL test', () => {
             options: ([] as Completion[]).concat(functionIdentifierTerms, aggregateOpTerms, snippets),
             from: 4,
             to: 4,
    -        span: /^[a-zA-Z0-9_:]+$/,
    +        validFor: /^[a-zA-Z0-9_:]+$/,
           },
         },
         {
    @@ -767,7 +767,7 @@ describe('autocomplete promQL test', () => {
             options: ([] as Completion[]).concat(functionIdentifierTerms, aggregateOpTerms, snippets),
             from: 4,
             to: 6,
    -        span: /^[a-zA-Z0-9_:]+$/,
    +        validFor: /^[a-zA-Z0-9_:]+$/,
           },
         },
         {
    @@ -778,7 +778,7 @@ describe('autocomplete promQL test', () => {
             options: ([] as Completion[]).concat(functionIdentifierTerms, aggregateOpTerms, snippets),
             from: 9,
             to: 9,
    -        span: /^[a-zA-Z0-9_:]+$/,
    +        validFor: /^[a-zA-Z0-9_:]+$/,
           },
         },
         {
    @@ -789,7 +789,7 @@ describe('autocomplete promQL test', () => {
             options: ([] as Completion[]).concat(functionIdentifierTerms, aggregateOpTerms, snippets),
             from: 25,
             to: 33,
    -        span: /^[a-zA-Z0-9_:]+$/,
    +        validFor: /^[a-zA-Z0-9_:]+$/,
           },
         },
         {
    @@ -800,7 +800,7 @@ describe('autocomplete promQL test', () => {
             options: ([] as Completion[]).concat(functionIdentifierTerms, aggregateOpTerms, binOpModifierTerms, numberTerms, snippets),
             from: 14,
             to: 19,
    -        span: /^[a-zA-Z0-9_:]+$/,
    +        validFor: /^[a-zA-Z0-9_:]+$/,
           },
         },
         {
    @@ -811,7 +811,7 @@ describe('autocomplete promQL test', () => {
             options: ([] as Completion[]).concat(functionIdentifierTerms, aggregateOpTerms, binOpModifierTerms, numberTerms, snippets),
             from: 40,
             to: 41,
    -        span: /^[a-zA-Z0-9_:]+$/,
    +        validFor: /^[a-zA-Z0-9_:]+$/,
           },
         },
         {
    @@ -822,7 +822,7 @@ describe('autocomplete promQL test', () => {
             options: [],
             from: 8,
             to: 8,
    -        span: /^[a-zA-Z0-9_:]+$/,
    +        validFor: /^[a-zA-Z0-9_:]+$/,
           },
         },
         {
    @@ -833,7 +833,7 @@ describe('autocomplete promQL test', () => {
             options: [],
             from: 8,
             to: 11,
    -        span: /^[a-zA-Z0-9_:]+$/,
    +        validFor: /^[a-zA-Z0-9_:]+$/,
           },
         },
         {
    @@ -844,7 +844,7 @@ describe('autocomplete promQL test', () => {
             options: [],
             from: 18,
             to: 23,
    -        span: /^[a-zA-Z0-9_:]+$/,
    +        validFor: /^[a-zA-Z0-9_:]+$/,
           },
         },
         {
    @@ -855,7 +855,7 @@ describe('autocomplete promQL test', () => {
             options: [],
             from: 12,
             to: 12,
    -        span: /^[a-zA-Z0-9_:]+$/,
    +        validFor: /^[a-zA-Z0-9_:]+$/,
           },
         },
         {
    @@ -866,7 +866,7 @@ describe('autocomplete promQL test', () => {
             options: [],
             from: 1,
             to: 1,
    -        span: /^[a-zA-Z0-9_:]+$/,
    +        validFor: /^[a-zA-Z0-9_:]+$/,
           },
         },
         {
    @@ -877,7 +877,7 @@ describe('autocomplete promQL test', () => {
             options: [],
             from: 12,
             to: 15,
    -        span: /^[a-zA-Z0-9_:]+$/,
    +        validFor: /^[a-zA-Z0-9_:]+$/,
           },
         },
         {
    @@ -888,7 +888,7 @@ describe('autocomplete promQL test', () => {
             options: [],
             from: 1,
             to: 4,
    -        span: /^[a-zA-Z0-9_:]+$/,
    +        validFor: /^[a-zA-Z0-9_:]+$/,
           },
         },
         {
    @@ -899,7 +899,7 @@ describe('autocomplete promQL test', () => {
             options: [],
             from: 23,
             to: 23,
    -        span: /^[a-zA-Z0-9_:]+$/,
    +        validFor: /^[a-zA-Z0-9_:]+$/,
           },
         },
         {
    @@ -910,7 +910,7 @@ describe('autocomplete promQL test', () => {
             options: [],
             from: 12,
             to: 12,
    -        span: /^[a-zA-Z0-9_:]+$/,
    +        validFor: /^[a-zA-Z0-9_:]+$/,
           },
         },
         {
    @@ -921,7 +921,7 @@ describe('autocomplete promQL test', () => {
             options: ([] as Completion[]).concat(aggregateOpModifierTerms, binOpTerms),
             from: 6,
             to: 7,
    -        span: /^[a-zA-Z0-9_:]+$/,
    +        validFor: /^[a-zA-Z0-9_:]+$/,
           },
         },
         {
    @@ -932,7 +932,7 @@ describe('autocomplete promQL test', () => {
             options: ([] as Completion[]).concat(aggregateOpModifierTerms, binOpTerms),
             from: 19,
             to: 21,
    -        span: /^[a-zA-Z0-9_:]+$/,
    +        validFor: /^[a-zA-Z0-9_:]+$/,
           },
         },
         {
    @@ -943,7 +943,7 @@ describe('autocomplete promQL test', () => {
             options: ([] as Completion[]).concat(aggregateOpModifierTerms, binOpTerms, [{ label: 'offset' }]),
             from: 4,
             to: 5,
    -        span: /^[a-zA-Z0-9_:]+$/,
    +        validFor: /^[a-zA-Z0-9_:]+$/,
           },
         },
         {
    @@ -954,7 +954,7 @@ describe('autocomplete promQL test', () => {
             options: binOpTerms,
             from: 12,
             to: 13,
    -        span: /^[a-zA-Z0-9_:]+$/,
    +        validFor: /^[a-zA-Z0-9_:]+$/,
           },
         },
         {
    @@ -965,7 +965,7 @@ describe('autocomplete promQL test', () => {
             options: binOpTerms,
             from: 12,
             to: 13,
    -        span: /^[a-zA-Z0-9_:]+$/,
    +        validFor: /^[a-zA-Z0-9_:]+$/,
           },
         },
         {
    @@ -976,7 +976,7 @@ describe('autocomplete promQL test', () => {
             options: matchOpTerms,
             from: 11,
             to: 12,
    -        span: /^[a-zA-Z0-9_:]+$/,
    +        validFor: /^[a-zA-Z0-9_:]+$/,
           },
         },
         {
    @@ -987,7 +987,7 @@ describe('autocomplete promQL test', () => {
             options: matchOpTerms,
             from: 21,
             to: 22,
    -        span: /^[a-zA-Z0-9_:]+$/,
    +        validFor: /^[a-zA-Z0-9_:]+$/,
           },
         },
         {
    @@ -998,7 +998,7 @@ describe('autocomplete promQL test', () => {
             options: durationTerms,
             from: 28,
             to: 28,
    -        span: undefined,
    +        validFor: undefined,
           },
         },
         {
    @@ -1009,7 +1009,7 @@ describe('autocomplete promQL test', () => {
             options: durationTerms,
             from: 46,
             to: 46,
    -        span: undefined,
    +        validFor: undefined,
           },
         },
         {
    @@ -1020,7 +1020,7 @@ describe('autocomplete promQL test', () => {
             options: ([] as Completion[]).concat(binOpTerms, [{ label: 'offset' }]),
             from: 20,
             to: 23,
    -        span: /^[a-zA-Z0-9_:]+$/,
    +        validFor: /^[a-zA-Z0-9_:]+$/,
           },
         },
         {
    @@ -1031,7 +1031,7 @@ describe('autocomplete promQL test', () => {
             options: ([] as Completion[]).concat(binOpTerms, [{ label: 'offset' }]),
             from: 12,
             to: 16,
    -        span: /^[a-zA-Z0-9_:]+$/,
    +        validFor: /^[a-zA-Z0-9_:]+$/,
           },
         },
         {
    @@ -1042,7 +1042,7 @@ describe('autocomplete promQL test', () => {
             options: ([] as Completion[]).concat(binOpTerms, [{ label: 'offset' }]),
             from: 34,
             to: 37,
    -        span: /^[a-zA-Z0-9_:]+$/,
    +        validFor: /^[a-zA-Z0-9_:]+$/,
           },
         },
         {
    @@ -1053,7 +1053,7 @@ describe('autocomplete promQL test', () => {
             options: ([] as Completion[]).concat(binOpTerms, [{ label: 'offset' }]),
             from: 14,
             to: 16,
    -        span: /^[a-zA-Z0-9_:]+$/,
    +        validFor: /^[a-zA-Z0-9_:]+$/,
           },
         },
         {
    @@ -1064,7 +1064,7 @@ describe('autocomplete promQL test', () => {
             options: ([] as Completion[]).concat(binOpTerms, [{ label: 'offset' }]),
             from: 38,
             to: 41,
    -        span: /^[a-zA-Z0-9_:]+$/,
    +        validFor: /^[a-zA-Z0-9_:]+$/,
           },
         },
         {
    @@ -1075,7 +1075,7 @@ describe('autocomplete promQL test', () => {
             options: [],
             from: 0,
             to: 3,
    -        span: /^[a-zA-Z0-9_:]+$/,
    +        validFor: /^[a-zA-Z0-9_:]+$/,
           },
         },
         {
    @@ -1086,7 +1086,7 @@ describe('autocomplete promQL test', () => {
             options: [],
             from: 0,
             to: 12,
    -        span: /^[a-zA-Z0-9_:]+$/,
    +        validFor: /^[a-zA-Z0-9_:]+$/,
           },
         },
         {
    @@ -1097,7 +1097,7 @@ describe('autocomplete promQL test', () => {
             options: durationTerms,
             from: 4,
             to: 4,
    -        span: undefined,
    +        validFor: undefined,
           },
         },
         {
    @@ -1108,7 +1108,7 @@ describe('autocomplete promQL test', () => {
             options: durationTerms,
             from: 6,
             to: 6,
    -        span: undefined,
    +        validFor: undefined,
           },
         },
         {
    @@ -1119,7 +1119,7 @@ describe('autocomplete promQL test', () => {
             options: durationTerms,
             from: 26,
             to: 26,
    -        span: undefined,
    +        validFor: undefined,
           },
         },
         {
    @@ -1130,7 +1130,7 @@ describe('autocomplete promQL test', () => {
             options: durationTerms,
             from: 28,
             to: 28,
    -        span: undefined,
    +        validFor: undefined,
           },
         },
         {
    @@ -1141,7 +1141,7 @@ describe('autocomplete promQL test', () => {
             options: durationTerms,
             from: 7,
             to: 7,
    -        span: undefined,
    +        validFor: undefined,
           },
         },
         {
    @@ -1152,7 +1152,7 @@ describe('autocomplete promQL test', () => {
             options: durationTerms,
             from: 9,
             to: 9,
    -        span: undefined,
    +        validFor: undefined,
           },
         },
         {
    @@ -1163,7 +1163,7 @@ describe('autocomplete promQL test', () => {
             options: durationTerms,
             from: 29,
             to: 29,
    -        span: undefined,
    +        validFor: undefined,
           },
         },
         {
    @@ -1174,7 +1174,7 @@ describe('autocomplete promQL test', () => {
             options: durationTerms,
             from: 31,
             to: 31,
    -        span: undefined,
    +        validFor: undefined,
           },
         },
         {
    @@ -1185,7 +1185,7 @@ describe('autocomplete promQL test', () => {
             options: atModifierTerms,
             from: 4,
             to: 5,
    -        span: /^[a-zA-Z0-9_:]+$/,
    +        validFor: /^[a-zA-Z0-9_:]+$/,
           },
         },
         {
    @@ -1197,7 +1197,7 @@ describe('autocomplete promQL test', () => {
             options: ([] as Completion[]).concat(mockedMetricsTerms, functionIdentifierTerms, aggregateOpTerms, numberTerms, snippets),
             from: 0,
             to: 5,
    -        span: /^[a-zA-Z0-9_:]+$/,
    +        validFor: /^[a-zA-Z0-9_:]+$/,
           },
         },
         {
    @@ -1226,7 +1226,7 @@ describe('autocomplete promQL test', () => {
             ],
             from: 20,
             to: 20,
    -        span: /^[a-zA-Z0-9_:]+$/,
    +        validFor: /^[a-zA-Z0-9_:]+$/,
           },
         },
         {
    @@ -1243,7 +1243,7 @@ describe('autocomplete promQL test', () => {
             ],
             from: 25,
             to: 25,
    -        span: /^[a-zA-Z0-9_:]+$/,
    +        validFor: /^[a-zA-Z0-9_:]+$/,
           },
         },
         {
    @@ -1274,7 +1274,7 @@ describe('autocomplete promQL test', () => {
             ),
             from: 0,
             to: 3,
    -        span: /^[a-zA-Z0-9_:]+$/,
    +        validFor: /^[a-zA-Z0-9_:]+$/,
           },
         },
       ];
    diff --git a/web/ui/module/codemirror-promql/src/complete/hybrid.ts b/web/ui/module/codemirror-promql/src/complete/hybrid.ts
    index fbcac0c9b06..e7286fca4b4 100644
    --- a/web/ui/module/codemirror-promql/src/complete/hybrid.ts
    +++ b/web/ui/module/codemirror-promql/src/complete/hybrid.ts
    @@ -140,7 +140,7 @@ function arrayToCompletionResult(data: Completion[], from: number, to: number, i
         from: from,
         to: to,
         options: options,
    -    span: span ? /^[a-zA-Z0-9_:]+$/ : undefined,
    +    validFor: span ? /^[a-zA-Z0-9_:]+$/ : undefined,
       } as CompletionResult;
     }
     
    diff --git a/web/ui/module/codemirror-promql/src/parser/matcher.ts b/web/ui/module/codemirror-promql/src/parser/matcher.ts
    index d9590d78e60..f432ffe2879 100644
    --- a/web/ui/module/codemirror-promql/src/parser/matcher.ts
    +++ b/web/ui/module/codemirror-promql/src/parser/matcher.ts
    @@ -18,7 +18,7 @@ import { Matcher } from '../types';
     
     function createMatcher(labelMatcher: SyntaxNode, state: EditorState): Matcher {
       const matcher = new Matcher(0, '', '');
    -  const cursor = labelMatcher.cursor;
    +  const cursor = labelMatcher.cursor();
       if (!cursor.next()) {
         // weird case, that would mean the labelMatcher doesn't have any child.
         return matcher;
    diff --git a/web/ui/module/codemirror-promql/src/parser/path-finder.ts b/web/ui/module/codemirror-promql/src/parser/path-finder.ts
    index 47efbe693ae..e93138b404c 100644
    --- a/web/ui/module/codemirror-promql/src/parser/path-finder.ts
    +++ b/web/ui/module/codemirror-promql/src/parser/path-finder.ts
    @@ -16,7 +16,7 @@ import { SyntaxNode } from '@lezer/common';
     // walkBackward will iterate other the tree from the leaf to the root until it founds the given `exit` node.
     // It returns null if the exit is not found.
     export function walkBackward(node: SyntaxNode, exit: number): SyntaxNode | null {
    -  const cursor = node.cursor;
    +  const cursor = node.cursor();
       let cursorIsMoving = true;
       while (cursorIsMoving && cursor.type.id !== exit) {
         cursorIsMoving = cursor.parent();
    @@ -29,7 +29,7 @@ export function walkBackward(node: SyntaxNode, exit: number): SyntaxNode | null
     // Otherwise if it's not possible to reach the last id/name of the path, it will return `null`
     // Note: the way followed during the iteration of the tree to find the given path, is only from the root to the leaf.
     export function walkThrough(node: SyntaxNode, ...path: (number | string)[]): SyntaxNode | null {
    -  const cursor = node.cursor;
    +  const cursor = node.cursor();
       let i = 0;
       let cursorIsMoving = true;
       path.unshift(cursor.type.id);
    @@ -50,7 +50,7 @@ export function walkThrough(node: SyntaxNode, ...path: (number | string)[]): Syn
     }
     
     export function containsAtLeastOneChild(node: SyntaxNode, ...child: (number | string)[]): boolean {
    -  const cursor = node.cursor;
    +  const cursor = node.cursor();
       if (!cursor.next()) {
         // let's try to move directly to the children level and
         // return false immediately if the current node doesn't have any child
    @@ -64,7 +64,7 @@ export function containsAtLeastOneChild(node: SyntaxNode, ...child: (number | st
     }
     
     export function containsChild(node: SyntaxNode, ...child: (number | string)[]): boolean {
    -  const cursor = node.cursor;
    +  const cursor = node.cursor();
       if (!cursor.next()) {
         // let's try to move directly to the children level and
         // return false immediately if the current node doesn't have any child
    diff --git a/web/ui/module/codemirror-promql/src/promql.ts b/web/ui/module/codemirror-promql/src/promql.ts
    index 86fb413ad44..506cd1348b7 100644
    --- a/web/ui/module/codemirror-promql/src/promql.ts
    +++ b/web/ui/module/codemirror-promql/src/promql.ts
    @@ -12,7 +12,6 @@
     // limitations under the License.
     
     import { parser } from '@prometheus-io/lezer-promql';
    -import { styleTags, tags } from '@codemirror/highlight';
     import { Extension } from '@codemirror/state';
     import { CompleteConfiguration, CompleteStrategy, newCompleteStrategy } from './complete';
     import { LintStrategy, newLintStrategy, promQLLinter } from './lint';
    @@ -28,26 +27,6 @@ export function promQLLanguage(top: LanguageType): LRLanguage {
       return LRLanguage.define({
         parser: parser.configure({
           top: top,
    -      props: [
    -        styleTags({
    -          LineComment: tags.comment,
    -          LabelName: tags.labelName,
    -          StringLiteral: tags.string,
    -          NumberLiteral: tags.number,
    -          Duration: tags.number,
    -          'Abs Absent AbsentOverTime Acos Acosh Asin Asinh Atan Atanh AvgOverTime Ceil Changes Clamp ClampMax ClampMin Cos Cosh CountOverTime DaysInMonth DayOfMonth DayOfWeek DayOfYear Deg Delta Deriv Exp Floor HistogramQuantile HoltWinters Hour Idelta Increase Irate LabelReplace LabelJoin LastOverTime Ln Log10 Log2 MaxOverTime MinOverTime Minute Month Pi PredictLinear PresentOverTime QuantileOverTime Rad Rate Resets Round Scalar Sgn Sin Sinh Sort SortDesc Sqrt StddevOverTime StdvarOverTime SumOverTime Tan Tanh Time Timestamp Vector Year':
    -            tags.function(tags.variableName),
    -          'Avg Bottomk Count Count_values Group Max Min Quantile Stddev Stdvar Sum Topk': tags.operatorKeyword,
    -          'By Without Bool On Ignoring GroupLeft GroupRight Offset Start End': tags.modifier,
    -          'And Unless Or': tags.logicOperator,
    -          'Sub Add Mul Mod Div Atan2 Eql Neq Lte Lss Gte Gtr EqlRegex EqlSingle NeqRegex Pow At': tags.operator,
    -          UnaryOp: tags.arithmeticOperator,
    -          '( )': tags.paren,
    -          '[ ]': tags.squareBracket,
    -          '{ }': tags.brace,
    -          '⚠': tags.invalid,
    -        }),
    -      ],
         }),
         languageData: {
           closeBrackets: { brackets: ['(', '[', '{', "'", '"', '`'] },
    diff --git a/web/ui/module/lezer-promql/package.json b/web/ui/module/lezer-promql/package.json
    index 91c10fa7a19..1a4d608d18d 100644
    --- a/web/ui/module/lezer-promql/package.json
    +++ b/web/ui/module/lezer-promql/package.json
    @@ -30,10 +30,12 @@
         "test": "NODE_OPTIONS=--experimental-vm-modules jest"
       },
       "devDependencies": {
    -    "@lezer/generator": "^0.15.4",
    -    "@lezer/lr": "^0.15.8"
    +    "@lezer/generator": "^1.0.0",
    +    "@lezer/lr": "^1.0.0",
    +    "@lezer/highlight": "^1.0.0"
       },
       "peerDependencies": {
    -    "@lezer/lr": "^0.15.8"
    +    "@lezer/lr": "^1.0.0",
    +    "@lezer/highlight": "^1.0.0"
       }
     }
    diff --git a/web/ui/module/lezer-promql/src/highlight.js b/web/ui/module/lezer-promql/src/highlight.js
    new file mode 100644
    index 00000000000..2e41c1c7e61
    --- /dev/null
    +++ b/web/ui/module/lezer-promql/src/highlight.js
    @@ -0,0 +1,33 @@
    +// Copyright 2022 The Prometheus Authors
    +// 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.
    +
    +import {styleTags, tags} from "@lezer/highlight";
    +
    +export const promQLHighLight = styleTags({
    +    LineComment: tags.comment,
    +    LabelName: tags.labelName,
    +    StringLiteral: tags.string,
    +    NumberLiteral: tags.number,
    +    Duration: tags.number,
    +    'Abs Absent AbsentOverTime Acos Acosh Asin Asinh Atan Atanh AvgOverTime Ceil Changes Clamp ClampMax ClampMin Cos Cosh CountOverTime DaysInMonth DayOfMonth DayOfWeek DayOfYear Deg Delta Deriv Exp Floor HistogramQuantile HoltWinters Hour Idelta Increase Irate LabelReplace LabelJoin LastOverTime Ln Log10 Log2 MaxOverTime MinOverTime Minute Month Pi PredictLinear PresentOverTime QuantileOverTime Rad Rate Resets Round Scalar Sgn Sin Sinh Sort SortDesc Sqrt StddevOverTime StdvarOverTime SumOverTime Tan Tanh Time Timestamp Vector Year':
    +        tags.function(tags.variableName),
    +    'Avg Bottomk Count Count_values Group Max Min Quantile Stddev Stdvar Sum Topk': tags.operatorKeyword,
    +    'By Without Bool On Ignoring GroupLeft GroupRight Offset Start End': tags.modifier,
    +    'And Unless Or': tags.logicOperator,
    +    'Sub Add Mul Mod Div Atan2 Eql Neq Lte Lss Gte Gtr EqlRegex EqlSingle NeqRegex Pow At': tags.operator,
    +    UnaryOp: tags.arithmeticOperator,
    +    '( )': tags.paren,
    +    '[ ]': tags.squareBracket,
    +    '{ }': tags.brace,
    +    '⚠': tags.invalid,
    +})
    diff --git a/web/ui/module/lezer-promql/src/promql.grammar b/web/ui/module/lezer-promql/src/promql.grammar
    index 8efc9a8a16e..e4440ac8518 100644
    --- a/web/ui/module/lezer-promql/src/promql.grammar
    +++ b/web/ui/module/lezer-promql/src/promql.grammar
    @@ -357,6 +357,8 @@ NumberLiteral  {
       End
     }
     
    +@external propSource promQLHighLight from "./highlight"
    +
       // FunctionIdentifier definitions
       Abs { condFn<"abs"> }
       Absent { condFn<"absent"> }
    diff --git a/web/ui/package-lock.json b/web/ui/package-lock.json
    index 35fbcb58715..c424f2ed806 100644
    --- a/web/ui/package-lock.json
    +++ b/web/ui/package-lock.json
    @@ -35,14 +35,14 @@
             "lru-cache": "^6.0.0"
           },
           "devDependencies": {
    -        "@codemirror/autocomplete": "^0.19.15",
    -        "@codemirror/highlight": "^0.19.8",
    -        "@codemirror/language": "^0.19.10",
    -        "@codemirror/lint": "^0.19.6",
    -        "@codemirror/state": "^0.19.9",
    -        "@codemirror/view": "^0.19.48",
    -        "@lezer/common": "^0.15.12",
    -        "@lezer/lr": "^0.15.8",
    +        "@codemirror/autocomplete": "^6.0.0",
    +        "@codemirror/language": "^6.0.0",
    +        "@codemirror/lint": "^6.0.0",
    +        "@codemirror/state": "^6.0.0",
    +        "@codemirror/view": "^6.0.0",
    +        "@lezer/common": "^1.0.0",
    +        "@lezer/highlight": "^1.0.0",
    +        "@lezer/lr": "^1.0.0",
             "@types/lru-cache": "^5.1.1",
             "isomorphic-fetch": "^3.0.0",
             "nock": "^13.2.4"
    @@ -51,13 +51,12 @@
             "node": ">=12.0.0"
           },
           "peerDependencies": {
    -        "@codemirror/autocomplete": "^0.19.15",
    -        "@codemirror/highlight": "^0.19.8",
    -        "@codemirror/language": "^0.19.10",
    -        "@codemirror/lint": "^0.19.6",
    -        "@codemirror/state": "^0.19.9",
    -        "@codemirror/view": "^0.19.48",
    -        "@lezer/common": "^0.15.12"
    +        "@codemirror/autocomplete": "^6.0.0",
    +        "@codemirror/language": "^6.0.0",
    +        "@codemirror/lint": "^6.0.0",
    +        "@codemirror/state": "^6.0.0",
    +        "@codemirror/view": "^6.0.0",
    +        "@lezer/common": "^1.0.0"
           }
         },
         "module/lezer-promql": {
    @@ -65,20 +64,23 @@
           "version": "0.23.0",
           "license": "Apache-2.0",
           "devDependencies": {
    -        "@lezer/generator": "^0.15.4",
    -        "@lezer/lr": "^0.15.8"
    +        "@lezer/generator": "^1.0.0",
    +        "@lezer/highlight": "^1.0.0",
    +        "@lezer/lr": "^1.0.0"
           },
           "peerDependencies": {
    -        "@lezer/lr": "^0.15.8"
    +        "@lezer/highlight": "^1.0.0",
    +        "@lezer/lr": "^1.0.0"
           }
         },
         "node_modules/@ampproject/remapping": {
    -      "version": "2.1.2",
    -      "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.1.2.tgz",
    -      "integrity": "sha512-hoyByceqwKirw7w3Z7gnIIZC3Wx3J484Y3L/cMpXFbr7d9ZQj2mODrirNzcJa+SM3UlpWXYvKV4RlRpFXlWgXg==",
    +      "version": "2.2.0",
    +      "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz",
    +      "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==",
           "dev": true,
           "dependencies": {
    -        "@jridgewell/trace-mapping": "^0.3.0"
    +        "@jridgewell/gen-mapping": "^0.1.0",
    +        "@jridgewell/trace-mapping": "^0.3.9"
           },
           "engines": {
             "node": ">=6.0.0"
    @@ -97,34 +99,34 @@
           }
         },
         "node_modules/@babel/compat-data": {
    -      "version": "7.17.7",
    -      "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.17.7.tgz",
    -      "integrity": "sha512-p8pdE6j0a29TNGebNm7NzYZWB3xVZJBZ7XGs42uAKzQo8VQ3F0By/cQCtUEABwIqw5zo6WA4NbmxsfzADzMKnQ==",
    +      "version": "7.18.5",
    +      "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.18.5.tgz",
    +      "integrity": "sha512-BxhE40PVCBxVEJsSBhB6UWyAuqJRxGsAw8BdHMJ3AKGydcwuWW4kOO3HmqBQAdcq/OP+/DlTVxLvsCzRTnZuGg==",
           "dev": true,
           "engines": {
             "node": ">=6.9.0"
           }
         },
         "node_modules/@babel/core": {
    -      "version": "7.17.8",
    -      "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.17.8.tgz",
    -      "integrity": "sha512-OdQDV/7cRBtJHLSOBqqbYNkOcydOgnX59TZx4puf41fzcVtN3e/4yqY8lMQsK+5X2lJtAdmA+6OHqsj1hBJ4IQ==",
    +      "version": "7.18.5",
    +      "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.18.5.tgz",
    +      "integrity": "sha512-MGY8vg3DxMnctw0LdvSEojOsumc70g0t18gNyUdAZqB1Rpd1Bqo/svHGvt+UJ6JcGX+DIekGFDxxIWofBxLCnQ==",
           "dev": true,
           "dependencies": {
             "@ampproject/remapping": "^2.1.0",
             "@babel/code-frame": "^7.16.7",
    -        "@babel/generator": "^7.17.7",
    -        "@babel/helper-compilation-targets": "^7.17.7",
    -        "@babel/helper-module-transforms": "^7.17.7",
    -        "@babel/helpers": "^7.17.8",
    -        "@babel/parser": "^7.17.8",
    +        "@babel/generator": "^7.18.2",
    +        "@babel/helper-compilation-targets": "^7.18.2",
    +        "@babel/helper-module-transforms": "^7.18.0",
    +        "@babel/helpers": "^7.18.2",
    +        "@babel/parser": "^7.18.5",
             "@babel/template": "^7.16.7",
    -        "@babel/traverse": "^7.17.3",
    -        "@babel/types": "^7.17.0",
    +        "@babel/traverse": "^7.18.5",
    +        "@babel/types": "^7.18.4",
             "convert-source-map": "^1.7.0",
             "debug": "^4.1.0",
             "gensync": "^1.0.0-beta.2",
    -        "json5": "^2.1.2",
    +        "json5": "^2.2.1",
             "semver": "^6.3.0"
           },
           "engines": {
    @@ -136,9 +138,9 @@
           }
         },
         "node_modules/@babel/eslint-parser": {
    -      "version": "7.17.0",
    -      "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.17.0.tgz",
    -      "integrity": "sha512-PUEJ7ZBXbRkbq3qqM/jZ2nIuakUBqCYc7Qf52Lj7dlZ6zERnqisdHioL0l4wwQZnmskMeasqUNzLBFKs3nylXA==",
    +      "version": "7.18.2",
    +      "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.18.2.tgz",
    +      "integrity": "sha512-oFQYkE8SuH14+uR51JVAmdqwKYXGRjEXx7s+WiagVjqQ+HPE+nnwyF2qlVG8evUsUHmPcA+6YXMEDbIhEyQc5A==",
           "dev": true,
           "dependencies": {
             "eslint-scope": "^5.1.1",
    @@ -185,19 +187,33 @@
           }
         },
         "node_modules/@babel/generator": {
    -      "version": "7.17.7",
    -      "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.17.7.tgz",
    -      "integrity": "sha512-oLcVCTeIFadUoArDTwpluncplrYBmTCCZZgXCbgNGvOBBiSDDK3eWO4b/+eOTli5tKv1lg+a5/NAXg+nTcei1w==",
    +      "version": "7.18.2",
    +      "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.18.2.tgz",
    +      "integrity": "sha512-W1lG5vUwFvfMd8HVXqdfbuG7RuaSrTCCD8cl8fP8wOivdbtbIg2Db3IWUcgvfxKbbn6ZBGYRW/Zk1MIwK49mgw==",
           "dev": true,
           "dependencies": {
    -        "@babel/types": "^7.17.0",
    -        "jsesc": "^2.5.1",
    -        "source-map": "^0.5.0"
    +        "@babel/types": "^7.18.2",
    +        "@jridgewell/gen-mapping": "^0.3.0",
    +        "jsesc": "^2.5.1"
           },
           "engines": {
             "node": ">=6.9.0"
           }
         },
    +    "node_modules/@babel/generator/node_modules/@jridgewell/gen-mapping": {
    +      "version": "0.3.1",
    +      "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.1.tgz",
    +      "integrity": "sha512-GcHwniMlA2z+WFPWuY8lp3fsza0I8xPFMWL5+n8LYyP6PSvPrXf4+n8stDHZY2DM0zy9sVkRDy1jDI4XGzYVqg==",
    +      "dev": true,
    +      "dependencies": {
    +        "@jridgewell/set-array": "^1.0.0",
    +        "@jridgewell/sourcemap-codec": "^1.4.10",
    +        "@jridgewell/trace-mapping": "^0.3.9"
    +      },
    +      "engines": {
    +        "node": ">=6.0.0"
    +      }
    +    },
         "node_modules/@babel/helper-annotate-as-pure": {
           "version": "7.16.7",
           "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.16.7.tgz",
    @@ -224,14 +240,14 @@
           }
         },
         "node_modules/@babel/helper-compilation-targets": {
    -      "version": "7.17.7",
    -      "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.17.7.tgz",
    -      "integrity": "sha512-UFzlz2jjd8kroj0hmCFV5zr+tQPi1dpC2cRsDV/3IEW8bJfCPrPpmcSN6ZS8RqIq4LXcmpipCQFPddyFA5Yc7w==",
    +      "version": "7.18.2",
    +      "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.18.2.tgz",
    +      "integrity": "sha512-s1jnPotJS9uQnzFtiZVBUxe67CuBa679oWFHpxYYnTpRL/1ffhyX44R9uYiXoa/pLXcY9H2moJta0iaanlk/rQ==",
           "dev": true,
           "dependencies": {
    -        "@babel/compat-data": "^7.17.7",
    +        "@babel/compat-data": "^7.17.10",
             "@babel/helper-validator-option": "^7.16.7",
    -        "browserslist": "^4.17.5",
    +        "browserslist": "^4.20.2",
             "semver": "^6.3.0"
           },
           "engines": {
    @@ -242,15 +258,15 @@
           }
         },
         "node_modules/@babel/helper-create-class-features-plugin": {
    -      "version": "7.17.6",
    -      "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.17.6.tgz",
    -      "integrity": "sha512-SogLLSxXm2OkBbSsHZMM4tUi8fUzjs63AT/d0YQIzr6GSd8Hxsbk2KYDX0k0DweAzGMj/YWeiCsorIdtdcW8Eg==",
    +      "version": "7.18.0",
    +      "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.18.0.tgz",
    +      "integrity": "sha512-Kh8zTGR9de3J63e5nS0rQUdRs/kbtwoeQQ0sriS0lItjC96u8XXZN6lKpuyWd2coKSU13py/y+LTmThLuVX0Pg==",
           "dev": true,
           "dependencies": {
             "@babel/helper-annotate-as-pure": "^7.16.7",
             "@babel/helper-environment-visitor": "^7.16.7",
    -        "@babel/helper-function-name": "^7.16.7",
    -        "@babel/helper-member-expression-to-functions": "^7.16.7",
    +        "@babel/helper-function-name": "^7.17.9",
    +        "@babel/helper-member-expression-to-functions": "^7.17.7",
             "@babel/helper-optimise-call-expression": "^7.16.7",
             "@babel/helper-replace-supers": "^7.16.7",
             "@babel/helper-split-export-declaration": "^7.16.7"
    @@ -263,9 +279,9 @@
           }
         },
         "node_modules/@babel/helper-create-regexp-features-plugin": {
    -      "version": "7.17.0",
    -      "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.17.0.tgz",
    -      "integrity": "sha512-awO2So99wG6KnlE+TPs6rn83gCz5WlEePJDTnLEqbchMVrBeAujURVphRdigsk094VhvZehFoNOihSlcBjwsXA==",
    +      "version": "7.17.12",
    +      "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.17.12.tgz",
    +      "integrity": "sha512-b2aZrV4zvutr9AIa6/gA3wsZKRwTKYoDxYiFKcESS3Ug2GTXzwBEvMuuFLhCQpEnRXs1zng4ISAXSUxxKBIcxw==",
           "dev": true,
           "dependencies": {
             "@babel/helper-annotate-as-pure": "^7.16.7",
    @@ -298,13 +314,10 @@
           }
         },
         "node_modules/@babel/helper-environment-visitor": {
    -      "version": "7.16.7",
    -      "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.16.7.tgz",
    -      "integrity": "sha512-SLLb0AAn6PkUeAfKJCCOl9e1R53pQlGAfc4y4XuMRZfqeMYLE0dM1LMhqbGAlGQY0lfw5/ohoYWAe9V1yibRag==",
    +      "version": "7.18.2",
    +      "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.2.tgz",
    +      "integrity": "sha512-14GQKWkX9oJzPiQQ7/J36FTXcD4kSp8egKjO9nINlSKiHITRA9q/R74qu8S9xlc/b/yjsJItQUeeh3xnGN0voQ==",
           "dev": true,
    -      "dependencies": {
    -        "@babel/types": "^7.16.7"
    -      },
           "engines": {
             "node": ">=6.9.0"
           }
    @@ -322,26 +335,13 @@
           }
         },
         "node_modules/@babel/helper-function-name": {
    -      "version": "7.16.7",
    -      "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.16.7.tgz",
    -      "integrity": "sha512-QfDfEnIUyyBSR3HtrtGECuZ6DAyCkYFp7GHl75vFtTnn6pjKeK0T1DB5lLkFvBea8MdaiUABx3osbgLyInoejA==",
    +      "version": "7.17.9",
    +      "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.17.9.tgz",
    +      "integrity": "sha512-7cRisGlVtiVqZ0MW0/yFB4atgpGLWEHUVYnb448hZK4x+vih0YO5UoS11XIYtZYqHd0dIPMdUSv8q5K4LdMnIg==",
           "dev": true,
           "dependencies": {
    -        "@babel/helper-get-function-arity": "^7.16.7",
             "@babel/template": "^7.16.7",
    -        "@babel/types": "^7.16.7"
    -      },
    -      "engines": {
    -        "node": ">=6.9.0"
    -      }
    -    },
    -    "node_modules/@babel/helper-get-function-arity": {
    -      "version": "7.16.7",
    -      "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.16.7.tgz",
    -      "integrity": "sha512-flc+RLSOBXzNzVhcLu6ujeHUrD6tANAOU5ojrRx/as+tbzf8+stUCj7+IfRRoAbEZqj/ahXEMsjhOhgeZsrnTw==",
    -      "dev": true,
    -      "dependencies": {
    -        "@babel/types": "^7.16.7"
    +        "@babel/types": "^7.17.0"
           },
           "engines": {
             "node": ">=6.9.0"
    @@ -384,9 +384,9 @@
           }
         },
         "node_modules/@babel/helper-module-transforms": {
    -      "version": "7.17.7",
    -      "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.17.7.tgz",
    -      "integrity": "sha512-VmZD99F3gNTYB7fJRDTi+u6l/zxY0BE6OIxPSU7a50s6ZUQkHwSDmV92FfM+oCG0pZRVojGYhkR8I0OGeCVREw==",
    +      "version": "7.18.0",
    +      "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.18.0.tgz",
    +      "integrity": "sha512-kclUYSUBIjlvnzN2++K9f2qzYKFgjmnmjwL4zlmU5f8ZtzgWe8s0rUPSTGy2HmK4P8T52MQsS+HTQAgZd3dMEA==",
           "dev": true,
           "dependencies": {
             "@babel/helper-environment-visitor": "^7.16.7",
    @@ -395,8 +395,8 @@
             "@babel/helper-split-export-declaration": "^7.16.7",
             "@babel/helper-validator-identifier": "^7.16.7",
             "@babel/template": "^7.16.7",
    -        "@babel/traverse": "^7.17.3",
    -        "@babel/types": "^7.17.0"
    +        "@babel/traverse": "^7.18.0",
    +        "@babel/types": "^7.18.0"
           },
           "engines": {
             "node": ">=6.9.0"
    @@ -415,9 +415,9 @@
           }
         },
         "node_modules/@babel/helper-plugin-utils": {
    -      "version": "7.16.7",
    -      "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz",
    -      "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==",
    +      "version": "7.17.12",
    +      "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz",
    +      "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==",
           "dev": true,
           "engines": {
             "node": ">=6.9.0"
    @@ -438,28 +438,28 @@
           }
         },
         "node_modules/@babel/helper-replace-supers": {
    -      "version": "7.16.7",
    -      "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.16.7.tgz",
    -      "integrity": "sha512-y9vsWilTNaVnVh6xiJfABzsNpgDPKev9HnAgz6Gb1p6UUwf9NepdlsV7VXGCftJM+jqD5f7JIEubcpLjZj5dBw==",
    +      "version": "7.18.2",
    +      "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.18.2.tgz",
    +      "integrity": "sha512-XzAIyxx+vFnrOxiQrToSUOzUOn0e1J2Li40ntddek1Y69AXUTXoDJ40/D5RdjFu7s7qHiaeoTiempZcbuVXh2Q==",
           "dev": true,
           "dependencies": {
    -        "@babel/helper-environment-visitor": "^7.16.7",
    -        "@babel/helper-member-expression-to-functions": "^7.16.7",
    +        "@babel/helper-environment-visitor": "^7.18.2",
    +        "@babel/helper-member-expression-to-functions": "^7.17.7",
             "@babel/helper-optimise-call-expression": "^7.16.7",
    -        "@babel/traverse": "^7.16.7",
    -        "@babel/types": "^7.16.7"
    +        "@babel/traverse": "^7.18.2",
    +        "@babel/types": "^7.18.2"
           },
           "engines": {
             "node": ">=6.9.0"
           }
         },
         "node_modules/@babel/helper-simple-access": {
    -      "version": "7.17.7",
    -      "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.17.7.tgz",
    -      "integrity": "sha512-txyMCGroZ96i+Pxr3Je3lzEJjqwaRC9buMUgtomcrLe5Nd0+fk1h0LLA+ixUF5OW7AhHuQ7Es1WcQJZmZsz2XA==",
    +      "version": "7.18.2",
    +      "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.18.2.tgz",
    +      "integrity": "sha512-7LIrjYzndorDY88MycupkpQLKS1AFfsVRm2k/9PtKScSy5tZq0McZTj+DiMRynboZfIqOKvo03pmhTaUgiD6fQ==",
           "dev": true,
           "dependencies": {
    -        "@babel/types": "^7.17.0"
    +        "@babel/types": "^7.18.2"
           },
           "engines": {
             "node": ">=6.9.0"
    @@ -523,23 +523,23 @@
           }
         },
         "node_modules/@babel/helpers": {
    -      "version": "7.17.8",
    -      "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.17.8.tgz",
    -      "integrity": "sha512-QcL86FGxpfSJwGtAvv4iG93UL6bmqBdmoVY0CMCU2g+oD2ezQse3PT5Pa+jiD6LJndBQi0EDlpzOWNlLuhz5gw==",
    +      "version": "7.18.2",
    +      "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.18.2.tgz",
    +      "integrity": "sha512-j+d+u5xT5utcQSzrh9p+PaJX94h++KN+ng9b9WEJq7pkUPAd61FGqhjuUEdfknb3E/uDBb7ruwEeKkIxNJPIrg==",
           "dev": true,
           "dependencies": {
             "@babel/template": "^7.16.7",
    -        "@babel/traverse": "^7.17.3",
    -        "@babel/types": "^7.17.0"
    +        "@babel/traverse": "^7.18.2",
    +        "@babel/types": "^7.18.2"
           },
           "engines": {
             "node": ">=6.9.0"
           }
         },
         "node_modules/@babel/highlight": {
    -      "version": "7.16.10",
    -      "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.10.tgz",
    -      "integrity": "sha512-5FnTQLSLswEj6IkgVw5KusNUUFY9ZGqe/TRFnP/BKYHYgfh7tc+C7mwiy95/yNP7Dh9x580Vv8r7u7ZfTBFxdw==",
    +      "version": "7.17.12",
    +      "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.17.12.tgz",
    +      "integrity": "sha512-7yykMVF3hfZY2jsHZEEgLc+3x4o1O+fYyULu11GynEUQNwB6lua+IIQn1FiJxNucd5UlyJryrwsOh8PL9Sn8Qg==",
           "dev": true,
           "dependencies": {
             "@babel/helper-validator-identifier": "^7.16.7",
    @@ -588,13 +588,13 @@
         "node_modules/@babel/highlight/node_modules/color-name": {
           "version": "1.1.3",
           "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
    -      "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
    +      "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==",
           "dev": true
         },
         "node_modules/@babel/highlight/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=",
    +      "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
           "dev": true,
           "engines": {
             "node": ">=0.8.0"
    @@ -603,7 +603,7 @@
         "node_modules/@babel/highlight/node_modules/has-flag": {
           "version": "3.0.0",
           "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
    -      "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
    +      "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==",
           "dev": true,
           "engines": {
             "node": ">=4"
    @@ -622,9 +622,9 @@
           }
         },
         "node_modules/@babel/parser": {
    -      "version": "7.17.8",
    -      "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.17.8.tgz",
    -      "integrity": "sha512-BoHhDJrJXqcg+ZL16Xv39H9n+AqJ4pcDrQBGZN+wHxIysrLZ3/ECwCBUch/1zUNhnsXULcONU3Ei5Hmkfk6kiQ==",
    +      "version": "7.18.5",
    +      "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.18.5.tgz",
    +      "integrity": "sha512-YZWVaglMiplo7v8f1oMQ5ZPQr0vn7HPeZXxXWsxXJRjGVrzUFn9OxFQl1sb5wzfootjA/yChhW84BV+383FSOw==",
           "dev": true,
           "bin": {
             "parser": "bin/babel-parser.js"
    @@ -634,12 +634,12 @@
           }
         },
         "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": {
    -      "version": "7.16.7",
    -      "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.16.7.tgz",
    -      "integrity": "sha512-anv/DObl7waiGEnC24O9zqL0pSuI9hljihqiDuFHC8d7/bjr/4RLGPWuc8rYOff/QPzbEPSkzG8wGG9aDuhHRg==",
    +      "version": "7.17.12",
    +      "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.17.12.tgz",
    +      "integrity": "sha512-xCJQXl4EeQ3J9C4yOmpTrtVGmzpm2iSzyxbkZHw7UCnZBftHpF/hpII80uWVyVrc40ytIClHjgWGTG1g/yB+aw==",
           "dev": true,
           "dependencies": {
    -        "@babel/helper-plugin-utils": "^7.16.7"
    +        "@babel/helper-plugin-utils": "^7.17.12"
           },
           "engines": {
             "node": ">=6.9.0"
    @@ -649,14 +649,14 @@
           }
         },
         "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": {
    -      "version": "7.16.7",
    -      "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.16.7.tgz",
    -      "integrity": "sha512-di8vUHRdf+4aJ7ltXhaDbPoszdkh59AQtJM5soLsuHpQJdFQZOA4uGj0V2u/CZ8bJ/u8ULDL5yq6FO/bCXnKHw==",
    +      "version": "7.17.12",
    +      "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.17.12.tgz",
    +      "integrity": "sha512-/vt0hpIw0x4b6BLKUkwlvEoiGZYYLNZ96CzyHYPbtG2jZGz6LBe7/V+drYrc/d+ovrF9NBi0pmtvmNb/FsWtRQ==",
           "dev": true,
           "dependencies": {
    -        "@babel/helper-plugin-utils": "^7.16.7",
    +        "@babel/helper-plugin-utils": "^7.17.12",
             "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0",
    -        "@babel/plugin-proposal-optional-chaining": "^7.16.7"
    +        "@babel/plugin-proposal-optional-chaining": "^7.17.12"
           },
           "engines": {
             "node": ">=6.9.0"
    @@ -666,12 +666,12 @@
           }
         },
         "node_modules/@babel/plugin-proposal-async-generator-functions": {
    -      "version": "7.16.8",
    -      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.16.8.tgz",
    -      "integrity": "sha512-71YHIvMuiuqWJQkebWJtdhQTfd4Q4mF76q2IX37uZPkG9+olBxsX+rH1vkhFto4UeJZ9dPY2s+mDvhDm1u2BGQ==",
    +      "version": "7.17.12",
    +      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.17.12.tgz",
    +      "integrity": "sha512-RWVvqD1ooLKP6IqWTA5GyFVX2isGEgC5iFxKzfYOIy/QEFdxYyCybBDtIGjipHpb9bDWHzcqGqFakf+mVmBTdQ==",
           "dev": true,
           "dependencies": {
    -        "@babel/helper-plugin-utils": "^7.16.7",
    +        "@babel/helper-plugin-utils": "^7.17.12",
             "@babel/helper-remap-async-to-generator": "^7.16.8",
             "@babel/plugin-syntax-async-generators": "^7.8.4"
           },
    @@ -683,13 +683,13 @@
           }
         },
         "node_modules/@babel/plugin-proposal-class-properties": {
    -      "version": "7.16.7",
    -      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.16.7.tgz",
    -      "integrity": "sha512-IobU0Xme31ewjYOShSIqd/ZGM/r/cuOz2z0MDbNrhF5FW+ZVgi0f2lyeoj9KFPDOAqsYxmLWZte1WOwlvY9aww==",
    +      "version": "7.17.12",
    +      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.17.12.tgz",
    +      "integrity": "sha512-U0mI9q8pW5Q9EaTHFPwSVusPMV/DV9Mm8p7csqROFLtIE9rBF5piLqyrBGigftALrBcsBGu4m38JneAe7ZDLXw==",
           "dev": true,
           "dependencies": {
    -        "@babel/helper-create-class-features-plugin": "^7.16.7",
    -        "@babel/helper-plugin-utils": "^7.16.7"
    +        "@babel/helper-create-class-features-plugin": "^7.17.12",
    +        "@babel/helper-plugin-utils": "^7.17.12"
           },
           "engines": {
             "node": ">=6.9.0"
    @@ -699,13 +699,13 @@
           }
         },
         "node_modules/@babel/plugin-proposal-class-static-block": {
    -      "version": "7.17.6",
    -      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.17.6.tgz",
    -      "integrity": "sha512-X/tididvL2zbs7jZCeeRJ8167U/+Ac135AM6jCAx6gYXDUviZV5Ku9UDvWS2NCuWlFjIRXklYhwo6HhAC7ETnA==",
    +      "version": "7.18.0",
    +      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.18.0.tgz",
    +      "integrity": "sha512-t+8LsRMMDE74c6sV7KShIw13sqbqd58tlqNrsWoWBTIMw7SVQ0cZ905wLNS/FBCy/3PyooRHLFFlfrUNyyz5lA==",
           "dev": true,
           "dependencies": {
    -        "@babel/helper-create-class-features-plugin": "^7.17.6",
    -        "@babel/helper-plugin-utils": "^7.16.7",
    +        "@babel/helper-create-class-features-plugin": "^7.18.0",
    +        "@babel/helper-plugin-utils": "^7.17.12",
             "@babel/plugin-syntax-class-static-block": "^7.14.5"
           },
           "engines": {
    @@ -716,15 +716,16 @@
           }
         },
         "node_modules/@babel/plugin-proposal-decorators": {
    -      "version": "7.17.8",
    -      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.17.8.tgz",
    -      "integrity": "sha512-U69odN4Umyyx1xO1rTII0IDkAEC+RNlcKXtqOblfpzqy1C+aOplb76BQNq0+XdpVkOaPlpEDwd++joY8FNFJKA==",
    +      "version": "7.18.2",
    +      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.18.2.tgz",
    +      "integrity": "sha512-kbDISufFOxeczi0v4NQP3p5kIeW6izn/6klfWBrIIdGZZe4UpHR+QU03FAoWjGGd9SUXAwbw2pup1kaL4OQsJQ==",
           "dev": true,
           "dependencies": {
    -        "@babel/helper-create-class-features-plugin": "^7.17.6",
    -        "@babel/helper-plugin-utils": "^7.16.7",
    -        "@babel/helper-replace-supers": "^7.16.7",
    -        "@babel/plugin-syntax-decorators": "^7.17.0",
    +        "@babel/helper-create-class-features-plugin": "^7.18.0",
    +        "@babel/helper-plugin-utils": "^7.17.12",
    +        "@babel/helper-replace-supers": "^7.18.2",
    +        "@babel/helper-split-export-declaration": "^7.16.7",
    +        "@babel/plugin-syntax-decorators": "^7.17.12",
             "charcodes": "^0.2.0"
           },
           "engines": {
    @@ -751,12 +752,12 @@
           }
         },
         "node_modules/@babel/plugin-proposal-export-namespace-from": {
    -      "version": "7.16.7",
    -      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.16.7.tgz",
    -      "integrity": "sha512-ZxdtqDXLRGBL64ocZcs7ovt71L3jhC1RGSyR996svrCi3PYqHNkb3SwPJCs8RIzD86s+WPpt2S73+EHCGO+NUA==",
    +      "version": "7.17.12",
    +      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.17.12.tgz",
    +      "integrity": "sha512-j7Ye5EWdwoXOpRmo5QmRyHPsDIe6+u70ZYZrd7uz+ebPYFKfRcLcNu3Ro0vOlJ5zuv8rU7xa+GttNiRzX56snQ==",
           "dev": true,
           "dependencies": {
    -        "@babel/helper-plugin-utils": "^7.16.7",
    +        "@babel/helper-plugin-utils": "^7.17.12",
             "@babel/plugin-syntax-export-namespace-from": "^7.8.3"
           },
           "engines": {
    @@ -767,12 +768,12 @@
           }
         },
         "node_modules/@babel/plugin-proposal-json-strings": {
    -      "version": "7.16.7",
    -      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.16.7.tgz",
    -      "integrity": "sha512-lNZ3EEggsGY78JavgbHsK9u5P3pQaW7k4axlgFLYkMd7UBsiNahCITShLjNQschPyjtO6dADrL24757IdhBrsQ==",
    +      "version": "7.17.12",
    +      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.17.12.tgz",
    +      "integrity": "sha512-rKJ+rKBoXwLnIn7n6o6fulViHMrOThz99ybH+hKHcOZbnN14VuMnH9fo2eHE69C8pO4uX1Q7t2HYYIDmv8VYkg==",
           "dev": true,
           "dependencies": {
    -        "@babel/helper-plugin-utils": "^7.16.7",
    +        "@babel/helper-plugin-utils": "^7.17.12",
             "@babel/plugin-syntax-json-strings": "^7.8.3"
           },
           "engines": {
    @@ -783,12 +784,12 @@
           }
         },
         "node_modules/@babel/plugin-proposal-logical-assignment-operators": {
    -      "version": "7.16.7",
    -      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.16.7.tgz",
    -      "integrity": "sha512-K3XzyZJGQCr00+EtYtrDjmwX7o7PLK6U9bi1nCwkQioRFVUv6dJoxbQjtWVtP+bCPy82bONBKG8NPyQ4+i6yjg==",
    +      "version": "7.17.12",
    +      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.17.12.tgz",
    +      "integrity": "sha512-EqFo2s1Z5yy+JeJu7SFfbIUtToJTVlC61/C7WLKDntSw4Sz6JNAIfL7zQ74VvirxpjB5kz/kIx0gCcb+5OEo2Q==",
           "dev": true,
           "dependencies": {
    -        "@babel/helper-plugin-utils": "^7.16.7",
    +        "@babel/helper-plugin-utils": "^7.17.12",
             "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4"
           },
           "engines": {
    @@ -799,12 +800,12 @@
           }
         },
         "node_modules/@babel/plugin-proposal-nullish-coalescing-operator": {
    -      "version": "7.16.7",
    -      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.16.7.tgz",
    -      "integrity": "sha512-aUOrYU3EVtjf62jQrCj63pYZ7k6vns2h/DQvHPWGmsJRYzWXZ6/AsfgpiRy6XiuIDADhJzP2Q9MwSMKauBQ+UQ==",
    +      "version": "7.17.12",
    +      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.17.12.tgz",
    +      "integrity": "sha512-ws/g3FSGVzv+VH86+QvgtuJL/kR67xaEIF2x0iPqdDfYW6ra6JF3lKVBkWynRLcNtIC1oCTfDRVxmm2mKzy+ag==",
           "dev": true,
           "dependencies": {
    -        "@babel/helper-plugin-utils": "^7.16.7",
    +        "@babel/helper-plugin-utils": "^7.17.12",
             "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3"
           },
           "engines": {
    @@ -831,16 +832,16 @@
           }
         },
         "node_modules/@babel/plugin-proposal-object-rest-spread": {
    -      "version": "7.17.3",
    -      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.17.3.tgz",
    -      "integrity": "sha512-yuL5iQA/TbZn+RGAfxQXfi7CNLmKi1f8zInn4IgobuCWcAb7i+zj4TYzQ9l8cEzVyJ89PDGuqxK1xZpUDISesw==",
    +      "version": "7.18.0",
    +      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.18.0.tgz",
    +      "integrity": "sha512-nbTv371eTrFabDfHLElkn9oyf9VG+VKK6WMzhY2o4eHKaG19BToD9947zzGMO6I/Irstx9d8CwX6njPNIAR/yw==",
           "dev": true,
           "dependencies": {
    -        "@babel/compat-data": "^7.17.0",
    -        "@babel/helper-compilation-targets": "^7.16.7",
    -        "@babel/helper-plugin-utils": "^7.16.7",
    +        "@babel/compat-data": "^7.17.10",
    +        "@babel/helper-compilation-targets": "^7.17.10",
    +        "@babel/helper-plugin-utils": "^7.17.12",
             "@babel/plugin-syntax-object-rest-spread": "^7.8.3",
    -        "@babel/plugin-transform-parameters": "^7.16.7"
    +        "@babel/plugin-transform-parameters": "^7.17.12"
           },
           "engines": {
             "node": ">=6.9.0"
    @@ -866,12 +867,12 @@
           }
         },
         "node_modules/@babel/plugin-proposal-optional-chaining": {
    -      "version": "7.16.7",
    -      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.16.7.tgz",
    -      "integrity": "sha512-eC3xy+ZrUcBtP7x+sq62Q/HYd674pPTb/77XZMb5wbDPGWIdUbSr4Agr052+zaUPSb+gGRnjxXfKFvx5iMJ+DA==",
    +      "version": "7.17.12",
    +      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.17.12.tgz",
    +      "integrity": "sha512-7wigcOs/Z4YWlK7xxjkvaIw84vGhDv/P1dFGQap0nHkc8gFKY/r+hXc8Qzf5k1gY7CvGIcHqAnOagVKJJ1wVOQ==",
           "dev": true,
           "dependencies": {
    -        "@babel/helper-plugin-utils": "^7.16.7",
    +        "@babel/helper-plugin-utils": "^7.17.12",
             "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0",
             "@babel/plugin-syntax-optional-chaining": "^7.8.3"
           },
    @@ -883,13 +884,13 @@
           }
         },
         "node_modules/@babel/plugin-proposal-private-methods": {
    -      "version": "7.16.11",
    -      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.16.11.tgz",
    -      "integrity": "sha512-F/2uAkPlXDr8+BHpZvo19w3hLFKge+k75XUprE6jaqKxjGkSYcK+4c+bup5PdW/7W/Rpjwql7FTVEDW+fRAQsw==",
    +      "version": "7.17.12",
    +      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.17.12.tgz",
    +      "integrity": "sha512-SllXoxo19HmxhDWm3luPz+cPhtoTSKLJE9PXshsfrOzBqs60QP0r8OaJItrPhAj0d7mZMnNF0Y1UUggCDgMz1A==",
           "dev": true,
           "dependencies": {
    -        "@babel/helper-create-class-features-plugin": "^7.16.10",
    -        "@babel/helper-plugin-utils": "^7.16.7"
    +        "@babel/helper-create-class-features-plugin": "^7.17.12",
    +        "@babel/helper-plugin-utils": "^7.17.12"
           },
           "engines": {
             "node": ">=6.9.0"
    @@ -899,14 +900,14 @@
           }
         },
         "node_modules/@babel/plugin-proposal-private-property-in-object": {
    -      "version": "7.16.7",
    -      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.16.7.tgz",
    -      "integrity": "sha512-rMQkjcOFbm+ufe3bTZLyOfsOUOxyvLXZJCTARhJr+8UMSoZmqTe1K1BgkFcrW37rAchWg57yI69ORxiWvUINuQ==",
    +      "version": "7.17.12",
    +      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.17.12.tgz",
    +      "integrity": "sha512-/6BtVi57CJfrtDNKfK5b66ydK2J5pXUKBKSPD2G1whamMuEnZWgoOIfO8Vf9F/DoD4izBLD/Au4NMQfruzzykg==",
           "dev": true,
           "dependencies": {
             "@babel/helper-annotate-as-pure": "^7.16.7",
    -        "@babel/helper-create-class-features-plugin": "^7.16.7",
    -        "@babel/helper-plugin-utils": "^7.16.7",
    +        "@babel/helper-create-class-features-plugin": "^7.17.12",
    +        "@babel/helper-plugin-utils": "^7.17.12",
             "@babel/plugin-syntax-private-property-in-object": "^7.14.5"
           },
           "engines": {
    @@ -917,13 +918,13 @@
           }
         },
         "node_modules/@babel/plugin-proposal-unicode-property-regex": {
    -      "version": "7.16.7",
    -      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.16.7.tgz",
    -      "integrity": "sha512-QRK0YI/40VLhNVGIjRNAAQkEHws0cswSdFFjpFyt943YmJIU1da9uW63Iu6NFV6CxTZW5eTDCrwZUstBWgp/Rg==",
    +      "version": "7.17.12",
    +      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.17.12.tgz",
    +      "integrity": "sha512-Wb9qLjXf3ZazqXA7IvI7ozqRIXIGPtSo+L5coFmEkhTQK18ao4UDDD0zdTGAarmbLj2urpRwrc6893cu5Bfh0A==",
           "dev": true,
           "dependencies": {
    -        "@babel/helper-create-regexp-features-plugin": "^7.16.7",
    -        "@babel/helper-plugin-utils": "^7.16.7"
    +        "@babel/helper-create-regexp-features-plugin": "^7.17.12",
    +        "@babel/helper-plugin-utils": "^7.17.12"
           },
           "engines": {
             "node": ">=4"
    @@ -984,12 +985,12 @@
           }
         },
         "node_modules/@babel/plugin-syntax-decorators": {
    -      "version": "7.17.0",
    -      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.17.0.tgz",
    -      "integrity": "sha512-qWe85yCXsvDEluNP0OyeQjH63DlhAR3W7K9BxxU1MvbDb48tgBG+Ao6IJJ6smPDrrVzSQZrbF6donpkFBMcs3A==",
    +      "version": "7.17.12",
    +      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.17.12.tgz",
    +      "integrity": "sha512-D1Hz0qtGTza8K2xGyEdVNCYLdVHukAcbQr4K3/s6r/esadyEriZovpJimQOpu8ju4/jV8dW/1xdaE0UpDroidw==",
           "dev": true,
           "dependencies": {
    -        "@babel/helper-plugin-utils": "^7.16.7"
    +        "@babel/helper-plugin-utils": "^7.17.12"
           },
           "engines": {
             "node": ">=6.9.0"
    @@ -1023,12 +1024,27 @@
           }
         },
         "node_modules/@babel/plugin-syntax-flow": {
    -      "version": "7.16.7",
    -      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.16.7.tgz",
    -      "integrity": "sha512-UDo3YGQO0jH6ytzVwgSLv9i/CzMcUjbKenL67dTrAZPPv6GFAtDhe6jqnvmoKzC/7htNTohhos+onPtDMqJwaQ==",
    +      "version": "7.17.12",
    +      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.17.12.tgz",
    +      "integrity": "sha512-B8QIgBvkIG6G2jgsOHQUist7Sm0EBLDCx8sen072IwqNuzMegZNXrYnSv77cYzA8mLDZAfQYqsLIhimiP1s2HQ==",
           "dev": true,
           "dependencies": {
    -        "@babel/helper-plugin-utils": "^7.16.7"
    +        "@babel/helper-plugin-utils": "^7.17.12"
    +      },
    +      "engines": {
    +        "node": ">=6.9.0"
    +      },
    +      "peerDependencies": {
    +        "@babel/core": "^7.0.0-0"
    +      }
    +    },
    +    "node_modules/@babel/plugin-syntax-import-assertions": {
    +      "version": "7.17.12",
    +      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.17.12.tgz",
    +      "integrity": "sha512-n/loy2zkq9ZEM8tEOwON9wTQSTNDTDEz6NujPtJGLU7qObzT1N4c4YZZf8E6ATB2AjNQg/Ib2AIpO03EZaCehw==",
    +      "dev": true,
    +      "dependencies": {
    +        "@babel/helper-plugin-utils": "^7.17.12"
           },
           "engines": {
             "node": ">=6.9.0"
    @@ -1062,12 +1078,12 @@
           }
         },
         "node_modules/@babel/plugin-syntax-jsx": {
    -      "version": "7.16.7",
    -      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.16.7.tgz",
    -      "integrity": "sha512-Esxmk7YjA8QysKeT3VhTXvF6y77f/a91SIs4pWb4H2eWGQkCKFgQaG6hdoEVZtGsrAcb2K5BW66XsOErD4WU3Q==",
    +      "version": "7.17.12",
    +      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.17.12.tgz",
    +      "integrity": "sha512-spyY3E3AURfxh/RHtjx5j6hs8am5NbUBGfcZ2vB3uShSpZdQyXSf5rR5Mk76vbtlAZOelyVQ71Fg0x9SG4fsog==",
           "dev": true,
           "dependencies": {
    -        "@babel/helper-plugin-utils": "^7.16.7"
    +        "@babel/helper-plugin-utils": "^7.17.12"
           },
           "engines": {
             "node": ">=6.9.0"
    @@ -1179,12 +1195,12 @@
           }
         },
         "node_modules/@babel/plugin-syntax-typescript": {
    -      "version": "7.16.7",
    -      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.16.7.tgz",
    -      "integrity": "sha512-YhUIJHHGkqPgEcMYkPCKTyGUdoGKWtopIycQyjJH8OjvRgOYsXsaKehLVPScKJWAULPxMa4N1vCe6szREFlZ7A==",
    +      "version": "7.17.12",
    +      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.17.12.tgz",
    +      "integrity": "sha512-TYY0SXFiO31YXtNg3HtFwNJHjLsAyIIhAhNWkQ5whPPS7HWUFlg9z0Ta4qAQNjQbP1wsSt/oKkmZ/4/WWdMUpw==",
           "dev": true,
           "dependencies": {
    -        "@babel/helper-plugin-utils": "^7.16.7"
    +        "@babel/helper-plugin-utils": "^7.17.12"
           },
           "engines": {
             "node": ">=6.9.0"
    @@ -1194,12 +1210,12 @@
           }
         },
         "node_modules/@babel/plugin-transform-arrow-functions": {
    -      "version": "7.16.7",
    -      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.16.7.tgz",
    -      "integrity": "sha512-9ffkFFMbvzTvv+7dTp/66xvZAWASuPD5Tl9LK3Z9vhOmANo6j94rik+5YMBt4CwHVMWLWpMsriIc2zsa3WW3xQ==",
    +      "version": "7.17.12",
    +      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.17.12.tgz",
    +      "integrity": "sha512-PHln3CNi/49V+mza4xMwrg+WGYevSF1oaiXaC2EQfdp4HWlSjRsrDXWJiQBKpP7749u6vQ9mcry2uuFOv5CXvA==",
           "dev": true,
           "dependencies": {
    -        "@babel/helper-plugin-utils": "^7.16.7"
    +        "@babel/helper-plugin-utils": "^7.17.12"
           },
           "engines": {
             "node": ">=6.9.0"
    @@ -1209,13 +1225,13 @@
           }
         },
         "node_modules/@babel/plugin-transform-async-to-generator": {
    -      "version": "7.16.8",
    -      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.16.8.tgz",
    -      "integrity": "sha512-MtmUmTJQHCnyJVrScNzNlofQJ3dLFuobYn3mwOTKHnSCMtbNsqvF71GQmJfFjdrXSsAA7iysFmYWw4bXZ20hOg==",
    +      "version": "7.17.12",
    +      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.17.12.tgz",
    +      "integrity": "sha512-J8dbrWIOO3orDzir57NRsjg4uxucvhby0L/KZuGsWDj0g7twWK3g7JhJhOrXtuXiw8MeiSdJ3E0OW9H8LYEzLQ==",
           "dev": true,
           "dependencies": {
             "@babel/helper-module-imports": "^7.16.7",
    -        "@babel/helper-plugin-utils": "^7.16.7",
    +        "@babel/helper-plugin-utils": "^7.17.12",
             "@babel/helper-remap-async-to-generator": "^7.16.8"
           },
           "engines": {
    @@ -1241,12 +1257,12 @@
           }
         },
         "node_modules/@babel/plugin-transform-block-scoping": {
    -      "version": "7.16.7",
    -      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.16.7.tgz",
    -      "integrity": "sha512-ObZev2nxVAYA4bhyusELdo9hb3H+A56bxH3FZMbEImZFiEDYVHXQSJ1hQKFlDnlt8G9bBrCZ5ZpURZUrV4G5qQ==",
    +      "version": "7.18.4",
    +      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.18.4.tgz",
    +      "integrity": "sha512-+Hq10ye+jlvLEogSOtq4mKvtk7qwcUQ1f0Mrueai866C82f844Yom2cttfJdMdqRLTxWpsbfbkIkOIfovyUQXw==",
           "dev": true,
           "dependencies": {
    -        "@babel/helper-plugin-utils": "^7.16.7"
    +        "@babel/helper-plugin-utils": "^7.17.12"
           },
           "engines": {
             "node": ">=6.9.0"
    @@ -1256,17 +1272,17 @@
           }
         },
         "node_modules/@babel/plugin-transform-classes": {
    -      "version": "7.16.7",
    -      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.16.7.tgz",
    -      "integrity": "sha512-WY7og38SFAGYRe64BrjKf8OrE6ulEHtr5jEYaZMwox9KebgqPi67Zqz8K53EKk1fFEJgm96r32rkKZ3qA2nCWQ==",
    +      "version": "7.18.4",
    +      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.18.4.tgz",
    +      "integrity": "sha512-e42NSG2mlKWgxKUAD9EJJSkZxR67+wZqzNxLSpc51T8tRU5SLFHsPmgYR5yr7sdgX4u+iHA1C5VafJ6AyImV3A==",
           "dev": true,
           "dependencies": {
             "@babel/helper-annotate-as-pure": "^7.16.7",
    -        "@babel/helper-environment-visitor": "^7.16.7",
    -        "@babel/helper-function-name": "^7.16.7",
    +        "@babel/helper-environment-visitor": "^7.18.2",
    +        "@babel/helper-function-name": "^7.17.9",
             "@babel/helper-optimise-call-expression": "^7.16.7",
    -        "@babel/helper-plugin-utils": "^7.16.7",
    -        "@babel/helper-replace-supers": "^7.16.7",
    +        "@babel/helper-plugin-utils": "^7.17.12",
    +        "@babel/helper-replace-supers": "^7.18.2",
             "@babel/helper-split-export-declaration": "^7.16.7",
             "globals": "^11.1.0"
           },
    @@ -1287,12 +1303,12 @@
           }
         },
         "node_modules/@babel/plugin-transform-computed-properties": {
    -      "version": "7.16.7",
    -      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.16.7.tgz",
    -      "integrity": "sha512-gN72G9bcmenVILj//sv1zLNaPyYcOzUho2lIJBMh/iakJ9ygCo/hEF9cpGb61SCMEDxbbyBoVQxrt+bWKu5KGw==",
    +      "version": "7.17.12",
    +      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.17.12.tgz",
    +      "integrity": "sha512-a7XINeplB5cQUWMg1E/GI1tFz3LfK021IjV1rj1ypE+R7jHm+pIHmHl25VNkZxtx9uuYp7ThGk8fur1HHG7PgQ==",
           "dev": true,
           "dependencies": {
    -        "@babel/helper-plugin-utils": "^7.16.7"
    +        "@babel/helper-plugin-utils": "^7.17.12"
           },
           "engines": {
             "node": ">=6.9.0"
    @@ -1302,12 +1318,12 @@
           }
         },
         "node_modules/@babel/plugin-transform-destructuring": {
    -      "version": "7.17.7",
    -      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.17.7.tgz",
    -      "integrity": "sha512-XVh0r5yq9sLR4vZ6eVZe8FKfIcSgaTBxVBRSYokRj2qksf6QerYnTxz9/GTuKTH/n/HwLP7t6gtlybHetJ/6hQ==",
    +      "version": "7.18.0",
    +      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.18.0.tgz",
    +      "integrity": "sha512-Mo69klS79z6KEfrLg/1WkmVnB8javh75HX4pi2btjvlIoasuxilEyjtsQW6XPrubNd7AQy0MMaNIaQE4e7+PQw==",
           "dev": true,
           "dependencies": {
    -        "@babel/helper-plugin-utils": "^7.16.7"
    +        "@babel/helper-plugin-utils": "^7.17.12"
           },
           "engines": {
             "node": ">=6.9.0"
    @@ -1333,12 +1349,12 @@
           }
         },
         "node_modules/@babel/plugin-transform-duplicate-keys": {
    -      "version": "7.16.7",
    -      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.16.7.tgz",
    -      "integrity": "sha512-03DvpbRfvWIXyK0/6QiR1KMTWeT6OcQ7tbhjrXyFS02kjuX/mu5Bvnh5SDSWHxyawit2g5aWhKwI86EE7GUnTw==",
    +      "version": "7.17.12",
    +      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.17.12.tgz",
    +      "integrity": "sha512-EA5eYFUG6xeerdabina/xIoB95jJ17mAkR8ivx6ZSu9frKShBjpOGZPn511MTDTkiCO+zXnzNczvUM69YSf3Zw==",
           "dev": true,
           "dependencies": {
    -        "@babel/helper-plugin-utils": "^7.16.7"
    +        "@babel/helper-plugin-utils": "^7.17.12"
           },
           "engines": {
             "node": ">=6.9.0"
    @@ -1364,13 +1380,13 @@
           }
         },
         "node_modules/@babel/plugin-transform-flow-strip-types": {
    -      "version": "7.16.7",
    -      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.16.7.tgz",
    -      "integrity": "sha512-mzmCq3cNsDpZZu9FADYYyfZJIOrSONmHcop2XEKPdBNMa4PDC4eEvcOvzZaCNcjKu72v0XQlA5y1g58aLRXdYg==",
    +      "version": "7.17.12",
    +      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.17.12.tgz",
    +      "integrity": "sha512-g8cSNt+cHCpG/uunPQELdq/TeV3eg1OLJYwxypwHtAWo9+nErH3lQx9CSO2uI9lF74A0mR0t4KoMjs1snSgnTw==",
           "dev": true,
           "dependencies": {
    -        "@babel/helper-plugin-utils": "^7.16.7",
    -        "@babel/plugin-syntax-flow": "^7.16.7"
    +        "@babel/helper-plugin-utils": "^7.17.12",
    +        "@babel/plugin-syntax-flow": "^7.17.12"
           },
           "engines": {
             "node": ">=6.9.0"
    @@ -1380,12 +1396,12 @@
           }
         },
         "node_modules/@babel/plugin-transform-for-of": {
    -      "version": "7.16.7",
    -      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.16.7.tgz",
    -      "integrity": "sha512-/QZm9W92Ptpw7sjI9Nx1mbcsWz33+l8kuMIQnDwgQBG5s3fAfQvkRjQ7NqXhtNcKOnPkdICmUHyCaWW06HCsqg==",
    +      "version": "7.18.1",
    +      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.18.1.tgz",
    +      "integrity": "sha512-+TTB5XwvJ5hZbO8xvl2H4XaMDOAK57zF4miuC9qQJgysPNEAZZ9Z69rdF5LJkozGdZrjBIUAIyKUWRMmebI7vg==",
           "dev": true,
           "dependencies": {
    -        "@babel/helper-plugin-utils": "^7.16.7"
    +        "@babel/helper-plugin-utils": "^7.17.12"
           },
           "engines": {
             "node": ">=6.9.0"
    @@ -1412,12 +1428,12 @@
           }
         },
         "node_modules/@babel/plugin-transform-literals": {
    -      "version": "7.16.7",
    -      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.16.7.tgz",
    -      "integrity": "sha512-6tH8RTpTWI0s2sV6uq3e/C9wPo4PTqqZps4uF0kzQ9/xPLFQtipynvmT1g/dOfEJ+0EQsHhkQ/zyRId8J2b8zQ==",
    +      "version": "7.17.12",
    +      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.17.12.tgz",
    +      "integrity": "sha512-8iRkvaTjJciWycPIZ9k9duu663FT7VrBdNqNgxnVXEFwOIp55JWcZd23VBRySYbnS3PwQ3rGiabJBBBGj5APmQ==",
           "dev": true,
           "dependencies": {
    -        "@babel/helper-plugin-utils": "^7.16.7"
    +        "@babel/helper-plugin-utils": "^7.17.12"
           },
           "engines": {
             "node": ">=6.9.0"
    @@ -1442,13 +1458,13 @@
           }
         },
         "node_modules/@babel/plugin-transform-modules-amd": {
    -      "version": "7.16.7",
    -      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.16.7.tgz",
    -      "integrity": "sha512-KaaEtgBL7FKYwjJ/teH63oAmE3lP34N3kshz8mm4VMAw7U3PxjVwwUmxEFksbgsNUaO3wId9R2AVQYSEGRa2+g==",
    +      "version": "7.18.0",
    +      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.18.0.tgz",
    +      "integrity": "sha512-h8FjOlYmdZwl7Xm2Ug4iX2j7Qy63NANI+NQVWQzv6r25fqgg7k2dZl03p95kvqNclglHs4FZ+isv4p1uXMA+QA==",
           "dev": true,
           "dependencies": {
    -        "@babel/helper-module-transforms": "^7.16.7",
    -        "@babel/helper-plugin-utils": "^7.16.7",
    +        "@babel/helper-module-transforms": "^7.18.0",
    +        "@babel/helper-plugin-utils": "^7.17.12",
             "babel-plugin-dynamic-import-node": "^2.3.3"
           },
           "engines": {
    @@ -1459,14 +1475,14 @@
           }
         },
         "node_modules/@babel/plugin-transform-modules-commonjs": {
    -      "version": "7.17.7",
    -      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.17.7.tgz",
    -      "integrity": "sha512-ITPmR2V7MqioMJyrxUo2onHNC3e+MvfFiFIR0RP21d3PtlVb6sfzoxNKiphSZUOM9hEIdzCcZe83ieX3yoqjUA==",
    +      "version": "7.18.2",
    +      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.18.2.tgz",
    +      "integrity": "sha512-f5A865gFPAJAEE0K7F/+nm5CmAE3y8AWlMBG9unu5j9+tk50UQVK0QS8RNxSp7MJf0wh97uYyLWt3Zvu71zyOQ==",
           "dev": true,
           "dependencies": {
    -        "@babel/helper-module-transforms": "^7.17.7",
    -        "@babel/helper-plugin-utils": "^7.16.7",
    -        "@babel/helper-simple-access": "^7.17.7",
    +        "@babel/helper-module-transforms": "^7.18.0",
    +        "@babel/helper-plugin-utils": "^7.17.12",
    +        "@babel/helper-simple-access": "^7.18.2",
             "babel-plugin-dynamic-import-node": "^2.3.3"
           },
           "engines": {
    @@ -1477,14 +1493,14 @@
           }
         },
         "node_modules/@babel/plugin-transform-modules-systemjs": {
    -      "version": "7.17.8",
    -      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.17.8.tgz",
    -      "integrity": "sha512-39reIkMTUVagzgA5x88zDYXPCMT6lcaRKs1+S9K6NKBPErbgO/w/kP8GlNQTC87b412ZTlmNgr3k2JrWgHH+Bw==",
    +      "version": "7.18.5",
    +      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.18.5.tgz",
    +      "integrity": "sha512-SEewrhPpcqMF1V7DhnEbhVJLrC+nnYfe1E0piZMZXBpxi9WvZqWGwpsk7JYP7wPWeqaBh4gyKlBhHJu3uz5g4Q==",
           "dev": true,
           "dependencies": {
             "@babel/helper-hoist-variables": "^7.16.7",
    -        "@babel/helper-module-transforms": "^7.17.7",
    -        "@babel/helper-plugin-utils": "^7.16.7",
    +        "@babel/helper-module-transforms": "^7.18.0",
    +        "@babel/helper-plugin-utils": "^7.17.12",
             "@babel/helper-validator-identifier": "^7.16.7",
             "babel-plugin-dynamic-import-node": "^2.3.3"
           },
    @@ -1496,13 +1512,13 @@
           }
         },
         "node_modules/@babel/plugin-transform-modules-umd": {
    -      "version": "7.16.7",
    -      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.16.7.tgz",
    -      "integrity": "sha512-EMh7uolsC8O4xhudF2F6wedbSHm1HHZ0C6aJ7K67zcDNidMzVcxWdGr+htW9n21klm+bOn+Rx4CBsAntZd3rEQ==",
    +      "version": "7.18.0",
    +      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.18.0.tgz",
    +      "integrity": "sha512-d/zZ8I3BWli1tmROLxXLc9A6YXvGK8egMxHp+E/rRwMh1Kip0AP77VwZae3snEJ33iiWwvNv2+UIIhfalqhzZA==",
           "dev": true,
           "dependencies": {
    -        "@babel/helper-module-transforms": "^7.16.7",
    -        "@babel/helper-plugin-utils": "^7.16.7"
    +        "@babel/helper-module-transforms": "^7.18.0",
    +        "@babel/helper-plugin-utils": "^7.17.12"
           },
           "engines": {
             "node": ">=6.9.0"
    @@ -1512,12 +1528,13 @@
           }
         },
         "node_modules/@babel/plugin-transform-named-capturing-groups-regex": {
    -      "version": "7.16.8",
    -      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.16.8.tgz",
    -      "integrity": "sha512-j3Jw+n5PvpmhRR+mrgIh04puSANCk/T/UA3m3P1MjJkhlK906+ApHhDIqBQDdOgL/r1UYpz4GNclTXxyZrYGSw==",
    +      "version": "7.17.12",
    +      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.17.12.tgz",
    +      "integrity": "sha512-vWoWFM5CKaTeHrdUJ/3SIOTRV+MBVGybOC9mhJkaprGNt5demMymDW24yC74avb915/mIRe3TgNb/d8idvnCRA==",
           "dev": true,
           "dependencies": {
    -        "@babel/helper-create-regexp-features-plugin": "^7.16.7"
    +        "@babel/helper-create-regexp-features-plugin": "^7.17.12",
    +        "@babel/helper-plugin-utils": "^7.17.12"
           },
           "engines": {
             "node": ">=6.9.0"
    @@ -1527,12 +1544,12 @@
           }
         },
         "node_modules/@babel/plugin-transform-new-target": {
    -      "version": "7.16.7",
    -      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.16.7.tgz",
    -      "integrity": "sha512-xiLDzWNMfKoGOpc6t3U+etCE2yRnn3SM09BXqWPIZOBpL2gvVrBWUKnsJx0K/ADi5F5YC5f8APFfWrz25TdlGg==",
    +      "version": "7.18.5",
    +      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.18.5.tgz",
    +      "integrity": "sha512-TuRL5uGW4KXU6OsRj+mLp9BM7pO8e7SGNTEokQRRxHFkXYMFiy2jlKSZPFtI/mKORDzciH+hneskcSOp0gU8hg==",
           "dev": true,
           "dependencies": {
    -        "@babel/helper-plugin-utils": "^7.16.7"
    +        "@babel/helper-plugin-utils": "^7.17.12"
           },
           "engines": {
             "node": ">=6.9.0"
    @@ -1558,12 +1575,12 @@
           }
         },
         "node_modules/@babel/plugin-transform-parameters": {
    -      "version": "7.16.7",
    -      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.16.7.tgz",
    -      "integrity": "sha512-AT3MufQ7zZEhU2hwOA11axBnExW0Lszu4RL/tAlUJBuNoRak+wehQW8h6KcXOcgjY42fHtDxswuMhMjFEuv/aw==",
    +      "version": "7.17.12",
    +      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.17.12.tgz",
    +      "integrity": "sha512-6qW4rWo1cyCdq1FkYri7AHpauchbGLXpdwnYsfxFb+KtddHENfsY5JZb35xUwkK5opOLcJ3BNd2l7PhRYGlwIA==",
           "dev": true,
           "dependencies": {
    -        "@babel/helper-plugin-utils": "^7.16.7"
    +        "@babel/helper-plugin-utils": "^7.17.12"
           },
           "engines": {
             "node": ">=6.9.0"
    @@ -1588,12 +1605,12 @@
           }
         },
         "node_modules/@babel/plugin-transform-react-constant-elements": {
    -      "version": "7.17.6",
    -      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.17.6.tgz",
    -      "integrity": "sha512-OBv9VkyyKtsHZiHLoSfCn+h6yU7YKX8nrs32xUmOa1SRSk+t03FosB6fBZ0Yz4BpD1WV7l73Nsad+2Tz7APpqw==",
    +      "version": "7.17.12",
    +      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.17.12.tgz",
    +      "integrity": "sha512-maEkX2xs2STuv2Px8QuqxqjhV2LsFobT1elCgyU5704fcyTu9DyD/bJXxD/mrRiVyhpHweOQ00OJ5FKhHq9oEw==",
           "dev": true,
           "dependencies": {
    -        "@babel/helper-plugin-utils": "^7.16.7"
    +        "@babel/helper-plugin-utils": "^7.17.12"
           },
           "engines": {
             "node": ">=6.9.0"
    @@ -1618,16 +1635,16 @@
           }
         },
         "node_modules/@babel/plugin-transform-react-jsx": {
    -      "version": "7.17.3",
    -      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.17.3.tgz",
    -      "integrity": "sha512-9tjBm4O07f7mzKSIlEmPdiE6ub7kfIe6Cd+w+oQebpATfTQMAgW+YOuWxogbKVTulA+MEO7byMeIUtQ1z+z+ZQ==",
    +      "version": "7.17.12",
    +      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.17.12.tgz",
    +      "integrity": "sha512-Lcaw8bxd1DKht3thfD4A12dqo1X16he1Lm8rIv8sTwjAYNInRS1qHa9aJoqvzpscItXvftKDCfaEQzwoVyXpEQ==",
           "dev": true,
           "dependencies": {
             "@babel/helper-annotate-as-pure": "^7.16.7",
             "@babel/helper-module-imports": "^7.16.7",
    -        "@babel/helper-plugin-utils": "^7.16.7",
    -        "@babel/plugin-syntax-jsx": "^7.16.7",
    -        "@babel/types": "^7.17.0"
    +        "@babel/helper-plugin-utils": "^7.17.12",
    +        "@babel/plugin-syntax-jsx": "^7.17.12",
    +        "@babel/types": "^7.17.12"
           },
           "engines": {
             "node": ">=6.9.0"
    @@ -1652,13 +1669,13 @@
           }
         },
         "node_modules/@babel/plugin-transform-react-pure-annotations": {
    -      "version": "7.16.7",
    -      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.16.7.tgz",
    -      "integrity": "sha512-hs71ToC97k3QWxswh2ElzMFABXHvGiJ01IB1TbYQDGeWRKWz/MPUTh5jGExdHvosYKpnJW5Pm3S4+TA3FyX+GA==",
    +      "version": "7.18.0",
    +      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.18.0.tgz",
    +      "integrity": "sha512-6+0IK6ouvqDn9bmEG7mEyF/pwlJXVj5lwydybpyyH3D0A7Hftk+NCTdYjnLNZksn261xaOV5ksmp20pQEmc2RQ==",
           "dev": true,
           "dependencies": {
             "@babel/helper-annotate-as-pure": "^7.16.7",
    -        "@babel/helper-plugin-utils": "^7.16.7"
    +        "@babel/helper-plugin-utils": "^7.17.12"
           },
           "engines": {
             "node": ">=6.9.0"
    @@ -1668,12 +1685,13 @@
           }
         },
         "node_modules/@babel/plugin-transform-regenerator": {
    -      "version": "7.16.7",
    -      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.16.7.tgz",
    -      "integrity": "sha512-mF7jOgGYCkSJagJ6XCujSQg+6xC1M77/03K2oBmVJWoFGNUtnVJO4WHKJk3dnPC8HCcj4xBQP1Egm8DWh3Pb3Q==",
    +      "version": "7.18.0",
    +      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.18.0.tgz",
    +      "integrity": "sha512-C8YdRw9uzx25HSIzwA7EM7YP0FhCe5wNvJbZzjVNHHPGVcDJ3Aie+qGYYdS1oVQgn+B3eAIJbWFLrJ4Jipv7nw==",
           "dev": true,
           "dependencies": {
    -        "regenerator-transform": "^0.14.2"
    +        "@babel/helper-plugin-utils": "^7.17.12",
    +        "regenerator-transform": "^0.15.0"
           },
           "engines": {
             "node": ">=6.9.0"
    @@ -1683,12 +1701,12 @@
           }
         },
         "node_modules/@babel/plugin-transform-reserved-words": {
    -      "version": "7.16.7",
    -      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.16.7.tgz",
    -      "integrity": "sha512-KQzzDnZ9hWQBjwi5lpY5v9shmm6IVG0U9pB18zvMu2i4H90xpT4gmqwPYsn8rObiadYe2M0gmgsiOIF5A/2rtg==",
    +      "version": "7.17.12",
    +      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.17.12.tgz",
    +      "integrity": "sha512-1KYqwbJV3Co03NIi14uEHW8P50Md6KqFgt0FfpHdK6oyAHQVTosgPuPSiWud1HX0oYJ1hGRRlk0fP87jFpqXZA==",
           "dev": true,
           "dependencies": {
    -        "@babel/helper-plugin-utils": "^7.16.7"
    +        "@babel/helper-plugin-utils": "^7.17.12"
           },
           "engines": {
             "node": ">=6.9.0"
    @@ -1698,13 +1716,13 @@
           }
         },
         "node_modules/@babel/plugin-transform-runtime": {
    -      "version": "7.17.0",
    -      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.17.0.tgz",
    -      "integrity": "sha512-fr7zPWnKXNc1xoHfrIU9mN/4XKX4VLZ45Q+oMhfsYIaHvg7mHgmhfOy/ckRWqDK7XF3QDigRpkh5DKq6+clE8A==",
    +      "version": "7.18.5",
    +      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.18.5.tgz",
    +      "integrity": "sha512-Q17hHxXr2fplrE+5BSC1j1Fo5cOA8YeP8XW3/1paI8MzF/faZGh0MaH1KC4jLAvqLPamQWHB5/B7KqSLY1kuHA==",
           "dev": true,
           "dependencies": {
             "@babel/helper-module-imports": "^7.16.7",
    -        "@babel/helper-plugin-utils": "^7.16.7",
    +        "@babel/helper-plugin-utils": "^7.17.12",
             "babel-plugin-polyfill-corejs2": "^0.3.0",
             "babel-plugin-polyfill-corejs3": "^0.5.0",
             "babel-plugin-polyfill-regenerator": "^0.3.0",
    @@ -1733,12 +1751,12 @@
           }
         },
         "node_modules/@babel/plugin-transform-spread": {
    -      "version": "7.16.7",
    -      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.16.7.tgz",
    -      "integrity": "sha512-+pjJpgAngb53L0iaA5gU/1MLXJIfXcYepLgXB3esVRf4fqmj8f2cxM3/FKaHsZms08hFQJkFccEWuIpm429TXg==",
    +      "version": "7.17.12",
    +      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.17.12.tgz",
    +      "integrity": "sha512-9pgmuQAtFi3lpNUstvG9nGfk9DkrdmWNp9KeKPFmuZCpEnxRzYlS8JgwPjYj+1AWDOSvoGN0H30p1cBOmT/Svg==",
           "dev": true,
           "dependencies": {
    -        "@babel/helper-plugin-utils": "^7.16.7",
    +        "@babel/helper-plugin-utils": "^7.17.12",
             "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0"
           },
           "engines": {
    @@ -1764,12 +1782,12 @@
           }
         },
         "node_modules/@babel/plugin-transform-template-literals": {
    -      "version": "7.16.7",
    -      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.16.7.tgz",
    -      "integrity": "sha512-VwbkDDUeenlIjmfNeDX/V0aWrQH2QiVyJtwymVQSzItFDTpxfyJh3EVaQiS0rIN/CqbLGr0VcGmuwyTdZtdIsA==",
    +      "version": "7.18.2",
    +      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.2.tgz",
    +      "integrity": "sha512-/cmuBVw9sZBGZVOMkpAEaVLwm4JmK2GZ1dFKOGGpMzEHWFmyZZ59lUU0PdRr8YNYeQdNzTDwuxP2X2gzydTc9g==",
           "dev": true,
           "dependencies": {
    -        "@babel/helper-plugin-utils": "^7.16.7"
    +        "@babel/helper-plugin-utils": "^7.17.12"
           },
           "engines": {
             "node": ">=6.9.0"
    @@ -1779,12 +1797,12 @@
           }
         },
         "node_modules/@babel/plugin-transform-typeof-symbol": {
    -      "version": "7.16.7",
    -      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.16.7.tgz",
    -      "integrity": "sha512-p2rOixCKRJzpg9JB4gjnG4gjWkWa89ZoYUnl9snJ1cWIcTH/hvxZqfO+WjG6T8DRBpctEol5jw1O5rA8gkCokQ==",
    +      "version": "7.17.12",
    +      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.17.12.tgz",
    +      "integrity": "sha512-Q8y+Jp7ZdtSPXCThB6zjQ74N3lj0f6TDh1Hnf5B+sYlzQ8i5Pjp8gW0My79iekSpT4WnI06blqP6DT0OmaXXmw==",
           "dev": true,
           "dependencies": {
    -        "@babel/helper-plugin-utils": "^7.16.7"
    +        "@babel/helper-plugin-utils": "^7.17.12"
           },
           "engines": {
             "node": ">=6.9.0"
    @@ -1794,14 +1812,14 @@
           }
         },
         "node_modules/@babel/plugin-transform-typescript": {
    -      "version": "7.16.8",
    -      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.16.8.tgz",
    -      "integrity": "sha512-bHdQ9k7YpBDO2d0NVfkj51DpQcvwIzIusJ7mEUaMlbZq3Kt/U47j24inXZHQ5MDiYpCs+oZiwnXyKedE8+q7AQ==",
    +      "version": "7.18.4",
    +      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.18.4.tgz",
    +      "integrity": "sha512-l4vHuSLUajptpHNEOUDEGsnpl9pfRLsN1XUoDQDD/YBuXTM+v37SHGS+c6n4jdcZy96QtuUuSvZYMLSSsjH8Mw==",
           "dev": true,
           "dependencies": {
    -        "@babel/helper-create-class-features-plugin": "^7.16.7",
    -        "@babel/helper-plugin-utils": "^7.16.7",
    -        "@babel/plugin-syntax-typescript": "^7.16.7"
    +        "@babel/helper-create-class-features-plugin": "^7.18.0",
    +        "@babel/helper-plugin-utils": "^7.17.12",
    +        "@babel/plugin-syntax-typescript": "^7.17.12"
           },
           "engines": {
             "node": ">=6.9.0"
    @@ -1842,37 +1860,38 @@
           }
         },
         "node_modules/@babel/preset-env": {
    -      "version": "7.16.11",
    -      "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.16.11.tgz",
    -      "integrity": "sha512-qcmWG8R7ZW6WBRPZK//y+E3Cli151B20W1Rv7ln27vuPaXU/8TKms6jFdiJtF7UDTxcrb7mZd88tAeK9LjdT8g==",
    +      "version": "7.18.2",
    +      "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.18.2.tgz",
    +      "integrity": "sha512-PfpdxotV6afmXMU47S08F9ZKIm2bJIQ0YbAAtDfIENX7G1NUAXigLREh69CWDjtgUy7dYn7bsMzkgdtAlmS68Q==",
           "dev": true,
           "dependencies": {
    -        "@babel/compat-data": "^7.16.8",
    -        "@babel/helper-compilation-targets": "^7.16.7",
    -        "@babel/helper-plugin-utils": "^7.16.7",
    +        "@babel/compat-data": "^7.17.10",
    +        "@babel/helper-compilation-targets": "^7.18.2",
    +        "@babel/helper-plugin-utils": "^7.17.12",
             "@babel/helper-validator-option": "^7.16.7",
    -        "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.16.7",
    -        "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.16.7",
    -        "@babel/plugin-proposal-async-generator-functions": "^7.16.8",
    -        "@babel/plugin-proposal-class-properties": "^7.16.7",
    -        "@babel/plugin-proposal-class-static-block": "^7.16.7",
    +        "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.17.12",
    +        "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.17.12",
    +        "@babel/plugin-proposal-async-generator-functions": "^7.17.12",
    +        "@babel/plugin-proposal-class-properties": "^7.17.12",
    +        "@babel/plugin-proposal-class-static-block": "^7.18.0",
             "@babel/plugin-proposal-dynamic-import": "^7.16.7",
    -        "@babel/plugin-proposal-export-namespace-from": "^7.16.7",
    -        "@babel/plugin-proposal-json-strings": "^7.16.7",
    -        "@babel/plugin-proposal-logical-assignment-operators": "^7.16.7",
    -        "@babel/plugin-proposal-nullish-coalescing-operator": "^7.16.7",
    +        "@babel/plugin-proposal-export-namespace-from": "^7.17.12",
    +        "@babel/plugin-proposal-json-strings": "^7.17.12",
    +        "@babel/plugin-proposal-logical-assignment-operators": "^7.17.12",
    +        "@babel/plugin-proposal-nullish-coalescing-operator": "^7.17.12",
             "@babel/plugin-proposal-numeric-separator": "^7.16.7",
    -        "@babel/plugin-proposal-object-rest-spread": "^7.16.7",
    +        "@babel/plugin-proposal-object-rest-spread": "^7.18.0",
             "@babel/plugin-proposal-optional-catch-binding": "^7.16.7",
    -        "@babel/plugin-proposal-optional-chaining": "^7.16.7",
    -        "@babel/plugin-proposal-private-methods": "^7.16.11",
    -        "@babel/plugin-proposal-private-property-in-object": "^7.16.7",
    -        "@babel/plugin-proposal-unicode-property-regex": "^7.16.7",
    +        "@babel/plugin-proposal-optional-chaining": "^7.17.12",
    +        "@babel/plugin-proposal-private-methods": "^7.17.12",
    +        "@babel/plugin-proposal-private-property-in-object": "^7.17.12",
    +        "@babel/plugin-proposal-unicode-property-regex": "^7.17.12",
             "@babel/plugin-syntax-async-generators": "^7.8.4",
             "@babel/plugin-syntax-class-properties": "^7.12.13",
             "@babel/plugin-syntax-class-static-block": "^7.14.5",
             "@babel/plugin-syntax-dynamic-import": "^7.8.3",
             "@babel/plugin-syntax-export-namespace-from": "^7.8.3",
    +        "@babel/plugin-syntax-import-assertions": "^7.17.12",
             "@babel/plugin-syntax-json-strings": "^7.8.3",
             "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4",
             "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3",
    @@ -1882,44 +1901,44 @@
             "@babel/plugin-syntax-optional-chaining": "^7.8.3",
             "@babel/plugin-syntax-private-property-in-object": "^7.14.5",
             "@babel/plugin-syntax-top-level-await": "^7.14.5",
    -        "@babel/plugin-transform-arrow-functions": "^7.16.7",
    -        "@babel/plugin-transform-async-to-generator": "^7.16.8",
    +        "@babel/plugin-transform-arrow-functions": "^7.17.12",
    +        "@babel/plugin-transform-async-to-generator": "^7.17.12",
             "@babel/plugin-transform-block-scoped-functions": "^7.16.7",
    -        "@babel/plugin-transform-block-scoping": "^7.16.7",
    -        "@babel/plugin-transform-classes": "^7.16.7",
    -        "@babel/plugin-transform-computed-properties": "^7.16.7",
    -        "@babel/plugin-transform-destructuring": "^7.16.7",
    +        "@babel/plugin-transform-block-scoping": "^7.17.12",
    +        "@babel/plugin-transform-classes": "^7.17.12",
    +        "@babel/plugin-transform-computed-properties": "^7.17.12",
    +        "@babel/plugin-transform-destructuring": "^7.18.0",
             "@babel/plugin-transform-dotall-regex": "^7.16.7",
    -        "@babel/plugin-transform-duplicate-keys": "^7.16.7",
    +        "@babel/plugin-transform-duplicate-keys": "^7.17.12",
             "@babel/plugin-transform-exponentiation-operator": "^7.16.7",
    -        "@babel/plugin-transform-for-of": "^7.16.7",
    +        "@babel/plugin-transform-for-of": "^7.18.1",
             "@babel/plugin-transform-function-name": "^7.16.7",
    -        "@babel/plugin-transform-literals": "^7.16.7",
    +        "@babel/plugin-transform-literals": "^7.17.12",
             "@babel/plugin-transform-member-expression-literals": "^7.16.7",
    -        "@babel/plugin-transform-modules-amd": "^7.16.7",
    -        "@babel/plugin-transform-modules-commonjs": "^7.16.8",
    -        "@babel/plugin-transform-modules-systemjs": "^7.16.7",
    -        "@babel/plugin-transform-modules-umd": "^7.16.7",
    -        "@babel/plugin-transform-named-capturing-groups-regex": "^7.16.8",
    -        "@babel/plugin-transform-new-target": "^7.16.7",
    +        "@babel/plugin-transform-modules-amd": "^7.18.0",
    +        "@babel/plugin-transform-modules-commonjs": "^7.18.2",
    +        "@babel/plugin-transform-modules-systemjs": "^7.18.0",
    +        "@babel/plugin-transform-modules-umd": "^7.18.0",
    +        "@babel/plugin-transform-named-capturing-groups-regex": "^7.17.12",
    +        "@babel/plugin-transform-new-target": "^7.17.12",
             "@babel/plugin-transform-object-super": "^7.16.7",
    -        "@babel/plugin-transform-parameters": "^7.16.7",
    +        "@babel/plugin-transform-parameters": "^7.17.12",
             "@babel/plugin-transform-property-literals": "^7.16.7",
    -        "@babel/plugin-transform-regenerator": "^7.16.7",
    -        "@babel/plugin-transform-reserved-words": "^7.16.7",
    +        "@babel/plugin-transform-regenerator": "^7.18.0",
    +        "@babel/plugin-transform-reserved-words": "^7.17.12",
             "@babel/plugin-transform-shorthand-properties": "^7.16.7",
    -        "@babel/plugin-transform-spread": "^7.16.7",
    +        "@babel/plugin-transform-spread": "^7.17.12",
             "@babel/plugin-transform-sticky-regex": "^7.16.7",
    -        "@babel/plugin-transform-template-literals": "^7.16.7",
    -        "@babel/plugin-transform-typeof-symbol": "^7.16.7",
    +        "@babel/plugin-transform-template-literals": "^7.18.2",
    +        "@babel/plugin-transform-typeof-symbol": "^7.17.12",
             "@babel/plugin-transform-unicode-escapes": "^7.16.7",
             "@babel/plugin-transform-unicode-regex": "^7.16.7",
             "@babel/preset-modules": "^0.1.5",
    -        "@babel/types": "^7.16.8",
    +        "@babel/types": "^7.18.2",
             "babel-plugin-polyfill-corejs2": "^0.3.0",
             "babel-plugin-polyfill-corejs3": "^0.5.0",
             "babel-plugin-polyfill-regenerator": "^0.3.0",
    -        "core-js-compat": "^3.20.2",
    +        "core-js-compat": "^3.22.1",
             "semver": "^6.3.0"
           },
           "engines": {
    @@ -1946,15 +1965,15 @@
           }
         },
         "node_modules/@babel/preset-react": {
    -      "version": "7.16.7",
    -      "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.16.7.tgz",
    -      "integrity": "sha512-fWpyI8UM/HE6DfPBzD8LnhQ/OcH8AgTaqcqP2nGOXEUV+VKBR5JRN9hCk9ai+zQQ57vtm9oWeXguBCPNUjytgA==",
    +      "version": "7.17.12",
    +      "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.17.12.tgz",
    +      "integrity": "sha512-h5U+rwreXtZaRBEQhW1hOJLMq8XNJBQ/9oymXiCXTuT/0uOwpbT0gUt+sXeOqoXBgNuUKI7TaObVwoEyWkpFgA==",
           "dev": true,
           "dependencies": {
    -        "@babel/helper-plugin-utils": "^7.16.7",
    +        "@babel/helper-plugin-utils": "^7.17.12",
             "@babel/helper-validator-option": "^7.16.7",
             "@babel/plugin-transform-react-display-name": "^7.16.7",
    -        "@babel/plugin-transform-react-jsx": "^7.16.7",
    +        "@babel/plugin-transform-react-jsx": "^7.17.12",
             "@babel/plugin-transform-react-jsx-development": "^7.16.7",
             "@babel/plugin-transform-react-pure-annotations": "^7.16.7"
           },
    @@ -1966,14 +1985,14 @@
           }
         },
         "node_modules/@babel/preset-typescript": {
    -      "version": "7.16.7",
    -      "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.16.7.tgz",
    -      "integrity": "sha512-WbVEmgXdIyvzB77AQjGBEyYPZx+8tTsO50XtfozQrkW8QB2rLJpH2lgx0TRw5EJrBxOZQ+wCcyPVQvS8tjEHpQ==",
    +      "version": "7.17.12",
    +      "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.17.12.tgz",
    +      "integrity": "sha512-S1ViF8W2QwAKUGJXxP9NAfNaqGDdEBJKpYkxHf5Yy2C4NPPzXGeR3Lhk7G8xJaaLcFTRfNjVbtbVtm8Gb0mqvg==",
           "dev": true,
           "dependencies": {
    -        "@babel/helper-plugin-utils": "^7.16.7",
    +        "@babel/helper-plugin-utils": "^7.17.12",
             "@babel/helper-validator-option": "^7.16.7",
    -        "@babel/plugin-transform-typescript": "^7.16.7"
    +        "@babel/plugin-transform-typescript": "^7.17.12"
           },
           "engines": {
             "node": ">=6.9.0"
    @@ -1983,9 +2002,9 @@
           }
         },
         "node_modules/@babel/runtime": {
    -      "version": "7.17.8",
    -      "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.17.8.tgz",
    -      "integrity": "sha512-dQpEpK0O9o6lj6oPu0gRDbbnk+4LeHlNcBpspf6Olzt3GIX4P1lWF1gS+pHLDFlaJvbR6q7jCfQ08zA4QJBnmA==",
    +      "version": "7.18.3",
    +      "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.18.3.tgz",
    +      "integrity": "sha512-38Y8f7YUhce/K7RMwTp7m0uCumpv9hZkitCbBClqQIow1qSbCvGkcegKOXpEWCQLfWmevgRiWokZ1GkpfhbZug==",
           "dependencies": {
             "regenerator-runtime": "^0.13.4"
           },
    @@ -1994,9 +2013,9 @@
           }
         },
         "node_modules/@babel/runtime-corejs3": {
    -      "version": "7.17.8",
    -      "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.17.8.tgz",
    -      "integrity": "sha512-ZbYSUvoSF6dXZmMl/CYTMOvzIFnbGfv4W3SEHYgMvNsFTeLaF2gkGAF4K2ddmtSK4Emej+0aYcnSC6N5dPCXUQ==",
    +      "version": "7.18.3",
    +      "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.18.3.tgz",
    +      "integrity": "sha512-l4ddFwrc9rnR+EJsHsh+TJ4A35YqQz/UqcjtlX2ov53hlJYG5CxtQmNZxyajwDVmCxwy++rtvGU5HazCK4W41Q==",
           "dev": true,
           "dependencies": {
             "core-js-pure": "^3.20.2",
    @@ -2021,19 +2040,19 @@
           }
         },
         "node_modules/@babel/traverse": {
    -      "version": "7.17.3",
    -      "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.17.3.tgz",
    -      "integrity": "sha512-5irClVky7TxRWIRtxlh2WPUUOLhcPN06AGgaQSB8AEwuyEBgJVuJ5imdHm5zxk8w0QS5T+tDfnDxAlhWjpb7cw==",
    +      "version": "7.18.5",
    +      "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.18.5.tgz",
    +      "integrity": "sha512-aKXj1KT66sBj0vVzk6rEeAO6Z9aiiQ68wfDgge3nHhA/my6xMM/7HGQUNumKZaoa2qUPQ5whJG9aAifsxUKfLA==",
           "dev": true,
           "dependencies": {
             "@babel/code-frame": "^7.16.7",
    -        "@babel/generator": "^7.17.3",
    -        "@babel/helper-environment-visitor": "^7.16.7",
    -        "@babel/helper-function-name": "^7.16.7",
    +        "@babel/generator": "^7.18.2",
    +        "@babel/helper-environment-visitor": "^7.18.2",
    +        "@babel/helper-function-name": "^7.17.9",
             "@babel/helper-hoist-variables": "^7.16.7",
             "@babel/helper-split-export-declaration": "^7.16.7",
    -        "@babel/parser": "^7.17.3",
    -        "@babel/types": "^7.17.0",
    +        "@babel/parser": "^7.18.5",
    +        "@babel/types": "^7.18.4",
             "debug": "^4.1.0",
             "globals": "^11.1.0"
           },
    @@ -2051,9 +2070,9 @@
           }
         },
         "node_modules/@babel/types": {
    -      "version": "7.17.0",
    -      "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.17.0.tgz",
    -      "integrity": "sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw==",
    +      "version": "7.18.4",
    +      "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.4.tgz",
    +      "integrity": "sha512-ThN1mBcMq5pG/Vm2IcBmPPfyPXbd8S02rS+OBIDENdufvqC7Z/jHPCv9IcP01277aKtDI8g/2XysBN4hA8niiw==",
           "dev": true,
           "dependencies": {
             "@babel/helper-validator-identifier": "^7.16.7",
    @@ -2070,221 +2089,105 @@
           "dev": true
         },
         "node_modules/@codemirror/autocomplete": {
    -      "version": "0.19.15",
    -      "resolved": "https://registry.npmjs.org/@codemirror/autocomplete/-/autocomplete-0.19.15.tgz",
    -      "integrity": "sha512-GQWzvvuXxNUyaEk+5gawbAD8s51/v2Chb++nx0e2eGWrphWk42isBtzOMdc3DxrxrZtPZ55q2ldNp+6G8KJLIQ==",
    -      "dependencies": {
    -        "@codemirror/language": "^0.19.0",
    -        "@codemirror/state": "^0.19.4",
    -        "@codemirror/text": "^0.19.2",
    -        "@codemirror/tooltip": "^0.19.12",
    -        "@codemirror/view": "^0.19.0",
    -        "@lezer/common": "^0.15.0"
    -      }
    -    },
    -    "node_modules/@codemirror/closebrackets": {
    -      "version": "0.19.1",
    -      "resolved": "https://registry.npmjs.org/@codemirror/closebrackets/-/closebrackets-0.19.1.tgz",
    -      "integrity": "sha512-ZiLXT6u+VuBK5QnfBbt/Vmfd9Pg6449wn1DIOWFZHUOldg5eFn3VGGjYY2XWuHQz5WuK+7dXamV2KE885O1gyA==",
    +      "version": "6.0.1",
    +      "resolved": "https://registry.npmjs.org/@codemirror/autocomplete/-/autocomplete-6.0.1.tgz",
    +      "integrity": "sha512-cD1MxuZq4scpVHecqSnUqQfRYlFDdtu4Y+7G4gF989R4F9nzrcrZ58bVua1/kIh0JminbhwqXeWXI/A5bScXaA==",
           "dependencies": {
    -        "@codemirror/language": "^0.19.0",
    -        "@codemirror/rangeset": "^0.19.0",
    -        "@codemirror/state": "^0.19.2",
    -        "@codemirror/text": "^0.19.0",
    -        "@codemirror/view": "^0.19.44"
    +        "@codemirror/language": "^6.0.0",
    +        "@codemirror/state": "^6.0.0",
    +        "@codemirror/view": "^6.0.0",
    +        "@lezer/common": "^1.0.0"
           }
         },
         "node_modules/@codemirror/commands": {
    -      "version": "0.19.8",
    -      "resolved": "https://registry.npmjs.org/@codemirror/commands/-/commands-0.19.8.tgz",
    -      "integrity": "sha512-65LIMSGUGGpY3oH6mzV46YWRrgao6NmfJ+AuC7jNz3K5NPnH6GCV1H5I6SwOFyVbkiygGyd0EFwrWqywTBD1aw==",
    -      "dependencies": {
    -        "@codemirror/language": "^0.19.0",
    -        "@codemirror/matchbrackets": "^0.19.0",
    -        "@codemirror/state": "^0.19.2",
    -        "@codemirror/text": "^0.19.6",
    -        "@codemirror/view": "^0.19.22",
    -        "@lezer/common": "^0.15.0"
    -      }
    -    },
    -    "node_modules/@codemirror/comment": {
    -      "version": "0.19.1",
    -      "resolved": "https://registry.npmjs.org/@codemirror/comment/-/comment-0.19.1.tgz",
    -      "integrity": "sha512-uGKteBuVWAC6fW+Yt8u27DOnXMT/xV4Ekk2Z5mRsiADCZDqYvryrJd6PLL5+8t64BVyocwQwNfz1UswYS2CtFQ==",
    -      "dependencies": {
    -        "@codemirror/state": "^0.19.9",
    -        "@codemirror/text": "^0.19.0",
    -        "@codemirror/view": "^0.19.0"
    -      }
    -    },
    -    "node_modules/@codemirror/gutter": {
    -      "version": "0.19.9",
    -      "resolved": "https://registry.npmjs.org/@codemirror/gutter/-/gutter-0.19.9.tgz",
    -      "integrity": "sha512-PFrtmilahin1g6uL27aG5tM/rqR9DZzZYZsIrCXA5Uc2OFTFqx4owuhoU9hqfYxHp5ovfvBwQ+txFzqS4vog6Q==",
    -      "dependencies": {
    -        "@codemirror/rangeset": "^0.19.0",
    -        "@codemirror/state": "^0.19.0",
    -        "@codemirror/view": "^0.19.23"
    -      }
    -    },
    -    "node_modules/@codemirror/highlight": {
    -      "version": "0.19.8",
    -      "resolved": "https://registry.npmjs.org/@codemirror/highlight/-/highlight-0.19.8.tgz",
    -      "integrity": "sha512-v/lzuHjrYR8MN2mEJcUD6fHSTXXli9C1XGYpr+ElV6fLBIUhMTNKR3qThp611xuWfXfwDxeL7ppcbkM/MzPV3A==",
    -      "dependencies": {
    -        "@codemirror/language": "^0.19.0",
    -        "@codemirror/rangeset": "^0.19.0",
    -        "@codemirror/state": "^0.19.3",
    -        "@codemirror/view": "^0.19.39",
    -        "@lezer/common": "^0.15.0",
    -        "style-mod": "^4.0.0"
    -      }
    -    },
    -    "node_modules/@codemirror/history": {
    -      "version": "0.19.2",
    -      "resolved": "https://registry.npmjs.org/@codemirror/history/-/history-0.19.2.tgz",
    -      "integrity": "sha512-unhP4t3N2smzmHoo/Yio6ueWi+il8gm9VKrvi6wlcdGH5fOfVDNkmjHQ495SiR+EdOG35+3iNebSPYww0vN7ow==",
    +      "version": "6.0.0",
    +      "resolved": "https://registry.npmjs.org/@codemirror/commands/-/commands-6.0.0.tgz",
    +      "integrity": "sha512-nVJDPiCQXWXj5AZxqNVXyIM3nOYauF4Dko9NGPSwgVdK+lXWJQhI5LGhS/AvdG5b7u7/pTQBkrQmzkLWRBF62A==",
           "dependencies": {
    -        "@codemirror/state": "^0.19.2",
    -        "@codemirror/view": "^0.19.0"
    +        "@codemirror/language": "^6.0.0",
    +        "@codemirror/state": "^6.0.0",
    +        "@codemirror/view": "^6.0.0",
    +        "@lezer/common": "^1.0.0"
           }
         },
         "node_modules/@codemirror/language": {
    -      "version": "0.19.10",
    -      "resolved": "https://registry.npmjs.org/@codemirror/language/-/language-0.19.10.tgz",
    -      "integrity": "sha512-yA0DZ3RYn2CqAAGW62VrU8c4YxscMQn45y/I9sjBlqB1e2OTQLg4CCkMBuMSLXk4xaqjlsgazeOQWaJQOKfV8Q==",
    -      "dependencies": {
    -        "@codemirror/state": "^0.19.0",
    -        "@codemirror/text": "^0.19.0",
    -        "@codemirror/view": "^0.19.0",
    -        "@lezer/common": "^0.15.5",
    -        "@lezer/lr": "^0.15.0"
    +      "version": "6.0.0",
    +      "resolved": "https://registry.npmjs.org/@codemirror/language/-/language-6.0.0.tgz",
    +      "integrity": "sha512-rtjk5ifyMzOna1c7PBu7J1VCt0PvA5wy3o8eMVnxMKb7z8KA7JFecvD04dSn14vj/bBaAbqRsGed5OjtofEnLA==",
    +      "dependencies": {
    +        "@codemirror/state": "^6.0.0",
    +        "@codemirror/view": "^6.0.0",
    +        "@lezer/common": "^1.0.0",
    +        "@lezer/highlight": "^1.0.0",
    +        "@lezer/lr": "^1.0.0",
    +        "style-mod": "^4.0.0"
           }
         },
         "node_modules/@codemirror/lint": {
    -      "version": "0.19.6",
    -      "resolved": "https://registry.npmjs.org/@codemirror/lint/-/lint-0.19.6.tgz",
    -      "integrity": "sha512-Pbw1Y5kHVs2J+itQ0uez3dI4qY9ApYVap7eNfV81x1/3/BXgBkKfadaw0gqJ4h4FDG7OnJwb0VbPsjJQllHjaA==",
    -      "dependencies": {
    -        "@codemirror/gutter": "^0.19.4",
    -        "@codemirror/panel": "^0.19.0",
    -        "@codemirror/rangeset": "^0.19.1",
    -        "@codemirror/state": "^0.19.4",
    -        "@codemirror/tooltip": "^0.19.16",
    -        "@codemirror/view": "^0.19.22",
    -        "crelt": "^1.0.5"
    -      }
    -    },
    -    "node_modules/@codemirror/matchbrackets": {
    -      "version": "0.19.4",
    -      "resolved": "https://registry.npmjs.org/@codemirror/matchbrackets/-/matchbrackets-0.19.4.tgz",
    -      "integrity": "sha512-VFkaOKPNudAA5sGP1zikRHCEKU0hjYmkKpr04pybUpQvfTvNJXlReCyP0rvH/1iEwAGPL990ZTT+QrLdu4MeEA==",
    -      "dependencies": {
    -        "@codemirror/language": "^0.19.0",
    -        "@codemirror/state": "^0.19.0",
    -        "@codemirror/view": "^0.19.0",
    -        "@lezer/common": "^0.15.0"
    -      }
    -    },
    -    "node_modules/@codemirror/panel": {
    -      "version": "0.19.1",
    -      "resolved": "https://registry.npmjs.org/@codemirror/panel/-/panel-0.19.1.tgz",
    -      "integrity": "sha512-sYeOCMA3KRYxZYJYn5PNlt9yNsjy3zTNTrbYSfVgjgL9QomIVgOJWPO5hZ2sTN8lufO6lw0vTBsIPL9MSidmBg==",
    -      "dependencies": {
    -        "@codemirror/state": "^0.19.0",
    -        "@codemirror/view": "^0.19.0"
    -      }
    -    },
    -    "node_modules/@codemirror/rangeset": {
    -      "version": "0.19.9",
    -      "resolved": "https://registry.npmjs.org/@codemirror/rangeset/-/rangeset-0.19.9.tgz",
    -      "integrity": "sha512-V8YUuOvK+ew87Xem+71nKcqu1SXd5QROMRLMS/ljT5/3MCxtgrRie1Cvild0G/Z2f1fpWxzX78V0U4jjXBorBQ==",
    +      "version": "6.0.0",
    +      "resolved": "https://registry.npmjs.org/@codemirror/lint/-/lint-6.0.0.tgz",
    +      "integrity": "sha512-nUUXcJW1Xp54kNs+a1ToPLK8MadO0rMTnJB8Zk4Z8gBdrN0kqV7uvUraU/T2yqg+grDNR38Vmy/MrhQN/RgwiA==",
           "dependencies": {
    -        "@codemirror/state": "^0.19.0"
    +        "@codemirror/state": "^6.0.0",
    +        "@codemirror/view": "^6.0.0",
    +        "crelt": "^1.0.5"
           }
         },
         "node_modules/@codemirror/search": {
    -      "version": "0.19.9",
    -      "resolved": "https://registry.npmjs.org/@codemirror/search/-/search-0.19.9.tgz",
    -      "integrity": "sha512-h3MuwbUbiyOp6Np3IB5r4LH0w4inZvbtLO1Ipmz8RhElcGRiYr11Q6Bim8ocLfe08RmZT6B5EkTj1E8eNlugQQ==",
    -      "dependencies": {
    -        "@codemirror/panel": "^0.19.0",
    -        "@codemirror/rangeset": "^0.19.0",
    -        "@codemirror/state": "^0.19.3",
    -        "@codemirror/text": "^0.19.0",
    -        "@codemirror/view": "^0.19.34",
    +      "version": "6.0.0",
    +      "resolved": "https://registry.npmjs.org/@codemirror/search/-/search-6.0.0.tgz",
    +      "integrity": "sha512-rL0rd3AhI0TAsaJPUaEwC63KHLO7KL0Z/dYozXj6E7L3wNHRyx7RfE0/j5HsIf912EE5n2PCb4Vg0rGYmDv4UQ==",
    +      "dependencies": {
    +        "@codemirror/state": "^6.0.0",
    +        "@codemirror/view": "^6.0.0",
             "crelt": "^1.0.5"
           }
         },
         "node_modules/@codemirror/state": {
    -      "version": "0.19.9",
    -      "resolved": "https://registry.npmjs.org/@codemirror/state/-/state-0.19.9.tgz",
    -      "integrity": "sha512-psOzDolKTZkx4CgUqhBQ8T8gBc0xN5z4gzed109aF6x7D7umpDRoimacI/O6d9UGuyl4eYuDCZmDFr2Rq7aGOw==",
    -      "dependencies": {
    -        "@codemirror/text": "^0.19.0"
    -      }
    -    },
    -    "node_modules/@codemirror/text": {
    -      "version": "0.19.6",
    -      "resolved": "https://registry.npmjs.org/@codemirror/text/-/text-0.19.6.tgz",
    -      "integrity": "sha512-T9jnREMIygx+TPC1bOuepz18maGq/92q2a+n4qTqObKwvNMg+8cMTslb8yxeEDEq7S3kpgGWxgO1UWbQRij0dA=="
    -    },
    -    "node_modules/@codemirror/tooltip": {
    -      "version": "0.19.16",
    -      "resolved": "https://registry.npmjs.org/@codemirror/tooltip/-/tooltip-0.19.16.tgz",
    -      "integrity": "sha512-zxKDHryUV5/RS45AQL+wOeN+i7/l81wK56OMnUPoTSzCWNITfxHn7BToDsjtrRKbzHqUxKYmBnn/4hPjpZ4WJQ==",
    -      "dependencies": {
    -        "@codemirror/state": "^0.19.0",
    -        "@codemirror/view": "^0.19.0"
    -      }
    +      "version": "6.0.0",
    +      "resolved": "https://registry.npmjs.org/@codemirror/state/-/state-6.0.0.tgz",
    +      "integrity": "sha512-UjP/jB2dz7B+1L+eiCm8YWhM1zBkFM2zUyp8hhtpvgmuOFmoWjwqHnICQmM34HNPBqMPcVY9ZcqJcOhDrB+dBQ=="
         },
         "node_modules/@codemirror/view": {
    -      "version": "0.19.48",
    -      "resolved": "https://registry.npmjs.org/@codemirror/view/-/view-0.19.48.tgz",
    -      "integrity": "sha512-0eg7D2Nz4S8/caetCTz61rK0tkHI17V/d15Jy0kLOT8dTLGGNJUponDnW28h2B6bERmPlVHKh8MJIr5OCp1nGw==",
    +      "version": "6.0.0",
    +      "resolved": "https://registry.npmjs.org/@codemirror/view/-/view-6.0.0.tgz",
    +      "integrity": "sha512-IdbZtg17jpLdNnetoPpSOMZNtsCEAexFNdG7tU6TlJkLQakaTNrzXiQEIx9oiZx3f1ql6Zbr8+qyLr/pkrmsng==",
           "dependencies": {
    -        "@codemirror/rangeset": "^0.19.5",
    -        "@codemirror/state": "^0.19.3",
    -        "@codemirror/text": "^0.19.0",
    +        "@codemirror/state": "^6.0.0",
             "style-mod": "^4.0.0",
             "w3c-keyname": "^2.2.4"
           }
         },
    -    "node_modules/@cspotcode/source-map-consumer": {
    -      "version": "0.8.0",
    -      "resolved": "https://registry.npmjs.org/@cspotcode/source-map-consumer/-/source-map-consumer-0.8.0.tgz",
    -      "integrity": "sha512-41qniHzTU8yAGbCp04ohlmSrZf8bkf/iJsl3V0dRGsQN/5GFfx+LbCSsCpp2gqrqjTVg/K6O8ycoV35JIwAzAg==",
    -      "dev": true,
    -      "optional": true,
    -      "peer": true,
    -      "engines": {
    -        "node": ">= 12"
    -      }
    +    "node_modules/@csstools/normalize.css": {
    +      "version": "12.0.0",
    +      "resolved": "https://registry.npmjs.org/@csstools/normalize.css/-/normalize.css-12.0.0.tgz",
    +      "integrity": "sha512-M0qqxAcwCsIVfpFQSlGN5XjXWu8l5JDZN+fPt1LeW5SZexQTgnaEvgXAY+CeygRw0EeppWHi12JxESWiWrB0Sg==",
    +      "dev": true
         },
    -    "node_modules/@cspotcode/source-map-support": {
    -      "version": "0.7.0",
    -      "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.7.0.tgz",
    -      "integrity": "sha512-X4xqRHqN8ACt2aHVe51OxeA2HjbcL4MqFqXkrmQszJ1NOUuUu5u6Vqx/0lZSVNku7velL5FC/s5uEAj1lsBMhA==",
    +    "node_modules/@csstools/postcss-cascade-layers": {
    +      "version": "1.0.3",
    +      "resolved": "https://registry.npmjs.org/@csstools/postcss-cascade-layers/-/postcss-cascade-layers-1.0.3.tgz",
    +      "integrity": "sha512-fvXP0+dcllGtRKAjA5n5tBr57xWQalKky09hSiXAZ9qqjHn0sDuQV2Jz0Y5zHRQ6iGrAjJZOf2+xQj3yuXfLwA==",
           "dev": true,
    -      "optional": true,
    -      "peer": true,
           "dependencies": {
    -        "@cspotcode/source-map-consumer": "0.8.0"
    +        "@csstools/selector-specificity": "^2.0.0",
    +        "postcss-selector-parser": "^6.0.10"
           },
           "engines": {
    -        "node": ">=12"
    +        "node": "^12 || ^14 || >=16"
    +      },
    +      "funding": {
    +        "type": "opencollective",
    +        "url": "https://opencollective.com/csstools"
    +      },
    +      "peerDependencies": {
    +        "postcss": "^8.3"
           }
         },
    -    "node_modules/@csstools/normalize.css": {
    -      "version": "12.0.0",
    -      "resolved": "https://registry.npmjs.org/@csstools/normalize.css/-/normalize.css-12.0.0.tgz",
    -      "integrity": "sha512-M0qqxAcwCsIVfpFQSlGN5XjXWu8l5JDZN+fPt1LeW5SZexQTgnaEvgXAY+CeygRw0EeppWHi12JxESWiWrB0Sg==",
    -      "dev": true
    -    },
         "node_modules/@csstools/postcss-color-function": {
    -      "version": "1.0.3",
    -      "resolved": "https://registry.npmjs.org/@csstools/postcss-color-function/-/postcss-color-function-1.0.3.tgz",
    -      "integrity": "sha512-J26I69pT2B3MYiLY/uzCGKVJyMYVg9TCpXkWsRlt+Yfq+nELUEm72QXIMYXs4xA9cJA4Oqs2EylrfokKl3mJEQ==",
    +      "version": "1.1.0",
    +      "resolved": "https://registry.npmjs.org/@csstools/postcss-color-function/-/postcss-color-function-1.1.0.tgz",
    +      "integrity": "sha512-5D5ND/mZWcQoSfYnSPsXtuiFxhzmhxt6pcjrFLJyldj+p0ZN2vvRpYNX+lahFTtMhAYOa2WmkdGINr0yP0CvGA==",
           "dev": true,
           "dependencies": {
             "@csstools/postcss-progressive-custom-properties": "^1.1.0",
    @@ -2293,6 +2196,10 @@
           "engines": {
             "node": "^12 || ^14 || >=16"
           },
    +      "funding": {
    +        "type": "opencollective",
    +        "url": "https://opencollective.com/csstools"
    +      },
           "peerDependencies": {
             "postcss": "^8.4"
           }
    @@ -2313,9 +2220,9 @@
           }
         },
         "node_modules/@csstools/postcss-hwb-function": {
    -      "version": "1.0.0",
    -      "resolved": "https://registry.npmjs.org/@csstools/postcss-hwb-function/-/postcss-hwb-function-1.0.0.tgz",
    -      "integrity": "sha512-VSTd7hGjmde4rTj1rR30sokY3ONJph1reCBTUXqeW1fKwETPy1x4t/XIeaaqbMbC5Xg4SM/lyXZ2S8NELT2TaA==",
    +      "version": "1.0.1",
    +      "resolved": "https://registry.npmjs.org/@csstools/postcss-hwb-function/-/postcss-hwb-function-1.0.1.tgz",
    +      "integrity": "sha512-AMZwWyHbbNLBsDADWmoXT9A5yl5dsGEBeJSJRUJt8Y9n8Ziu7Wstt4MC8jtPW7xjcLecyfJwtnUTNSmOzcnWeg==",
           "dev": true,
           "dependencies": {
             "postcss-value-parser": "^4.2.0"
    @@ -2323,8 +2230,12 @@
           "engines": {
             "node": "^12 || ^14 || >=16"
           },
    +      "funding": {
    +        "type": "opencollective",
    +        "url": "https://opencollective.com/csstools"
    +      },
           "peerDependencies": {
    -        "postcss": "^8.3"
    +        "postcss": "^8.4"
           }
         },
         "node_modules/@csstools/postcss-ic-unit": {
    @@ -2344,16 +2255,21 @@
           }
         },
         "node_modules/@csstools/postcss-is-pseudo-class": {
    -      "version": "2.0.1",
    -      "resolved": "https://registry.npmjs.org/@csstools/postcss-is-pseudo-class/-/postcss-is-pseudo-class-2.0.1.tgz",
    -      "integrity": "sha512-Og5RrTzwFhrKoA79c3MLkfrIBYmwuf/X83s+JQtz/Dkk/MpsaKtqHV1OOzYkogQ+tj3oYp5Mq39XotBXNqVc3Q==",
    +      "version": "2.0.5",
    +      "resolved": "https://registry.npmjs.org/@csstools/postcss-is-pseudo-class/-/postcss-is-pseudo-class-2.0.5.tgz",
    +      "integrity": "sha512-Ek+UFI4UP2hB9u0N1cJd6KgSF1rL0J3PT4is0oSStuus8+WzbGGPyJNMOKQ0w/tyPjxiCnOI4RdSMZt3nks64g==",
           "dev": true,
           "dependencies": {
    -        "postcss-selector-parser": "^6.0.9"
    +        "@csstools/selector-specificity": "^2.0.0",
    +        "postcss-selector-parser": "^6.0.10"
           },
           "engines": {
             "node": "^12 || ^14 || >=16"
           },
    +      "funding": {
    +        "type": "opencollective",
    +        "url": "https://opencollective.com/csstools"
    +      },
           "peerDependencies": {
             "postcss": "^8.4"
           }
    @@ -2374,9 +2290,9 @@
           }
         },
         "node_modules/@csstools/postcss-oklab-function": {
    -      "version": "1.0.2",
    -      "resolved": "https://registry.npmjs.org/@csstools/postcss-oklab-function/-/postcss-oklab-function-1.0.2.tgz",
    -      "integrity": "sha512-QwhWesEkMlp4narAwUi6pgc6kcooh8cC7zfxa9LSQNYXqzcdNUtNBzbGc5nuyAVreb7uf5Ox4qH1vYT3GA1wOg==",
    +      "version": "1.1.0",
    +      "resolved": "https://registry.npmjs.org/@csstools/postcss-oklab-function/-/postcss-oklab-function-1.1.0.tgz",
    +      "integrity": "sha512-e/Q5HopQzmnQgqimG9v3w2IG4VRABsBq3itOcn4bnm+j4enTgQZ0nWsaH/m9GV2otWGQ0nwccYL5vmLKyvP1ww==",
           "dev": true,
           "dependencies": {
             "@csstools/postcss-progressive-custom-properties": "^1.1.0",
    @@ -2385,6 +2301,10 @@
           "engines": {
             "node": "^12 || ^14 || >=16"
           },
    +      "funding": {
    +        "type": "opencollective",
    +        "url": "https://opencollective.com/csstools"
    +      },
           "peerDependencies": {
             "postcss": "^8.4"
           }
    @@ -2404,28 +2324,99 @@
             "postcss": "^8.3"
           }
         },
    -    "node_modules/@eslint/eslintrc": {
    -      "version": "1.2.1",
    -      "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.2.1.tgz",
    -      "integrity": "sha512-bxvbYnBPN1Gibwyp6NrpnFzA3YtRL3BBAyEAFVIpNTm2Rn4Vy87GA5M4aSn3InRrlsbX5N0GW7XIx+U4SAEKdQ==",
    +    "node_modules/@csstools/postcss-stepped-value-functions": {
    +      "version": "1.0.0",
    +      "resolved": "https://registry.npmjs.org/@csstools/postcss-stepped-value-functions/-/postcss-stepped-value-functions-1.0.0.tgz",
    +      "integrity": "sha512-q8c4bs1GumAiRenmFjASBcWSLKrbzHzWl6C2HcaAxAXIiL2rUlUWbqQZUjwVG5tied0rld19j/Mm90K3qI26vw==",
           "dev": true,
           "dependencies": {
    -        "ajv": "^6.12.4",
    -        "debug": "^4.3.2",
    -        "espree": "^9.3.1",
    -        "globals": "^13.9.0",
    -        "ignore": "^5.2.0",
    -        "import-fresh": "^3.2.1",
    -        "js-yaml": "^4.1.0",
    -        "minimatch": "^3.0.4",
    -        "strip-json-comments": "^3.1.1"
    +        "postcss-value-parser": "^4.2.0"
           },
           "engines": {
    -        "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
    -      }
    -    },
    -    "node_modules/@forevolve/bootstrap-dark": {
    -      "version": "1.1.0",
    +        "node": "^12 || ^14 || >=16"
    +      },
    +      "funding": {
    +        "type": "opencollective",
    +        "url": "https://opencollective.com/csstools"
    +      },
    +      "peerDependencies": {
    +        "postcss": "^8.3"
    +      }
    +    },
    +    "node_modules/@csstools/postcss-trigonometric-functions": {
    +      "version": "1.0.1",
    +      "resolved": "https://registry.npmjs.org/@csstools/postcss-trigonometric-functions/-/postcss-trigonometric-functions-1.0.1.tgz",
    +      "integrity": "sha512-G78CY/+GePc6dDCTUbwI6TTFQ5fs3N9POHhI6v0QzteGpf6ylARiJUNz9HrRKi4eVYBNXjae1W2766iUEFxHlw==",
    +      "dev": true,
    +      "dependencies": {
    +        "postcss-value-parser": "^4.2.0"
    +      },
    +      "engines": {
    +        "node": "^14 || >=16"
    +      },
    +      "funding": {
    +        "type": "opencollective",
    +        "url": "https://opencollective.com/csstools"
    +      },
    +      "peerDependencies": {
    +        "postcss": "^8.4"
    +      }
    +    },
    +    "node_modules/@csstools/postcss-unset-value": {
    +      "version": "1.0.1",
    +      "resolved": "https://registry.npmjs.org/@csstools/postcss-unset-value/-/postcss-unset-value-1.0.1.tgz",
    +      "integrity": "sha512-f1G1WGDXEU/RN1TWAxBPQgQudtLnLQPyiWdtypkPC+mVYNKFKH/HYXSxH4MVNqwF8M0eDsoiU7HumJHCg/L/jg==",
    +      "dev": true,
    +      "engines": {
    +        "node": "^12 || ^14 || >=16"
    +      },
    +      "funding": {
    +        "type": "opencollective",
    +        "url": "https://opencollective.com/csstools"
    +      },
    +      "peerDependencies": {
    +        "postcss": "^8.3"
    +      }
    +    },
    +    "node_modules/@csstools/selector-specificity": {
    +      "version": "2.0.1",
    +      "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-2.0.1.tgz",
    +      "integrity": "sha512-aG20vknL4/YjQF9BSV7ts4EWm/yrjagAN7OWBNmlbEOUiu0llj4OGrFoOKK3g2vey4/p2omKCoHrWtPxSwV3HA==",
    +      "dev": true,
    +      "engines": {
    +        "node": "^12 || ^14 || >=16"
    +      },
    +      "funding": {
    +        "type": "opencollective",
    +        "url": "https://opencollective.com/csstools"
    +      },
    +      "peerDependencies": {
    +        "postcss": "^8.3",
    +        "postcss-selector-parser": "^6.0.10"
    +      }
    +    },
    +    "node_modules/@eslint/eslintrc": {
    +      "version": "1.3.0",
    +      "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.0.tgz",
    +      "integrity": "sha512-UWW0TMTmk2d7hLcWD1/e2g5HDM/HQ3csaLSqXCfqwh4uNDuNqlaKWXmEsL4Cs41Z0KnILNvwbHAah3C2yt06kw==",
    +      "dev": true,
    +      "dependencies": {
    +        "ajv": "^6.12.4",
    +        "debug": "^4.3.2",
    +        "espree": "^9.3.2",
    +        "globals": "^13.15.0",
    +        "ignore": "^5.2.0",
    +        "import-fresh": "^3.2.1",
    +        "js-yaml": "^4.1.0",
    +        "minimatch": "^3.1.2",
    +        "strip-json-comments": "^3.1.1"
    +      },
    +      "engines": {
    +        "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
    +      }
    +    },
    +    "node_modules/@forevolve/bootstrap-dark": {
    +      "version": "1.1.0",
           "resolved": "https://registry.npmjs.org/@forevolve/bootstrap-dark/-/bootstrap-dark-1.1.0.tgz",
           "integrity": "sha512-A3ucpEpxPoTVO490lZZCfjPXxv832l7mm1IxX3bXyxvgwnPGXDLyh7dWrphXKO8YBAu3EswbBEu3VSW8NRMW3A==",
           "dependencies": {
    @@ -2537,15 +2528,6 @@
             "sprintf-js": "~1.0.2"
           }
         },
    -    "node_modules/@istanbuljs/load-nyc-config/node_modules/camelcase": {
    -      "version": "5.3.1",
    -      "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
    -      "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
    -      "dev": true,
    -      "engines": {
    -        "node": ">=6"
    -      }
    -    },
         "node_modules/@istanbuljs/load-nyc-config/node_modules/find-up": {
           "version": "4.1.0",
           "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
    @@ -2801,13 +2783,16 @@
             }
           }
         },
    -    "node_modules/@jest/reporters/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==",
    +    "node_modules/@jest/schemas": {
    +      "version": "28.0.2",
    +      "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-28.0.2.tgz",
    +      "integrity": "sha512-YVDJZjd4izeTDkij00vHHAymNXQ6WWsdChFRK86qck6Jpr3DCL5W3Is3vslviRlP+bLuMYRLbdp98amMvqudhA==",
           "dev": true,
    +      "dependencies": {
    +        "@sinclair/typebox": "^0.23.3"
    +      },
           "engines": {
    -        "node": ">=0.10.0"
    +        "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0"
           }
         },
         "node_modules/@jest/source-map": {
    @@ -2824,15 +2809,6 @@
             "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
           }
         },
    -    "node_modules/@jest/source-map/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/@jest/test-result": {
           "version": "27.5.1",
           "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-27.5.1.tgz",
    @@ -2889,15 +2865,6 @@
             "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
           }
         },
    -    "node_modules/@jest/transform/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/@jest/types": {
           "version": "27.5.1",
           "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz",
    @@ -2914,61 +2881,121 @@
             "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
           }
         },
    +    "node_modules/@jridgewell/gen-mapping": {
    +      "version": "0.1.1",
    +      "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz",
    +      "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==",
    +      "dev": true,
    +      "dependencies": {
    +        "@jridgewell/set-array": "^1.0.0",
    +        "@jridgewell/sourcemap-codec": "^1.4.10"
    +      },
    +      "engines": {
    +        "node": ">=6.0.0"
    +      }
    +    },
         "node_modules/@jridgewell/resolve-uri": {
    -      "version": "3.0.5",
    -      "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.0.5.tgz",
    -      "integrity": "sha512-VPeQ7+wH0itvQxnG+lIzWgkysKIr3L9sslimFW55rHMdGu/qCQ5z5h9zq4gI8uBtqkpHhsF4Z/OwExufUCThew==",
    +      "version": "3.0.7",
    +      "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.0.7.tgz",
    +      "integrity": "sha512-8cXDaBBHOr2pQ7j77Y6Vp5VDT2sIqWyWQ56TjEq4ih/a4iST3dItRe8Q9fp0rrIl9DoKhWQtUQz/YpOxLkXbNA==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=6.0.0"
    +      }
    +    },
    +    "node_modules/@jridgewell/set-array": {
    +      "version": "1.1.1",
    +      "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.1.tgz",
    +      "integrity": "sha512-Ct5MqZkLGEXTVmQYbGtx9SVqD2fqwvdubdps5D3djjAkgkKwT918VNOz65pEHFaYTeWcukmJmH5SwsA9Tn2ObQ==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=6.0.0"
    +      }
    +    },
    +    "node_modules/@jridgewell/source-map": {
    +      "version": "0.3.2",
    +      "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.2.tgz",
    +      "integrity": "sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==",
    +      "dev": true,
    +      "dependencies": {
    +        "@jridgewell/gen-mapping": "^0.3.0",
    +        "@jridgewell/trace-mapping": "^0.3.9"
    +      }
    +    },
    +    "node_modules/@jridgewell/source-map/node_modules/@jridgewell/gen-mapping": {
    +      "version": "0.3.1",
    +      "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.1.tgz",
    +      "integrity": "sha512-GcHwniMlA2z+WFPWuY8lp3fsza0I8xPFMWL5+n8LYyP6PSvPrXf4+n8stDHZY2DM0zy9sVkRDy1jDI4XGzYVqg==",
           "dev": true,
    +      "dependencies": {
    +        "@jridgewell/set-array": "^1.0.0",
    +        "@jridgewell/sourcemap-codec": "^1.4.10",
    +        "@jridgewell/trace-mapping": "^0.3.9"
    +      },
           "engines": {
             "node": ">=6.0.0"
           }
         },
         "node_modules/@jridgewell/sourcemap-codec": {
    -      "version": "1.4.11",
    -      "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.11.tgz",
    -      "integrity": "sha512-Fg32GrJo61m+VqYSdRSjRXMjQ06j8YIYfcTqndLYVAaHmroZHLJZCydsWBOTDqXS2v+mjxohBWEMfg97GXmYQg==",
    +      "version": "1.4.13",
    +      "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.13.tgz",
    +      "integrity": "sha512-GryiOJmNcWbovBxTfZSF71V/mXbgcV3MewDe3kIMCLyIh5e7SKAeUZs+rMnJ8jkMolZ/4/VsdBmMrw3l+VdZ3w==",
           "dev": true
         },
         "node_modules/@jridgewell/trace-mapping": {
    -      "version": "0.3.4",
    -      "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.4.tgz",
    -      "integrity": "sha512-vFv9ttIedivx0ux3QSjhgtCVjPZd5l46ZOMDSCwnH1yUO2e964gO8LZGyv2QkqcgR6TnBU1v+1IFqmeoG+0UJQ==",
    +      "version": "0.3.13",
    +      "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.13.tgz",
    +      "integrity": "sha512-o1xbKhp9qnIAoHJSWd6KlCZfqslL4valSF81H8ImioOAxluWYWOpWkpyktY2vnt4tbrX9XYaxovq6cgowaJp2w==",
           "dev": true,
           "dependencies": {
             "@jridgewell/resolve-uri": "^3.0.3",
             "@jridgewell/sourcemap-codec": "^1.4.10"
           }
         },
    +    "node_modules/@leichtgewicht/ip-codec": {
    +      "version": "2.0.4",
    +      "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz",
    +      "integrity": "sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==",
    +      "dev": true
    +    },
         "node_modules/@lezer/common": {
    -      "version": "0.15.12",
    -      "resolved": "https://registry.npmjs.org/@lezer/common/-/common-0.15.12.tgz",
    -      "integrity": "sha512-edfwCxNLnzq5pBA/yaIhwJ3U3Kz8VAUOTRg0hhxaizaI1N+qxV7EXDv/kLCkLeq2RzSFvxexlaj5Mzfn2kY0Ig=="
    +      "version": "1.0.0",
    +      "resolved": "https://registry.npmjs.org/@lezer/common/-/common-1.0.0.tgz",
    +      "integrity": "sha512-ohydQe+Hb+w4oMDvXzs8uuJd2NoA3D8YDcLiuDsLqH+yflDTPEpgCsWI3/6rH5C3BAedtH1/R51dxENldQceEA=="
         },
         "node_modules/@lezer/generator": {
    -      "version": "0.15.4",
    -      "resolved": "https://registry.npmjs.org/@lezer/generator/-/generator-0.15.4.tgz",
    -      "integrity": "sha512-9bBwU2TzKMBQ6OCEDevuMNWGOBKlkq5YIGEhjrz9pb3MLb+oYYR4dVFZ7ehwLcDoSecsSA7PdlAy0thJO5pt2w==",
    +      "version": "1.0.0",
    +      "resolved": "https://registry.npmjs.org/@lezer/generator/-/generator-1.0.0.tgz",
    +      "integrity": "sha512-MgtTb9O2RxAn+WNfv8z9xOg7Q2orbChs9P3tHLUSBzvRL1PR2wiL/MKFpUnsYFG4mkcTTLkrkQgzUMVYa/ATfA==",
           "dev": true,
           "dependencies": {
    -        "@lezer/common": "^0.15.0",
    -        "@lezer/lr": "^0.15.0"
    +        "@lezer/common": "^1.0.0",
    +        "@lezer/lr": "^1.0.0"
           },
           "bin": {
             "lezer-generator": "dist/lezer-generator.cjs"
           }
         },
    +    "node_modules/@lezer/highlight": {
    +      "version": "1.0.0",
    +      "resolved": "https://registry.npmjs.org/@lezer/highlight/-/highlight-1.0.0.tgz",
    +      "integrity": "sha512-nsCnNtim90UKsB5YxoX65v3GEIw3iCHw9RM2DtdgkiqAbKh9pCdvi8AWNwkYf10Lu6fxNhXPpkpHbW6mihhvJA==",
    +      "dependencies": {
    +        "@lezer/common": "^1.0.0"
    +      }
    +    },
         "node_modules/@lezer/lr": {
    -      "version": "0.15.8",
    -      "resolved": "https://registry.npmjs.org/@lezer/lr/-/lr-0.15.8.tgz",
    -      "integrity": "sha512-bM6oE6VQZ6hIFxDNKk8bKPa14hqFrV07J/vHGOeiAbJReIaQXmkVb6xQu4MR+JBTLa5arGRyAAjJe1qaQt3Uvg==",
    +      "version": "1.0.0",
    +      "resolved": "https://registry.npmjs.org/@lezer/lr/-/lr-1.0.0.tgz",
    +      "integrity": "sha512-k6DEqBh4HxqO/cVGedb6Ern6LS7K6IOzfydJ5WaqCR26v6UR9sIFyb6PS+5rPUs/mXgnBR/QQCW7RkyjSCMoQA==",
           "dependencies": {
    -        "@lezer/common": "^0.15.0"
    +        "@lezer/common": "^1.0.0"
           }
         },
         "node_modules/@nexucis/fuzzy": {
    -      "version": "0.4.0",
    -      "resolved": "https://registry.npmjs.org/@nexucis/fuzzy/-/fuzzy-0.4.0.tgz",
    -      "integrity": "sha512-VZVzETBXJjFzTd5RmKR+X8V5uM9PKM2yyb7v/aygMF+1iAnZwxzQtxbFx358SNP23eid4s85TIREHw50p8Zugg=="
    +      "version": "0.4.1",
    +      "resolved": "https://registry.npmjs.org/@nexucis/fuzzy/-/fuzzy-0.4.1.tgz",
    +      "integrity": "sha512-oe+IW6ELwVGYL3340M+nKIT1exZizOjxdUFlTs36BqzxTENBbynG+cCWr4RNaUQF3bV78NspKwTBpTlnYADrTA=="
         },
         "node_modules/@nexucis/kvsearch": {
           "version": "0.7.0",
    @@ -3014,9 +3041,9 @@
           }
         },
         "node_modules/@pmmmwh/react-refresh-webpack-plugin": {
    -      "version": "0.5.4",
    -      "resolved": "https://registry.npmjs.org/@pmmmwh/react-refresh-webpack-plugin/-/react-refresh-webpack-plugin-0.5.4.tgz",
    -      "integrity": "sha512-zZbZeHQDnoTlt2AF+diQT0wsSXpvWiaIOZwBRdltNFhG1+I3ozyaw7U/nBiUwyJ0D+zwdXp0E3bWOl38Ag2BMw==",
    +      "version": "0.5.7",
    +      "resolved": "https://registry.npmjs.org/@pmmmwh/react-refresh-webpack-plugin/-/react-refresh-webpack-plugin-0.5.7.tgz",
    +      "integrity": "sha512-bcKCAzF0DV2IIROp9ZHkRJa6O4jy7NlnHdWL3GmcUxYWNjLXkK5kfELELwEfSP5hXPfVL/qOGMAROuMQb9GG8Q==",
           "dev": true,
           "dependencies": {
             "ansi-html-community": "^0.0.8",
    @@ -3134,9 +3161,9 @@
           }
         },
         "node_modules/@pmmmwh/react-refresh-webpack-plugin/node_modules/source-map": {
    -      "version": "0.7.3",
    -      "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz",
    -      "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==",
    +      "version": "0.7.4",
    +      "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz",
    +      "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==",
           "dev": true,
           "engines": {
             "node": ">= 8"
    @@ -3234,9 +3261,15 @@
           "dev": true
         },
         "node_modules/@rushstack/eslint-patch": {
    -      "version": "1.1.1",
    -      "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.1.1.tgz",
    -      "integrity": "sha512-BUyKJGdDWqvWC5GEhyOiUrGNi9iJUr4CU0O2WxJL6QJhHeeA/NVBalH+FeK0r/x/W0rPymXt5s78TDS7d6lCwg==",
    +      "version": "1.1.3",
    +      "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.1.3.tgz",
    +      "integrity": "sha512-WiBSI6JBIhC6LRIsB2Kwh8DsGTlbBU+mLRxJmAe3LjHTdkDpwIbEOZgoXBbZilk/vlfjK8i6nKRAvIRn1XaIMw==",
    +      "dev": true
    +    },
    +    "node_modules/@sinclair/typebox": {
    +      "version": "0.23.5",
    +      "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.23.5.tgz",
    +      "integrity": "sha512-AFBVi/iT4g20DHoujvMH1aEDn8fGJh4xsRGCP6d8RpLPMqsNPvW01Jcn0QysXTsg++/xj25NmJsGyH9xug/wKg==",
           "dev": true
         },
         "node_modules/@sinonjs/commons": {
    @@ -3431,6 +3464,18 @@
             "url": "https://github.com/sponsors/gregberge"
           }
         },
    +    "node_modules/@svgr/core/node_modules/camelcase": {
    +      "version": "6.3.0",
    +      "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz",
    +      "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=10"
    +      },
    +      "funding": {
    +        "url": "https://github.com/sponsors/sindresorhus"
    +      }
    +    },
         "node_modules/@svgr/hast-util-to-babel-ast": {
           "version": "5.5.0",
           "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-5.5.0.tgz",
    @@ -3554,38 +3599,6 @@
             "node": ">=10.13.0"
           }
         },
    -    "node_modules/@tsconfig/node10": {
    -      "version": "1.0.8",
    -      "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.8.tgz",
    -      "integrity": "sha512-6XFfSQmMgq0CFLY1MslA/CPUfhIL919M1rMsa5lP2P097N2Wd1sSX0tx1u4olM16fLNhtHZpRhedZJphNJqmZg==",
    -      "dev": true,
    -      "optional": true,
    -      "peer": true
    -    },
    -    "node_modules/@tsconfig/node12": {
    -      "version": "1.0.9",
    -      "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.9.tgz",
    -      "integrity": "sha512-/yBMcem+fbvhSREH+s14YJi18sp7J9jpuhYByADT2rypfajMZZN4WQ6zBGgBKp53NKmqI36wFYDb3yaMPurITw==",
    -      "dev": true,
    -      "optional": true,
    -      "peer": true
    -    },
    -    "node_modules/@tsconfig/node14": {
    -      "version": "1.0.1",
    -      "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.1.tgz",
    -      "integrity": "sha512-509r2+yARFfHHE7T6Puu2jjkoycftovhXRqW328PDXTVGKihlb1P8Z9mMZH04ebyajfRY7dedfGynlrFHJUQCg==",
    -      "dev": true,
    -      "optional": true,
    -      "peer": true
    -    },
    -    "node_modules/@tsconfig/node16": {
    -      "version": "1.0.2",
    -      "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.2.tgz",
    -      "integrity": "sha512-eZxlbI8GZscaGS7kkc/trHTT5xgrjH3/1n2JDwusC9iahPKWMRvRjJSAN5mCXviuTGQ/lHnhvv8Q1YTpnfz9gA==",
    -      "dev": true,
    -      "optional": true,
    -      "peer": true
    -    },
         "node_modules/@types/babel__core": {
           "version": "7.1.19",
           "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.19.tgz",
    @@ -3619,9 +3632,9 @@
           }
         },
         "node_modules/@types/babel__traverse": {
    -      "version": "7.14.2",
    -      "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.14.2.tgz",
    -      "integrity": "sha512-K2waXdXBi2302XUdcHcR1jCeU0LL4TD9HRs/gk0N2Xvrht+G/BfJa4QObBQZfhMdxiCpV3COl5Nfq4uKTeTnJA==",
    +      "version": "7.17.1",
    +      "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.17.1.tgz",
    +      "integrity": "sha512-kVzjari1s2YVi77D3w1yuvohV2idweYXMCDzqBiVNN63TcDWrIlTVOYpqVrvbbyOE/IyzBoTKF0fdnLPEORFxA==",
           "dev": true,
           "dependencies": {
             "@babel/types": "^7.3.0"
    @@ -3675,9 +3688,9 @@
           }
         },
         "node_modules/@types/enzyme": {
    -      "version": "3.10.11",
    -      "resolved": "https://registry.npmjs.org/@types/enzyme/-/enzyme-3.10.11.tgz",
    -      "integrity": "sha512-LEtC7zXsQlbGXWGcnnmOI7rTyP+i1QzQv4Va91RKXDEukLDaNyxu0rXlfMiGEhJwfgTPCTb0R+Pnlj//oM9e/w==",
    +      "version": "3.10.12",
    +      "resolved": "https://registry.npmjs.org/@types/enzyme/-/enzyme-3.10.12.tgz",
    +      "integrity": "sha512-xryQlOEIe1TduDWAOphR0ihfebKFSWOXpIsk+70JskCfRfW+xALdnJ0r1ZOTo85F9Qsjk6vtlU7edTYHbls9tA==",
           "dev": true,
           "dependencies": {
             "@types/cheerio": "*",
    @@ -3764,9 +3777,9 @@
           "dev": true
         },
         "node_modules/@types/http-proxy": {
    -      "version": "1.17.8",
    -      "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.8.tgz",
    -      "integrity": "sha512-5kPLG5BKpWYkw/LVOGWpiq3nEVqxiN32rTgI53Sk12/xHFQ2rG3ehI9IO+O3W2QoKeyB92dJkoka8SUm6BX1pA==",
    +      "version": "1.17.9",
    +      "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.9.tgz",
    +      "integrity": "sha512-QsbSjA/fSk7xB+UXlCT3wHBy5ai9wOcNDWwZAtud+jXhwOM3l+EYZh8Lng4+/6n8uar0J7xILzqftJdJ/Wdfkw==",
           "dependencies": {
             "@types/node": "*"
           }
    @@ -3796,9 +3809,9 @@
           }
         },
         "node_modules/@types/jest": {
    -      "version": "27.4.1",
    -      "resolved": "https://registry.npmjs.org/@types/jest/-/jest-27.4.1.tgz",
    -      "integrity": "sha512-23iPJADSmicDVrWk+HT58LMJtzLAnB2AgIzplQuq/bSrGaxCrlvRFjGbXmamnnk/mAmCdLStiGqggu28ocUyiw==",
    +      "version": "27.5.2",
    +      "resolved": "https://registry.npmjs.org/@types/jest/-/jest-27.5.2.tgz",
    +      "integrity": "sha512-mpT8LJJ4CMeeahobofYWIjFo0xonRS/HfxnVEPMPFSQdGUt1uHCnoPT7Zhb+sjDU2wz0oKV0OLUR0WzrHNgfeA==",
           "dev": true,
           "dependencies": {
             "jest-matcher-utils": "^27.0.0",
    @@ -3815,15 +3828,15 @@
           }
         },
         "node_modules/@types/json-schema": {
    -      "version": "7.0.10",
    -      "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.10.tgz",
    -      "integrity": "sha512-BLO9bBq59vW3fxCpD4o0N4U+DXsvwvIcl+jofw0frQo/GrBFC+/jRZj1E7kgp6dvTyNmA4y6JCV5Id/r3mNP5A==",
    +      "version": "7.0.11",
    +      "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz",
    +      "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==",
           "dev": true
         },
         "node_modules/@types/json5": {
           "version": "0.0.29",
           "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz",
    -      "integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=",
    +      "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==",
           "dev": true
         },
         "node_modules/@types/lru-cache": {
    @@ -3839,9 +3852,9 @@
           "devOptional": true
         },
         "node_modules/@types/node": {
    -      "version": "17.0.23",
    -      "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.23.tgz",
    -      "integrity": "sha512-UxDxWn7dl97rKVeVS61vErvw086aCYhDLyvRQZ5Rk65rZKepaFdm53GeqXaKBuOhED4e9uWq34IC3TdSdJJ2Gw=="
    +      "version": "17.0.42",
    +      "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.42.tgz",
    +      "integrity": "sha512-Q5BPGyGKcvQgAMbsr7qEGN/kIPN6zZecYYABeTDBizOsau+2NMdSVTar9UQw21A2+JyA2KRNDYaYrPB0Rpk2oQ=="
         },
         "node_modules/@types/parse-json": {
           "version": "4.0.0",
    @@ -3850,15 +3863,15 @@
           "dev": true
         },
         "node_modules/@types/prettier": {
    -      "version": "2.4.4",
    -      "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.4.4.tgz",
    -      "integrity": "sha512-ReVR2rLTV1kvtlWFyuot+d1pkpG2Fw/XKE3PDAdj57rbM97ttSp9JZ2UsP+2EHTylra9cUf6JA7tGwW1INzUrA==",
    +      "version": "2.6.3",
    +      "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.6.3.tgz",
    +      "integrity": "sha512-ymZk3LEC/fsut+/Q5qejp6R9O1rMxz3XaRHDV6kX8MrGAhOSPqVARbDi+EZvInBpw+BnCX3TD240byVkOfQsHg==",
           "dev": true
         },
         "node_modules/@types/prop-types": {
    -      "version": "15.7.4",
    -      "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.4.tgz",
    -      "integrity": "sha512-rZ5drC/jWjrArrS8BR6SIr4cWpW09RNTYt9AMZo3Jwwif+iacXAqgVjm0B0Bv/S1jhDXKHqRVNCbACkJ89RAnQ==",
    +      "version": "15.7.5",
    +      "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz",
    +      "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==",
           "dev": true
         },
         "node_modules/@types/q": {
    @@ -3880,9 +3893,9 @@
           "devOptional": true
         },
         "node_modules/@types/react": {
    -      "version": "17.0.41",
    -      "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.41.tgz",
    -      "integrity": "sha512-chYZ9ogWUodyC7VUTRBfblysKLjnohhFY9bGLwvnUFFy48+vB9DikmB3lW0qTFmBcKSzmdglcvkHK71IioOlDA==",
    +      "version": "17.0.45",
    +      "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.45.tgz",
    +      "integrity": "sha512-YfhQ22Lah2e3CHPsb93tRwIGNiSwkuz1/blk4e6QrWS0jQzCSNbGLtOEYhPg02W0yGTTmpajp7dCTbBAMN3qsg==",
           "dev": true,
           "dependencies": {
             "@types/prop-types": "*",
    @@ -3900,12 +3913,12 @@
           }
         },
         "node_modules/@types/react-dom": {
    -      "version": "17.0.14",
    -      "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-17.0.14.tgz",
    -      "integrity": "sha512-H03xwEP1oXmSfl3iobtmQ/2dHF5aBHr8aUMwyGZya6OW45G+xtdzmq6HkncefiBt5JU8DVyaWl/nWZbjZCnzAQ==",
    +      "version": "17.0.17",
    +      "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-17.0.17.tgz",
    +      "integrity": "sha512-VjnqEmqGnasQKV0CWLevqMTXBYG9GbwuE6x3VetERLh0cq2LTptFE73MrQi2S7GkKXCf2GgwItB/melLnxfnsg==",
           "dev": true,
           "dependencies": {
    -        "@types/react": "*"
    +        "@types/react": "^17"
           }
         },
         "node_modules/@types/react-resize-detector": {
    @@ -3940,9 +3953,9 @@
           }
         },
         "node_modules/@types/react-test-renderer": {
    -      "version": "17.0.1",
    -      "resolved": "https://registry.npmjs.org/@types/react-test-renderer/-/react-test-renderer-17.0.1.tgz",
    -      "integrity": "sha512-3Fi2O6Zzq/f3QR9dRnlnHso9bMl7weKCviFmfF6B4LS1Uat6Hkm15k0ZAQuDz+UBq6B3+g+NM6IT2nr5QgPzCw==",
    +      "version": "18.0.0",
    +      "resolved": "https://registry.npmjs.org/@types/react-test-renderer/-/react-test-renderer-18.0.0.tgz",
    +      "integrity": "sha512-C7/5FBJ3g3sqUahguGi03O79b8afNeSD6T8/GU50oQrJCU0bVCCGQHaGKUbg2Ce8VQEEqTw8/HiS6lXHHdgkdQ==",
           "dev": true,
           "dependencies": {
             "@types/react": "*"
    @@ -3963,9 +3976,9 @@
           }
         },
         "node_modules/@types/retry": {
    -      "version": "0.12.1",
    -      "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.1.tgz",
    -      "integrity": "sha512-xoDlM2S4ortawSWORYqsdU+2rxdh4LRW9ytc3zmT37RIKQh6IHyKwwtKhKis9ah8ol07DCkZxPt8BBvPjC6v4g==",
    +      "version": "0.12.0",
    +      "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz",
    +      "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==",
           "dev": true
         },
         "node_modules/@types/sanitize-html": {
    @@ -4012,9 +4025,9 @@
           }
         },
         "node_modules/@types/sinonjs__fake-timers": {
    -      "version": "8.1.1",
    -      "resolved": "https://registry.npmjs.org/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-8.1.1.tgz",
    -      "integrity": "sha512-0kSuKjAS0TrGLJ0M/+8MaFkGsQhZpB6pxOmvS3K8FYI72K//YmdfoW9X2qPsAKh1mkwxGD5zib9s1FIFed6E8g==",
    +      "version": "8.1.2",
    +      "resolved": "https://registry.npmjs.org/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-8.1.2.tgz",
    +      "integrity": "sha512-9GcLXF0/v3t80caGs5p2rRfkB+a8VBGLJZVih6CNFkx8IZ994wiKKLSRs9nuFwk1HevWs/1mnUmkApGrSGsShA==",
           "dev": true
         },
         "node_modules/@types/sizzle": {
    @@ -4069,19 +4082,19 @@
           "dev": true
         },
         "node_modules/@typescript-eslint/eslint-plugin": {
    -      "version": "5.16.0",
    -      "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.16.0.tgz",
    -      "integrity": "sha512-SJoba1edXvQRMmNI505Uo4XmGbxCK9ARQpkvOd00anxzri9RNQk0DDCxD+LIl+jYhkzOJiOMMKYEHnHEODjdCw==",
    +      "version": "5.27.1",
    +      "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.27.1.tgz",
    +      "integrity": "sha512-6dM5NKT57ZduNnJfpY81Phe9nc9wolnMCnknb1im6brWi1RYv84nbMS3olJa27B6+irUVV1X/Wb+Am0FjJdGFw==",
           "dev": true,
           "dependencies": {
    -        "@typescript-eslint/scope-manager": "5.16.0",
    -        "@typescript-eslint/type-utils": "5.16.0",
    -        "@typescript-eslint/utils": "5.16.0",
    -        "debug": "^4.3.2",
    +        "@typescript-eslint/scope-manager": "5.27.1",
    +        "@typescript-eslint/type-utils": "5.27.1",
    +        "@typescript-eslint/utils": "5.27.1",
    +        "debug": "^4.3.4",
             "functional-red-black-tree": "^1.0.1",
    -        "ignore": "^5.1.8",
    +        "ignore": "^5.2.0",
             "regexpp": "^3.2.0",
    -        "semver": "^7.3.5",
    +        "semver": "^7.3.7",
             "tsutils": "^3.21.0"
           },
           "engines": {
    @@ -4102,9 +4115,9 @@
           }
         },
         "node_modules/@typescript-eslint/eslint-plugin/node_modules/semver": {
    -      "version": "7.3.5",
    -      "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz",
    -      "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==",
    +      "version": "7.3.7",
    +      "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz",
    +      "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==",
           "dev": true,
           "dependencies": {
             "lru-cache": "^6.0.0"
    @@ -4117,12 +4130,12 @@
           }
         },
         "node_modules/@typescript-eslint/experimental-utils": {
    -      "version": "5.16.0",
    -      "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-5.16.0.tgz",
    -      "integrity": "sha512-bitZtqO13XX64/UOQKoDbVg2H4VHzbHnWWlTRc7ofq7SuQyPCwEycF1Zmn5ZAMTJZ3p5uMS7xJGUdOtZK7LrNw==",
    +      "version": "5.27.1",
    +      "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-5.27.1.tgz",
    +      "integrity": "sha512-Vd8uewIixGP93sEnmTRIH6jHZYRQRkGPDPpapACMvitJKX8335VHNyqKTE+mZ+m3E2c5VznTZfSsSsS5IF7vUA==",
           "dev": true,
           "dependencies": {
    -        "@typescript-eslint/utils": "5.16.0"
    +        "@typescript-eslint/utils": "5.27.1"
           },
           "engines": {
             "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
    @@ -4136,15 +4149,15 @@
           }
         },
         "node_modules/@typescript-eslint/parser": {
    -      "version": "5.16.0",
    -      "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.16.0.tgz",
    -      "integrity": "sha512-fkDq86F0zl8FicnJtdXakFs4lnuebH6ZADDw6CYQv0UZeIjHvmEw87m9/29nk2Dv5Lmdp0zQ3zDQhiMWQf/GbA==",
    +      "version": "5.27.1",
    +      "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.27.1.tgz",
    +      "integrity": "sha512-7Va2ZOkHi5NP+AZwb5ReLgNF6nWLGTeUJfxdkVUAPPSaAdbWNnFZzLZ4EGGmmiCTg+AwlbE1KyUYTBglosSLHQ==",
           "dev": true,
           "dependencies": {
    -        "@typescript-eslint/scope-manager": "5.16.0",
    -        "@typescript-eslint/types": "5.16.0",
    -        "@typescript-eslint/typescript-estree": "5.16.0",
    -        "debug": "^4.3.2"
    +        "@typescript-eslint/scope-manager": "5.27.1",
    +        "@typescript-eslint/types": "5.27.1",
    +        "@typescript-eslint/typescript-estree": "5.27.1",
    +        "debug": "^4.3.4"
           },
           "engines": {
             "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
    @@ -4163,13 +4176,13 @@
           }
         },
         "node_modules/@typescript-eslint/scope-manager": {
    -      "version": "5.16.0",
    -      "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.16.0.tgz",
    -      "integrity": "sha512-P+Yab2Hovg8NekLIR/mOElCDPyGgFZKhGoZA901Yax6WR6HVeGLbsqJkZ+Cvk5nts/dAlFKm8PfL43UZnWdpIQ==",
    +      "version": "5.27.1",
    +      "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.27.1.tgz",
    +      "integrity": "sha512-fQEOSa/QroWE6fAEg+bJxtRZJTH8NTskggybogHt4H9Da8zd4cJji76gA5SBlR0MgtwF7rebxTbDKB49YUCpAg==",
           "dev": true,
           "dependencies": {
    -        "@typescript-eslint/types": "5.16.0",
    -        "@typescript-eslint/visitor-keys": "5.16.0"
    +        "@typescript-eslint/types": "5.27.1",
    +        "@typescript-eslint/visitor-keys": "5.27.1"
           },
           "engines": {
             "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
    @@ -4180,13 +4193,13 @@
           }
         },
         "node_modules/@typescript-eslint/type-utils": {
    -      "version": "5.16.0",
    -      "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.16.0.tgz",
    -      "integrity": "sha512-SKygICv54CCRl1Vq5ewwQUJV/8padIWvPgCxlWPGO/OgQLCijY9G7lDu6H+mqfQtbzDNlVjzVWQmeqbLMBLEwQ==",
    +      "version": "5.27.1",
    +      "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.27.1.tgz",
    +      "integrity": "sha512-+UC1vVUWaDHRnC2cQrCJ4QtVjpjjCgjNFpg8b03nERmkHv9JV9X5M19D7UFMd+/G7T/sgFwX2pGmWK38rqyvXw==",
           "dev": true,
           "dependencies": {
    -        "@typescript-eslint/utils": "5.16.0",
    -        "debug": "^4.3.2",
    +        "@typescript-eslint/utils": "5.27.1",
    +        "debug": "^4.3.4",
             "tsutils": "^3.21.0"
           },
           "engines": {
    @@ -4206,9 +4219,9 @@
           }
         },
         "node_modules/@typescript-eslint/types": {
    -      "version": "5.16.0",
    -      "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.16.0.tgz",
    -      "integrity": "sha512-oUorOwLj/3/3p/HFwrp6m/J2VfbLC8gjW5X3awpQJ/bSG+YRGFS4dpsvtQ8T2VNveV+LflQHjlLvB6v0R87z4g==",
    +      "version": "5.27.1",
    +      "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.27.1.tgz",
    +      "integrity": "sha512-LgogNVkBhCTZU/m8XgEYIWICD6m4dmEDbKXESCbqOXfKZxRKeqpiJXQIErv66sdopRKZPo5l32ymNqibYEH/xg==",
           "dev": true,
           "engines": {
             "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
    @@ -4219,17 +4232,17 @@
           }
         },
         "node_modules/@typescript-eslint/typescript-estree": {
    -      "version": "5.16.0",
    -      "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.16.0.tgz",
    -      "integrity": "sha512-SE4VfbLWUZl9MR+ngLSARptUv2E8brY0luCdgmUevU6arZRY/KxYoLI/3V/yxaURR8tLRN7bmZtJdgmzLHI6pQ==",
    +      "version": "5.27.1",
    +      "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.27.1.tgz",
    +      "integrity": "sha512-DnZvvq3TAJ5ke+hk0LklvxwYsnXpRdqUY5gaVS0D4raKtbznPz71UJGnPTHEFo0GDxqLOLdMkkmVZjSpET1hFw==",
           "dev": true,
           "dependencies": {
    -        "@typescript-eslint/types": "5.16.0",
    -        "@typescript-eslint/visitor-keys": "5.16.0",
    -        "debug": "^4.3.2",
    -        "globby": "^11.0.4",
    +        "@typescript-eslint/types": "5.27.1",
    +        "@typescript-eslint/visitor-keys": "5.27.1",
    +        "debug": "^4.3.4",
    +        "globby": "^11.1.0",
             "is-glob": "^4.0.3",
    -        "semver": "^7.3.5",
    +        "semver": "^7.3.7",
             "tsutils": "^3.21.0"
           },
           "engines": {
    @@ -4246,9 +4259,9 @@
           }
         },
         "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": {
    -      "version": "7.3.5",
    -      "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz",
    -      "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==",
    +      "version": "7.3.7",
    +      "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz",
    +      "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==",
           "dev": true,
           "dependencies": {
             "lru-cache": "^6.0.0"
    @@ -4261,15 +4274,15 @@
           }
         },
         "node_modules/@typescript-eslint/utils": {
    -      "version": "5.16.0",
    -      "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.16.0.tgz",
    -      "integrity": "sha512-iYej2ER6AwmejLWMWzJIHy3nPJeGDuCqf8Jnb+jAQVoPpmWzwQOfa9hWVB8GIQE5gsCv/rfN4T+AYb/V06WseQ==",
    +      "version": "5.27.1",
    +      "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.27.1.tgz",
    +      "integrity": "sha512-mZ9WEn1ZLDaVrhRaYgzbkXBkTPghPFsup8zDbbsYTxC5OmqrFE7skkKS/sraVsLP3TcT3Ki5CSyEFBRkLH/H/w==",
           "dev": true,
           "dependencies": {
             "@types/json-schema": "^7.0.9",
    -        "@typescript-eslint/scope-manager": "5.16.0",
    -        "@typescript-eslint/types": "5.16.0",
    -        "@typescript-eslint/typescript-estree": "5.16.0",
    +        "@typescript-eslint/scope-manager": "5.27.1",
    +        "@typescript-eslint/types": "5.27.1",
    +        "@typescript-eslint/typescript-estree": "5.27.1",
             "eslint-scope": "^5.1.1",
             "eslint-utils": "^3.0.0"
           },
    @@ -4307,13 +4320,13 @@
           }
         },
         "node_modules/@typescript-eslint/visitor-keys": {
    -      "version": "5.16.0",
    -      "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.16.0.tgz",
    -      "integrity": "sha512-jqxO8msp5vZDhikTwq9ubyMHqZ67UIvawohr4qF3KhlpL7gzSjOd+8471H3nh5LyABkaI85laEKKU8SnGUK5/g==",
    +      "version": "5.27.1",
    +      "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.27.1.tgz",
    +      "integrity": "sha512-xYs6ffo01nhdJgPieyk7HAOpjhTsx7r/oB9LWEhwAXgwn33tkr+W8DI2ChboqhZlC4q3TC6geDYPoiX8ROqyOQ==",
           "dev": true,
           "dependencies": {
    -        "@typescript-eslint/types": "5.16.0",
    -        "eslint-visitor-keys": "^3.0.0"
    +        "@typescript-eslint/types": "5.27.1",
    +        "eslint-visitor-keys": "^3.3.0"
           },
           "engines": {
             "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
    @@ -4470,12 +4483,12 @@
           }
         },
         "node_modules/@wojtekmaj/enzyme-adapter-react-17": {
    -      "version": "0.6.6",
    -      "resolved": "https://registry.npmjs.org/@wojtekmaj/enzyme-adapter-react-17/-/enzyme-adapter-react-17-0.6.6.tgz",
    -      "integrity": "sha512-gSfhg8CiL0Vwc2UgUblGVZIy7M0KyXaZsd8+QwzV8TSVRLkGyzdLtYEcs9wRWyQTsdmOd+oRGqbVgUX7AVJxug==",
    +      "version": "0.6.7",
    +      "resolved": "https://registry.npmjs.org/@wojtekmaj/enzyme-adapter-react-17/-/enzyme-adapter-react-17-0.6.7.tgz",
    +      "integrity": "sha512-B+byiwi/T1bx5hcj9wc0fUL5Hlb5giSXJzcnEfJVl2j6dGV2NJfcxDBYX0WWwIxlzNiFz8kAvlkFWI2y/nscZQ==",
           "dev": true,
           "dependencies": {
    -        "@wojtekmaj/enzyme-adapter-utils": "^0.1.2",
    +        "@wojtekmaj/enzyme-adapter-utils": "^0.1.4",
             "enzyme-shallow-equal": "^1.0.0",
             "has": "^1.0.0",
             "prop-types": "^15.7.0",
    @@ -4516,9 +4529,9 @@
           "dev": true
         },
         "node_modules/abab": {
    -      "version": "2.0.5",
    -      "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.5.tgz",
    -      "integrity": "sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q==",
    +      "version": "2.0.6",
    +      "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz",
    +      "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==",
           "dev": true
         },
         "node_modules/accepts": {
    @@ -4535,9 +4548,9 @@
           }
         },
         "node_modules/acorn": {
    -      "version": "8.7.0",
    -      "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.0.tgz",
    -      "integrity": "sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ==",
    +      "version": "8.7.1",
    +      "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.1.tgz",
    +      "integrity": "sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A==",
           "dev": true,
           "bin": {
             "acorn": "bin/acorn"
    @@ -4619,12 +4632,12 @@
           }
         },
         "node_modules/address": {
    -      "version": "1.1.2",
    -      "resolved": "https://registry.npmjs.org/address/-/address-1.1.2.tgz",
    -      "integrity": "sha512-aT6camzM4xEA54YVJYSqxz1kv4IHnQZRtThJJHhUMRExaU5spC7jX5ugSwTaTgJliIgs4VhZOk7htClvQ/LmRA==",
    +      "version": "1.2.0",
    +      "resolved": "https://registry.npmjs.org/address/-/address-1.2.0.tgz",
    +      "integrity": "sha512-tNEZYz5G/zYunxFm7sfhAxkXEuLj3K6BKwv6ZURlsF6yiUQ65z0Q2wZW9L5cPUl9ocofGvXOdFYbFHp0+6MOig==",
           "dev": true,
           "engines": {
    -        "node": ">= 0.12.0"
    +        "node": ">= 10.0.0"
           }
         },
         "node_modules/adjust-sourcemap-loader": {
    @@ -4652,19 +4665,6 @@
             "node": ">= 6.0.0"
           }
         },
    -    "node_modules/aggregate-error": {
    -      "version": "3.1.0",
    -      "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz",
    -      "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==",
    -      "dev": true,
    -      "dependencies": {
    -        "clean-stack": "^2.0.0",
    -        "indent-string": "^4.0.0"
    -      },
    -      "engines": {
    -        "node": ">=8"
    -      }
    -    },
         "node_modules/ajv": {
           "version": "6.12.6",
           "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
    @@ -4699,9 +4699,9 @@
           }
         },
         "node_modules/ajv-formats/node_modules/ajv": {
    -      "version": "8.10.0",
    -      "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.10.0.tgz",
    -      "integrity": "sha512-bzqAEZOjkrUMl2afH8dknrq5KEk2SrwdBROR+vH1EKVQTqaUbJVPdc/gEdggTMM0Se+s+Ja4ju4TlNcStKl2Hw==",
    +      "version": "8.11.0",
    +      "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz",
    +      "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==",
           "dev": true,
           "dependencies": {
             "fast-deep-equal": "^3.1.1",
    @@ -4805,9 +4805,9 @@
           }
         },
         "node_modules/arg": {
    -      "version": "5.0.1",
    -      "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.1.tgz",
    -      "integrity": "sha512-e0hDa9H2Z9AwFkk2qDlwhoMYE4eToKarchkQHovNdLTCYMHZHeRjI71crOh+dio4K6u1IcwubQqo79Ga4CyAQA==",
    +      "version": "5.0.2",
    +      "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz",
    +      "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==",
           "dev": true
         },
         "node_modules/argparse": {
    @@ -4836,14 +4836,14 @@
           "dev": true
         },
         "node_modules/array-includes": {
    -      "version": "3.1.4",
    -      "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.4.tgz",
    -      "integrity": "sha512-ZTNSQkmWumEbiHO2GF4GmWxYVTiQyJy2XOTa15sdQSrvKn7l+180egQMqlrMOUMCyLMD7pmyQe4mMDUT6Behrw==",
    +      "version": "3.1.5",
    +      "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.5.tgz",
    +      "integrity": "sha512-iSDYZMMyTPkiFasVqfuAQnWAYcvO/SeBSCGKePoEthjp4LEMTe4uLc7b025o4jAZpHhihh8xPo99TNWUWWkGDQ==",
           "dev": true,
           "dependencies": {
             "call-bind": "^1.0.2",
    -        "define-properties": "^1.1.3",
    -        "es-abstract": "^1.19.1",
    +        "define-properties": "^1.1.4",
    +        "es-abstract": "^1.19.5",
             "get-intrinsic": "^1.1.1",
             "is-string": "^1.0.7"
           },
    @@ -4883,14 +4883,15 @@
           }
         },
         "node_modules/array.prototype.flat": {
    -      "version": "1.2.5",
    -      "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.5.tgz",
    -      "integrity": "sha512-KaYU+S+ndVqyUnignHftkwc58o3uVU1jzczILJ1tN2YaIZpFIKBiP/x/j97E5MVPsaCloPbqWLB/8qCTVvT2qg==",
    +      "version": "1.3.0",
    +      "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.0.tgz",
    +      "integrity": "sha512-12IUEkHsAhA4DY5s0FPgNXIdc8VRSqD9Zp78a5au9abH/SOBrsp082JOWFNTjkMozh8mqcdiKuaLGhPeYztxSw==",
           "dev": true,
           "dependencies": {
             "call-bind": "^1.0.2",
             "define-properties": "^1.1.3",
    -        "es-abstract": "^1.19.0"
    +        "es-abstract": "^1.19.2",
    +        "es-shim-unscopables": "^1.0.0"
           },
           "engines": {
             "node": ">= 0.4"
    @@ -4900,14 +4901,34 @@
           }
         },
         "node_modules/array.prototype.flatmap": {
    -      "version": "1.2.5",
    -      "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.2.5.tgz",
    -      "integrity": "sha512-08u6rVyi1Lj7oqWbS9nUxliETrtIROT4XGTA4D/LWGten6E3ocm7cy9SIrmNHOL5XVbVuckUp3X6Xyg8/zpvHA==",
    +      "version": "1.3.0",
    +      "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.0.tgz",
    +      "integrity": "sha512-PZC9/8TKAIxcWKdyeb77EzULHPrIX/tIZebLJUQOMR1OwYosT8yggdfWScfTBCDj5utONvOuPQQumYsU2ULbkg==",
           "dev": true,
           "dependencies": {
    -        "call-bind": "^1.0.0",
    +        "call-bind": "^1.0.2",
    +        "define-properties": "^1.1.3",
    +        "es-abstract": "^1.19.2",
    +        "es-shim-unscopables": "^1.0.0"
    +      },
    +      "engines": {
    +        "node": ">= 0.4"
    +      },
    +      "funding": {
    +        "url": "https://github.com/sponsors/ljharb"
    +      }
    +    },
    +    "node_modules/array.prototype.reduce": {
    +      "version": "1.0.4",
    +      "resolved": "https://registry.npmjs.org/array.prototype.reduce/-/array.prototype.reduce-1.0.4.tgz",
    +      "integrity": "sha512-WnM+AjG/DvLRLo4DDl+r+SvCzYtD2Jd9oeBYMcEaI7t3fFrHY9M53/wdLcTvmZNQ70IU6Htj0emFkZ5TS+lrdw==",
    +      "dev": true,
    +      "dependencies": {
    +        "call-bind": "^1.0.2",
             "define-properties": "^1.1.3",
    -        "es-abstract": "^1.19.0"
    +        "es-abstract": "^1.19.2",
    +        "es-array-method-boxes-properly": "^1.0.0",
    +        "is-string": "^1.0.7"
           },
           "engines": {
             "node": ">= 0.4"
    @@ -4919,28 +4940,25 @@
         "node_modules/asap": {
           "version": "2.0.6",
           "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz",
    -      "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=",
    +      "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==",
           "dev": true
         },
         "node_modules/ast-types-flow": {
           "version": "0.0.7",
           "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz",
    -      "integrity": "sha1-9wtzXGvKGlycItmCw+Oef+ujva0=",
    +      "integrity": "sha512-eBvWn1lvIApYMhzQMsu9ciLfkBY499mFZlNqG+/9WR7PVlroQw0vG30cOQQbaKz3sCEc44TAOu2ykzqXSNnwag==",
           "dev": true
         },
         "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"
    -      }
    +      "version": "3.2.4",
    +      "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz",
    +      "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==",
    +      "dev": true
         },
         "node_modules/asynckit": {
           "version": "0.4.0",
           "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
    -      "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=",
    +      "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==",
           "dev": true
         },
         "node_modules/at-least-node": {
    @@ -4953,9 +4971,9 @@
           }
         },
         "node_modules/autoprefixer": {
    -      "version": "10.4.4",
    -      "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.4.tgz",
    -      "integrity": "sha512-Tm8JxsB286VweiZ5F0anmbyGiNI3v3wGv3mz9W+cxEDYB/6jbnj6GM9H9mK3wIL8ftgl+C07Lcwb8PG5PCCPzA==",
    +      "version": "10.4.7",
    +      "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.7.tgz",
    +      "integrity": "sha512-ypHju4Y2Oav95SipEcCcI5J7CGPuvz8oat7sUtYj3ClK44bldfvtvcxK6IEK++7rqB7YchDGzweZIBG+SD0ZAA==",
           "dev": true,
           "funding": [
             {
    @@ -4968,8 +4986,8 @@
             }
           ],
           "dependencies": {
    -        "browserslist": "^4.20.2",
    -        "caniuse-lite": "^1.0.30001317",
    +        "browserslist": "^4.20.3",
    +        "caniuse-lite": "^1.0.30001335",
             "fraction.js": "^4.2.0",
             "normalize-range": "^0.1.2",
             "picocolors": "^1.0.0",
    @@ -4986,12 +5004,12 @@
           }
         },
         "node_modules/axe-core": {
    -      "version": "4.4.1",
    -      "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.4.1.tgz",
    -      "integrity": "sha512-gd1kmb21kwNuWr6BQz8fv6GNECPBnUasepcoLbekws23NVBLODdsClRZ+bQ8+9Uomf3Sm3+Vwn0oYG9NvwnJCw==",
    +      "version": "4.4.2",
    +      "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.4.2.tgz",
    +      "integrity": "sha512-LVAaGp/wkkgYJcjmHsoKx4juT1aQvJyPcW09MLCjVTh3V2cc6PnyempiLMNH5iMdfIX/zdbjUx2KDjMLCTdPeA==",
           "dev": true,
           "engines": {
    -        "node": ">=4"
    +        "node": ">=12"
           }
         },
         "node_modules/axobject-query": {
    @@ -5023,13 +5041,13 @@
           }
         },
         "node_modules/babel-loader": {
    -      "version": "8.2.3",
    -      "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.2.3.tgz",
    -      "integrity": "sha512-n4Zeta8NC3QAsuyiizu0GkmRcQ6clkV9WFUnUf1iXP//IeSKbWjofW3UHyZVwlOB4y039YQKefawyTn64Zwbuw==",
    +      "version": "8.2.5",
    +      "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.2.5.tgz",
    +      "integrity": "sha512-OSiFfH89LrEMiWd4pLNqGz4CwJDtbs2ZVc+iGu2HrkRfPxId9F2anQj38IxWpmRfsUY0aBZYi1EFcd3mhtRMLQ==",
           "dev": true,
           "dependencies": {
             "find-cache-dir": "^3.3.1",
    -        "loader-utils": "^1.4.0",
    +        "loader-utils": "^2.0.0",
             "make-dir": "^3.1.0",
             "schema-utils": "^2.6.5"
           },
    @@ -5041,32 +5059,6 @@
             "webpack": ">=2"
           }
         },
    -    "node_modules/babel-loader/node_modules/json5": {
    -      "version": "1.0.1",
    -      "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz",
    -      "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==",
    -      "dev": true,
    -      "dependencies": {
    -        "minimist": "^1.2.0"
    -      },
    -      "bin": {
    -        "json5": "lib/cli.js"
    -      }
    -    },
    -    "node_modules/babel-loader/node_modules/loader-utils": {
    -      "version": "1.4.0",
    -      "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz",
    -      "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==",
    -      "dev": true,
    -      "dependencies": {
    -        "big.js": "^5.2.2",
    -        "emojis-list": "^3.0.0",
    -        "json5": "^1.0.1"
    -      },
    -      "engines": {
    -        "node": ">=4.0.0"
    -      }
    -    },
         "node_modules/babel-loader/node_modules/schema-utils": {
           "version": "2.7.1",
           "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz",
    @@ -5266,7 +5258,7 @@
         "node_modules/batch": {
           "version": "0.6.1",
           "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz",
    -      "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=",
    +      "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==",
           "dev": true
         },
         "node_modules/bfj": {
    @@ -5308,24 +5300,27 @@
           "dev": true
         },
         "node_modules/body-parser": {
    -      "version": "1.19.2",
    -      "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.2.tgz",
    -      "integrity": "sha512-SAAwOxgoCKMGs9uUAUFHygfLAyaniaoun6I8mFY9pRAJL9+Kec34aU+oIjDhTycub1jozEfEwx1W1IuOYxVSFw==",
    +      "version": "1.20.0",
    +      "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.0.tgz",
    +      "integrity": "sha512-DfJ+q6EPcGKZD1QWUjSpqp+Q7bDQTsQIF4zfUAtZ6qk+H/3/QRhg9CEp39ss+/T2vw0+HaidC0ecJj/DRLIaKg==",
           "dev": true,
           "dependencies": {
             "bytes": "3.1.2",
             "content-type": "~1.0.4",
             "debug": "2.6.9",
    -        "depd": "~1.1.2",
    -        "http-errors": "1.8.1",
    +        "depd": "2.0.0",
    +        "destroy": "1.2.0",
    +        "http-errors": "2.0.0",
             "iconv-lite": "0.4.24",
    -        "on-finished": "~2.3.0",
    -        "qs": "6.9.7",
    -        "raw-body": "2.4.3",
    -        "type-is": "~1.6.18"
    +        "on-finished": "2.4.1",
    +        "qs": "6.10.3",
    +        "raw-body": "2.5.1",
    +        "type-is": "~1.6.18",
    +        "unpipe": "1.0.0"
           },
           "engines": {
    -        "node": ">= 0.8"
    +        "node": ">= 0.8",
    +        "npm": "1.2.8000 || >= 1.4.16"
           }
         },
         "node_modules/body-parser/node_modules/bytes": {
    @@ -5361,27 +5356,25 @@
         "node_modules/body-parser/node_modules/ms": {
           "version": "2.0.0",
           "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
    -      "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
    +      "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
           "dev": true
         },
    -    "node_modules/bonjour": {
    -      "version": "3.5.0",
    -      "resolved": "https://registry.npmjs.org/bonjour/-/bonjour-3.5.0.tgz",
    -      "integrity": "sha1-jokKGD2O6aI5OzhExpGkK897yfU=",
    +    "node_modules/bonjour-service": {
    +      "version": "1.0.13",
    +      "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.0.13.tgz",
    +      "integrity": "sha512-LWKRU/7EqDUC9CTAQtuZl5HzBALoCYwtLhffW3et7vZMwv3bWLpJf8bRYlMD5OCcDpTfnPgNCV4yo9ZIaJGMiA==",
           "dev": true,
           "dependencies": {
    -        "array-flatten": "^2.1.0",
    -        "deep-equal": "^1.0.1",
    +        "array-flatten": "^2.1.2",
             "dns-equal": "^1.0.0",
    -        "dns-txt": "^2.0.2",
    -        "multicast-dns": "^6.0.1",
    -        "multicast-dns-service-types": "^1.1.0"
    +        "fast-deep-equal": "^3.1.3",
    +        "multicast-dns": "^7.2.5"
           }
         },
         "node_modules/boolbase": {
           "version": "1.0.0",
           "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz",
    -      "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=",
    +      "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==",
           "dev": true
         },
         "node_modules/bootstrap": {
    @@ -5425,9 +5418,9 @@
           "dev": true
         },
         "node_modules/browserslist": {
    -      "version": "4.20.2",
    -      "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.20.2.tgz",
    -      "integrity": "sha512-CQOBCqp/9pDvDbx3xfMi+86pr4KXIf2FDkTTdeuYw8OxS9t898LA1Khq57gtufFILXpfgsSx5woNgsBgvGjpsA==",
    +      "version": "4.20.4",
    +      "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.20.4.tgz",
    +      "integrity": "sha512-ok1d+1WpnU24XYN7oC3QWgTyMhY/avPJ/r9T00xxvUOIparA/gc+UPUMaod3i+G6s+nI2nUb9xZ5k794uIwShw==",
           "dev": true,
           "funding": [
             {
    @@ -5440,10 +5433,10 @@
             }
           ],
           "dependencies": {
    -        "caniuse-lite": "^1.0.30001317",
    -        "electron-to-chromium": "^1.4.84",
    +        "caniuse-lite": "^1.0.30001349",
    +        "electron-to-chromium": "^1.4.147",
             "escalade": "^3.1.1",
    -        "node-releases": "^2.0.2",
    +        "node-releases": "^2.0.5",
             "picocolors": "^1.0.0"
           },
           "bin": {
    @@ -5480,16 +5473,10 @@
           "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==",
           "dev": true
         },
    -    "node_modules/buffer-indexof": {
    -      "version": "1.1.1",
    -      "resolved": "https://registry.npmjs.org/buffer-indexof/-/buffer-indexof-1.1.1.tgz",
    -      "integrity": "sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==",
    -      "dev": true
    -    },
         "node_modules/builtin-modules": {
    -      "version": "3.2.0",
    -      "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.2.0.tgz",
    -      "integrity": "sha512-lGzLKcioL90C7wMczpkY0n/oART3MbBa8R9OFGE1rJxoVI86u4WAGfEk8Wjv10eKSyTHVGkSo3bvBylCEtk7LA==",
    +      "version": "3.3.0",
    +      "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz",
    +      "integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==",
           "dev": true,
           "engines": {
             "node": ">=6"
    @@ -5501,7 +5488,7 @@
         "node_modules/bytes": {
           "version": "3.0.0",
           "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz",
    -      "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=",
    +      "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==",
           "dev": true,
           "engines": {
             "node": ">= 0.8"
    @@ -5539,15 +5526,12 @@
           }
         },
         "node_modules/camelcase": {
    -      "version": "6.3.0",
    -      "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz",
    -      "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==",
    +      "version": "5.3.1",
    +      "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
    +      "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
           "dev": true,
           "engines": {
    -        "node": ">=10"
    -      },
    -      "funding": {
    -        "url": "https://github.com/sponsors/sindresorhus"
    +        "node": ">=6"
           }
         },
         "node_modules/camelcase-css": {
    @@ -5572,9 +5556,9 @@
           }
         },
         "node_modules/caniuse-lite": {
    -      "version": "1.0.30001319",
    -      "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001319.tgz",
    -      "integrity": "sha512-xjlIAFHucBRSMUo1kb5D4LYgcN1M45qdKP++lhqowDpwJwGkpIRTt5qQqnhxjj1vHcI7nrJxWhCC1ATrCEBTcw==",
    +      "version": "1.0.30001352",
    +      "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001352.tgz",
    +      "integrity": "sha512-GUgH8w6YergqPQDGWhJGt8GDRnY0L/iJVQcU3eJ46GYf52R8tk0Wxp0PymuFVZboJYXGiCqwozAYZNRjVj6IcA==",
           "dev": true,
           "funding": [
             {
    @@ -5637,18 +5621,19 @@
           "dev": true
         },
         "node_modules/cheerio": {
    -      "version": "1.0.0-rc.10",
    -      "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.10.tgz",
    -      "integrity": "sha512-g0J0q/O6mW8z5zxQ3A8E8J1hUgp4SMOvEoW/x84OwyHKe/Zccz83PVT4y5Crcr530FV6NgmKI1qvGTKVl9XXVw==",
    +      "version": "1.0.0-rc.11",
    +      "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.11.tgz",
    +      "integrity": "sha512-bQwNaDIBKID5ts/DsdhxrjqFXYfLw4ste+wMKqWA8DyKcS4qwsPP4Bk8ZNaTJjvpiX/qW3BT4sU7d6Bh5i+dag==",
           "dev": true,
           "dependencies": {
    -        "cheerio-select": "^1.5.0",
    -        "dom-serializer": "^1.3.2",
    -        "domhandler": "^4.2.0",
    -        "htmlparser2": "^6.1.0",
    -        "parse5": "^6.0.1",
    -        "parse5-htmlparser2-tree-adapter": "^6.0.1",
    -        "tslib": "^2.2.0"
    +        "cheerio-select": "^2.1.0",
    +        "dom-serializer": "^2.0.0",
    +        "domhandler": "^5.0.3",
    +        "domutils": "^3.0.1",
    +        "htmlparser2": "^8.0.1",
    +        "parse5": "^7.0.0",
    +        "parse5-htmlparser2-tree-adapter": "^7.0.0",
    +        "tslib": "^2.4.0"
           },
           "engines": {
             "node": ">= 6"
    @@ -5658,21 +5643,41 @@
           }
         },
         "node_modules/cheerio-select": {
    -      "version": "1.5.0",
    -      "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-1.5.0.tgz",
    -      "integrity": "sha512-qocaHPv5ypefh6YNxvnbABM07KMxExbtbfuJoIie3iZXX1ERwYmJcIiRrr9H05ucQP1k28dav8rpdDgjQd8drg==",
    +      "version": "2.1.0",
    +      "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-2.1.0.tgz",
    +      "integrity": "sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==",
           "dev": true,
           "dependencies": {
    -        "css-select": "^4.1.3",
    -        "css-what": "^5.0.1",
    -        "domelementtype": "^2.2.0",
    -        "domhandler": "^4.2.0",
    -        "domutils": "^2.7.0"
    +        "boolbase": "^1.0.0",
    +        "css-select": "^5.1.0",
    +        "css-what": "^6.1.0",
    +        "domelementtype": "^2.3.0",
    +        "domhandler": "^5.0.3",
    +        "domutils": "^3.0.1"
           },
           "funding": {
             "url": "https://github.com/sponsors/fb55"
           }
         },
    +    "node_modules/cheerio/node_modules/htmlparser2": {
    +      "version": "8.0.1",
    +      "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.1.tgz",
    +      "integrity": "sha512-4lVbmc1diZC7GUJQtRQ5yBAeUCL1exyMwmForWkRLnwyzWBFxN633SALPMGYaWZvKe9j1pRZJpauvmxENSp/EA==",
    +      "dev": true,
    +      "funding": [
    +        "https://github.com/fb55/htmlparser2?sponsor=1",
    +        {
    +          "type": "github",
    +          "url": "https://github.com/sponsors/fb55"
    +        }
    +      ],
    +      "dependencies": {
    +        "domelementtype": "^2.3.0",
    +        "domhandler": "^5.0.2",
    +        "domutils": "^3.0.1",
    +        "entities": "^4.3.0"
    +      }
    +    },
         "node_modules/chokidar": {
           "version": "3.5.3",
           "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz",
    @@ -5720,9 +5725,9 @@
           }
         },
         "node_modules/ci-info": {
    -      "version": "3.3.0",
    -      "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.3.0.tgz",
    -      "integrity": "sha512-riT/3vI5YpVH6/qomlDnJow6TBee2PBKSEpx3O32EGPYbWGIRsIlGRms3Sm74wYE1JMo8RnO04Hb12+v1J5ICw==",
    +      "version": "3.3.1",
    +      "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.3.1.tgz",
    +      "integrity": "sha512-SXgeMX9VwDe7iFFaEWkA5AstuER9YKqy4EhHqr4DVqkwmD9rpVimkMKWHdjn30Ja45txyjhSn63lVX69eVCckg==",
           "dev": true
         },
         "node_modules/cjs-module-lexer": {
    @@ -5737,9 +5742,9 @@
           "integrity": "sha512-OlQdbZ7gLfGarSqxesMesDa5uz7KFbID8Kpq/SxIoNGDqY8lSYs0D+hhtBXhcdB3rcbXArFr7vlHheLk1voeNA=="
         },
         "node_modules/clean-css": {
    -      "version": "5.2.4",
    -      "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.2.4.tgz",
    -      "integrity": "sha512-nKseG8wCzEuji/4yrgM/5cthL9oTDc5UOQyFMvW/Q53oP6gLH690o1NbuTh6Y18nujr7BxlsFuS7gXLnLzKJGg==",
    +      "version": "5.3.0",
    +      "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.0.tgz",
    +      "integrity": "sha512-YYuuxv4H/iNb1Z/5IbMRoxgrzjWGhOEFfd+groZ5dMCVkpENiMZmwspdrzBo9286JjM1gZJPAyL7ZIdzuvu2AQ==",
           "dev": true,
           "dependencies": {
             "source-map": "~0.6.0"
    @@ -5748,24 +5753,6 @@
             "node": ">= 10.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/clean-stack": {
    -      "version": "2.2.0",
    -      "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz",
    -      "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==",
    -      "dev": true,
    -      "engines": {
    -        "node": ">=6"
    -      }
    -    },
         "node_modules/cliui": {
           "version": "7.0.4",
           "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz",
    @@ -5780,7 +5767,7 @@
         "node_modules/co": {
           "version": "4.6.0",
           "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz",
    -      "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=",
    +      "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==",
           "dev": true,
           "engines": {
             "iojs": ">= 1.0.0",
    @@ -5839,13 +5826,13 @@
         "node_modules/coa/node_modules/color-name": {
           "version": "1.1.3",
           "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
    -      "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
    +      "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==",
           "dev": true
         },
         "node_modules/coa/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=",
    +      "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
           "dev": true,
           "engines": {
             "node": ">=0.8.0"
    @@ -5854,7 +5841,7 @@
         "node_modules/coa/node_modules/has-flag": {
           "version": "3.0.0",
           "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
    -      "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
    +      "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==",
           "dev": true,
           "engines": {
             "node": ">=4"
    @@ -5903,9 +5890,9 @@
           "dev": true
         },
         "node_modules/colorette": {
    -      "version": "2.0.16",
    -      "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.16.tgz",
    -      "integrity": "sha512-hUewv7oMjCp+wkBv5Rm0v87eJhq4woh5rSR+42YSQJKecCqgIqNkZ6lAlQms/BwHPJA5NKMRlpxPRv0n8HQW6g==",
    +      "version": "2.0.17",
    +      "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.17.tgz",
    +      "integrity": "sha512-hJo+3Bkn0NCHybn9Tu35fIeoOKGOk5OCC32y4Hz2It+qlCO2Q3DeQ1hRn/tDDMQKRYUEzqsl7jbF6dYKjlE60g==",
           "dev": true
         },
         "node_modules/combined-stream": {
    @@ -5947,7 +5934,7 @@
         "node_modules/commondir": {
           "version": "1.0.1",
           "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz",
    -      "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=",
    +      "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==",
           "dev": true
         },
         "node_modules/compressible": {
    @@ -5992,7 +5979,7 @@
         "node_modules/compression/node_modules/ms": {
           "version": "2.0.0",
           "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
    -      "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
    +      "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
           "dev": true
         },
         "node_modules/compute-scroll-into-view": {
    @@ -6003,7 +5990,7 @@
         "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=",
    +      "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
           "dev": true
         },
         "node_modules/confusing-browser-globals": {
    @@ -6072,9 +6059,9 @@
           }
         },
         "node_modules/cookie": {
    -      "version": "0.4.2",
    -      "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz",
    -      "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==",
    +      "version": "0.5.0",
    +      "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz",
    +      "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==",
           "dev": true,
           "engines": {
             "node": ">= 0.6"
    @@ -6083,7 +6070,7 @@
         "node_modules/cookie-signature": {
           "version": "1.0.6",
           "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
    -      "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=",
    +      "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==",
           "dev": true
         },
         "node_modules/copy-to-clipboard": {
    @@ -6095,9 +6082,9 @@
           }
         },
         "node_modules/core-js": {
    -      "version": "3.21.1",
    -      "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.21.1.tgz",
    -      "integrity": "sha512-FRq5b/VMrWlrmCzwRrpDYNxyHP9BcAZC+xHJaqTgIE5091ZV1NTmyh0sGOg5XqpnHvR0svdy0sv1gWA1zmhxig==",
    +      "version": "3.22.8",
    +      "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.22.8.tgz",
    +      "integrity": "sha512-UoGQ/cfzGYIuiq6Z7vWL1HfkE9U9IZ4Ub+0XSiJTCzvbZzgPA69oDF2f+lgJ6dFFLEdjW5O6svvoKzXX23xFkA==",
           "dev": true,
           "hasInstallScript": true,
           "funding": {
    @@ -6106,12 +6093,12 @@
           }
         },
         "node_modules/core-js-compat": {
    -      "version": "3.21.1",
    -      "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.21.1.tgz",
    -      "integrity": "sha512-gbgX5AUvMb8gwxC7FLVWYT7Kkgu/y7+h/h1X43yJkNqhlK2fuYyQimqvKGNZFAY6CKii/GFKJ2cp/1/42TN36g==",
    +      "version": "3.22.8",
    +      "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.22.8.tgz",
    +      "integrity": "sha512-pQnwg4xtuvc2Bs/5zYQPaEYYSuTxsF7LBWF0SvnVhthZo/Qe+rJpcEekrdNK5DWwDJ0gv0oI9NNX5Mppdy0ctg==",
           "dev": true,
           "dependencies": {
    -        "browserslist": "^4.19.1",
    +        "browserslist": "^4.20.3",
             "semver": "7.0.0"
           },
           "funding": {
    @@ -6129,9 +6116,9 @@
           }
         },
         "node_modules/core-js-pure": {
    -      "version": "3.21.1",
    -      "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.21.1.tgz",
    -      "integrity": "sha512-12VZfFIu+wyVbBebyHmRTuEE/tZrB4tJToWcwAMcsp3h4+sHR+fMJWbKpYiCRWlhFBq+KNyO8rIV9rTkeVmznQ==",
    +      "version": "3.22.8",
    +      "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.22.8.tgz",
    +      "integrity": "sha512-bOxbZIy9S5n4OVH63XaLVXZ49QKicjowDx/UELyJ68vxfCRpYsbyh/WNZNfEfAk+ekA8vSjt+gCDpvh672bc3w==",
           "dev": true,
           "hasInstallScript": true,
           "funding": {
    @@ -6161,14 +6148,6 @@
             "node": ">=10"
           }
         },
    -    "node_modules/create-require": {
    -      "version": "1.1.1",
    -      "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz",
    -      "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==",
    -      "dev": true,
    -      "optional": true,
    -      "peer": true
    -    },
         "node_modules/crelt": {
           "version": "1.0.5",
           "resolved": "https://registry.npmjs.org/crelt/-/crelt-1.0.5.tgz",
    @@ -6225,15 +6204,12 @@
           }
         },
         "node_modules/css-declaration-sorter": {
    -      "version": "6.1.4",
    -      "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-6.1.4.tgz",
    -      "integrity": "sha512-lpfkqS0fctcmZotJGhnxkIyJWvBXgpyi2wsFd4J8VB7wzyrT6Ch/3Q+FMNJpjK4gu1+GN5khOnpU2ZVKrLbhCw==",
    +      "version": "6.3.0",
    +      "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-6.3.0.tgz",
    +      "integrity": "sha512-OGT677UGHJTAVMRhPO+HJ4oKln3wkBTwtDFH0ojbqm+MJm6xuDMHp2nkhh/ThaBqq20IbraBQSWKfSLNHQO9Og==",
           "dev": true,
    -      "dependencies": {
    -        "timsort": "^0.3.0"
    -      },
           "engines": {
    -        "node": ">= 10"
    +        "node": "^10 || ^12 || >=14"
           },
           "peerDependencies": {
             "postcss": "^8.0.9"
    @@ -6284,9 +6260,9 @@
           }
         },
         "node_modules/css-loader/node_modules/semver": {
    -      "version": "7.3.5",
    -      "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz",
    -      "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==",
    +      "version": "7.3.7",
    +      "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz",
    +      "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==",
           "dev": true,
           "dependencies": {
             "lru-cache": "^6.0.0"
    @@ -6337,9 +6313,9 @@
           }
         },
         "node_modules/css-minimizer-webpack-plugin/node_modules/ajv": {
    -      "version": "8.10.0",
    -      "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.10.0.tgz",
    -      "integrity": "sha512-bzqAEZOjkrUMl2afH8dknrq5KEk2SrwdBROR+vH1EKVQTqaUbJVPdc/gEdggTMM0Se+s+Ja4ju4TlNcStKl2Hw==",
    +      "version": "8.11.0",
    +      "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz",
    +      "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==",
           "dev": true,
           "dependencies": {
             "fast-deep-equal": "^3.1.1",
    @@ -6389,15 +6365,6 @@
             "url": "https://opencollective.com/webpack"
           }
         },
    -    "node_modules/css-minimizer-webpack-plugin/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/css-prefers-color-scheme": {
           "version": "6.0.3",
           "resolved": "https://registry.npmjs.org/css-prefers-color-scheme/-/css-prefers-color-scheme-6.0.3.tgz",
    @@ -6414,15 +6381,15 @@
           }
         },
         "node_modules/css-select": {
    -      "version": "4.2.1",
    -      "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.2.1.tgz",
    -      "integrity": "sha512-/aUslKhzkTNCQUB2qTX84lVmfia9NyjP3WpDGtj/WxhwBzWBYUV3DgUpurHTme8UTPcPlAD1DJ+b0nN/t50zDQ==",
    +      "version": "5.1.0",
    +      "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz",
    +      "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==",
           "dev": true,
           "dependencies": {
             "boolbase": "^1.0.0",
    -        "css-what": "^5.1.0",
    -        "domhandler": "^4.3.0",
    -        "domutils": "^2.8.0",
    +        "css-what": "^6.1.0",
    +        "domhandler": "^5.0.2",
    +        "domutils": "^3.0.1",
             "nth-check": "^2.0.1"
           },
           "funding": {
    @@ -6448,19 +6415,10 @@
             "node": ">=8.0.0"
           }
         },
    -    "node_modules/css-tree/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/css-what": {
    -      "version": "5.1.0",
    -      "resolved": "https://registry.npmjs.org/css-what/-/css-what-5.1.0.tgz",
    -      "integrity": "sha512-arSMRWIIFY0hV8pIxZMEfmMI47Wj3R/aWpZDDxWYCPEiOMv6tfOrnpDtgxBYPEQD4V0Y/958+1TdC3iWTFcUPw==",
    +      "version": "6.1.0",
    +      "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz",
    +      "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==",
           "dev": true,
           "engines": {
             "node": ">= 6"
    @@ -6472,13 +6430,17 @@
         "node_modules/css.escape": {
           "version": "1.5.1",
           "resolved": "https://registry.npmjs.org/css.escape/-/css.escape-1.5.1.tgz",
    -      "integrity": "sha1-QuJ9T6BK4y+TGktNQZH6nN3ul8s="
    +      "integrity": "sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg=="
         },
         "node_modules/cssdb": {
    -      "version": "6.5.0",
    -      "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-6.5.0.tgz",
    -      "integrity": "sha512-Rh7AAopF2ckPXe/VBcoUS9JrCZNSyc60+KpgE6X25vpVxA32TmiqvExjkfhwP4wGSb6Xe8Z/JIyGqwgx/zZYFA==",
    -      "dev": true
    +      "version": "6.6.3",
    +      "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-6.6.3.tgz",
    +      "integrity": "sha512-7GDvDSmE+20+WcSMhP17Q1EVWUrLlbxxpMDqG731n8P99JhnQZHR9YvtjPvEHfjFUjvQJvdpKCjlKOX+xe4UVA==",
    +      "dev": true,
    +      "funding": {
    +        "type": "opencollective",
    +        "url": "https://opencollective.com/csstools"
    +      }
         },
         "node_modules/cssesc": {
           "version": "3.0.0",
    @@ -6495,16 +6457,16 @@
         "node_modules/cssfontparser": {
           "version": "1.2.1",
           "resolved": "https://registry.npmjs.org/cssfontparser/-/cssfontparser-1.2.1.tgz",
    -      "integrity": "sha1-9AIvyPlwDGgCnVQghK+69CWj8+M=",
    +      "integrity": "sha512-6tun4LoZnj7VN6YeegOVb67KBX/7JJsqvj+pv3ZA7F878/eN33AbGa5b/S/wXxS/tcp8nc40xRUrsPlxIyNUPg==",
           "dev": true
         },
         "node_modules/cssnano": {
    -      "version": "5.1.5",
    -      "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-5.1.5.tgz",
    -      "integrity": "sha512-VZO1e+bRRVixMeia1zKagrv0lLN1B/r/u12STGNNUFxnp97LIFgZHQa0JxqlwEkvzUyA9Oz/WnCTAFkdEbONmg==",
    +      "version": "5.1.11",
    +      "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-5.1.11.tgz",
    +      "integrity": "sha512-2nx+O6LvewPo5EBtYrKc8762mMkZRk9cMGIOP4UlkmxHm7ObxH+zvsJJ+qLwPkUc4/yumL/qJkavYi9NlodWIQ==",
           "dev": true,
           "dependencies": {
    -        "cssnano-preset-default": "^5.2.5",
    +        "cssnano-preset-default": "^5.2.11",
             "lilconfig": "^2.0.3",
             "yaml": "^1.10.2"
           },
    @@ -6520,26 +6482,26 @@
           }
         },
         "node_modules/cssnano-preset-default": {
    -      "version": "5.2.5",
    -      "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-5.2.5.tgz",
    -      "integrity": "sha512-WopL7PzN7sos3X8B54/QGl+CZUh1f0qN4ds+y2d5EPwRSSc3jsitVw81O+Uyop0pXyOfPfZxnc+LmA8w/Ki/WQ==",
    +      "version": "5.2.11",
    +      "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-5.2.11.tgz",
    +      "integrity": "sha512-4PadR1NtuaIK8MvLNuY7MznK4WJteldGlzCiMaaTiOUP+apeiIvUDIXykzUOoqgOOUAHrU64ncdD90NfZR3LSQ==",
           "dev": true,
           "dependencies": {
    -        "css-declaration-sorter": "^6.0.3",
    +        "css-declaration-sorter": "^6.2.2",
             "cssnano-utils": "^3.1.0",
             "postcss-calc": "^8.2.3",
             "postcss-colormin": "^5.3.0",
    -        "postcss-convert-values": "^5.1.0",
    -        "postcss-discard-comments": "^5.1.1",
    +        "postcss-convert-values": "^5.1.2",
    +        "postcss-discard-comments": "^5.1.2",
             "postcss-discard-duplicates": "^5.1.0",
             "postcss-discard-empty": "^5.1.1",
             "postcss-discard-overridden": "^5.1.0",
    -        "postcss-merge-longhand": "^5.1.3",
    -        "postcss-merge-rules": "^5.1.1",
    +        "postcss-merge-longhand": "^5.1.5",
    +        "postcss-merge-rules": "^5.1.2",
             "postcss-minify-font-values": "^5.1.0",
             "postcss-minify-gradients": "^5.1.1",
    -        "postcss-minify-params": "^5.1.2",
    -        "postcss-minify-selectors": "^5.2.0",
    +        "postcss-minify-params": "^5.1.3",
    +        "postcss-minify-selectors": "^5.2.1",
             "postcss-normalize-charset": "^5.1.0",
             "postcss-normalize-display-values": "^5.1.0",
             "postcss-normalize-positions": "^5.1.0",
    @@ -6549,7 +6511,7 @@
             "postcss-normalize-unicode": "^5.1.0",
             "postcss-normalize-url": "^5.1.0",
             "postcss-normalize-whitespace": "^5.1.1",
    -        "postcss-ordered-values": "^5.1.1",
    +        "postcss-ordered-values": "^5.1.2",
             "postcss-reduce-initial": "^5.1.0",
             "postcss-reduce-transforms": "^5.1.0",
             "postcss-svgo": "^5.1.0",
    @@ -6605,15 +6567,6 @@
           "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==",
           "dev": true
         },
    -    "node_modules/csso/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/cssom": {
           "version": "0.4.4",
           "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz",
    @@ -6639,9 +6592,9 @@
           "dev": true
         },
         "node_modules/csstype": {
    -      "version": "3.0.11",
    -      "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.11.tgz",
    -      "integrity": "sha512-sa6P2wJ+CAbgyy4KFssIb/JNMLxFvKF1pCYCSXS8ZMuqZnMsrxqI2E5sPyoTpxoPU/gVZMzr2zjOfg8GIZOMsw==",
    +      "version": "3.1.0",
    +      "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.0.tgz",
    +      "integrity": "sha512-uX1KG+x9h5hIJsaKR9xHUeUraxf8IODOwq9JLNPq6BwB04a/xgpq3rcx47l5BZu5zBPlgD342tdke3Hom/nJRA==",
           "dev": true
         },
         "node_modules/damerau-levenshtein": {
    @@ -6664,32 +6617,6 @@
             "node": ">=10"
           }
         },
    -    "node_modules/data-urls/node_modules/tr46": {
    -      "version": "2.1.0",
    -      "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz",
    -      "integrity": "sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==",
    -      "dev": true,
    -      "dependencies": {
    -        "punycode": "^2.1.1"
    -      },
    -      "engines": {
    -        "node": ">=8"
    -      }
    -    },
    -    "node_modules/data-urls/node_modules/whatwg-url": {
    -      "version": "8.7.0",
    -      "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.7.0.tgz",
    -      "integrity": "sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==",
    -      "dev": true,
    -      "dependencies": {
    -        "lodash": "^4.7.0",
    -        "tr46": "^2.1.0",
    -        "webidl-conversions": "^6.1.0"
    -      },
    -      "engines": {
    -        "node": ">=10"
    -      }
    -    },
         "node_modules/debug": {
           "version": "4.3.4",
           "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
    @@ -6716,7 +6643,7 @@
         "node_modules/dedent": {
           "version": "0.7.0",
           "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz",
    -      "integrity": "sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw=",
    +      "integrity": "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==",
           "dev": true
         },
         "node_modules/deep-equal": {
    @@ -6771,67 +6698,53 @@
           }
         },
         "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==",
    +      "version": "1.1.4",
    +      "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz",
    +      "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==",
           "dependencies": {
    -        "object-keys": "^1.0.12"
    +        "has-property-descriptors": "^1.0.0",
    +        "object-keys": "^1.1.1"
           },
           "engines": {
             "node": ">= 0.4"
    +      },
    +      "funding": {
    +        "url": "https://github.com/sponsors/ljharb"
           }
         },
         "node_modules/defined": {
           "version": "1.0.0",
           "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz",
    -      "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=",
    +      "integrity": "sha512-Y2caI5+ZwS5c3RiNDJ6u53VhQHv+hHKwhkI1iHvceKUHw9Df6EK2zRLfjejRgMuCuxK7PfSWIMwWecceVvThjQ==",
           "dev": true
         },
    -    "node_modules/del": {
    -      "version": "6.0.0",
    -      "resolved": "https://registry.npmjs.org/del/-/del-6.0.0.tgz",
    -      "integrity": "sha512-1shh9DQ23L16oXSZKB2JxpL7iMy2E0S9d517ptA1P8iw0alkPtQcrKH7ru31rYtKwF499HkTu+DRzq3TCKDFRQ==",
    -      "dev": true,
    -      "dependencies": {
    -        "globby": "^11.0.1",
    -        "graceful-fs": "^4.2.4",
    -        "is-glob": "^4.0.1",
    -        "is-path-cwd": "^2.2.0",
    -        "is-path-inside": "^3.0.2",
    -        "p-map": "^4.0.0",
    -        "rimraf": "^3.0.2",
    -        "slash": "^3.0.0"
    -      },
    -      "engines": {
    -        "node": ">=10"
    -      },
    -      "funding": {
    -        "url": "https://github.com/sponsors/sindresorhus"
    -      }
    -    },
         "node_modules/delayed-stream": {
           "version": "1.0.0",
           "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
    -      "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=",
    +      "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==",
           "dev": true,
           "engines": {
             "node": ">=0.4.0"
           }
         },
         "node_modules/depd": {
    -      "version": "1.1.2",
    -      "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
    -      "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=",
    +      "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.6"
    +        "node": ">= 0.8"
           }
         },
         "node_modules/destroy": {
    -      "version": "1.0.4",
    -      "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz",
    -      "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=",
    -      "dev": true
    +      "version": "1.2.0",
    +      "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz",
    +      "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">= 0.8",
    +        "npm": "1.2.8000 || >= 1.4.16"
    +      }
         },
         "node_modules/detect-newline": {
           "version": "3.1.0",
    @@ -6877,18 +6790,18 @@
         "node_modules/detect-port-alt/node_modules/ms": {
           "version": "2.0.0",
           "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
    -      "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
    +      "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
           "dev": true
         },
         "node_modules/detective": {
    -      "version": "5.2.0",
    -      "resolved": "https://registry.npmjs.org/detective/-/detective-5.2.0.tgz",
    -      "integrity": "sha512-6SsIx+nUUbuK0EthKjv0zrdnajCCXVYGmbYYiYjFVpzcjwEs/JMDZ8tPRG29J/HhN56t3GJp2cGSWDRjjot8Pg==",
    +      "version": "5.2.1",
    +      "resolved": "https://registry.npmjs.org/detective/-/detective-5.2.1.tgz",
    +      "integrity": "sha512-v9XE1zRnz1wRtgurGu0Bs8uHKFSTdteYZNbIPFVhUZ39L/S79ppMpdmVOZAnoz1jfEFodc48n6MX483Xo3t1yw==",
           "dev": true,
           "dependencies": {
    -        "acorn-node": "^1.6.1",
    +        "acorn-node": "^1.8.2",
             "defined": "^1.0.0",
    -        "minimist": "^1.1.1"
    +        "minimist": "^1.2.6"
           },
           "bin": {
             "detective": "bin/detective.js"
    @@ -6904,9 +6817,9 @@
           "dev": true
         },
         "node_modules/diff": {
    -      "version": "5.0.0",
    -      "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz",
    -      "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==",
    +      "version": "5.1.0",
    +      "resolved": "https://registry.npmjs.org/diff/-/diff-5.1.0.tgz",
    +      "integrity": "sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw==",
           "dev": true,
           "engines": {
             "node": ">=0.3.1"
    @@ -6936,7 +6849,7 @@
         "node_modules/discontinuous-range": {
           "version": "1.0.0",
           "resolved": "https://registry.npmjs.org/discontinuous-range/-/discontinuous-range-1.0.0.tgz",
    -      "integrity": "sha1-44Mx8IRLukm5qctxx3FYWqsbxlo=",
    +      "integrity": "sha512-c68LpLbO+7kP/b1Hr1qs8/BJ09F5khZGTxqxZuhzxpmwJKOgRFHJWIb9/KmqnqHhLdO55aOxFH/EGBvUQbL/RQ==",
           "dev": true
         },
         "node_modules/dlv": {
    @@ -6948,26 +6861,19 @@
         "node_modules/dns-equal": {
           "version": "1.0.0",
           "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz",
    -      "integrity": "sha1-s55/HabrCnW6nBcySzR1PEfgZU0=",
    +      "integrity": "sha512-z+paD6YUQsk+AbGCEM4PrOXSss5gd66QfcVBFTKR/HpFL9jCqikS94HYwKww6fQyO7IxrIIyUu+g0Ka9tUS2Cg==",
           "dev": true
         },
         "node_modules/dns-packet": {
    -      "version": "1.3.4",
    -      "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.4.tgz",
    -      "integrity": "sha512-BQ6F4vycLXBvdrJZ6S3gZewt6rcrks9KBgM9vrhW+knGRqc8uEdT7fuCwloc7nny5xNoMJ17HGH0R/6fpo8ECA==",
    -      "dev": true,
    -      "dependencies": {
    -        "ip": "^1.1.0",
    -        "safe-buffer": "^5.0.1"
    -      }
    -    },
    -    "node_modules/dns-txt": {
    -      "version": "2.0.2",
    -      "resolved": "https://registry.npmjs.org/dns-txt/-/dns-txt-2.0.2.tgz",
    -      "integrity": "sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY=",
    +      "version": "5.3.1",
    +      "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.3.1.tgz",
    +      "integrity": "sha512-spBwIj0TK0Ey3666GwIdWVfUpLyubpU53BTCu8iPn4r4oXd9O14Hjg3EHw3ts2oed77/SeckunUYCyRlSngqHw==",
           "dev": true,
           "dependencies": {
    -        "buffer-indexof": "^1.0.0"
    +        "@leichtgewicht/ip-codec": "^2.0.1"
    +      },
    +      "engines": {
    +        "node": ">=6"
           }
         },
         "node_modules/doctrine": {
    @@ -7000,22 +6906,23 @@
           }
         },
         "node_modules/dom-serializer": {
    -      "version": "1.3.2",
    -      "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.3.2.tgz",
    -      "integrity": "sha512-5c54Bk5Dw4qAxNOI1pFEizPSjVsx5+bpJKmL2kPn8JhBUq2q09tTCa3mjijun2NfK78NMouDYNMBkOrPZiS+ig==",
    +      "version": "2.0.0",
    +      "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz",
    +      "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==",
    +      "dev": true,
           "dependencies": {
    -        "domelementtype": "^2.0.1",
    -        "domhandler": "^4.2.0",
    -        "entities": "^2.0.0"
    +        "domelementtype": "^2.3.0",
    +        "domhandler": "^5.0.2",
    +        "entities": "^4.2.0"
           },
           "funding": {
             "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1"
           }
         },
         "node_modules/domelementtype": {
    -      "version": "2.2.0",
    -      "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz",
    -      "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==",
    +      "version": "2.3.0",
    +      "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz",
    +      "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==",
           "funding": [
             {
               "type": "github",
    @@ -7045,11 +6952,12 @@
           }
         },
         "node_modules/domhandler": {
    -      "version": "4.3.1",
    -      "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz",
    -      "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==",
    +      "version": "5.0.3",
    +      "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz",
    +      "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==",
    +      "dev": true,
           "dependencies": {
    -        "domelementtype": "^2.2.0"
    +        "domelementtype": "^2.3.0"
           },
           "engines": {
             "node": ">= 4"
    @@ -7059,13 +6967,14 @@
           }
         },
         "node_modules/domutils": {
    -      "version": "2.8.0",
    -      "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz",
    -      "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==",
    +      "version": "3.0.1",
    +      "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.0.1.tgz",
    +      "integrity": "sha512-z08c1l761iKhDFtfXO04C7kTdPBLi41zwOZl00WS8b5eiaebNpY00HKbztwBq+e3vyqWNwWF3mP9YLUeqIrF+Q==",
    +      "dev": true,
           "dependencies": {
    -        "dom-serializer": "^1.0.1",
    -        "domelementtype": "^2.2.0",
    -        "domhandler": "^4.2.0"
    +        "dom-serializer": "^2.0.0",
    +        "domelementtype": "^2.3.0",
    +        "domhandler": "^5.0.1"
           },
           "funding": {
             "url": "https://github.com/fb55/domutils?sponsor=1"
    @@ -7120,16 +7029,16 @@
         "node_modules/ee-first": {
           "version": "1.1.1",
           "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
    -      "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=",
    +      "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==",
           "dev": true
         },
         "node_modules/ejs": {
    -      "version": "3.1.6",
    -      "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.6.tgz",
    -      "integrity": "sha512-9lt9Zse4hPucPkoP7FHDF0LQAlGyF9JVpnClFLFH3aSSbxmyoqINRpp/9wePWJTUl4KOQwRL72Iw3InHPDkoGw==",
    +      "version": "3.1.8",
    +      "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.8.tgz",
    +      "integrity": "sha512-/sXZeMlhS0ArkfX2Aw780gJzXSMPnKjtspYZv+f3NiKLlubezAHDU5+9xz6gd3/NhG3txQCo6xlglmTS+oTGEQ==",
           "dev": true,
           "dependencies": {
    -        "jake": "^10.6.1"
    +        "jake": "^10.8.5"
           },
           "bin": {
             "ejs": "bin/cli.js"
    @@ -7139,9 +7048,9 @@
           }
         },
         "node_modules/electron-to-chromium": {
    -      "version": "1.4.89",
    -      "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.89.tgz",
    -      "integrity": "sha512-z1Axg0Fu54fse8wN4fd+GAINdU5mJmLtcl6bqIcYyzNVGONcfHAeeJi88KYMQVKalhXlYuVPzKkFIU5VD0raUw==",
    +      "version": "1.4.152",
    +      "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.152.tgz",
    +      "integrity": "sha512-jk4Ju5SGZAQQJ1iI4Rgru7dDlvkQPLpNPWH9gIZmwCD4YteA5Bbk1xPcPDUf5jUYs3e1e80RXdi8XgKQZaigeg==",
           "dev": true
         },
         "node_modules/emittery": {
    @@ -7174,16 +7083,16 @@
         "node_modules/encodeurl": {
           "version": "1.0.2",
           "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
    -      "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=",
    +      "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==",
           "dev": true,
           "engines": {
             "node": ">= 0.8"
           }
         },
         "node_modules/enhanced-resolve": {
    -      "version": "5.9.2",
    -      "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.9.2.tgz",
    -      "integrity": "sha512-GIm3fQfwLJ8YZx2smuHpBKkXC1yOk+OBEmKckVyL0i/ea8mqDEykK3ld5dgH1QYPNyT/lIllxV2LULnxCHaHkA==",
    +      "version": "5.9.3",
    +      "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.9.3.tgz",
    +      "integrity": "sha512-Bq9VSor+kjvW3f9/MiiR4eE3XYgOl7/rS8lnSxbRbF3kS0B2r+Y9w5krBWxZgDxASVZbdYrn5wT4j/Wb0J9qow==",
           "dev": true,
           "dependencies": {
             "graceful-fs": "^4.2.4",
    @@ -7194,9 +7103,13 @@
           }
         },
         "node_modules/entities": {
    -      "version": "2.2.0",
    -      "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz",
    -      "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==",
    +      "version": "4.3.0",
    +      "resolved": "https://registry.npmjs.org/entities/-/entities-4.3.0.tgz",
    +      "integrity": "sha512-/iP1rZrSEJ0DTlPiX+jbzlA3eVkY/e8L8SozroF395fIqE3TYF/Nz7YOMAawta+vLmyJ/hkGNNPcSbMADCCXbg==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=0.12"
    +      },
           "funding": {
             "url": "https://github.com/fb55/entities?sponsor=1"
           }
    @@ -7280,40 +7193,43 @@
           }
         },
         "node_modules/error-stack-parser": {
    -      "version": "2.0.7",
    -      "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.0.7.tgz",
    -      "integrity": "sha512-chLOW0ZGRf4s8raLrDxa5sdkvPec5YdvwbFnqJme4rk0rFajP8mPtrDL1+I+CwrQDCjswDA5sREX7jYQDQs9vA==",
    +      "version": "2.1.4",
    +      "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.1.4.tgz",
    +      "integrity": "sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==",
           "dev": true,
           "dependencies": {
    -        "stackframe": "^1.1.1"
    +        "stackframe": "^1.3.4"
           }
         },
         "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==",
    +      "version": "1.20.1",
    +      "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.1.tgz",
    +      "integrity": "sha512-WEm2oBhfoI2sImeM4OF2zE2V3BYdSF+KnSi9Sidz51fQHd7+JuF8Xgcj9/0o+OWeIeIS/MiuNnlruQrJf16GQA==",
           "dev": true,
           "dependencies": {
             "call-bind": "^1.0.2",
             "es-to-primitive": "^1.2.1",
             "function-bind": "^1.1.1",
    +        "function.prototype.name": "^1.1.5",
             "get-intrinsic": "^1.1.1",
             "get-symbol-description": "^1.0.0",
             "has": "^1.0.3",
    -        "has-symbols": "^1.0.2",
    +        "has-property-descriptors": "^1.0.0",
    +        "has-symbols": "^1.0.3",
             "internal-slot": "^1.0.3",
             "is-callable": "^1.2.4",
    -        "is-negative-zero": "^2.0.1",
    +        "is-negative-zero": "^2.0.2",
             "is-regex": "^1.1.4",
    -        "is-shared-array-buffer": "^1.0.1",
    +        "is-shared-array-buffer": "^1.0.2",
             "is-string": "^1.0.7",
    -        "is-weakref": "^1.0.1",
    -        "object-inspect": "^1.11.0",
    +        "is-weakref": "^1.0.2",
    +        "object-inspect": "^1.12.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"
    +        "regexp.prototype.flags": "^1.4.3",
    +        "string.prototype.trimend": "^1.0.5",
    +        "string.prototype.trimstart": "^1.0.5",
    +        "unbox-primitive": "^1.0.2"
           },
           "engines": {
             "node": ">= 0.4"
    @@ -7334,6 +7250,15 @@
           "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==",
           "dev": true
         },
    +    "node_modules/es-shim-unscopables": {
    +      "version": "1.0.0",
    +      "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz",
    +      "integrity": "sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==",
    +      "dev": true,
    +      "dependencies": {
    +        "has": "^1.0.3"
    +      }
    +    },
         "node_modules/es-to-primitive": {
           "version": "1.2.1",
           "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz",
    @@ -7363,7 +7288,7 @@
         "node_modules/escape-html": {
           "version": "1.0.3",
           "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
    -      "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=",
    +      "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==",
           "dev": true
         },
         "node_modules/escape-string-regexp": {
    @@ -7402,7 +7327,7 @@
         "node_modules/escodegen/node_modules/levn": {
           "version": "0.3.0",
           "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz",
    -      "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=",
    +      "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==",
           "dev": true,
           "dependencies": {
             "prelude-ls": "~1.1.2",
    @@ -7432,26 +7357,16 @@
         "node_modules/escodegen/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=",
    +      "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==",
           "dev": true,
           "engines": {
             "node": ">= 0.8.0"
           }
         },
    -    "node_modules/escodegen/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,
    -      "optional": true,
    -      "engines": {
    -        "node": ">=0.10.0"
    -      }
    -    },
         "node_modules/escodegen/node_modules/type-check": {
           "version": "0.3.2",
           "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz",
    -      "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=",
    +      "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==",
           "dev": true,
           "dependencies": {
             "prelude-ls": "~1.1.2"
    @@ -7461,12 +7376,12 @@
           }
         },
         "node_modules/eslint": {
    -      "version": "8.11.0",
    -      "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.11.0.tgz",
    -      "integrity": "sha512-/KRpd9mIRg2raGxHRGwW9ZywYNAClZrHjdueHcrVDuO3a6bj83eoTirCCk0M0yPwOjWYKHwRVRid+xK4F/GHgA==",
    +      "version": "8.17.0",
    +      "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.17.0.tgz",
    +      "integrity": "sha512-gq0m0BTJfci60Fz4nczYxNAlED+sMcihltndR8t9t1evnU/azx53x3t2UHXC/uRjcbvRw/XctpaNygSTcQD+Iw==",
           "dev": true,
           "dependencies": {
    -        "@eslint/eslintrc": "^1.2.1",
    +        "@eslint/eslintrc": "^1.3.0",
             "@humanwhocodes/config-array": "^0.9.2",
             "ajv": "^6.10.0",
             "chalk": "^4.0.0",
    @@ -7477,14 +7392,14 @@
             "eslint-scope": "^7.1.1",
             "eslint-utils": "^3.0.0",
             "eslint-visitor-keys": "^3.3.0",
    -        "espree": "^9.3.1",
    +        "espree": "^9.3.2",
             "esquery": "^1.4.0",
             "esutils": "^2.0.2",
             "fast-deep-equal": "^3.1.3",
             "file-entry-cache": "^6.0.1",
             "functional-red-black-tree": "^1.0.1",
             "glob-parent": "^6.0.1",
    -        "globals": "^13.6.0",
    +        "globals": "^13.15.0",
             "ignore": "^5.2.0",
             "import-fresh": "^3.0.0",
             "imurmurhash": "^0.1.4",
    @@ -7493,7 +7408,7 @@
             "json-stable-stringify-without-jsonify": "^1.0.1",
             "levn": "^0.4.1",
             "lodash.merge": "^4.6.2",
    -        "minimatch": "^3.0.4",
    +        "minimatch": "^3.1.2",
             "natural-compare": "^1.4.0",
             "optionator": "^0.9.1",
             "regexpp": "^3.2.0",
    @@ -7525,9 +7440,9 @@
           }
         },
         "node_modules/eslint-config-react-app": {
    -      "version": "7.0.0",
    -      "resolved": "https://registry.npmjs.org/eslint-config-react-app/-/eslint-config-react-app-7.0.0.tgz",
    -      "integrity": "sha512-xyymoxtIt1EOsSaGag+/jmcywRuieQoA2JbPCjnw9HukFj9/97aGPoZVFioaotzk1K5Qt9sHO5EutZbkrAXS0g==",
    +      "version": "7.0.1",
    +      "resolved": "https://registry.npmjs.org/eslint-config-react-app/-/eslint-config-react-app-7.0.1.tgz",
    +      "integrity": "sha512-K6rNzvkIeHaTd8m/QEh1Zko0KI7BACWkkneSs6s9cKZC/J27X3eZR6Upt1jkmZ/4FK+XUOPPxMEN7+lbUXfSlA==",
           "dev": true,
           "dependencies": {
             "@babel/core": "^7.16.0",
    @@ -7612,9 +7527,9 @@
           }
         },
         "node_modules/eslint-plugin-import": {
    -      "version": "2.25.4",
    -      "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.25.4.tgz",
    -      "integrity": "sha512-/KJBASVFxpu0xg1kIBn9AUa8hQVnszpwgE7Ld0lKAlx7Ie87yzEzCgSkekt+le/YVhiaosO4Y14GDAOc41nfxA==",
    +      "version": "2.26.0",
    +      "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.26.0.tgz",
    +      "integrity": "sha512-hYfi3FXaM8WPLf4S1cikh/r4IxnO6zrhZbEGz2b660EJRbuxgpDS5gkCuYgGWg2xxh2rBuIr4Pvhve/7c31koA==",
           "dev": true,
           "dependencies": {
             "array-includes": "^3.1.4",
    @@ -7622,14 +7537,14 @@
             "debug": "^2.6.9",
             "doctrine": "^2.1.0",
             "eslint-import-resolver-node": "^0.3.6",
    -        "eslint-module-utils": "^2.7.2",
    +        "eslint-module-utils": "^2.7.3",
             "has": "^1.0.3",
    -        "is-core-module": "^2.8.0",
    +        "is-core-module": "^2.8.1",
             "is-glob": "^4.0.3",
    -        "minimatch": "^3.0.4",
    +        "minimatch": "^3.1.2",
             "object.values": "^1.1.5",
    -        "resolve": "^1.20.0",
    -        "tsconfig-paths": "^3.12.0"
    +        "resolve": "^1.22.0",
    +        "tsconfig-paths": "^3.14.1"
           },
           "engines": {
             "node": ">=4"
    @@ -7662,7 +7577,7 @@
         "node_modules/eslint-plugin-import/node_modules/ms": {
           "version": "2.0.0",
           "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
    -      "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
    +      "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
           "dev": true
         },
         "node_modules/eslint-plugin-jest": {
    @@ -7737,25 +7652,25 @@
           }
         },
         "node_modules/eslint-plugin-react": {
    -      "version": "7.29.4",
    -      "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.29.4.tgz",
    -      "integrity": "sha512-CVCXajliVh509PcZYRFyu/BoUEz452+jtQJq2b3Bae4v3xBUWPLCmtmBM+ZinG4MzwmxJgJ2M5rMqhqLVn7MtQ==",
    +      "version": "7.30.0",
    +      "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.30.0.tgz",
    +      "integrity": "sha512-RgwH7hjW48BleKsYyHK5vUAvxtE9SMPDKmcPRQgtRCYaZA0XQPt5FSkrU3nhz5ifzMZcA8opwmRJ2cmOO8tr5A==",
           "dev": true,
           "dependencies": {
    -        "array-includes": "^3.1.4",
    -        "array.prototype.flatmap": "^1.2.5",
    +        "array-includes": "^3.1.5",
    +        "array.prototype.flatmap": "^1.3.0",
             "doctrine": "^2.1.0",
             "estraverse": "^5.3.0",
             "jsx-ast-utils": "^2.4.1 || ^3.0.0",
             "minimatch": "^3.1.2",
             "object.entries": "^1.1.5",
             "object.fromentries": "^2.0.5",
    -        "object.hasown": "^1.1.0",
    +        "object.hasown": "^1.1.1",
             "object.values": "^1.1.5",
             "prop-types": "^15.8.1",
             "resolve": "^2.0.0-next.3",
             "semver": "^6.3.0",
    -        "string.prototype.matchall": "^4.0.6"
    +        "string.prototype.matchall": "^4.0.7"
           },
           "engines": {
             "node": ">=4"
    @@ -7765,9 +7680,9 @@
           }
         },
         "node_modules/eslint-plugin-react-hooks": {
    -      "version": "4.3.0",
    -      "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.3.0.tgz",
    -      "integrity": "sha512-XslZy0LnMn+84NEG9jSGR6eGqaZB3133L8xewQo3fQagbQuGt7a63gf+P1NGKZavEYEC3UXaWEAA/AqDkuN6xA==",
    +      "version": "4.5.0",
    +      "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.5.0.tgz",
    +      "integrity": "sha512-8k1gRt7D7h03kd+SAAlzXkQwWK22BnK6GKZG+FJA6BAGy22CFvl8kCIXKpVux0cCxMWDQUPqSok0LKaZ0aOcCw==",
           "dev": true,
           "engines": {
             "node": ">=10"
    @@ -7802,9 +7717,9 @@
           }
         },
         "node_modules/eslint-plugin-testing-library": {
    -      "version": "5.1.0",
    -      "resolved": "https://registry.npmjs.org/eslint-plugin-testing-library/-/eslint-plugin-testing-library-5.1.0.tgz",
    -      "integrity": "sha512-YSNzasJUbyhOTe14ZPygeOBvcPvcaNkwHwrj4vdf+uirr2D32JTDaKi6CP5Os2aWtOcvt4uBSPXp9h5xGoqvWQ==",
    +      "version": "5.5.1",
    +      "resolved": "https://registry.npmjs.org/eslint-plugin-testing-library/-/eslint-plugin-testing-library-5.5.1.tgz",
    +      "integrity": "sha512-plLEkkbAKBjPxsLj7x4jNapcHAg2ernkQlKKrN2I8NrQwPISZHyCUNvg5Hv3EDqOQReToQb5bnqXYbkijJPE/g==",
           "dev": true,
           "dependencies": {
             "@typescript-eslint/utils": "^5.13.0"
    @@ -7891,13 +7806,13 @@
           }
         },
         "node_modules/espree": {
    -      "version": "9.3.1",
    -      "resolved": "https://registry.npmjs.org/espree/-/espree-9.3.1.tgz",
    -      "integrity": "sha512-bvdyLmJMfwkV3NCRl5ZhJf22zBFo1y8bYh3VYb+bfzqNB4Je68P2sSuXyuFquzWLebHpNd2/d5uv7yoP9ISnGQ==",
    +      "version": "9.3.2",
    +      "resolved": "https://registry.npmjs.org/espree/-/espree-9.3.2.tgz",
    +      "integrity": "sha512-D211tC7ZwouTIuY5x9XnS0E9sWNChB7IYKX/Xp5eQj3nFXhqmiUDB9q27y76oFl8jTg3pXcQx/bpxMfs3CIZbA==",
           "dev": true,
           "dependencies": {
    -        "acorn": "^8.7.0",
    -        "acorn-jsx": "^5.3.1",
    +        "acorn": "^8.7.1",
    +        "acorn-jsx": "^5.3.2",
             "eslint-visitor-keys": "^3.3.0"
           },
           "engines": {
    @@ -7968,7 +7883,7 @@
         "node_modules/etag": {
           "version": "1.8.1",
           "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
    -      "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=",
    +      "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==",
           "dev": true,
           "engines": {
             "node": ">= 0.6"
    @@ -8014,7 +7929,7 @@
         "node_modules/exit": {
           "version": "0.1.2",
           "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz",
    -      "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=",
    +      "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==",
           "dev": true,
           "engines": {
             "node": ">= 0.8.0"
    @@ -8036,38 +7951,39 @@
           }
         },
         "node_modules/express": {
    -      "version": "4.17.3",
    -      "resolved": "https://registry.npmjs.org/express/-/express-4.17.3.tgz",
    -      "integrity": "sha512-yuSQpz5I+Ch7gFrPCk4/c+dIBKlQUxtgwqzph132bsT6qhuzss6I8cLJQz7B3rFblzd6wtcI0ZbGltH/C4LjUg==",
    +      "version": "4.18.1",
    +      "resolved": "https://registry.npmjs.org/express/-/express-4.18.1.tgz",
    +      "integrity": "sha512-zZBcOX9TfehHQhtupq57OF8lFZ3UZi08Y97dwFCkD8p9d/d2Y3M+ykKcwaMDEL+4qyUolgBDX6AblpR3fL212Q==",
           "dev": true,
           "dependencies": {
             "accepts": "~1.3.8",
             "array-flatten": "1.1.1",
    -        "body-parser": "1.19.2",
    +        "body-parser": "1.20.0",
             "content-disposition": "0.5.4",
             "content-type": "~1.0.4",
    -        "cookie": "0.4.2",
    +        "cookie": "0.5.0",
             "cookie-signature": "1.0.6",
             "debug": "2.6.9",
    -        "depd": "~1.1.2",
    +        "depd": "2.0.0",
             "encodeurl": "~1.0.2",
             "escape-html": "~1.0.3",
             "etag": "~1.8.1",
    -        "finalhandler": "~1.1.2",
    +        "finalhandler": "1.2.0",
             "fresh": "0.5.2",
    +        "http-errors": "2.0.0",
             "merge-descriptors": "1.0.1",
             "methods": "~1.1.2",
    -        "on-finished": "~2.3.0",
    +        "on-finished": "2.4.1",
             "parseurl": "~1.3.3",
             "path-to-regexp": "0.1.7",
             "proxy-addr": "~2.0.7",
    -        "qs": "6.9.7",
    +        "qs": "6.10.3",
             "range-parser": "~1.2.1",
             "safe-buffer": "5.2.1",
    -        "send": "0.17.2",
    -        "serve-static": "1.14.2",
    +        "send": "0.18.0",
    +        "serve-static": "1.15.0",
             "setprototypeof": "1.2.0",
    -        "statuses": "~1.5.0",
    +        "statuses": "2.0.1",
             "type-is": "~1.6.18",
             "utils-merge": "1.0.1",
             "vary": "~1.1.2"
    @@ -8079,7 +7995,7 @@
         "node_modules/express/node_modules/array-flatten": {
           "version": "1.1.1",
           "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
    -      "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=",
    +      "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==",
           "dev": true
         },
         "node_modules/express/node_modules/debug": {
    @@ -8094,7 +8010,13 @@
         "node_modules/express/node_modules/ms": {
           "version": "2.0.0",
           "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
    -      "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
    +      "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
    +      "dev": true
    +    },
    +    "node_modules/express/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": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==",
           "dev": true
         },
         "node_modules/express/node_modules/safe-buffer": {
    @@ -8166,7 +8088,7 @@
         "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=",
    +      "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==",
           "dev": true
         },
         "node_modules/fastq": {
    @@ -8232,12 +8154,33 @@
           }
         },
         "node_modules/filelist": {
    -      "version": "1.0.2",
    -      "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.2.tgz",
    -      "integrity": "sha512-z7O0IS8Plc39rTCq6i6iHxk43duYOn8uFJiWSewIq0Bww1RNybVHSCjahmcC87ZqAm4OTvFzlzeGu3XAzG1ctQ==",
    +      "version": "1.0.4",
    +      "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz",
    +      "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==",
           "dev": true,
           "dependencies": {
    -        "minimatch": "^3.0.4"
    +        "minimatch": "^5.0.1"
    +      }
    +    },
    +    "node_modules/filelist/node_modules/brace-expansion": {
    +      "version": "2.0.1",
    +      "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
    +      "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
    +      "dev": true,
    +      "dependencies": {
    +        "balanced-match": "^1.0.0"
    +      }
    +    },
    +    "node_modules/filelist/node_modules/minimatch": {
    +      "version": "5.1.0",
    +      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.0.tgz",
    +      "integrity": "sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg==",
    +      "dev": true,
    +      "dependencies": {
    +        "brace-expansion": "^2.0.1"
    +      },
    +      "engines": {
    +        "node": ">=10"
           }
         },
         "node_modules/filesize": {
    @@ -8261,17 +8204,17 @@
           }
         },
         "node_modules/finalhandler": {
    -      "version": "1.1.2",
    -      "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz",
    -      "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==",
    +      "version": "1.2.0",
    +      "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz",
    +      "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==",
           "dev": true,
           "dependencies": {
             "debug": "2.6.9",
             "encodeurl": "~1.0.2",
             "escape-html": "~1.0.3",
    -        "on-finished": "~2.3.0",
    +        "on-finished": "2.4.1",
             "parseurl": "~1.3.3",
    -        "statuses": "~1.5.0",
    +        "statuses": "2.0.1",
             "unpipe": "~1.0.0"
           },
           "engines": {
    @@ -8290,7 +8233,7 @@
         "node_modules/finalhandler/node_modules/ms": {
           "version": "2.0.0",
           "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
    -      "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
    +      "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
           "dev": true
         },
         "node_modules/find-cache-dir": {
    @@ -8313,7 +8256,7 @@
         "node_modules/find-up": {
           "version": "2.1.0",
           "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz",
    -      "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=",
    +      "integrity": "sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==",
           "dev": true,
           "dependencies": {
             "locate-path": "^2.0.0"
    @@ -8342,9 +8285,9 @@
           "dev": true
         },
         "node_modules/follow-redirects": {
    -      "version": "1.14.9",
    -      "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.9.tgz",
    -      "integrity": "sha512-MQDfihBQYMcyy5dhRDJUHcw7lb2Pv/TuE6xP1vyraLukNDHKbDxDNaOE3NbCAdKQApno+GPRyo1YAp89yCjK4w==",
    +      "version": "1.15.1",
    +      "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.1.tgz",
    +      "integrity": "sha512-yLAMQs+k0b2m7cVxpS1VKJVvoz7SS9Td1zss3XRwXj+ZDH00RJgnuLx7E44wx02kQLrdM3aOOy+FpzS7+8OizA==",
           "funding": [
             {
               "type": "individual",
    @@ -8361,9 +8304,9 @@
           }
         },
         "node_modules/fork-ts-checker-webpack-plugin": {
    -      "version": "6.5.0",
    -      "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-6.5.0.tgz",
    -      "integrity": "sha512-cS178Y+xxtIjEUorcHddKS7yCMlrDPV31mt47blKKRfMd70Kxu5xruAFE2o9sDY6wVC5deuob/u/alD04YYHnw==",
    +      "version": "6.5.2",
    +      "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-6.5.2.tgz",
    +      "integrity": "sha512-m5cUmF30xkZ7h4tWUgTAcEaKmUW7tfyUyTqNNOz7OxWJ0v1VWKTcOvH8FWHUwSjlW/356Ijc9vi3XfcPstpQKA==",
           "dev": true,
           "dependencies": {
             "@babel/code-frame": "^7.8.3",
    @@ -8449,9 +8392,9 @@
           }
         },
         "node_modules/fork-ts-checker-webpack-plugin/node_modules/semver": {
    -      "version": "7.3.5",
    -      "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz",
    -      "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==",
    +      "version": "7.3.7",
    +      "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz",
    +      "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==",
           "dev": true,
           "dependencies": {
             "lru-cache": "^6.0.0"
    @@ -8511,16 +8454,16 @@
         "node_modules/fresh": {
           "version": "0.5.2",
           "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
    -      "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=",
    +      "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==",
           "dev": true,
           "engines": {
             "node": ">= 0.6"
           }
         },
         "node_modules/fs-extra": {
    -      "version": "10.0.1",
    -      "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.0.1.tgz",
    -      "integrity": "sha512-NbdoVMZso2Lsrn/QwLXOy6rm0ufY2zEOKCDzJR/0kBsb0E6qed0P3iYK+Ath3BfvXEeu4JhEtXLgILx5psUfag==",
    +      "version": "10.1.0",
    +      "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz",
    +      "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==",
           "dev": true,
           "dependencies": {
             "graceful-fs": "^4.2.0",
    @@ -8540,7 +8483,7 @@
         "node_modules/fs.realpath": {
           "version": "1.0.0",
           "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
    -      "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
    +      "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==",
           "dev": true
         },
         "node_modules/fsevents": {
    @@ -8582,14 +8525,13 @@
         "node_modules/functional-red-black-tree": {
           "version": "1.0.1",
           "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz",
    -      "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=",
    +      "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==",
           "dev": true
         },
         "node_modules/functions-have-names": {
    -      "version": "1.2.2",
    -      "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.2.tgz",
    -      "integrity": "sha512-bLgc3asbWdwPbx2mNk2S49kmJCuQeu0nfmaOgbs8WIyzzkw3r4htszdIi9Q9EMezDPTYuJx2wvjZ/EwgAthpnA==",
    -      "dev": true,
    +      "version": "1.2.3",
    +      "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz",
    +      "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==",
           "funding": {
             "url": "https://github.com/sponsors/ljharb"
           }
    @@ -8613,13 +8555,13 @@
           }
         },
         "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==",
    +      "version": "1.1.2",
    +      "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.2.tgz",
    +      "integrity": "sha512-Jfm3OyCxHh9DJyc28qGk+JmfkpO41A4XkneDSujN9MDXrm4oDKdHvndhZ2dN94+ERNfkYJWDclW6k2L/ZGHjXA==",
           "dependencies": {
             "function-bind": "^1.1.1",
             "has": "^1.0.3",
    -        "has-symbols": "^1.0.1"
    +        "has-symbols": "^1.0.3"
           },
           "funding": {
             "url": "https://github.com/sponsors/ljharb"
    @@ -8669,15 +8611,15 @@
           }
         },
         "node_modules/glob": {
    -      "version": "7.2.0",
    -      "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz",
    -      "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==",
    +      "version": "7.2.3",
    +      "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
    +      "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
           "dev": true,
           "dependencies": {
             "fs.realpath": "^1.0.0",
             "inflight": "^1.0.4",
             "inherits": "2",
    -        "minimatch": "^3.0.4",
    +        "minimatch": "^3.1.1",
             "once": "^1.3.0",
             "path-is-absolute": "^1.0.0"
           },
    @@ -8745,9 +8687,9 @@
           }
         },
         "node_modules/globals": {
    -      "version": "13.13.0",
    -      "resolved": "https://registry.npmjs.org/globals/-/globals-13.13.0.tgz",
    -      "integrity": "sha512-EQ7Q18AJlPwp3vUDL4mKA0KXrXyNIQyWon6T6XQiBQF0XHvRsiCSrWmmeATpUzdJN2HhWZU6Pdl0a9zdep5p6A==",
    +      "version": "13.15.0",
    +      "resolved": "https://registry.npmjs.org/globals/-/globals-13.15.0.tgz",
    +      "integrity": "sha512-bpzcOlgDhMG070Av0Vy5Owklpv1I6+j96GhUI7Rh7IzDCKLzboflLrrfqMu8NquDbiR4EOQk7XzJwqVJxicxog==",
           "dev": true,
           "dependencies": {
             "type-fest": "^0.20.2"
    @@ -8780,9 +8722,9 @@
           }
         },
         "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==",
    +      "version": "4.2.10",
    +      "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz",
    +      "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==",
           "dev": true
         },
         "node_modules/gud": {
    @@ -8829,9 +8771,9 @@
           }
         },
         "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==",
    +      "version": "1.0.2",
    +      "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz",
    +      "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==",
           "dev": true,
           "funding": {
             "url": "https://github.com/sponsors/ljharb"
    @@ -8846,6 +8788,17 @@
             "node": ">=8"
           }
         },
    +    "node_modules/has-property-descriptors": {
    +      "version": "1.0.0",
    +      "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz",
    +      "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==",
    +      "dependencies": {
    +        "get-intrinsic": "^1.1.1"
    +      },
    +      "funding": {
    +        "url": "https://github.com/sponsors/ljharb"
    +      }
    +    },
         "node_modules/has-symbols": {
           "version": "1.0.3",
           "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz",
    @@ -8918,7 +8871,7 @@
         "node_modules/hpack.js": {
           "version": "2.1.6",
           "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz",
    -      "integrity": "sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI=",
    +      "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==",
           "dev": true,
           "dependencies": {
             "inherits": "^2.0.1",
    @@ -8927,6 +8880,12 @@
             "wbuf": "^1.1.0"
           }
         },
    +    "node_modules/hpack.js/node_modules/isarray": {
    +      "version": "1.0.0",
    +      "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
    +      "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==",
    +      "dev": true
    +    },
         "node_modules/hpack.js/node_modules/readable-stream": {
           "version": "2.3.7",
           "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
    @@ -8977,9 +8936,9 @@
           }
         },
         "node_modules/html-entities": {
    -      "version": "2.3.2",
    -      "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.3.2.tgz",
    -      "integrity": "sha512-c3Ab/url5ksaT0WyleslpBEthOzWhrjQbg75y7XUsfSzi3Dgzt0l8w5e7DylRn15MTlMMD58dTfzddNS2kcAjQ==",
    +      "version": "2.3.3",
    +      "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.3.3.tgz",
    +      "integrity": "sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA==",
           "dev": true
         },
         "node_modules/html-escaper": {
    @@ -9050,26 +9009,74 @@
             "entities": "^2.0.0"
           }
         },
    +    "node_modules/htmlparser2/node_modules/dom-serializer": {
    +      "version": "1.4.1",
    +      "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz",
    +      "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==",
    +      "dependencies": {
    +        "domelementtype": "^2.0.1",
    +        "domhandler": "^4.2.0",
    +        "entities": "^2.0.0"
    +      },
    +      "funding": {
    +        "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1"
    +      }
    +    },
    +    "node_modules/htmlparser2/node_modules/domhandler": {
    +      "version": "4.3.1",
    +      "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz",
    +      "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==",
    +      "dependencies": {
    +        "domelementtype": "^2.2.0"
    +      },
    +      "engines": {
    +        "node": ">= 4"
    +      },
    +      "funding": {
    +        "url": "https://github.com/fb55/domhandler?sponsor=1"
    +      }
    +    },
    +    "node_modules/htmlparser2/node_modules/domutils": {
    +      "version": "2.8.0",
    +      "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz",
    +      "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==",
    +      "dependencies": {
    +        "dom-serializer": "^1.0.1",
    +        "domelementtype": "^2.2.0",
    +        "domhandler": "^4.2.0"
    +      },
    +      "funding": {
    +        "url": "https://github.com/fb55/domutils?sponsor=1"
    +      }
    +    },
    +    "node_modules/htmlparser2/node_modules/entities": {
    +      "version": "2.2.0",
    +      "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz",
    +      "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==",
    +      "funding": {
    +        "url": "https://github.com/fb55/entities?sponsor=1"
    +      }
    +    },
         "node_modules/http-deceiver": {
           "version": "1.2.7",
           "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz",
    -      "integrity": "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc=",
    +      "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==",
           "dev": true
         },
         "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==",
    +      "version": "2.0.0",
    +      "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz",
    +      "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==",
           "dev": true,
           "dependencies": {
    -        "depd": "~1.1.2",
    +        "depd": "2.0.0",
             "inherits": "2.0.4",
             "setprototypeof": "1.2.0",
    -        "statuses": ">= 1.5.0 < 2",
    +        "statuses": "2.0.1",
             "toidentifier": "1.0.1"
           },
           "engines": {
    -        "node": ">= 0.6"
    +        "node": ">= 0.8"
           }
         },
         "node_modules/http-parser-js": {
    @@ -9129,9 +9136,9 @@
           }
         },
         "node_modules/https-proxy-agent": {
    -      "version": "5.0.0",
    -      "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz",
    -      "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==",
    +      "version": "5.0.1",
    +      "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz",
    +      "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==",
           "dev": true,
           "dependencies": {
             "agent-base": "6",
    @@ -9183,7 +9190,7 @@
         "node_modules/identity-obj-proxy": {
           "version": "3.0.0",
           "resolved": "https://registry.npmjs.org/identity-obj-proxy/-/identity-obj-proxy-3.0.0.tgz",
    -      "integrity": "sha1-lNK9qWCERT7zb7xarsN+D3nx/BQ=",
    +      "integrity": "sha512-00n6YnVHKrinT9t0d9+5yZC6UBNJANpYEQvL2LlX6Ab9lnmxzIRcEmTPuyGScvl1+jKuCICX1Z0Ab1pPKKdikA==",
           "dev": true,
           "dependencies": {
             "harmony-reflect": "^1.4.6"
    @@ -9202,9 +9209,9 @@
           }
         },
         "node_modules/immer": {
    -      "version": "9.0.12",
    -      "resolved": "https://registry.npmjs.org/immer/-/immer-9.0.12.tgz",
    -      "integrity": "sha512-lk7UNmSbAukB5B6dh9fnh5D0bJTOFKxVg2cyJWTYrWRfhLrLMBquONcUs3aFq507hNoIZEDDh8lb8UtOizSMhA==",
    +      "version": "9.0.15",
    +      "resolved": "https://registry.npmjs.org/immer/-/immer-9.0.15.tgz",
    +      "integrity": "sha512-2eB/sswms9AEUSkOm4SbV5Y7Vmt/bKRwByd52jfLkW4OLYeaTP3EEiJ9agqU0O/tq6Dk62Zfj+TJSqfm1rLVGQ==",
           "dev": true,
           "funding": {
             "type": "opencollective",
    @@ -9212,9 +9219,9 @@
           }
         },
         "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=="
    +      "version": "4.1.0",
    +      "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.1.0.tgz",
    +      "integrity": "sha512-oNkuqVTA8jqG1Q6c+UglTOD1xhC1BtjKI7XkCXRkZHrN5m18/XsnUp8Q89GkQO/z+0WjonSvl0FLhDYftp46nQ=="
         },
         "node_modules/import-fresh": {
           "version": "3.3.0",
    @@ -9254,25 +9261,16 @@
         "node_modules/imurmurhash": {
           "version": "0.1.4",
           "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
    -      "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=",
    +      "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==",
           "dev": true,
           "engines": {
             "node": ">=0.8.19"
           }
         },
    -    "node_modules/indent-string": {
    -      "version": "4.0.0",
    -      "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz",
    -      "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==",
    -      "dev": true,
    -      "engines": {
    -        "node": ">=8"
    -      }
    -    },
         "node_modules/inflight": {
           "version": "1.0.6",
           "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
    -      "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
    +      "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==",
           "dev": true,
           "dependencies": {
             "once": "^1.3.0",
    @@ -9305,12 +9303,6 @@
             "node": ">= 0.4"
           }
         },
    -    "node_modules/ip": {
    -      "version": "1.1.5",
    -      "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz",
    -      "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=",
    -      "dev": true
    -    },
         "node_modules/ipaddr.js": {
           "version": "2.0.1",
           "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.0.1.tgz",
    @@ -9338,7 +9330,7 @@
         "node_modules/is-arrayish": {
           "version": "0.2.1",
           "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
    -      "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=",
    +      "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==",
           "dev": true
         },
         "node_modules/is-bigint": {
    @@ -9393,9 +9385,9 @@
           }
         },
         "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==",
    +      "version": "2.9.0",
    +      "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.9.0.tgz",
    +      "integrity": "sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==",
           "dev": true,
           "dependencies": {
             "has": "^1.0.3"
    @@ -9436,7 +9428,7 @@
         "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=",
    +      "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
           "engines": {
             "node": ">=0.10.0"
           }
    @@ -9473,7 +9465,7 @@
         "node_modules/is-module": {
           "version": "1.0.0",
           "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz",
    -      "integrity": "sha1-Mlj7afeMFNW4FdZkM2tM/7ZEFZE=",
    +      "integrity": "sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==",
           "dev": true
         },
         "node_modules/is-negative-zero": {
    @@ -9497,9 +9489,9 @@
           }
         },
         "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==",
    +      "version": "1.0.7",
    +      "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz",
    +      "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==",
           "dev": true,
           "dependencies": {
             "has-tostringtag": "^1.0.0"
    @@ -9514,30 +9506,12 @@
         "node_modules/is-obj": {
           "version": "1.0.1",
           "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz",
    -      "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=",
    +      "integrity": "sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==",
           "dev": true,
           "engines": {
             "node": ">=0.10.0"
           }
         },
    -    "node_modules/is-path-cwd": {
    -      "version": "2.2.0",
    -      "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz",
    -      "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==",
    -      "dev": true,
    -      "engines": {
    -        "node": ">=6"
    -      }
    -    },
    -    "node_modules/is-path-inside": {
    -      "version": "3.0.3",
    -      "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz",
    -      "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==",
    -      "dev": true,
    -      "engines": {
    -        "node": ">=8"
    -      }
    -    },
         "node_modules/is-plain-obj": {
           "version": "3.0.0",
           "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz",
    @@ -9581,7 +9555,7 @@
         "node_modules/is-regexp": {
           "version": "1.0.0",
           "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz",
    -      "integrity": "sha1-/S2INUXEa6xaYz57mgnof6LLUGk=",
    +      "integrity": "sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA==",
           "dev": true,
           "engines": {
             "node": ">=0.10.0"
    @@ -9597,10 +9571,13 @@
           }
         },
         "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==",
    +      "version": "1.0.2",
    +      "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz",
    +      "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==",
           "dev": true,
    +      "dependencies": {
    +        "call-bind": "^1.0.2"
    +      },
           "funding": {
             "url": "https://github.com/sponsors/ljharb"
           }
    @@ -9635,7 +9612,7 @@
         "node_modules/is-subset": {
           "version": "0.1.1",
           "resolved": "https://registry.npmjs.org/is-subset/-/is-subset-0.1.1.tgz",
    -      "integrity": "sha1-ilkRfZMt4d4A8kX83TnOQ/HpOaY=",
    +      "integrity": "sha512-6Ybun0IkarhmEqxXCNw/C0bna6Zb/TkfUX9UbwJtK6ObwAVCxmAP308WWTHviM/zAqXk05cdhYsUsZeGQh99iw==",
           "dev": true
         },
         "node_modules/is-symbol": {
    @@ -9656,7 +9633,7 @@
         "node_modules/is-typedarray": {
           "version": "1.0.0",
           "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
    -      "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=",
    +      "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==",
           "dev": true
         },
         "node_modules/is-weakref": {
    @@ -9684,15 +9661,14 @@
           }
         },
         "node_modules/isarray": {
    -      "version": "1.0.0",
    -      "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
    -      "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
    -      "dev": true
    +      "version": "0.0.1",
    +      "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
    +      "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ=="
         },
         "node_modules/isexe": {
           "version": "2.0.0",
           "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
    -      "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=",
    +      "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
           "dev": true
         },
         "node_modules/isomorphic-fetch": {
    @@ -9715,9 +9691,9 @@
           }
         },
         "node_modules/istanbul-lib-instrument": {
    -      "version": "5.1.0",
    -      "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.1.0.tgz",
    -      "integrity": "sha512-czwUz525rkOFDJxfKK6mYfIs9zBKILyrZQxjz3ABhjQXhbhFsSbo1HW/BFcsDnfJYJWA6thRR5/TUY2qs5W99Q==",
    +      "version": "5.2.0",
    +      "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.0.tgz",
    +      "integrity": "sha512-6Lthe1hqXHBNsqvgDzGO6l03XNeu3CrG4RqQ1KM9+l5+jNGpEJfIELx1NS3SEHmJQA8np/u+E4EPRKRiu6m19A==",
           "dev": true,
           "dependencies": {
             "@babel/core": "^7.12.3",
    @@ -9758,15 +9734,6 @@
             "node": ">=10"
           }
         },
    -    "node_modules/istanbul-lib-source-maps/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/istanbul-reports": {
           "version": "3.1.4",
           "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.4.tgz",
    @@ -9781,12 +9748,12 @@
           }
         },
         "node_modules/jake": {
    -      "version": "10.8.4",
    -      "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.4.tgz",
    -      "integrity": "sha512-MtWeTkl1qGsWUtbl/Jsca/8xSoK3x0UmS82sNbjqxxG/de/M/3b1DntdjHgPMC50enlTNwXOCRqPXLLt5cCfZA==",
    +      "version": "10.8.5",
    +      "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.5.tgz",
    +      "integrity": "sha512-sVpxYeuAhWt0OTWITwT98oyV0GsXyMlXCF+3L1SuafBVUIr/uILGRB+NqwkzhgXKvoJpDIpQvqkUALgdmQsQxw==",
           "dev": true,
           "dependencies": {
    -        "async": "0.9.x",
    +        "async": "^3.2.3",
             "chalk": "^4.0.2",
             "filelist": "^1.0.1",
             "minimatch": "^3.0.4"
    @@ -9798,12 +9765,6 @@
             "node": ">=10"
           }
         },
    -    "node_modules/jake/node_modules/async": {
    -      "version": "0.9.2",
    -      "resolved": "https://registry.npmjs.org/async/-/async-0.9.2.tgz",
    -      "integrity": "sha1-rqdNXmHB+JlhO/ZL2mbUx48v0X0=",
    -      "dev": true
    -    },
         "node_modules/jest": {
           "version": "27.5.1",
           "resolved": "https://registry.npmjs.org/jest/-/jest-27.5.1.tgz",
    @@ -9830,9 +9791,9 @@
           }
         },
         "node_modules/jest-canvas-mock": {
    -      "version": "2.3.1",
    -      "resolved": "https://registry.npmjs.org/jest-canvas-mock/-/jest-canvas-mock-2.3.1.tgz",
    -      "integrity": "sha512-5FnSZPrX3Q2ZfsbYNE3wqKR3+XorN8qFzDzB5o0golWgt6EOX1+emBnpOc9IAQ+NXFj8Nzm3h7ZdE/9H0ylBcg==",
    +      "version": "2.4.0",
    +      "resolved": "https://registry.npmjs.org/jest-canvas-mock/-/jest-canvas-mock-2.4.0.tgz",
    +      "integrity": "sha512-mmMpZzpmLzn5vepIaHk5HoH3Ka4WykbSoLuG/EKoJd0x0ID/t+INo1l8ByfcUJuDM+RIsL4QDg/gDnBbrj2/IQ==",
           "dev": true,
           "dependencies": {
             "cssfontparser": "^1.2.1",
    @@ -10345,9 +10306,9 @@
           }
         },
         "node_modules/jest-snapshot/node_modules/semver": {
    -      "version": "7.3.5",
    -      "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz",
    -      "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==",
    +      "version": "7.3.7",
    +      "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz",
    +      "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==",
           "dev": true,
           "dependencies": {
             "lru-cache": "^6.0.0"
    @@ -10393,16 +10354,28 @@
             "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
           }
         },
    +    "node_modules/jest-validate/node_modules/camelcase": {
    +      "version": "6.3.0",
    +      "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz",
    +      "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=10"
    +      },
    +      "funding": {
    +        "url": "https://github.com/sponsors/sindresorhus"
    +      }
    +    },
         "node_modules/jest-watch-typeahead": {
    -      "version": "1.0.0",
    -      "resolved": "https://registry.npmjs.org/jest-watch-typeahead/-/jest-watch-typeahead-1.0.0.tgz",
    -      "integrity": "sha512-jxoszalAb394WElmiJTFBMzie/RDCF+W7Q29n5LzOPtcoQoHWfdUtHFkbhgf5NwWe8uMOxvKb/g7ea7CshfkTw==",
    +      "version": "1.1.0",
    +      "resolved": "https://registry.npmjs.org/jest-watch-typeahead/-/jest-watch-typeahead-1.1.0.tgz",
    +      "integrity": "sha512-Va5nLSJTN7YFtC2jd+7wsoe1pNe5K4ShLux/E5iHEwlB9AxaxmggY7to9KUqKojhaJw3aXqt5WAb4jGPOolpEw==",
           "dev": true,
           "dependencies": {
             "ansi-escapes": "^4.3.1",
             "chalk": "^4.0.0",
    -        "jest-regex-util": "^27.0.0",
    -        "jest-watcher": "^27.0.0",
    +        "jest-regex-util": "^28.0.0",
    +        "jest-watcher": "^28.0.0",
             "slash": "^4.0.0",
             "string-length": "^5.0.1",
             "strip-ansi": "^7.0.1"
    @@ -10411,117 +10384,328 @@
             "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
           },
           "peerDependencies": {
    -        "jest": "^27.0.0"
    +        "jest": "^27.0.0 || ^28.0.0"
           }
         },
    -    "node_modules/jest-watch-typeahead/node_modules/ansi-regex": {
    -      "version": "6.0.1",
    -      "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz",
    -      "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==",
    +    "node_modules/jest-watch-typeahead/node_modules/@jest/console": {
    +      "version": "28.1.1",
    +      "resolved": "https://registry.npmjs.org/@jest/console/-/console-28.1.1.tgz",
    +      "integrity": "sha512-0RiUocPVFEm3WRMOStIHbRWllG6iW6E3/gUPnf4lkrVFyXIIDeCe+vlKeYyFOMhB2EPE6FLFCNADSOOQMaqvyA==",
           "dev": true,
    -      "engines": {
    -        "node": ">=12"
    +      "dependencies": {
    +        "@jest/types": "^28.1.1",
    +        "@types/node": "*",
    +        "chalk": "^4.0.0",
    +        "jest-message-util": "^28.1.1",
    +        "jest-util": "^28.1.1",
    +        "slash": "^3.0.0"
           },
    -      "funding": {
    -        "url": "https://github.com/chalk/ansi-regex?sponsor=1"
    +      "engines": {
    +        "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0"
           }
         },
    -    "node_modules/jest-watch-typeahead/node_modules/char-regex": {
    -      "version": "2.0.1",
    -      "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-2.0.1.tgz",
    -      "integrity": "sha512-oSvEeo6ZUD7NepqAat3RqoucZ5SeqLJgOvVIwkafu6IP3V0pO38s/ypdVUmDDK6qIIHNlYHJAKX9E7R7HoKElw==",
    +    "node_modules/jest-watch-typeahead/node_modules/@jest/console/node_modules/slash": {
    +      "version": "3.0.0",
    +      "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
    +      "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
           "dev": true,
           "engines": {
    -        "node": ">=12.20"
    +        "node": ">=8"
           }
         },
    -    "node_modules/jest-watch-typeahead/node_modules/slash": {
    -      "version": "4.0.0",
    -      "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz",
    -      "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==",
    +    "node_modules/jest-watch-typeahead/node_modules/@jest/test-result": {
    +      "version": "28.1.1",
    +      "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-28.1.1.tgz",
    +      "integrity": "sha512-hPmkugBktqL6rRzwWAtp1JtYT4VHwv8OQ+9lE5Gymj6dHzubI/oJHMUpPOt8NrdVWSrz9S7bHjJUmv2ggFoUNQ==",
           "dev": true,
    -      "engines": {
    -        "node": ">=12"
    +      "dependencies": {
    +        "@jest/console": "^28.1.1",
    +        "@jest/types": "^28.1.1",
    +        "@types/istanbul-lib-coverage": "^2.0.0",
    +        "collect-v8-coverage": "^1.0.0"
           },
    -      "funding": {
    -        "url": "https://github.com/sponsors/sindresorhus"
    +      "engines": {
    +        "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0"
           }
         },
    -    "node_modules/jest-watch-typeahead/node_modules/string-length": {
    -      "version": "5.0.1",
    -      "resolved": "https://registry.npmjs.org/string-length/-/string-length-5.0.1.tgz",
    -      "integrity": "sha512-9Ep08KAMUn0OadnVaBuRdE2l615CQ508kr0XMadjClfYpdCyvrbFp6Taebo8yyxokQ4viUd/xPPUA4FGgUa0ow==",
    +    "node_modules/jest-watch-typeahead/node_modules/@jest/types": {
    +      "version": "28.1.1",
    +      "resolved": "https://registry.npmjs.org/@jest/types/-/types-28.1.1.tgz",
    +      "integrity": "sha512-vRXVqSg1VhDnB8bWcmvLzmg0Bt9CRKVgHPXqYwvWMX3TvAjeO+nRuK6+VdTKCtWOvYlmkF/HqNAL/z+N3B53Kw==",
           "dev": true,
           "dependencies": {
    -        "char-regex": "^2.0.0",
    -        "strip-ansi": "^7.0.1"
    +        "@jest/schemas": "^28.0.2",
    +        "@types/istanbul-lib-coverage": "^2.0.0",
    +        "@types/istanbul-reports": "^3.0.0",
    +        "@types/node": "*",
    +        "@types/yargs": "^17.0.8",
    +        "chalk": "^4.0.0"
           },
           "engines": {
    -        "node": ">=12.20"
    -      },
    -      "funding": {
    -        "url": "https://github.com/sponsors/sindresorhus"
    +        "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0"
           }
         },
    -    "node_modules/jest-watch-typeahead/node_modules/strip-ansi": {
    -      "version": "7.0.1",
    -      "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz",
    -      "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==",
    +    "node_modules/jest-watch-typeahead/node_modules/@types/yargs": {
    +      "version": "17.0.10",
    +      "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.10.tgz",
    +      "integrity": "sha512-gmEaFwpj/7f/ROdtIlci1R1VYU1J4j95m8T+Tj3iBgiBFKg1foE/PSl93bBd5T9LDXNPo8UlNN6W0qwD8O5OaA==",
           "dev": true,
           "dependencies": {
    -        "ansi-regex": "^6.0.1"
    +        "@types/yargs-parser": "*"
    +      }
    +    },
    +    "node_modules/jest-watch-typeahead/node_modules/ansi-styles": {
    +      "version": "5.2.0",
    +      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz",
    +      "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=10"
           },
    +      "funding": {
    +        "url": "https://github.com/chalk/ansi-styles?sponsor=1"
    +      }
    +    },
    +    "node_modules/jest-watch-typeahead/node_modules/emittery": {
    +      "version": "0.10.2",
    +      "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.10.2.tgz",
    +      "integrity": "sha512-aITqOwnLanpHLNXZJENbOgjUBeHocD+xsSJmNrjovKBW5HbSpW3d1pEls7GFQPUWXiwG9+0P4GtHfEqC/4M0Iw==",
    +      "dev": true,
           "engines": {
             "node": ">=12"
           },
           "funding": {
    -        "url": "https://github.com/chalk/strip-ansi?sponsor=1"
    +        "url": "https://github.com/sindresorhus/emittery?sponsor=1"
           }
         },
    -    "node_modules/jest-watcher": {
    -      "version": "27.5.1",
    -      "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-27.5.1.tgz",
    -      "integrity": "sha512-z676SuD6Z8o8qbmEGhoEUFOM1+jfEiL3DXHK/xgEiG2EyNYfFG60jluWcupY6dATjfEsKQuibReS1djInQnoVw==",
    +    "node_modules/jest-watch-typeahead/node_modules/jest-message-util": {
    +      "version": "28.1.1",
    +      "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-28.1.1.tgz",
    +      "integrity": "sha512-xoDOOT66fLfmTRiqkoLIU7v42mal/SqwDKvfmfiWAdJMSJiU+ozgluO7KbvoAgiwIrrGZsV7viETjc8GNrA/IQ==",
           "dev": true,
           "dependencies": {
    -        "@jest/test-result": "^27.5.1",
    -        "@jest/types": "^27.5.1",
    -        "@types/node": "*",
    -        "ansi-escapes": "^4.2.1",
    +        "@babel/code-frame": "^7.12.13",
    +        "@jest/types": "^28.1.1",
    +        "@types/stack-utils": "^2.0.0",
             "chalk": "^4.0.0",
    -        "jest-util": "^27.5.1",
    -        "string-length": "^4.0.1"
    +        "graceful-fs": "^4.2.9",
    +        "micromatch": "^4.0.4",
    +        "pretty-format": "^28.1.1",
    +        "slash": "^3.0.0",
    +        "stack-utils": "^2.0.3"
           },
           "engines": {
    -        "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
    +        "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0"
           }
         },
    -    "node_modules/jest-worker": {
    -      "version": "27.5.1",
    -      "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz",
    -      "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==",
    +    "node_modules/jest-watch-typeahead/node_modules/jest-message-util/node_modules/slash": {
    +      "version": "3.0.0",
    +      "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
    +      "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=8"
    +      }
    +    },
    +    "node_modules/jest-watch-typeahead/node_modules/jest-regex-util": {
    +      "version": "28.0.2",
    +      "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-28.0.2.tgz",
    +      "integrity": "sha512-4s0IgyNIy0y9FK+cjoVYoxamT7Zeo7MhzqRGx7YDYmaQn1wucY9rotiGkBzzcMXTtjrCAP/f7f+E0F7+fxPNdw==",
    +      "dev": true,
    +      "engines": {
    +        "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0"
    +      }
    +    },
    +    "node_modules/jest-watch-typeahead/node_modules/jest-util": {
    +      "version": "28.1.1",
    +      "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-28.1.1.tgz",
    +      "integrity": "sha512-FktOu7ca1DZSyhPAxgxB6hfh2+9zMoJ7aEQA759Z6p45NuO8mWcqujH+UdHlCm/V6JTWwDztM2ITCzU1ijJAfw==",
           "dev": true,
           "dependencies": {
    +        "@jest/types": "^28.1.1",
             "@types/node": "*",
    -        "merge-stream": "^2.0.0",
    -        "supports-color": "^8.0.0"
    +        "chalk": "^4.0.0",
    +        "ci-info": "^3.2.0",
    +        "graceful-fs": "^4.2.9",
    +        "picomatch": "^2.2.3"
           },
           "engines": {
    -        "node": ">= 10.13.0"
    +        "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0"
           }
         },
    -    "node_modules/jest-worker/node_modules/supports-color": {
    -      "version": "8.1.1",
    -      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz",
    -      "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==",
    +    "node_modules/jest-watch-typeahead/node_modules/jest-watcher": {
    +      "version": "28.1.1",
    +      "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-28.1.1.tgz",
    +      "integrity": "sha512-RQIpeZ8EIJMxbQrXpJQYIIlubBnB9imEHsxxE41f54ZwcqWLysL/A0ZcdMirf+XsMn3xfphVQVV4EW0/p7i7Ug==",
           "dev": true,
           "dependencies": {
    -        "has-flag": "^4.0.0"
    +        "@jest/test-result": "^28.1.1",
    +        "@jest/types": "^28.1.1",
    +        "@types/node": "*",
    +        "ansi-escapes": "^4.2.1",
    +        "chalk": "^4.0.0",
    +        "emittery": "^0.10.2",
    +        "jest-util": "^28.1.1",
    +        "string-length": "^4.0.1"
           },
           "engines": {
    -        "node": ">=10"
    -      },
    -      "funding": {
    +        "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0"
    +      }
    +    },
    +    "node_modules/jest-watch-typeahead/node_modules/jest-watcher/node_modules/string-length": {
    +      "version": "4.0.2",
    +      "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz",
    +      "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==",
    +      "dev": true,
    +      "dependencies": {
    +        "char-regex": "^1.0.2",
    +        "strip-ansi": "^6.0.0"
    +      },
    +      "engines": {
    +        "node": ">=10"
    +      }
    +    },
    +    "node_modules/jest-watch-typeahead/node_modules/jest-watcher/node_modules/strip-ansi": {
    +      "version": "6.0.1",
    +      "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
    +      "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
    +      "dev": true,
    +      "dependencies": {
    +        "ansi-regex": "^5.0.1"
    +      },
    +      "engines": {
    +        "node": ">=8"
    +      }
    +    },
    +    "node_modules/jest-watch-typeahead/node_modules/pretty-format": {
    +      "version": "28.1.1",
    +      "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-28.1.1.tgz",
    +      "integrity": "sha512-wwJbVTGFHeucr5Jw2bQ9P+VYHyLdAqedFLEkdQUVaBF/eiidDwH5OpilINq4mEfhbCjLnirt6HTTDhv1HaTIQw==",
    +      "dev": true,
    +      "dependencies": {
    +        "@jest/schemas": "^28.0.2",
    +        "ansi-regex": "^5.0.1",
    +        "ansi-styles": "^5.0.0",
    +        "react-is": "^18.0.0"
    +      },
    +      "engines": {
    +        "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0"
    +      }
    +    },
    +    "node_modules/jest-watch-typeahead/node_modules/react-is": {
    +      "version": "18.1.0",
    +      "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.1.0.tgz",
    +      "integrity": "sha512-Fl7FuabXsJnV5Q1qIOQwx/sagGF18kogb4gpfcG4gjLBWO0WDiiz1ko/ExayuxE7InyQkBLkxRFG5oxY6Uu3Kg==",
    +      "dev": true
    +    },
    +    "node_modules/jest-watch-typeahead/node_modules/slash": {
    +      "version": "4.0.0",
    +      "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz",
    +      "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=12"
    +      },
    +      "funding": {
    +        "url": "https://github.com/sponsors/sindresorhus"
    +      }
    +    },
    +    "node_modules/jest-watch-typeahead/node_modules/string-length": {
    +      "version": "5.0.1",
    +      "resolved": "https://registry.npmjs.org/string-length/-/string-length-5.0.1.tgz",
    +      "integrity": "sha512-9Ep08KAMUn0OadnVaBuRdE2l615CQ508kr0XMadjClfYpdCyvrbFp6Taebo8yyxokQ4viUd/xPPUA4FGgUa0ow==",
    +      "dev": true,
    +      "dependencies": {
    +        "char-regex": "^2.0.0",
    +        "strip-ansi": "^7.0.1"
    +      },
    +      "engines": {
    +        "node": ">=12.20"
    +      },
    +      "funding": {
    +        "url": "https://github.com/sponsors/sindresorhus"
    +      }
    +    },
    +    "node_modules/jest-watch-typeahead/node_modules/string-length/node_modules/char-regex": {
    +      "version": "2.0.1",
    +      "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-2.0.1.tgz",
    +      "integrity": "sha512-oSvEeo6ZUD7NepqAat3RqoucZ5SeqLJgOvVIwkafu6IP3V0pO38s/ypdVUmDDK6qIIHNlYHJAKX9E7R7HoKElw==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=12.20"
    +      }
    +    },
    +    "node_modules/jest-watch-typeahead/node_modules/strip-ansi": {
    +      "version": "7.0.1",
    +      "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz",
    +      "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==",
    +      "dev": true,
    +      "dependencies": {
    +        "ansi-regex": "^6.0.1"
    +      },
    +      "engines": {
    +        "node": ">=12"
    +      },
    +      "funding": {
    +        "url": "https://github.com/chalk/strip-ansi?sponsor=1"
    +      }
    +    },
    +    "node_modules/jest-watch-typeahead/node_modules/strip-ansi/node_modules/ansi-regex": {
    +      "version": "6.0.1",
    +      "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz",
    +      "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=12"
    +      },
    +      "funding": {
    +        "url": "https://github.com/chalk/ansi-regex?sponsor=1"
    +      }
    +    },
    +    "node_modules/jest-watcher": {
    +      "version": "27.5.1",
    +      "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-27.5.1.tgz",
    +      "integrity": "sha512-z676SuD6Z8o8qbmEGhoEUFOM1+jfEiL3DXHK/xgEiG2EyNYfFG60jluWcupY6dATjfEsKQuibReS1djInQnoVw==",
    +      "dev": true,
    +      "dependencies": {
    +        "@jest/test-result": "^27.5.1",
    +        "@jest/types": "^27.5.1",
    +        "@types/node": "*",
    +        "ansi-escapes": "^4.2.1",
    +        "chalk": "^4.0.0",
    +        "jest-util": "^27.5.1",
    +        "string-length": "^4.0.1"
    +      },
    +      "engines": {
    +        "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
    +      }
    +    },
    +    "node_modules/jest-worker": {
    +      "version": "27.5.1",
    +      "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz",
    +      "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==",
    +      "dev": true,
    +      "dependencies": {
    +        "@types/node": "*",
    +        "merge-stream": "^2.0.0",
    +        "supports-color": "^8.0.0"
    +      },
    +      "engines": {
    +        "node": ">= 10.13.0"
    +      }
    +    },
    +    "node_modules/jest-worker/node_modules/supports-color": {
    +      "version": "8.1.1",
    +      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz",
    +      "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==",
    +      "dev": true,
    +      "dependencies": {
    +        "has-flag": "^4.0.0"
    +      },
    +      "engines": {
    +        "node": ">=10"
    +      },
    +      "funding": {
             "url": "https://github.com/chalk/supports-color?sponsor=1"
           }
         },
    @@ -10533,7 +10717,7 @@
         "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="
    +      "integrity": "sha512-TV3umIfIPRq1UM0EUY4E/jimrh2j057J6SJB1HQnEeS64r8liec++F0WCNYsmcWDxz6Lo4E2lCA+SeOQS2W3bA=="
         },
         "node_modules/js-tokens": {
           "version": "4.0.0",
    @@ -10598,31 +10782,11 @@
             }
           }
         },
    -    "node_modules/jsdom/node_modules/tr46": {
    -      "version": "2.1.0",
    -      "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz",
    -      "integrity": "sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==",
    -      "dev": true,
    -      "dependencies": {
    -        "punycode": "^2.1.1"
    -      },
    -      "engines": {
    -        "node": ">=8"
    -      }
    -    },
    -    "node_modules/jsdom/node_modules/whatwg-url": {
    -      "version": "8.7.0",
    -      "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.7.0.tgz",
    -      "integrity": "sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==",
    -      "dev": true,
    -      "dependencies": {
    -        "lodash": "^4.7.0",
    -        "tr46": "^2.1.0",
    -        "webidl-conversions": "^6.1.0"
    -      },
    -      "engines": {
    -        "node": ">=10"
    -      }
    +    "node_modules/jsdom/node_modules/parse5": {
    +      "version": "6.0.1",
    +      "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz",
    +      "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==",
    +      "dev": true
         },
         "node_modules/jsesc": {
           "version": "2.5.2",
    @@ -10636,12 +10800,6 @@
             "node": ">=4"
           }
         },
    -    "node_modules/json-parse-better-errors": {
    -      "version": "1.0.2",
    -      "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz",
    -      "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==",
    -      "dev": true
    -    },
         "node_modules/json-parse-even-better-errors": {
           "version": "2.3.1",
           "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz",
    @@ -10663,13 +10821,13 @@
         "node_modules/json-stable-stringify-without-jsonify": {
           "version": "1.0.1",
           "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
    -      "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=",
    +      "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==",
           "dev": true
         },
         "node_modules/json-stringify-safe": {
           "version": "5.0.1",
           "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
    -      "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=",
    +      "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==",
           "dev": true
         },
         "node_modules/json5": {
    @@ -10706,12 +10864,12 @@
           }
         },
         "node_modules/jsx-ast-utils": {
    -      "version": "3.2.1",
    -      "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.2.1.tgz",
    -      "integrity": "sha512-uP5vu8xfy2F9A6LGC22KO7e2/vGTS1MhP+18f++ZNlf0Ohaxbc9nIEwHAsejlJKyzfZzU5UIhe5ItYkitcZnZA==",
    +      "version": "3.3.0",
    +      "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.0.tgz",
    +      "integrity": "sha512-XzO9luP6L0xkxwhIJMTJQpZo/eeN60K08jHdexfD569AGxeNug6UketeHXEhROoM8aR7EcUoOQmIhcJQjcuq8Q==",
           "dev": true,
           "dependencies": {
    -        "array-includes": "^3.1.3",
    +        "array-includes": "^3.1.4",
             "object.assign": "^4.1.2"
           },
           "engines": {
    @@ -10760,7 +10918,7 @@
         "node_modules/language-tags": {
           "version": "1.0.5",
           "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.5.tgz",
    -      "integrity": "sha1-0yHbxNowuovzAk4ED6XBRmH5GTo=",
    +      "integrity": "sha512-qJhlO9cGXi6hBGKoxEG/sKZDAHD5Hnu9Hs4WbOY3pCWXDhw0N8x1NenNzm2EnNLkLkk7J2SdxAkDSbb6ftT+UQ==",
           "dev": true,
           "dependencies": {
             "language-subtag-registry": "~0.3.2"
    @@ -10789,9 +10947,9 @@
           }
         },
         "node_modules/lilconfig": {
    -      "version": "2.0.4",
    -      "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.4.tgz",
    -      "integrity": "sha512-bfTIN7lEsiooCocSISTWXkiWJkRqtL9wYtYy+8EK3Y41qh3mpwPU0ycTOgjdY9ErwXCc8QyrQp82bdL0Xkm9yA==",
    +      "version": "2.0.5",
    +      "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.5.tgz",
    +      "integrity": "sha512-xaYmXZtTHPAw5m+xLN8ab9C+3a8YmV3asNSPOATITbtwrfbwaLJj8h66H1WMIpALCkqsIzK3h7oQ+PdX+LQ9Eg==",
           "dev": true,
           "engines": {
             "node": ">=10"
    @@ -10804,9 +10962,9 @@
           "dev": true
         },
         "node_modules/loader-runner": {
    -      "version": "4.2.0",
    -      "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.2.0.tgz",
    -      "integrity": "sha512-92+huvxMvYlMzMt0iIOukcwYBFpkYJdpl2xsZ7LrlayO7E8SOv+JJUEK17B/dJIHAOLMfh2dZZ/Y18WgmGtYNw==",
    +      "version": "4.3.0",
    +      "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz",
    +      "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==",
           "dev": true,
           "engines": {
             "node": ">=6.11.5"
    @@ -10829,7 +10987,7 @@
         "node_modules/locate-path": {
           "version": "2.0.0",
           "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz",
    -      "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=",
    +      "integrity": "sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==",
           "dev": true,
           "dependencies": {
             "p-locate": "^2.0.0",
    @@ -10847,37 +11005,37 @@
         "node_modules/lodash.debounce": {
           "version": "4.0.8",
           "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz",
    -      "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=",
    +      "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==",
           "dev": true
         },
         "node_modules/lodash.escape": {
           "version": "4.0.1",
           "resolved": "https://registry.npmjs.org/lodash.escape/-/lodash.escape-4.0.1.tgz",
    -      "integrity": "sha1-yQRGkMIeBClL6qUXcS/e0fqI3pg=",
    +      "integrity": "sha512-nXEOnb/jK9g0DYMr1/Xvq6l5xMD7GDG55+GSYIYmS0G4tBk/hURD4JR9WCavs04t33WmJx9kCyp9vJ+mr4BOUw==",
           "dev": true
         },
         "node_modules/lodash.flattendeep": {
           "version": "4.4.0",
           "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz",
    -      "integrity": "sha1-+wMJF/hqMTTlvJvsDWngAT3f7bI=",
    +      "integrity": "sha512-uHaJFihxmJcEX3kT4I23ABqKKalJ/zDrDg0lsFtc1h+3uw49SIJ5beyhx5ExVRti3AvKoOJngIj7xz3oylPdWQ==",
           "dev": true
         },
         "node_modules/lodash.get": {
           "version": "4.4.2",
           "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz",
    -      "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=",
    +      "integrity": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==",
           "dev": true
         },
         "node_modules/lodash.isequal": {
           "version": "4.5.0",
           "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz",
    -      "integrity": "sha1-QVxEePK8wwEgwizhDtMib30+GOA=",
    +      "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==",
           "dev": true
         },
         "node_modules/lodash.memoize": {
           "version": "4.1.2",
           "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz",
    -      "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=",
    +      "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==",
           "dev": true
         },
         "node_modules/lodash.merge": {
    @@ -10886,22 +11044,16 @@
           "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==",
           "dev": true
         },
    -    "node_modules/lodash.set": {
    -      "version": "4.3.2",
    -      "resolved": "https://registry.npmjs.org/lodash.set/-/lodash.set-4.3.2.tgz",
    -      "integrity": "sha1-2HV7HagH3eJIFrDWqEvqGnYjCyM=",
    -      "dev": true
    -    },
         "node_modules/lodash.sortby": {
           "version": "4.7.0",
           "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz",
    -      "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=",
    +      "integrity": "sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==",
           "dev": true
         },
         "node_modules/lodash.uniq": {
           "version": "4.5.0",
           "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz",
    -      "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=",
    +      "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==",
           "dev": true
         },
         "node_modules/loose-envify": {
    @@ -10983,16 +11135,16 @@
         "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=",
    +      "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==",
           "dev": true,
           "engines": {
             "node": ">= 0.6"
           }
         },
         "node_modules/memfs": {
    -      "version": "3.4.1",
    -      "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.4.1.tgz",
    -      "integrity": "sha512-1c9VPVvW5P7I85c35zAdEr1TD5+F11IToIHIlrVIcflfnzPkJa0ZoYEoEdYDP8KgPFoSZ/opDrUsAoZWym3mtw==",
    +      "version": "3.4.4",
    +      "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.4.4.tgz",
    +      "integrity": "sha512-W4gHNUE++1oSJVn8Y68jPXi+mkx3fXR5ITE/Ubz6EQ3xRpCN5k2CQ4AUR8094Z7211F876TyoBACGsIveqgiGA==",
           "dev": true,
           "dependencies": {
             "fs-monkey": "1.0.3"
    @@ -11004,7 +11156,7 @@
         "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=",
    +      "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==",
           "dev": true
         },
         "node_modules/merge-stream": {
    @@ -11025,19 +11177,19 @@
         "node_modules/methods": {
           "version": "1.1.2",
           "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
    -      "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=",
    +      "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==",
           "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==",
    +      "version": "4.0.5",
    +      "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz",
    +      "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==",
           "dependencies": {
    -        "braces": "^3.0.1",
    -        "picomatch": "^2.2.3"
    +        "braces": "^3.0.2",
    +        "picomatch": "^2.3.1"
           },
           "engines": {
             "node": ">=8.6"
    @@ -11118,9 +11270,9 @@
           }
         },
         "node_modules/mini-css-extract-plugin/node_modules/ajv": {
    -      "version": "8.10.0",
    -      "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.10.0.tgz",
    -      "integrity": "sha512-bzqAEZOjkrUMl2afH8dknrq5KEk2SrwdBROR+vH1EKVQTqaUbJVPdc/gEdggTMM0Se+s+Ja4ju4TlNcStKl2Hw==",
    +      "version": "8.11.0",
    +      "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz",
    +      "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==",
           "dev": true,
           "dependencies": {
             "fast-deep-equal": "^3.1.1",
    @@ -11195,21 +11347,21 @@
           "dev": true
         },
         "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==",
    +      "version": "0.5.6",
    +      "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz",
    +      "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==",
           "dev": true,
           "dependencies": {
    -        "minimist": "^1.2.5"
    +        "minimist": "^1.2.6"
           },
           "bin": {
             "mkdirp": "bin/cmd.js"
           }
         },
         "node_modules/moment": {
    -      "version": "2.29.2",
    -      "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.2.tgz",
    -      "integrity": "sha512-UgzG4rvxYpN15jgCmVJwac49h9ly9NurikMWGPdVxm8GZD6XjkKPxDTjQQ43gtGgnV3X0cAyWDdP2Wexoquifg==",
    +      "version": "2.29.3",
    +      "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.3.tgz",
    +      "integrity": "sha512-c6YRvhEo//6T2Jz/vVtYzqBzwvPT95JBQ+smCytzf7c50oMZRsR/a4w88aD34I+/QVSfnoAnSBFPJHItlOMJVw==",
           "engines": {
             "node": "*"
           }
    @@ -11232,9 +11384,9 @@
           "dev": true
         },
         "node_modules/moo-color": {
    -      "version": "1.0.2",
    -      "resolved": "https://registry.npmjs.org/moo-color/-/moo-color-1.0.2.tgz",
    -      "integrity": "sha512-5iXz5n9LWQzx/C2WesGFfpE6RLamzdHwsn3KpfzShwbfIqs7stnoEpaNErf/7+3mbxwZ4s8Foq7I0tPxw7BWHg==",
    +      "version": "1.0.3",
    +      "resolved": "https://registry.npmjs.org/moo-color/-/moo-color-1.0.3.tgz",
    +      "integrity": "sha512-i/+ZKXMDf6aqYtBhuOcej71YSlbjT3wCO/4H1j8rPvxDJEifdwgg5MaFyu6iYAT8GBZJg2z0dkgK4YMzvURALQ==",
           "dev": true,
           "dependencies": {
             "color-name": "^1.1.4"
    @@ -11247,24 +11399,18 @@
           "dev": true
         },
         "node_modules/multicast-dns": {
    -      "version": "6.2.3",
    -      "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-6.2.3.tgz",
    -      "integrity": "sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g==",
    +      "version": "7.2.5",
    +      "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz",
    +      "integrity": "sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==",
           "dev": true,
           "dependencies": {
    -        "dns-packet": "^1.3.1",
    +        "dns-packet": "^5.2.2",
             "thunky": "^1.0.2"
           },
           "bin": {
             "multicast-dns": "cli.js"
           }
         },
    -    "node_modules/multicast-dns-service-types": {
    -      "version": "1.1.0",
    -      "resolved": "https://registry.npmjs.org/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz",
    -      "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=",
    -      "dev": true
    -    },
         "node_modules/mutationobserver-shim": {
           "version": "0.3.7",
           "resolved": "https://registry.npmjs.org/mutationobserver-shim/-/mutationobserver-shim-0.3.7.tgz",
    @@ -11272,9 +11418,9 @@
           "dev": true
         },
         "node_modules/nanoid": {
    -      "version": "3.3.1",
    -      "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.1.tgz",
    -      "integrity": "sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw==",
    +      "version": "3.3.4",
    +      "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz",
    +      "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==",
           "bin": {
             "nanoid": "bin/nanoid.cjs"
           },
    @@ -11285,7 +11431,7 @@
         "node_modules/natural-compare": {
           "version": "1.4.0",
           "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
    -      "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=",
    +      "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==",
           "dev": true
         },
         "node_modules/nearley": {
    @@ -11344,21 +11490,6 @@
             "path-to-regexp": "^1.7.0"
           }
         },
    -    "node_modules/nise/node_modules/isarray": {
    -      "version": "0.0.1",
    -      "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
    -      "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=",
    -      "dev": true
    -    },
    -    "node_modules/nise/node_modules/path-to-regexp": {
    -      "version": "1.8.0",
    -      "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz",
    -      "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==",
    -      "dev": true,
    -      "dependencies": {
    -        "isarray": "0.0.1"
    -      }
    -    },
         "node_modules/no-case": {
           "version": "3.0.4",
           "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz",
    @@ -11370,14 +11501,14 @@
           }
         },
         "node_modules/nock": {
    -      "version": "13.2.4",
    -      "resolved": "https://registry.npmjs.org/nock/-/nock-13.2.4.tgz",
    -      "integrity": "sha512-8GPznwxcPNCH/h8B+XZcKjYPXnUV5clOKCjAqyjsiqA++MpNx9E9+t8YPp0MbThO+KauRo7aZJ1WuIZmOrT2Ug==",
    +      "version": "13.2.6",
    +      "resolved": "https://registry.npmjs.org/nock/-/nock-13.2.6.tgz",
    +      "integrity": "sha512-GbyeSwSEP0FYouzETZ0l/XNm5tNcDNcXJKw3LCAb+mx8bZSwg1wEEvdL0FAyg5TkBJYiWSCtw6ag4XfmBy60FA==",
           "dev": true,
           "dependencies": {
             "debug": "^4.1.0",
             "json-stringify-safe": "^5.0.1",
    -        "lodash.set": "^4.3.2",
    +        "lodash": "^4.17.21",
             "propagate": "^2.0.0"
           },
           "engines": {
    @@ -11404,10 +11535,32 @@
             }
           }
         },
    +    "node_modules/node-fetch/node_modules/tr46": {
    +      "version": "0.0.3",
    +      "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz",
    +      "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==",
    +      "dev": true
    +    },
    +    "node_modules/node-fetch/node_modules/webidl-conversions": {
    +      "version": "3.0.1",
    +      "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz",
    +      "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==",
    +      "dev": true
    +    },
    +    "node_modules/node-fetch/node_modules/whatwg-url": {
    +      "version": "5.0.0",
    +      "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz",
    +      "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==",
    +      "dev": true,
    +      "dependencies": {
    +        "tr46": "~0.0.3",
    +        "webidl-conversions": "^3.0.0"
    +      }
    +    },
         "node_modules/node-forge": {
    -      "version": "1.3.0",
    -      "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.0.tgz",
    -      "integrity": "sha512-08ARB91bUi6zNKzVmaj3QO7cr397uiDT2nJ63cHjyNtCTWIgvS47j3eT0WfzUwS9+6Z5YshRaoasFkXCKrIYbA==",
    +      "version": "1.3.1",
    +      "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz",
    +      "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==",
           "dev": true,
           "engines": {
             "node": ">= 6.13.0"
    @@ -11416,13 +11569,13 @@
         "node_modules/node-int64": {
           "version": "0.4.0",
           "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz",
    -      "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=",
    +      "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==",
           "dev": true
         },
         "node_modules/node-releases": {
    -      "version": "2.0.2",
    -      "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.2.tgz",
    -      "integrity": "sha512-XxYDdcQ6eKqp/YjI+tb2C5WM2LgjnZrfYg4vgQt49EK268b6gYCHsBLrK2qvJo4FmCtqmKezb0WZFK4fkrZNsg==",
    +      "version": "2.0.5",
    +      "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.5.tgz",
    +      "integrity": "sha512-U9h1NLROZTq9uE1SNffn6WuPDg8icmi3ns4rEl/oTfIle4iLjTliCzgTsbaIFMq/Xn078/lfY/BL0GWZ+psK4Q==",
           "dev": true
         },
         "node_modules/normalize-path": {
    @@ -11436,7 +11589,7 @@
         "node_modules/normalize-range": {
           "version": "0.1.2",
           "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz",
    -      "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=",
    +      "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==",
           "dev": true,
           "engines": {
             "node": ">=0.10.0"
    @@ -11467,9 +11620,9 @@
           }
         },
         "node_modules/nth-check": {
    -      "version": "2.0.1",
    -      "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.0.1.tgz",
    -      "integrity": "sha512-it1vE95zF6dTT9lBsYbxvqh0Soy4SPowchj0UBGj/V6cTPnXXtQOPUbhZ6CmGzAD/rW22LQK6E96pcdJXk4A4w==",
    +      "version": "2.1.1",
    +      "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz",
    +      "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==",
           "dev": true,
           "dependencies": {
             "boolbase": "^1.0.0"
    @@ -11487,24 +11640,24 @@
         "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=",
    +      "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==",
           "engines": {
             "node": ">=0.10.0"
           }
         },
         "node_modules/object-hash": {
    -      "version": "2.2.0",
    -      "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-2.2.0.tgz",
    -      "integrity": "sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw==",
    +      "version": "3.0.0",
    +      "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz",
    +      "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==",
           "dev": true,
           "engines": {
             "node": ">= 6"
           }
         },
         "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==",
    +      "version": "1.12.2",
    +      "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz",
    +      "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==",
           "dev": true,
           "funding": {
             "url": "https://github.com/sponsors/ljharb"
    @@ -11583,14 +11736,15 @@
           }
         },
         "node_modules/object.getownpropertydescriptors": {
    -      "version": "2.1.3",
    -      "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.3.tgz",
    -      "integrity": "sha512-VdDoCwvJI4QdC6ndjpqFmoL3/+HxffFBbcJzKi5hwLLqqx3mdbedRpfZDdK0SrOSauj8X4GzBvnDZl4vTN7dOw==",
    +      "version": "2.1.4",
    +      "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.4.tgz",
    +      "integrity": "sha512-sccv3L/pMModT6dJAYF3fzGMVcb38ysQ0tEE6ixv2yXJDtEIPph268OlAdJj5/qZMZDq2g/jqvwppt36uS/uQQ==",
           "dev": true,
           "dependencies": {
    +        "array.prototype.reduce": "^1.0.4",
             "call-bind": "^1.0.2",
    -        "define-properties": "^1.1.3",
    -        "es-abstract": "^1.19.1"
    +        "define-properties": "^1.1.4",
    +        "es-abstract": "^1.20.1"
           },
           "engines": {
             "node": ">= 0.8"
    @@ -11600,13 +11754,13 @@
           }
         },
         "node_modules/object.hasown": {
    -      "version": "1.1.0",
    -      "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.0.tgz",
    -      "integrity": "sha512-MhjYRfj3GBlhSkDHo6QmvgjRLXQ2zndabdf3nX0yTyZK9rPfxb6uRpAac8HXNLy1GpqWtZ81Qh4v3uOls2sRAg==",
    +      "version": "1.1.1",
    +      "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.1.tgz",
    +      "integrity": "sha512-LYLe4tivNQzq4JdaWW6WO3HMZZJWzkkH8fnI6EebWl0VZth2wL2Lovm74ep2/gZzlaTdV62JZHEqHQ2yVn8Q/A==",
           "dev": true,
           "dependencies": {
    -        "define-properties": "^1.1.3",
    -        "es-abstract": "^1.19.1"
    +        "define-properties": "^1.1.4",
    +        "es-abstract": "^1.19.5"
           },
           "funding": {
             "url": "https://github.com/sponsors/ljharb"
    @@ -11636,9 +11790,9 @@
           "dev": true
         },
         "node_modules/on-finished": {
    -      "version": "2.3.0",
    -      "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz",
    -      "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=",
    +      "version": "2.4.1",
    +      "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz",
    +      "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==",
           "dev": true,
           "dependencies": {
             "ee-first": "1.1.1"
    @@ -11659,7 +11813,7 @@
         "node_modules/once": {
           "version": "1.4.0",
           "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
    -      "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
    +      "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
           "dev": true,
           "dependencies": {
             "wrappy": "1"
    @@ -11729,7 +11883,7 @@
         "node_modules/p-locate": {
           "version": "2.0.0",
           "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz",
    -      "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=",
    +      "integrity": "sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==",
           "dev": true,
           "dependencies": {
             "p-limit": "^1.1.0"
    @@ -11738,28 +11892,13 @@
             "node": ">=4"
           }
         },
    -    "node_modules/p-map": {
    -      "version": "4.0.0",
    -      "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz",
    -      "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==",
    -      "dev": true,
    -      "dependencies": {
    -        "aggregate-error": "^3.0.0"
    -      },
    -      "engines": {
    -        "node": ">=10"
    -      },
    -      "funding": {
    -        "url": "https://github.com/sponsors/sindresorhus"
    -      }
    -    },
         "node_modules/p-retry": {
    -      "version": "4.6.1",
    -      "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.1.tgz",
    -      "integrity": "sha512-e2xXGNhZOZ0lfgR9kL34iGlU8N/KO0xZnQxVEwdeOvpqNDQfdnxIYizvWtK8RglUa3bGqI8g0R/BdfzLMxRkiA==",
    +      "version": "4.6.2",
    +      "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz",
    +      "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==",
           "dev": true,
           "dependencies": {
    -        "@types/retry": "^0.12.0",
    +        "@types/retry": "0.12.0",
             "retry": "^0.13.1"
           },
           "engines": {
    @@ -11769,7 +11908,7 @@
         "node_modules/p-try": {
           "version": "1.0.0",
           "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz",
    -      "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=",
    +      "integrity": "sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==",
           "dev": true,
           "engines": {
             "node": ">=4"
    @@ -11818,21 +11957,31 @@
         "node_modules/parse-srcset": {
           "version": "1.0.2",
           "resolved": "https://registry.npmjs.org/parse-srcset/-/parse-srcset-1.0.2.tgz",
    -      "integrity": "sha1-8r0iH2zJcKk42IVWq8WJyqqiveE="
    +      "integrity": "sha512-/2qh0lav6CmI15FzA3i/2Bzk2zCgQhGMkvhOhKNcBVQ1ldgpbfiNTVslmooUmWJcADi1f1kIeynbDRVzNlfR6Q=="
         },
         "node_modules/parse5": {
    -      "version": "6.0.1",
    -      "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz",
    -      "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==",
    -      "dev": true
    +      "version": "7.0.0",
    +      "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.0.0.tgz",
    +      "integrity": "sha512-y/t8IXSPWTuRZqXc0ajH/UwDj4mnqLEbSttNbThcFhGrZuOyoyvNBO85PBp2jQa55wY9d07PBNjsK8ZP3K5U6g==",
    +      "dev": true,
    +      "dependencies": {
    +        "entities": "^4.3.0"
    +      },
    +      "funding": {
    +        "url": "https://github.com/inikulin/parse5?sponsor=1"
    +      }
         },
         "node_modules/parse5-htmlparser2-tree-adapter": {
    -      "version": "6.0.1",
    -      "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-6.0.1.tgz",
    -      "integrity": "sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA==",
    +      "version": "7.0.0",
    +      "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.0.0.tgz",
    +      "integrity": "sha512-B77tOZrqqfUfnVcOrUvfdLbz4pu4RopLD/4vmu3HUPswwTA8OH0EMW9BlWR2B0RCoiZRAHEUu7IxeP1Pd1UU+g==",
           "dev": true,
           "dependencies": {
    -        "parse5": "^6.0.1"
    +        "domhandler": "^5.0.2",
    +        "parse5": "^7.0.0"
    +      },
    +      "funding": {
    +        "url": "https://github.com/inikulin/parse5?sponsor=1"
           }
         },
         "node_modules/parseurl": {
    @@ -11857,7 +12006,7 @@
         "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=",
    +      "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==",
           "dev": true,
           "engines": {
             "node": ">=4"
    @@ -11866,7 +12015,7 @@
         "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=",
    +      "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==",
           "dev": true,
           "engines": {
             "node": ">=0.10.0"
    @@ -11888,10 +12037,12 @@
           "dev": true
         },
         "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
    +      "version": "1.8.0",
    +      "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz",
    +      "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==",
    +      "dependencies": {
    +        "isarray": "0.0.1"
    +      }
         },
         "node_modules/path-type": {
           "version": "4.0.0",
    @@ -11905,7 +12056,7 @@
         "node_modules/performance-now": {
           "version": "2.1.0",
           "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz",
    -      "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=",
    +      "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==",
           "dev": true
         },
         "node_modules/picocolors": {
    @@ -11924,6 +12075,15 @@
             "url": "https://github.com/sponsors/jonschlinkert"
           }
         },
    +    "node_modules/pify": {
    +      "version": "2.3.0",
    +      "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
    +      "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=0.10.0"
    +      }
    +    },
         "node_modules/pirates": {
           "version": "4.0.5",
           "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.5.tgz",
    @@ -12098,33 +12258,10 @@
             "url": "https://opencollective.com/popperjs"
           }
         },
    -    "node_modules/portfinder": {
    -      "version": "1.0.28",
    -      "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.28.tgz",
    -      "integrity": "sha512-Se+2isanIcEqf2XMHjyUKskczxbPH7dQnlMjXX6+dybayyHvAf/TCgyMRlzf/B6QDhAEFOGes0pzRo3by4AbMA==",
    -      "dev": true,
    -      "dependencies": {
    -        "async": "^2.6.2",
    -        "debug": "^3.1.1",
    -        "mkdirp": "^0.5.5"
    -      },
    -      "engines": {
    -        "node": ">= 0.12.0"
    -      }
    -    },
    -    "node_modules/portfinder/node_modules/debug": {
    -      "version": "3.2.7",
    -      "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
    -      "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
    -      "dev": true,
    -      "dependencies": {
    -        "ms": "^2.1.1"
    -      }
    -    },
         "node_modules/postcss": {
    -      "version": "8.4.12",
    -      "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.12.tgz",
    -      "integrity": "sha512-lg6eITwYe9v6Hr5CncVbK70SoioNQIq81nsaG86ev5hAidQvmOeETBqs7jm43K2F5/Ley3ytDtriImV6TpNiSg==",
    +      "version": "8.4.14",
    +      "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.14.tgz",
    +      "integrity": "sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig==",
           "funding": [
             {
               "type": "opencollective",
    @@ -12136,7 +12273,7 @@
             }
           ],
           "dependencies": {
    -        "nanoid": "^3.3.1",
    +        "nanoid": "^3.3.4",
             "picocolors": "^1.0.0",
             "source-map-js": "^1.0.2"
           },
    @@ -12145,15 +12282,22 @@
           }
         },
         "node_modules/postcss-attribute-case-insensitive": {
    -      "version": "5.0.0",
    -      "resolved": "https://registry.npmjs.org/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-5.0.0.tgz",
    -      "integrity": "sha512-b4g9eagFGq9T5SWX4+USfVyjIb3liPnjhHHRMP7FMB2kFVpYyfEscV0wP3eaXhKlcHKUut8lt5BGoeylWA/dBQ==",
    +      "version": "5.0.1",
    +      "resolved": "https://registry.npmjs.org/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-5.0.1.tgz",
    +      "integrity": "sha512-wrt2VndqSLJpyBRNz9OmJcgnhI9MaongeWgapdBuUMu2a/KNJ8SENesG4SdiTnQwGO9b1VKbTWYAfCPeokLqZQ==",
           "dev": true,
           "dependencies": {
    -        "postcss-selector-parser": "^6.0.2"
    +        "postcss-selector-parser": "^6.0.10"
    +      },
    +      "engines": {
    +        "node": "^12 || ^14 || >=16"
    +      },
    +      "funding": {
    +        "type": "opencollective",
    +        "url": "https://opencollective.com/csstools"
           },
           "peerDependencies": {
    -        "postcss": "^8.0.2"
    +        "postcss": "^8.3"
           }
         },
         "node_modules/postcss-browser-comments": {
    @@ -12198,9 +12342,9 @@
           }
         },
         "node_modules/postcss-color-functional-notation": {
    -      "version": "4.2.2",
    -      "resolved": "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-4.2.2.tgz",
    -      "integrity": "sha512-DXVtwUhIk4f49KK5EGuEdgx4Gnyj6+t2jBSEmxvpIK9QI40tWrpS2Pua8Q7iIZWBrki2QOaeUdEaLPPa91K0RQ==",
    +      "version": "4.2.3",
    +      "resolved": "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-4.2.3.tgz",
    +      "integrity": "sha512-5fbr6FzFzjwHXKsVnkmEYrJYG8VNNzvD1tAXaPPWR97S6rhKI5uh2yOfV5TAzhDkZoq4h+chxEplFDc8GeyFtw==",
           "dev": true,
           "dependencies": {
             "postcss-value-parser": "^4.2.0"
    @@ -12208,14 +12352,18 @@
           "engines": {
             "node": "^12 || ^14 || >=16"
           },
    +      "funding": {
    +        "type": "opencollective",
    +        "url": "https://opencollective.com/csstools"
    +      },
           "peerDependencies": {
             "postcss": "^8.4"
           }
         },
         "node_modules/postcss-color-hex-alpha": {
    -      "version": "8.0.3",
    -      "resolved": "https://registry.npmjs.org/postcss-color-hex-alpha/-/postcss-color-hex-alpha-8.0.3.tgz",
    -      "integrity": "sha512-fESawWJCrBV035DcbKRPAVmy21LpoyiXdPTuHUfWJ14ZRjY7Y7PA6P4g8z6LQGYhU1WAxkTxjIjurXzoe68Glw==",
    +      "version": "8.0.4",
    +      "resolved": "https://registry.npmjs.org/postcss-color-hex-alpha/-/postcss-color-hex-alpha-8.0.4.tgz",
    +      "integrity": "sha512-nLo2DCRC9eE4w2JmuKgVA3fGL3d01kGq752pVALF68qpGLmx2Qrk91QTKkdUqqp45T1K1XV8IhQpcu1hoAQflQ==",
           "dev": true,
           "dependencies": {
             "postcss-value-parser": "^4.2.0"
    @@ -12223,14 +12371,18 @@
           "engines": {
             "node": "^12 || ^14 || >=16"
           },
    +      "funding": {
    +        "type": "opencollective",
    +        "url": "https://opencollective.com/csstools"
    +      },
           "peerDependencies": {
             "postcss": "^8.4"
           }
         },
         "node_modules/postcss-color-rebeccapurple": {
    -      "version": "7.0.2",
    -      "resolved": "https://registry.npmjs.org/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-7.0.2.tgz",
    -      "integrity": "sha512-SFc3MaocHaQ6k3oZaFwH8io6MdypkUtEy/eXzXEB1vEQlO3S3oDc/FSZA8AsS04Z25RirQhlDlHLh3dn7XewWw==",
    +      "version": "7.1.0",
    +      "resolved": "https://registry.npmjs.org/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-7.1.0.tgz",
    +      "integrity": "sha512-1jtE5AKnZcKq4pjOrltFHcbEM2/IvtbD1OdhZ/wqds18//bh0UmQkffcCkzDJU+/vGodfIsVQeKn+45CJvX9Bw==",
           "dev": true,
           "dependencies": {
             "postcss-value-parser": "^4.2.0"
    @@ -12238,6 +12390,10 @@
           "engines": {
             "node": "^12 || ^14 || >=16"
           },
    +      "funding": {
    +        "type": "opencollective",
    +        "url": "https://opencollective.com/csstools"
    +      },
           "peerDependencies": {
             "postcss": "^8.3"
           }
    @@ -12261,11 +12417,12 @@
           }
         },
         "node_modules/postcss-convert-values": {
    -      "version": "5.1.0",
    -      "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-5.1.0.tgz",
    -      "integrity": "sha512-GkyPbZEYJiWtQB0KZ0X6qusqFHUepguBCNFi9t5JJc7I2OTXG7C0twbTLvCfaKOLl3rSXmpAwV7W5txd91V84g==",
    +      "version": "5.1.2",
    +      "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-5.1.2.tgz",
    +      "integrity": "sha512-c6Hzc4GAv95B7suy4udszX9Zy4ETyMCgFPUDtWjdFTKH1SE9eFY/jEpHSwTH1QPuwxHpWslhckUQWbNRM4ho5g==",
           "dev": true,
           "dependencies": {
    +        "browserslist": "^4.20.3",
             "postcss-value-parser": "^4.2.0"
           },
           "engines": {
    @@ -12276,21 +12433,28 @@
           }
         },
         "node_modules/postcss-custom-media": {
    -      "version": "8.0.0",
    -      "resolved": "https://registry.npmjs.org/postcss-custom-media/-/postcss-custom-media-8.0.0.tgz",
    -      "integrity": "sha512-FvO2GzMUaTN0t1fBULDeIvxr5IvbDXcIatt6pnJghc736nqNgsGao5NT+5+WVLAQiTt6Cb3YUms0jiPaXhL//g==",
    +      "version": "8.0.2",
    +      "resolved": "https://registry.npmjs.org/postcss-custom-media/-/postcss-custom-media-8.0.2.tgz",
    +      "integrity": "sha512-7yi25vDAoHAkbhAzX9dHx2yc6ntS4jQvejrNcC+csQJAXjj15e7VcWfMgLqBNAbOvqi5uIa9huOVwdHbf+sKqg==",
           "dev": true,
    +      "dependencies": {
    +        "postcss-value-parser": "^4.2.0"
    +      },
           "engines": {
    -        "node": ">=10.0.0"
    +        "node": "^12 || ^14 || >=16"
    +      },
    +      "funding": {
    +        "type": "opencollective",
    +        "url": "https://opencollective.com/csstools"
           },
           "peerDependencies": {
    -        "postcss": "^8.1.0"
    +        "postcss": "^8.3"
           }
         },
         "node_modules/postcss-custom-properties": {
    -      "version": "12.1.5",
    -      "resolved": "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-12.1.5.tgz",
    -      "integrity": "sha512-FHbbB/hRo/7cxLGkc2NS7cDRIDN1oFqQnUKBiyh4b/gwk8DD8udvmRDpUhEK836kB8ggUCieHVOvZDnF9XhI3g==",
    +      "version": "12.1.8",
    +      "resolved": "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-12.1.8.tgz",
    +      "integrity": "sha512-8rbj8kVu00RQh2fQF81oBqtduiANu4MIxhyf0HbbStgPtnFlWn0yiaYTpLHrPnJbffVY1s9apWsIoVZcc68FxA==",
           "dev": true,
           "dependencies": {
             "postcss-value-parser": "^4.2.0"
    @@ -12298,23 +12462,31 @@
           "engines": {
             "node": "^12 || ^14 || >=16"
           },
    +      "funding": {
    +        "type": "opencollective",
    +        "url": "https://opencollective.com/csstools"
    +      },
           "peerDependencies": {
             "postcss": "^8.4"
           }
         },
         "node_modules/postcss-custom-selectors": {
    -      "version": "6.0.0",
    -      "resolved": "https://registry.npmjs.org/postcss-custom-selectors/-/postcss-custom-selectors-6.0.0.tgz",
    -      "integrity": "sha512-/1iyBhz/W8jUepjGyu7V1OPcGbc636snN1yXEQCinb6Bwt7KxsiU7/bLQlp8GwAXzCh7cobBU5odNn/2zQWR8Q==",
    +      "version": "6.0.3",
    +      "resolved": "https://registry.npmjs.org/postcss-custom-selectors/-/postcss-custom-selectors-6.0.3.tgz",
    +      "integrity": "sha512-fgVkmyiWDwmD3JbpCmB45SvvlCD6z9CG6Ie6Iere22W5aHea6oWa7EM2bpnv2Fj3I94L3VbtvX9KqwSi5aFzSg==",
           "dev": true,
           "dependencies": {
             "postcss-selector-parser": "^6.0.4"
           },
           "engines": {
    -        "node": ">=10.0.0"
    +        "node": "^12 || ^14 || >=16"
    +      },
    +      "funding": {
    +        "type": "opencollective",
    +        "url": "https://opencollective.com/csstools"
           },
           "peerDependencies": {
    -        "postcss": "^8.1.2"
    +        "postcss": "^8.3"
           }
         },
         "node_modules/postcss-dir-pseudo-class": {
    @@ -12333,9 +12505,9 @@
           }
         },
         "node_modules/postcss-discard-comments": {
    -      "version": "5.1.1",
    -      "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-5.1.1.tgz",
    -      "integrity": "sha512-5JscyFmvkUxz/5/+TB3QTTT9Gi9jHkcn8dcmmuN68JQcv3aQg4y88yEHHhwFB52l/NkaJ43O0dbksGMAo49nfQ==",
    +      "version": "5.1.2",
    +      "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-5.1.2.tgz",
    +      "integrity": "sha512-+L8208OVbHVF2UQf1iDmRcbdjJkuBF6IS29yBDSiWUIzpYaAhtNl6JYnYm12FnkeCwQqF5LeklOu6rAqgfBZqQ==",
           "dev": true,
           "engines": {
             "node": "^10 || ^12 || >=14.0"
    @@ -12486,6 +12658,23 @@
             "postcss": "^8.4"
           }
         },
    +    "node_modules/postcss-import": {
    +      "version": "14.1.0",
    +      "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-14.1.0.tgz",
    +      "integrity": "sha512-flwI+Vgm4SElObFVPpTIT7SU7R3qk2L7PyduMcokiaVKuWv9d/U+Gm/QAd8NDLuykTWTkcrjOeD2Pp1rMeBTGw==",
    +      "dev": true,
    +      "dependencies": {
    +        "postcss-value-parser": "^4.0.0",
    +        "read-cache": "^1.0.0",
    +        "resolve": "^1.1.7"
    +      },
    +      "engines": {
    +        "node": ">=10.0.0"
    +      },
    +      "peerDependencies": {
    +        "postcss": "^8.0.0"
    +      }
    +    },
         "node_modules/postcss-initial": {
           "version": "4.0.1",
           "resolved": "https://registry.npmjs.org/postcss-initial/-/postcss-initial-4.0.1.tgz",
    @@ -12515,9 +12704,9 @@
           }
         },
         "node_modules/postcss-lab-function": {
    -      "version": "4.1.2",
    -      "resolved": "https://registry.npmjs.org/postcss-lab-function/-/postcss-lab-function-4.1.2.tgz",
    -      "integrity": "sha512-isudf5ldhg4fk16M8viAwAbg6Gv14lVO35N3Z/49NhbwPQ2xbiEoHgrRgpgQojosF4vF7jY653ktB6dDrUOR8Q==",
    +      "version": "4.2.0",
    +      "resolved": "https://registry.npmjs.org/postcss-lab-function/-/postcss-lab-function-4.2.0.tgz",
    +      "integrity": "sha512-Zb1EO9DGYfa3CP8LhINHCcTTCTLI+R3t7AX2mKsDzdgVQ/GkCpHOTgOr6HBHslP7XDdVbqgHW5vvRPMdVANQ8w==",
           "dev": true,
           "dependencies": {
             "@csstools/postcss-progressive-custom-properties": "^1.1.0",
    @@ -12526,17 +12715,21 @@
           "engines": {
             "node": "^12 || ^14 || >=16"
           },
    +      "funding": {
    +        "type": "opencollective",
    +        "url": "https://opencollective.com/csstools"
    +      },
           "peerDependencies": {
             "postcss": "^8.4"
           }
         },
         "node_modules/postcss-load-config": {
    -      "version": "3.1.3",
    -      "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-3.1.3.tgz",
    -      "integrity": "sha512-5EYgaM9auHGtO//ljHH+v/aC/TQ5LHXtL7bQajNAUBKUVKiYE8rYpFms7+V26D9FncaGe2zwCoPQsFKb5zF/Hw==",
    +      "version": "3.1.4",
    +      "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-3.1.4.tgz",
    +      "integrity": "sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==",
           "dev": true,
           "dependencies": {
    -        "lilconfig": "^2.0.4",
    +        "lilconfig": "^2.0.5",
             "yaml": "^1.10.2"
           },
           "engines": {
    @@ -12547,9 +12740,13 @@
             "url": "https://opencollective.com/postcss/"
           },
           "peerDependencies": {
    +        "postcss": ">=8.0.9",
             "ts-node": ">=9.0.0"
           },
           "peerDependenciesMeta": {
    +        "postcss": {
    +          "optional": true
    +        },
             "ts-node": {
               "optional": true
             }
    @@ -12578,9 +12775,9 @@
           }
         },
         "node_modules/postcss-loader/node_modules/semver": {
    -      "version": "7.3.5",
    -      "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz",
    -      "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==",
    +      "version": "7.3.7",
    +      "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz",
    +      "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==",
           "dev": true,
           "dependencies": {
             "lru-cache": "^6.0.0"
    @@ -12617,9 +12814,9 @@
           }
         },
         "node_modules/postcss-merge-longhand": {
    -      "version": "5.1.3",
    -      "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-5.1.3.tgz",
    -      "integrity": "sha512-lX8GPGvZ0iGP/IboM7HXH5JwkXvXod1Rr8H8ixwiA372hArk0zP4ZcCy4z4Prg/bfNlbbTf0KCOjCF9kKnpP/w==",
    +      "version": "5.1.5",
    +      "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-5.1.5.tgz",
    +      "integrity": "sha512-NOG1grw9wIO+60arKa2YYsrbgvP6tp+jqc7+ZD5/MalIw234ooH2C6KlR6FEn4yle7GqZoBxSK1mLBE9KPur6w==",
           "dev": true,
           "dependencies": {
             "postcss-value-parser": "^4.2.0",
    @@ -12633,9 +12830,9 @@
           }
         },
         "node_modules/postcss-merge-rules": {
    -      "version": "5.1.1",
    -      "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-5.1.1.tgz",
    -      "integrity": "sha512-8wv8q2cXjEuCcgpIB1Xx1pIy8/rhMPIQqYKNzEdyx37m6gpq83mQQdCxgIkFgliyEnKvdwJf/C61vN4tQDq4Ww==",
    +      "version": "5.1.2",
    +      "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-5.1.2.tgz",
    +      "integrity": "sha512-zKMUlnw+zYCWoPN6yhPjtcEdlJaMUZ0WyVcxTAmw3lkkN/NDMRkOkiuctQEoWAOvH7twaxUUdvBWl0d4+hifRQ==",
           "dev": true,
           "dependencies": {
             "browserslist": "^4.16.6",
    @@ -12683,9 +12880,9 @@
           }
         },
         "node_modules/postcss-minify-params": {
    -      "version": "5.1.2",
    -      "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-5.1.2.tgz",
    -      "integrity": "sha512-aEP+p71S/urY48HWaRHasyx4WHQJyOYaKpQ6eXl8k0kxg66Wt/30VR6/woh8THgcpRbonJD5IeD+CzNhPi1L8g==",
    +      "version": "5.1.3",
    +      "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-5.1.3.tgz",
    +      "integrity": "sha512-bkzpWcjykkqIujNL+EVEPOlLYi/eZ050oImVtHU7b4lFS82jPnsCb44gvC6pxaNt38Els3jWYDHTjHKf0koTgg==",
           "dev": true,
           "dependencies": {
             "browserslist": "^4.16.6",
    @@ -12700,9 +12897,9 @@
           }
         },
         "node_modules/postcss-minify-selectors": {
    -      "version": "5.2.0",
    -      "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-5.2.0.tgz",
    -      "integrity": "sha512-vYxvHkW+iULstA+ctVNx0VoRAR4THQQRkG77o0oa4/mBS0OzGvvzLIvHDv/nNEM0crzN2WIyFU5X7wZhaUK3RA==",
    +      "version": "5.2.1",
    +      "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-5.2.1.tgz",
    +      "integrity": "sha512-nPJu7OjZJTsVUmPdm2TcaiohIwxP+v8ha9NehQ2ye9szv4orirRU3SDdtUmKH+10nzn0bAyOXZ0UEr7OpvLehg==",
           "dev": true,
           "dependencies": {
             "postcss-selector-parser": "^6.0.5"
    @@ -12793,16 +12990,21 @@
           }
         },
         "node_modules/postcss-nesting": {
    -      "version": "10.1.3",
    -      "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-10.1.3.tgz",
    -      "integrity": "sha512-wUC+/YCik4wH3StsbC5fBG1s2Z3ZV74vjGqBFYtmYKlVxoio5TYGM06AiaKkQPPlkXWn72HKfS7Cw5PYxnoXSw==",
    +      "version": "10.1.8",
    +      "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-10.1.8.tgz",
    +      "integrity": "sha512-txdb3/idHYsBbNDFo1PFY0ExCgH5nfWi8G5lO49e6iuU42TydbODTzJgF5UuL5bhgeSlnAtDgfFTDG0Cl1zaSQ==",
           "dev": true,
           "dependencies": {
    -        "postcss-selector-parser": "^6.0.9"
    +        "@csstools/selector-specificity": "^2.0.0",
    +        "postcss-selector-parser": "^6.0.10"
           },
           "engines": {
             "node": "^12 || ^14 || >=16"
           },
    +      "funding": {
    +        "type": "opencollective",
    +        "url": "https://opencollective.com/csstools"
    +      },
           "peerDependencies": {
             "postcss": "^8.4"
           }
    @@ -12979,9 +13181,9 @@
           }
         },
         "node_modules/postcss-ordered-values": {
    -      "version": "5.1.1",
    -      "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-5.1.1.tgz",
    -      "integrity": "sha512-7lxgXF0NaoMIgyihL/2boNAEZKiW0+HkMhdKMTD93CjW8TdCy2hSdj8lsAo+uwm7EDG16Da2Jdmtqpedl0cMfw==",
    +      "version": "5.1.2",
    +      "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-5.1.2.tgz",
    +      "integrity": "sha512-wr2avRbW4HS2XE2ZCqpfp4N/tDC6GZKZ+SVP8UBTOVS8QWrc4TD8MYrebJrvVVlGPKszmiSCzue43NDiVtgDmg==",
           "dev": true,
           "dependencies": {
             "cssnano-utils": "^3.1.0",
    @@ -13031,33 +13233,37 @@
           }
         },
         "node_modules/postcss-preset-env": {
    -      "version": "7.4.3",
    -      "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-7.4.3.tgz",
    -      "integrity": "sha512-dlPA65g9KuGv7YsmGyCKtFkZKCPLkoVMUE3omOl6yM+qrynVHxFvf0tMuippIrXB/sB/MyhL1FgTIbrO+qMERg==",
    +      "version": "7.7.1",
    +      "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-7.7.1.tgz",
    +      "integrity": "sha512-1sx6+Nl1wMVJzaYLVaz4OAR6JodIN/Z1upmVqLwSPCLT6XyxrEoePgNMHPH08kseLe3z06i9Vfkt/32BYEKDeA==",
           "dev": true,
           "dependencies": {
    -        "@csstools/postcss-color-function": "^1.0.3",
    +        "@csstools/postcss-cascade-layers": "^1.0.2",
    +        "@csstools/postcss-color-function": "^1.1.0",
             "@csstools/postcss-font-format-keywords": "^1.0.0",
    -        "@csstools/postcss-hwb-function": "^1.0.0",
    +        "@csstools/postcss-hwb-function": "^1.0.1",
             "@csstools/postcss-ic-unit": "^1.0.0",
    -        "@csstools/postcss-is-pseudo-class": "^2.0.1",
    +        "@csstools/postcss-is-pseudo-class": "^2.0.4",
             "@csstools/postcss-normalize-display-values": "^1.0.0",
    -        "@csstools/postcss-oklab-function": "^1.0.2",
    +        "@csstools/postcss-oklab-function": "^1.1.0",
             "@csstools/postcss-progressive-custom-properties": "^1.3.0",
    -        "autoprefixer": "^10.4.4",
    -        "browserslist": "^4.20.2",
    +        "@csstools/postcss-stepped-value-functions": "^1.0.0",
    +        "@csstools/postcss-trigonometric-functions": "^1.0.1",
    +        "@csstools/postcss-unset-value": "^1.0.1",
    +        "autoprefixer": "^10.4.7",
    +        "browserslist": "^4.20.3",
             "css-blank-pseudo": "^3.0.3",
             "css-has-pseudo": "^3.0.4",
             "css-prefers-color-scheme": "^6.0.3",
    -        "cssdb": "^6.5.0",
    -        "postcss-attribute-case-insensitive": "^5.0.0",
    +        "cssdb": "^6.6.3",
    +        "postcss-attribute-case-insensitive": "^5.0.1",
             "postcss-clamp": "^4.1.0",
    -        "postcss-color-functional-notation": "^4.2.2",
    +        "postcss-color-functional-notation": "^4.2.3",
             "postcss-color-hex-alpha": "^8.0.3",
             "postcss-color-rebeccapurple": "^7.0.2",
    -        "postcss-custom-media": "^8.0.0",
    -        "postcss-custom-properties": "^12.1.5",
    -        "postcss-custom-selectors": "^6.0.0",
    +        "postcss-custom-media": "^8.0.1",
    +        "postcss-custom-properties": "^12.1.7",
    +        "postcss-custom-selectors": "^6.0.2",
             "postcss-dir-pseudo-class": "^6.0.4",
             "postcss-double-position-gradients": "^3.1.1",
             "postcss-env-function": "^4.0.6",
    @@ -13067,37 +13273,45 @@
             "postcss-gap-properties": "^3.0.3",
             "postcss-image-set-function": "^4.0.6",
             "postcss-initial": "^4.0.1",
    -        "postcss-lab-function": "^4.1.2",
    +        "postcss-lab-function": "^4.2.0",
             "postcss-logical": "^5.0.4",
             "postcss-media-minmax": "^5.0.0",
    -        "postcss-nesting": "^10.1.3",
    +        "postcss-nesting": "^10.1.7",
             "postcss-opacity-percentage": "^1.1.2",
             "postcss-overflow-shorthand": "^3.0.3",
             "postcss-page-break": "^3.0.4",
             "postcss-place": "^7.0.4",
    -        "postcss-pseudo-class-any-link": "^7.1.1",
    +        "postcss-pseudo-class-any-link": "^7.1.4",
             "postcss-replace-overflow-wrap": "^4.0.0",
    -        "postcss-selector-not": "^5.0.0",
    +        "postcss-selector-not": "^6.0.0",
             "postcss-value-parser": "^4.2.0"
           },
           "engines": {
             "node": "^12 || ^14 || >=16"
           },
    +      "funding": {
    +        "type": "opencollective",
    +        "url": "https://opencollective.com/csstools"
    +      },
           "peerDependencies": {
             "postcss": "^8.4"
           }
         },
         "node_modules/postcss-pseudo-class-any-link": {
    -      "version": "7.1.1",
    -      "resolved": "https://registry.npmjs.org/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-7.1.1.tgz",
    -      "integrity": "sha512-JRoLFvPEX/1YTPxRxp1JO4WxBVXJYrSY7NHeak5LImwJ+VobFMwYDQHvfTXEpcn+7fYIeGkC29zYFhFWIZD8fg==",
    +      "version": "7.1.4",
    +      "resolved": "https://registry.npmjs.org/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-7.1.4.tgz",
    +      "integrity": "sha512-JxRcLXm96u14N3RzFavPIE9cRPuOqLDuzKeBsqi4oRk4vt8n0A7I0plFs/VXTg7U2n7g/XkQi0OwqTO3VWBfEg==",
           "dev": true,
           "dependencies": {
    -        "postcss-selector-parser": "^6.0.9"
    +        "postcss-selector-parser": "^6.0.10"
           },
           "engines": {
             "node": "^12 || ^14 || >=16"
           },
    +      "funding": {
    +        "type": "opencollective",
    +        "url": "https://opencollective.com/csstools"
    +      },
           "peerDependencies": {
             "postcss": "^8.4"
           }
    @@ -13143,21 +13357,28 @@
           }
         },
         "node_modules/postcss-selector-not": {
    -      "version": "5.0.0",
    -      "resolved": "https://registry.npmjs.org/postcss-selector-not/-/postcss-selector-not-5.0.0.tgz",
    -      "integrity": "sha512-/2K3A4TCP9orP4TNS7u3tGdRFVKqz/E6pX3aGnriPG0jU78of8wsUcqE4QAhWEU0d+WnMSF93Ah3F//vUtK+iQ==",
    +      "version": "6.0.0",
    +      "resolved": "https://registry.npmjs.org/postcss-selector-not/-/postcss-selector-not-6.0.0.tgz",
    +      "integrity": "sha512-i/HI/VNd3V9e1WOLCwJsf9nePBRXqcGtVibcJ9FsVo0agfDEfsLSlFt94aYjY35wUNcdG0KrvdyjEr7It50wLQ==",
           "dev": true,
           "dependencies": {
    -        "balanced-match": "^1.0.0"
    +        "postcss-selector-parser": "^6.0.10"
    +      },
    +      "engines": {
    +        "node": "^12 || ^14 || >=16"
    +      },
    +      "funding": {
    +        "type": "opencollective",
    +        "url": "https://opencollective.com/csstools"
           },
           "peerDependencies": {
    -        "postcss": "^8.1.0"
    +        "postcss": "^8.3"
           }
         },
         "node_modules/postcss-selector-parser": {
    -      "version": "6.0.9",
    -      "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.9.tgz",
    -      "integrity": "sha512-UO3SgnZOVTwu4kyLR22UQ1xZh086RyNZppb7lLAKBFK8a32ttG5i87Y/P3+2bRSjZNyJ1B7hfFNo273tKe9YxQ==",
    +      "version": "6.0.10",
    +      "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz",
    +      "integrity": "sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==",
           "dev": true,
           "dependencies": {
             "cssesc": "^3.0.0",
    @@ -13192,6 +13413,22 @@
             "node": ">= 10"
           }
         },
    +    "node_modules/postcss-svgo/node_modules/css-select": {
    +      "version": "4.3.0",
    +      "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz",
    +      "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==",
    +      "dev": true,
    +      "dependencies": {
    +        "boolbase": "^1.0.0",
    +        "css-what": "^6.0.1",
    +        "domhandler": "^4.3.1",
    +        "domutils": "^2.8.0",
    +        "nth-check": "^2.0.1"
    +      },
    +      "funding": {
    +        "url": "https://github.com/sponsors/fb55"
    +      }
    +    },
         "node_modules/postcss-svgo/node_modules/css-tree": {
           "version": "1.1.3",
           "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz",
    @@ -13205,21 +13442,64 @@
             "node": ">=8.0.0"
           }
         },
    -    "node_modules/postcss-svgo/node_modules/mdn-data": {
    -      "version": "2.0.14",
    -      "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz",
    -      "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==",
    -      "dev": true
    +    "node_modules/postcss-svgo/node_modules/dom-serializer": {
    +      "version": "1.4.1",
    +      "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz",
    +      "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==",
    +      "dev": true,
    +      "dependencies": {
    +        "domelementtype": "^2.0.1",
    +        "domhandler": "^4.2.0",
    +        "entities": "^2.0.0"
    +      },
    +      "funding": {
    +        "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1"
    +      }
         },
    -    "node_modules/postcss-svgo/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==",
    +    "node_modules/postcss-svgo/node_modules/domhandler": {
    +      "version": "4.3.1",
    +      "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz",
    +      "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==",
           "dev": true,
    +      "dependencies": {
    +        "domelementtype": "^2.2.0"
    +      },
           "engines": {
    -        "node": ">=0.10.0"
    +        "node": ">= 4"
    +      },
    +      "funding": {
    +        "url": "https://github.com/fb55/domhandler?sponsor=1"
    +      }
    +    },
    +    "node_modules/postcss-svgo/node_modules/domutils": {
    +      "version": "2.8.0",
    +      "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz",
    +      "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==",
    +      "dev": true,
    +      "dependencies": {
    +        "dom-serializer": "^1.0.1",
    +        "domelementtype": "^2.2.0",
    +        "domhandler": "^4.2.0"
    +      },
    +      "funding": {
    +        "url": "https://github.com/fb55/domutils?sponsor=1"
    +      }
    +    },
    +    "node_modules/postcss-svgo/node_modules/entities": {
    +      "version": "2.2.0",
    +      "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz",
    +      "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==",
    +      "dev": true,
    +      "funding": {
    +        "url": "https://github.com/fb55/entities?sponsor=1"
           }
         },
    +    "node_modules/postcss-svgo/node_modules/mdn-data": {
    +      "version": "2.0.14",
    +      "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz",
    +      "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==",
    +      "dev": true
    +    },
         "node_modules/postcss-svgo/node_modules/svgo": {
           "version": "2.8.0",
           "resolved": "https://registry.npmjs.org/svgo/-/svgo-2.8.0.tgz",
    @@ -13272,9 +13552,9 @@
           }
         },
         "node_modules/prettier": {
    -      "version": "2.6.1",
    -      "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.6.1.tgz",
    -      "integrity": "sha512-8UVbTBYGwN37Bs9LERmxCPjdvPxlEowx2urIL6urHzdb3SDq4B/Z6xLFCblrSnE4iKWcS6ziJ3aOYrc1kz/E2A==",
    +      "version": "2.6.2",
    +      "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.6.2.tgz",
    +      "integrity": "sha512-PkUpF+qoXTqhOeWL9fu7As8LXsIUZ1WYaJiY/a7McAQzxjk82OF0tibkFXVCDImZtWxbvojFjerkiLb0/q8mew==",
           "dev": true,
           "bin": {
             "prettier": "bin-prettier.js"
    @@ -13444,7 +13724,7 @@
         "node_modules/q": {
           "version": "1.5.1",
           "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz",
    -      "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=",
    +      "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==",
           "dev": true,
           "engines": {
             "node": ">=0.6.0",
    @@ -13452,10 +13732,13 @@
           }
         },
         "node_modules/qs": {
    -      "version": "6.9.7",
    -      "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.7.tgz",
    -      "integrity": "sha512-IhMFgUmuNpyRfxA90umL7ByLlgRXu6tIfKPpF5TmcfRLlLCckfP/g3IQmju6jjpu+Hh8rA+2p6A27ZSPOOHdKw==",
    +      "version": "6.10.3",
    +      "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.3.tgz",
    +      "integrity": "sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==",
           "dev": true,
    +      "dependencies": {
    +        "side-channel": "^1.0.4"
    +      },
           "engines": {
             "node": ">=0.6"
           },
    @@ -13507,7 +13790,7 @@
         "node_modules/railroad-diagrams": {
           "version": "1.0.0",
           "resolved": "https://registry.npmjs.org/railroad-diagrams/-/railroad-diagrams-1.0.0.tgz",
    -      "integrity": "sha1-635iZ1SN3t+4mcG5Dlc3RVnN234=",
    +      "integrity": "sha512-cz93DjNeLY0idrCNOH6PviZGRN9GJhsdm9hpn1YCS879fj4W+x5IFJhhkRZcwVgMmFF7R82UA/7Oh+R8lLZg6A==",
           "dev": true
         },
         "node_modules/randexp": {
    @@ -13542,13 +13825,13 @@
           }
         },
         "node_modules/raw-body": {
    -      "version": "2.4.3",
    -      "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.3.tgz",
    -      "integrity": "sha512-UlTNLIcu0uzb4D2f4WltY6cVjLi+/jEN4lgEUj3E04tpMDpUlkBo/eSn6zou9hum2VMNpCCUone0O0WeJim07g==",
    +      "version": "2.5.1",
    +      "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz",
    +      "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==",
           "dev": true,
           "dependencies": {
             "bytes": "3.1.2",
    -        "http-errors": "1.8.1",
    +        "http-errors": "2.0.0",
             "iconv-lite": "0.4.24",
             "unpipe": "1.0.0"
           },
    @@ -13607,21 +13890,21 @@
           }
         },
         "node_modules/react-copy-to-clipboard": {
    -      "version": "5.0.4",
    -      "resolved": "https://registry.npmjs.org/react-copy-to-clipboard/-/react-copy-to-clipboard-5.0.4.tgz",
    -      "integrity": "sha512-IeVAiNVKjSPeGax/Gmkqfa/+PuMTBhutEvFUaMQLwE2tS0EXrAdgOpWDX26bWTXF3HrioorR7lr08NqeYUWQCQ==",
    +      "version": "5.1.0",
    +      "resolved": "https://registry.npmjs.org/react-copy-to-clipboard/-/react-copy-to-clipboard-5.1.0.tgz",
    +      "integrity": "sha512-k61RsNgAayIJNoy9yDsYzDe/yAZAzEbEgcz3DZMhF686LEyukcE1hzurxe85JandPUG+yTfGVFzuEw3xt8WP/A==",
           "dependencies": {
    -        "copy-to-clipboard": "^3",
    -        "prop-types": "^15.5.8"
    +        "copy-to-clipboard": "^3.3.1",
    +        "prop-types": "^15.8.1"
           },
           "peerDependencies": {
    -        "react": "^15.3.0 || ^16.0.0 || ^17.0.0"
    +        "react": "^15.3.0 || 16 || 17 || 18"
           }
         },
         "node_modules/react-dev-utils": {
    -      "version": "12.0.0",
    -      "resolved": "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-12.0.0.tgz",
    -      "integrity": "sha512-xBQkitdxozPxt1YZ9O1097EJiVpwHr9FoAuEVURCKV0Av8NBERovJauzP7bo1ThvuhZ4shsQ1AJiu4vQpoT1AQ==",
    +      "version": "12.0.1",
    +      "resolved": "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-12.0.1.tgz",
    +      "integrity": "sha512-84Ivxmr17KjUupyqzFode6xKhjwuEJDROWKJy/BthkL7Wn6NJ8h4WE6k/exAv6ImS+0oZLRRW5j/aINMHyeGeQ==",
           "dev": true,
           "dependencies": {
             "@babel/code-frame": "^7.16.0",
    @@ -13643,7 +13926,7 @@
             "open": "^8.4.0",
             "pkg-up": "^3.1.0",
             "prompts": "^2.4.2",
    -        "react-error-overlay": "^6.0.10",
    +        "react-error-overlay": "^6.0.11",
             "recursive-readdir": "^2.2.2",
             "shell-quote": "^1.7.3",
             "strip-ansi": "^6.0.1",
    @@ -13762,9 +14045,9 @@
           }
         },
         "node_modules/react-error-overlay": {
    -      "version": "6.0.10",
    -      "resolved": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-6.0.10.tgz",
    -      "integrity": "sha512-mKR90fX7Pm5seCOfz8q9F+66VCc1PGsWSBxKbITjfKVQHMNF2zudxHnMdJiB1fRCb+XsbQV9sO9DCkgsMQgBIA==",
    +      "version": "6.0.11",
    +      "resolved": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-6.0.11.tgz",
    +      "integrity": "sha512-/6UZ2qgEyH2aqzYZgQPxEnz33NJ2gNsnHA2o5+o4wW9bLM/JYQitNP9xPhsXwC08hMMovfGe/8retsdDsczPRg==",
           "dev": true
         },
         "node_modules/react-infinite-scroll-component": {
    @@ -13829,9 +14112,9 @@
           }
         },
         "node_modules/react-router": {
    -      "version": "5.2.1",
    -      "resolved": "https://registry.npmjs.org/react-router/-/react-router-5.2.1.tgz",
    -      "integrity": "sha512-lIboRiOtDLFdg1VTemMwud9vRVuOCZmUIT/7lUoZiSpPODiiH1UQlfXy+vPLC/7IWdFYnhRwAyNqA/+I7wnvKQ==",
    +      "version": "5.3.3",
    +      "resolved": "https://registry.npmjs.org/react-router/-/react-router-5.3.3.tgz",
    +      "integrity": "sha512-mzQGUvS3bM84TnbtMYR8ZjKnuPJ71IjSzR+DE6UkUqvN4czWIqEs17yLL8xkAycv4ev0AiN+IGrWu88vJs/p2w==",
           "dependencies": {
             "@babel/runtime": "^7.12.13",
             "history": "^4.9.0",
    @@ -13849,15 +14132,15 @@
           }
         },
         "node_modules/react-router-dom": {
    -      "version": "5.3.0",
    -      "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-5.3.0.tgz",
    -      "integrity": "sha512-ObVBLjUZsphUUMVycibxgMdh5jJ1e3o+KpAZBVeHcNQZ4W+uUGGWsokurzlF4YOldQYRQL4y6yFRWM4m3svmuQ==",
    +      "version": "5.3.3",
    +      "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-5.3.3.tgz",
    +      "integrity": "sha512-Ov0tGPMBgqmbu5CDmN++tv2HQ9HlWDuWIIqn4b88gjlAN5IHI+4ZUZRcpz9Hl0azFIwihbLDYw1OiHGRo7ZIng==",
           "dependencies": {
             "@babel/runtime": "^7.12.13",
             "history": "^4.9.0",
             "loose-envify": "^1.3.1",
             "prop-types": "^15.6.2",
    -        "react-router": "5.2.1",
    +        "react-router": "5.3.3",
             "tiny-invariant": "^1.0.2",
             "tiny-warning": "^1.0.0"
           },
    @@ -13865,28 +14148,15 @@
             "react": ">=15"
           }
         },
    -    "node_modules/react-router/node_modules/isarray": {
    -      "version": "0.0.1",
    -      "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
    -      "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8="
    -    },
    -    "node_modules/react-router/node_modules/path-to-regexp": {
    -      "version": "1.8.0",
    -      "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz",
    -      "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==",
    -      "dependencies": {
    -        "isarray": "0.0.1"
    -      }
    -    },
         "node_modules/react-router/node_modules/react-is": {
           "version": "16.13.1",
           "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz",
           "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ=="
         },
         "node_modules/react-scripts": {
    -      "version": "5.0.0",
    -      "resolved": "https://registry.npmjs.org/react-scripts/-/react-scripts-5.0.0.tgz",
    -      "integrity": "sha512-3i0L2CyIlROz7mxETEdfif6Sfhh9Lfpzi10CtcGs1emDQStmZfWjJbAIMtRD0opVUjQuFWqHZyRZ9PPzKCFxWg==",
    +      "version": "5.0.1",
    +      "resolved": "https://registry.npmjs.org/react-scripts/-/react-scripts-5.0.1.tgz",
    +      "integrity": "sha512-8VAmEm/ZAwQzJ+GOMLbBsTdDKOpuZh7RPs0UymvBR2vRk4iZWCskjbFnxqjrzoIvlNNRZ3QJFx6/qDSi6zSnaQ==",
           "dev": true,
           "dependencies": {
             "@babel/core": "^7.16.0",
    @@ -13905,7 +14175,7 @@
             "dotenv": "^10.0.0",
             "dotenv-expand": "^5.1.0",
             "eslint": "^8.3.0",
    -        "eslint-config-react-app": "^7.0.0",
    +        "eslint-config-react-app": "^7.0.1",
             "eslint-webpack-plugin": "^3.1.1",
             "file-loader": "^6.2.0",
             "fs-extra": "^10.0.0",
    @@ -13922,7 +14192,7 @@
             "postcss-preset-env": "^7.0.1",
             "prompts": "^2.4.2",
             "react-app-polyfill": "^3.0.0",
    -        "react-dev-utils": "^12.0.0",
    +        "react-dev-utils": "^12.0.1",
             "react-refresh": "^0.11.0",
             "resolve": "^1.20.0",
             "resolve-url-loader": "^4.0.0",
    @@ -13956,10 +14226,22 @@
             }
           }
         },
    +    "node_modules/react-scripts/node_modules/camelcase": {
    +      "version": "6.3.0",
    +      "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz",
    +      "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">=10"
    +      },
    +      "funding": {
    +        "url": "https://github.com/sponsors/sindresorhus"
    +      }
    +    },
         "node_modules/react-scripts/node_modules/semver": {
    -      "version": "7.3.5",
    -      "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz",
    -      "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==",
    +      "version": "7.3.7",
    +      "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz",
    +      "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==",
           "dev": true,
           "dependencies": {
             "lru-cache": "^6.0.0"
    @@ -13972,15 +14254,15 @@
           }
         },
         "node_modules/react-shallow-renderer": {
    -      "version": "16.14.1",
    -      "resolved": "https://registry.npmjs.org/react-shallow-renderer/-/react-shallow-renderer-16.14.1.tgz",
    -      "integrity": "sha512-rkIMcQi01/+kxiTE9D3fdS959U1g7gs+/rborw++42m1O9FAQiNI/UNRZExVUoAOprn4umcXf+pFRou8i4zuBg==",
    +      "version": "16.15.0",
    +      "resolved": "https://registry.npmjs.org/react-shallow-renderer/-/react-shallow-renderer-16.15.0.tgz",
    +      "integrity": "sha512-oScf2FqQ9LFVQgA73vr86xl2NaOIX73rh+YFqcOp68CWj56tSfgtGKrEbyhCj0rSijyG9M1CYprTh39fBi5hzA==",
           "dependencies": {
             "object-assign": "^4.1.1",
    -        "react-is": "^16.12.0 || ^17.0.0"
    +        "react-is": "^16.12.0 || ^17.0.0 || ^18.0.0"
           },
           "peerDependencies": {
    -        "react": "^16.0.0 || ^17.0.0"
    +        "react": "^16.0.0 || ^17.0.0 || ^18.0.0"
           }
         },
         "node_modules/react-test-renderer": {
    @@ -14028,6 +14310,15 @@
             "react-dom": ">=16.3.0"
           }
         },
    +    "node_modules/read-cache": {
    +      "version": "1.0.0",
    +      "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz",
    +      "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==",
    +      "dev": true,
    +      "dependencies": {
    +        "pify": "^2.3.0"
    +      }
    +    },
         "node_modules/readable-stream": {
           "version": "3.6.0",
           "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz",
    @@ -14101,9 +14392,9 @@
           "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA=="
         },
         "node_modules/regenerator-transform": {
    -      "version": "0.14.5",
    -      "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.5.tgz",
    -      "integrity": "sha512-eOf6vka5IO151Jfsw2NO9WpGX58W6wWmefK3I1zEGr0lOD0u8rwPaNqQL1aRxUaxLeKO3ArNh3VYg1KbaD+FFw==",
    +      "version": "0.15.0",
    +      "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.0.tgz",
    +      "integrity": "sha512-LsrGtPmbYg19bcPHwdtmXwbW+TqNvtY4riE3P83foeHRroMbH6/2ddFBfab3t7kbzc7v7p4wbkIecHImqt0QNg==",
           "dev": true,
           "dependencies": {
             "@babel/runtime": "^7.8.4"
    @@ -14116,12 +14407,13 @@
           "dev": true
         },
         "node_modules/regexp.prototype.flags": {
    -      "version": "1.4.1",
    -      "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.1.tgz",
    -      "integrity": "sha512-pMR7hBVUUGI7PMA37m2ofIdQCsomVnas+Jn5UPGAHQ+/LlwKm/aTLJHdasmHRzlfeZwHiAOaRSo2rbBDm3nNUQ==",
    +      "version": "1.4.3",
    +      "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz",
    +      "integrity": "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==",
           "dependencies": {
             "call-bind": "^1.0.2",
    -        "define-properties": "^1.1.3"
    +        "define-properties": "^1.1.3",
    +        "functions-have-names": "^1.2.2"
           },
           "engines": {
             "node": ">= 0.4"
    @@ -14180,7 +14472,7 @@
         "node_modules/regjsparser/node_modules/jsesc": {
           "version": "0.5.0",
           "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz",
    -      "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=",
    +      "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==",
           "dev": true,
           "bin": {
             "jsesc": "bin/jsesc"
    @@ -14189,7 +14481,7 @@
         "node_modules/relateurl": {
           "version": "0.2.7",
           "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz",
    -      "integrity": "sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=",
    +      "integrity": "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==",
           "dev": true,
           "engines": {
             "node": ">= 0.10"
    @@ -14208,10 +14500,78 @@
             "strip-ansi": "^6.0.1"
           }
         },
    +    "node_modules/renderkid/node_modules/css-select": {
    +      "version": "4.3.0",
    +      "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz",
    +      "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==",
    +      "dev": true,
    +      "dependencies": {
    +        "boolbase": "^1.0.0",
    +        "css-what": "^6.0.1",
    +        "domhandler": "^4.3.1",
    +        "domutils": "^2.8.0",
    +        "nth-check": "^2.0.1"
    +      },
    +      "funding": {
    +        "url": "https://github.com/sponsors/fb55"
    +      }
    +    },
    +    "node_modules/renderkid/node_modules/dom-serializer": {
    +      "version": "1.4.1",
    +      "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz",
    +      "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==",
    +      "dev": true,
    +      "dependencies": {
    +        "domelementtype": "^2.0.1",
    +        "domhandler": "^4.2.0",
    +        "entities": "^2.0.0"
    +      },
    +      "funding": {
    +        "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1"
    +      }
    +    },
    +    "node_modules/renderkid/node_modules/domhandler": {
    +      "version": "4.3.1",
    +      "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz",
    +      "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==",
    +      "dev": true,
    +      "dependencies": {
    +        "domelementtype": "^2.2.0"
    +      },
    +      "engines": {
    +        "node": ">= 4"
    +      },
    +      "funding": {
    +        "url": "https://github.com/fb55/domhandler?sponsor=1"
    +      }
    +    },
    +    "node_modules/renderkid/node_modules/domutils": {
    +      "version": "2.8.0",
    +      "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz",
    +      "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==",
    +      "dev": true,
    +      "dependencies": {
    +        "dom-serializer": "^1.0.1",
    +        "domelementtype": "^2.2.0",
    +        "domhandler": "^4.2.0"
    +      },
    +      "funding": {
    +        "url": "https://github.com/fb55/domutils?sponsor=1"
    +      }
    +    },
    +    "node_modules/renderkid/node_modules/entities": {
    +      "version": "2.2.0",
    +      "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz",
    +      "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==",
    +      "dev": true,
    +      "funding": {
    +        "url": "https://github.com/fb55/entities?sponsor=1"
    +      }
    +    },
         "node_modules/require-directory": {
           "version": "2.1.1",
           "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
    -      "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=",
    +      "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==",
           "dev": true,
           "engines": {
             "node": ">=0.10.0"
    @@ -14229,7 +14589,7 @@
         "node_modules/requires-port": {
           "version": "1.0.0",
           "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz",
    -      "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8="
    +      "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ=="
         },
         "node_modules/resize-observer-polyfill": {
           "version": "1.5.1",
    @@ -14339,15 +14699,6 @@
             "url": "https://opencollective.com/postcss/"
           }
         },
    -    "node_modules/resolve-url-loader/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/resolve.exports": {
           "version": "1.1.0",
           "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-1.1.0.tgz",
    @@ -14401,9 +14752,9 @@
           }
         },
         "node_modules/rollup": {
    -      "version": "2.70.1",
    -      "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.70.1.tgz",
    -      "integrity": "sha512-CRYsI5EuzLbXdxC6RnYhOuRdtz4bhejPMSWjsFLfVM/7w/85n2szZv6yExqUXsBdz5KT8eoubeyDUDjhLHEslA==",
    +      "version": "2.75.6",
    +      "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.75.6.tgz",
    +      "integrity": "sha512-OEf0TgpC9vU6WGROJIk1JA3LR5vk/yvqlzxqdrE2CzzXnqKXNzbAwlWUXis8RS3ZPe7LAq+YUxsRa0l3r27MLA==",
           "dev": true,
           "bin": {
             "rollup": "dist/bin/rollup"
    @@ -14456,7 +14807,7 @@
         "node_modules/rst-selector-parser": {
           "version": "2.2.3",
           "resolved": "https://registry.npmjs.org/rst-selector-parser/-/rst-selector-parser-2.2.3.tgz",
    -      "integrity": "sha1-gbIw6i/MYGbInjRy3nlChdmwPZE=",
    +      "integrity": "sha512-nDG1rZeP6oFTLN6yNDV/uiAvs1+FS/KlrEwh7+y7dpuApDBy6bI2HTBcc0/V8lv9OTqfyD34eF7au2pm8aBbhA==",
           "dev": true,
           "dependencies": {
             "lodash.flattendeep": "^4.4.0",
    @@ -14619,16 +14970,16 @@
         "node_modules/select-hose": {
           "version": "2.0.0",
           "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz",
    -      "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=",
    +      "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==",
           "dev": true
         },
         "node_modules/selfsigned": {
    -      "version": "2.0.0",
    -      "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.0.0.tgz",
    -      "integrity": "sha512-cUdFiCbKoa1mZ6osuJs2uDHrs0k0oprsKveFiiaBKCNq3SYyb5gs2HxhQyDNLCmL51ZZThqi4YNDpCK6GOP1iQ==",
    +      "version": "2.0.1",
    +      "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.0.1.tgz",
    +      "integrity": "sha512-LmME957M1zOsUhG+67rAjKfiWFox3SBxE/yymatMZsAx+oMrJ0YQ8AToOnyCm7xbeg2ep37IHLxdu0o2MavQOQ==",
           "dev": true,
           "dependencies": {
    -        "node-forge": "^1.2.0"
    +        "node-forge": "^1"
           },
           "engines": {
             "node": ">=10"
    @@ -14644,24 +14995,24 @@
           }
         },
         "node_modules/send": {
    -      "version": "0.17.2",
    -      "resolved": "https://registry.npmjs.org/send/-/send-0.17.2.tgz",
    -      "integrity": "sha512-UJYB6wFSJE3G00nEivR5rgWp8c2xXvJ3OPWPhmuteU0IKj8nKbG3DrjiOmLwpnHGYWAVwA69zmTm++YG0Hmwww==",
    +      "version": "0.18.0",
    +      "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz",
    +      "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==",
           "dev": true,
           "dependencies": {
             "debug": "2.6.9",
    -        "depd": "~1.1.2",
    -        "destroy": "~1.0.4",
    +        "depd": "2.0.0",
    +        "destroy": "1.2.0",
             "encodeurl": "~1.0.2",
             "escape-html": "~1.0.3",
             "etag": "~1.8.1",
             "fresh": "0.5.2",
    -        "http-errors": "1.8.1",
    +        "http-errors": "2.0.0",
             "mime": "1.6.0",
             "ms": "2.1.3",
    -        "on-finished": "~2.3.0",
    +        "on-finished": "2.4.1",
             "range-parser": "~1.2.1",
    -        "statuses": "~1.5.0"
    +        "statuses": "2.0.1"
           },
           "engines": {
             "node": ">= 0.8.0"
    @@ -14679,7 +15030,7 @@
         "node_modules/send/node_modules/debug/node_modules/ms": {
           "version": "2.0.0",
           "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
    -      "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
    +      "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
           "dev": true
         },
         "node_modules/send/node_modules/ms": {
    @@ -14700,7 +15051,7 @@
         "node_modules/serve-index": {
           "version": "1.9.1",
           "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz",
    -      "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=",
    +      "integrity": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==",
           "dev": true,
           "dependencies": {
             "accepts": "~1.3.4",
    @@ -14724,10 +15075,19 @@
             "ms": "2.0.0"
           }
         },
    +    "node_modules/serve-index/node_modules/depd": {
    +      "version": "1.1.2",
    +      "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
    +      "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">= 0.6"
    +      }
    +    },
         "node_modules/serve-index/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=",
    +      "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==",
           "dev": true,
           "dependencies": {
             "depd": "~1.1.2",
    @@ -14742,13 +15102,13 @@
         "node_modules/serve-index/node_modules/inherits": {
           "version": "2.0.3",
           "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
    -      "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
    +      "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==",
           "dev": true
         },
         "node_modules/serve-index/node_modules/ms": {
           "version": "2.0.0",
           "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
    -      "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
    +      "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
           "dev": true
         },
         "node_modules/serve-index/node_modules/setprototypeof": {
    @@ -14757,16 +15117,25 @@
           "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==",
           "dev": true
         },
    +    "node_modules/serve-index/node_modules/statuses": {
    +      "version": "1.5.0",
    +      "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz",
    +      "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==",
    +      "dev": true,
    +      "engines": {
    +        "node": ">= 0.6"
    +      }
    +    },
         "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==",
    +      "version": "1.15.0",
    +      "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz",
    +      "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==",
           "dev": true,
           "dependencies": {
             "encodeurl": "~1.0.2",
             "escape-html": "~1.0.3",
             "parseurl": "~1.3.3",
    -        "send": "0.17.2"
    +        "send": "0.18.0"
           },
           "engines": {
             "node": ">= 0.8.0"
    @@ -14826,13 +15195,13 @@
           "dev": true
         },
         "node_modules/sinon": {
    -      "version": "13.0.1",
    -      "resolved": "https://registry.npmjs.org/sinon/-/sinon-13.0.1.tgz",
    -      "integrity": "sha512-8yx2wIvkBjIq/MGY1D9h1LMraYW+z1X0mb648KZnKSdvLasvDu7maa0dFaNYdTDczFgbjNw2tOmWdTk9saVfwQ==",
    +      "version": "13.0.2",
    +      "resolved": "https://registry.npmjs.org/sinon/-/sinon-13.0.2.tgz",
    +      "integrity": "sha512-KvOrztAVqzSJWMDoxM4vM+GPys1df2VBoXm+YciyB/OLMamfS3VXh3oGh5WtrAGSzrgczNWFFY22oKb7Fi5eeA==",
           "dev": true,
           "dependencies": {
             "@sinonjs/commons": "^1.8.3",
    -        "@sinonjs/fake-timers": "^9.0.0",
    +        "@sinonjs/fake-timers": "^9.1.2",
             "@sinonjs/samsam": "^6.1.1",
             "diff": "^5.0.0",
             "nise": "^5.1.1",
    @@ -14844,9 +15213,9 @@
           }
         },
         "node_modules/sinon/node_modules/@sinonjs/fake-timers": {
    -      "version": "9.1.1",
    -      "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-9.1.1.tgz",
    -      "integrity": "sha512-Wp5vwlZ0lOqpSYGKqr53INws9HLkt6JDc/pDZcPf7bchQnrXJMXPns8CXx0hFikMSGSWfvtvvpb2gtMVfkWagA==",
    +      "version": "9.1.2",
    +      "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-9.1.2.tgz",
    +      "integrity": "sha512-BPS4ynJW/o92PUR4wgriz2Ud5gpST5vz6GQfMixEDK0Z8ZCUv2M7SkBLykH56T++Xs+8ln9zTGbOvNGIe02/jw==",
           "dev": true,
           "dependencies": {
             "@sinonjs/commons": "^1.7.0"
    @@ -14885,9 +15254,9 @@
           "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=",
    +      "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"
    @@ -14932,15 +15301,6 @@
             "source-map": "^0.6.0"
           }
         },
    -    "node_modules/source-map-support/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/sourcemap-codec": {
           "version": "1.4.8",
           "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz",
    @@ -14980,7 +15340,7 @@
         "node_modules/sprintf-js": {
           "version": "1.0.3",
           "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
    -      "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=",
    +      "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==",
           "dev": true
         },
         "node_modules/stable": {
    @@ -15011,18 +15371,18 @@
           }
         },
         "node_modules/stackframe": {
    -      "version": "1.2.1",
    -      "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.2.1.tgz",
    -      "integrity": "sha512-h88QkzREN/hy8eRdyNhhsO7RSJ5oyTqxxmmn0dzBIMUclZsjpfmrsg81vp8mjjAs2vAZ72nyWxRUwSwmh0e4xg==",
    +      "version": "1.3.4",
    +      "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.3.4.tgz",
    +      "integrity": "sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==",
           "dev": true
         },
         "node_modules/statuses": {
    -      "version": "1.5.0",
    -      "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz",
    -      "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=",
    +      "version": "2.0.1",
    +      "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz",
    +      "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==",
           "dev": true,
           "engines": {
    -        "node": ">= 0.6"
    +        "node": ">= 0.8"
           }
         },
         "node_modules/string_decoder": {
    @@ -15113,14 +15473,14 @@
           }
         },
         "node_modules/string.prototype.trim": {
    -      "version": "1.2.5",
    -      "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.5.tgz",
    -      "integrity": "sha512-Lnh17webJVsD6ECeovpVN17RlAKjmz4rF9S+8Y45CkMc/ufVpTkU3vZIyIC7sllQ1FCvObZnnCdNs/HXTUOTlg==",
    +      "version": "1.2.6",
    +      "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.6.tgz",
    +      "integrity": "sha512-8lMR2m+U0VJTPp6JjvJTtGyc4FIGq9CdRt7O9p6T0e6K4vjU+OP+SQJpbe/SBmRcCUIvNUnjsbmY6lnMp8MhsQ==",
           "dev": true,
           "dependencies": {
             "call-bind": "^1.0.2",
    -        "define-properties": "^1.1.3",
    -        "es-abstract": "^1.19.1"
    +        "define-properties": "^1.1.4",
    +        "es-abstract": "^1.19.5"
           },
           "engines": {
             "node": ">= 0.4"
    @@ -15130,26 +15490,28 @@
           }
         },
         "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==",
    +      "version": "1.0.5",
    +      "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.5.tgz",
    +      "integrity": "sha512-I7RGvmjV4pJ7O3kdf+LXFpVfdNOxtCW/2C8f6jNiW4+PQchwxkCDzlk1/7p+Wl4bqFIZeF47qAHXLuHHWKAxog==",
           "dev": true,
           "dependencies": {
             "call-bind": "^1.0.2",
    -        "define-properties": "^1.1.3"
    +        "define-properties": "^1.1.4",
    +        "es-abstract": "^1.19.5"
           },
           "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==",
    +      "version": "1.0.5",
    +      "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.5.tgz",
    +      "integrity": "sha512-THx16TJCGlsN0o6dl2o6ncWUsdgnLRSA23rRE5pyGBw/mLr3Ej/R2LaqCtgP8VNMGZsvMWnf9ooZPyY2bHvUFg==",
           "dev": true,
           "dependencies": {
             "call-bind": "^1.0.2",
    -        "define-properties": "^1.1.3"
    +        "define-properties": "^1.1.4",
    +        "es-abstract": "^1.19.5"
           },
           "funding": {
             "url": "https://github.com/sponsors/ljharb"
    @@ -15375,7 +15737,7 @@
         "node_modules/svgo/node_modules/color-name": {
           "version": "1.1.3",
           "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
    -      "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
    +      "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==",
           "dev": true
         },
         "node_modules/svgo/node_modules/css-select": {
    @@ -15428,10 +15790,19 @@
           "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==",
           "dev": true
         },
    +    "node_modules/svgo/node_modules/entities": {
    +      "version": "2.2.0",
    +      "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz",
    +      "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==",
    +      "dev": true,
    +      "funding": {
    +        "url": "https://github.com/fb55/entities?sponsor=1"
    +      }
    +    },
         "node_modules/svgo/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=",
    +      "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
           "dev": true,
           "engines": {
             "node": ">=0.8.0"
    @@ -15440,7 +15811,7 @@
         "node_modules/svgo/node_modules/has-flag": {
           "version": "3.0.0",
           "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
    -      "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
    +      "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==",
           "dev": true,
           "engines": {
             "node": ">=4"
    @@ -15487,29 +15858,30 @@
           "dev": true
         },
         "node_modules/tailwindcss": {
    -      "version": "3.0.23",
    -      "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.0.23.tgz",
    -      "integrity": "sha512-+OZOV9ubyQ6oI2BXEhzw4HrqvgcARY38xv3zKcjnWtMIZstEsXdI9xftd1iB7+RbOnj2HOEzkA0OyB5BaSxPQA==",
    +      "version": "3.1.2",
    +      "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.1.2.tgz",
    +      "integrity": "sha512-yJ6L5s1U5AeS5g7HHy212zdQfjwD426FBfm59pet/JsyneuZuD4C2W7PpJEg4ppisiB21uLqtNagv8KXury3+Q==",
           "dev": true,
           "dependencies": {
             "arg": "^5.0.1",
    -        "chalk": "^4.1.2",
             "chokidar": "^3.5.3",
             "color-name": "^1.1.4",
    -        "cosmiconfig": "^7.0.1",
    -        "detective": "^5.2.0",
    +        "detective": "^5.2.1",
             "didyoumean": "^1.2.2",
             "dlv": "^1.1.3",
             "fast-glob": "^3.2.11",
             "glob-parent": "^6.0.2",
             "is-glob": "^4.0.3",
    +        "lilconfig": "^2.0.5",
             "normalize-path": "^3.0.0",
    -        "object-hash": "^2.2.0",
    -        "postcss": "^8.4.6",
    +        "object-hash": "^3.0.0",
    +        "picocolors": "^1.0.0",
    +        "postcss": "^8.4.14",
    +        "postcss-import": "^14.1.0",
             "postcss-js": "^4.0.0",
    -        "postcss-load-config": "^3.1.0",
    +        "postcss-load-config": "^3.1.4",
             "postcss-nested": "5.0.6",
    -        "postcss-selector-parser": "^6.0.9",
    +        "postcss-selector-parser": "^6.0.10",
             "postcss-value-parser": "^4.2.0",
             "quick-lru": "^5.1.1",
             "resolve": "^1.22.0"
    @@ -15522,7 +15894,6 @@
             "node": ">=12.13.0"
           },
           "peerDependencies": {
    -        "autoprefixer": "^10.0.2",
             "postcss": "^8.0.9"
           }
         },
    @@ -15545,14 +15916,14 @@
           }
         },
         "node_modules/tempusdominus-bootstrap-4": {
    -      "version": "5.39.0",
    -      "resolved": "https://registry.npmjs.org/tempusdominus-bootstrap-4/-/tempusdominus-bootstrap-4-5.39.0.tgz",
    -      "integrity": "sha512-vYnkmQYQq4+A51WyRc/6e03eM0BHDoPaxd556K1pd4Nhr0eGeB3+Mi9b+3CDx4189fg3gQlrsKzgJiHPRwSX3Q==",
    +      "version": "5.39.2",
    +      "resolved": "https://registry.npmjs.org/tempusdominus-bootstrap-4/-/tempusdominus-bootstrap-4-5.39.2.tgz",
    +      "integrity": "sha512-8Au4miSAsMGdsElPg87EUmsN7aGJFaRA5Y8Ale7dDTfhhnQL1Za53LclIJkq+t/7NO5+Ufr1jY7tmEPvWGHaVg==",
           "dependencies": {
    -        "bootstrap": "^4.5.2",
    -        "jquery": "^3.5.1",
    -        "moment": "^2.29.0",
    -        "moment-timezone": "^0.5.31",
    +        "bootstrap": "^4.6.1",
    +        "jquery": "^3.6.0",
    +        "moment": "^2.29.2",
    +        "moment-timezone": "^0.5.34",
             "popper.js": "^1.16.1"
           },
           "peerDependencies": {
    @@ -15561,32 +15932,24 @@
             "moment": "^2.29.0",
             "moment-timezone": "^0.5.31",
             "popper.js": "^1.16.1",
    -        "tempusdominus-core": "5.19.0"
    +        "tempusdominus-core": "5.19.3"
           }
         },
         "node_modules/tempusdominus-core": {
    -      "version": "5.19.0",
    -      "resolved": "https://registry.npmjs.org/tempusdominus-core/-/tempusdominus-core-5.19.0.tgz",
    -      "integrity": "sha512-7a4oBQw4cjz6C87BLRg3KHVvzpnPlnRTkuDZ7SwcJayQQ4QgOryX5u6wj0q07TXhgtMQLCntZO6nVhHIKPaeUw==",
    +      "version": "5.19.3",
    +      "resolved": "https://registry.npmjs.org/tempusdominus-core/-/tempusdominus-core-5.19.3.tgz",
    +      "integrity": "sha512-WXBVXcBG/hErB6u9gdUs+vzANvCU1kd1ykzL4kolPB3h1OEv20OKUW5qz1iynxyqRFPa1NWY9gwRu5d+MjXEuQ==",
           "dependencies": {
    -        "jquery": "^3.5.0",
    -        "moment": "~2.24.0",
    -        "moment-timezone": "^0.5.28"
    +        "jquery": "^3.6.0",
    +        "moment": "~2.29.2",
    +        "moment-timezone": "^0.5.34"
           },
           "peerDependencies": {
             "jquery": "^3.0",
    -        "moment": "^2.10",
    +        "moment": "^2.29.2",
             "moment-timezone": "^0.5.0"
           }
         },
    -    "node_modules/tempusdominus-core/node_modules/moment": {
    -      "version": "2.24.0",
    -      "resolved": "https://registry.npmjs.org/moment/-/moment-2.24.0.tgz",
    -      "integrity": "sha512-bV7f+6l2QigeBBZSM/6yTNq4P2fNpSWj/0e7jQcy87A8e7o2nAfP/34/2ky5Vw4B9S446EtIhodAzkFCcR4dQg==",
    -      "engines": {
    -        "node": "*"
    -      }
    -    },
         "node_modules/tempy": {
           "version": "0.6.0",
           "resolved": "https://registry.npmjs.org/tempy/-/tempy-0.6.0.tgz",
    @@ -15634,14 +15997,14 @@
           }
         },
         "node_modules/terser": {
    -      "version": "5.12.1",
    -      "resolved": "https://registry.npmjs.org/terser/-/terser-5.12.1.tgz",
    -      "integrity": "sha512-NXbs+7nisos5E+yXwAD+y7zrcTkMqb0dEJxIGtSKPdCBzopf7ni4odPul2aechpV7EXNvOudYOX2bb5tln1jbQ==",
    +      "version": "5.14.1",
    +      "resolved": "https://registry.npmjs.org/terser/-/terser-5.14.1.tgz",
    +      "integrity": "sha512-+ahUAE+iheqBTDxXhTisdA8hgvbEG1hHOQ9xmNjeUJSoi6DU/gMrKNcfZjHkyY6Alnuyc+ikYJaxxfHkT3+WuQ==",
           "dev": true,
           "dependencies": {
    +        "@jridgewell/source-map": "^0.3.2",
             "acorn": "^8.5.0",
             "commander": "^2.20.0",
    -        "source-map": "~0.7.2",
             "source-map-support": "~0.5.20"
           },
           "bin": {
    @@ -15652,15 +16015,15 @@
           }
         },
         "node_modules/terser-webpack-plugin": {
    -      "version": "5.3.1",
    -      "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.1.tgz",
    -      "integrity": "sha512-GvlZdT6wPQKbDNW/GDQzZFg/j4vKU96yl2q6mcUkzKOgW4gwf1Z8cZToUCrz31XHlPWH8MVb1r2tFtdDtTGJ7g==",
    +      "version": "5.3.3",
    +      "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.3.tgz",
    +      "integrity": "sha512-Fx60G5HNYknNTNQnzQ1VePRuu89ZVYWfjRAeT5rITuCY/1b08s49e5kSQwHDirKZWuoKOBRFS98EUUoZ9kLEwQ==",
           "dev": true,
           "dependencies": {
    +        "@jridgewell/trace-mapping": "^0.3.7",
             "jest-worker": "^27.4.5",
             "schema-utils": "^3.1.1",
             "serialize-javascript": "^6.0.0",
    -        "source-map": "^0.6.1",
             "terser": "^5.7.2"
           },
           "engines": {
    @@ -15685,30 +16048,12 @@
             }
           }
         },
    -    "node_modules/terser-webpack-plugin/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/terser/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==",
           "dev": true
         },
    -    "node_modules/terser/node_modules/source-map": {
    -      "version": "0.7.3",
    -      "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz",
    -      "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==",
    -      "dev": true,
    -      "engines": {
    -        "node": ">= 8"
    -      }
    -    },
         "node_modules/test-exclude": {
           "version": "6.0.0",
           "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz",
    @@ -15726,7 +16071,7 @@
         "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=",
    +      "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==",
           "dev": true
         },
         "node_modules/throat": {
    @@ -15749,12 +16094,6 @@
           "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==",
           "dev": true
         },
    -    "node_modules/timsort": {
    -      "version": "0.3.0",
    -      "resolved": "https://registry.npmjs.org/timsort/-/timsort-0.3.0.tgz",
    -      "integrity": "sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q=",
    -      "dev": true
    -    },
         "node_modules/tiny-invariant": {
           "version": "1.2.0",
           "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.2.0.tgz",
    @@ -15774,7 +16113,7 @@
         "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=",
    +      "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==",
           "dev": true,
           "engines": {
             "node": ">=4"
    @@ -15794,7 +16133,7 @@
         "node_modules/toggle-selection": {
           "version": "1.0.6",
           "resolved": "https://registry.npmjs.org/toggle-selection/-/toggle-selection-1.0.6.tgz",
    -      "integrity": "sha1-bkWxJj8gF/oKzH2J14sVuL932jI="
    +      "integrity": "sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ=="
         },
         "node_modules/toidentifier": {
           "version": "1.0.1",
    @@ -15829,10 +16168,16 @@
           }
         },
         "node_modules/tr46": {
    -      "version": "0.0.3",
    -      "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz",
    -      "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=",
    -      "dev": true
    +      "version": "2.1.0",
    +      "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz",
    +      "integrity": "sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==",
    +      "dev": true,
    +      "dependencies": {
    +        "punycode": "^2.1.1"
    +      },
    +      "engines": {
    +        "node": ">=8"
    +      }
         },
         "node_modules/tryer": {
           "version": "1.0.1",
    @@ -15841,9 +16186,9 @@
           "dev": true
         },
         "node_modules/ts-jest": {
    -      "version": "27.1.4",
    -      "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-27.1.4.tgz",
    -      "integrity": "sha512-qjkZlVPWVctAezwsOD1OPzbZ+k7zA5z3oxII4dGdZo5ggX/PL7kvwTM0pXTr10fAtbiVpJaL3bWd502zAhpgSQ==",
    +      "version": "27.1.5",
    +      "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-27.1.5.tgz",
    +      "integrity": "sha512-Xv6jBQPoBEvBq/5i2TeSG9tt/nqkbpcurrEG1b+2yfBrcJelOZF9Ml6dmyMh7bcW9JyFbRYpR5rxROSlBLTZHA==",
           "dev": true,
           "dependencies": {
             "bs-logger": "0.x",
    @@ -15869,119 +16214,44 @@
             "typescript": ">=3.8 <5.0"
           },
           "peerDependenciesMeta": {
    -        "@babel/core": {
    -          "optional": true
    -        },
    -        "@types/jest": {
    -          "optional": true
    -        },
    -        "babel-jest": {
    -          "optional": true
    -        },
    -        "esbuild": {
    -          "optional": true
    -        }
    -      }
    -    },
    -    "node_modules/ts-jest/node_modules/semver": {
    -      "version": "7.3.5",
    -      "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz",
    -      "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==",
    -      "dev": true,
    -      "dependencies": {
    -        "lru-cache": "^6.0.0"
    -      },
    -      "bin": {
    -        "semver": "bin/semver.js"
    -      },
    -      "engines": {
    -        "node": ">=10"
    -      }
    -    },
    -    "node_modules/ts-node": {
    -      "version": "10.7.0",
    -      "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.7.0.tgz",
    -      "integrity": "sha512-TbIGS4xgJoX2i3do417KSaep1uRAW/Lu+WAL2doDHC0D6ummjirVOXU5/7aiZotbQ5p1Zp9tP7U6cYhA0O7M8A==",
    -      "dev": true,
    -      "optional": true,
    -      "peer": true,
    -      "dependencies": {
    -        "@cspotcode/source-map-support": "0.7.0",
    -        "@tsconfig/node10": "^1.0.7",
    -        "@tsconfig/node12": "^1.0.7",
    -        "@tsconfig/node14": "^1.0.0",
    -        "@tsconfig/node16": "^1.0.2",
    -        "acorn": "^8.4.1",
    -        "acorn-walk": "^8.1.1",
    -        "arg": "^4.1.0",
    -        "create-require": "^1.1.0",
    -        "diff": "^4.0.1",
    -        "make-error": "^1.1.1",
    -        "v8-compile-cache-lib": "^3.0.0",
    -        "yn": "3.1.1"
    -      },
    -      "bin": {
    -        "ts-node": "dist/bin.js",
    -        "ts-node-cwd": "dist/bin-cwd.js",
    -        "ts-node-esm": "dist/bin-esm.js",
    -        "ts-node-script": "dist/bin-script.js",
    -        "ts-node-transpile-only": "dist/bin-transpile.js",
    -        "ts-script": "dist/bin-script-deprecated.js"
    -      },
    -      "peerDependencies": {
    -        "@swc/core": ">=1.2.50",
    -        "@swc/wasm": ">=1.2.50",
    -        "@types/node": "*",
    -        "typescript": ">=2.7"
    -      },
    -      "peerDependenciesMeta": {
    -        "@swc/core": {
    +        "@babel/core": {
    +          "optional": true
    +        },
    +        "@types/jest": {
    +          "optional": true
    +        },
    +        "babel-jest": {
               "optional": true
             },
    -        "@swc/wasm": {
    +        "esbuild": {
               "optional": true
             }
           }
         },
    -    "node_modules/ts-node/node_modules/acorn-walk": {
    -      "version": "8.2.0",
    -      "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz",
    -      "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==",
    -      "dev": true,
    -      "optional": true,
    -      "peer": true,
    -      "engines": {
    -        "node": ">=0.4.0"
    -      }
    -    },
    -    "node_modules/ts-node/node_modules/arg": {
    -      "version": "4.1.3",
    -      "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz",
    -      "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==",
    -      "dev": true,
    -      "optional": true,
    -      "peer": true
    -    },
    -    "node_modules/ts-node/node_modules/diff": {
    -      "version": "4.0.2",
    -      "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz",
    -      "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==",
    +    "node_modules/ts-jest/node_modules/semver": {
    +      "version": "7.3.7",
    +      "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz",
    +      "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==",
           "dev": true,
    -      "optional": true,
    -      "peer": true,
    +      "dependencies": {
    +        "lru-cache": "^6.0.0"
    +      },
    +      "bin": {
    +        "semver": "bin/semver.js"
    +      },
           "engines": {
    -        "node": ">=0.3.1"
    +        "node": ">=10"
           }
         },
         "node_modules/tsconfig-paths": {
    -      "version": "3.14.0",
    -      "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.0.tgz",
    -      "integrity": "sha512-cg/1jAZoL57R39+wiw4u/SCC6Ic9Q5NqjBOb+9xISedOYurfog9ZNmKJSxAnb2m/5Bq4lE9lhUcau33Ml8DM0g==",
    +      "version": "3.14.1",
    +      "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz",
    +      "integrity": "sha512-fxDhWnFSLt3VuTwtvJt5fpwxBHg5AdKWMsgcPOOIilyjymcYVZoCQF8fvFRezCNfblEXmi+PcM1eYHeOAgXCOQ==",
           "dev": true,
           "dependencies": {
             "@types/json5": "^0.0.29",
             "json5": "^1.0.1",
    -        "minimist": "^1.2.0",
    +        "minimist": "^1.2.6",
             "strip-bom": "^3.0.0"
           }
         },
    @@ -16000,16 +16270,16 @@
         "node_modules/tsconfig-paths/node_modules/strip-bom": {
           "version": "3.0.0",
           "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz",
    -      "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=",
    +      "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==",
           "dev": true,
           "engines": {
             "node": ">=4"
           }
         },
         "node_modules/tslib": {
    -      "version": "2.3.1",
    -      "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz",
    -      "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw=="
    +      "version": "2.4.0",
    +      "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz",
    +      "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ=="
         },
         "node_modules/tsutils": {
           "version": "3.21.0",
    @@ -16093,9 +16363,9 @@
           }
         },
         "node_modules/typescript": {
    -      "version": "4.6.3",
    -      "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.6.3.tgz",
    -      "integrity": "sha512-yNIatDa5iaofVozS/uQJEl3JRWLKKGJKh6Yaiv0GLGSuhpFJe7P3SbHZ8/yjAHRQwKRoA6YZqlfjXWmVzoVSMw==",
    +      "version": "4.7.3",
    +      "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.7.3.tgz",
    +      "integrity": "sha512-WOkT3XYvrpXx4vMMqlD+8R8R37fZkjyLGlxavMc4iB8lrl8L0DeTcHbYgw/v0N/z9wAFsgBhcsF0ruoySS22mA==",
           "dev": true,
           "bin": {
             "tsc": "bin/tsc",
    @@ -16106,14 +16376,14 @@
           }
         },
         "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==",
    +      "version": "1.0.2",
    +      "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz",
    +      "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==",
           "dev": true,
           "dependencies": {
    -        "function-bind": "^1.1.1",
    -        "has-bigints": "^1.0.1",
    -        "has-symbols": "^1.0.2",
    +        "call-bind": "^1.0.2",
    +        "has-bigints": "^1.0.2",
    +        "has-symbols": "^1.0.3",
             "which-boxed-primitive": "^1.0.2"
           },
           "funding": {
    @@ -16184,7 +16454,7 @@
         "node_modules/unpipe": {
           "version": "1.0.0",
           "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
    -      "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=",
    +      "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==",
           "dev": true,
           "engines": {
             "node": ">= 0.8"
    @@ -16193,7 +16463,7 @@
         "node_modules/unquote": {
           "version": "1.1.1",
           "resolved": "https://registry.npmjs.org/unquote/-/unquote-1.1.1.tgz",
    -      "integrity": "sha1-j97XMk7G6IoP+LkF58CYzcCG1UQ=",
    +      "integrity": "sha512-vRCqFv6UhXpWxZPyGDh/F3ZpNv8/qo7w6iufLpQg9aKnQ71qM4B5KiI7Mia9COcjEhrO9LueHpMYjYzsWH3OIg==",
           "dev": true
         },
         "node_modules/upath": {
    @@ -16218,7 +16488,7 @@
         "node_modules/util-deprecate": {
           "version": "1.0.2",
           "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
    -      "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=",
    +      "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==",
           "dev": true
         },
         "node_modules/util.promisify": {
    @@ -16239,13 +16509,13 @@
         "node_modules/utila": {
           "version": "0.4.0",
           "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz",
    -      "integrity": "sha1-ihagXURWV6Oupe7MWxKk+lN5dyw=",
    +      "integrity": "sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==",
           "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=",
    +      "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==",
           "dev": true,
           "engines": {
             "node": ">= 0.4.0"
    @@ -16266,14 +16536,6 @@
           "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==",
           "dev": true
         },
    -    "node_modules/v8-compile-cache-lib": {
    -      "version": "3.0.0",
    -      "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.0.tgz",
    -      "integrity": "sha512-mpSYqfsFvASnSn5qMiwrr4VKfumbPyONLCOPmsR3A6pTY/r0+tSaVbgPWSAIuzbk3lCTa+FForeTiO+wBQGkjA==",
    -      "dev": true,
    -      "optional": true,
    -      "peer": true
    -    },
         "node_modules/v8-to-istanbul": {
           "version": "8.1.1",
           "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-8.1.1.tgz",
    @@ -16289,9 +16551,9 @@
           }
         },
         "node_modules/v8-to-istanbul/node_modules/source-map": {
    -      "version": "0.7.3",
    -      "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz",
    -      "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==",
    +      "version": "0.7.4",
    +      "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz",
    +      "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==",
           "dev": true,
           "engines": {
             "node": ">= 8"
    @@ -16305,7 +16567,7 @@
         "node_modules/vary": {
           "version": "1.1.2",
           "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
    -      "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=",
    +      "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==",
           "dev": true,
           "engines": {
             "node": ">= 0.8"
    @@ -16355,9 +16617,9 @@
           }
         },
         "node_modules/watchpack": {
    -      "version": "2.3.1",
    -      "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.3.1.tgz",
    -      "integrity": "sha512-x0t0JuydIo8qCNctdDrn1OzH/qDzk2+rdCOC3YzumZ42fiMqmQ7T3xQurykYMhYfHaPHTp4ZxAx2NfUo1K6QaA==",
    +      "version": "2.4.0",
    +      "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz",
    +      "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==",
           "dev": true,
           "dependencies": {
             "glob-to-regexp": "^0.4.1",
    @@ -16386,9 +16648,9 @@
           }
         },
         "node_modules/webpack": {
    -      "version": "5.70.0",
    -      "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.70.0.tgz",
    -      "integrity": "sha512-ZMWWy8CeuTTjCxbeaQI21xSswseF2oNOwc70QSKNePvmxE7XW36i7vpBMYZFAUHPwQiEbNGCEYIOOlyRbdGmxw==",
    +      "version": "5.73.0",
    +      "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.73.0.tgz",
    +      "integrity": "sha512-svjudQRPPa0YiOYa2lM/Gacw0r6PvxptHj4FuEKQ2kX05ZLkjbVc5MnPs6its5j7IZljnIqSVo/OsY2X0IpHGA==",
           "dev": true,
           "dependencies": {
             "@types/eslint-scope": "^3.7.3",
    @@ -16400,13 +16662,13 @@
             "acorn-import-assertions": "^1.7.6",
             "browserslist": "^4.14.5",
             "chrome-trace-event": "^1.0.2",
    -        "enhanced-resolve": "^5.9.2",
    +        "enhanced-resolve": "^5.9.3",
             "es-module-lexer": "^0.9.0",
             "eslint-scope": "5.1.1",
             "events": "^3.2.0",
             "glob-to-regexp": "^0.4.1",
             "graceful-fs": "^4.2.9",
    -        "json-parse-better-errors": "^1.0.2",
    +        "json-parse-even-better-errors": "^2.3.1",
             "loader-runner": "^4.2.0",
             "mime-types": "^2.1.27",
             "neo-async": "^2.6.2",
    @@ -16433,13 +16695,13 @@
           }
         },
         "node_modules/webpack-dev-middleware": {
    -      "version": "5.3.1",
    -      "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.1.tgz",
    -      "integrity": "sha512-81EujCKkyles2wphtdrnPg/QqegC/AtqNH//mQkBYSMqwFVCQrxM6ktB2O/SPlZy7LqeEfTbV3cZARGQz6umhg==",
    +      "version": "5.3.3",
    +      "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.3.tgz",
    +      "integrity": "sha512-hj5CYrY0bZLB+eTO+x/j67Pkrquiy7kWepMHmUMoPsmcUaeEnQJqFzHJOyxgWlq746/wUuA64p9ta34Kyb01pA==",
           "dev": true,
           "dependencies": {
             "colorette": "^2.0.10",
    -        "memfs": "^3.4.1",
    +        "memfs": "^3.4.3",
             "mime-types": "^2.1.31",
             "range-parser": "^1.2.1",
             "schema-utils": "^4.0.0"
    @@ -16456,9 +16718,9 @@
           }
         },
         "node_modules/webpack-dev-middleware/node_modules/ajv": {
    -      "version": "8.10.0",
    -      "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.10.0.tgz",
    -      "integrity": "sha512-bzqAEZOjkrUMl2afH8dknrq5KEk2SrwdBROR+vH1EKVQTqaUbJVPdc/gEdggTMM0Se+s+Ja4ju4TlNcStKl2Hw==",
    +      "version": "8.11.0",
    +      "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz",
    +      "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==",
           "dev": true,
           "dependencies": {
             "fast-deep-equal": "^3.1.1",
    @@ -16509,39 +16771,38 @@
           }
         },
         "node_modules/webpack-dev-server": {
    -      "version": "4.7.4",
    -      "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.7.4.tgz",
    -      "integrity": "sha512-nfdsb02Zi2qzkNmgtZjkrMOcXnYZ6FLKcQwpxT7MvmHKc+oTtDsBju8j+NMyAygZ9GW1jMEUpy3itHtqgEhe1A==",
    +      "version": "4.9.2",
    +      "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.9.2.tgz",
    +      "integrity": "sha512-H95Ns95dP24ZsEzO6G9iT+PNw4Q7ltll1GfJHV4fKphuHWgKFzGHWi4alTlTnpk1SPPk41X+l2RB7rLfIhnB9Q==",
           "dev": true,
           "dependencies": {
             "@types/bonjour": "^3.5.9",
             "@types/connect-history-api-fallback": "^1.3.5",
             "@types/express": "^4.17.13",
             "@types/serve-index": "^1.9.1",
    +        "@types/serve-static": "^1.13.10",
             "@types/sockjs": "^0.3.33",
    -        "@types/ws": "^8.2.2",
    +        "@types/ws": "^8.5.1",
             "ansi-html-community": "^0.0.8",
    -        "bonjour": "^3.5.0",
    +        "bonjour-service": "^1.0.11",
             "chokidar": "^3.5.3",
             "colorette": "^2.0.10",
             "compression": "^1.7.4",
             "connect-history-api-fallback": "^1.6.0",
             "default-gateway": "^6.0.3",
    -        "del": "^6.0.0",
    -        "express": "^4.17.1",
    +        "express": "^4.17.3",
             "graceful-fs": "^4.2.6",
             "html-entities": "^2.3.2",
    -        "http-proxy-middleware": "^2.0.0",
    +        "http-proxy-middleware": "^2.0.3",
             "ipaddr.js": "^2.0.1",
             "open": "^8.0.9",
             "p-retry": "^4.5.0",
    -        "portfinder": "^1.0.28",
    +        "rimraf": "^3.0.2",
             "schema-utils": "^4.0.0",
    -        "selfsigned": "^2.0.0",
    +        "selfsigned": "^2.0.1",
             "serve-index": "^1.9.1",
    -        "sockjs": "^0.3.21",
    +        "sockjs": "^0.3.24",
             "spdy": "^4.0.2",
    -        "strip-ansi": "^7.0.0",
             "webpack-dev-middleware": "^5.3.1",
             "ws": "^8.4.2"
           },
    @@ -16561,9 +16822,9 @@
           }
         },
         "node_modules/webpack-dev-server/node_modules/ajv": {
    -      "version": "8.10.0",
    -      "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.10.0.tgz",
    -      "integrity": "sha512-bzqAEZOjkrUMl2afH8dknrq5KEk2SrwdBROR+vH1EKVQTqaUbJVPdc/gEdggTMM0Se+s+Ja4ju4TlNcStKl2Hw==",
    +      "version": "8.11.0",
    +      "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz",
    +      "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==",
           "dev": true,
           "dependencies": {
             "fast-deep-equal": "^3.1.1",
    @@ -16588,18 +16849,6 @@
             "ajv": "^8.8.2"
           }
         },
    -    "node_modules/webpack-dev-server/node_modules/ansi-regex": {
    -      "version": "6.0.1",
    -      "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz",
    -      "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==",
    -      "dev": true,
    -      "engines": {
    -        "node": ">=12"
    -      },
    -      "funding": {
    -        "url": "https://github.com/chalk/ansi-regex?sponsor=1"
    -      }
    -    },
         "node_modules/webpack-dev-server/node_modules/json-schema-traverse": {
           "version": "1.0.0",
           "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
    @@ -16625,25 +16874,10 @@
             "url": "https://opencollective.com/webpack"
           }
         },
    -    "node_modules/webpack-dev-server/node_modules/strip-ansi": {
    -      "version": "7.0.1",
    -      "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz",
    -      "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==",
    -      "dev": true,
    -      "dependencies": {
    -        "ansi-regex": "^6.0.1"
    -      },
    -      "engines": {
    -        "node": ">=12"
    -      },
    -      "funding": {
    -        "url": "https://github.com/chalk/strip-ansi?sponsor=1"
    -      }
    -    },
         "node_modules/webpack-dev-server/node_modules/ws": {
    -      "version": "8.5.0",
    -      "resolved": "https://registry.npmjs.org/ws/-/ws-8.5.0.tgz",
    -      "integrity": "sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg==",
    +      "version": "8.8.0",
    +      "resolved": "https://registry.npmjs.org/ws/-/ws-8.8.0.tgz",
    +      "integrity": "sha512-JDAgSYQ1ksuwqfChJusw1LSJ8BizJ2e/vVu5Lxjq3YvNJNlROv1ui4i+c/kUUrPheBvQl4c5UbERhTwKa6QBJQ==",
           "dev": true,
           "engines": {
             "node": ">=10.0.0"
    @@ -16677,15 +16911,6 @@
             "webpack": "^4.44.2 || ^5.47.0"
           }
         },
    -    "node_modules/webpack-manifest-plugin/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/webpack-manifest-plugin/node_modules/webpack-sources": {
           "version": "2.3.1",
           "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-2.3.1.tgz",
    @@ -16787,21 +17012,19 @@
           "dev": true
         },
         "node_modules/whatwg-url": {
    -      "version": "5.0.0",
    -      "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz",
    -      "integrity": "sha1-lmRU6HZUYuN2RNNib2dCzotwll0=",
    +      "version": "8.7.0",
    +      "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.7.0.tgz",
    +      "integrity": "sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==",
           "dev": true,
           "dependencies": {
    -        "tr46": "~0.0.3",
    -        "webidl-conversions": "^3.0.0"
    +        "lodash": "^4.7.0",
    +        "tr46": "^2.1.0",
    +        "webidl-conversions": "^6.1.0"
    +      },
    +      "engines": {
    +        "node": ">=10"
           }
         },
    -    "node_modules/whatwg-url/node_modules/webidl-conversions": {
    -      "version": "3.0.1",
    -      "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz",
    -      "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=",
    -      "dev": true
    -    },
         "node_modules/which": {
           "version": "2.0.2",
           "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
    @@ -16843,28 +17066,28 @@
           }
         },
         "node_modules/workbox-background-sync": {
    -      "version": "6.5.1",
    -      "resolved": "https://registry.npmjs.org/workbox-background-sync/-/workbox-background-sync-6.5.1.tgz",
    -      "integrity": "sha512-T5a35fagLXQvV8Dr4+bDU+XYsP90jJ3eBLjZMKuCNELMQZNj+VekCODz1QK44jgoBeQk+vp94pkZV6G+e41pgg==",
    +      "version": "6.5.3",
    +      "resolved": "https://registry.npmjs.org/workbox-background-sync/-/workbox-background-sync-6.5.3.tgz",
    +      "integrity": "sha512-0DD/V05FAcek6tWv9XYj2w5T/plxhDSpclIcAGjA/b7t/6PdaRkQ7ZgtAX6Q/L7kV7wZ8uYRJUoH11VjNipMZw==",
           "dev": true,
           "dependencies": {
             "idb": "^6.1.4",
    -        "workbox-core": "6.5.1"
    +        "workbox-core": "6.5.3"
           }
         },
         "node_modules/workbox-broadcast-update": {
    -      "version": "6.5.1",
    -      "resolved": "https://registry.npmjs.org/workbox-broadcast-update/-/workbox-broadcast-update-6.5.1.tgz",
    -      "integrity": "sha512-mb/oyblyEpDbw167cCTyHnC3RqCnCQHtFYuYZd+QTpuExxM60qZuBH1AuQCgvLtDcztBKdEYK2VFD9SZYgRbaQ==",
    +      "version": "6.5.3",
    +      "resolved": "https://registry.npmjs.org/workbox-broadcast-update/-/workbox-broadcast-update-6.5.3.tgz",
    +      "integrity": "sha512-4AwCIA5DiDrYhlN+Miv/fp5T3/whNmSL+KqhTwRBTZIL6pvTgE4lVuRzAt1JltmqyMcQ3SEfCdfxczuI4kwFQg==",
           "dev": true,
           "dependencies": {
    -        "workbox-core": "6.5.1"
    +        "workbox-core": "6.5.3"
           }
         },
         "node_modules/workbox-build": {
    -      "version": "6.5.1",
    -      "resolved": "https://registry.npmjs.org/workbox-build/-/workbox-build-6.5.1.tgz",
    -      "integrity": "sha512-coDUDzHvFZ1ADOl3wKCsCSyOBvkPKlPgcQDb6LMMShN1zgF31Mev/1HzN3+9T2cjjWAgFwZKkuRyExqc1v21Zw==",
    +      "version": "6.5.3",
    +      "resolved": "https://registry.npmjs.org/workbox-build/-/workbox-build-6.5.3.tgz",
    +      "integrity": "sha512-8JNHHS7u13nhwIYCDea9MNXBNPHXCs5KDZPKI/ZNTr3f4sMGoD7hgFGecbyjX1gw4z6e9bMpMsOEJNyH5htA/w==",
           "dev": true,
           "dependencies": {
             "@apideck/better-ajv-errors": "^0.3.1",
    @@ -16889,30 +17112,30 @@
             "strip-comments": "^2.0.1",
             "tempy": "^0.6.0",
             "upath": "^1.2.0",
    -        "workbox-background-sync": "6.5.1",
    -        "workbox-broadcast-update": "6.5.1",
    -        "workbox-cacheable-response": "6.5.1",
    -        "workbox-core": "6.5.1",
    -        "workbox-expiration": "6.5.1",
    -        "workbox-google-analytics": "6.5.1",
    -        "workbox-navigation-preload": "6.5.1",
    -        "workbox-precaching": "6.5.1",
    -        "workbox-range-requests": "6.5.1",
    -        "workbox-recipes": "6.5.1",
    -        "workbox-routing": "6.5.1",
    -        "workbox-strategies": "6.5.1",
    -        "workbox-streams": "6.5.1",
    -        "workbox-sw": "6.5.1",
    -        "workbox-window": "6.5.1"
    +        "workbox-background-sync": "6.5.3",
    +        "workbox-broadcast-update": "6.5.3",
    +        "workbox-cacheable-response": "6.5.3",
    +        "workbox-core": "6.5.3",
    +        "workbox-expiration": "6.5.3",
    +        "workbox-google-analytics": "6.5.3",
    +        "workbox-navigation-preload": "6.5.3",
    +        "workbox-precaching": "6.5.3",
    +        "workbox-range-requests": "6.5.3",
    +        "workbox-recipes": "6.5.3",
    +        "workbox-routing": "6.5.3",
    +        "workbox-strategies": "6.5.3",
    +        "workbox-streams": "6.5.3",
    +        "workbox-sw": "6.5.3",
    +        "workbox-window": "6.5.3"
           },
           "engines": {
             "node": ">=10.0.0"
           }
         },
         "node_modules/workbox-build/node_modules/@apideck/better-ajv-errors": {
    -      "version": "0.3.3",
    -      "resolved": "https://registry.npmjs.org/@apideck/better-ajv-errors/-/better-ajv-errors-0.3.3.tgz",
    -      "integrity": "sha512-9o+HO2MbJhJHjDYZaDxJmSDckvDpiuItEsrIShV0DXeCshXWRHhqYyU/PKHMkuClOmFnZhRd6wzv4vpDu/dRKg==",
    +      "version": "0.3.4",
    +      "resolved": "https://registry.npmjs.org/@apideck/better-ajv-errors/-/better-ajv-errors-0.3.4.tgz",
    +      "integrity": "sha512-Ic2d8ZT6HJiSikGVQvSklaFyw1OUv4g8sDOxa0PXSlbmN/3gL5IO1WYY9DOwTDqOFmjWoqG1yaaKnPDqYCE9KA==",
           "dev": true,
           "dependencies": {
             "json-schema": "^0.4.0",
    @@ -16927,9 +17150,9 @@
           }
         },
         "node_modules/workbox-build/node_modules/ajv": {
    -      "version": "8.10.0",
    -      "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.10.0.tgz",
    -      "integrity": "sha512-bzqAEZOjkrUMl2afH8dknrq5KEk2SrwdBROR+vH1EKVQTqaUbJVPdc/gEdggTMM0Se+s+Ja4ju4TlNcStKl2Hw==",
    +      "version": "8.11.0",
    +      "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz",
    +      "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==",
           "dev": true,
           "dependencies": {
             "fast-deep-equal": "^3.1.1",
    @@ -16978,7 +17201,7 @@
         "node_modules/workbox-build/node_modules/tr46": {
           "version": "1.0.1",
           "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz",
    -      "integrity": "sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk=",
    +      "integrity": "sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==",
           "dev": true,
           "dependencies": {
             "punycode": "^2.1.0"
    @@ -17002,130 +17225,130 @@
           }
         },
         "node_modules/workbox-cacheable-response": {
    -      "version": "6.5.1",
    -      "resolved": "https://registry.npmjs.org/workbox-cacheable-response/-/workbox-cacheable-response-6.5.1.tgz",
    -      "integrity": "sha512-3TdtH/luDiytmM+Cn72HCBLZXmbeRNJqZx2yaVOfUZhj0IVwZqQXhNarlGE9/k6U5Jelb+TtpH2mLVhnzfiSMg==",
    +      "version": "6.5.3",
    +      "resolved": "https://registry.npmjs.org/workbox-cacheable-response/-/workbox-cacheable-response-6.5.3.tgz",
    +      "integrity": "sha512-6JE/Zm05hNasHzzAGKDkqqgYtZZL2H06ic2GxuRLStA4S/rHUfm2mnLFFXuHAaGR1XuuYyVCEey1M6H3PdZ7SQ==",
           "dev": true,
           "dependencies": {
    -        "workbox-core": "6.5.1"
    +        "workbox-core": "6.5.3"
           }
         },
         "node_modules/workbox-core": {
    -      "version": "6.5.1",
    -      "resolved": "https://registry.npmjs.org/workbox-core/-/workbox-core-6.5.1.tgz",
    -      "integrity": "sha512-qObXZ39aFJ2N8X7IUbGrJHKWguliCuU1jOXM/I4MTT84u9BiKD2rHMkIzgeRP1Ixu9+cXU4/XHJq3Cy0Qqc5hw==",
    +      "version": "6.5.3",
    +      "resolved": "https://registry.npmjs.org/workbox-core/-/workbox-core-6.5.3.tgz",
    +      "integrity": "sha512-Bb9ey5n/M9x+l3fBTlLpHt9ASTzgSGj6vxni7pY72ilB/Pb3XtN+cZ9yueboVhD5+9cNQrC9n/E1fSrqWsUz7Q==",
           "dev": true
         },
         "node_modules/workbox-expiration": {
    -      "version": "6.5.1",
    -      "resolved": "https://registry.npmjs.org/workbox-expiration/-/workbox-expiration-6.5.1.tgz",
    -      "integrity": "sha512-iY/cTADAQATMmPkUBRmQdacqq0TJd2wMHimBQz+tRnPGHSMH+/BoLPABPnu7O7rT/g/s59CUYYRGxe3mEgoJCA==",
    +      "version": "6.5.3",
    +      "resolved": "https://registry.npmjs.org/workbox-expiration/-/workbox-expiration-6.5.3.tgz",
    +      "integrity": "sha512-jzYopYR1zD04ZMdlbn/R2Ik6ixiXbi15c9iX5H8CTi6RPDz7uhvMLZPKEndZTpfgmUk8mdmT9Vx/AhbuCl5Sqw==",
           "dev": true,
           "dependencies": {
             "idb": "^6.1.4",
    -        "workbox-core": "6.5.1"
    +        "workbox-core": "6.5.3"
           }
         },
         "node_modules/workbox-google-analytics": {
    -      "version": "6.5.1",
    -      "resolved": "https://registry.npmjs.org/workbox-google-analytics/-/workbox-google-analytics-6.5.1.tgz",
    -      "integrity": "sha512-qZU46/h4dbionYT6Yk6iBkUwpiEzAfnO1W7KkI+AMmY7G9/gA03dQQ7rpTw8F4vWrG7ahTUGWDFv6fERtaw1BQ==",
    +      "version": "6.5.3",
    +      "resolved": "https://registry.npmjs.org/workbox-google-analytics/-/workbox-google-analytics-6.5.3.tgz",
    +      "integrity": "sha512-3GLCHotz5umoRSb4aNQeTbILETcrTVEozSfLhHSBaegHs1PnqCmN0zbIy2TjTpph2AGXiNwDrWGF0AN+UgDNTw==",
           "dev": true,
           "dependencies": {
    -        "workbox-background-sync": "6.5.1",
    -        "workbox-core": "6.5.1",
    -        "workbox-routing": "6.5.1",
    -        "workbox-strategies": "6.5.1"
    +        "workbox-background-sync": "6.5.3",
    +        "workbox-core": "6.5.3",
    +        "workbox-routing": "6.5.3",
    +        "workbox-strategies": "6.5.3"
           }
         },
         "node_modules/workbox-navigation-preload": {
    -      "version": "6.5.1",
    -      "resolved": "https://registry.npmjs.org/workbox-navigation-preload/-/workbox-navigation-preload-6.5.1.tgz",
    -      "integrity": "sha512-aKrgAbn2IMgzTowTi/ZyKdQUcES2m++9aGtpxqsX7Gn9ovCY8zcssaMEAMMwrIeveij5HiWNBrmj6MWDHi+0rg==",
    +      "version": "6.5.3",
    +      "resolved": "https://registry.npmjs.org/workbox-navigation-preload/-/workbox-navigation-preload-6.5.3.tgz",
    +      "integrity": "sha512-bK1gDFTc5iu6lH3UQ07QVo+0ovErhRNGvJJO/1ngknT0UQ702nmOUhoN9qE5mhuQSrnK+cqu7O7xeaJ+Rd9Tmg==",
           "dev": true,
           "dependencies": {
    -        "workbox-core": "6.5.1"
    +        "workbox-core": "6.5.3"
           }
         },
         "node_modules/workbox-precaching": {
    -      "version": "6.5.1",
    -      "resolved": "https://registry.npmjs.org/workbox-precaching/-/workbox-precaching-6.5.1.tgz",
    -      "integrity": "sha512-EzlPBxvmjGfE56YZzsT/vpVkpLG1XJhoplgXa5RPyVWLUL1LbwEAxhkrENElSS/R9tgiTw80IFwysidfUqLihg==",
    +      "version": "6.5.3",
    +      "resolved": "https://registry.npmjs.org/workbox-precaching/-/workbox-precaching-6.5.3.tgz",
    +      "integrity": "sha512-sjNfgNLSsRX5zcc63H/ar/hCf+T19fRtTqvWh795gdpghWb5xsfEkecXEvZ8biEi1QD7X/ljtHphdaPvXDygMQ==",
           "dev": true,
           "dependencies": {
    -        "workbox-core": "6.5.1",
    -        "workbox-routing": "6.5.1",
    -        "workbox-strategies": "6.5.1"
    +        "workbox-core": "6.5.3",
    +        "workbox-routing": "6.5.3",
    +        "workbox-strategies": "6.5.3"
           }
         },
         "node_modules/workbox-range-requests": {
    -      "version": "6.5.1",
    -      "resolved": "https://registry.npmjs.org/workbox-range-requests/-/workbox-range-requests-6.5.1.tgz",
    -      "integrity": "sha512-57Da/qRbd9v33YlHX0rlSUVFmE4THCjKqwkmfhY3tNLnSKN2L5YBS3qhWeDO0IrMNgUj+rGve2moKYXeUqQt4A==",
    +      "version": "6.5.3",
    +      "resolved": "https://registry.npmjs.org/workbox-range-requests/-/workbox-range-requests-6.5.3.tgz",
    +      "integrity": "sha512-pGCP80Bpn/0Q0MQsfETSfmtXsQcu3M2QCJwSFuJ6cDp8s2XmbUXkzbuQhCUzKR86ZH2Vex/VUjb2UaZBGamijA==",
           "dev": true,
           "dependencies": {
    -        "workbox-core": "6.5.1"
    +        "workbox-core": "6.5.3"
           }
         },
         "node_modules/workbox-recipes": {
    -      "version": "6.5.1",
    -      "resolved": "https://registry.npmjs.org/workbox-recipes/-/workbox-recipes-6.5.1.tgz",
    -      "integrity": "sha512-DGsyKygHggcGPQpWafC/Nmbm1Ny3sB2vE9r//3UbeidXiQ+pLF14KEG1/0NNGRaY+lfOXOagq6d1H7SC8KA+rA==",
    +      "version": "6.5.3",
    +      "resolved": "https://registry.npmjs.org/workbox-recipes/-/workbox-recipes-6.5.3.tgz",
    +      "integrity": "sha512-IcgiKYmbGiDvvf3PMSEtmwqxwfQ5zwI7OZPio3GWu4PfehA8jI8JHI3KZj+PCfRiUPZhjQHJ3v1HbNs+SiSkig==",
           "dev": true,
           "dependencies": {
    -        "workbox-cacheable-response": "6.5.1",
    -        "workbox-core": "6.5.1",
    -        "workbox-expiration": "6.5.1",
    -        "workbox-precaching": "6.5.1",
    -        "workbox-routing": "6.5.1",
    -        "workbox-strategies": "6.5.1"
    +        "workbox-cacheable-response": "6.5.3",
    +        "workbox-core": "6.5.3",
    +        "workbox-expiration": "6.5.3",
    +        "workbox-precaching": "6.5.3",
    +        "workbox-routing": "6.5.3",
    +        "workbox-strategies": "6.5.3"
           }
         },
         "node_modules/workbox-routing": {
    -      "version": "6.5.1",
    -      "resolved": "https://registry.npmjs.org/workbox-routing/-/workbox-routing-6.5.1.tgz",
    -      "integrity": "sha512-yAAncdTwanvlR8KPjubyvFKeAok8ZcIws6UKxvIAg0I+wsf7UYi93DXNuZr6RBSQrByrN6HkCyjuhmk8P63+PA==",
    +      "version": "6.5.3",
    +      "resolved": "https://registry.npmjs.org/workbox-routing/-/workbox-routing-6.5.3.tgz",
    +      "integrity": "sha512-DFjxcuRAJjjt4T34RbMm3MCn+xnd36UT/2RfPRfa8VWJGItGJIn7tG+GwVTdHmvE54i/QmVTJepyAGWtoLPTmg==",
           "dev": true,
           "dependencies": {
    -        "workbox-core": "6.5.1"
    +        "workbox-core": "6.5.3"
           }
         },
         "node_modules/workbox-strategies": {
    -      "version": "6.5.1",
    -      "resolved": "https://registry.npmjs.org/workbox-strategies/-/workbox-strategies-6.5.1.tgz",
    -      "integrity": "sha512-JNaTXPy8wXzKkr+6za7/eJX9opoZk7UgY261I2kPxl80XQD8lMjz0vo9EOcBwvD72v3ZhGJbW84ZaDwFEhFvWA==",
    +      "version": "6.5.3",
    +      "resolved": "https://registry.npmjs.org/workbox-strategies/-/workbox-strategies-6.5.3.tgz",
    +      "integrity": "sha512-MgmGRrDVXs7rtSCcetZgkSZyMpRGw8HqL2aguszOc3nUmzGZsT238z/NN9ZouCxSzDu3PQ3ZSKmovAacaIhu1w==",
           "dev": true,
           "dependencies": {
    -        "workbox-core": "6.5.1"
    +        "workbox-core": "6.5.3"
           }
         },
         "node_modules/workbox-streams": {
    -      "version": "6.5.1",
    -      "resolved": "https://registry.npmjs.org/workbox-streams/-/workbox-streams-6.5.1.tgz",
    -      "integrity": "sha512-7jaTWm6HRGJ/ewECnhb+UgjTT50R42E0/uNCC4eTKQwnLO/NzNGjoXTdQgFjo4zteR+L/K6AtFAiYKH3ZJbAYw==",
    +      "version": "6.5.3",
    +      "resolved": "https://registry.npmjs.org/workbox-streams/-/workbox-streams-6.5.3.tgz",
    +      "integrity": "sha512-vN4Qi8o+b7zj1FDVNZ+PlmAcy1sBoV7SC956uhqYvZ9Sg1fViSbOpydULOssVJ4tOyKRifH/eoi6h99d+sJ33w==",
           "dev": true,
           "dependencies": {
    -        "workbox-core": "6.5.1",
    -        "workbox-routing": "6.5.1"
    +        "workbox-core": "6.5.3",
    +        "workbox-routing": "6.5.3"
           }
         },
         "node_modules/workbox-sw": {
    -      "version": "6.5.1",
    -      "resolved": "https://registry.npmjs.org/workbox-sw/-/workbox-sw-6.5.1.tgz",
    -      "integrity": "sha512-hVrQa19yo9wzN1fQQ/h2JlkzFpkuH2qzYT2/rk7CLaWt6tLnTJVFCNHlGRRPhytZSf++LoIy7zThT714sowT/Q==",
    +      "version": "6.5.3",
    +      "resolved": "https://registry.npmjs.org/workbox-sw/-/workbox-sw-6.5.3.tgz",
    +      "integrity": "sha512-BQBzm092w+NqdIEF2yhl32dERt9j9MDGUTa2Eaa+o3YKL4Qqw55W9yQC6f44FdAHdAJrJvp0t+HVrfh8AiGj8A==",
           "dev": true
         },
         "node_modules/workbox-webpack-plugin": {
    -      "version": "6.5.1",
    -      "resolved": "https://registry.npmjs.org/workbox-webpack-plugin/-/workbox-webpack-plugin-6.5.1.tgz",
    -      "integrity": "sha512-SHtlQBpKruI16CAYhICDMkgjXE2fH5Yp+D+1UmBfRVhByZYzusVOykvnPm8ObJb9d/tXgn9yoppoxafFS7D4vQ==",
    +      "version": "6.5.3",
    +      "resolved": "https://registry.npmjs.org/workbox-webpack-plugin/-/workbox-webpack-plugin-6.5.3.tgz",
    +      "integrity": "sha512-Es8Xr02Gi6Kc3zaUwR691ZLy61hz3vhhs5GztcklQ7kl5k2qAusPh0s6LF3wEtlpfs9ZDErnmy5SErwoll7jBA==",
           "dev": true,
           "dependencies": {
             "fast-json-stable-stringify": "^2.1.0",
             "pretty-bytes": "^5.4.1",
             "upath": "^1.2.0",
             "webpack-sources": "^1.4.3",
    -        "workbox-build": "6.5.1"
    +        "workbox-build": "6.5.3"
           },
           "engines": {
             "node": ">=10.0.0"
    @@ -17134,15 +17357,6 @@
             "webpack": "^4.4.0 || ^5.9.0"
           }
         },
    -    "node_modules/workbox-webpack-plugin/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/workbox-webpack-plugin/node_modules/webpack-sources": {
           "version": "1.4.3",
           "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz",
    @@ -17154,13 +17368,13 @@
           }
         },
         "node_modules/workbox-window": {
    -      "version": "6.5.1",
    -      "resolved": "https://registry.npmjs.org/workbox-window/-/workbox-window-6.5.1.tgz",
    -      "integrity": "sha512-oRlun9u7b7YEjo2fIDBqJkU2hXtrEljXcOytRhfeQRbqXxjUOpFgXSGRSAkmDx1MlKUNOSbr+zfi8h5n7In3yA==",
    +      "version": "6.5.3",
    +      "resolved": "https://registry.npmjs.org/workbox-window/-/workbox-window-6.5.3.tgz",
    +      "integrity": "sha512-GnJbx1kcKXDtoJBVZs/P7ddP0Yt52NNy4nocjBpYPiRhMqTpJCNrSL+fGHZ/i/oP6p/vhE8II0sA6AZGKGnssw==",
           "dev": true,
           "dependencies": {
             "@types/trusted-types": "^2.0.2",
    -        "workbox-core": "6.5.1"
    +        "workbox-core": "6.5.3"
           }
         },
         "node_modules/wrap-ansi": {
    @@ -17183,7 +17397,7 @@
         "node_modules/wrappy": {
           "version": "1.0.2",
           "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
    -      "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
    +      "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==",
           "dev": true
         },
         "node_modules/write-file-atomic": {
    @@ -17199,9 +17413,9 @@
           }
         },
         "node_modules/ws": {
    -      "version": "7.5.7",
    -      "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.7.tgz",
    -      "integrity": "sha512-KMvVuFzpKBuiIXW3E4u3mySRO2/mCHSyZDJQM5NQ9Q9KHWHWh0NHgfbRMLLrceUK5qAL4ytALJbpRMjixFZh8A==",
    +      "version": "7.5.8",
    +      "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.8.tgz",
    +      "integrity": "sha512-ri1Id1WinAX5Jqn9HejiGb8crfRio0Qgu8+MtL36rlTA6RLsMdWt1Az/19A2Qij6uSHUMphEFaTKa4WG+UNHNw==",
           "dev": true,
           "engines": {
             "node": ">=8.3.0"
    @@ -17290,17 +17504,6 @@
             "node": ">=10"
           }
         },
    -    "node_modules/yn": {
    -      "version": "3.1.1",
    -      "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz",
    -      "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==",
    -      "dev": true,
    -      "optional": true,
    -      "peer": true,
    -      "engines": {
    -        "node": ">=6"
    -      }
    -    },
         "node_modules/yocto-queue": {
           "version": "0.1.0",
           "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
    @@ -17317,22 +17520,20 @@
           "name": "@prometheus-io/app",
           "version": "0.1.0",
           "dependencies": {
    -        "@codemirror/autocomplete": "^0.19.9",
    -        "@codemirror/closebrackets": "^0.19.0",
    -        "@codemirror/commands": "^0.19.5",
    -        "@codemirror/comment": "^0.19.0",
    -        "@codemirror/highlight": "^0.19.6",
    -        "@codemirror/history": "^0.19.2",
    -        "@codemirror/language": "^0.19.7",
    -        "@codemirror/lint": "^0.19.3",
    -        "@codemirror/matchbrackets": "^0.19.3",
    -        "@codemirror/search": "^0.19.3",
    -        "@codemirror/state": "^0.19.6",
    -        "@codemirror/view": "^0.19.27",
    +        "@codemirror/autocomplete": "^6.0.0",
    +        "@codemirror/commands": "^6.0.0",
    +        "@codemirror/language": "^6.0.0",
    +        "@codemirror/lint": "^6.0.0",
    +        "@codemirror/search": "^6.0.0",
    +        "@codemirror/state": "^6.0.0",
    +        "@codemirror/view": "^6.0.0",
             "@forevolve/bootstrap-dark": "^1.0.0",
             "@fortawesome/fontawesome-svg-core": "6.1.1",
             "@fortawesome/free-solid-svg-icons": "6.1.1",
             "@fortawesome/react-fontawesome": "0.1.17",
    +        "@lezer/common": "^1.0.0",
    +        "@lezer/highlight": "^1.0.0",
    +        "@lezer/lr": "^1.0.0",
             "@nexucis/fuzzy": "^0.4.0",
             "@nexucis/kvsearch": "^0.7.0",
             "@prometheus-io/codemirror-promql": "0.19.0",
    @@ -17383,12 +17584,13 @@
       },
       "dependencies": {
         "@ampproject/remapping": {
    -      "version": "2.1.2",
    -      "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.1.2.tgz",
    -      "integrity": "sha512-hoyByceqwKirw7w3Z7gnIIZC3Wx3J484Y3L/cMpXFbr7d9ZQj2mODrirNzcJa+SM3UlpWXYvKV4RlRpFXlWgXg==",
    +      "version": "2.2.0",
    +      "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz",
    +      "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==",
           "dev": true,
           "requires": {
    -        "@jridgewell/trace-mapping": "^0.3.0"
    +        "@jridgewell/gen-mapping": "^0.1.0",
    +        "@jridgewell/trace-mapping": "^0.3.9"
           }
         },
         "@babel/code-frame": {
    @@ -17401,38 +17603,38 @@
           }
         },
         "@babel/compat-data": {
    -      "version": "7.17.7",
    -      "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.17.7.tgz",
    -      "integrity": "sha512-p8pdE6j0a29TNGebNm7NzYZWB3xVZJBZ7XGs42uAKzQo8VQ3F0By/cQCtUEABwIqw5zo6WA4NbmxsfzADzMKnQ==",
    +      "version": "7.18.5",
    +      "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.18.5.tgz",
    +      "integrity": "sha512-BxhE40PVCBxVEJsSBhB6UWyAuqJRxGsAw8BdHMJ3AKGydcwuWW4kOO3HmqBQAdcq/OP+/DlTVxLvsCzRTnZuGg==",
           "dev": true
         },
         "@babel/core": {
    -      "version": "7.17.8",
    -      "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.17.8.tgz",
    -      "integrity": "sha512-OdQDV/7cRBtJHLSOBqqbYNkOcydOgnX59TZx4puf41fzcVtN3e/4yqY8lMQsK+5X2lJtAdmA+6OHqsj1hBJ4IQ==",
    +      "version": "7.18.5",
    +      "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.18.5.tgz",
    +      "integrity": "sha512-MGY8vg3DxMnctw0LdvSEojOsumc70g0t18gNyUdAZqB1Rpd1Bqo/svHGvt+UJ6JcGX+DIekGFDxxIWofBxLCnQ==",
           "dev": true,
           "requires": {
             "@ampproject/remapping": "^2.1.0",
             "@babel/code-frame": "^7.16.7",
    -        "@babel/generator": "^7.17.7",
    -        "@babel/helper-compilation-targets": "^7.17.7",
    -        "@babel/helper-module-transforms": "^7.17.7",
    -        "@babel/helpers": "^7.17.8",
    -        "@babel/parser": "^7.17.8",
    +        "@babel/generator": "^7.18.2",
    +        "@babel/helper-compilation-targets": "^7.18.2",
    +        "@babel/helper-module-transforms": "^7.18.0",
    +        "@babel/helpers": "^7.18.2",
    +        "@babel/parser": "^7.18.5",
             "@babel/template": "^7.16.7",
    -        "@babel/traverse": "^7.17.3",
    -        "@babel/types": "^7.17.0",
    +        "@babel/traverse": "^7.18.5",
    +        "@babel/types": "^7.18.4",
             "convert-source-map": "^1.7.0",
             "debug": "^4.1.0",
             "gensync": "^1.0.0-beta.2",
    -        "json5": "^2.1.2",
    +        "json5": "^2.2.1",
             "semver": "^6.3.0"
           }
         },
         "@babel/eslint-parser": {
    -      "version": "7.17.0",
    -      "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.17.0.tgz",
    -      "integrity": "sha512-PUEJ7ZBXbRkbq3qqM/jZ2nIuakUBqCYc7Qf52Lj7dlZ6zERnqisdHioL0l4wwQZnmskMeasqUNzLBFKs3nylXA==",
    +      "version": "7.18.2",
    +      "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.18.2.tgz",
    +      "integrity": "sha512-oFQYkE8SuH14+uR51JVAmdqwKYXGRjEXx7s+WiagVjqQ+HPE+nnwyF2qlVG8evUsUHmPcA+6YXMEDbIhEyQc5A==",
           "dev": true,
           "requires": {
             "eslint-scope": "^5.1.1",
    @@ -17465,14 +17667,27 @@
           }
         },
         "@babel/generator": {
    -      "version": "7.17.7",
    -      "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.17.7.tgz",
    -      "integrity": "sha512-oLcVCTeIFadUoArDTwpluncplrYBmTCCZZgXCbgNGvOBBiSDDK3eWO4b/+eOTli5tKv1lg+a5/NAXg+nTcei1w==",
    +      "version": "7.18.2",
    +      "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.18.2.tgz",
    +      "integrity": "sha512-W1lG5vUwFvfMd8HVXqdfbuG7RuaSrTCCD8cl8fP8wOivdbtbIg2Db3IWUcgvfxKbbn6ZBGYRW/Zk1MIwK49mgw==",
           "dev": true,
           "requires": {
    -        "@babel/types": "^7.17.0",
    -        "jsesc": "^2.5.1",
    -        "source-map": "^0.5.0"
    +        "@babel/types": "^7.18.2",
    +        "@jridgewell/gen-mapping": "^0.3.0",
    +        "jsesc": "^2.5.1"
    +      },
    +      "dependencies": {
    +        "@jridgewell/gen-mapping": {
    +          "version": "0.3.1",
    +          "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.1.tgz",
    +          "integrity": "sha512-GcHwniMlA2z+WFPWuY8lp3fsza0I8xPFMWL5+n8LYyP6PSvPrXf4+n8stDHZY2DM0zy9sVkRDy1jDI4XGzYVqg==",
    +          "dev": true,
    +          "requires": {
    +            "@jridgewell/set-array": "^1.0.0",
    +            "@jridgewell/sourcemap-codec": "^1.4.10",
    +            "@jridgewell/trace-mapping": "^0.3.9"
    +          }
    +        }
           }
         },
         "@babel/helper-annotate-as-pure": {
    @@ -17495,36 +17710,36 @@
           }
         },
         "@babel/helper-compilation-targets": {
    -      "version": "7.17.7",
    -      "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.17.7.tgz",
    -      "integrity": "sha512-UFzlz2jjd8kroj0hmCFV5zr+tQPi1dpC2cRsDV/3IEW8bJfCPrPpmcSN6ZS8RqIq4LXcmpipCQFPddyFA5Yc7w==",
    +      "version": "7.18.2",
    +      "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.18.2.tgz",
    +      "integrity": "sha512-s1jnPotJS9uQnzFtiZVBUxe67CuBa679oWFHpxYYnTpRL/1ffhyX44R9uYiXoa/pLXcY9H2moJta0iaanlk/rQ==",
           "dev": true,
           "requires": {
    -        "@babel/compat-data": "^7.17.7",
    +        "@babel/compat-data": "^7.17.10",
             "@babel/helper-validator-option": "^7.16.7",
    -        "browserslist": "^4.17.5",
    +        "browserslist": "^4.20.2",
             "semver": "^6.3.0"
           }
         },
         "@babel/helper-create-class-features-plugin": {
    -      "version": "7.17.6",
    -      "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.17.6.tgz",
    -      "integrity": "sha512-SogLLSxXm2OkBbSsHZMM4tUi8fUzjs63AT/d0YQIzr6GSd8Hxsbk2KYDX0k0DweAzGMj/YWeiCsorIdtdcW8Eg==",
    +      "version": "7.18.0",
    +      "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.18.0.tgz",
    +      "integrity": "sha512-Kh8zTGR9de3J63e5nS0rQUdRs/kbtwoeQQ0sriS0lItjC96u8XXZN6lKpuyWd2coKSU13py/y+LTmThLuVX0Pg==",
           "dev": true,
           "requires": {
             "@babel/helper-annotate-as-pure": "^7.16.7",
             "@babel/helper-environment-visitor": "^7.16.7",
    -        "@babel/helper-function-name": "^7.16.7",
    -        "@babel/helper-member-expression-to-functions": "^7.16.7",
    +        "@babel/helper-function-name": "^7.17.9",
    +        "@babel/helper-member-expression-to-functions": "^7.17.7",
             "@babel/helper-optimise-call-expression": "^7.16.7",
             "@babel/helper-replace-supers": "^7.16.7",
             "@babel/helper-split-export-declaration": "^7.16.7"
           }
         },
         "@babel/helper-create-regexp-features-plugin": {
    -      "version": "7.17.0",
    -      "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.17.0.tgz",
    -      "integrity": "sha512-awO2So99wG6KnlE+TPs6rn83gCz5WlEePJDTnLEqbchMVrBeAujURVphRdigsk094VhvZehFoNOihSlcBjwsXA==",
    +      "version": "7.17.12",
    +      "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.17.12.tgz",
    +      "integrity": "sha512-b2aZrV4zvutr9AIa6/gA3wsZKRwTKYoDxYiFKcESS3Ug2GTXzwBEvMuuFLhCQpEnRXs1zng4ISAXSUxxKBIcxw==",
           "dev": true,
           "requires": {
             "@babel/helper-annotate-as-pure": "^7.16.7",
    @@ -17548,13 +17763,10 @@
           }
         },
         "@babel/helper-environment-visitor": {
    -      "version": "7.16.7",
    -      "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.16.7.tgz",
    -      "integrity": "sha512-SLLb0AAn6PkUeAfKJCCOl9e1R53pQlGAfc4y4XuMRZfqeMYLE0dM1LMhqbGAlGQY0lfw5/ohoYWAe9V1yibRag==",
    -      "dev": true,
    -      "requires": {
    -        "@babel/types": "^7.16.7"
    -      }
    +      "version": "7.18.2",
    +      "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.2.tgz",
    +      "integrity": "sha512-14GQKWkX9oJzPiQQ7/J36FTXcD4kSp8egKjO9nINlSKiHITRA9q/R74qu8S9xlc/b/yjsJItQUeeh3xnGN0voQ==",
    +      "dev": true
         },
         "@babel/helper-explode-assignable-expression": {
           "version": "7.16.7",
    @@ -17566,23 +17778,13 @@
           }
         },
         "@babel/helper-function-name": {
    -      "version": "7.16.7",
    -      "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.16.7.tgz",
    -      "integrity": "sha512-QfDfEnIUyyBSR3HtrtGECuZ6DAyCkYFp7GHl75vFtTnn6pjKeK0T1DB5lLkFvBea8MdaiUABx3osbgLyInoejA==",
    +      "version": "7.17.9",
    +      "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.17.9.tgz",
    +      "integrity": "sha512-7cRisGlVtiVqZ0MW0/yFB4atgpGLWEHUVYnb448hZK4x+vih0YO5UoS11XIYtZYqHd0dIPMdUSv8q5K4LdMnIg==",
           "dev": true,
           "requires": {
    -        "@babel/helper-get-function-arity": "^7.16.7",
             "@babel/template": "^7.16.7",
    -        "@babel/types": "^7.16.7"
    -      }
    -    },
    -    "@babel/helper-get-function-arity": {
    -      "version": "7.16.7",
    -      "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.16.7.tgz",
    -      "integrity": "sha512-flc+RLSOBXzNzVhcLu6ujeHUrD6tANAOU5ojrRx/as+tbzf8+stUCj7+IfRRoAbEZqj/ahXEMsjhOhgeZsrnTw==",
    -      "dev": true,
    -      "requires": {
    -        "@babel/types": "^7.16.7"
    +        "@babel/types": "^7.17.0"
           }
         },
         "@babel/helper-hoist-variables": {
    @@ -17613,9 +17815,9 @@
           }
         },
         "@babel/helper-module-transforms": {
    -      "version": "7.17.7",
    -      "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.17.7.tgz",
    -      "integrity": "sha512-VmZD99F3gNTYB7fJRDTi+u6l/zxY0BE6OIxPSU7a50s6ZUQkHwSDmV92FfM+oCG0pZRVojGYhkR8I0OGeCVREw==",
    +      "version": "7.18.0",
    +      "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.18.0.tgz",
    +      "integrity": "sha512-kclUYSUBIjlvnzN2++K9f2qzYKFgjmnmjwL4zlmU5f8ZtzgWe8s0rUPSTGy2HmK4P8T52MQsS+HTQAgZd3dMEA==",
           "dev": true,
           "requires": {
             "@babel/helper-environment-visitor": "^7.16.7",
    @@ -17624,8 +17826,8 @@
             "@babel/helper-split-export-declaration": "^7.16.7",
             "@babel/helper-validator-identifier": "^7.16.7",
             "@babel/template": "^7.16.7",
    -        "@babel/traverse": "^7.17.3",
    -        "@babel/types": "^7.17.0"
    +        "@babel/traverse": "^7.18.0",
    +        "@babel/types": "^7.18.0"
           }
         },
         "@babel/helper-optimise-call-expression": {
    @@ -17638,9 +17840,9 @@
           }
         },
         "@babel/helper-plugin-utils": {
    -      "version": "7.16.7",
    -      "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz",
    -      "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==",
    +      "version": "7.17.12",
    +      "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.17.12.tgz",
    +      "integrity": "sha512-JDkf04mqtN3y4iAbO1hv9U2ARpPyPL1zqyWs/2WG1pgSq9llHFjStX5jdxb84himgJm+8Ng+x0oiWF/nw/XQKA==",
           "dev": true
         },
         "@babel/helper-remap-async-to-generator": {
    @@ -17655,25 +17857,25 @@
           }
         },
         "@babel/helper-replace-supers": {
    -      "version": "7.16.7",
    -      "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.16.7.tgz",
    -      "integrity": "sha512-y9vsWilTNaVnVh6xiJfABzsNpgDPKev9HnAgz6Gb1p6UUwf9NepdlsV7VXGCftJM+jqD5f7JIEubcpLjZj5dBw==",
    +      "version": "7.18.2",
    +      "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.18.2.tgz",
    +      "integrity": "sha512-XzAIyxx+vFnrOxiQrToSUOzUOn0e1J2Li40ntddek1Y69AXUTXoDJ40/D5RdjFu7s7qHiaeoTiempZcbuVXh2Q==",
           "dev": true,
           "requires": {
    -        "@babel/helper-environment-visitor": "^7.16.7",
    -        "@babel/helper-member-expression-to-functions": "^7.16.7",
    +        "@babel/helper-environment-visitor": "^7.18.2",
    +        "@babel/helper-member-expression-to-functions": "^7.17.7",
             "@babel/helper-optimise-call-expression": "^7.16.7",
    -        "@babel/traverse": "^7.16.7",
    -        "@babel/types": "^7.16.7"
    +        "@babel/traverse": "^7.18.2",
    +        "@babel/types": "^7.18.2"
           }
         },
         "@babel/helper-simple-access": {
    -      "version": "7.17.7",
    -      "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.17.7.tgz",
    -      "integrity": "sha512-txyMCGroZ96i+Pxr3Je3lzEJjqwaRC9buMUgtomcrLe5Nd0+fk1h0LLA+ixUF5OW7AhHuQ7Es1WcQJZmZsz2XA==",
    +      "version": "7.18.2",
    +      "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.18.2.tgz",
    +      "integrity": "sha512-7LIrjYzndorDY88MycupkpQLKS1AFfsVRm2k/9PtKScSy5tZq0McZTj+DiMRynboZfIqOKvo03pmhTaUgiD6fQ==",
           "dev": true,
           "requires": {
    -        "@babel/types": "^7.17.0"
    +        "@babel/types": "^7.18.2"
           }
         },
         "@babel/helper-skip-transparent-expression-wrappers": {
    @@ -17719,20 +17921,20 @@
           }
         },
         "@babel/helpers": {
    -      "version": "7.17.8",
    -      "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.17.8.tgz",
    -      "integrity": "sha512-QcL86FGxpfSJwGtAvv4iG93UL6bmqBdmoVY0CMCU2g+oD2ezQse3PT5Pa+jiD6LJndBQi0EDlpzOWNlLuhz5gw==",
    +      "version": "7.18.2",
    +      "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.18.2.tgz",
    +      "integrity": "sha512-j+d+u5xT5utcQSzrh9p+PaJX94h++KN+ng9b9WEJq7pkUPAd61FGqhjuUEdfknb3E/uDBb7ruwEeKkIxNJPIrg==",
           "dev": true,
           "requires": {
             "@babel/template": "^7.16.7",
    -        "@babel/traverse": "^7.17.3",
    -        "@babel/types": "^7.17.0"
    +        "@babel/traverse": "^7.18.2",
    +        "@babel/types": "^7.18.2"
           }
         },
         "@babel/highlight": {
    -      "version": "7.16.10",
    -      "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.10.tgz",
    -      "integrity": "sha512-5FnTQLSLswEj6IkgVw5KusNUUFY9ZGqe/TRFnP/BKYHYgfh7tc+C7mwiy95/yNP7Dh9x580Vv8r7u7ZfTBFxdw==",
    +      "version": "7.17.12",
    +      "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.17.12.tgz",
    +      "integrity": "sha512-7yykMVF3hfZY2jsHZEEgLc+3x4o1O+fYyULu11GynEUQNwB6lua+IIQn1FiJxNucd5UlyJryrwsOh8PL9Sn8Qg==",
           "dev": true,
           "requires": {
             "@babel/helper-validator-identifier": "^7.16.7",
    @@ -17772,19 +17974,19 @@
             "color-name": {
               "version": "1.1.3",
               "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
    -          "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
    +          "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==",
               "dev": true
             },
             "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=",
    +          "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
               "dev": true
             },
             "has-flag": {
               "version": "3.0.0",
               "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
    -          "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
    +          "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==",
               "dev": true
             },
             "supports-color": {
    @@ -17799,73 +18001,74 @@
           }
         },
         "@babel/parser": {
    -      "version": "7.17.8",
    -      "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.17.8.tgz",
    -      "integrity": "sha512-BoHhDJrJXqcg+ZL16Xv39H9n+AqJ4pcDrQBGZN+wHxIysrLZ3/ECwCBUch/1zUNhnsXULcONU3Ei5Hmkfk6kiQ==",
    +      "version": "7.18.5",
    +      "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.18.5.tgz",
    +      "integrity": "sha512-YZWVaglMiplo7v8f1oMQ5ZPQr0vn7HPeZXxXWsxXJRjGVrzUFn9OxFQl1sb5wzfootjA/yChhW84BV+383FSOw==",
           "dev": true
         },
         "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": {
    -      "version": "7.16.7",
    -      "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.16.7.tgz",
    -      "integrity": "sha512-anv/DObl7waiGEnC24O9zqL0pSuI9hljihqiDuFHC8d7/bjr/4RLGPWuc8rYOff/QPzbEPSkzG8wGG9aDuhHRg==",
    +      "version": "7.17.12",
    +      "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.17.12.tgz",
    +      "integrity": "sha512-xCJQXl4EeQ3J9C4yOmpTrtVGmzpm2iSzyxbkZHw7UCnZBftHpF/hpII80uWVyVrc40ytIClHjgWGTG1g/yB+aw==",
           "dev": true,
           "requires": {
    -        "@babel/helper-plugin-utils": "^7.16.7"
    +        "@babel/helper-plugin-utils": "^7.17.12"
           }
         },
         "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": {
    -      "version": "7.16.7",
    -      "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.16.7.tgz",
    -      "integrity": "sha512-di8vUHRdf+4aJ7ltXhaDbPoszdkh59AQtJM5soLsuHpQJdFQZOA4uGj0V2u/CZ8bJ/u8ULDL5yq6FO/bCXnKHw==",
    +      "version": "7.17.12",
    +      "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.17.12.tgz",
    +      "integrity": "sha512-/vt0hpIw0x4b6BLKUkwlvEoiGZYYLNZ96CzyHYPbtG2jZGz6LBe7/V+drYrc/d+ovrF9NBi0pmtvmNb/FsWtRQ==",
           "dev": true,
           "requires": {
    -        "@babel/helper-plugin-utils": "^7.16.7",
    +        "@babel/helper-plugin-utils": "^7.17.12",
             "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0",
    -        "@babel/plugin-proposal-optional-chaining": "^7.16.7"
    +        "@babel/plugin-proposal-optional-chaining": "^7.17.12"
           }
         },
         "@babel/plugin-proposal-async-generator-functions": {
    -      "version": "7.16.8",
    -      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.16.8.tgz",
    -      "integrity": "sha512-71YHIvMuiuqWJQkebWJtdhQTfd4Q4mF76q2IX37uZPkG9+olBxsX+rH1vkhFto4UeJZ9dPY2s+mDvhDm1u2BGQ==",
    +      "version": "7.17.12",
    +      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.17.12.tgz",
    +      "integrity": "sha512-RWVvqD1ooLKP6IqWTA5GyFVX2isGEgC5iFxKzfYOIy/QEFdxYyCybBDtIGjipHpb9bDWHzcqGqFakf+mVmBTdQ==",
           "dev": true,
           "requires": {
    -        "@babel/helper-plugin-utils": "^7.16.7",
    +        "@babel/helper-plugin-utils": "^7.17.12",
             "@babel/helper-remap-async-to-generator": "^7.16.8",
             "@babel/plugin-syntax-async-generators": "^7.8.4"
           }
         },
         "@babel/plugin-proposal-class-properties": {
    -      "version": "7.16.7",
    -      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.16.7.tgz",
    -      "integrity": "sha512-IobU0Xme31ewjYOShSIqd/ZGM/r/cuOz2z0MDbNrhF5FW+ZVgi0f2lyeoj9KFPDOAqsYxmLWZte1WOwlvY9aww==",
    +      "version": "7.17.12",
    +      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.17.12.tgz",
    +      "integrity": "sha512-U0mI9q8pW5Q9EaTHFPwSVusPMV/DV9Mm8p7csqROFLtIE9rBF5piLqyrBGigftALrBcsBGu4m38JneAe7ZDLXw==",
           "dev": true,
           "requires": {
    -        "@babel/helper-create-class-features-plugin": "^7.16.7",
    -        "@babel/helper-plugin-utils": "^7.16.7"
    +        "@babel/helper-create-class-features-plugin": "^7.17.12",
    +        "@babel/helper-plugin-utils": "^7.17.12"
           }
         },
         "@babel/plugin-proposal-class-static-block": {
    -      "version": "7.17.6",
    -      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.17.6.tgz",
    -      "integrity": "sha512-X/tididvL2zbs7jZCeeRJ8167U/+Ac135AM6jCAx6gYXDUviZV5Ku9UDvWS2NCuWlFjIRXklYhwo6HhAC7ETnA==",
    +      "version": "7.18.0",
    +      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.18.0.tgz",
    +      "integrity": "sha512-t+8LsRMMDE74c6sV7KShIw13sqbqd58tlqNrsWoWBTIMw7SVQ0cZ905wLNS/FBCy/3PyooRHLFFlfrUNyyz5lA==",
           "dev": true,
           "requires": {
    -        "@babel/helper-create-class-features-plugin": "^7.17.6",
    -        "@babel/helper-plugin-utils": "^7.16.7",
    +        "@babel/helper-create-class-features-plugin": "^7.18.0",
    +        "@babel/helper-plugin-utils": "^7.17.12",
             "@babel/plugin-syntax-class-static-block": "^7.14.5"
           }
         },
         "@babel/plugin-proposal-decorators": {
    -      "version": "7.17.8",
    -      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.17.8.tgz",
    -      "integrity": "sha512-U69odN4Umyyx1xO1rTII0IDkAEC+RNlcKXtqOblfpzqy1C+aOplb76BQNq0+XdpVkOaPlpEDwd++joY8FNFJKA==",
    +      "version": "7.18.2",
    +      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.18.2.tgz",
    +      "integrity": "sha512-kbDISufFOxeczi0v4NQP3p5kIeW6izn/6klfWBrIIdGZZe4UpHR+QU03FAoWjGGd9SUXAwbw2pup1kaL4OQsJQ==",
           "dev": true,
           "requires": {
    -        "@babel/helper-create-class-features-plugin": "^7.17.6",
    -        "@babel/helper-plugin-utils": "^7.16.7",
    -        "@babel/helper-replace-supers": "^7.16.7",
    -        "@babel/plugin-syntax-decorators": "^7.17.0",
    +        "@babel/helper-create-class-features-plugin": "^7.18.0",
    +        "@babel/helper-plugin-utils": "^7.17.12",
    +        "@babel/helper-replace-supers": "^7.18.2",
    +        "@babel/helper-split-export-declaration": "^7.16.7",
    +        "@babel/plugin-syntax-decorators": "^7.17.12",
             "charcodes": "^0.2.0"
           }
         },
    @@ -17880,42 +18083,42 @@
           }
         },
         "@babel/plugin-proposal-export-namespace-from": {
    -      "version": "7.16.7",
    -      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.16.7.tgz",
    -      "integrity": "sha512-ZxdtqDXLRGBL64ocZcs7ovt71L3jhC1RGSyR996svrCi3PYqHNkb3SwPJCs8RIzD86s+WPpt2S73+EHCGO+NUA==",
    +      "version": "7.17.12",
    +      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.17.12.tgz",
    +      "integrity": "sha512-j7Ye5EWdwoXOpRmo5QmRyHPsDIe6+u70ZYZrd7uz+ebPYFKfRcLcNu3Ro0vOlJ5zuv8rU7xa+GttNiRzX56snQ==",
           "dev": true,
           "requires": {
    -        "@babel/helper-plugin-utils": "^7.16.7",
    +        "@babel/helper-plugin-utils": "^7.17.12",
             "@babel/plugin-syntax-export-namespace-from": "^7.8.3"
           }
         },
         "@babel/plugin-proposal-json-strings": {
    -      "version": "7.16.7",
    -      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.16.7.tgz",
    -      "integrity": "sha512-lNZ3EEggsGY78JavgbHsK9u5P3pQaW7k4axlgFLYkMd7UBsiNahCITShLjNQschPyjtO6dADrL24757IdhBrsQ==",
    +      "version": "7.17.12",
    +      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.17.12.tgz",
    +      "integrity": "sha512-rKJ+rKBoXwLnIn7n6o6fulViHMrOThz99ybH+hKHcOZbnN14VuMnH9fo2eHE69C8pO4uX1Q7t2HYYIDmv8VYkg==",
           "dev": true,
           "requires": {
    -        "@babel/helper-plugin-utils": "^7.16.7",
    +        "@babel/helper-plugin-utils": "^7.17.12",
             "@babel/plugin-syntax-json-strings": "^7.8.3"
           }
         },
         "@babel/plugin-proposal-logical-assignment-operators": {
    -      "version": "7.16.7",
    -      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.16.7.tgz",
    -      "integrity": "sha512-K3XzyZJGQCr00+EtYtrDjmwX7o7PLK6U9bi1nCwkQioRFVUv6dJoxbQjtWVtP+bCPy82bONBKG8NPyQ4+i6yjg==",
    +      "version": "7.17.12",
    +      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.17.12.tgz",
    +      "integrity": "sha512-EqFo2s1Z5yy+JeJu7SFfbIUtToJTVlC61/C7WLKDntSw4Sz6JNAIfL7zQ74VvirxpjB5kz/kIx0gCcb+5OEo2Q==",
           "dev": true,
           "requires": {
    -        "@babel/helper-plugin-utils": "^7.16.7",
    +        "@babel/helper-plugin-utils": "^7.17.12",
             "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4"
           }
         },
         "@babel/plugin-proposal-nullish-coalescing-operator": {
    -      "version": "7.16.7",
    -      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.16.7.tgz",
    -      "integrity": "sha512-aUOrYU3EVtjf62jQrCj63pYZ7k6vns2h/DQvHPWGmsJRYzWXZ6/AsfgpiRy6XiuIDADhJzP2Q9MwSMKauBQ+UQ==",
    +      "version": "7.17.12",
    +      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.17.12.tgz",
    +      "integrity": "sha512-ws/g3FSGVzv+VH86+QvgtuJL/kR67xaEIF2x0iPqdDfYW6ra6JF3lKVBkWynRLcNtIC1oCTfDRVxmm2mKzy+ag==",
           "dev": true,
           "requires": {
    -        "@babel/helper-plugin-utils": "^7.16.7",
    +        "@babel/helper-plugin-utils": "^7.17.12",
             "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3"
           }
         },
    @@ -17930,16 +18133,16 @@
           }
         },
         "@babel/plugin-proposal-object-rest-spread": {
    -      "version": "7.17.3",
    -      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.17.3.tgz",
    -      "integrity": "sha512-yuL5iQA/TbZn+RGAfxQXfi7CNLmKi1f8zInn4IgobuCWcAb7i+zj4TYzQ9l8cEzVyJ89PDGuqxK1xZpUDISesw==",
    +      "version": "7.18.0",
    +      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.18.0.tgz",
    +      "integrity": "sha512-nbTv371eTrFabDfHLElkn9oyf9VG+VKK6WMzhY2o4eHKaG19BToD9947zzGMO6I/Irstx9d8CwX6njPNIAR/yw==",
           "dev": true,
           "requires": {
    -        "@babel/compat-data": "^7.17.0",
    -        "@babel/helper-compilation-targets": "^7.16.7",
    -        "@babel/helper-plugin-utils": "^7.16.7",
    +        "@babel/compat-data": "^7.17.10",
    +        "@babel/helper-compilation-targets": "^7.17.10",
    +        "@babel/helper-plugin-utils": "^7.17.12",
             "@babel/plugin-syntax-object-rest-spread": "^7.8.3",
    -        "@babel/plugin-transform-parameters": "^7.16.7"
    +        "@babel/plugin-transform-parameters": "^7.17.12"
           }
         },
         "@babel/plugin-proposal-optional-catch-binding": {
    @@ -17953,46 +18156,46 @@
           }
         },
         "@babel/plugin-proposal-optional-chaining": {
    -      "version": "7.16.7",
    -      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.16.7.tgz",
    -      "integrity": "sha512-eC3xy+ZrUcBtP7x+sq62Q/HYd674pPTb/77XZMb5wbDPGWIdUbSr4Agr052+zaUPSb+gGRnjxXfKFvx5iMJ+DA==",
    +      "version": "7.17.12",
    +      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.17.12.tgz",
    +      "integrity": "sha512-7wigcOs/Z4YWlK7xxjkvaIw84vGhDv/P1dFGQap0nHkc8gFKY/r+hXc8Qzf5k1gY7CvGIcHqAnOagVKJJ1wVOQ==",
           "dev": true,
           "requires": {
    -        "@babel/helper-plugin-utils": "^7.16.7",
    +        "@babel/helper-plugin-utils": "^7.17.12",
             "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0",
             "@babel/plugin-syntax-optional-chaining": "^7.8.3"
           }
         },
         "@babel/plugin-proposal-private-methods": {
    -      "version": "7.16.11",
    -      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.16.11.tgz",
    -      "integrity": "sha512-F/2uAkPlXDr8+BHpZvo19w3hLFKge+k75XUprE6jaqKxjGkSYcK+4c+bup5PdW/7W/Rpjwql7FTVEDW+fRAQsw==",
    +      "version": "7.17.12",
    +      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.17.12.tgz",
    +      "integrity": "sha512-SllXoxo19HmxhDWm3luPz+cPhtoTSKLJE9PXshsfrOzBqs60QP0r8OaJItrPhAj0d7mZMnNF0Y1UUggCDgMz1A==",
           "dev": true,
           "requires": {
    -        "@babel/helper-create-class-features-plugin": "^7.16.10",
    -        "@babel/helper-plugin-utils": "^7.16.7"
    +        "@babel/helper-create-class-features-plugin": "^7.17.12",
    +        "@babel/helper-plugin-utils": "^7.17.12"
           }
         },
         "@babel/plugin-proposal-private-property-in-object": {
    -      "version": "7.16.7",
    -      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.16.7.tgz",
    -      "integrity": "sha512-rMQkjcOFbm+ufe3bTZLyOfsOUOxyvLXZJCTARhJr+8UMSoZmqTe1K1BgkFcrW37rAchWg57yI69ORxiWvUINuQ==",
    +      "version": "7.17.12",
    +      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.17.12.tgz",
    +      "integrity": "sha512-/6BtVi57CJfrtDNKfK5b66ydK2J5pXUKBKSPD2G1whamMuEnZWgoOIfO8Vf9F/DoD4izBLD/Au4NMQfruzzykg==",
           "dev": true,
           "requires": {
             "@babel/helper-annotate-as-pure": "^7.16.7",
    -        "@babel/helper-create-class-features-plugin": "^7.16.7",
    -        "@babel/helper-plugin-utils": "^7.16.7",
    +        "@babel/helper-create-class-features-plugin": "^7.17.12",
    +        "@babel/helper-plugin-utils": "^7.17.12",
             "@babel/plugin-syntax-private-property-in-object": "^7.14.5"
           }
         },
         "@babel/plugin-proposal-unicode-property-regex": {
    -      "version": "7.16.7",
    -      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.16.7.tgz",
    -      "integrity": "sha512-QRK0YI/40VLhNVGIjRNAAQkEHws0cswSdFFjpFyt943YmJIU1da9uW63Iu6NFV6CxTZW5eTDCrwZUstBWgp/Rg==",
    +      "version": "7.17.12",
    +      "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.17.12.tgz",
    +      "integrity": "sha512-Wb9qLjXf3ZazqXA7IvI7ozqRIXIGPtSo+L5coFmEkhTQK18ao4UDDD0zdTGAarmbLj2urpRwrc6893cu5Bfh0A==",
           "dev": true,
           "requires": {
    -        "@babel/helper-create-regexp-features-plugin": "^7.16.7",
    -        "@babel/helper-plugin-utils": "^7.16.7"
    +        "@babel/helper-create-regexp-features-plugin": "^7.17.12",
    +        "@babel/helper-plugin-utils": "^7.17.12"
           }
         },
         "@babel/plugin-syntax-async-generators": {
    @@ -18032,12 +18235,12 @@
           }
         },
         "@babel/plugin-syntax-decorators": {
    -      "version": "7.17.0",
    -      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.17.0.tgz",
    -      "integrity": "sha512-qWe85yCXsvDEluNP0OyeQjH63DlhAR3W7K9BxxU1MvbDb48tgBG+Ao6IJJ6smPDrrVzSQZrbF6donpkFBMcs3A==",
    +      "version": "7.17.12",
    +      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.17.12.tgz",
    +      "integrity": "sha512-D1Hz0qtGTza8K2xGyEdVNCYLdVHukAcbQr4K3/s6r/esadyEriZovpJimQOpu8ju4/jV8dW/1xdaE0UpDroidw==",
           "dev": true,
           "requires": {
    -        "@babel/helper-plugin-utils": "^7.16.7"
    +        "@babel/helper-plugin-utils": "^7.17.12"
           }
         },
         "@babel/plugin-syntax-dynamic-import": {
    @@ -18059,12 +18262,21 @@
           }
         },
         "@babel/plugin-syntax-flow": {
    -      "version": "7.16.7",
    -      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.16.7.tgz",
    -      "integrity": "sha512-UDo3YGQO0jH6ytzVwgSLv9i/CzMcUjbKenL67dTrAZPPv6GFAtDhe6jqnvmoKzC/7htNTohhos+onPtDMqJwaQ==",
    +      "version": "7.17.12",
    +      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.17.12.tgz",
    +      "integrity": "sha512-B8QIgBvkIG6G2jgsOHQUist7Sm0EBLDCx8sen072IwqNuzMegZNXrYnSv77cYzA8mLDZAfQYqsLIhimiP1s2HQ==",
           "dev": true,
           "requires": {
    -        "@babel/helper-plugin-utils": "^7.16.7"
    +        "@babel/helper-plugin-utils": "^7.17.12"
    +      }
    +    },
    +    "@babel/plugin-syntax-import-assertions": {
    +      "version": "7.17.12",
    +      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.17.12.tgz",
    +      "integrity": "sha512-n/loy2zkq9ZEM8tEOwON9wTQSTNDTDEz6NujPtJGLU7qObzT1N4c4YZZf8E6ATB2AjNQg/Ib2AIpO03EZaCehw==",
    +      "dev": true,
    +      "requires": {
    +        "@babel/helper-plugin-utils": "^7.17.12"
           }
         },
         "@babel/plugin-syntax-import-meta": {
    @@ -18086,12 +18298,12 @@
           }
         },
         "@babel/plugin-syntax-jsx": {
    -      "version": "7.16.7",
    -      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.16.7.tgz",
    -      "integrity": "sha512-Esxmk7YjA8QysKeT3VhTXvF6y77f/a91SIs4pWb4H2eWGQkCKFgQaG6hdoEVZtGsrAcb2K5BW66XsOErD4WU3Q==",
    +      "version": "7.17.12",
    +      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.17.12.tgz",
    +      "integrity": "sha512-spyY3E3AURfxh/RHtjx5j6hs8am5NbUBGfcZ2vB3uShSpZdQyXSf5rR5Mk76vbtlAZOelyVQ71Fg0x9SG4fsog==",
           "dev": true,
           "requires": {
    -        "@babel/helper-plugin-utils": "^7.16.7"
    +        "@babel/helper-plugin-utils": "^7.17.12"
           }
         },
         "@babel/plugin-syntax-logical-assignment-operators": {
    @@ -18167,31 +18379,31 @@
           }
         },
         "@babel/plugin-syntax-typescript": {
    -      "version": "7.16.7",
    -      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.16.7.tgz",
    -      "integrity": "sha512-YhUIJHHGkqPgEcMYkPCKTyGUdoGKWtopIycQyjJH8OjvRgOYsXsaKehLVPScKJWAULPxMa4N1vCe6szREFlZ7A==",
    +      "version": "7.17.12",
    +      "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.17.12.tgz",
    +      "integrity": "sha512-TYY0SXFiO31YXtNg3HtFwNJHjLsAyIIhAhNWkQ5whPPS7HWUFlg9z0Ta4qAQNjQbP1wsSt/oKkmZ/4/WWdMUpw==",
           "dev": true,
           "requires": {
    -        "@babel/helper-plugin-utils": "^7.16.7"
    +        "@babel/helper-plugin-utils": "^7.17.12"
           }
         },
         "@babel/plugin-transform-arrow-functions": {
    -      "version": "7.16.7",
    -      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.16.7.tgz",
    -      "integrity": "sha512-9ffkFFMbvzTvv+7dTp/66xvZAWASuPD5Tl9LK3Z9vhOmANo6j94rik+5YMBt4CwHVMWLWpMsriIc2zsa3WW3xQ==",
    +      "version": "7.17.12",
    +      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.17.12.tgz",
    +      "integrity": "sha512-PHln3CNi/49V+mza4xMwrg+WGYevSF1oaiXaC2EQfdp4HWlSjRsrDXWJiQBKpP7749u6vQ9mcry2uuFOv5CXvA==",
           "dev": true,
           "requires": {
    -        "@babel/helper-plugin-utils": "^7.16.7"
    +        "@babel/helper-plugin-utils": "^7.17.12"
           }
         },
         "@babel/plugin-transform-async-to-generator": {
    -      "version": "7.16.8",
    -      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.16.8.tgz",
    -      "integrity": "sha512-MtmUmTJQHCnyJVrScNzNlofQJ3dLFuobYn3mwOTKHnSCMtbNsqvF71GQmJfFjdrXSsAA7iysFmYWw4bXZ20hOg==",
    +      "version": "7.17.12",
    +      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.17.12.tgz",
    +      "integrity": "sha512-J8dbrWIOO3orDzir57NRsjg4uxucvhby0L/KZuGsWDj0g7twWK3g7JhJhOrXtuXiw8MeiSdJ3E0OW9H8LYEzLQ==",
           "dev": true,
           "requires": {
             "@babel/helper-module-imports": "^7.16.7",
    -        "@babel/helper-plugin-utils": "^7.16.7",
    +        "@babel/helper-plugin-utils": "^7.17.12",
             "@babel/helper-remap-async-to-generator": "^7.16.8"
           }
         },
    @@ -18205,26 +18417,26 @@
           }
         },
         "@babel/plugin-transform-block-scoping": {
    -      "version": "7.16.7",
    -      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.16.7.tgz",
    -      "integrity": "sha512-ObZev2nxVAYA4bhyusELdo9hb3H+A56bxH3FZMbEImZFiEDYVHXQSJ1hQKFlDnlt8G9bBrCZ5ZpURZUrV4G5qQ==",
    +      "version": "7.18.4",
    +      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.18.4.tgz",
    +      "integrity": "sha512-+Hq10ye+jlvLEogSOtq4mKvtk7qwcUQ1f0Mrueai866C82f844Yom2cttfJdMdqRLTxWpsbfbkIkOIfovyUQXw==",
           "dev": true,
           "requires": {
    -        "@babel/helper-plugin-utils": "^7.16.7"
    +        "@babel/helper-plugin-utils": "^7.17.12"
           }
         },
         "@babel/plugin-transform-classes": {
    -      "version": "7.16.7",
    -      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.16.7.tgz",
    -      "integrity": "sha512-WY7og38SFAGYRe64BrjKf8OrE6ulEHtr5jEYaZMwox9KebgqPi67Zqz8K53EKk1fFEJgm96r32rkKZ3qA2nCWQ==",
    +      "version": "7.18.4",
    +      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.18.4.tgz",
    +      "integrity": "sha512-e42NSG2mlKWgxKUAD9EJJSkZxR67+wZqzNxLSpc51T8tRU5SLFHsPmgYR5yr7sdgX4u+iHA1C5VafJ6AyImV3A==",
           "dev": true,
           "requires": {
             "@babel/helper-annotate-as-pure": "^7.16.7",
    -        "@babel/helper-environment-visitor": "^7.16.7",
    -        "@babel/helper-function-name": "^7.16.7",
    +        "@babel/helper-environment-visitor": "^7.18.2",
    +        "@babel/helper-function-name": "^7.17.9",
             "@babel/helper-optimise-call-expression": "^7.16.7",
    -        "@babel/helper-plugin-utils": "^7.16.7",
    -        "@babel/helper-replace-supers": "^7.16.7",
    +        "@babel/helper-plugin-utils": "^7.17.12",
    +        "@babel/helper-replace-supers": "^7.18.2",
             "@babel/helper-split-export-declaration": "^7.16.7",
             "globals": "^11.1.0"
           },
    @@ -18238,21 +18450,21 @@
           }
         },
         "@babel/plugin-transform-computed-properties": {
    -      "version": "7.16.7",
    -      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.16.7.tgz",
    -      "integrity": "sha512-gN72G9bcmenVILj//sv1zLNaPyYcOzUho2lIJBMh/iakJ9ygCo/hEF9cpGb61SCMEDxbbyBoVQxrt+bWKu5KGw==",
    +      "version": "7.17.12",
    +      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.17.12.tgz",
    +      "integrity": "sha512-a7XINeplB5cQUWMg1E/GI1tFz3LfK021IjV1rj1ypE+R7jHm+pIHmHl25VNkZxtx9uuYp7ThGk8fur1HHG7PgQ==",
           "dev": true,
           "requires": {
    -        "@babel/helper-plugin-utils": "^7.16.7"
    +        "@babel/helper-plugin-utils": "^7.17.12"
           }
         },
         "@babel/plugin-transform-destructuring": {
    -      "version": "7.17.7",
    -      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.17.7.tgz",
    -      "integrity": "sha512-XVh0r5yq9sLR4vZ6eVZe8FKfIcSgaTBxVBRSYokRj2qksf6QerYnTxz9/GTuKTH/n/HwLP7t6gtlybHetJ/6hQ==",
    +      "version": "7.18.0",
    +      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.18.0.tgz",
    +      "integrity": "sha512-Mo69klS79z6KEfrLg/1WkmVnB8javh75HX4pi2btjvlIoasuxilEyjtsQW6XPrubNd7AQy0MMaNIaQE4e7+PQw==",
           "dev": true,
           "requires": {
    -        "@babel/helper-plugin-utils": "^7.16.7"
    +        "@babel/helper-plugin-utils": "^7.17.12"
           }
         },
         "@babel/plugin-transform-dotall-regex": {
    @@ -18266,12 +18478,12 @@
           }
         },
         "@babel/plugin-transform-duplicate-keys": {
    -      "version": "7.16.7",
    -      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.16.7.tgz",
    -      "integrity": "sha512-03DvpbRfvWIXyK0/6QiR1KMTWeT6OcQ7tbhjrXyFS02kjuX/mu5Bvnh5SDSWHxyawit2g5aWhKwI86EE7GUnTw==",
    +      "version": "7.17.12",
    +      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.17.12.tgz",
    +      "integrity": "sha512-EA5eYFUG6xeerdabina/xIoB95jJ17mAkR8ivx6ZSu9frKShBjpOGZPn511MTDTkiCO+zXnzNczvUM69YSf3Zw==",
           "dev": true,
           "requires": {
    -        "@babel/helper-plugin-utils": "^7.16.7"
    +        "@babel/helper-plugin-utils": "^7.17.12"
           }
         },
         "@babel/plugin-transform-exponentiation-operator": {
    @@ -18285,22 +18497,22 @@
           }
         },
         "@babel/plugin-transform-flow-strip-types": {
    -      "version": "7.16.7",
    -      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.16.7.tgz",
    -      "integrity": "sha512-mzmCq3cNsDpZZu9FADYYyfZJIOrSONmHcop2XEKPdBNMa4PDC4eEvcOvzZaCNcjKu72v0XQlA5y1g58aLRXdYg==",
    +      "version": "7.17.12",
    +      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.17.12.tgz",
    +      "integrity": "sha512-g8cSNt+cHCpG/uunPQELdq/TeV3eg1OLJYwxypwHtAWo9+nErH3lQx9CSO2uI9lF74A0mR0t4KoMjs1snSgnTw==",
           "dev": true,
           "requires": {
    -        "@babel/helper-plugin-utils": "^7.16.7",
    -        "@babel/plugin-syntax-flow": "^7.16.7"
    +        "@babel/helper-plugin-utils": "^7.17.12",
    +        "@babel/plugin-syntax-flow": "^7.17.12"
           }
         },
         "@babel/plugin-transform-for-of": {
    -      "version": "7.16.7",
    -      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.16.7.tgz",
    -      "integrity": "sha512-/QZm9W92Ptpw7sjI9Nx1mbcsWz33+l8kuMIQnDwgQBG5s3fAfQvkRjQ7NqXhtNcKOnPkdICmUHyCaWW06HCsqg==",
    +      "version": "7.18.1",
    +      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.18.1.tgz",
    +      "integrity": "sha512-+TTB5XwvJ5hZbO8xvl2H4XaMDOAK57zF4miuC9qQJgysPNEAZZ9Z69rdF5LJkozGdZrjBIUAIyKUWRMmebI7vg==",
           "dev": true,
           "requires": {
    -        "@babel/helper-plugin-utils": "^7.16.7"
    +        "@babel/helper-plugin-utils": "^7.17.12"
           }
         },
         "@babel/plugin-transform-function-name": {
    @@ -18315,12 +18527,12 @@
           }
         },
         "@babel/plugin-transform-literals": {
    -      "version": "7.16.7",
    -      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.16.7.tgz",
    -      "integrity": "sha512-6tH8RTpTWI0s2sV6uq3e/C9wPo4PTqqZps4uF0kzQ9/xPLFQtipynvmT1g/dOfEJ+0EQsHhkQ/zyRId8J2b8zQ==",
    +      "version": "7.17.12",
    +      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.17.12.tgz",
    +      "integrity": "sha512-8iRkvaTjJciWycPIZ9k9duu663FT7VrBdNqNgxnVXEFwOIp55JWcZd23VBRySYbnS3PwQ3rGiabJBBBGj5APmQ==",
           "dev": true,
           "requires": {
    -        "@babel/helper-plugin-utils": "^7.16.7"
    +        "@babel/helper-plugin-utils": "^7.17.12"
           }
         },
         "@babel/plugin-transform-member-expression-literals": {
    @@ -18333,67 +18545,68 @@
           }
         },
         "@babel/plugin-transform-modules-amd": {
    -      "version": "7.16.7",
    -      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.16.7.tgz",
    -      "integrity": "sha512-KaaEtgBL7FKYwjJ/teH63oAmE3lP34N3kshz8mm4VMAw7U3PxjVwwUmxEFksbgsNUaO3wId9R2AVQYSEGRa2+g==",
    +      "version": "7.18.0",
    +      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.18.0.tgz",
    +      "integrity": "sha512-h8FjOlYmdZwl7Xm2Ug4iX2j7Qy63NANI+NQVWQzv6r25fqgg7k2dZl03p95kvqNclglHs4FZ+isv4p1uXMA+QA==",
           "dev": true,
           "requires": {
    -        "@babel/helper-module-transforms": "^7.16.7",
    -        "@babel/helper-plugin-utils": "^7.16.7",
    +        "@babel/helper-module-transforms": "^7.18.0",
    +        "@babel/helper-plugin-utils": "^7.17.12",
             "babel-plugin-dynamic-import-node": "^2.3.3"
           }
         },
         "@babel/plugin-transform-modules-commonjs": {
    -      "version": "7.17.7",
    -      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.17.7.tgz",
    -      "integrity": "sha512-ITPmR2V7MqioMJyrxUo2onHNC3e+MvfFiFIR0RP21d3PtlVb6sfzoxNKiphSZUOM9hEIdzCcZe83ieX3yoqjUA==",
    +      "version": "7.18.2",
    +      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.18.2.tgz",
    +      "integrity": "sha512-f5A865gFPAJAEE0K7F/+nm5CmAE3y8AWlMBG9unu5j9+tk50UQVK0QS8RNxSp7MJf0wh97uYyLWt3Zvu71zyOQ==",
           "dev": true,
           "requires": {
    -        "@babel/helper-module-transforms": "^7.17.7",
    -        "@babel/helper-plugin-utils": "^7.16.7",
    -        "@babel/helper-simple-access": "^7.17.7",
    +        "@babel/helper-module-transforms": "^7.18.0",
    +        "@babel/helper-plugin-utils": "^7.17.12",
    +        "@babel/helper-simple-access": "^7.18.2",
             "babel-plugin-dynamic-import-node": "^2.3.3"
           }
         },
         "@babel/plugin-transform-modules-systemjs": {
    -      "version": "7.17.8",
    -      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.17.8.tgz",
    -      "integrity": "sha512-39reIkMTUVagzgA5x88zDYXPCMT6lcaRKs1+S9K6NKBPErbgO/w/kP8GlNQTC87b412ZTlmNgr3k2JrWgHH+Bw==",
    +      "version": "7.18.5",
    +      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.18.5.tgz",
    +      "integrity": "sha512-SEewrhPpcqMF1V7DhnEbhVJLrC+nnYfe1E0piZMZXBpxi9WvZqWGwpsk7JYP7wPWeqaBh4gyKlBhHJu3uz5g4Q==",
           "dev": true,
           "requires": {
             "@babel/helper-hoist-variables": "^7.16.7",
    -        "@babel/helper-module-transforms": "^7.17.7",
    -        "@babel/helper-plugin-utils": "^7.16.7",
    +        "@babel/helper-module-transforms": "^7.18.0",
    +        "@babel/helper-plugin-utils": "^7.17.12",
             "@babel/helper-validator-identifier": "^7.16.7",
             "babel-plugin-dynamic-import-node": "^2.3.3"
           }
         },
         "@babel/plugin-transform-modules-umd": {
    -      "version": "7.16.7",
    -      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.16.7.tgz",
    -      "integrity": "sha512-EMh7uolsC8O4xhudF2F6wedbSHm1HHZ0C6aJ7K67zcDNidMzVcxWdGr+htW9n21klm+bOn+Rx4CBsAntZd3rEQ==",
    +      "version": "7.18.0",
    +      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.18.0.tgz",
    +      "integrity": "sha512-d/zZ8I3BWli1tmROLxXLc9A6YXvGK8egMxHp+E/rRwMh1Kip0AP77VwZae3snEJ33iiWwvNv2+UIIhfalqhzZA==",
           "dev": true,
           "requires": {
    -        "@babel/helper-module-transforms": "^7.16.7",
    -        "@babel/helper-plugin-utils": "^7.16.7"
    +        "@babel/helper-module-transforms": "^7.18.0",
    +        "@babel/helper-plugin-utils": "^7.17.12"
           }
         },
         "@babel/plugin-transform-named-capturing-groups-regex": {
    -      "version": "7.16.8",
    -      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.16.8.tgz",
    -      "integrity": "sha512-j3Jw+n5PvpmhRR+mrgIh04puSANCk/T/UA3m3P1MjJkhlK906+ApHhDIqBQDdOgL/r1UYpz4GNclTXxyZrYGSw==",
    +      "version": "7.17.12",
    +      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.17.12.tgz",
    +      "integrity": "sha512-vWoWFM5CKaTeHrdUJ/3SIOTRV+MBVGybOC9mhJkaprGNt5demMymDW24yC74avb915/mIRe3TgNb/d8idvnCRA==",
           "dev": true,
           "requires": {
    -        "@babel/helper-create-regexp-features-plugin": "^7.16.7"
    +        "@babel/helper-create-regexp-features-plugin": "^7.17.12",
    +        "@babel/helper-plugin-utils": "^7.17.12"
           }
         },
         "@babel/plugin-transform-new-target": {
    -      "version": "7.16.7",
    -      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.16.7.tgz",
    -      "integrity": "sha512-xiLDzWNMfKoGOpc6t3U+etCE2yRnn3SM09BXqWPIZOBpL2gvVrBWUKnsJx0K/ADi5F5YC5f8APFfWrz25TdlGg==",
    +      "version": "7.18.5",
    +      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.18.5.tgz",
    +      "integrity": "sha512-TuRL5uGW4KXU6OsRj+mLp9BM7pO8e7SGNTEokQRRxHFkXYMFiy2jlKSZPFtI/mKORDzciH+hneskcSOp0gU8hg==",
           "dev": true,
           "requires": {
    -        "@babel/helper-plugin-utils": "^7.16.7"
    +        "@babel/helper-plugin-utils": "^7.17.12"
           }
         },
         "@babel/plugin-transform-object-super": {
    @@ -18407,12 +18620,12 @@
           }
         },
         "@babel/plugin-transform-parameters": {
    -      "version": "7.16.7",
    -      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.16.7.tgz",
    -      "integrity": "sha512-AT3MufQ7zZEhU2hwOA11axBnExW0Lszu4RL/tAlUJBuNoRak+wehQW8h6KcXOcgjY42fHtDxswuMhMjFEuv/aw==",
    +      "version": "7.17.12",
    +      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.17.12.tgz",
    +      "integrity": "sha512-6qW4rWo1cyCdq1FkYri7AHpauchbGLXpdwnYsfxFb+KtddHENfsY5JZb35xUwkK5opOLcJ3BNd2l7PhRYGlwIA==",
           "dev": true,
           "requires": {
    -        "@babel/helper-plugin-utils": "^7.16.7"
    +        "@babel/helper-plugin-utils": "^7.17.12"
           }
         },
         "@babel/plugin-transform-property-literals": {
    @@ -18425,12 +18638,12 @@
           }
         },
         "@babel/plugin-transform-react-constant-elements": {
    -      "version": "7.17.6",
    -      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.17.6.tgz",
    -      "integrity": "sha512-OBv9VkyyKtsHZiHLoSfCn+h6yU7YKX8nrs32xUmOa1SRSk+t03FosB6fBZ0Yz4BpD1WV7l73Nsad+2Tz7APpqw==",
    +      "version": "7.17.12",
    +      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.17.12.tgz",
    +      "integrity": "sha512-maEkX2xs2STuv2Px8QuqxqjhV2LsFobT1elCgyU5704fcyTu9DyD/bJXxD/mrRiVyhpHweOQ00OJ5FKhHq9oEw==",
           "dev": true,
           "requires": {
    -        "@babel/helper-plugin-utils": "^7.16.7"
    +        "@babel/helper-plugin-utils": "^7.17.12"
           }
         },
         "@babel/plugin-transform-react-display-name": {
    @@ -18443,16 +18656,16 @@
           }
         },
         "@babel/plugin-transform-react-jsx": {
    -      "version": "7.17.3",
    -      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.17.3.tgz",
    -      "integrity": "sha512-9tjBm4O07f7mzKSIlEmPdiE6ub7kfIe6Cd+w+oQebpATfTQMAgW+YOuWxogbKVTulA+MEO7byMeIUtQ1z+z+ZQ==",
    +      "version": "7.17.12",
    +      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.17.12.tgz",
    +      "integrity": "sha512-Lcaw8bxd1DKht3thfD4A12dqo1X16he1Lm8rIv8sTwjAYNInRS1qHa9aJoqvzpscItXvftKDCfaEQzwoVyXpEQ==",
           "dev": true,
           "requires": {
             "@babel/helper-annotate-as-pure": "^7.16.7",
             "@babel/helper-module-imports": "^7.16.7",
    -        "@babel/helper-plugin-utils": "^7.16.7",
    -        "@babel/plugin-syntax-jsx": "^7.16.7",
    -        "@babel/types": "^7.17.0"
    +        "@babel/helper-plugin-utils": "^7.17.12",
    +        "@babel/plugin-syntax-jsx": "^7.17.12",
    +        "@babel/types": "^7.17.12"
           }
         },
         "@babel/plugin-transform-react-jsx-development": {
    @@ -18465,41 +18678,42 @@
           }
         },
         "@babel/plugin-transform-react-pure-annotations": {
    -      "version": "7.16.7",
    -      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.16.7.tgz",
    -      "integrity": "sha512-hs71ToC97k3QWxswh2ElzMFABXHvGiJ01IB1TbYQDGeWRKWz/MPUTh5jGExdHvosYKpnJW5Pm3S4+TA3FyX+GA==",
    +      "version": "7.18.0",
    +      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.18.0.tgz",
    +      "integrity": "sha512-6+0IK6ouvqDn9bmEG7mEyF/pwlJXVj5lwydybpyyH3D0A7Hftk+NCTdYjnLNZksn261xaOV5ksmp20pQEmc2RQ==",
           "dev": true,
           "requires": {
             "@babel/helper-annotate-as-pure": "^7.16.7",
    -        "@babel/helper-plugin-utils": "^7.16.7"
    +        "@babel/helper-plugin-utils": "^7.17.12"
           }
         },
         "@babel/plugin-transform-regenerator": {
    -      "version": "7.16.7",
    -      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.16.7.tgz",
    -      "integrity": "sha512-mF7jOgGYCkSJagJ6XCujSQg+6xC1M77/03K2oBmVJWoFGNUtnVJO4WHKJk3dnPC8HCcj4xBQP1Egm8DWh3Pb3Q==",
    +      "version": "7.18.0",
    +      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.18.0.tgz",
    +      "integrity": "sha512-C8YdRw9uzx25HSIzwA7EM7YP0FhCe5wNvJbZzjVNHHPGVcDJ3Aie+qGYYdS1oVQgn+B3eAIJbWFLrJ4Jipv7nw==",
           "dev": true,
           "requires": {
    -        "regenerator-transform": "^0.14.2"
    +        "@babel/helper-plugin-utils": "^7.17.12",
    +        "regenerator-transform": "^0.15.0"
           }
         },
         "@babel/plugin-transform-reserved-words": {
    -      "version": "7.16.7",
    -      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.16.7.tgz",
    -      "integrity": "sha512-KQzzDnZ9hWQBjwi5lpY5v9shmm6IVG0U9pB18zvMu2i4H90xpT4gmqwPYsn8rObiadYe2M0gmgsiOIF5A/2rtg==",
    +      "version": "7.17.12",
    +      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.17.12.tgz",
    +      "integrity": "sha512-1KYqwbJV3Co03NIi14uEHW8P50Md6KqFgt0FfpHdK6oyAHQVTosgPuPSiWud1HX0oYJ1hGRRlk0fP87jFpqXZA==",
           "dev": true,
           "requires": {
    -        "@babel/helper-plugin-utils": "^7.16.7"
    +        "@babel/helper-plugin-utils": "^7.17.12"
           }
         },
         "@babel/plugin-transform-runtime": {
    -      "version": "7.17.0",
    -      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.17.0.tgz",
    -      "integrity": "sha512-fr7zPWnKXNc1xoHfrIU9mN/4XKX4VLZ45Q+oMhfsYIaHvg7mHgmhfOy/ckRWqDK7XF3QDigRpkh5DKq6+clE8A==",
    +      "version": "7.18.5",
    +      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.18.5.tgz",
    +      "integrity": "sha512-Q17hHxXr2fplrE+5BSC1j1Fo5cOA8YeP8XW3/1paI8MzF/faZGh0MaH1KC4jLAvqLPamQWHB5/B7KqSLY1kuHA==",
           "dev": true,
           "requires": {
             "@babel/helper-module-imports": "^7.16.7",
    -        "@babel/helper-plugin-utils": "^7.16.7",
    +        "@babel/helper-plugin-utils": "^7.17.12",
             "babel-plugin-polyfill-corejs2": "^0.3.0",
             "babel-plugin-polyfill-corejs3": "^0.5.0",
             "babel-plugin-polyfill-regenerator": "^0.3.0",
    @@ -18516,12 +18730,12 @@
           }
         },
         "@babel/plugin-transform-spread": {
    -      "version": "7.16.7",
    -      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.16.7.tgz",
    -      "integrity": "sha512-+pjJpgAngb53L0iaA5gU/1MLXJIfXcYepLgXB3esVRf4fqmj8f2cxM3/FKaHsZms08hFQJkFccEWuIpm429TXg==",
    +      "version": "7.17.12",
    +      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.17.12.tgz",
    +      "integrity": "sha512-9pgmuQAtFi3lpNUstvG9nGfk9DkrdmWNp9KeKPFmuZCpEnxRzYlS8JgwPjYj+1AWDOSvoGN0H30p1cBOmT/Svg==",
           "dev": true,
           "requires": {
    -        "@babel/helper-plugin-utils": "^7.16.7",
    +        "@babel/helper-plugin-utils": "^7.17.12",
             "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0"
           }
         },
    @@ -18535,32 +18749,32 @@
           }
         },
         "@babel/plugin-transform-template-literals": {
    -      "version": "7.16.7",
    -      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.16.7.tgz",
    -      "integrity": "sha512-VwbkDDUeenlIjmfNeDX/V0aWrQH2QiVyJtwymVQSzItFDTpxfyJh3EVaQiS0rIN/CqbLGr0VcGmuwyTdZtdIsA==",
    +      "version": "7.18.2",
    +      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.2.tgz",
    +      "integrity": "sha512-/cmuBVw9sZBGZVOMkpAEaVLwm4JmK2GZ1dFKOGGpMzEHWFmyZZ59lUU0PdRr8YNYeQdNzTDwuxP2X2gzydTc9g==",
           "dev": true,
           "requires": {
    -        "@babel/helper-plugin-utils": "^7.16.7"
    +        "@babel/helper-plugin-utils": "^7.17.12"
           }
         },
         "@babel/plugin-transform-typeof-symbol": {
    -      "version": "7.16.7",
    -      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.16.7.tgz",
    -      "integrity": "sha512-p2rOixCKRJzpg9JB4gjnG4gjWkWa89ZoYUnl9snJ1cWIcTH/hvxZqfO+WjG6T8DRBpctEol5jw1O5rA8gkCokQ==",
    +      "version": "7.17.12",
    +      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.17.12.tgz",
    +      "integrity": "sha512-Q8y+Jp7ZdtSPXCThB6zjQ74N3lj0f6TDh1Hnf5B+sYlzQ8i5Pjp8gW0My79iekSpT4WnI06blqP6DT0OmaXXmw==",
           "dev": true,
           "requires": {
    -        "@babel/helper-plugin-utils": "^7.16.7"
    +        "@babel/helper-plugin-utils": "^7.17.12"
           }
         },
         "@babel/plugin-transform-typescript": {
    -      "version": "7.16.8",
    -      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.16.8.tgz",
    -      "integrity": "sha512-bHdQ9k7YpBDO2d0NVfkj51DpQcvwIzIusJ7mEUaMlbZq3Kt/U47j24inXZHQ5MDiYpCs+oZiwnXyKedE8+q7AQ==",
    +      "version": "7.18.4",
    +      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.18.4.tgz",
    +      "integrity": "sha512-l4vHuSLUajptpHNEOUDEGsnpl9pfRLsN1XUoDQDD/YBuXTM+v37SHGS+c6n4jdcZy96QtuUuSvZYMLSSsjH8Mw==",
           "dev": true,
           "requires": {
    -        "@babel/helper-create-class-features-plugin": "^7.16.7",
    -        "@babel/helper-plugin-utils": "^7.16.7",
    -        "@babel/plugin-syntax-typescript": "^7.16.7"
    +        "@babel/helper-create-class-features-plugin": "^7.18.0",
    +        "@babel/helper-plugin-utils": "^7.17.12",
    +        "@babel/plugin-syntax-typescript": "^7.17.12"
           }
         },
         "@babel/plugin-transform-unicode-escapes": {
    @@ -18583,37 +18797,38 @@
           }
         },
         "@babel/preset-env": {
    -      "version": "7.16.11",
    -      "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.16.11.tgz",
    -      "integrity": "sha512-qcmWG8R7ZW6WBRPZK//y+E3Cli151B20W1Rv7ln27vuPaXU/8TKms6jFdiJtF7UDTxcrb7mZd88tAeK9LjdT8g==",
    +      "version": "7.18.2",
    +      "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.18.2.tgz",
    +      "integrity": "sha512-PfpdxotV6afmXMU47S08F9ZKIm2bJIQ0YbAAtDfIENX7G1NUAXigLREh69CWDjtgUy7dYn7bsMzkgdtAlmS68Q==",
           "dev": true,
           "requires": {
    -        "@babel/compat-data": "^7.16.8",
    -        "@babel/helper-compilation-targets": "^7.16.7",
    -        "@babel/helper-plugin-utils": "^7.16.7",
    +        "@babel/compat-data": "^7.17.10",
    +        "@babel/helper-compilation-targets": "^7.18.2",
    +        "@babel/helper-plugin-utils": "^7.17.12",
             "@babel/helper-validator-option": "^7.16.7",
    -        "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.16.7",
    -        "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.16.7",
    -        "@babel/plugin-proposal-async-generator-functions": "^7.16.8",
    -        "@babel/plugin-proposal-class-properties": "^7.16.7",
    -        "@babel/plugin-proposal-class-static-block": "^7.16.7",
    +        "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.17.12",
    +        "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.17.12",
    +        "@babel/plugin-proposal-async-generator-functions": "^7.17.12",
    +        "@babel/plugin-proposal-class-properties": "^7.17.12",
    +        "@babel/plugin-proposal-class-static-block": "^7.18.0",
             "@babel/plugin-proposal-dynamic-import": "^7.16.7",
    -        "@babel/plugin-proposal-export-namespace-from": "^7.16.7",
    -        "@babel/plugin-proposal-json-strings": "^7.16.7",
    -        "@babel/plugin-proposal-logical-assignment-operators": "^7.16.7",
    -        "@babel/plugin-proposal-nullish-coalescing-operator": "^7.16.7",
    +        "@babel/plugin-proposal-export-namespace-from": "^7.17.12",
    +        "@babel/plugin-proposal-json-strings": "^7.17.12",
    +        "@babel/plugin-proposal-logical-assignment-operators": "^7.17.12",
    +        "@babel/plugin-proposal-nullish-coalescing-operator": "^7.17.12",
             "@babel/plugin-proposal-numeric-separator": "^7.16.7",
    -        "@babel/plugin-proposal-object-rest-spread": "^7.16.7",
    +        "@babel/plugin-proposal-object-rest-spread": "^7.18.0",
             "@babel/plugin-proposal-optional-catch-binding": "^7.16.7",
    -        "@babel/plugin-proposal-optional-chaining": "^7.16.7",
    -        "@babel/plugin-proposal-private-methods": "^7.16.11",
    -        "@babel/plugin-proposal-private-property-in-object": "^7.16.7",
    -        "@babel/plugin-proposal-unicode-property-regex": "^7.16.7",
    +        "@babel/plugin-proposal-optional-chaining": "^7.17.12",
    +        "@babel/plugin-proposal-private-methods": "^7.17.12",
    +        "@babel/plugin-proposal-private-property-in-object": "^7.17.12",
    +        "@babel/plugin-proposal-unicode-property-regex": "^7.17.12",
             "@babel/plugin-syntax-async-generators": "^7.8.4",
             "@babel/plugin-syntax-class-properties": "^7.12.13",
             "@babel/plugin-syntax-class-static-block": "^7.14.5",
             "@babel/plugin-syntax-dynamic-import": "^7.8.3",
             "@babel/plugin-syntax-export-namespace-from": "^7.8.3",
    +        "@babel/plugin-syntax-import-assertions": "^7.17.12",
             "@babel/plugin-syntax-json-strings": "^7.8.3",
             "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4",
             "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3",
    @@ -18623,44 +18838,44 @@
             "@babel/plugin-syntax-optional-chaining": "^7.8.3",
             "@babel/plugin-syntax-private-property-in-object": "^7.14.5",
             "@babel/plugin-syntax-top-level-await": "^7.14.5",
    -        "@babel/plugin-transform-arrow-functions": "^7.16.7",
    -        "@babel/plugin-transform-async-to-generator": "^7.16.8",
    +        "@babel/plugin-transform-arrow-functions": "^7.17.12",
    +        "@babel/plugin-transform-async-to-generator": "^7.17.12",
             "@babel/plugin-transform-block-scoped-functions": "^7.16.7",
    -        "@babel/plugin-transform-block-scoping": "^7.16.7",
    -        "@babel/plugin-transform-classes": "^7.16.7",
    -        "@babel/plugin-transform-computed-properties": "^7.16.7",
    -        "@babel/plugin-transform-destructuring": "^7.16.7",
    +        "@babel/plugin-transform-block-scoping": "^7.17.12",
    +        "@babel/plugin-transform-classes": "^7.17.12",
    +        "@babel/plugin-transform-computed-properties": "^7.17.12",
    +        "@babel/plugin-transform-destructuring": "^7.18.0",
             "@babel/plugin-transform-dotall-regex": "^7.16.7",
    -        "@babel/plugin-transform-duplicate-keys": "^7.16.7",
    +        "@babel/plugin-transform-duplicate-keys": "^7.17.12",
             "@babel/plugin-transform-exponentiation-operator": "^7.16.7",
    -        "@babel/plugin-transform-for-of": "^7.16.7",
    +        "@babel/plugin-transform-for-of": "^7.18.1",
             "@babel/plugin-transform-function-name": "^7.16.7",
    -        "@babel/plugin-transform-literals": "^7.16.7",
    +        "@babel/plugin-transform-literals": "^7.17.12",
             "@babel/plugin-transform-member-expression-literals": "^7.16.7",
    -        "@babel/plugin-transform-modules-amd": "^7.16.7",
    -        "@babel/plugin-transform-modules-commonjs": "^7.16.8",
    -        "@babel/plugin-transform-modules-systemjs": "^7.16.7",
    -        "@babel/plugin-transform-modules-umd": "^7.16.7",
    -        "@babel/plugin-transform-named-capturing-groups-regex": "^7.16.8",
    -        "@babel/plugin-transform-new-target": "^7.16.7",
    +        "@babel/plugin-transform-modules-amd": "^7.18.0",
    +        "@babel/plugin-transform-modules-commonjs": "^7.18.2",
    +        "@babel/plugin-transform-modules-systemjs": "^7.18.0",
    +        "@babel/plugin-transform-modules-umd": "^7.18.0",
    +        "@babel/plugin-transform-named-capturing-groups-regex": "^7.17.12",
    +        "@babel/plugin-transform-new-target": "^7.17.12",
             "@babel/plugin-transform-object-super": "^7.16.7",
    -        "@babel/plugin-transform-parameters": "^7.16.7",
    +        "@babel/plugin-transform-parameters": "^7.17.12",
             "@babel/plugin-transform-property-literals": "^7.16.7",
    -        "@babel/plugin-transform-regenerator": "^7.16.7",
    -        "@babel/plugin-transform-reserved-words": "^7.16.7",
    +        "@babel/plugin-transform-regenerator": "^7.18.0",
    +        "@babel/plugin-transform-reserved-words": "^7.17.12",
             "@babel/plugin-transform-shorthand-properties": "^7.16.7",
    -        "@babel/plugin-transform-spread": "^7.16.7",
    +        "@babel/plugin-transform-spread": "^7.17.12",
             "@babel/plugin-transform-sticky-regex": "^7.16.7",
    -        "@babel/plugin-transform-template-literals": "^7.16.7",
    -        "@babel/plugin-transform-typeof-symbol": "^7.16.7",
    +        "@babel/plugin-transform-template-literals": "^7.18.2",
    +        "@babel/plugin-transform-typeof-symbol": "^7.17.12",
             "@babel/plugin-transform-unicode-escapes": "^7.16.7",
             "@babel/plugin-transform-unicode-regex": "^7.16.7",
             "@babel/preset-modules": "^0.1.5",
    -        "@babel/types": "^7.16.8",
    +        "@babel/types": "^7.18.2",
             "babel-plugin-polyfill-corejs2": "^0.3.0",
             "babel-plugin-polyfill-corejs3": "^0.5.0",
             "babel-plugin-polyfill-regenerator": "^0.3.0",
    -        "core-js-compat": "^3.20.2",
    +        "core-js-compat": "^3.22.1",
             "semver": "^6.3.0"
           }
         },
    @@ -18678,42 +18893,42 @@
           }
         },
         "@babel/preset-react": {
    -      "version": "7.16.7",
    -      "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.16.7.tgz",
    -      "integrity": "sha512-fWpyI8UM/HE6DfPBzD8LnhQ/OcH8AgTaqcqP2nGOXEUV+VKBR5JRN9hCk9ai+zQQ57vtm9oWeXguBCPNUjytgA==",
    +      "version": "7.17.12",
    +      "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.17.12.tgz",
    +      "integrity": "sha512-h5U+rwreXtZaRBEQhW1hOJLMq8XNJBQ/9oymXiCXTuT/0uOwpbT0gUt+sXeOqoXBgNuUKI7TaObVwoEyWkpFgA==",
           "dev": true,
           "requires": {
    -        "@babel/helper-plugin-utils": "^7.16.7",
    +        "@babel/helper-plugin-utils": "^7.17.12",
             "@babel/helper-validator-option": "^7.16.7",
             "@babel/plugin-transform-react-display-name": "^7.16.7",
    -        "@babel/plugin-transform-react-jsx": "^7.16.7",
    +        "@babel/plugin-transform-react-jsx": "^7.17.12",
             "@babel/plugin-transform-react-jsx-development": "^7.16.7",
             "@babel/plugin-transform-react-pure-annotations": "^7.16.7"
           }
         },
         "@babel/preset-typescript": {
    -      "version": "7.16.7",
    -      "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.16.7.tgz",
    -      "integrity": "sha512-WbVEmgXdIyvzB77AQjGBEyYPZx+8tTsO50XtfozQrkW8QB2rLJpH2lgx0TRw5EJrBxOZQ+wCcyPVQvS8tjEHpQ==",
    +      "version": "7.17.12",
    +      "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.17.12.tgz",
    +      "integrity": "sha512-S1ViF8W2QwAKUGJXxP9NAfNaqGDdEBJKpYkxHf5Yy2C4NPPzXGeR3Lhk7G8xJaaLcFTRfNjVbtbVtm8Gb0mqvg==",
           "dev": true,
           "requires": {
    -        "@babel/helper-plugin-utils": "^7.16.7",
    +        "@babel/helper-plugin-utils": "^7.17.12",
             "@babel/helper-validator-option": "^7.16.7",
    -        "@babel/plugin-transform-typescript": "^7.16.7"
    +        "@babel/plugin-transform-typescript": "^7.17.12"
           }
         },
         "@babel/runtime": {
    -      "version": "7.17.8",
    -      "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.17.8.tgz",
    -      "integrity": "sha512-dQpEpK0O9o6lj6oPu0gRDbbnk+4LeHlNcBpspf6Olzt3GIX4P1lWF1gS+pHLDFlaJvbR6q7jCfQ08zA4QJBnmA==",
    +      "version": "7.18.3",
    +      "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.18.3.tgz",
    +      "integrity": "sha512-38Y8f7YUhce/K7RMwTp7m0uCumpv9hZkitCbBClqQIow1qSbCvGkcegKOXpEWCQLfWmevgRiWokZ1GkpfhbZug==",
           "requires": {
             "regenerator-runtime": "^0.13.4"
           }
         },
         "@babel/runtime-corejs3": {
    -      "version": "7.17.8",
    -      "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.17.8.tgz",
    -      "integrity": "sha512-ZbYSUvoSF6dXZmMl/CYTMOvzIFnbGfv4W3SEHYgMvNsFTeLaF2gkGAF4K2ddmtSK4Emej+0aYcnSC6N5dPCXUQ==",
    +      "version": "7.18.3",
    +      "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.18.3.tgz",
    +      "integrity": "sha512-l4ddFwrc9rnR+EJsHsh+TJ4A35YqQz/UqcjtlX2ov53hlJYG5CxtQmNZxyajwDVmCxwy++rtvGU5HazCK4W41Q==",
           "dev": true,
           "requires": {
             "core-js-pure": "^3.20.2",
    @@ -18732,19 +18947,19 @@
           }
         },
         "@babel/traverse": {
    -      "version": "7.17.3",
    -      "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.17.3.tgz",
    -      "integrity": "sha512-5irClVky7TxRWIRtxlh2WPUUOLhcPN06AGgaQSB8AEwuyEBgJVuJ5imdHm5zxk8w0QS5T+tDfnDxAlhWjpb7cw==",
    +      "version": "7.18.5",
    +      "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.18.5.tgz",
    +      "integrity": "sha512-aKXj1KT66sBj0vVzk6rEeAO6Z9aiiQ68wfDgge3nHhA/my6xMM/7HGQUNumKZaoa2qUPQ5whJG9aAifsxUKfLA==",
           "dev": true,
           "requires": {
             "@babel/code-frame": "^7.16.7",
    -        "@babel/generator": "^7.17.3",
    -        "@babel/helper-environment-visitor": "^7.16.7",
    -        "@babel/helper-function-name": "^7.16.7",
    +        "@babel/generator": "^7.18.2",
    +        "@babel/helper-environment-visitor": "^7.18.2",
    +        "@babel/helper-function-name": "^7.17.9",
             "@babel/helper-hoist-variables": "^7.16.7",
             "@babel/helper-split-export-declaration": "^7.16.7",
    -        "@babel/parser": "^7.17.3",
    -        "@babel/types": "^7.17.0",
    +        "@babel/parser": "^7.18.5",
    +        "@babel/types": "^7.18.4",
             "debug": "^4.1.0",
             "globals": "^11.1.0"
           },
    @@ -18758,9 +18973,9 @@
           }
         },
         "@babel/types": {
    -      "version": "7.17.0",
    -      "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.17.0.tgz",
    -      "integrity": "sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw==",
    +      "version": "7.18.4",
    +      "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.18.4.tgz",
    +      "integrity": "sha512-ThN1mBcMq5pG/Vm2IcBmPPfyPXbd8S02rS+OBIDENdufvqC7Z/jHPCv9IcP01277aKtDI8g/2XysBN4hA8niiw==",
           "dev": true,
           "requires": {
             "@babel/helper-validator-identifier": "^7.16.7",
    @@ -18774,215 +18989,95 @@
           "dev": true
         },
         "@codemirror/autocomplete": {
    -      "version": "0.19.15",
    -      "resolved": "https://registry.npmjs.org/@codemirror/autocomplete/-/autocomplete-0.19.15.tgz",
    -      "integrity": "sha512-GQWzvvuXxNUyaEk+5gawbAD8s51/v2Chb++nx0e2eGWrphWk42isBtzOMdc3DxrxrZtPZ55q2ldNp+6G8KJLIQ==",
    -      "requires": {
    -        "@codemirror/language": "^0.19.0",
    -        "@codemirror/state": "^0.19.4",
    -        "@codemirror/text": "^0.19.2",
    -        "@codemirror/tooltip": "^0.19.12",
    -        "@codemirror/view": "^0.19.0",
    -        "@lezer/common": "^0.15.0"
    -      }
    -    },
    -    "@codemirror/closebrackets": {
    -      "version": "0.19.1",
    -      "resolved": "https://registry.npmjs.org/@codemirror/closebrackets/-/closebrackets-0.19.1.tgz",
    -      "integrity": "sha512-ZiLXT6u+VuBK5QnfBbt/Vmfd9Pg6449wn1DIOWFZHUOldg5eFn3VGGjYY2XWuHQz5WuK+7dXamV2KE885O1gyA==",
    +      "version": "6.0.1",
    +      "resolved": "https://registry.npmjs.org/@codemirror/autocomplete/-/autocomplete-6.0.1.tgz",
    +      "integrity": "sha512-cD1MxuZq4scpVHecqSnUqQfRYlFDdtu4Y+7G4gF989R4F9nzrcrZ58bVua1/kIh0JminbhwqXeWXI/A5bScXaA==",
           "requires": {
    -        "@codemirror/language": "^0.19.0",
    -        "@codemirror/rangeset": "^0.19.0",
    -        "@codemirror/state": "^0.19.2",
    -        "@codemirror/text": "^0.19.0",
    -        "@codemirror/view": "^0.19.44"
    +        "@codemirror/language": "^6.0.0",
    +        "@codemirror/state": "^6.0.0",
    +        "@codemirror/view": "^6.0.0",
    +        "@lezer/common": "^1.0.0"
           }
         },
         "@codemirror/commands": {
    -      "version": "0.19.8",
    -      "resolved": "https://registry.npmjs.org/@codemirror/commands/-/commands-0.19.8.tgz",
    -      "integrity": "sha512-65LIMSGUGGpY3oH6mzV46YWRrgao6NmfJ+AuC7jNz3K5NPnH6GCV1H5I6SwOFyVbkiygGyd0EFwrWqywTBD1aw==",
    -      "requires": {
    -        "@codemirror/language": "^0.19.0",
    -        "@codemirror/matchbrackets": "^0.19.0",
    -        "@codemirror/state": "^0.19.2",
    -        "@codemirror/text": "^0.19.6",
    -        "@codemirror/view": "^0.19.22",
    -        "@lezer/common": "^0.15.0"
    -      }
    -    },
    -    "@codemirror/comment": {
    -      "version": "0.19.1",
    -      "resolved": "https://registry.npmjs.org/@codemirror/comment/-/comment-0.19.1.tgz",
    -      "integrity": "sha512-uGKteBuVWAC6fW+Yt8u27DOnXMT/xV4Ekk2Z5mRsiADCZDqYvryrJd6PLL5+8t64BVyocwQwNfz1UswYS2CtFQ==",
    -      "requires": {
    -        "@codemirror/state": "^0.19.9",
    -        "@codemirror/text": "^0.19.0",
    -        "@codemirror/view": "^0.19.0"
    -      }
    -    },
    -    "@codemirror/gutter": {
    -      "version": "0.19.9",
    -      "resolved": "https://registry.npmjs.org/@codemirror/gutter/-/gutter-0.19.9.tgz",
    -      "integrity": "sha512-PFrtmilahin1g6uL27aG5tM/rqR9DZzZYZsIrCXA5Uc2OFTFqx4owuhoU9hqfYxHp5ovfvBwQ+txFzqS4vog6Q==",
    -      "requires": {
    -        "@codemirror/rangeset": "^0.19.0",
    -        "@codemirror/state": "^0.19.0",
    -        "@codemirror/view": "^0.19.23"
    -      }
    -    },
    -    "@codemirror/highlight": {
    -      "version": "0.19.8",
    -      "resolved": "https://registry.npmjs.org/@codemirror/highlight/-/highlight-0.19.8.tgz",
    -      "integrity": "sha512-v/lzuHjrYR8MN2mEJcUD6fHSTXXli9C1XGYpr+ElV6fLBIUhMTNKR3qThp611xuWfXfwDxeL7ppcbkM/MzPV3A==",
    -      "requires": {
    -        "@codemirror/language": "^0.19.0",
    -        "@codemirror/rangeset": "^0.19.0",
    -        "@codemirror/state": "^0.19.3",
    -        "@codemirror/view": "^0.19.39",
    -        "@lezer/common": "^0.15.0",
    -        "style-mod": "^4.0.0"
    -      }
    -    },
    -    "@codemirror/history": {
    -      "version": "0.19.2",
    -      "resolved": "https://registry.npmjs.org/@codemirror/history/-/history-0.19.2.tgz",
    -      "integrity": "sha512-unhP4t3N2smzmHoo/Yio6ueWi+il8gm9VKrvi6wlcdGH5fOfVDNkmjHQ495SiR+EdOG35+3iNebSPYww0vN7ow==",
    +      "version": "6.0.0",
    +      "resolved": "https://registry.npmjs.org/@codemirror/commands/-/commands-6.0.0.tgz",
    +      "integrity": "sha512-nVJDPiCQXWXj5AZxqNVXyIM3nOYauF4Dko9NGPSwgVdK+lXWJQhI5LGhS/AvdG5b7u7/pTQBkrQmzkLWRBF62A==",
           "requires": {
    -        "@codemirror/state": "^0.19.2",
    -        "@codemirror/view": "^0.19.0"
    +        "@codemirror/language": "^6.0.0",
    +        "@codemirror/state": "^6.0.0",
    +        "@codemirror/view": "^6.0.0",
    +        "@lezer/common": "^1.0.0"
           }
         },
         "@codemirror/language": {
    -      "version": "0.19.10",
    -      "resolved": "https://registry.npmjs.org/@codemirror/language/-/language-0.19.10.tgz",
    -      "integrity": "sha512-yA0DZ3RYn2CqAAGW62VrU8c4YxscMQn45y/I9sjBlqB1e2OTQLg4CCkMBuMSLXk4xaqjlsgazeOQWaJQOKfV8Q==",
    -      "requires": {
    -        "@codemirror/state": "^0.19.0",
    -        "@codemirror/text": "^0.19.0",
    -        "@codemirror/view": "^0.19.0",
    -        "@lezer/common": "^0.15.5",
    -        "@lezer/lr": "^0.15.0"
    +      "version": "6.0.0",
    +      "resolved": "https://registry.npmjs.org/@codemirror/language/-/language-6.0.0.tgz",
    +      "integrity": "sha512-rtjk5ifyMzOna1c7PBu7J1VCt0PvA5wy3o8eMVnxMKb7z8KA7JFecvD04dSn14vj/bBaAbqRsGed5OjtofEnLA==",
    +      "requires": {
    +        "@codemirror/state": "^6.0.0",
    +        "@codemirror/view": "^6.0.0",
    +        "@lezer/common": "^1.0.0",
    +        "@lezer/highlight": "^1.0.0",
    +        "@lezer/lr": "^1.0.0",
    +        "style-mod": "^4.0.0"
           }
         },
         "@codemirror/lint": {
    -      "version": "0.19.6",
    -      "resolved": "https://registry.npmjs.org/@codemirror/lint/-/lint-0.19.6.tgz",
    -      "integrity": "sha512-Pbw1Y5kHVs2J+itQ0uez3dI4qY9ApYVap7eNfV81x1/3/BXgBkKfadaw0gqJ4h4FDG7OnJwb0VbPsjJQllHjaA==",
    -      "requires": {
    -        "@codemirror/gutter": "^0.19.4",
    -        "@codemirror/panel": "^0.19.0",
    -        "@codemirror/rangeset": "^0.19.1",
    -        "@codemirror/state": "^0.19.4",
    -        "@codemirror/tooltip": "^0.19.16",
    -        "@codemirror/view": "^0.19.22",
    -        "crelt": "^1.0.5"
    -      }
    -    },
    -    "@codemirror/matchbrackets": {
    -      "version": "0.19.4",
    -      "resolved": "https://registry.npmjs.org/@codemirror/matchbrackets/-/matchbrackets-0.19.4.tgz",
    -      "integrity": "sha512-VFkaOKPNudAA5sGP1zikRHCEKU0hjYmkKpr04pybUpQvfTvNJXlReCyP0rvH/1iEwAGPL990ZTT+QrLdu4MeEA==",
    -      "requires": {
    -        "@codemirror/language": "^0.19.0",
    -        "@codemirror/state": "^0.19.0",
    -        "@codemirror/view": "^0.19.0",
    -        "@lezer/common": "^0.15.0"
    -      }
    -    },
    -    "@codemirror/panel": {
    -      "version": "0.19.1",
    -      "resolved": "https://registry.npmjs.org/@codemirror/panel/-/panel-0.19.1.tgz",
    -      "integrity": "sha512-sYeOCMA3KRYxZYJYn5PNlt9yNsjy3zTNTrbYSfVgjgL9QomIVgOJWPO5hZ2sTN8lufO6lw0vTBsIPL9MSidmBg==",
    -      "requires": {
    -        "@codemirror/state": "^0.19.0",
    -        "@codemirror/view": "^0.19.0"
    -      }
    -    },
    -    "@codemirror/rangeset": {
    -      "version": "0.19.9",
    -      "resolved": "https://registry.npmjs.org/@codemirror/rangeset/-/rangeset-0.19.9.tgz",
    -      "integrity": "sha512-V8YUuOvK+ew87Xem+71nKcqu1SXd5QROMRLMS/ljT5/3MCxtgrRie1Cvild0G/Z2f1fpWxzX78V0U4jjXBorBQ==",
    +      "version": "6.0.0",
    +      "resolved": "https://registry.npmjs.org/@codemirror/lint/-/lint-6.0.0.tgz",
    +      "integrity": "sha512-nUUXcJW1Xp54kNs+a1ToPLK8MadO0rMTnJB8Zk4Z8gBdrN0kqV7uvUraU/T2yqg+grDNR38Vmy/MrhQN/RgwiA==",
           "requires": {
    -        "@codemirror/state": "^0.19.0"
    +        "@codemirror/state": "^6.0.0",
    +        "@codemirror/view": "^6.0.0",
    +        "crelt": "^1.0.5"
           }
         },
         "@codemirror/search": {
    -      "version": "0.19.9",
    -      "resolved": "https://registry.npmjs.org/@codemirror/search/-/search-0.19.9.tgz",
    -      "integrity": "sha512-h3MuwbUbiyOp6Np3IB5r4LH0w4inZvbtLO1Ipmz8RhElcGRiYr11Q6Bim8ocLfe08RmZT6B5EkTj1E8eNlugQQ==",
    -      "requires": {
    -        "@codemirror/panel": "^0.19.0",
    -        "@codemirror/rangeset": "^0.19.0",
    -        "@codemirror/state": "^0.19.3",
    -        "@codemirror/text": "^0.19.0",
    -        "@codemirror/view": "^0.19.34",
    +      "version": "6.0.0",
    +      "resolved": "https://registry.npmjs.org/@codemirror/search/-/search-6.0.0.tgz",
    +      "integrity": "sha512-rL0rd3AhI0TAsaJPUaEwC63KHLO7KL0Z/dYozXj6E7L3wNHRyx7RfE0/j5HsIf912EE5n2PCb4Vg0rGYmDv4UQ==",
    +      "requires": {
    +        "@codemirror/state": "^6.0.0",
    +        "@codemirror/view": "^6.0.0",
             "crelt": "^1.0.5"
           }
         },
         "@codemirror/state": {
    -      "version": "0.19.9",
    -      "resolved": "https://registry.npmjs.org/@codemirror/state/-/state-0.19.9.tgz",
    -      "integrity": "sha512-psOzDolKTZkx4CgUqhBQ8T8gBc0xN5z4gzed109aF6x7D7umpDRoimacI/O6d9UGuyl4eYuDCZmDFr2Rq7aGOw==",
    -      "requires": {
    -        "@codemirror/text": "^0.19.0"
    -      }
    -    },
    -    "@codemirror/text": {
    -      "version": "0.19.6",
    -      "resolved": "https://registry.npmjs.org/@codemirror/text/-/text-0.19.6.tgz",
    -      "integrity": "sha512-T9jnREMIygx+TPC1bOuepz18maGq/92q2a+n4qTqObKwvNMg+8cMTslb8yxeEDEq7S3kpgGWxgO1UWbQRij0dA=="
    -    },
    -    "@codemirror/tooltip": {
    -      "version": "0.19.16",
    -      "resolved": "https://registry.npmjs.org/@codemirror/tooltip/-/tooltip-0.19.16.tgz",
    -      "integrity": "sha512-zxKDHryUV5/RS45AQL+wOeN+i7/l81wK56OMnUPoTSzCWNITfxHn7BToDsjtrRKbzHqUxKYmBnn/4hPjpZ4WJQ==",
    -      "requires": {
    -        "@codemirror/state": "^0.19.0",
    -        "@codemirror/view": "^0.19.0"
    -      }
    +      "version": "6.0.0",
    +      "resolved": "https://registry.npmjs.org/@codemirror/state/-/state-6.0.0.tgz",
    +      "integrity": "sha512-UjP/jB2dz7B+1L+eiCm8YWhM1zBkFM2zUyp8hhtpvgmuOFmoWjwqHnICQmM34HNPBqMPcVY9ZcqJcOhDrB+dBQ=="
         },
         "@codemirror/view": {
    -      "version": "0.19.48",
    -      "resolved": "https://registry.npmjs.org/@codemirror/view/-/view-0.19.48.tgz",
    -      "integrity": "sha512-0eg7D2Nz4S8/caetCTz61rK0tkHI17V/d15Jy0kLOT8dTLGGNJUponDnW28h2B6bERmPlVHKh8MJIr5OCp1nGw==",
    +      "version": "6.0.0",
    +      "resolved": "https://registry.npmjs.org/@codemirror/view/-/view-6.0.0.tgz",
    +      "integrity": "sha512-IdbZtg17jpLdNnetoPpSOMZNtsCEAexFNdG7tU6TlJkLQakaTNrzXiQEIx9oiZx3f1ql6Zbr8+qyLr/pkrmsng==",
           "requires": {
    -        "@codemirror/rangeset": "^0.19.5",
    -        "@codemirror/state": "^0.19.3",
    -        "@codemirror/text": "^0.19.0",
    +        "@codemirror/state": "^6.0.0",
             "style-mod": "^4.0.0",
             "w3c-keyname": "^2.2.4"
           }
         },
    -    "@cspotcode/source-map-consumer": {
    -      "version": "0.8.0",
    -      "resolved": "https://registry.npmjs.org/@cspotcode/source-map-consumer/-/source-map-consumer-0.8.0.tgz",
    -      "integrity": "sha512-41qniHzTU8yAGbCp04ohlmSrZf8bkf/iJsl3V0dRGsQN/5GFfx+LbCSsCpp2gqrqjTVg/K6O8ycoV35JIwAzAg==",
    -      "dev": true,
    -      "optional": true,
    -      "peer": true
    -    },
    -    "@cspotcode/source-map-support": {
    -      "version": "0.7.0",
    -      "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.7.0.tgz",
    -      "integrity": "sha512-X4xqRHqN8ACt2aHVe51OxeA2HjbcL4MqFqXkrmQszJ1NOUuUu5u6Vqx/0lZSVNku7velL5FC/s5uEAj1lsBMhA==",
    -      "dev": true,
    -      "optional": true,
    -      "peer": true,
    -      "requires": {
    -        "@cspotcode/source-map-consumer": "0.8.0"
    -      }
    -    },
         "@csstools/normalize.css": {
           "version": "12.0.0",
           "resolved": "https://registry.npmjs.org/@csstools/normalize.css/-/normalize.css-12.0.0.tgz",
           "integrity": "sha512-M0qqxAcwCsIVfpFQSlGN5XjXWu8l5JDZN+fPt1LeW5SZexQTgnaEvgXAY+CeygRw0EeppWHi12JxESWiWrB0Sg==",
           "dev": true
         },
    -    "@csstools/postcss-color-function": {
    +    "@csstools/postcss-cascade-layers": {
           "version": "1.0.3",
    -      "resolved": "https://registry.npmjs.org/@csstools/postcss-color-function/-/postcss-color-function-1.0.3.tgz",
    -      "integrity": "sha512-J26I69pT2B3MYiLY/uzCGKVJyMYVg9TCpXkWsRlt+Yfq+nELUEm72QXIMYXs4xA9cJA4Oqs2EylrfokKl3mJEQ==",
    +      "resolved": "https://registry.npmjs.org/@csstools/postcss-cascade-layers/-/postcss-cascade-layers-1.0.3.tgz",
    +      "integrity": "sha512-fvXP0+dcllGtRKAjA5n5tBr57xWQalKky09hSiXAZ9qqjHn0sDuQV2Jz0Y5zHRQ6iGrAjJZOf2+xQj3yuXfLwA==",
    +      "dev": true,
    +      "requires": {
    +        "@csstools/selector-specificity": "^2.0.0",
    +        "postcss-selector-parser": "^6.0.10"
    +      }
    +    },
    +    "@csstools/postcss-color-function": {
    +      "version": "1.1.0",
    +      "resolved": "https://registry.npmjs.org/@csstools/postcss-color-function/-/postcss-color-function-1.1.0.tgz",
    +      "integrity": "sha512-5D5ND/mZWcQoSfYnSPsXtuiFxhzmhxt6pcjrFLJyldj+p0ZN2vvRpYNX+lahFTtMhAYOa2WmkdGINr0yP0CvGA==",
           "dev": true,
           "requires": {
             "@csstools/postcss-progressive-custom-properties": "^1.1.0",
    @@ -18999,9 +19094,9 @@
           }
         },
         "@csstools/postcss-hwb-function": {
    -      "version": "1.0.0",
    -      "resolved": "https://registry.npmjs.org/@csstools/postcss-hwb-function/-/postcss-hwb-function-1.0.0.tgz",
    -      "integrity": "sha512-VSTd7hGjmde4rTj1rR30sokY3ONJph1reCBTUXqeW1fKwETPy1x4t/XIeaaqbMbC5Xg4SM/lyXZ2S8NELT2TaA==",
    +      "version": "1.0.1",
    +      "resolved": "https://registry.npmjs.org/@csstools/postcss-hwb-function/-/postcss-hwb-function-1.0.1.tgz",
    +      "integrity": "sha512-AMZwWyHbbNLBsDADWmoXT9A5yl5dsGEBeJSJRUJt8Y9n8Ziu7Wstt4MC8jtPW7xjcLecyfJwtnUTNSmOzcnWeg==",
           "dev": true,
           "requires": {
             "postcss-value-parser": "^4.2.0"
    @@ -19018,12 +19113,13 @@
           }
         },
         "@csstools/postcss-is-pseudo-class": {
    -      "version": "2.0.1",
    -      "resolved": "https://registry.npmjs.org/@csstools/postcss-is-pseudo-class/-/postcss-is-pseudo-class-2.0.1.tgz",
    -      "integrity": "sha512-Og5RrTzwFhrKoA79c3MLkfrIBYmwuf/X83s+JQtz/Dkk/MpsaKtqHV1OOzYkogQ+tj3oYp5Mq39XotBXNqVc3Q==",
    +      "version": "2.0.5",
    +      "resolved": "https://registry.npmjs.org/@csstools/postcss-is-pseudo-class/-/postcss-is-pseudo-class-2.0.5.tgz",
    +      "integrity": "sha512-Ek+UFI4UP2hB9u0N1cJd6KgSF1rL0J3PT4is0oSStuus8+WzbGGPyJNMOKQ0w/tyPjxiCnOI4RdSMZt3nks64g==",
           "dev": true,
           "requires": {
    -        "postcss-selector-parser": "^6.0.9"
    +        "@csstools/selector-specificity": "^2.0.0",
    +        "postcss-selector-parser": "^6.0.10"
           }
         },
         "@csstools/postcss-normalize-display-values": {
    @@ -19036,9 +19132,9 @@
           }
         },
         "@csstools/postcss-oklab-function": {
    -      "version": "1.0.2",
    -      "resolved": "https://registry.npmjs.org/@csstools/postcss-oklab-function/-/postcss-oklab-function-1.0.2.tgz",
    -      "integrity": "sha512-QwhWesEkMlp4narAwUi6pgc6kcooh8cC7zfxa9LSQNYXqzcdNUtNBzbGc5nuyAVreb7uf5Ox4qH1vYT3GA1wOg==",
    +      "version": "1.1.0",
    +      "resolved": "https://registry.npmjs.org/@csstools/postcss-oklab-function/-/postcss-oklab-function-1.1.0.tgz",
    +      "integrity": "sha512-e/Q5HopQzmnQgqimG9v3w2IG4VRABsBq3itOcn4bnm+j4enTgQZ0nWsaH/m9GV2otWGQ0nwccYL5vmLKyvP1ww==",
           "dev": true,
           "requires": {
             "@csstools/postcss-progressive-custom-properties": "^1.1.0",
    @@ -19054,20 +19150,52 @@
             "postcss-value-parser": "^4.2.0"
           }
         },
    +    "@csstools/postcss-stepped-value-functions": {
    +      "version": "1.0.0",
    +      "resolved": "https://registry.npmjs.org/@csstools/postcss-stepped-value-functions/-/postcss-stepped-value-functions-1.0.0.tgz",
    +      "integrity": "sha512-q8c4bs1GumAiRenmFjASBcWSLKrbzHzWl6C2HcaAxAXIiL2rUlUWbqQZUjwVG5tied0rld19j/Mm90K3qI26vw==",
    +      "dev": true,
    +      "requires": {
    +        "postcss-value-parser": "^4.2.0"
    +      }
    +    },
    +    "@csstools/postcss-trigonometric-functions": {
    +      "version": "1.0.1",
    +      "resolved": "https://registry.npmjs.org/@csstools/postcss-trigonometric-functions/-/postcss-trigonometric-functions-1.0.1.tgz",
    +      "integrity": "sha512-G78CY/+GePc6dDCTUbwI6TTFQ5fs3N9POHhI6v0QzteGpf6ylARiJUNz9HrRKi4eVYBNXjae1W2766iUEFxHlw==",
    +      "dev": true,
    +      "requires": {
    +        "postcss-value-parser": "^4.2.0"
    +      }
    +    },
    +    "@csstools/postcss-unset-value": {
    +      "version": "1.0.1",
    +      "resolved": "https://registry.npmjs.org/@csstools/postcss-unset-value/-/postcss-unset-value-1.0.1.tgz",
    +      "integrity": "sha512-f1G1WGDXEU/RN1TWAxBPQgQudtLnLQPyiWdtypkPC+mVYNKFKH/HYXSxH4MVNqwF8M0eDsoiU7HumJHCg/L/jg==",
    +      "dev": true,
    +      "requires": {}
    +    },
    +    "@csstools/selector-specificity": {
    +      "version": "2.0.1",
    +      "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-2.0.1.tgz",
    +      "integrity": "sha512-aG20vknL4/YjQF9BSV7ts4EWm/yrjagAN7OWBNmlbEOUiu0llj4OGrFoOKK3g2vey4/p2omKCoHrWtPxSwV3HA==",
    +      "dev": true,
    +      "requires": {}
    +    },
         "@eslint/eslintrc": {
    -      "version": "1.2.1",
    -      "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.2.1.tgz",
    -      "integrity": "sha512-bxvbYnBPN1Gibwyp6NrpnFzA3YtRL3BBAyEAFVIpNTm2Rn4Vy87GA5M4aSn3InRrlsbX5N0GW7XIx+U4SAEKdQ==",
    +      "version": "1.3.0",
    +      "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.3.0.tgz",
    +      "integrity": "sha512-UWW0TMTmk2d7hLcWD1/e2g5HDM/HQ3csaLSqXCfqwh4uNDuNqlaKWXmEsL4Cs41Z0KnILNvwbHAah3C2yt06kw==",
           "dev": true,
           "requires": {
             "ajv": "^6.12.4",
             "debug": "^4.3.2",
    -        "espree": "^9.3.1",
    -        "globals": "^13.9.0",
    +        "espree": "^9.3.2",
    +        "globals": "^13.15.0",
             "ignore": "^5.2.0",
             "import-fresh": "^3.2.1",
             "js-yaml": "^4.1.0",
    -        "minimatch": "^3.0.4",
    +        "minimatch": "^3.1.2",
             "strip-json-comments": "^3.1.1"
           }
         },
    @@ -19158,12 +19286,6 @@
                 "sprintf-js": "~1.0.2"
               }
             },
    -        "camelcase": {
    -          "version": "5.3.1",
    -          "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
    -          "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
    -          "dev": true
    -        },
             "find-up": {
               "version": "4.1.0",
               "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
    @@ -19355,14 +19477,15 @@
             "string-length": "^4.0.1",
             "terminal-link": "^2.0.0",
             "v8-to-istanbul": "^8.1.0"
    -      },
    -      "dependencies": {
    -        "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
    -        }
    +      }
    +    },
    +    "@jest/schemas": {
    +      "version": "28.0.2",
    +      "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-28.0.2.tgz",
    +      "integrity": "sha512-YVDJZjd4izeTDkij00vHHAymNXQ6WWsdChFRK86qck6Jpr3DCL5W3Is3vslviRlP+bLuMYRLbdp98amMvqudhA==",
    +      "dev": true,
    +      "requires": {
    +        "@sinclair/typebox": "^0.23.3"
           }
         },
         "@jest/source-map": {
    @@ -19374,14 +19497,6 @@
             "callsites": "^3.0.0",
             "graceful-fs": "^4.2.9",
             "source-map": "^0.6.0"
    -      },
    -      "dependencies": {
    -        "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
    -        }
           }
         },
         "@jest/test-result": {
    @@ -19429,14 +19544,6 @@
             "slash": "^3.0.0",
             "source-map": "^0.6.1",
             "write-file-atomic": "^3.0.0"
    -      },
    -      "dependencies": {
    -        "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
    -        }
           }
         },
         "@jest/types": {
    @@ -19452,55 +19559,108 @@
             "chalk": "^4.0.0"
           }
         },
    +    "@jridgewell/gen-mapping": {
    +      "version": "0.1.1",
    +      "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz",
    +      "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==",
    +      "dev": true,
    +      "requires": {
    +        "@jridgewell/set-array": "^1.0.0",
    +        "@jridgewell/sourcemap-codec": "^1.4.10"
    +      }
    +    },
         "@jridgewell/resolve-uri": {
    -      "version": "3.0.5",
    -      "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.0.5.tgz",
    -      "integrity": "sha512-VPeQ7+wH0itvQxnG+lIzWgkysKIr3L9sslimFW55rHMdGu/qCQ5z5h9zq4gI8uBtqkpHhsF4Z/OwExufUCThew==",
    +      "version": "3.0.7",
    +      "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.0.7.tgz",
    +      "integrity": "sha512-8cXDaBBHOr2pQ7j77Y6Vp5VDT2sIqWyWQ56TjEq4ih/a4iST3dItRe8Q9fp0rrIl9DoKhWQtUQz/YpOxLkXbNA==",
    +      "dev": true
    +    },
    +    "@jridgewell/set-array": {
    +      "version": "1.1.1",
    +      "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.1.tgz",
    +      "integrity": "sha512-Ct5MqZkLGEXTVmQYbGtx9SVqD2fqwvdubdps5D3djjAkgkKwT918VNOz65pEHFaYTeWcukmJmH5SwsA9Tn2ObQ==",
           "dev": true
         },
    +    "@jridgewell/source-map": {
    +      "version": "0.3.2",
    +      "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.2.tgz",
    +      "integrity": "sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==",
    +      "dev": true,
    +      "requires": {
    +        "@jridgewell/gen-mapping": "^0.3.0",
    +        "@jridgewell/trace-mapping": "^0.3.9"
    +      },
    +      "dependencies": {
    +        "@jridgewell/gen-mapping": {
    +          "version": "0.3.1",
    +          "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.1.tgz",
    +          "integrity": "sha512-GcHwniMlA2z+WFPWuY8lp3fsza0I8xPFMWL5+n8LYyP6PSvPrXf4+n8stDHZY2DM0zy9sVkRDy1jDI4XGzYVqg==",
    +          "dev": true,
    +          "requires": {
    +            "@jridgewell/set-array": "^1.0.0",
    +            "@jridgewell/sourcemap-codec": "^1.4.10",
    +            "@jridgewell/trace-mapping": "^0.3.9"
    +          }
    +        }
    +      }
    +    },
         "@jridgewell/sourcemap-codec": {
    -      "version": "1.4.11",
    -      "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.11.tgz",
    -      "integrity": "sha512-Fg32GrJo61m+VqYSdRSjRXMjQ06j8YIYfcTqndLYVAaHmroZHLJZCydsWBOTDqXS2v+mjxohBWEMfg97GXmYQg==",
    +      "version": "1.4.13",
    +      "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.13.tgz",
    +      "integrity": "sha512-GryiOJmNcWbovBxTfZSF71V/mXbgcV3MewDe3kIMCLyIh5e7SKAeUZs+rMnJ8jkMolZ/4/VsdBmMrw3l+VdZ3w==",
           "dev": true
         },
         "@jridgewell/trace-mapping": {
    -      "version": "0.3.4",
    -      "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.4.tgz",
    -      "integrity": "sha512-vFv9ttIedivx0ux3QSjhgtCVjPZd5l46ZOMDSCwnH1yUO2e964gO8LZGyv2QkqcgR6TnBU1v+1IFqmeoG+0UJQ==",
    +      "version": "0.3.13",
    +      "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.13.tgz",
    +      "integrity": "sha512-o1xbKhp9qnIAoHJSWd6KlCZfqslL4valSF81H8ImioOAxluWYWOpWkpyktY2vnt4tbrX9XYaxovq6cgowaJp2w==",
           "dev": true,
           "requires": {
             "@jridgewell/resolve-uri": "^3.0.3",
             "@jridgewell/sourcemap-codec": "^1.4.10"
           }
         },
    +    "@leichtgewicht/ip-codec": {
    +      "version": "2.0.4",
    +      "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz",
    +      "integrity": "sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==",
    +      "dev": true
    +    },
         "@lezer/common": {
    -      "version": "0.15.12",
    -      "resolved": "https://registry.npmjs.org/@lezer/common/-/common-0.15.12.tgz",
    -      "integrity": "sha512-edfwCxNLnzq5pBA/yaIhwJ3U3Kz8VAUOTRg0hhxaizaI1N+qxV7EXDv/kLCkLeq2RzSFvxexlaj5Mzfn2kY0Ig=="
    +      "version": "1.0.0",
    +      "resolved": "https://registry.npmjs.org/@lezer/common/-/common-1.0.0.tgz",
    +      "integrity": "sha512-ohydQe+Hb+w4oMDvXzs8uuJd2NoA3D8YDcLiuDsLqH+yflDTPEpgCsWI3/6rH5C3BAedtH1/R51dxENldQceEA=="
         },
         "@lezer/generator": {
    -      "version": "0.15.4",
    -      "resolved": "https://registry.npmjs.org/@lezer/generator/-/generator-0.15.4.tgz",
    -      "integrity": "sha512-9bBwU2TzKMBQ6OCEDevuMNWGOBKlkq5YIGEhjrz9pb3MLb+oYYR4dVFZ7ehwLcDoSecsSA7PdlAy0thJO5pt2w==",
    +      "version": "1.0.0",
    +      "resolved": "https://registry.npmjs.org/@lezer/generator/-/generator-1.0.0.tgz",
    +      "integrity": "sha512-MgtTb9O2RxAn+WNfv8z9xOg7Q2orbChs9P3tHLUSBzvRL1PR2wiL/MKFpUnsYFG4mkcTTLkrkQgzUMVYa/ATfA==",
           "dev": true,
           "requires": {
    -        "@lezer/common": "^0.15.0",
    -        "@lezer/lr": "^0.15.0"
    +        "@lezer/common": "^1.0.0",
    +        "@lezer/lr": "^1.0.0"
    +      }
    +    },
    +    "@lezer/highlight": {
    +      "version": "1.0.0",
    +      "resolved": "https://registry.npmjs.org/@lezer/highlight/-/highlight-1.0.0.tgz",
    +      "integrity": "sha512-nsCnNtim90UKsB5YxoX65v3GEIw3iCHw9RM2DtdgkiqAbKh9pCdvi8AWNwkYf10Lu6fxNhXPpkpHbW6mihhvJA==",
    +      "requires": {
    +        "@lezer/common": "^1.0.0"
           }
         },
         "@lezer/lr": {
    -      "version": "0.15.8",
    -      "resolved": "https://registry.npmjs.org/@lezer/lr/-/lr-0.15.8.tgz",
    -      "integrity": "sha512-bM6oE6VQZ6hIFxDNKk8bKPa14hqFrV07J/vHGOeiAbJReIaQXmkVb6xQu4MR+JBTLa5arGRyAAjJe1qaQt3Uvg==",
    +      "version": "1.0.0",
    +      "resolved": "https://registry.npmjs.org/@lezer/lr/-/lr-1.0.0.tgz",
    +      "integrity": "sha512-k6DEqBh4HxqO/cVGedb6Ern6LS7K6IOzfydJ5WaqCR26v6UR9sIFyb6PS+5rPUs/mXgnBR/QQCW7RkyjSCMoQA==",
           "requires": {
    -        "@lezer/common": "^0.15.0"
    +        "@lezer/common": "^1.0.0"
           }
         },
         "@nexucis/fuzzy": {
    -      "version": "0.4.0",
    -      "resolved": "https://registry.npmjs.org/@nexucis/fuzzy/-/fuzzy-0.4.0.tgz",
    -      "integrity": "sha512-VZVzETBXJjFzTd5RmKR+X8V5uM9PKM2yyb7v/aygMF+1iAnZwxzQtxbFx358SNP23eid4s85TIREHw50p8Zugg=="
    +      "version": "0.4.1",
    +      "resolved": "https://registry.npmjs.org/@nexucis/fuzzy/-/fuzzy-0.4.1.tgz",
    +      "integrity": "sha512-oe+IW6ELwVGYL3340M+nKIT1exZizOjxdUFlTs36BqzxTENBbynG+cCWr4RNaUQF3bV78NspKwTBpTlnYADrTA=="
         },
         "@nexucis/kvsearch": {
           "version": "0.7.0",
    @@ -19537,9 +19697,9 @@
           }
         },
         "@pmmmwh/react-refresh-webpack-plugin": {
    -      "version": "0.5.4",
    -      "resolved": "https://registry.npmjs.org/@pmmmwh/react-refresh-webpack-plugin/-/react-refresh-webpack-plugin-0.5.4.tgz",
    -      "integrity": "sha512-zZbZeHQDnoTlt2AF+diQT0wsSXpvWiaIOZwBRdltNFhG1+I3ozyaw7U/nBiUwyJ0D+zwdXp0E3bWOl38Ag2BMw==",
    +      "version": "0.5.7",
    +      "resolved": "https://registry.npmjs.org/@pmmmwh/react-refresh-webpack-plugin/-/react-refresh-webpack-plugin-0.5.7.tgz",
    +      "integrity": "sha512-bcKCAzF0DV2IIROp9ZHkRJa6O4jy7NlnHdWL3GmcUxYWNjLXkK5kfELELwEfSP5hXPfVL/qOGMAROuMQb9GG8Q==",
           "dev": true,
           "requires": {
             "ansi-html-community": "^0.0.8",
    @@ -19597,9 +19757,9 @@
               "dev": true
             },
             "source-map": {
    -          "version": "0.7.3",
    -          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz",
    -          "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==",
    +          "version": "0.7.4",
    +          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz",
    +          "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==",
               "dev": true
             }
           }
    @@ -19607,22 +19767,20 @@
         "@prometheus-io/app": {
           "version": "file:react-app",
           "requires": {
    -        "@codemirror/autocomplete": "^0.19.9",
    -        "@codemirror/closebrackets": "^0.19.0",
    -        "@codemirror/commands": "^0.19.5",
    -        "@codemirror/comment": "^0.19.0",
    -        "@codemirror/highlight": "^0.19.6",
    -        "@codemirror/history": "^0.19.2",
    -        "@codemirror/language": "^0.19.7",
    -        "@codemirror/lint": "^0.19.3",
    -        "@codemirror/matchbrackets": "^0.19.3",
    -        "@codemirror/search": "^0.19.3",
    -        "@codemirror/state": "^0.19.6",
    -        "@codemirror/view": "^0.19.27",
    +        "@codemirror/autocomplete": "^6.0.0",
    +        "@codemirror/commands": "^6.0.0",
    +        "@codemirror/language": "^6.0.0",
    +        "@codemirror/lint": "^6.0.0",
    +        "@codemirror/search": "^6.0.0",
    +        "@codemirror/state": "^6.0.0",
    +        "@codemirror/view": "^6.0.0",
             "@forevolve/bootstrap-dark": "^1.0.0",
             "@fortawesome/fontawesome-svg-core": "6.1.1",
             "@fortawesome/free-solid-svg-icons": "6.1.1",
             "@fortawesome/react-fontawesome": "0.1.17",
    +        "@lezer/common": "^1.0.0",
    +        "@lezer/highlight": "^1.0.0",
    +        "@lezer/lr": "^1.0.0",
             "@nexucis/fuzzy": "^0.4.0",
             "@nexucis/kvsearch": "^0.7.0",
             "@prometheus-io/codemirror-promql": "0.19.0",
    @@ -19669,14 +19827,14 @@
         "@prometheus-io/codemirror-promql": {
           "version": "file:module/codemirror-promql",
           "requires": {
    -        "@codemirror/autocomplete": "^0.19.15",
    -        "@codemirror/highlight": "^0.19.8",
    -        "@codemirror/language": "^0.19.10",
    -        "@codemirror/lint": "^0.19.6",
    -        "@codemirror/state": "^0.19.9",
    -        "@codemirror/view": "^0.19.48",
    -        "@lezer/common": "^0.15.12",
    -        "@lezer/lr": "^0.15.8",
    +        "@codemirror/autocomplete": "^6.0.0",
    +        "@codemirror/language": "^6.0.0",
    +        "@codemirror/lint": "^6.0.0",
    +        "@codemirror/state": "^6.0.0",
    +        "@codemirror/view": "^6.0.0",
    +        "@lezer/common": "^1.0.0",
    +        "@lezer/highlight": "^1.0.0",
    +        "@lezer/lr": "^1.0.0",
             "@prometheus-io/lezer-promql": "0.23.0",
             "@types/lru-cache": "^5.1.1",
             "isomorphic-fetch": "^3.0.0",
    @@ -19687,8 +19845,9 @@
         "@prometheus-io/lezer-promql": {
           "version": "file:module/lezer-promql",
           "requires": {
    -        "@lezer/generator": "^0.15.4",
    -        "@lezer/lr": "^0.15.8"
    +        "@lezer/generator": "^1.0.0",
    +        "@lezer/highlight": "^1.0.0",
    +        "@lezer/lr": "^1.0.0"
           }
         },
         "@rollup/plugin-babel": {
    @@ -19745,9 +19904,15 @@
           }
         },
         "@rushstack/eslint-patch": {
    -      "version": "1.1.1",
    -      "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.1.1.tgz",
    -      "integrity": "sha512-BUyKJGdDWqvWC5GEhyOiUrGNi9iJUr4CU0O2WxJL6QJhHeeA/NVBalH+FeK0r/x/W0rPymXt5s78TDS7d6lCwg==",
    +      "version": "1.1.3",
    +      "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.1.3.tgz",
    +      "integrity": "sha512-WiBSI6JBIhC6LRIsB2Kwh8DsGTlbBU+mLRxJmAe3LjHTdkDpwIbEOZgoXBbZilk/vlfjK8i6nKRAvIRn1XaIMw==",
    +      "dev": true
    +    },
    +    "@sinclair/typebox": {
    +      "version": "0.23.5",
    +      "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.23.5.tgz",
    +      "integrity": "sha512-AFBVi/iT4g20DHoujvMH1aEDn8fGJh4xsRGCP6d8RpLPMqsNPvW01Jcn0QysXTsg++/xj25NmJsGyH9xug/wKg==",
           "dev": true
         },
         "@sinonjs/commons": {
    @@ -19870,6 +20035,14 @@
             "@svgr/plugin-jsx": "^5.5.0",
             "camelcase": "^6.2.0",
             "cosmiconfig": "^7.0.0"
    +      },
    +      "dependencies": {
    +        "camelcase": {
    +          "version": "6.3.0",
    +          "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz",
    +          "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==",
    +          "dev": true
    +        }
           }
         },
         "@svgr/hast-util-to-babel-ast": {
    @@ -19945,38 +20118,6 @@
           "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==",
           "dev": true
         },
    -    "@tsconfig/node10": {
    -      "version": "1.0.8",
    -      "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.8.tgz",
    -      "integrity": "sha512-6XFfSQmMgq0CFLY1MslA/CPUfhIL919M1rMsa5lP2P097N2Wd1sSX0tx1u4olM16fLNhtHZpRhedZJphNJqmZg==",
    -      "dev": true,
    -      "optional": true,
    -      "peer": true
    -    },
    -    "@tsconfig/node12": {
    -      "version": "1.0.9",
    -      "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.9.tgz",
    -      "integrity": "sha512-/yBMcem+fbvhSREH+s14YJi18sp7J9jpuhYByADT2rypfajMZZN4WQ6zBGgBKp53NKmqI36wFYDb3yaMPurITw==",
    -      "dev": true,
    -      "optional": true,
    -      "peer": true
    -    },
    -    "@tsconfig/node14": {
    -      "version": "1.0.1",
    -      "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.1.tgz",
    -      "integrity": "sha512-509r2+yARFfHHE7T6Puu2jjkoycftovhXRqW328PDXTVGKihlb1P8Z9mMZH04ebyajfRY7dedfGynlrFHJUQCg==",
    -      "dev": true,
    -      "optional": true,
    -      "peer": true
    -    },
    -    "@tsconfig/node16": {
    -      "version": "1.0.2",
    -      "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.2.tgz",
    -      "integrity": "sha512-eZxlbI8GZscaGS7kkc/trHTT5xgrjH3/1n2JDwusC9iahPKWMRvRjJSAN5mCXviuTGQ/lHnhvv8Q1YTpnfz9gA==",
    -      "dev": true,
    -      "optional": true,
    -      "peer": true
    -    },
         "@types/babel__core": {
           "version": "7.1.19",
           "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.19.tgz",
    @@ -20010,9 +20151,9 @@
           }
         },
         "@types/babel__traverse": {
    -      "version": "7.14.2",
    -      "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.14.2.tgz",
    -      "integrity": "sha512-K2waXdXBi2302XUdcHcR1jCeU0LL4TD9HRs/gk0N2Xvrht+G/BfJa4QObBQZfhMdxiCpV3COl5Nfq4uKTeTnJA==",
    +      "version": "7.17.1",
    +      "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.17.1.tgz",
    +      "integrity": "sha512-kVzjari1s2YVi77D3w1yuvohV2idweYXMCDzqBiVNN63TcDWrIlTVOYpqVrvbbyOE/IyzBoTKF0fdnLPEORFxA==",
           "dev": true,
           "requires": {
             "@babel/types": "^7.3.0"
    @@ -20066,9 +20207,9 @@
           }
         },
         "@types/enzyme": {
    -      "version": "3.10.11",
    -      "resolved": "https://registry.npmjs.org/@types/enzyme/-/enzyme-3.10.11.tgz",
    -      "integrity": "sha512-LEtC7zXsQlbGXWGcnnmOI7rTyP+i1QzQv4Va91RKXDEukLDaNyxu0rXlfMiGEhJwfgTPCTb0R+Pnlj//oM9e/w==",
    +      "version": "3.10.12",
    +      "resolved": "https://registry.npmjs.org/@types/enzyme/-/enzyme-3.10.12.tgz",
    +      "integrity": "sha512-xryQlOEIe1TduDWAOphR0ihfebKFSWOXpIsk+70JskCfRfW+xALdnJ0r1ZOTo85F9Qsjk6vtlU7edTYHbls9tA==",
           "dev": true,
           "requires": {
             "@types/cheerio": "*",
    @@ -20155,9 +20296,9 @@
           "dev": true
         },
         "@types/http-proxy": {
    -      "version": "1.17.8",
    -      "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.8.tgz",
    -      "integrity": "sha512-5kPLG5BKpWYkw/LVOGWpiq3nEVqxiN32rTgI53Sk12/xHFQ2rG3ehI9IO+O3W2QoKeyB92dJkoka8SUm6BX1pA==",
    +      "version": "1.17.9",
    +      "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.9.tgz",
    +      "integrity": "sha512-QsbSjA/fSk7xB+UXlCT3wHBy5ai9wOcNDWwZAtud+jXhwOM3l+EYZh8Lng4+/6n8uar0J7xILzqftJdJ/Wdfkw==",
           "requires": {
             "@types/node": "*"
           }
    @@ -20187,9 +20328,9 @@
           }
         },
         "@types/jest": {
    -      "version": "27.4.1",
    -      "resolved": "https://registry.npmjs.org/@types/jest/-/jest-27.4.1.tgz",
    -      "integrity": "sha512-23iPJADSmicDVrWk+HT58LMJtzLAnB2AgIzplQuq/bSrGaxCrlvRFjGbXmamnnk/mAmCdLStiGqggu28ocUyiw==",
    +      "version": "27.5.2",
    +      "resolved": "https://registry.npmjs.org/@types/jest/-/jest-27.5.2.tgz",
    +      "integrity": "sha512-mpT8LJJ4CMeeahobofYWIjFo0xonRS/HfxnVEPMPFSQdGUt1uHCnoPT7Zhb+sjDU2wz0oKV0OLUR0WzrHNgfeA==",
           "dev": true,
           "requires": {
             "jest-matcher-utils": "^27.0.0",
    @@ -20206,15 +20347,15 @@
           }
         },
         "@types/json-schema": {
    -      "version": "7.0.10",
    -      "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.10.tgz",
    -      "integrity": "sha512-BLO9bBq59vW3fxCpD4o0N4U+DXsvwvIcl+jofw0frQo/GrBFC+/jRZj1E7kgp6dvTyNmA4y6JCV5Id/r3mNP5A==",
    +      "version": "7.0.11",
    +      "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz",
    +      "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==",
           "dev": true
         },
         "@types/json5": {
           "version": "0.0.29",
           "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz",
    -      "integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=",
    +      "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==",
           "dev": true
         },
         "@types/lru-cache": {
    @@ -20230,9 +20371,9 @@
           "devOptional": true
         },
         "@types/node": {
    -      "version": "17.0.23",
    -      "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.23.tgz",
    -      "integrity": "sha512-UxDxWn7dl97rKVeVS61vErvw086aCYhDLyvRQZ5Rk65rZKepaFdm53GeqXaKBuOhED4e9uWq34IC3TdSdJJ2Gw=="
    +      "version": "17.0.42",
    +      "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.42.tgz",
    +      "integrity": "sha512-Q5BPGyGKcvQgAMbsr7qEGN/kIPN6zZecYYABeTDBizOsau+2NMdSVTar9UQw21A2+JyA2KRNDYaYrPB0Rpk2oQ=="
         },
         "@types/parse-json": {
           "version": "4.0.0",
    @@ -20241,15 +20382,15 @@
           "dev": true
         },
         "@types/prettier": {
    -      "version": "2.4.4",
    -      "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.4.4.tgz",
    -      "integrity": "sha512-ReVR2rLTV1kvtlWFyuot+d1pkpG2Fw/XKE3PDAdj57rbM97ttSp9JZ2UsP+2EHTylra9cUf6JA7tGwW1INzUrA==",
    +      "version": "2.6.3",
    +      "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.6.3.tgz",
    +      "integrity": "sha512-ymZk3LEC/fsut+/Q5qejp6R9O1rMxz3XaRHDV6kX8MrGAhOSPqVARbDi+EZvInBpw+BnCX3TD240byVkOfQsHg==",
           "dev": true
         },
         "@types/prop-types": {
    -      "version": "15.7.4",
    -      "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.4.tgz",
    -      "integrity": "sha512-rZ5drC/jWjrArrS8BR6SIr4cWpW09RNTYt9AMZo3Jwwif+iacXAqgVjm0B0Bv/S1jhDXKHqRVNCbACkJ89RAnQ==",
    +      "version": "15.7.5",
    +      "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz",
    +      "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==",
           "dev": true
         },
         "@types/q": {
    @@ -20271,9 +20412,9 @@
           "devOptional": true
         },
         "@types/react": {
    -      "version": "17.0.41",
    -      "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.41.tgz",
    -      "integrity": "sha512-chYZ9ogWUodyC7VUTRBfblysKLjnohhFY9bGLwvnUFFy48+vB9DikmB3lW0qTFmBcKSzmdglcvkHK71IioOlDA==",
    +      "version": "17.0.45",
    +      "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.45.tgz",
    +      "integrity": "sha512-YfhQ22Lah2e3CHPsb93tRwIGNiSwkuz1/blk4e6QrWS0jQzCSNbGLtOEYhPg02W0yGTTmpajp7dCTbBAMN3qsg==",
           "dev": true,
           "requires": {
             "@types/prop-types": "*",
    @@ -20291,12 +20432,12 @@
           }
         },
         "@types/react-dom": {
    -      "version": "17.0.14",
    -      "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-17.0.14.tgz",
    -      "integrity": "sha512-H03xwEP1oXmSfl3iobtmQ/2dHF5aBHr8aUMwyGZya6OW45G+xtdzmq6HkncefiBt5JU8DVyaWl/nWZbjZCnzAQ==",
    +      "version": "17.0.17",
    +      "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-17.0.17.tgz",
    +      "integrity": "sha512-VjnqEmqGnasQKV0CWLevqMTXBYG9GbwuE6x3VetERLh0cq2LTptFE73MrQi2S7GkKXCf2GgwItB/melLnxfnsg==",
           "dev": true,
           "requires": {
    -        "@types/react": "*"
    +        "@types/react": "^17"
           }
         },
         "@types/react-resize-detector": {
    @@ -20330,9 +20471,9 @@
           }
         },
         "@types/react-test-renderer": {
    -      "version": "17.0.1",
    -      "resolved": "https://registry.npmjs.org/@types/react-test-renderer/-/react-test-renderer-17.0.1.tgz",
    -      "integrity": "sha512-3Fi2O6Zzq/f3QR9dRnlnHso9bMl7weKCviFmfF6B4LS1Uat6Hkm15k0ZAQuDz+UBq6B3+g+NM6IT2nr5QgPzCw==",
    +      "version": "18.0.0",
    +      "resolved": "https://registry.npmjs.org/@types/react-test-renderer/-/react-test-renderer-18.0.0.tgz",
    +      "integrity": "sha512-C7/5FBJ3g3sqUahguGi03O79b8afNeSD6T8/GU50oQrJCU0bVCCGQHaGKUbg2Ce8VQEEqTw8/HiS6lXHHdgkdQ==",
           "dev": true,
           "requires": {
             "@types/react": "*"
    @@ -20353,9 +20494,9 @@
           }
         },
         "@types/retry": {
    -      "version": "0.12.1",
    -      "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.1.tgz",
    -      "integrity": "sha512-xoDlM2S4ortawSWORYqsdU+2rxdh4LRW9ytc3zmT37RIKQh6IHyKwwtKhKis9ah8ol07DCkZxPt8BBvPjC6v4g==",
    +      "version": "0.12.0",
    +      "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz",
    +      "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==",
           "dev": true
         },
         "@types/sanitize-html": {
    @@ -20402,9 +20543,9 @@
           }
         },
         "@types/sinonjs__fake-timers": {
    -      "version": "8.1.1",
    -      "resolved": "https://registry.npmjs.org/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-8.1.1.tgz",
    -      "integrity": "sha512-0kSuKjAS0TrGLJ0M/+8MaFkGsQhZpB6pxOmvS3K8FYI72K//YmdfoW9X2qPsAKh1mkwxGD5zib9s1FIFed6E8g==",
    +      "version": "8.1.2",
    +      "resolved": "https://registry.npmjs.org/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-8.1.2.tgz",
    +      "integrity": "sha512-9GcLXF0/v3t80caGs5p2rRfkB+a8VBGLJZVih6CNFkx8IZ994wiKKLSRs9nuFwk1HevWs/1mnUmkApGrSGsShA==",
           "dev": true
         },
         "@types/sizzle": {
    @@ -20459,26 +20600,26 @@
           "dev": true
         },
         "@typescript-eslint/eslint-plugin": {
    -      "version": "5.16.0",
    -      "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.16.0.tgz",
    -      "integrity": "sha512-SJoba1edXvQRMmNI505Uo4XmGbxCK9ARQpkvOd00anxzri9RNQk0DDCxD+LIl+jYhkzOJiOMMKYEHnHEODjdCw==",
    +      "version": "5.27.1",
    +      "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.27.1.tgz",
    +      "integrity": "sha512-6dM5NKT57ZduNnJfpY81Phe9nc9wolnMCnknb1im6brWi1RYv84nbMS3olJa27B6+irUVV1X/Wb+Am0FjJdGFw==",
           "dev": true,
           "requires": {
    -        "@typescript-eslint/scope-manager": "5.16.0",
    -        "@typescript-eslint/type-utils": "5.16.0",
    -        "@typescript-eslint/utils": "5.16.0",
    -        "debug": "^4.3.2",
    +        "@typescript-eslint/scope-manager": "5.27.1",
    +        "@typescript-eslint/type-utils": "5.27.1",
    +        "@typescript-eslint/utils": "5.27.1",
    +        "debug": "^4.3.4",
             "functional-red-black-tree": "^1.0.1",
    -        "ignore": "^5.1.8",
    +        "ignore": "^5.2.0",
             "regexpp": "^3.2.0",
    -        "semver": "^7.3.5",
    +        "semver": "^7.3.7",
             "tsutils": "^3.21.0"
           },
           "dependencies": {
             "semver": {
    -          "version": "7.3.5",
    -          "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz",
    -          "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==",
    +          "version": "7.3.7",
    +          "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz",
    +          "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==",
               "dev": true,
               "requires": {
                 "lru-cache": "^6.0.0"
    @@ -20487,72 +20628,72 @@
           }
         },
         "@typescript-eslint/experimental-utils": {
    -      "version": "5.16.0",
    -      "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-5.16.0.tgz",
    -      "integrity": "sha512-bitZtqO13XX64/UOQKoDbVg2H4VHzbHnWWlTRc7ofq7SuQyPCwEycF1Zmn5ZAMTJZ3p5uMS7xJGUdOtZK7LrNw==",
    +      "version": "5.27.1",
    +      "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-5.27.1.tgz",
    +      "integrity": "sha512-Vd8uewIixGP93sEnmTRIH6jHZYRQRkGPDPpapACMvitJKX8335VHNyqKTE+mZ+m3E2c5VznTZfSsSsS5IF7vUA==",
           "dev": true,
           "requires": {
    -        "@typescript-eslint/utils": "5.16.0"
    +        "@typescript-eslint/utils": "5.27.1"
           }
         },
         "@typescript-eslint/parser": {
    -      "version": "5.16.0",
    -      "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.16.0.tgz",
    -      "integrity": "sha512-fkDq86F0zl8FicnJtdXakFs4lnuebH6ZADDw6CYQv0UZeIjHvmEw87m9/29nk2Dv5Lmdp0zQ3zDQhiMWQf/GbA==",
    +      "version": "5.27.1",
    +      "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.27.1.tgz",
    +      "integrity": "sha512-7Va2ZOkHi5NP+AZwb5ReLgNF6nWLGTeUJfxdkVUAPPSaAdbWNnFZzLZ4EGGmmiCTg+AwlbE1KyUYTBglosSLHQ==",
           "dev": true,
           "requires": {
    -        "@typescript-eslint/scope-manager": "5.16.0",
    -        "@typescript-eslint/types": "5.16.0",
    -        "@typescript-eslint/typescript-estree": "5.16.0",
    -        "debug": "^4.3.2"
    +        "@typescript-eslint/scope-manager": "5.27.1",
    +        "@typescript-eslint/types": "5.27.1",
    +        "@typescript-eslint/typescript-estree": "5.27.1",
    +        "debug": "^4.3.4"
           }
         },
         "@typescript-eslint/scope-manager": {
    -      "version": "5.16.0",
    -      "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.16.0.tgz",
    -      "integrity": "sha512-P+Yab2Hovg8NekLIR/mOElCDPyGgFZKhGoZA901Yax6WR6HVeGLbsqJkZ+Cvk5nts/dAlFKm8PfL43UZnWdpIQ==",
    +      "version": "5.27.1",
    +      "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.27.1.tgz",
    +      "integrity": "sha512-fQEOSa/QroWE6fAEg+bJxtRZJTH8NTskggybogHt4H9Da8zd4cJji76gA5SBlR0MgtwF7rebxTbDKB49YUCpAg==",
           "dev": true,
           "requires": {
    -        "@typescript-eslint/types": "5.16.0",
    -        "@typescript-eslint/visitor-keys": "5.16.0"
    +        "@typescript-eslint/types": "5.27.1",
    +        "@typescript-eslint/visitor-keys": "5.27.1"
           }
         },
         "@typescript-eslint/type-utils": {
    -      "version": "5.16.0",
    -      "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.16.0.tgz",
    -      "integrity": "sha512-SKygICv54CCRl1Vq5ewwQUJV/8padIWvPgCxlWPGO/OgQLCijY9G7lDu6H+mqfQtbzDNlVjzVWQmeqbLMBLEwQ==",
    +      "version": "5.27.1",
    +      "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.27.1.tgz",
    +      "integrity": "sha512-+UC1vVUWaDHRnC2cQrCJ4QtVjpjjCgjNFpg8b03nERmkHv9JV9X5M19D7UFMd+/G7T/sgFwX2pGmWK38rqyvXw==",
           "dev": true,
           "requires": {
    -        "@typescript-eslint/utils": "5.16.0",
    -        "debug": "^4.3.2",
    +        "@typescript-eslint/utils": "5.27.1",
    +        "debug": "^4.3.4",
             "tsutils": "^3.21.0"
           }
         },
         "@typescript-eslint/types": {
    -      "version": "5.16.0",
    -      "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.16.0.tgz",
    -      "integrity": "sha512-oUorOwLj/3/3p/HFwrp6m/J2VfbLC8gjW5X3awpQJ/bSG+YRGFS4dpsvtQ8T2VNveV+LflQHjlLvB6v0R87z4g==",
    +      "version": "5.27.1",
    +      "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.27.1.tgz",
    +      "integrity": "sha512-LgogNVkBhCTZU/m8XgEYIWICD6m4dmEDbKXESCbqOXfKZxRKeqpiJXQIErv66sdopRKZPo5l32ymNqibYEH/xg==",
           "dev": true
         },
         "@typescript-eslint/typescript-estree": {
    -      "version": "5.16.0",
    -      "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.16.0.tgz",
    -      "integrity": "sha512-SE4VfbLWUZl9MR+ngLSARptUv2E8brY0luCdgmUevU6arZRY/KxYoLI/3V/yxaURR8tLRN7bmZtJdgmzLHI6pQ==",
    +      "version": "5.27.1",
    +      "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.27.1.tgz",
    +      "integrity": "sha512-DnZvvq3TAJ5ke+hk0LklvxwYsnXpRdqUY5gaVS0D4raKtbznPz71UJGnPTHEFo0GDxqLOLdMkkmVZjSpET1hFw==",
           "dev": true,
           "requires": {
    -        "@typescript-eslint/types": "5.16.0",
    -        "@typescript-eslint/visitor-keys": "5.16.0",
    -        "debug": "^4.3.2",
    -        "globby": "^11.0.4",
    +        "@typescript-eslint/types": "5.27.1",
    +        "@typescript-eslint/visitor-keys": "5.27.1",
    +        "debug": "^4.3.4",
    +        "globby": "^11.1.0",
             "is-glob": "^4.0.3",
    -        "semver": "^7.3.5",
    +        "semver": "^7.3.7",
             "tsutils": "^3.21.0"
           },
           "dependencies": {
             "semver": {
    -          "version": "7.3.5",
    -          "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz",
    -          "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==",
    +          "version": "7.3.7",
    +          "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz",
    +          "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==",
               "dev": true,
               "requires": {
                 "lru-cache": "^6.0.0"
    @@ -20561,15 +20702,15 @@
           }
         },
         "@typescript-eslint/utils": {
    -      "version": "5.16.0",
    -      "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.16.0.tgz",
    -      "integrity": "sha512-iYej2ER6AwmejLWMWzJIHy3nPJeGDuCqf8Jnb+jAQVoPpmWzwQOfa9hWVB8GIQE5gsCv/rfN4T+AYb/V06WseQ==",
    +      "version": "5.27.1",
    +      "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.27.1.tgz",
    +      "integrity": "sha512-mZ9WEn1ZLDaVrhRaYgzbkXBkTPghPFsup8zDbbsYTxC5OmqrFE7skkKS/sraVsLP3TcT3Ki5CSyEFBRkLH/H/w==",
           "dev": true,
           "requires": {
             "@types/json-schema": "^7.0.9",
    -        "@typescript-eslint/scope-manager": "5.16.0",
    -        "@typescript-eslint/types": "5.16.0",
    -        "@typescript-eslint/typescript-estree": "5.16.0",
    +        "@typescript-eslint/scope-manager": "5.27.1",
    +        "@typescript-eslint/types": "5.27.1",
    +        "@typescript-eslint/typescript-estree": "5.27.1",
             "eslint-scope": "^5.1.1",
             "eslint-utils": "^3.0.0"
           },
    @@ -20593,13 +20734,13 @@
           }
         },
         "@typescript-eslint/visitor-keys": {
    -      "version": "5.16.0",
    -      "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.16.0.tgz",
    -      "integrity": "sha512-jqxO8msp5vZDhikTwq9ubyMHqZ67UIvawohr4qF3KhlpL7gzSjOd+8471H3nh5LyABkaI85laEKKU8SnGUK5/g==",
    +      "version": "5.27.1",
    +      "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.27.1.tgz",
    +      "integrity": "sha512-xYs6ffo01nhdJgPieyk7HAOpjhTsx7r/oB9LWEhwAXgwn33tkr+W8DI2ChboqhZlC4q3TC6geDYPoiX8ROqyOQ==",
           "dev": true,
           "requires": {
    -        "@typescript-eslint/types": "5.16.0",
    -        "eslint-visitor-keys": "^3.0.0"
    +        "@typescript-eslint/types": "5.27.1",
    +        "eslint-visitor-keys": "^3.3.0"
           }
         },
         "@webassemblyjs/ast": {
    @@ -20749,12 +20890,12 @@
           }
         },
         "@wojtekmaj/enzyme-adapter-react-17": {
    -      "version": "0.6.6",
    -      "resolved": "https://registry.npmjs.org/@wojtekmaj/enzyme-adapter-react-17/-/enzyme-adapter-react-17-0.6.6.tgz",
    -      "integrity": "sha512-gSfhg8CiL0Vwc2UgUblGVZIy7M0KyXaZsd8+QwzV8TSVRLkGyzdLtYEcs9wRWyQTsdmOd+oRGqbVgUX7AVJxug==",
    +      "version": "0.6.7",
    +      "resolved": "https://registry.npmjs.org/@wojtekmaj/enzyme-adapter-react-17/-/enzyme-adapter-react-17-0.6.7.tgz",
    +      "integrity": "sha512-B+byiwi/T1bx5hcj9wc0fUL5Hlb5giSXJzcnEfJVl2j6dGV2NJfcxDBYX0WWwIxlzNiFz8kAvlkFWI2y/nscZQ==",
           "dev": true,
           "requires": {
    -        "@wojtekmaj/enzyme-adapter-utils": "^0.1.2",
    +        "@wojtekmaj/enzyme-adapter-utils": "^0.1.4",
             "enzyme-shallow-equal": "^1.0.0",
             "has": "^1.0.0",
             "prop-types": "^15.7.0",
    @@ -20787,9 +20928,9 @@
           "dev": true
         },
         "abab": {
    -      "version": "2.0.5",
    -      "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.5.tgz",
    -      "integrity": "sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q==",
    +      "version": "2.0.6",
    +      "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz",
    +      "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==",
           "dev": true
         },
         "accepts": {
    @@ -20803,9 +20944,9 @@
           }
         },
         "acorn": {
    -      "version": "8.7.0",
    -      "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.0.tgz",
    -      "integrity": "sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ==",
    +      "version": "8.7.1",
    +      "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.1.tgz",
    +      "integrity": "sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A==",
           "dev": true
         },
         "acorn-globals": {
    @@ -20866,9 +21007,9 @@
           "dev": true
         },
         "address": {
    -      "version": "1.1.2",
    -      "resolved": "https://registry.npmjs.org/address/-/address-1.1.2.tgz",
    -      "integrity": "sha512-aT6camzM4xEA54YVJYSqxz1kv4IHnQZRtThJJHhUMRExaU5spC7jX5ugSwTaTgJliIgs4VhZOk7htClvQ/LmRA==",
    +      "version": "1.2.0",
    +      "resolved": "https://registry.npmjs.org/address/-/address-1.2.0.tgz",
    +      "integrity": "sha512-tNEZYz5G/zYunxFm7sfhAxkXEuLj3K6BKwv6ZURlsF6yiUQ65z0Q2wZW9L5cPUl9ocofGvXOdFYbFHp0+6MOig==",
           "dev": true
         },
         "adjust-sourcemap-loader": {
    @@ -20890,16 +21031,6 @@
             "debug": "4"
           }
         },
    -    "aggregate-error": {
    -      "version": "3.1.0",
    -      "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz",
    -      "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==",
    -      "dev": true,
    -      "requires": {
    -        "clean-stack": "^2.0.0",
    -        "indent-string": "^4.0.0"
    -      }
    -    },
         "ajv": {
           "version": "6.12.6",
           "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
    @@ -20922,9 +21053,9 @@
           },
           "dependencies": {
             "ajv": {
    -          "version": "8.10.0",
    -          "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.10.0.tgz",
    -          "integrity": "sha512-bzqAEZOjkrUMl2afH8dknrq5KEk2SrwdBROR+vH1EKVQTqaUbJVPdc/gEdggTMM0Se+s+Ja4ju4TlNcStKl2Hw==",
    +          "version": "8.11.0",
    +          "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz",
    +          "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==",
               "dev": true,
               "requires": {
                 "fast-deep-equal": "^3.1.1",
    @@ -20996,9 +21127,9 @@
           }
         },
         "arg": {
    -      "version": "5.0.1",
    -      "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.1.tgz",
    -      "integrity": "sha512-e0hDa9H2Z9AwFkk2qDlwhoMYE4eToKarchkQHovNdLTCYMHZHeRjI71crOh+dio4K6u1IcwubQqo79Ga4CyAQA==",
    +      "version": "5.0.2",
    +      "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz",
    +      "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==",
           "dev": true
         },
         "argparse": {
    @@ -21024,14 +21155,14 @@
           "dev": true
         },
         "array-includes": {
    -      "version": "3.1.4",
    -      "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.4.tgz",
    -      "integrity": "sha512-ZTNSQkmWumEbiHO2GF4GmWxYVTiQyJy2XOTa15sdQSrvKn7l+180egQMqlrMOUMCyLMD7pmyQe4mMDUT6Behrw==",
    +      "version": "3.1.5",
    +      "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.5.tgz",
    +      "integrity": "sha512-iSDYZMMyTPkiFasVqfuAQnWAYcvO/SeBSCGKePoEthjp4LEMTe4uLc7b025o4jAZpHhihh8xPo99TNWUWWkGDQ==",
           "dev": true,
           "requires": {
             "call-bind": "^1.0.2",
    -        "define-properties": "^1.1.3",
    -        "es-abstract": "^1.19.1",
    +        "define-properties": "^1.1.4",
    +        "es-abstract": "^1.19.5",
             "get-intrinsic": "^1.1.1",
             "is-string": "^1.0.7"
           }
    @@ -21056,52 +21187,64 @@
           }
         },
         "array.prototype.flat": {
    -      "version": "1.2.5",
    -      "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.5.tgz",
    -      "integrity": "sha512-KaYU+S+ndVqyUnignHftkwc58o3uVU1jzczILJ1tN2YaIZpFIKBiP/x/j97E5MVPsaCloPbqWLB/8qCTVvT2qg==",
    +      "version": "1.3.0",
    +      "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.0.tgz",
    +      "integrity": "sha512-12IUEkHsAhA4DY5s0FPgNXIdc8VRSqD9Zp78a5au9abH/SOBrsp082JOWFNTjkMozh8mqcdiKuaLGhPeYztxSw==",
           "dev": true,
           "requires": {
             "call-bind": "^1.0.2",
             "define-properties": "^1.1.3",
    -        "es-abstract": "^1.19.0"
    +        "es-abstract": "^1.19.2",
    +        "es-shim-unscopables": "^1.0.0"
           }
         },
         "array.prototype.flatmap": {
    -      "version": "1.2.5",
    -      "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.2.5.tgz",
    -      "integrity": "sha512-08u6rVyi1Lj7oqWbS9nUxliETrtIROT4XGTA4D/LWGten6E3ocm7cy9SIrmNHOL5XVbVuckUp3X6Xyg8/zpvHA==",
    +      "version": "1.3.0",
    +      "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.0.tgz",
    +      "integrity": "sha512-PZC9/8TKAIxcWKdyeb77EzULHPrIX/tIZebLJUQOMR1OwYosT8yggdfWScfTBCDj5utONvOuPQQumYsU2ULbkg==",
           "dev": true,
           "requires": {
    -        "call-bind": "^1.0.0",
    +        "call-bind": "^1.0.2",
    +        "define-properties": "^1.1.3",
    +        "es-abstract": "^1.19.2",
    +        "es-shim-unscopables": "^1.0.0"
    +      }
    +    },
    +    "array.prototype.reduce": {
    +      "version": "1.0.4",
    +      "resolved": "https://registry.npmjs.org/array.prototype.reduce/-/array.prototype.reduce-1.0.4.tgz",
    +      "integrity": "sha512-WnM+AjG/DvLRLo4DDl+r+SvCzYtD2Jd9oeBYMcEaI7t3fFrHY9M53/wdLcTvmZNQ70IU6Htj0emFkZ5TS+lrdw==",
    +      "dev": true,
    +      "requires": {
    +        "call-bind": "^1.0.2",
             "define-properties": "^1.1.3",
    -        "es-abstract": "^1.19.0"
    +        "es-abstract": "^1.19.2",
    +        "es-array-method-boxes-properly": "^1.0.0",
    +        "is-string": "^1.0.7"
           }
         },
         "asap": {
           "version": "2.0.6",
           "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz",
    -      "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=",
    +      "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==",
           "dev": true
         },
         "ast-types-flow": {
           "version": "0.0.7",
           "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz",
    -      "integrity": "sha1-9wtzXGvKGlycItmCw+Oef+ujva0=",
    +      "integrity": "sha512-eBvWn1lvIApYMhzQMsu9ciLfkBY499mFZlNqG+/9WR7PVlroQw0vG30cOQQbaKz3sCEc44TAOu2ykzqXSNnwag==",
           "dev": true
         },
         "async": {
    -      "version": "2.6.3",
    -      "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz",
    -      "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==",
    -      "dev": true,
    -      "requires": {
    -        "lodash": "^4.17.14"
    -      }
    +      "version": "3.2.4",
    +      "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz",
    +      "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==",
    +      "dev": true
         },
         "asynckit": {
           "version": "0.4.0",
           "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
    -      "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=",
    +      "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==",
           "dev": true
         },
         "at-least-node": {
    @@ -21111,13 +21254,13 @@
           "dev": true
         },
         "autoprefixer": {
    -      "version": "10.4.4",
    -      "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.4.tgz",
    -      "integrity": "sha512-Tm8JxsB286VweiZ5F0anmbyGiNI3v3wGv3mz9W+cxEDYB/6jbnj6GM9H9mK3wIL8ftgl+C07Lcwb8PG5PCCPzA==",
    +      "version": "10.4.7",
    +      "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.7.tgz",
    +      "integrity": "sha512-ypHju4Y2Oav95SipEcCcI5J7CGPuvz8oat7sUtYj3ClK44bldfvtvcxK6IEK++7rqB7YchDGzweZIBG+SD0ZAA==",
           "dev": true,
           "requires": {
    -        "browserslist": "^4.20.2",
    -        "caniuse-lite": "^1.0.30001317",
    +        "browserslist": "^4.20.3",
    +        "caniuse-lite": "^1.0.30001335",
             "fraction.js": "^4.2.0",
             "normalize-range": "^0.1.2",
             "picocolors": "^1.0.0",
    @@ -21125,9 +21268,9 @@
           }
         },
         "axe-core": {
    -      "version": "4.4.1",
    -      "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.4.1.tgz",
    -      "integrity": "sha512-gd1kmb21kwNuWr6BQz8fv6GNECPBnUasepcoLbekws23NVBLODdsClRZ+bQ8+9Uomf3Sm3+Vwn0oYG9NvwnJCw==",
    +      "version": "4.4.2",
    +      "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.4.2.tgz",
    +      "integrity": "sha512-LVAaGp/wkkgYJcjmHsoKx4juT1aQvJyPcW09MLCjVTh3V2cc6PnyempiLMNH5iMdfIX/zdbjUx2KDjMLCTdPeA==",
           "dev": true
         },
         "axobject-query": {
    @@ -21153,37 +21296,17 @@
           }
         },
         "babel-loader": {
    -      "version": "8.2.3",
    -      "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.2.3.tgz",
    -      "integrity": "sha512-n4Zeta8NC3QAsuyiizu0GkmRcQ6clkV9WFUnUf1iXP//IeSKbWjofW3UHyZVwlOB4y039YQKefawyTn64Zwbuw==",
    +      "version": "8.2.5",
    +      "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.2.5.tgz",
    +      "integrity": "sha512-OSiFfH89LrEMiWd4pLNqGz4CwJDtbs2ZVc+iGu2HrkRfPxId9F2anQj38IxWpmRfsUY0aBZYi1EFcd3mhtRMLQ==",
           "dev": true,
           "requires": {
             "find-cache-dir": "^3.3.1",
    -        "loader-utils": "^1.4.0",
    +        "loader-utils": "^2.0.0",
             "make-dir": "^3.1.0",
    -        "schema-utils": "^2.6.5"
    -      },
    -      "dependencies": {
    -        "json5": {
    -          "version": "1.0.1",
    -          "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz",
    -          "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==",
    -          "dev": true,
    -          "requires": {
    -            "minimist": "^1.2.0"
    -          }
    -        },
    -        "loader-utils": {
    -          "version": "1.4.0",
    -          "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz",
    -          "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==",
    -          "dev": true,
    -          "requires": {
    -            "big.js": "^5.2.2",
    -            "emojis-list": "^3.0.0",
    -            "json5": "^1.0.1"
    -          }
    -        },
    +        "schema-utils": "^2.6.5"
    +      },
    +      "dependencies": {
             "schema-utils": {
               "version": "2.7.1",
               "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz",
    @@ -21348,7 +21471,7 @@
         "batch": {
           "version": "0.6.1",
           "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz",
    -      "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=",
    +      "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==",
           "dev": true
         },
         "bfj": {
    @@ -21381,21 +21504,23 @@
           "dev": true
         },
         "body-parser": {
    -      "version": "1.19.2",
    -      "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.2.tgz",
    -      "integrity": "sha512-SAAwOxgoCKMGs9uUAUFHygfLAyaniaoun6I8mFY9pRAJL9+Kec34aU+oIjDhTycub1jozEfEwx1W1IuOYxVSFw==",
    +      "version": "1.20.0",
    +      "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.0.tgz",
    +      "integrity": "sha512-DfJ+q6EPcGKZD1QWUjSpqp+Q7bDQTsQIF4zfUAtZ6qk+H/3/QRhg9CEp39ss+/T2vw0+HaidC0ecJj/DRLIaKg==",
           "dev": true,
           "requires": {
             "bytes": "3.1.2",
             "content-type": "~1.0.4",
             "debug": "2.6.9",
    -        "depd": "~1.1.2",
    -        "http-errors": "1.8.1",
    +        "depd": "2.0.0",
    +        "destroy": "1.2.0",
    +        "http-errors": "2.0.0",
             "iconv-lite": "0.4.24",
    -        "on-finished": "~2.3.0",
    -        "qs": "6.9.7",
    -        "raw-body": "2.4.3",
    -        "type-is": "~1.6.18"
    +        "on-finished": "2.4.1",
    +        "qs": "6.10.3",
    +        "raw-body": "2.5.1",
    +        "type-is": "~1.6.18",
    +        "unpipe": "1.0.0"
           },
           "dependencies": {
             "bytes": {
    @@ -21425,29 +21550,27 @@
             "ms": {
               "version": "2.0.0",
               "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
    -          "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
    +          "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
               "dev": true
             }
           }
         },
    -    "bonjour": {
    -      "version": "3.5.0",
    -      "resolved": "https://registry.npmjs.org/bonjour/-/bonjour-3.5.0.tgz",
    -      "integrity": "sha1-jokKGD2O6aI5OzhExpGkK897yfU=",
    +    "bonjour-service": {
    +      "version": "1.0.13",
    +      "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.0.13.tgz",
    +      "integrity": "sha512-LWKRU/7EqDUC9CTAQtuZl5HzBALoCYwtLhffW3et7vZMwv3bWLpJf8bRYlMD5OCcDpTfnPgNCV4yo9ZIaJGMiA==",
           "dev": true,
           "requires": {
    -        "array-flatten": "^2.1.0",
    -        "deep-equal": "^1.0.1",
    +        "array-flatten": "^2.1.2",
             "dns-equal": "^1.0.0",
    -        "dns-txt": "^2.0.2",
    -        "multicast-dns": "^6.0.1",
    -        "multicast-dns-service-types": "^1.1.0"
    +        "fast-deep-equal": "^3.1.3",
    +        "multicast-dns": "^7.2.5"
           }
         },
         "boolbase": {
           "version": "1.0.0",
           "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz",
    -      "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=",
    +      "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==",
           "dev": true
         },
         "bootstrap": {
    @@ -21481,15 +21604,15 @@
           "dev": true
         },
         "browserslist": {
    -      "version": "4.20.2",
    -      "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.20.2.tgz",
    -      "integrity": "sha512-CQOBCqp/9pDvDbx3xfMi+86pr4KXIf2FDkTTdeuYw8OxS9t898LA1Khq57gtufFILXpfgsSx5woNgsBgvGjpsA==",
    +      "version": "4.20.4",
    +      "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.20.4.tgz",
    +      "integrity": "sha512-ok1d+1WpnU24XYN7oC3QWgTyMhY/avPJ/r9T00xxvUOIparA/gc+UPUMaod3i+G6s+nI2nUb9xZ5k794uIwShw==",
           "dev": true,
           "requires": {
    -        "caniuse-lite": "^1.0.30001317",
    -        "electron-to-chromium": "^1.4.84",
    +        "caniuse-lite": "^1.0.30001349",
    +        "electron-to-chromium": "^1.4.147",
             "escalade": "^3.1.1",
    -        "node-releases": "^2.0.2",
    +        "node-releases": "^2.0.5",
             "picocolors": "^1.0.0"
           }
         },
    @@ -21517,22 +21640,16 @@
           "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==",
           "dev": true
         },
    -    "buffer-indexof": {
    -      "version": "1.1.1",
    -      "resolved": "https://registry.npmjs.org/buffer-indexof/-/buffer-indexof-1.1.1.tgz",
    -      "integrity": "sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==",
    -      "dev": true
    -    },
         "builtin-modules": {
    -      "version": "3.2.0",
    -      "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.2.0.tgz",
    -      "integrity": "sha512-lGzLKcioL90C7wMczpkY0n/oART3MbBa8R9OFGE1rJxoVI86u4WAGfEk8Wjv10eKSyTHVGkSo3bvBylCEtk7LA==",
    +      "version": "3.3.0",
    +      "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz",
    +      "integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==",
           "dev": true
         },
         "bytes": {
           "version": "3.0.0",
           "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz",
    -      "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=",
    +      "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==",
           "dev": true
         },
         "call-bind": {
    @@ -21561,9 +21678,9 @@
           }
         },
         "camelcase": {
    -      "version": "6.3.0",
    -      "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz",
    -      "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==",
    +      "version": "5.3.1",
    +      "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
    +      "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
           "dev": true
         },
         "camelcase-css": {
    @@ -21585,9 +21702,9 @@
           }
         },
         "caniuse-lite": {
    -      "version": "1.0.30001319",
    -      "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001319.tgz",
    -      "integrity": "sha512-xjlIAFHucBRSMUo1kb5D4LYgcN1M45qdKP++lhqowDpwJwGkpIRTt5qQqnhxjj1vHcI7nrJxWhCC1ATrCEBTcw==",
    +      "version": "1.0.30001352",
    +      "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001352.tgz",
    +      "integrity": "sha512-GUgH8w6YergqPQDGWhJGt8GDRnY0L/iJVQcU3eJ46GYf52R8tk0Wxp0PymuFVZboJYXGiCqwozAYZNRjVj6IcA==",
           "dev": true
         },
         "case-sensitive-paths-webpack-plugin": {
    @@ -21625,31 +21742,47 @@
           "dev": true
         },
         "cheerio": {
    -      "version": "1.0.0-rc.10",
    -      "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.10.tgz",
    -      "integrity": "sha512-g0J0q/O6mW8z5zxQ3A8E8J1hUgp4SMOvEoW/x84OwyHKe/Zccz83PVT4y5Crcr530FV6NgmKI1qvGTKVl9XXVw==",
    +      "version": "1.0.0-rc.11",
    +      "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.11.tgz",
    +      "integrity": "sha512-bQwNaDIBKID5ts/DsdhxrjqFXYfLw4ste+wMKqWA8DyKcS4qwsPP4Bk8ZNaTJjvpiX/qW3BT4sU7d6Bh5i+dag==",
           "dev": true,
           "requires": {
    -        "cheerio-select": "^1.5.0",
    -        "dom-serializer": "^1.3.2",
    -        "domhandler": "^4.2.0",
    -        "htmlparser2": "^6.1.0",
    -        "parse5": "^6.0.1",
    -        "parse5-htmlparser2-tree-adapter": "^6.0.1",
    -        "tslib": "^2.2.0"
    +        "cheerio-select": "^2.1.0",
    +        "dom-serializer": "^2.0.0",
    +        "domhandler": "^5.0.3",
    +        "domutils": "^3.0.1",
    +        "htmlparser2": "^8.0.1",
    +        "parse5": "^7.0.0",
    +        "parse5-htmlparser2-tree-adapter": "^7.0.0",
    +        "tslib": "^2.4.0"
    +      },
    +      "dependencies": {
    +        "htmlparser2": {
    +          "version": "8.0.1",
    +          "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.1.tgz",
    +          "integrity": "sha512-4lVbmc1diZC7GUJQtRQ5yBAeUCL1exyMwmForWkRLnwyzWBFxN633SALPMGYaWZvKe9j1pRZJpauvmxENSp/EA==",
    +          "dev": true,
    +          "requires": {
    +            "domelementtype": "^2.3.0",
    +            "domhandler": "^5.0.2",
    +            "domutils": "^3.0.1",
    +            "entities": "^4.3.0"
    +          }
    +        }
           }
         },
         "cheerio-select": {
    -      "version": "1.5.0",
    -      "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-1.5.0.tgz",
    -      "integrity": "sha512-qocaHPv5ypefh6YNxvnbABM07KMxExbtbfuJoIie3iZXX1ERwYmJcIiRrr9H05ucQP1k28dav8rpdDgjQd8drg==",
    +      "version": "2.1.0",
    +      "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-2.1.0.tgz",
    +      "integrity": "sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==",
           "dev": true,
           "requires": {
    -        "css-select": "^4.1.3",
    -        "css-what": "^5.0.1",
    -        "domelementtype": "^2.2.0",
    -        "domhandler": "^4.2.0",
    -        "domutils": "^2.7.0"
    +        "boolbase": "^1.0.0",
    +        "css-select": "^5.1.0",
    +        "css-what": "^6.1.0",
    +        "domelementtype": "^2.3.0",
    +        "domhandler": "^5.0.3",
    +        "domutils": "^3.0.1"
           }
         },
         "chokidar": {
    @@ -21684,9 +21817,9 @@
           "dev": true
         },
         "ci-info": {
    -      "version": "3.3.0",
    -      "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.3.0.tgz",
    -      "integrity": "sha512-riT/3vI5YpVH6/qomlDnJow6TBee2PBKSEpx3O32EGPYbWGIRsIlGRms3Sm74wYE1JMo8RnO04Hb12+v1J5ICw==",
    +      "version": "3.3.1",
    +      "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.3.1.tgz",
    +      "integrity": "sha512-SXgeMX9VwDe7iFFaEWkA5AstuER9YKqy4EhHqr4DVqkwmD9rpVimkMKWHdjn30Ja45txyjhSn63lVX69eVCckg==",
           "dev": true
         },
         "cjs-module-lexer": {
    @@ -21701,28 +21834,14 @@
           "integrity": "sha512-OlQdbZ7gLfGarSqxesMesDa5uz7KFbID8Kpq/SxIoNGDqY8lSYs0D+hhtBXhcdB3rcbXArFr7vlHheLk1voeNA=="
         },
         "clean-css": {
    -      "version": "5.2.4",
    -      "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.2.4.tgz",
    -      "integrity": "sha512-nKseG8wCzEuji/4yrgM/5cthL9oTDc5UOQyFMvW/Q53oP6gLH690o1NbuTh6Y18nujr7BxlsFuS7gXLnLzKJGg==",
    +      "version": "5.3.0",
    +      "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.0.tgz",
    +      "integrity": "sha512-YYuuxv4H/iNb1Z/5IbMRoxgrzjWGhOEFfd+groZ5dMCVkpENiMZmwspdrzBo9286JjM1gZJPAyL7ZIdzuvu2AQ==",
           "dev": true,
           "requires": {
             "source-map": "~0.6.0"
    -      },
    -      "dependencies": {
    -        "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
    -        }
           }
         },
    -    "clean-stack": {
    -      "version": "2.2.0",
    -      "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz",
    -      "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==",
    -      "dev": true
    -    },
         "cliui": {
           "version": "7.0.4",
           "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz",
    @@ -21737,7 +21856,7 @@
         "co": {
           "version": "4.6.0",
           "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz",
    -      "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=",
    +      "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==",
           "dev": true
         },
         "coa": {
    @@ -21783,19 +21902,19 @@
             "color-name": {
               "version": "1.1.3",
               "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
    -          "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
    +          "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==",
               "dev": true
             },
             "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=",
    +          "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
               "dev": true
             },
             "has-flag": {
               "version": "3.0.0",
               "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
    -          "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
    +          "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==",
               "dev": true
             },
             "supports-color": {
    @@ -21837,9 +21956,9 @@
           "dev": true
         },
         "colorette": {
    -      "version": "2.0.16",
    -      "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.16.tgz",
    -      "integrity": "sha512-hUewv7oMjCp+wkBv5Rm0v87eJhq4woh5rSR+42YSQJKecCqgIqNkZ6lAlQms/BwHPJA5NKMRlpxPRv0n8HQW6g==",
    +      "version": "2.0.17",
    +      "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.17.tgz",
    +      "integrity": "sha512-hJo+3Bkn0NCHybn9Tu35fIeoOKGOk5OCC32y4Hz2It+qlCO2Q3DeQ1hRn/tDDMQKRYUEzqsl7jbF6dYKjlE60g==",
           "dev": true
         },
         "combined-stream": {
    @@ -21872,7 +21991,7 @@
         "commondir": {
           "version": "1.0.1",
           "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz",
    -      "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=",
    +      "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==",
           "dev": true
         },
         "compressible": {
    @@ -21911,7 +22030,7 @@
             "ms": {
               "version": "2.0.0",
               "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
    -          "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
    +          "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
               "dev": true
             }
           }
    @@ -21924,7 +22043,7 @@
         "concat-map": {
           "version": "0.0.1",
           "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
    -      "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
    +      "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
           "dev": true
         },
         "confusing-browser-globals": {
    @@ -21972,15 +22091,15 @@
           }
         },
         "cookie": {
    -      "version": "0.4.2",
    -      "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz",
    -      "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==",
    +      "version": "0.5.0",
    +      "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz",
    +      "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==",
           "dev": true
         },
         "cookie-signature": {
           "version": "1.0.6",
           "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
    -      "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=",
    +      "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==",
           "dev": true
         },
         "copy-to-clipboard": {
    @@ -21992,18 +22111,18 @@
           }
         },
         "core-js": {
    -      "version": "3.21.1",
    -      "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.21.1.tgz",
    -      "integrity": "sha512-FRq5b/VMrWlrmCzwRrpDYNxyHP9BcAZC+xHJaqTgIE5091ZV1NTmyh0sGOg5XqpnHvR0svdy0sv1gWA1zmhxig==",
    +      "version": "3.22.8",
    +      "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.22.8.tgz",
    +      "integrity": "sha512-UoGQ/cfzGYIuiq6Z7vWL1HfkE9U9IZ4Ub+0XSiJTCzvbZzgPA69oDF2f+lgJ6dFFLEdjW5O6svvoKzXX23xFkA==",
           "dev": true
         },
         "core-js-compat": {
    -      "version": "3.21.1",
    -      "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.21.1.tgz",
    -      "integrity": "sha512-gbgX5AUvMb8gwxC7FLVWYT7Kkgu/y7+h/h1X43yJkNqhlK2fuYyQimqvKGNZFAY6CKii/GFKJ2cp/1/42TN36g==",
    +      "version": "3.22.8",
    +      "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.22.8.tgz",
    +      "integrity": "sha512-pQnwg4xtuvc2Bs/5zYQPaEYYSuTxsF7LBWF0SvnVhthZo/Qe+rJpcEekrdNK5DWwDJ0gv0oI9NNX5Mppdy0ctg==",
           "dev": true,
           "requires": {
    -        "browserslist": "^4.19.1",
    +        "browserslist": "^4.20.3",
             "semver": "7.0.0"
           },
           "dependencies": {
    @@ -22016,9 +22135,9 @@
           }
         },
         "core-js-pure": {
    -      "version": "3.21.1",
    -      "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.21.1.tgz",
    -      "integrity": "sha512-12VZfFIu+wyVbBebyHmRTuEE/tZrB4tJToWcwAMcsp3h4+sHR+fMJWbKpYiCRWlhFBq+KNyO8rIV9rTkeVmznQ==",
    +      "version": "3.22.8",
    +      "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.22.8.tgz",
    +      "integrity": "sha512-bOxbZIy9S5n4OVH63XaLVXZ49QKicjowDx/UELyJ68vxfCRpYsbyh/WNZNfEfAk+ekA8vSjt+gCDpvh672bc3w==",
           "dev": true
         },
         "core-util-is": {
    @@ -22040,14 +22159,6 @@
             "yaml": "^1.10.0"
           }
         },
    -    "create-require": {
    -      "version": "1.1.1",
    -      "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz",
    -      "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==",
    -      "dev": true,
    -      "optional": true,
    -      "peer": true
    -    },
         "crelt": {
           "version": "1.0.5",
           "resolved": "https://registry.npmjs.org/crelt/-/crelt-1.0.5.tgz",
    @@ -22089,13 +22200,11 @@
           }
         },
         "css-declaration-sorter": {
    -      "version": "6.1.4",
    -      "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-6.1.4.tgz",
    -      "integrity": "sha512-lpfkqS0fctcmZotJGhnxkIyJWvBXgpyi2wsFd4J8VB7wzyrT6Ch/3Q+FMNJpjK4gu1+GN5khOnpU2ZVKrLbhCw==",
    +      "version": "6.3.0",
    +      "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-6.3.0.tgz",
    +      "integrity": "sha512-OGT677UGHJTAVMRhPO+HJ4oKln3wkBTwtDFH0ojbqm+MJm6xuDMHp2nkhh/ThaBqq20IbraBQSWKfSLNHQO9Og==",
           "dev": true,
    -      "requires": {
    -        "timsort": "^0.3.0"
    -      }
    +      "requires": {}
         },
         "css-has-pseudo": {
           "version": "3.0.4",
    @@ -22123,9 +22232,9 @@
           },
           "dependencies": {
             "semver": {
    -          "version": "7.3.5",
    -          "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz",
    -          "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==",
    +          "version": "7.3.7",
    +          "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz",
    +          "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==",
               "dev": true,
               "requires": {
                 "lru-cache": "^6.0.0"
    @@ -22148,9 +22257,9 @@
           },
           "dependencies": {
             "ajv": {
    -          "version": "8.10.0",
    -          "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.10.0.tgz",
    -          "integrity": "sha512-bzqAEZOjkrUMl2afH8dknrq5KEk2SrwdBROR+vH1EKVQTqaUbJVPdc/gEdggTMM0Se+s+Ja4ju4TlNcStKl2Hw==",
    +          "version": "8.11.0",
    +          "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz",
    +          "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==",
               "dev": true,
               "requires": {
                 "fast-deep-equal": "^3.1.1",
    @@ -22185,12 +22294,6 @@
                 "ajv-formats": "^2.1.1",
                 "ajv-keywords": "^5.0.0"
               }
    -        },
    -        "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
             }
           }
         },
    @@ -22202,15 +22305,15 @@
           "requires": {}
         },
         "css-select": {
    -      "version": "4.2.1",
    -      "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.2.1.tgz",
    -      "integrity": "sha512-/aUslKhzkTNCQUB2qTX84lVmfia9NyjP3WpDGtj/WxhwBzWBYUV3DgUpurHTme8UTPcPlAD1DJ+b0nN/t50zDQ==",
    +      "version": "5.1.0",
    +      "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz",
    +      "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==",
           "dev": true,
           "requires": {
             "boolbase": "^1.0.0",
    -        "css-what": "^5.1.0",
    -        "domhandler": "^4.3.0",
    -        "domutils": "^2.8.0",
    +        "css-what": "^6.1.0",
    +        "domhandler": "^5.0.2",
    +        "domutils": "^3.0.1",
             "nth-check": "^2.0.1"
           }
         },
    @@ -22228,31 +22331,23 @@
           "requires": {
             "mdn-data": "2.0.4",
             "source-map": "^0.6.1"
    -      },
    -      "dependencies": {
    -        "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
    -        }
           }
         },
         "css-what": {
    -      "version": "5.1.0",
    -      "resolved": "https://registry.npmjs.org/css-what/-/css-what-5.1.0.tgz",
    -      "integrity": "sha512-arSMRWIIFY0hV8pIxZMEfmMI47Wj3R/aWpZDDxWYCPEiOMv6tfOrnpDtgxBYPEQD4V0Y/958+1TdC3iWTFcUPw==",
    +      "version": "6.1.0",
    +      "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz",
    +      "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==",
           "dev": true
         },
         "css.escape": {
           "version": "1.5.1",
           "resolved": "https://registry.npmjs.org/css.escape/-/css.escape-1.5.1.tgz",
    -      "integrity": "sha1-QuJ9T6BK4y+TGktNQZH6nN3ul8s="
    +      "integrity": "sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg=="
         },
         "cssdb": {
    -      "version": "6.5.0",
    -      "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-6.5.0.tgz",
    -      "integrity": "sha512-Rh7AAopF2ckPXe/VBcoUS9JrCZNSyc60+KpgE6X25vpVxA32TmiqvExjkfhwP4wGSb6Xe8Z/JIyGqwgx/zZYFA==",
    +      "version": "6.6.3",
    +      "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-6.6.3.tgz",
    +      "integrity": "sha512-7GDvDSmE+20+WcSMhP17Q1EVWUrLlbxxpMDqG731n8P99JhnQZHR9YvtjPvEHfjFUjvQJvdpKCjlKOX+xe4UVA==",
           "dev": true
         },
         "cssesc": {
    @@ -22264,41 +22359,41 @@
         "cssfontparser": {
           "version": "1.2.1",
           "resolved": "https://registry.npmjs.org/cssfontparser/-/cssfontparser-1.2.1.tgz",
    -      "integrity": "sha1-9AIvyPlwDGgCnVQghK+69CWj8+M=",
    +      "integrity": "sha512-6tun4LoZnj7VN6YeegOVb67KBX/7JJsqvj+pv3ZA7F878/eN33AbGa5b/S/wXxS/tcp8nc40xRUrsPlxIyNUPg==",
           "dev": true
         },
         "cssnano": {
    -      "version": "5.1.5",
    -      "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-5.1.5.tgz",
    -      "integrity": "sha512-VZO1e+bRRVixMeia1zKagrv0lLN1B/r/u12STGNNUFxnp97LIFgZHQa0JxqlwEkvzUyA9Oz/WnCTAFkdEbONmg==",
    +      "version": "5.1.11",
    +      "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-5.1.11.tgz",
    +      "integrity": "sha512-2nx+O6LvewPo5EBtYrKc8762mMkZRk9cMGIOP4UlkmxHm7ObxH+zvsJJ+qLwPkUc4/yumL/qJkavYi9NlodWIQ==",
           "dev": true,
           "requires": {
    -        "cssnano-preset-default": "^5.2.5",
    +        "cssnano-preset-default": "^5.2.11",
             "lilconfig": "^2.0.3",
             "yaml": "^1.10.2"
           }
         },
         "cssnano-preset-default": {
    -      "version": "5.2.5",
    -      "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-5.2.5.tgz",
    -      "integrity": "sha512-WopL7PzN7sos3X8B54/QGl+CZUh1f0qN4ds+y2d5EPwRSSc3jsitVw81O+Uyop0pXyOfPfZxnc+LmA8w/Ki/WQ==",
    +      "version": "5.2.11",
    +      "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-5.2.11.tgz",
    +      "integrity": "sha512-4PadR1NtuaIK8MvLNuY7MznK4WJteldGlzCiMaaTiOUP+apeiIvUDIXykzUOoqgOOUAHrU64ncdD90NfZR3LSQ==",
           "dev": true,
           "requires": {
    -        "css-declaration-sorter": "^6.0.3",
    +        "css-declaration-sorter": "^6.2.2",
             "cssnano-utils": "^3.1.0",
             "postcss-calc": "^8.2.3",
             "postcss-colormin": "^5.3.0",
    -        "postcss-convert-values": "^5.1.0",
    -        "postcss-discard-comments": "^5.1.1",
    +        "postcss-convert-values": "^5.1.2",
    +        "postcss-discard-comments": "^5.1.2",
             "postcss-discard-duplicates": "^5.1.0",
             "postcss-discard-empty": "^5.1.1",
             "postcss-discard-overridden": "^5.1.0",
    -        "postcss-merge-longhand": "^5.1.3",
    -        "postcss-merge-rules": "^5.1.1",
    +        "postcss-merge-longhand": "^5.1.5",
    +        "postcss-merge-rules": "^5.1.2",
             "postcss-minify-font-values": "^5.1.0",
             "postcss-minify-gradients": "^5.1.1",
    -        "postcss-minify-params": "^5.1.2",
    -        "postcss-minify-selectors": "^5.2.0",
    +        "postcss-minify-params": "^5.1.3",
    +        "postcss-minify-selectors": "^5.2.1",
             "postcss-normalize-charset": "^5.1.0",
             "postcss-normalize-display-values": "^5.1.0",
             "postcss-normalize-positions": "^5.1.0",
    @@ -22308,7 +22403,7 @@
             "postcss-normalize-unicode": "^5.1.0",
             "postcss-normalize-url": "^5.1.0",
             "postcss-normalize-whitespace": "^5.1.1",
    -        "postcss-ordered-values": "^5.1.1",
    +        "postcss-ordered-values": "^5.1.2",
             "postcss-reduce-initial": "^5.1.0",
             "postcss-reduce-transforms": "^5.1.0",
             "postcss-svgo": "^5.1.0",
    @@ -22346,12 +22441,6 @@
               "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz",
               "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==",
               "dev": true
    -        },
    -        "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
             }
           }
         },
    @@ -22379,9 +22468,9 @@
           }
         },
         "csstype": {
    -      "version": "3.0.11",
    -      "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.11.tgz",
    -      "integrity": "sha512-sa6P2wJ+CAbgyy4KFssIb/JNMLxFvKF1pCYCSXS8ZMuqZnMsrxqI2E5sPyoTpxoPU/gVZMzr2zjOfg8GIZOMsw==",
    +      "version": "3.1.0",
    +      "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.0.tgz",
    +      "integrity": "sha512-uX1KG+x9h5hIJsaKR9xHUeUraxf8IODOwq9JLNPq6BwB04a/xgpq3rcx47l5BZu5zBPlgD342tdke3Hom/nJRA==",
           "dev": true
         },
         "damerau-levenshtein": {
    @@ -22399,28 +22488,6 @@
             "abab": "^2.0.3",
             "whatwg-mimetype": "^2.3.0",
             "whatwg-url": "^8.0.0"
    -      },
    -      "dependencies": {
    -        "tr46": {
    -          "version": "2.1.0",
    -          "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz",
    -          "integrity": "sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==",
    -          "dev": true,
    -          "requires": {
    -            "punycode": "^2.1.1"
    -          }
    -        },
    -        "whatwg-url": {
    -          "version": "8.7.0",
    -          "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.7.0.tgz",
    -          "integrity": "sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==",
    -          "dev": true,
    -          "requires": {
    -            "lodash": "^4.7.0",
    -            "tr46": "^2.1.0",
    -            "webidl-conversions": "^6.1.0"
    -          }
    -        }
           }
         },
         "debug": {
    @@ -22441,7 +22508,7 @@
         "dedent": {
           "version": "0.7.0",
           "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz",
    -      "integrity": "sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw=",
    +      "integrity": "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==",
           "dev": true
         },
         "deep-equal": {
    @@ -22484,51 +22551,36 @@
           "dev": true
         },
         "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==",
    +      "version": "1.1.4",
    +      "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz",
    +      "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==",
           "requires": {
    -        "object-keys": "^1.0.12"
    +        "has-property-descriptors": "^1.0.0",
    +        "object-keys": "^1.1.1"
           }
         },
         "defined": {
           "version": "1.0.0",
           "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz",
    -      "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=",
    +      "integrity": "sha512-Y2caI5+ZwS5c3RiNDJ6u53VhQHv+hHKwhkI1iHvceKUHw9Df6EK2zRLfjejRgMuCuxK7PfSWIMwWecceVvThjQ==",
           "dev": true
         },
    -    "del": {
    -      "version": "6.0.0",
    -      "resolved": "https://registry.npmjs.org/del/-/del-6.0.0.tgz",
    -      "integrity": "sha512-1shh9DQ23L16oXSZKB2JxpL7iMy2E0S9d517ptA1P8iw0alkPtQcrKH7ru31rYtKwF499HkTu+DRzq3TCKDFRQ==",
    -      "dev": true,
    -      "requires": {
    -        "globby": "^11.0.1",
    -        "graceful-fs": "^4.2.4",
    -        "is-glob": "^4.0.1",
    -        "is-path-cwd": "^2.2.0",
    -        "is-path-inside": "^3.0.2",
    -        "p-map": "^4.0.0",
    -        "rimraf": "^3.0.2",
    -        "slash": "^3.0.0"
    -      }
    -    },
         "delayed-stream": {
           "version": "1.0.0",
           "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
    -      "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=",
    +      "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==",
           "dev": true
         },
         "depd": {
    -      "version": "1.1.2",
    -      "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
    -      "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=",
    +      "version": "2.0.0",
    +      "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
    +      "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==",
           "dev": true
         },
         "destroy": {
    -      "version": "1.0.4",
    -      "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz",
    -      "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=",
    +      "version": "1.2.0",
    +      "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz",
    +      "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==",
           "dev": true
         },
         "detect-newline": {
    @@ -22565,20 +22617,20 @@
             "ms": {
               "version": "2.0.0",
               "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
    -          "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
    +          "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
               "dev": true
             }
           }
         },
         "detective": {
    -      "version": "5.2.0",
    -      "resolved": "https://registry.npmjs.org/detective/-/detective-5.2.0.tgz",
    -      "integrity": "sha512-6SsIx+nUUbuK0EthKjv0zrdnajCCXVYGmbYYiYjFVpzcjwEs/JMDZ8tPRG29J/HhN56t3GJp2cGSWDRjjot8Pg==",
    +      "version": "5.2.1",
    +      "resolved": "https://registry.npmjs.org/detective/-/detective-5.2.1.tgz",
    +      "integrity": "sha512-v9XE1zRnz1wRtgurGu0Bs8uHKFSTdteYZNbIPFVhUZ39L/S79ppMpdmVOZAnoz1jfEFodc48n6MX483Xo3t1yw==",
           "dev": true,
           "requires": {
    -        "acorn-node": "^1.6.1",
    +        "acorn-node": "^1.8.2",
             "defined": "^1.0.0",
    -        "minimist": "^1.1.1"
    +        "minimist": "^1.2.6"
           }
         },
         "didyoumean": {
    @@ -22588,9 +22640,9 @@
           "dev": true
         },
         "diff": {
    -      "version": "5.0.0",
    -      "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz",
    -      "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==",
    +      "version": "5.1.0",
    +      "resolved": "https://registry.npmjs.org/diff/-/diff-5.1.0.tgz",
    +      "integrity": "sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw==",
           "dev": true
         },
         "diff-sequences": {
    @@ -22611,7 +22663,7 @@
         "discontinuous-range": {
           "version": "1.0.0",
           "resolved": "https://registry.npmjs.org/discontinuous-range/-/discontinuous-range-1.0.0.tgz",
    -      "integrity": "sha1-44Mx8IRLukm5qctxx3FYWqsbxlo=",
    +      "integrity": "sha512-c68LpLbO+7kP/b1Hr1qs8/BJ09F5khZGTxqxZuhzxpmwJKOgRFHJWIb9/KmqnqHhLdO55aOxFH/EGBvUQbL/RQ==",
           "dev": true
         },
         "dlv": {
    @@ -22623,26 +22675,16 @@
         "dns-equal": {
           "version": "1.0.0",
           "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz",
    -      "integrity": "sha1-s55/HabrCnW6nBcySzR1PEfgZU0=",
    +      "integrity": "sha512-z+paD6YUQsk+AbGCEM4PrOXSss5gd66QfcVBFTKR/HpFL9jCqikS94HYwKww6fQyO7IxrIIyUu+g0Ka9tUS2Cg==",
           "dev": true
         },
         "dns-packet": {
    -      "version": "1.3.4",
    -      "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.4.tgz",
    -      "integrity": "sha512-BQ6F4vycLXBvdrJZ6S3gZewt6rcrks9KBgM9vrhW+knGRqc8uEdT7fuCwloc7nny5xNoMJ17HGH0R/6fpo8ECA==",
    -      "dev": true,
    -      "requires": {
    -        "ip": "^1.1.0",
    -        "safe-buffer": "^5.0.1"
    -      }
    -    },
    -    "dns-txt": {
    -      "version": "2.0.2",
    -      "resolved": "https://registry.npmjs.org/dns-txt/-/dns-txt-2.0.2.tgz",
    -      "integrity": "sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY=",
    +      "version": "5.3.1",
    +      "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.3.1.tgz",
    +      "integrity": "sha512-spBwIj0TK0Ey3666GwIdWVfUpLyubpU53BTCu8iPn4r4oXd9O14Hjg3EHw3ts2oed77/SeckunUYCyRlSngqHw==",
           "dev": true,
           "requires": {
    -        "buffer-indexof": "^1.0.0"
    +        "@leichtgewicht/ip-codec": "^2.0.1"
           }
         },
         "doctrine": {
    @@ -22672,19 +22714,20 @@
           }
         },
         "dom-serializer": {
    -      "version": "1.3.2",
    -      "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.3.2.tgz",
    -      "integrity": "sha512-5c54Bk5Dw4qAxNOI1pFEizPSjVsx5+bpJKmL2kPn8JhBUq2q09tTCa3mjijun2NfK78NMouDYNMBkOrPZiS+ig==",
    +      "version": "2.0.0",
    +      "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz",
    +      "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==",
    +      "dev": true,
           "requires": {
    -        "domelementtype": "^2.0.1",
    -        "domhandler": "^4.2.0",
    -        "entities": "^2.0.0"
    +        "domelementtype": "^2.3.0",
    +        "domhandler": "^5.0.2",
    +        "entities": "^4.2.0"
           }
         },
         "domelementtype": {
    -      "version": "2.2.0",
    -      "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz",
    -      "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A=="
    +      "version": "2.3.0",
    +      "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz",
    +      "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw=="
         },
         "domexception": {
           "version": "2.0.1",
    @@ -22704,21 +22747,23 @@
           }
         },
         "domhandler": {
    -      "version": "4.3.1",
    -      "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz",
    -      "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==",
    +      "version": "5.0.3",
    +      "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz",
    +      "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==",
    +      "dev": true,
           "requires": {
    -        "domelementtype": "^2.2.0"
    +        "domelementtype": "^2.3.0"
           }
         },
         "domutils": {
    -      "version": "2.8.0",
    -      "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz",
    -      "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==",
    +      "version": "3.0.1",
    +      "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.0.1.tgz",
    +      "integrity": "sha512-z08c1l761iKhDFtfXO04C7kTdPBLi41zwOZl00WS8b5eiaebNpY00HKbztwBq+e3vyqWNwWF3mP9YLUeqIrF+Q==",
    +      "dev": true,
           "requires": {
    -        "dom-serializer": "^1.0.1",
    -        "domelementtype": "^2.2.0",
    -        "domhandler": "^4.2.0"
    +        "dom-serializer": "^2.0.0",
    +        "domelementtype": "^2.3.0",
    +        "domhandler": "^5.0.1"
           }
         },
         "dot-case": {
    @@ -22764,22 +22809,22 @@
         "ee-first": {
           "version": "1.1.1",
           "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
    -      "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=",
    +      "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==",
           "dev": true
         },
         "ejs": {
    -      "version": "3.1.6",
    -      "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.6.tgz",
    -      "integrity": "sha512-9lt9Zse4hPucPkoP7FHDF0LQAlGyF9JVpnClFLFH3aSSbxmyoqINRpp/9wePWJTUl4KOQwRL72Iw3InHPDkoGw==",
    +      "version": "3.1.8",
    +      "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.8.tgz",
    +      "integrity": "sha512-/sXZeMlhS0ArkfX2Aw780gJzXSMPnKjtspYZv+f3NiKLlubezAHDU5+9xz6gd3/NhG3txQCo6xlglmTS+oTGEQ==",
           "dev": true,
           "requires": {
    -        "jake": "^10.6.1"
    +        "jake": "^10.8.5"
           }
         },
         "electron-to-chromium": {
    -      "version": "1.4.89",
    -      "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.89.tgz",
    -      "integrity": "sha512-z1Axg0Fu54fse8wN4fd+GAINdU5mJmLtcl6bqIcYyzNVGONcfHAeeJi88KYMQVKalhXlYuVPzKkFIU5VD0raUw==",
    +      "version": "1.4.152",
    +      "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.152.tgz",
    +      "integrity": "sha512-jk4Ju5SGZAQQJ1iI4Rgru7dDlvkQPLpNPWH9gIZmwCD4YteA5Bbk1xPcPDUf5jUYs3e1e80RXdi8XgKQZaigeg==",
           "dev": true
         },
         "emittery": {
    @@ -22803,13 +22848,13 @@
         "encodeurl": {
           "version": "1.0.2",
           "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
    -      "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=",
    +      "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==",
           "dev": true
         },
         "enhanced-resolve": {
    -      "version": "5.9.2",
    -      "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.9.2.tgz",
    -      "integrity": "sha512-GIm3fQfwLJ8YZx2smuHpBKkXC1yOk+OBEmKckVyL0i/ea8mqDEykK3ld5dgH1QYPNyT/lIllxV2LULnxCHaHkA==",
    +      "version": "5.9.3",
    +      "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.9.3.tgz",
    +      "integrity": "sha512-Bq9VSor+kjvW3f9/MiiR4eE3XYgOl7/rS8lnSxbRbF3kS0B2r+Y9w5krBWxZgDxASVZbdYrn5wT4j/Wb0J9qow==",
           "dev": true,
           "requires": {
             "graceful-fs": "^4.2.4",
    @@ -22817,9 +22862,10 @@
           }
         },
         "entities": {
    -      "version": "2.2.0",
    -      "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz",
    -      "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A=="
    +      "version": "4.3.0",
    +      "resolved": "https://registry.npmjs.org/entities/-/entities-4.3.0.tgz",
    +      "integrity": "sha512-/iP1rZrSEJ0DTlPiX+jbzlA3eVkY/e8L8SozroF395fIqE3TYF/Nz7YOMAawta+vLmyJ/hkGNNPcSbMADCCXbg==",
    +      "dev": true
         },
         "enzyme": {
           "version": "3.11.0",
    @@ -22890,40 +22936,43 @@
           }
         },
         "error-stack-parser": {
    -      "version": "2.0.7",
    -      "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.0.7.tgz",
    -      "integrity": "sha512-chLOW0ZGRf4s8raLrDxa5sdkvPec5YdvwbFnqJme4rk0rFajP8mPtrDL1+I+CwrQDCjswDA5sREX7jYQDQs9vA==",
    +      "version": "2.1.4",
    +      "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.1.4.tgz",
    +      "integrity": "sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==",
           "dev": true,
           "requires": {
    -        "stackframe": "^1.1.1"
    +        "stackframe": "^1.3.4"
           }
         },
         "es-abstract": {
    -      "version": "1.19.1",
    -      "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.19.1.tgz",
    -      "integrity": "sha512-2vJ6tjA/UfqLm2MPs7jxVybLoB8i1t1Jd9R3kISld20sIxPcTbLuggQOUxeWeAvIUkduv/CfMjuh4WmiXr2v9w==",
    +      "version": "1.20.1",
    +      "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.1.tgz",
    +      "integrity": "sha512-WEm2oBhfoI2sImeM4OF2zE2V3BYdSF+KnSi9Sidz51fQHd7+JuF8Xgcj9/0o+OWeIeIS/MiuNnlruQrJf16GQA==",
           "dev": true,
           "requires": {
             "call-bind": "^1.0.2",
             "es-to-primitive": "^1.2.1",
             "function-bind": "^1.1.1",
    +        "function.prototype.name": "^1.1.5",
             "get-intrinsic": "^1.1.1",
             "get-symbol-description": "^1.0.0",
             "has": "^1.0.3",
    -        "has-symbols": "^1.0.2",
    +        "has-property-descriptors": "^1.0.0",
    +        "has-symbols": "^1.0.3",
             "internal-slot": "^1.0.3",
             "is-callable": "^1.2.4",
    -        "is-negative-zero": "^2.0.1",
    +        "is-negative-zero": "^2.0.2",
             "is-regex": "^1.1.4",
    -        "is-shared-array-buffer": "^1.0.1",
    +        "is-shared-array-buffer": "^1.0.2",
             "is-string": "^1.0.7",
    -        "is-weakref": "^1.0.1",
    -        "object-inspect": "^1.11.0",
    +        "is-weakref": "^1.0.2",
    +        "object-inspect": "^1.12.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"
    +        "regexp.prototype.flags": "^1.4.3",
    +        "string.prototype.trimend": "^1.0.5",
    +        "string.prototype.trimstart": "^1.0.5",
    +        "unbox-primitive": "^1.0.2"
           }
         },
         "es-array-method-boxes-properly": {
    @@ -22938,6 +22987,15 @@
           "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==",
           "dev": true
         },
    +    "es-shim-unscopables": {
    +      "version": "1.0.0",
    +      "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz",
    +      "integrity": "sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==",
    +      "dev": true,
    +      "requires": {
    +        "has": "^1.0.3"
    +      }
    +    },
         "es-to-primitive": {
           "version": "1.2.1",
           "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz",
    @@ -22958,7 +23016,7 @@
         "escape-html": {
           "version": "1.0.3",
           "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
    -      "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=",
    +      "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==",
           "dev": true
         },
         "escape-string-regexp": {
    @@ -22982,7 +23040,7 @@
             "levn": {
               "version": "0.3.0",
               "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz",
    -          "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=",
    +          "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==",
               "dev": true,
               "requires": {
                 "prelude-ls": "~1.1.2",
    @@ -23006,20 +23064,13 @@
             "prelude-ls": {
               "version": "1.1.2",
               "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz",
    -          "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=",
    +          "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==",
               "dev": true
             },
    -        "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,
    -          "optional": true
    -        },
             "type-check": {
               "version": "0.3.2",
               "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz",
    -          "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=",
    +          "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==",
               "dev": true,
               "requires": {
                 "prelude-ls": "~1.1.2"
    @@ -23028,12 +23079,12 @@
           }
         },
         "eslint": {
    -      "version": "8.11.0",
    -      "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.11.0.tgz",
    -      "integrity": "sha512-/KRpd9mIRg2raGxHRGwW9ZywYNAClZrHjdueHcrVDuO3a6bj83eoTirCCk0M0yPwOjWYKHwRVRid+xK4F/GHgA==",
    +      "version": "8.17.0",
    +      "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.17.0.tgz",
    +      "integrity": "sha512-gq0m0BTJfci60Fz4nczYxNAlED+sMcihltndR8t9t1evnU/azx53x3t2UHXC/uRjcbvRw/XctpaNygSTcQD+Iw==",
           "dev": true,
           "requires": {
    -        "@eslint/eslintrc": "^1.2.1",
    +        "@eslint/eslintrc": "^1.3.0",
             "@humanwhocodes/config-array": "^0.9.2",
             "ajv": "^6.10.0",
             "chalk": "^4.0.0",
    @@ -23044,14 +23095,14 @@
             "eslint-scope": "^7.1.1",
             "eslint-utils": "^3.0.0",
             "eslint-visitor-keys": "^3.3.0",
    -        "espree": "^9.3.1",
    +        "espree": "^9.3.2",
             "esquery": "^1.4.0",
             "esutils": "^2.0.2",
             "fast-deep-equal": "^3.1.3",
             "file-entry-cache": "^6.0.1",
             "functional-red-black-tree": "^1.0.1",
             "glob-parent": "^6.0.1",
    -        "globals": "^13.6.0",
    +        "globals": "^13.15.0",
             "ignore": "^5.2.0",
             "import-fresh": "^3.0.0",
             "imurmurhash": "^0.1.4",
    @@ -23060,7 +23111,7 @@
             "json-stable-stringify-without-jsonify": "^1.0.1",
             "levn": "^0.4.1",
             "lodash.merge": "^4.6.2",
    -        "minimatch": "^3.0.4",
    +        "minimatch": "^3.1.2",
             "natural-compare": "^1.4.0",
             "optionator": "^0.9.1",
             "regexpp": "^3.2.0",
    @@ -23078,9 +23129,9 @@
           "requires": {}
         },
         "eslint-config-react-app": {
    -      "version": "7.0.0",
    -      "resolved": "https://registry.npmjs.org/eslint-config-react-app/-/eslint-config-react-app-7.0.0.tgz",
    -      "integrity": "sha512-xyymoxtIt1EOsSaGag+/jmcywRuieQoA2JbPCjnw9HukFj9/97aGPoZVFioaotzk1K5Qt9sHO5EutZbkrAXS0g==",
    +      "version": "7.0.1",
    +      "resolved": "https://registry.npmjs.org/eslint-config-react-app/-/eslint-config-react-app-7.0.1.tgz",
    +      "integrity": "sha512-K6rNzvkIeHaTd8m/QEh1Zko0KI7BACWkkneSs6s9cKZC/J27X3eZR6Upt1jkmZ/4FK+XUOPPxMEN7+lbUXfSlA==",
           "dev": true,
           "requires": {
             "@babel/core": "^7.16.0",
    @@ -23152,9 +23203,9 @@
           }
         },
         "eslint-plugin-import": {
    -      "version": "2.25.4",
    -      "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.25.4.tgz",
    -      "integrity": "sha512-/KJBASVFxpu0xg1kIBn9AUa8hQVnszpwgE7Ld0lKAlx7Ie87yzEzCgSkekt+le/YVhiaosO4Y14GDAOc41nfxA==",
    +      "version": "2.26.0",
    +      "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.26.0.tgz",
    +      "integrity": "sha512-hYfi3FXaM8WPLf4S1cikh/r4IxnO6zrhZbEGz2b660EJRbuxgpDS5gkCuYgGWg2xxh2rBuIr4Pvhve/7c31koA==",
           "dev": true,
           "requires": {
             "array-includes": "^3.1.4",
    @@ -23162,14 +23213,14 @@
             "debug": "^2.6.9",
             "doctrine": "^2.1.0",
             "eslint-import-resolver-node": "^0.3.6",
    -        "eslint-module-utils": "^2.7.2",
    +        "eslint-module-utils": "^2.7.3",
             "has": "^1.0.3",
    -        "is-core-module": "^2.8.0",
    +        "is-core-module": "^2.8.1",
             "is-glob": "^4.0.3",
    -        "minimatch": "^3.0.4",
    +        "minimatch": "^3.1.2",
             "object.values": "^1.1.5",
    -        "resolve": "^1.20.0",
    -        "tsconfig-paths": "^3.12.0"
    +        "resolve": "^1.22.0",
    +        "tsconfig-paths": "^3.14.1"
           },
           "dependencies": {
             "debug": {
    @@ -23193,7 +23244,7 @@
             "ms": {
               "version": "2.0.0",
               "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
    -          "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
    +          "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
               "dev": true
             }
           }
    @@ -23237,25 +23288,25 @@
           }
         },
         "eslint-plugin-react": {
    -      "version": "7.29.4",
    -      "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.29.4.tgz",
    -      "integrity": "sha512-CVCXajliVh509PcZYRFyu/BoUEz452+jtQJq2b3Bae4v3xBUWPLCmtmBM+ZinG4MzwmxJgJ2M5rMqhqLVn7MtQ==",
    +      "version": "7.30.0",
    +      "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.30.0.tgz",
    +      "integrity": "sha512-RgwH7hjW48BleKsYyHK5vUAvxtE9SMPDKmcPRQgtRCYaZA0XQPt5FSkrU3nhz5ifzMZcA8opwmRJ2cmOO8tr5A==",
           "dev": true,
           "requires": {
    -        "array-includes": "^3.1.4",
    -        "array.prototype.flatmap": "^1.2.5",
    +        "array-includes": "^3.1.5",
    +        "array.prototype.flatmap": "^1.3.0",
             "doctrine": "^2.1.0",
             "estraverse": "^5.3.0",
             "jsx-ast-utils": "^2.4.1 || ^3.0.0",
             "minimatch": "^3.1.2",
             "object.entries": "^1.1.5",
             "object.fromentries": "^2.0.5",
    -        "object.hasown": "^1.1.0",
    +        "object.hasown": "^1.1.1",
             "object.values": "^1.1.5",
             "prop-types": "^15.8.1",
             "resolve": "^2.0.0-next.3",
             "semver": "^6.3.0",
    -        "string.prototype.matchall": "^4.0.6"
    +        "string.prototype.matchall": "^4.0.7"
           },
           "dependencies": {
             "doctrine": {
    @@ -23280,16 +23331,16 @@
           }
         },
         "eslint-plugin-react-hooks": {
    -      "version": "4.3.0",
    -      "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.3.0.tgz",
    -      "integrity": "sha512-XslZy0LnMn+84NEG9jSGR6eGqaZB3133L8xewQo3fQagbQuGt7a63gf+P1NGKZavEYEC3UXaWEAA/AqDkuN6xA==",
    +      "version": "4.5.0",
    +      "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.5.0.tgz",
    +      "integrity": "sha512-8k1gRt7D7h03kd+SAAlzXkQwWK22BnK6GKZG+FJA6BAGy22CFvl8kCIXKpVux0cCxMWDQUPqSok0LKaZ0aOcCw==",
           "dev": true,
           "requires": {}
         },
         "eslint-plugin-testing-library": {
    -      "version": "5.1.0",
    -      "resolved": "https://registry.npmjs.org/eslint-plugin-testing-library/-/eslint-plugin-testing-library-5.1.0.tgz",
    -      "integrity": "sha512-YSNzasJUbyhOTe14ZPygeOBvcPvcaNkwHwrj4vdf+uirr2D32JTDaKi6CP5Os2aWtOcvt4uBSPXp9h5xGoqvWQ==",
    +      "version": "5.5.1",
    +      "resolved": "https://registry.npmjs.org/eslint-plugin-testing-library/-/eslint-plugin-testing-library-5.5.1.tgz",
    +      "integrity": "sha512-plLEkkbAKBjPxsLj7x4jNapcHAg2ernkQlKKrN2I8NrQwPISZHyCUNvg5Hv3EDqOQReToQb5bnqXYbkijJPE/g==",
           "dev": true,
           "requires": {
             "@typescript-eslint/utils": "^5.13.0"
    @@ -23342,13 +23393,13 @@
           }
         },
         "espree": {
    -      "version": "9.3.1",
    -      "resolved": "https://registry.npmjs.org/espree/-/espree-9.3.1.tgz",
    -      "integrity": "sha512-bvdyLmJMfwkV3NCRl5ZhJf22zBFo1y8bYh3VYb+bfzqNB4Je68P2sSuXyuFquzWLebHpNd2/d5uv7yoP9ISnGQ==",
    +      "version": "9.3.2",
    +      "resolved": "https://registry.npmjs.org/espree/-/espree-9.3.2.tgz",
    +      "integrity": "sha512-D211tC7ZwouTIuY5x9XnS0E9sWNChB7IYKX/Xp5eQj3nFXhqmiUDB9q27y76oFl8jTg3pXcQx/bpxMfs3CIZbA==",
           "dev": true,
           "requires": {
    -        "acorn": "^8.7.0",
    -        "acorn-jsx": "^5.3.1",
    +        "acorn": "^8.7.1",
    +        "acorn-jsx": "^5.3.2",
             "eslint-visitor-keys": "^3.3.0"
           }
         },
    @@ -23397,7 +23448,7 @@
         "etag": {
           "version": "1.8.1",
           "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
    -      "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=",
    +      "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==",
           "dev": true
         },
         "eventemitter3": {
    @@ -23431,7 +23482,7 @@
         "exit": {
           "version": "0.1.2",
           "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz",
    -      "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=",
    +      "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==",
           "dev": true
         },
         "expect": {
    @@ -23447,38 +23498,39 @@
           }
         },
         "express": {
    -      "version": "4.17.3",
    -      "resolved": "https://registry.npmjs.org/express/-/express-4.17.3.tgz",
    -      "integrity": "sha512-yuSQpz5I+Ch7gFrPCk4/c+dIBKlQUxtgwqzph132bsT6qhuzss6I8cLJQz7B3rFblzd6wtcI0ZbGltH/C4LjUg==",
    +      "version": "4.18.1",
    +      "resolved": "https://registry.npmjs.org/express/-/express-4.18.1.tgz",
    +      "integrity": "sha512-zZBcOX9TfehHQhtupq57OF8lFZ3UZi08Y97dwFCkD8p9d/d2Y3M+ykKcwaMDEL+4qyUolgBDX6AblpR3fL212Q==",
           "dev": true,
           "requires": {
             "accepts": "~1.3.8",
             "array-flatten": "1.1.1",
    -        "body-parser": "1.19.2",
    +        "body-parser": "1.20.0",
             "content-disposition": "0.5.4",
             "content-type": "~1.0.4",
    -        "cookie": "0.4.2",
    +        "cookie": "0.5.0",
             "cookie-signature": "1.0.6",
             "debug": "2.6.9",
    -        "depd": "~1.1.2",
    +        "depd": "2.0.0",
             "encodeurl": "~1.0.2",
             "escape-html": "~1.0.3",
             "etag": "~1.8.1",
    -        "finalhandler": "~1.1.2",
    +        "finalhandler": "1.2.0",
             "fresh": "0.5.2",
    +        "http-errors": "2.0.0",
             "merge-descriptors": "1.0.1",
             "methods": "~1.1.2",
    -        "on-finished": "~2.3.0",
    +        "on-finished": "2.4.1",
             "parseurl": "~1.3.3",
             "path-to-regexp": "0.1.7",
             "proxy-addr": "~2.0.7",
    -        "qs": "6.9.7",
    +        "qs": "6.10.3",
             "range-parser": "~1.2.1",
             "safe-buffer": "5.2.1",
    -        "send": "0.17.2",
    -        "serve-static": "1.14.2",
    +        "send": "0.18.0",
    +        "serve-static": "1.15.0",
             "setprototypeof": "1.2.0",
    -        "statuses": "~1.5.0",
    +        "statuses": "2.0.1",
             "type-is": "~1.6.18",
             "utils-merge": "1.0.1",
             "vary": "~1.1.2"
    @@ -23487,7 +23539,7 @@
             "array-flatten": {
               "version": "1.1.1",
               "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
    -          "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=",
    +          "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==",
               "dev": true
             },
             "debug": {
    @@ -23502,7 +23554,13 @@
             "ms": {
               "version": "2.0.0",
               "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
    -          "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
    +          "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
    +          "dev": true
    +        },
    +        "path-to-regexp": {
    +          "version": "0.1.7",
    +          "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
    +          "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==",
               "dev": true
             },
             "safe-buffer": {
    @@ -23558,7 +23616,7 @@
         "fast-levenshtein": {
           "version": "2.0.6",
           "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
    -      "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=",
    +      "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==",
           "dev": true
         },
         "fastq": {
    @@ -23608,12 +23666,32 @@
           }
         },
         "filelist": {
    -      "version": "1.0.2",
    -      "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.2.tgz",
    -      "integrity": "sha512-z7O0IS8Plc39rTCq6i6iHxk43duYOn8uFJiWSewIq0Bww1RNybVHSCjahmcC87ZqAm4OTvFzlzeGu3XAzG1ctQ==",
    +      "version": "1.0.4",
    +      "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz",
    +      "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==",
           "dev": true,
           "requires": {
    -        "minimatch": "^3.0.4"
    +        "minimatch": "^5.0.1"
    +      },
    +      "dependencies": {
    +        "brace-expansion": {
    +          "version": "2.0.1",
    +          "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
    +          "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
    +          "dev": true,
    +          "requires": {
    +            "balanced-match": "^1.0.0"
    +          }
    +        },
    +        "minimatch": {
    +          "version": "5.1.0",
    +          "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.0.tgz",
    +          "integrity": "sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg==",
    +          "dev": true,
    +          "requires": {
    +            "brace-expansion": "^2.0.1"
    +          }
    +        }
           }
         },
         "filesize": {
    @@ -23631,17 +23709,17 @@
           }
         },
         "finalhandler": {
    -      "version": "1.1.2",
    -      "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz",
    -      "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==",
    +      "version": "1.2.0",
    +      "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz",
    +      "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==",
           "dev": true,
           "requires": {
             "debug": "2.6.9",
             "encodeurl": "~1.0.2",
             "escape-html": "~1.0.3",
    -        "on-finished": "~2.3.0",
    +        "on-finished": "2.4.1",
             "parseurl": "~1.3.3",
    -        "statuses": "~1.5.0",
    +        "statuses": "2.0.1",
             "unpipe": "~1.0.0"
           },
           "dependencies": {
    @@ -23657,7 +23735,7 @@
             "ms": {
               "version": "2.0.0",
               "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
    -          "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
    +          "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
               "dev": true
             }
           }
    @@ -23676,7 +23754,7 @@
         "find-up": {
           "version": "2.1.0",
           "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz",
    -      "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=",
    +      "integrity": "sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==",
           "dev": true,
           "requires": {
             "locate-path": "^2.0.0"
    @@ -23699,14 +23777,14 @@
           "dev": true
         },
         "follow-redirects": {
    -      "version": "1.14.9",
    -      "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.9.tgz",
    -      "integrity": "sha512-MQDfihBQYMcyy5dhRDJUHcw7lb2Pv/TuE6xP1vyraLukNDHKbDxDNaOE3NbCAdKQApno+GPRyo1YAp89yCjK4w=="
    +      "version": "1.15.1",
    +      "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.1.tgz",
    +      "integrity": "sha512-yLAMQs+k0b2m7cVxpS1VKJVvoz7SS9Td1zss3XRwXj+ZDH00RJgnuLx7E44wx02kQLrdM3aOOy+FpzS7+8OizA=="
         },
         "fork-ts-checker-webpack-plugin": {
    -      "version": "6.5.0",
    -      "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-6.5.0.tgz",
    -      "integrity": "sha512-cS178Y+xxtIjEUorcHddKS7yCMlrDPV31mt47blKKRfMd70Kxu5xruAFE2o9sDY6wVC5deuob/u/alD04YYHnw==",
    +      "version": "6.5.2",
    +      "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-6.5.2.tgz",
    +      "integrity": "sha512-m5cUmF30xkZ7h4tWUgTAcEaKmUW7tfyUyTqNNOz7OxWJ0v1VWKTcOvH8FWHUwSjlW/356Ijc9vi3XfcPstpQKA==",
           "dev": true,
           "requires": {
             "@babel/code-frame": "^7.8.3",
    @@ -23761,9 +23839,9 @@
               }
             },
             "semver": {
    -          "version": "7.3.5",
    -          "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz",
    -          "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==",
    +          "version": "7.3.7",
    +          "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz",
    +          "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==",
               "dev": true,
               "requires": {
                 "lru-cache": "^6.0.0"
    @@ -23803,13 +23881,13 @@
         "fresh": {
           "version": "0.5.2",
           "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
    -      "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=",
    +      "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==",
           "dev": true
         },
         "fs-extra": {
    -      "version": "10.0.1",
    -      "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.0.1.tgz",
    -      "integrity": "sha512-NbdoVMZso2Lsrn/QwLXOy6rm0ufY2zEOKCDzJR/0kBsb0E6qed0P3iYK+Ath3BfvXEeu4JhEtXLgILx5psUfag==",
    +      "version": "10.1.0",
    +      "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz",
    +      "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==",
           "dev": true,
           "requires": {
             "graceful-fs": "^4.2.0",
    @@ -23826,7 +23904,7 @@
         "fs.realpath": {
           "version": "1.0.0",
           "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
    -      "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
    +      "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==",
           "dev": true
         },
         "fsevents": {
    @@ -23855,14 +23933,13 @@
         "functional-red-black-tree": {
           "version": "1.0.1",
           "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz",
    -      "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=",
    +      "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==",
           "dev": true
         },
         "functions-have-names": {
    -      "version": "1.2.2",
    -      "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.2.tgz",
    -      "integrity": "sha512-bLgc3asbWdwPbx2mNk2S49kmJCuQeu0nfmaOgbs8WIyzzkw3r4htszdIi9Q9EMezDPTYuJx2wvjZ/EwgAthpnA==",
    -      "dev": true
    +      "version": "1.2.3",
    +      "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz",
    +      "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ=="
         },
         "gensync": {
           "version": "1.0.0-beta.2",
    @@ -23877,13 +23954,13 @@
           "dev": true
         },
         "get-intrinsic": {
    -      "version": "1.1.1",
    -      "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz",
    -      "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==",
    +      "version": "1.1.2",
    +      "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.2.tgz",
    +      "integrity": "sha512-Jfm3OyCxHh9DJyc28qGk+JmfkpO41A4XkneDSujN9MDXrm4oDKdHvndhZ2dN94+ERNfkYJWDclW6k2L/ZGHjXA==",
           "requires": {
             "function-bind": "^1.1.1",
             "has": "^1.0.3",
    -        "has-symbols": "^1.0.1"
    +        "has-symbols": "^1.0.3"
           }
         },
         "get-own-enumerable-property-symbols": {
    @@ -23915,15 +23992,15 @@
           }
         },
         "glob": {
    -      "version": "7.2.0",
    -      "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz",
    -      "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==",
    +      "version": "7.2.3",
    +      "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
    +      "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
           "dev": true,
           "requires": {
             "fs.realpath": "^1.0.0",
             "inflight": "^1.0.4",
             "inherits": "2",
    -        "minimatch": "^3.0.4",
    +        "minimatch": "^3.1.1",
             "once": "^1.3.0",
             "path-is-absolute": "^1.0.0"
           }
    @@ -23975,9 +24052,9 @@
           }
         },
         "globals": {
    -      "version": "13.13.0",
    -      "resolved": "https://registry.npmjs.org/globals/-/globals-13.13.0.tgz",
    -      "integrity": "sha512-EQ7Q18AJlPwp3vUDL4mKA0KXrXyNIQyWon6T6XQiBQF0XHvRsiCSrWmmeATpUzdJN2HhWZU6Pdl0a9zdep5p6A==",
    +      "version": "13.15.0",
    +      "resolved": "https://registry.npmjs.org/globals/-/globals-13.15.0.tgz",
    +      "integrity": "sha512-bpzcOlgDhMG070Av0Vy5Owklpv1I6+j96GhUI7Rh7IzDCKLzboflLrrfqMu8NquDbiR4EOQk7XzJwqVJxicxog==",
           "dev": true,
           "requires": {
             "type-fest": "^0.20.2"
    @@ -23998,9 +24075,9 @@
           }
         },
         "graceful-fs": {
    -      "version": "4.2.9",
    -      "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.9.tgz",
    -      "integrity": "sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ==",
    +      "version": "4.2.10",
    +      "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz",
    +      "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==",
           "dev": true
         },
         "gud": {
    @@ -24038,9 +24115,9 @@
           }
         },
         "has-bigints": {
    -      "version": "1.0.1",
    -      "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz",
    -      "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==",
    +      "version": "1.0.2",
    +      "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz",
    +      "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==",
           "dev": true
         },
         "has-flag": {
    @@ -24049,6 +24126,14 @@
           "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
           "dev": true
         },
    +    "has-property-descriptors": {
    +      "version": "1.0.0",
    +      "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz",
    +      "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==",
    +      "requires": {
    +        "get-intrinsic": "^1.1.1"
    +      }
    +    },
         "has-symbols": {
           "version": "1.0.3",
           "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz",
    @@ -24105,7 +24190,7 @@
         "hpack.js": {
           "version": "2.1.6",
           "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz",
    -      "integrity": "sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI=",
    +      "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==",
           "dev": true,
           "requires": {
             "inherits": "^2.0.1",
    @@ -24114,6 +24199,12 @@
             "wbuf": "^1.1.0"
           },
           "dependencies": {
    +        "isarray": {
    +          "version": "1.0.0",
    +          "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
    +          "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==",
    +          "dev": true
    +        },
             "readable-stream": {
               "version": "2.3.7",
               "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
    @@ -24160,9 +24251,9 @@
           }
         },
         "html-entities": {
    -      "version": "2.3.2",
    -      "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.3.2.tgz",
    -      "integrity": "sha512-c3Ab/url5ksaT0WyleslpBEthOzWhrjQbg75y7XUsfSzi3Dgzt0l8w5e7DylRn15MTlMMD58dTfzddNS2kcAjQ==",
    +      "version": "2.3.3",
    +      "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.3.3.tgz",
    +      "integrity": "sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA==",
           "dev": true
         },
         "html-escaper": {
    @@ -24208,24 +24299,59 @@
             "domhandler": "^4.0.0",
             "domutils": "^2.5.2",
             "entities": "^2.0.0"
    +      },
    +      "dependencies": {
    +        "dom-serializer": {
    +          "version": "1.4.1",
    +          "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz",
    +          "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==",
    +          "requires": {
    +            "domelementtype": "^2.0.1",
    +            "domhandler": "^4.2.0",
    +            "entities": "^2.0.0"
    +          }
    +        },
    +        "domhandler": {
    +          "version": "4.3.1",
    +          "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz",
    +          "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==",
    +          "requires": {
    +            "domelementtype": "^2.2.0"
    +          }
    +        },
    +        "domutils": {
    +          "version": "2.8.0",
    +          "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz",
    +          "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==",
    +          "requires": {
    +            "dom-serializer": "^1.0.1",
    +            "domelementtype": "^2.2.0",
    +            "domhandler": "^4.2.0"
    +          }
    +        },
    +        "entities": {
    +          "version": "2.2.0",
    +          "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz",
    +          "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A=="
    +        }
           }
         },
         "http-deceiver": {
           "version": "1.2.7",
           "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz",
    -      "integrity": "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc=",
    +      "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==",
           "dev": true
         },
         "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==",
    +      "version": "2.0.0",
    +      "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz",
    +      "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==",
           "dev": true,
           "requires": {
    -        "depd": "~1.1.2",
    +        "depd": "2.0.0",
             "inherits": "2.0.4",
             "setprototypeof": "1.2.0",
    -        "statuses": ">= 1.5.0 < 2",
    +        "statuses": "2.0.1",
             "toidentifier": "1.0.1"
           }
         },
    @@ -24269,9 +24395,9 @@
           }
         },
         "https-proxy-agent": {
    -      "version": "5.0.0",
    -      "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz",
    -      "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==",
    +      "version": "5.0.1",
    +      "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz",
    +      "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==",
           "dev": true,
           "requires": {
             "agent-base": "6",
    @@ -24309,7 +24435,7 @@
         "identity-obj-proxy": {
           "version": "3.0.0",
           "resolved": "https://registry.npmjs.org/identity-obj-proxy/-/identity-obj-proxy-3.0.0.tgz",
    -      "integrity": "sha1-lNK9qWCERT7zb7xarsN+D3nx/BQ=",
    +      "integrity": "sha512-00n6YnVHKrinT9t0d9+5yZC6UBNJANpYEQvL2LlX6Ab9lnmxzIRcEmTPuyGScvl1+jKuCICX1Z0Ab1pPKKdikA==",
           "dev": true,
           "requires": {
             "harmony-reflect": "^1.4.6"
    @@ -24322,15 +24448,15 @@
           "dev": true
         },
         "immer": {
    -      "version": "9.0.12",
    -      "resolved": "https://registry.npmjs.org/immer/-/immer-9.0.12.tgz",
    -      "integrity": "sha512-lk7UNmSbAukB5B6dh9fnh5D0bJTOFKxVg2cyJWTYrWRfhLrLMBquONcUs3aFq507hNoIZEDDh8lb8UtOizSMhA==",
    +      "version": "9.0.15",
    +      "resolved": "https://registry.npmjs.org/immer/-/immer-9.0.15.tgz",
    +      "integrity": "sha512-2eB/sswms9AEUSkOm4SbV5Y7Vmt/bKRwByd52jfLkW4OLYeaTP3EEiJ9agqU0O/tq6Dk62Zfj+TJSqfm1rLVGQ==",
           "dev": true
         },
         "immutable": {
    -      "version": "4.0.0",
    -      "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.0.0.tgz",
    -      "integrity": "sha512-zIE9hX70qew5qTUjSS7wi1iwj/l7+m54KWU247nhM3v806UdGj1yDndXj+IOYxxtW9zyLI+xqFNZjTuDaLUqFw=="
    +      "version": "4.1.0",
    +      "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.1.0.tgz",
    +      "integrity": "sha512-oNkuqVTA8jqG1Q6c+UglTOD1xhC1BtjKI7XkCXRkZHrN5m18/XsnUp8Q89GkQO/z+0WjonSvl0FLhDYftp46nQ=="
         },
         "import-fresh": {
           "version": "3.3.0",
    @@ -24355,19 +24481,13 @@
         "imurmurhash": {
           "version": "0.1.4",
           "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
    -      "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=",
    -      "dev": true
    -    },
    -    "indent-string": {
    -      "version": "4.0.0",
    -      "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz",
    -      "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==",
    +      "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==",
           "dev": true
         },
         "inflight": {
           "version": "1.0.6",
           "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
    -      "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
    +      "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==",
           "dev": true,
           "requires": {
             "once": "^1.3.0",
    @@ -24397,12 +24517,6 @@
             "side-channel": "^1.0.4"
           }
         },
    -    "ip": {
    -      "version": "1.1.5",
    -      "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz",
    -      "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=",
    -      "dev": true
    -    },
         "ipaddr.js": {
           "version": "2.0.1",
           "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.0.1.tgz",
    @@ -24421,7 +24535,7 @@
         "is-arrayish": {
           "version": "0.2.1",
           "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
    -      "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=",
    +      "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==",
           "dev": true
         },
         "is-bigint": {
    @@ -24458,9 +24572,9 @@
           "dev": true
         },
         "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==",
    +      "version": "2.9.0",
    +      "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.9.0.tgz",
    +      "integrity": "sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==",
           "dev": true,
           "requires": {
             "has": "^1.0.3"
    @@ -24483,7 +24597,7 @@
         "is-extglob": {
           "version": "2.1.1",
           "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
    -      "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI="
    +      "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ=="
         },
         "is-fullwidth-code-point": {
           "version": "3.0.0",
    @@ -24508,7 +24622,7 @@
         "is-module": {
           "version": "1.0.0",
           "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz",
    -      "integrity": "sha1-Mlj7afeMFNW4FdZkM2tM/7ZEFZE=",
    +      "integrity": "sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==",
           "dev": true
         },
         "is-negative-zero": {
    @@ -24523,9 +24637,9 @@
           "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng=="
         },
         "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==",
    +      "version": "1.0.7",
    +      "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz",
    +      "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==",
           "dev": true,
           "requires": {
             "has-tostringtag": "^1.0.0"
    @@ -24534,19 +24648,7 @@
         "is-obj": {
           "version": "1.0.1",
           "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz",
    -      "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=",
    -      "dev": true
    -    },
    -    "is-path-cwd": {
    -      "version": "2.2.0",
    -      "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz",
    -      "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==",
    -      "dev": true
    -    },
    -    "is-path-inside": {
    -      "version": "3.0.3",
    -      "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz",
    -      "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==",
    +      "integrity": "sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==",
           "dev": true
         },
         "is-plain-obj": {
    @@ -24577,7 +24679,7 @@
         "is-regexp": {
           "version": "1.0.0",
           "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz",
    -      "integrity": "sha1-/S2INUXEa6xaYz57mgnof6LLUGk=",
    +      "integrity": "sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA==",
           "dev": true
         },
         "is-root": {
    @@ -24587,10 +24689,13 @@
           "dev": true
         },
         "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
    +      "version": "1.0.2",
    +      "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz",
    +      "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==",
    +      "dev": true,
    +      "requires": {
    +        "call-bind": "^1.0.2"
    +      }
         },
         "is-stream": {
           "version": "2.0.1",
    @@ -24610,7 +24715,7 @@
         "is-subset": {
           "version": "0.1.1",
           "resolved": "https://registry.npmjs.org/is-subset/-/is-subset-0.1.1.tgz",
    -      "integrity": "sha1-ilkRfZMt4d4A8kX83TnOQ/HpOaY=",
    +      "integrity": "sha512-6Ybun0IkarhmEqxXCNw/C0bna6Zb/TkfUX9UbwJtK6ObwAVCxmAP308WWTHviM/zAqXk05cdhYsUsZeGQh99iw==",
           "dev": true
         },
         "is-symbol": {
    @@ -24625,7 +24730,7 @@
         "is-typedarray": {
           "version": "1.0.0",
           "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
    -      "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=",
    +      "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==",
           "dev": true
         },
         "is-weakref": {
    @@ -24646,16 +24751,15 @@
             "is-docker": "^2.0.0"
           }
         },
    -    "isarray": {
    -      "version": "1.0.0",
    -      "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
    -      "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
    -      "dev": true
    +    "isarray": {
    +      "version": "0.0.1",
    +      "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
    +      "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ=="
         },
         "isexe": {
           "version": "2.0.0",
           "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
    -      "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=",
    +      "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
           "dev": true
         },
         "isomorphic-fetch": {
    @@ -24675,9 +24779,9 @@
           "dev": true
         },
         "istanbul-lib-instrument": {
    -      "version": "5.1.0",
    -      "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.1.0.tgz",
    -      "integrity": "sha512-czwUz525rkOFDJxfKK6mYfIs9zBKILyrZQxjz3ABhjQXhbhFsSbo1HW/BFcsDnfJYJWA6thRR5/TUY2qs5W99Q==",
    +      "version": "5.2.0",
    +      "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.0.tgz",
    +      "integrity": "sha512-6Lthe1hqXHBNsqvgDzGO6l03XNeu3CrG4RqQ1KM9+l5+jNGpEJfIELx1NS3SEHmJQA8np/u+E4EPRKRiu6m19A==",
           "dev": true,
           "requires": {
             "@babel/core": "^7.12.3",
    @@ -24707,14 +24811,6 @@
             "debug": "^4.1.1",
             "istanbul-lib-coverage": "^3.0.0",
             "source-map": "^0.6.1"
    -      },
    -      "dependencies": {
    -        "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
    -        }
           }
         },
         "istanbul-reports": {
    @@ -24728,23 +24824,15 @@
           }
         },
         "jake": {
    -      "version": "10.8.4",
    -      "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.4.tgz",
    -      "integrity": "sha512-MtWeTkl1qGsWUtbl/Jsca/8xSoK3x0UmS82sNbjqxxG/de/M/3b1DntdjHgPMC50enlTNwXOCRqPXLLt5cCfZA==",
    +      "version": "10.8.5",
    +      "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.5.tgz",
    +      "integrity": "sha512-sVpxYeuAhWt0OTWITwT98oyV0GsXyMlXCF+3L1SuafBVUIr/uILGRB+NqwkzhgXKvoJpDIpQvqkUALgdmQsQxw==",
           "dev": true,
           "requires": {
    -        "async": "0.9.x",
    +        "async": "^3.2.3",
             "chalk": "^4.0.2",
             "filelist": "^1.0.1",
             "minimatch": "^3.0.4"
    -      },
    -      "dependencies": {
    -        "async": {
    -          "version": "0.9.2",
    -          "resolved": "https://registry.npmjs.org/async/-/async-0.9.2.tgz",
    -          "integrity": "sha1-rqdNXmHB+JlhO/ZL2mbUx48v0X0=",
    -          "dev": true
    -        }
           }
         },
         "jest": {
    @@ -24759,9 +24847,9 @@
           }
         },
         "jest-canvas-mock": {
    -      "version": "2.3.1",
    -      "resolved": "https://registry.npmjs.org/jest-canvas-mock/-/jest-canvas-mock-2.3.1.tgz",
    -      "integrity": "sha512-5FnSZPrX3Q2ZfsbYNE3wqKR3+XorN8qFzDzB5o0golWgt6EOX1+emBnpOc9IAQ+NXFj8Nzm3h7ZdE/9H0ylBcg==",
    +      "version": "2.4.0",
    +      "resolved": "https://registry.npmjs.org/jest-canvas-mock/-/jest-canvas-mock-2.4.0.tgz",
    +      "integrity": "sha512-mmMpZzpmLzn5vepIaHk5HoH3Ka4WykbSoLuG/EKoJd0x0ID/t+INo1l8ByfcUJuDM+RIsL4QDg/gDnBbrj2/IQ==",
           "dev": true,
           "requires": {
             "cssfontparser": "^1.2.1",
    @@ -25174,9 +25262,9 @@
           },
           "dependencies": {
             "semver": {
    -          "version": "7.3.5",
    -          "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz",
    -          "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==",
    +          "version": "7.3.7",
    +          "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz",
    +          "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==",
               "dev": true,
               "requires": {
                 "lru-cache": "^6.0.0"
    @@ -25210,33 +25298,198 @@
             "jest-get-type": "^27.5.1",
             "leven": "^3.1.0",
             "pretty-format": "^27.5.1"
    +      },
    +      "dependencies": {
    +        "camelcase": {
    +          "version": "6.3.0",
    +          "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz",
    +          "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==",
    +          "dev": true
    +        }
           }
         },
         "jest-watch-typeahead": {
    -      "version": "1.0.0",
    -      "resolved": "https://registry.npmjs.org/jest-watch-typeahead/-/jest-watch-typeahead-1.0.0.tgz",
    -      "integrity": "sha512-jxoszalAb394WElmiJTFBMzie/RDCF+W7Q29n5LzOPtcoQoHWfdUtHFkbhgf5NwWe8uMOxvKb/g7ea7CshfkTw==",
    +      "version": "1.1.0",
    +      "resolved": "https://registry.npmjs.org/jest-watch-typeahead/-/jest-watch-typeahead-1.1.0.tgz",
    +      "integrity": "sha512-Va5nLSJTN7YFtC2jd+7wsoe1pNe5K4ShLux/E5iHEwlB9AxaxmggY7to9KUqKojhaJw3aXqt5WAb4jGPOolpEw==",
           "dev": true,
           "requires": {
             "ansi-escapes": "^4.3.1",
             "chalk": "^4.0.0",
    -        "jest-regex-util": "^27.0.0",
    -        "jest-watcher": "^27.0.0",
    +        "jest-regex-util": "^28.0.0",
    +        "jest-watcher": "^28.0.0",
             "slash": "^4.0.0",
             "string-length": "^5.0.1",
             "strip-ansi": "^7.0.1"
           },
           "dependencies": {
    -        "ansi-regex": {
    -          "version": "6.0.1",
    -          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz",
    -          "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==",
    +        "@jest/console": {
    +          "version": "28.1.1",
    +          "resolved": "https://registry.npmjs.org/@jest/console/-/console-28.1.1.tgz",
    +          "integrity": "sha512-0RiUocPVFEm3WRMOStIHbRWllG6iW6E3/gUPnf4lkrVFyXIIDeCe+vlKeYyFOMhB2EPE6FLFCNADSOOQMaqvyA==",
    +          "dev": true,
    +          "requires": {
    +            "@jest/types": "^28.1.1",
    +            "@types/node": "*",
    +            "chalk": "^4.0.0",
    +            "jest-message-util": "^28.1.1",
    +            "jest-util": "^28.1.1",
    +            "slash": "^3.0.0"
    +          },
    +          "dependencies": {
    +            "slash": {
    +              "version": "3.0.0",
    +              "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
    +              "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
    +              "dev": true
    +            }
    +          }
    +        },
    +        "@jest/test-result": {
    +          "version": "28.1.1",
    +          "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-28.1.1.tgz",
    +          "integrity": "sha512-hPmkugBktqL6rRzwWAtp1JtYT4VHwv8OQ+9lE5Gymj6dHzubI/oJHMUpPOt8NrdVWSrz9S7bHjJUmv2ggFoUNQ==",
    +          "dev": true,
    +          "requires": {
    +            "@jest/console": "^28.1.1",
    +            "@jest/types": "^28.1.1",
    +            "@types/istanbul-lib-coverage": "^2.0.0",
    +            "collect-v8-coverage": "^1.0.0"
    +          }
    +        },
    +        "@jest/types": {
    +          "version": "28.1.1",
    +          "resolved": "https://registry.npmjs.org/@jest/types/-/types-28.1.1.tgz",
    +          "integrity": "sha512-vRXVqSg1VhDnB8bWcmvLzmg0Bt9CRKVgHPXqYwvWMX3TvAjeO+nRuK6+VdTKCtWOvYlmkF/HqNAL/z+N3B53Kw==",
    +          "dev": true,
    +          "requires": {
    +            "@jest/schemas": "^28.0.2",
    +            "@types/istanbul-lib-coverage": "^2.0.0",
    +            "@types/istanbul-reports": "^3.0.0",
    +            "@types/node": "*",
    +            "@types/yargs": "^17.0.8",
    +            "chalk": "^4.0.0"
    +          }
    +        },
    +        "@types/yargs": {
    +          "version": "17.0.10",
    +          "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.10.tgz",
    +          "integrity": "sha512-gmEaFwpj/7f/ROdtIlci1R1VYU1J4j95m8T+Tj3iBgiBFKg1foE/PSl93bBd5T9LDXNPo8UlNN6W0qwD8O5OaA==",
    +          "dev": true,
    +          "requires": {
    +            "@types/yargs-parser": "*"
    +          }
    +        },
    +        "ansi-styles": {
    +          "version": "5.2.0",
    +          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz",
    +          "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==",
               "dev": true
             },
    -        "char-regex": {
    -          "version": "2.0.1",
    -          "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-2.0.1.tgz",
    -          "integrity": "sha512-oSvEeo6ZUD7NepqAat3RqoucZ5SeqLJgOvVIwkafu6IP3V0pO38s/ypdVUmDDK6qIIHNlYHJAKX9E7R7HoKElw==",
    +        "emittery": {
    +          "version": "0.10.2",
    +          "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.10.2.tgz",
    +          "integrity": "sha512-aITqOwnLanpHLNXZJENbOgjUBeHocD+xsSJmNrjovKBW5HbSpW3d1pEls7GFQPUWXiwG9+0P4GtHfEqC/4M0Iw==",
    +          "dev": true
    +        },
    +        "jest-message-util": {
    +          "version": "28.1.1",
    +          "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-28.1.1.tgz",
    +          "integrity": "sha512-xoDOOT66fLfmTRiqkoLIU7v42mal/SqwDKvfmfiWAdJMSJiU+ozgluO7KbvoAgiwIrrGZsV7viETjc8GNrA/IQ==",
    +          "dev": true,
    +          "requires": {
    +            "@babel/code-frame": "^7.12.13",
    +            "@jest/types": "^28.1.1",
    +            "@types/stack-utils": "^2.0.0",
    +            "chalk": "^4.0.0",
    +            "graceful-fs": "^4.2.9",
    +            "micromatch": "^4.0.4",
    +            "pretty-format": "^28.1.1",
    +            "slash": "^3.0.0",
    +            "stack-utils": "^2.0.3"
    +          },
    +          "dependencies": {
    +            "slash": {
    +              "version": "3.0.0",
    +              "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
    +              "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
    +              "dev": true
    +            }
    +          }
    +        },
    +        "jest-regex-util": {
    +          "version": "28.0.2",
    +          "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-28.0.2.tgz",
    +          "integrity": "sha512-4s0IgyNIy0y9FK+cjoVYoxamT7Zeo7MhzqRGx7YDYmaQn1wucY9rotiGkBzzcMXTtjrCAP/f7f+E0F7+fxPNdw==",
    +          "dev": true
    +        },
    +        "jest-util": {
    +          "version": "28.1.1",
    +          "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-28.1.1.tgz",
    +          "integrity": "sha512-FktOu7ca1DZSyhPAxgxB6hfh2+9zMoJ7aEQA759Z6p45NuO8mWcqujH+UdHlCm/V6JTWwDztM2ITCzU1ijJAfw==",
    +          "dev": true,
    +          "requires": {
    +            "@jest/types": "^28.1.1",
    +            "@types/node": "*",
    +            "chalk": "^4.0.0",
    +            "ci-info": "^3.2.0",
    +            "graceful-fs": "^4.2.9",
    +            "picomatch": "^2.2.3"
    +          }
    +        },
    +        "jest-watcher": {
    +          "version": "28.1.1",
    +          "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-28.1.1.tgz",
    +          "integrity": "sha512-RQIpeZ8EIJMxbQrXpJQYIIlubBnB9imEHsxxE41f54ZwcqWLysL/A0ZcdMirf+XsMn3xfphVQVV4EW0/p7i7Ug==",
    +          "dev": true,
    +          "requires": {
    +            "@jest/test-result": "^28.1.1",
    +            "@jest/types": "^28.1.1",
    +            "@types/node": "*",
    +            "ansi-escapes": "^4.2.1",
    +            "chalk": "^4.0.0",
    +            "emittery": "^0.10.2",
    +            "jest-util": "^28.1.1",
    +            "string-length": "^4.0.1"
    +          },
    +          "dependencies": {
    +            "string-length": {
    +              "version": "4.0.2",
    +              "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz",
    +              "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==",
    +              "dev": true,
    +              "requires": {
    +                "char-regex": "^1.0.2",
    +                "strip-ansi": "^6.0.0"
    +              }
    +            },
    +            "strip-ansi": {
    +              "version": "6.0.1",
    +              "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
    +              "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
    +              "dev": true,
    +              "requires": {
    +                "ansi-regex": "^5.0.1"
    +              }
    +            }
    +          }
    +        },
    +        "pretty-format": {
    +          "version": "28.1.1",
    +          "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-28.1.1.tgz",
    +          "integrity": "sha512-wwJbVTGFHeucr5Jw2bQ9P+VYHyLdAqedFLEkdQUVaBF/eiidDwH5OpilINq4mEfhbCjLnirt6HTTDhv1HaTIQw==",
    +          "dev": true,
    +          "requires": {
    +            "@jest/schemas": "^28.0.2",
    +            "ansi-regex": "^5.0.1",
    +            "ansi-styles": "^5.0.0",
    +            "react-is": "^18.0.0"
    +          }
    +        },
    +        "react-is": {
    +          "version": "18.1.0",
    +          "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.1.0.tgz",
    +          "integrity": "sha512-Fl7FuabXsJnV5Q1qIOQwx/sagGF18kogb4gpfcG4gjLBWO0WDiiz1ko/ExayuxE7InyQkBLkxRFG5oxY6Uu3Kg==",
               "dev": true
             },
             "slash": {
    @@ -25253,6 +25506,14 @@
               "requires": {
                 "char-regex": "^2.0.0",
                 "strip-ansi": "^7.0.1"
    +          },
    +          "dependencies": {
    +            "char-regex": {
    +              "version": "2.0.1",
    +              "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-2.0.1.tgz",
    +              "integrity": "sha512-oSvEeo6ZUD7NepqAat3RqoucZ5SeqLJgOvVIwkafu6IP3V0pO38s/ypdVUmDDK6qIIHNlYHJAKX9E7R7HoKElw==",
    +              "dev": true
    +            }
               }
             },
             "strip-ansi": {
    @@ -25262,6 +25523,14 @@
               "dev": true,
               "requires": {
                 "ansi-regex": "^6.0.1"
    +          },
    +          "dependencies": {
    +            "ansi-regex": {
    +              "version": "6.0.1",
    +              "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz",
    +              "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==",
    +              "dev": true
    +            }
               }
             }
           }
    @@ -25311,7 +25580,7 @@
         "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="
    +      "integrity": "sha512-TV3umIfIPRq1UM0EUY4E/jimrh2j057J6SJB1HQnEeS64r8liec++F0WCNYsmcWDxz6Lo4E2lCA+SeOQS2W3bA=="
         },
         "js-tokens": {
           "version": "4.0.0",
    @@ -25362,25 +25631,11 @@
             "xml-name-validator": "^3.0.0"
           },
           "dependencies": {
    -        "tr46": {
    -          "version": "2.1.0",
    -          "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz",
    -          "integrity": "sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==",
    -          "dev": true,
    -          "requires": {
    -            "punycode": "^2.1.1"
    -          }
    -        },
    -        "whatwg-url": {
    -          "version": "8.7.0",
    -          "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.7.0.tgz",
    -          "integrity": "sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==",
    -          "dev": true,
    -          "requires": {
    -            "lodash": "^4.7.0",
    -            "tr46": "^2.1.0",
    -            "webidl-conversions": "^6.1.0"
    -          }
    +        "parse5": {
    +          "version": "6.0.1",
    +          "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz",
    +          "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==",
    +          "dev": true
             }
           }
         },
    @@ -25390,12 +25645,6 @@
           "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==",
           "dev": true
         },
    -    "json-parse-better-errors": {
    -      "version": "1.0.2",
    -      "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz",
    -      "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==",
    -      "dev": true
    -    },
         "json-parse-even-better-errors": {
           "version": "2.3.1",
           "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz",
    @@ -25417,13 +25666,13 @@
         "json-stable-stringify-without-jsonify": {
           "version": "1.0.1",
           "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
    -      "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=",
    +      "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==",
           "dev": true
         },
         "json-stringify-safe": {
           "version": "5.0.1",
           "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
    -      "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=",
    +      "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==",
           "dev": true
         },
         "json5": {
    @@ -25449,12 +25698,12 @@
           "dev": true
         },
         "jsx-ast-utils": {
    -      "version": "3.2.1",
    -      "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.2.1.tgz",
    -      "integrity": "sha512-uP5vu8xfy2F9A6LGC22KO7e2/vGTS1MhP+18f++ZNlf0Ohaxbc9nIEwHAsejlJKyzfZzU5UIhe5ItYkitcZnZA==",
    +      "version": "3.3.0",
    +      "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.0.tgz",
    +      "integrity": "sha512-XzO9luP6L0xkxwhIJMTJQpZo/eeN60K08jHdexfD569AGxeNug6UketeHXEhROoM8aR7EcUoOQmIhcJQjcuq8Q==",
           "dev": true,
           "requires": {
    -        "array-includes": "^3.1.3",
    +        "array-includes": "^3.1.4",
             "object.assign": "^4.1.2"
           }
         },
    @@ -25491,7 +25740,7 @@
         "language-tags": {
           "version": "1.0.5",
           "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.5.tgz",
    -      "integrity": "sha1-0yHbxNowuovzAk4ED6XBRmH5GTo=",
    +      "integrity": "sha512-qJhlO9cGXi6hBGKoxEG/sKZDAHD5Hnu9Hs4WbOY3pCWXDhw0N8x1NenNzm2EnNLkLkk7J2SdxAkDSbb6ftT+UQ==",
           "dev": true,
           "requires": {
             "language-subtag-registry": "~0.3.2"
    @@ -25514,9 +25763,9 @@
           }
         },
         "lilconfig": {
    -      "version": "2.0.4",
    -      "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.4.tgz",
    -      "integrity": "sha512-bfTIN7lEsiooCocSISTWXkiWJkRqtL9wYtYy+8EK3Y41qh3mpwPU0ycTOgjdY9ErwXCc8QyrQp82bdL0Xkm9yA==",
    +      "version": "2.0.5",
    +      "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.5.tgz",
    +      "integrity": "sha512-xaYmXZtTHPAw5m+xLN8ab9C+3a8YmV3asNSPOATITbtwrfbwaLJj8h66H1WMIpALCkqsIzK3h7oQ+PdX+LQ9Eg==",
           "dev": true
         },
         "lines-and-columns": {
    @@ -25526,9 +25775,9 @@
           "dev": true
         },
         "loader-runner": {
    -      "version": "4.2.0",
    -      "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.2.0.tgz",
    -      "integrity": "sha512-92+huvxMvYlMzMt0iIOukcwYBFpkYJdpl2xsZ7LrlayO7E8SOv+JJUEK17B/dJIHAOLMfh2dZZ/Y18WgmGtYNw==",
    +      "version": "4.3.0",
    +      "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz",
    +      "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==",
           "dev": true
         },
         "loader-utils": {
    @@ -25545,7 +25794,7 @@
         "locate-path": {
           "version": "2.0.0",
           "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz",
    -      "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=",
    +      "integrity": "sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==",
           "dev": true,
           "requires": {
             "p-locate": "^2.0.0",
    @@ -25560,37 +25809,37 @@
         "lodash.debounce": {
           "version": "4.0.8",
           "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz",
    -      "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=",
    +      "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==",
           "dev": true
         },
         "lodash.escape": {
           "version": "4.0.1",
           "resolved": "https://registry.npmjs.org/lodash.escape/-/lodash.escape-4.0.1.tgz",
    -      "integrity": "sha1-yQRGkMIeBClL6qUXcS/e0fqI3pg=",
    +      "integrity": "sha512-nXEOnb/jK9g0DYMr1/Xvq6l5xMD7GDG55+GSYIYmS0G4tBk/hURD4JR9WCavs04t33WmJx9kCyp9vJ+mr4BOUw==",
           "dev": true
         },
         "lodash.flattendeep": {
           "version": "4.4.0",
           "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz",
    -      "integrity": "sha1-+wMJF/hqMTTlvJvsDWngAT3f7bI=",
    +      "integrity": "sha512-uHaJFihxmJcEX3kT4I23ABqKKalJ/zDrDg0lsFtc1h+3uw49SIJ5beyhx5ExVRti3AvKoOJngIj7xz3oylPdWQ==",
           "dev": true
         },
         "lodash.get": {
           "version": "4.4.2",
           "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz",
    -      "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=",
    +      "integrity": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==",
           "dev": true
         },
         "lodash.isequal": {
           "version": "4.5.0",
           "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz",
    -      "integrity": "sha1-QVxEePK8wwEgwizhDtMib30+GOA=",
    +      "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==",
           "dev": true
         },
         "lodash.memoize": {
           "version": "4.1.2",
           "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz",
    -      "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=",
    +      "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==",
           "dev": true
         },
         "lodash.merge": {
    @@ -25599,22 +25848,16 @@
           "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==",
           "dev": true
         },
    -    "lodash.set": {
    -      "version": "4.3.2",
    -      "resolved": "https://registry.npmjs.org/lodash.set/-/lodash.set-4.3.2.tgz",
    -      "integrity": "sha1-2HV7HagH3eJIFrDWqEvqGnYjCyM=",
    -      "dev": true
    -    },
         "lodash.sortby": {
           "version": "4.7.0",
           "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz",
    -      "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=",
    +      "integrity": "sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==",
           "dev": true
         },
         "lodash.uniq": {
           "version": "4.5.0",
           "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz",
    -      "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=",
    +      "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==",
           "dev": true
         },
         "loose-envify": {
    @@ -25684,13 +25927,13 @@
         "media-typer": {
           "version": "0.3.0",
           "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
    -      "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=",
    +      "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==",
           "dev": true
         },
         "memfs": {
    -      "version": "3.4.1",
    -      "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.4.1.tgz",
    -      "integrity": "sha512-1c9VPVvW5P7I85c35zAdEr1TD5+F11IToIHIlrVIcflfnzPkJa0ZoYEoEdYDP8KgPFoSZ/opDrUsAoZWym3mtw==",
    +      "version": "3.4.4",
    +      "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.4.4.tgz",
    +      "integrity": "sha512-W4gHNUE++1oSJVn8Y68jPXi+mkx3fXR5ITE/Ubz6EQ3xRpCN5k2CQ4AUR8094Z7211F876TyoBACGsIveqgiGA==",
           "dev": true,
           "requires": {
             "fs-monkey": "1.0.3"
    @@ -25699,7 +25942,7 @@
         "merge-descriptors": {
           "version": "1.0.1",
           "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz",
    -      "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=",
    +      "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==",
           "dev": true
         },
         "merge-stream": {
    @@ -25717,16 +25960,16 @@
         "methods": {
           "version": "1.1.2",
           "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
    -      "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=",
    +      "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==",
           "dev": true
         },
         "micromatch": {
    -      "version": "4.0.4",
    -      "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz",
    -      "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==",
    +      "version": "4.0.5",
    +      "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz",
    +      "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==",
           "requires": {
    -        "braces": "^3.0.1",
    -        "picomatch": "^2.2.3"
    +        "braces": "^3.0.2",
    +        "picomatch": "^2.3.1"
           }
         },
         "mime": {
    @@ -25775,9 +26018,9 @@
           },
           "dependencies": {
             "ajv": {
    -          "version": "8.10.0",
    -          "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.10.0.tgz",
    -          "integrity": "sha512-bzqAEZOjkrUMl2afH8dknrq5KEk2SrwdBROR+vH1EKVQTqaUbJVPdc/gEdggTMM0Se+s+Ja4ju4TlNcStKl2Hw==",
    +          "version": "8.11.0",
    +          "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz",
    +          "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==",
               "dev": true,
               "requires": {
                 "fast-deep-equal": "^3.1.1",
    @@ -25837,18 +26080,18 @@
           "dev": true
         },
         "mkdirp": {
    -      "version": "0.5.5",
    -      "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz",
    -      "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==",
    +      "version": "0.5.6",
    +      "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz",
    +      "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==",
           "dev": true,
           "requires": {
    -        "minimist": "^1.2.5"
    +        "minimist": "^1.2.6"
           }
         },
         "moment": {
    -      "version": "2.29.2",
    -      "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.2.tgz",
    -      "integrity": "sha512-UgzG4rvxYpN15jgCmVJwac49h9ly9NurikMWGPdVxm8GZD6XjkKPxDTjQQ43gtGgnV3X0cAyWDdP2Wexoquifg=="
    +      "version": "2.29.3",
    +      "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.3.tgz",
    +      "integrity": "sha512-c6YRvhEo//6T2Jz/vVtYzqBzwvPT95JBQ+smCytzf7c50oMZRsR/a4w88aD34I+/QVSfnoAnSBFPJHItlOMJVw=="
         },
         "moment-timezone": {
           "version": "0.5.34",
    @@ -25865,9 +26108,9 @@
           "dev": true
         },
         "moo-color": {
    -      "version": "1.0.2",
    -      "resolved": "https://registry.npmjs.org/moo-color/-/moo-color-1.0.2.tgz",
    -      "integrity": "sha512-5iXz5n9LWQzx/C2WesGFfpE6RLamzdHwsn3KpfzShwbfIqs7stnoEpaNErf/7+3mbxwZ4s8Foq7I0tPxw7BWHg==",
    +      "version": "1.0.3",
    +      "resolved": "https://registry.npmjs.org/moo-color/-/moo-color-1.0.3.tgz",
    +      "integrity": "sha512-i/+ZKXMDf6aqYtBhuOcej71YSlbjT3wCO/4H1j8rPvxDJEifdwgg5MaFyu6iYAT8GBZJg2z0dkgK4YMzvURALQ==",
           "dev": true,
           "requires": {
             "color-name": "^1.1.4"
    @@ -25880,21 +26123,15 @@
           "dev": true
         },
         "multicast-dns": {
    -      "version": "6.2.3",
    -      "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-6.2.3.tgz",
    -      "integrity": "sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g==",
    +      "version": "7.2.5",
    +      "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz",
    +      "integrity": "sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==",
           "dev": true,
           "requires": {
    -        "dns-packet": "^1.3.1",
    +        "dns-packet": "^5.2.2",
             "thunky": "^1.0.2"
           }
         },
    -    "multicast-dns-service-types": {
    -      "version": "1.1.0",
    -      "resolved": "https://registry.npmjs.org/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz",
    -      "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=",
    -      "dev": true
    -    },
         "mutationobserver-shim": {
           "version": "0.3.7",
           "resolved": "https://registry.npmjs.org/mutationobserver-shim/-/mutationobserver-shim-0.3.7.tgz",
    @@ -25902,14 +26139,14 @@
           "dev": true
         },
         "nanoid": {
    -      "version": "3.3.1",
    -      "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.1.tgz",
    -      "integrity": "sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw=="
    +      "version": "3.3.4",
    +      "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz",
    +      "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw=="
         },
         "natural-compare": {
           "version": "1.4.0",
           "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
    -      "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=",
    +      "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==",
           "dev": true
         },
         "nearley": {
    @@ -25955,23 +26192,6 @@
             "@sinonjs/text-encoding": "^0.7.1",
             "just-extend": "^4.0.2",
             "path-to-regexp": "^1.7.0"
    -      },
    -      "dependencies": {
    -        "isarray": {
    -          "version": "0.0.1",
    -          "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
    -          "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=",
    -          "dev": true
    -        },
    -        "path-to-regexp": {
    -          "version": "1.8.0",
    -          "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz",
    -          "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==",
    -          "dev": true,
    -          "requires": {
    -            "isarray": "0.0.1"
    -          }
    -        }
           }
         },
         "no-case": {
    @@ -25985,14 +26205,14 @@
           }
         },
         "nock": {
    -      "version": "13.2.4",
    -      "resolved": "https://registry.npmjs.org/nock/-/nock-13.2.4.tgz",
    -      "integrity": "sha512-8GPznwxcPNCH/h8B+XZcKjYPXnUV5clOKCjAqyjsiqA++MpNx9E9+t8YPp0MbThO+KauRo7aZJ1WuIZmOrT2Ug==",
    +      "version": "13.2.6",
    +      "resolved": "https://registry.npmjs.org/nock/-/nock-13.2.6.tgz",
    +      "integrity": "sha512-GbyeSwSEP0FYouzETZ0l/XNm5tNcDNcXJKw3LCAb+mx8bZSwg1wEEvdL0FAyg5TkBJYiWSCtw6ag4XfmBy60FA==",
           "dev": true,
           "requires": {
             "debug": "^4.1.0",
             "json-stringify-safe": "^5.0.1",
    -        "lodash.set": "^4.3.2",
    +        "lodash": "^4.17.21",
             "propagate": "^2.0.0"
           }
         },
    @@ -26003,24 +26223,48 @@
           "dev": true,
           "requires": {
             "whatwg-url": "^5.0.0"
    +      },
    +      "dependencies": {
    +        "tr46": {
    +          "version": "0.0.3",
    +          "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz",
    +          "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==",
    +          "dev": true
    +        },
    +        "webidl-conversions": {
    +          "version": "3.0.1",
    +          "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz",
    +          "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==",
    +          "dev": true
    +        },
    +        "whatwg-url": {
    +          "version": "5.0.0",
    +          "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz",
    +          "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==",
    +          "dev": true,
    +          "requires": {
    +            "tr46": "~0.0.3",
    +            "webidl-conversions": "^3.0.0"
    +          }
    +        }
           }
         },
         "node-forge": {
    -      "version": "1.3.0",
    -      "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.0.tgz",
    -      "integrity": "sha512-08ARB91bUi6zNKzVmaj3QO7cr397uiDT2nJ63cHjyNtCTWIgvS47j3eT0WfzUwS9+6Z5YshRaoasFkXCKrIYbA==",
    +      "version": "1.3.1",
    +      "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz",
    +      "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==",
           "dev": true
         },
         "node-int64": {
           "version": "0.4.0",
           "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz",
    -      "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=",
    +      "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==",
           "dev": true
         },
         "node-releases": {
    -      "version": "2.0.2",
    -      "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.2.tgz",
    -      "integrity": "sha512-XxYDdcQ6eKqp/YjI+tb2C5WM2LgjnZrfYg4vgQt49EK268b6gYCHsBLrK2qvJo4FmCtqmKezb0WZFK4fkrZNsg==",
    +      "version": "2.0.5",
    +      "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.5.tgz",
    +      "integrity": "sha512-U9h1NLROZTq9uE1SNffn6WuPDg8icmi3ns4rEl/oTfIle4iLjTliCzgTsbaIFMq/Xn078/lfY/BL0GWZ+psK4Q==",
           "dev": true
         },
         "normalize-path": {
    @@ -26031,7 +26275,7 @@
         "normalize-range": {
           "version": "0.1.2",
           "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz",
    -      "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=",
    +      "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==",
           "dev": true
         },
         "normalize-url": {
    @@ -26050,9 +26294,9 @@
           }
         },
         "nth-check": {
    -      "version": "2.0.1",
    -      "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.0.1.tgz",
    -      "integrity": "sha512-it1vE95zF6dTT9lBsYbxvqh0Soy4SPowchj0UBGj/V6cTPnXXtQOPUbhZ6CmGzAD/rW22LQK6E96pcdJXk4A4w==",
    +      "version": "2.1.1",
    +      "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz",
    +      "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==",
           "dev": true,
           "requires": {
             "boolbase": "^1.0.0"
    @@ -26067,18 +26311,18 @@
         "object-assign": {
           "version": "4.1.1",
           "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
    -      "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM="
    +      "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg=="
         },
         "object-hash": {
    -      "version": "2.2.0",
    -      "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-2.2.0.tgz",
    -      "integrity": "sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw==",
    +      "version": "3.0.0",
    +      "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz",
    +      "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==",
           "dev": true
         },
         "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==",
    +      "version": "1.12.2",
    +      "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz",
    +      "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==",
           "dev": true
         },
         "object-is": {
    @@ -26130,24 +26374,25 @@
           }
         },
         "object.getownpropertydescriptors": {
    -      "version": "2.1.3",
    -      "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.3.tgz",
    -      "integrity": "sha512-VdDoCwvJI4QdC6ndjpqFmoL3/+HxffFBbcJzKi5hwLLqqx3mdbedRpfZDdK0SrOSauj8X4GzBvnDZl4vTN7dOw==",
    +      "version": "2.1.4",
    +      "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.4.tgz",
    +      "integrity": "sha512-sccv3L/pMModT6dJAYF3fzGMVcb38ysQ0tEE6ixv2yXJDtEIPph268OlAdJj5/qZMZDq2g/jqvwppt36uS/uQQ==",
           "dev": true,
           "requires": {
    +        "array.prototype.reduce": "^1.0.4",
             "call-bind": "^1.0.2",
    -        "define-properties": "^1.1.3",
    -        "es-abstract": "^1.19.1"
    +        "define-properties": "^1.1.4",
    +        "es-abstract": "^1.20.1"
           }
         },
         "object.hasown": {
    -      "version": "1.1.0",
    -      "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.0.tgz",
    -      "integrity": "sha512-MhjYRfj3GBlhSkDHo6QmvgjRLXQ2zndabdf3nX0yTyZK9rPfxb6uRpAac8HXNLy1GpqWtZ81Qh4v3uOls2sRAg==",
    +      "version": "1.1.1",
    +      "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.1.tgz",
    +      "integrity": "sha512-LYLe4tivNQzq4JdaWW6WO3HMZZJWzkkH8fnI6EebWl0VZth2wL2Lovm74ep2/gZzlaTdV62JZHEqHQ2yVn8Q/A==",
           "dev": true,
           "requires": {
    -        "define-properties": "^1.1.3",
    -        "es-abstract": "^1.19.1"
    +        "define-properties": "^1.1.4",
    +        "es-abstract": "^1.19.5"
           }
         },
         "object.values": {
    @@ -26168,9 +26413,9 @@
           "dev": true
         },
         "on-finished": {
    -      "version": "2.3.0",
    -      "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz",
    -      "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=",
    +      "version": "2.4.1",
    +      "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz",
    +      "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==",
           "dev": true,
           "requires": {
             "ee-first": "1.1.1"
    @@ -26185,7 +26430,7 @@
         "once": {
           "version": "1.4.0",
           "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
    -      "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
    +      "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
           "dev": true,
           "requires": {
             "wrappy": "1"
    @@ -26237,35 +26482,26 @@
         "p-locate": {
           "version": "2.0.0",
           "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz",
    -      "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=",
    +      "integrity": "sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==",
           "dev": true,
           "requires": {
             "p-limit": "^1.1.0"
           }
         },
    -    "p-map": {
    -      "version": "4.0.0",
    -      "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz",
    -      "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==",
    -      "dev": true,
    -      "requires": {
    -        "aggregate-error": "^3.0.0"
    -      }
    -    },
         "p-retry": {
    -      "version": "4.6.1",
    -      "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.1.tgz",
    -      "integrity": "sha512-e2xXGNhZOZ0lfgR9kL34iGlU8N/KO0xZnQxVEwdeOvpqNDQfdnxIYizvWtK8RglUa3bGqI8g0R/BdfzLMxRkiA==",
    +      "version": "4.6.2",
    +      "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz",
    +      "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==",
           "dev": true,
           "requires": {
    -        "@types/retry": "^0.12.0",
    +        "@types/retry": "0.12.0",
             "retry": "^0.13.1"
           }
         },
         "p-try": {
           "version": "1.0.0",
           "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz",
    -      "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=",
    +      "integrity": "sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==",
           "dev": true
         },
         "param-case": {
    @@ -26302,21 +26538,25 @@
         "parse-srcset": {
           "version": "1.0.2",
           "resolved": "https://registry.npmjs.org/parse-srcset/-/parse-srcset-1.0.2.tgz",
    -      "integrity": "sha1-8r0iH2zJcKk42IVWq8WJyqqiveE="
    +      "integrity": "sha512-/2qh0lav6CmI15FzA3i/2Bzk2zCgQhGMkvhOhKNcBVQ1ldgpbfiNTVslmooUmWJcADi1f1kIeynbDRVzNlfR6Q=="
         },
         "parse5": {
    -      "version": "6.0.1",
    -      "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz",
    -      "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==",
    -      "dev": true
    +      "version": "7.0.0",
    +      "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.0.0.tgz",
    +      "integrity": "sha512-y/t8IXSPWTuRZqXc0ajH/UwDj4mnqLEbSttNbThcFhGrZuOyoyvNBO85PBp2jQa55wY9d07PBNjsK8ZP3K5U6g==",
    +      "dev": true,
    +      "requires": {
    +        "entities": "^4.3.0"
    +      }
         },
         "parse5-htmlparser2-tree-adapter": {
    -      "version": "6.0.1",
    -      "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-6.0.1.tgz",
    -      "integrity": "sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA==",
    +      "version": "7.0.0",
    +      "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.0.0.tgz",
    +      "integrity": "sha512-B77tOZrqqfUfnVcOrUvfdLbz4pu4RopLD/4vmu3HUPswwTA8OH0EMW9BlWR2B0RCoiZRAHEUu7IxeP1Pd1UU+g==",
           "dev": true,
           "requires": {
    -        "parse5": "^6.0.1"
    +        "domhandler": "^5.0.2",
    +        "parse5": "^7.0.0"
           }
         },
         "parseurl": {
    @@ -26338,13 +26578,13 @@
         "path-exists": {
           "version": "3.0.0",
           "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
    -      "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=",
    +      "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==",
           "dev": true
         },
         "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=",
    +      "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==",
           "dev": true
         },
         "path-key": {
    @@ -26360,10 +26600,12 @@
           "dev": true
         },
         "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
    +      "version": "1.8.0",
    +      "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz",
    +      "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==",
    +      "requires": {
    +        "isarray": "0.0.1"
    +      }
         },
         "path-type": {
           "version": "4.0.0",
    @@ -26374,7 +26616,7 @@
         "performance-now": {
           "version": "2.1.0",
           "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz",
    -      "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=",
    +      "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==",
           "dev": true
         },
         "picocolors": {
    @@ -26387,6 +26629,12 @@
           "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
           "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="
         },
    +    "pify": {
    +      "version": "2.3.0",
    +      "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
    +      "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==",
    +      "dev": true
    +    },
         "pirates": {
           "version": "4.0.5",
           "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.5.tgz",
    @@ -26512,45 +26760,23 @@
           "resolved": "https://registry.npmjs.org/popper.js/-/popper.js-1.16.1.tgz",
           "integrity": "sha512-Wb4p1J4zyFTbM+u6WuO4XstYx4Ky9Cewe4DWrel7B0w6VVICvPwdOpotjzcf6eD8TsckVnIMNONQyPIUFOUbCQ=="
         },
    -    "portfinder": {
    -      "version": "1.0.28",
    -      "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.28.tgz",
    -      "integrity": "sha512-Se+2isanIcEqf2XMHjyUKskczxbPH7dQnlMjXX6+dybayyHvAf/TCgyMRlzf/B6QDhAEFOGes0pzRo3by4AbMA==",
    -      "dev": true,
    -      "requires": {
    -        "async": "^2.6.2",
    -        "debug": "^3.1.1",
    -        "mkdirp": "^0.5.5"
    -      },
    -      "dependencies": {
    -        "debug": {
    -          "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"
    -          }
    -        }
    -      }
    -    },
         "postcss": {
    -      "version": "8.4.12",
    -      "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.12.tgz",
    -      "integrity": "sha512-lg6eITwYe9v6Hr5CncVbK70SoioNQIq81nsaG86ev5hAidQvmOeETBqs7jm43K2F5/Ley3ytDtriImV6TpNiSg==",
    +      "version": "8.4.14",
    +      "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.14.tgz",
    +      "integrity": "sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig==",
           "requires": {
    -        "nanoid": "^3.3.1",
    +        "nanoid": "^3.3.4",
             "picocolors": "^1.0.0",
             "source-map-js": "^1.0.2"
           }
         },
         "postcss-attribute-case-insensitive": {
    -      "version": "5.0.0",
    -      "resolved": "https://registry.npmjs.org/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-5.0.0.tgz",
    -      "integrity": "sha512-b4g9eagFGq9T5SWX4+USfVyjIb3liPnjhHHRMP7FMB2kFVpYyfEscV0wP3eaXhKlcHKUut8lt5BGoeylWA/dBQ==",
    +      "version": "5.0.1",
    +      "resolved": "https://registry.npmjs.org/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-5.0.1.tgz",
    +      "integrity": "sha512-wrt2VndqSLJpyBRNz9OmJcgnhI9MaongeWgapdBuUMu2a/KNJ8SENesG4SdiTnQwGO9b1VKbTWYAfCPeokLqZQ==",
           "dev": true,
           "requires": {
    -        "postcss-selector-parser": "^6.0.2"
    +        "postcss-selector-parser": "^6.0.10"
           }
         },
         "postcss-browser-comments": {
    @@ -26580,27 +26806,27 @@
           }
         },
         "postcss-color-functional-notation": {
    -      "version": "4.2.2",
    -      "resolved": "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-4.2.2.tgz",
    -      "integrity": "sha512-DXVtwUhIk4f49KK5EGuEdgx4Gnyj6+t2jBSEmxvpIK9QI40tWrpS2Pua8Q7iIZWBrki2QOaeUdEaLPPa91K0RQ==",
    +      "version": "4.2.3",
    +      "resolved": "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-4.2.3.tgz",
    +      "integrity": "sha512-5fbr6FzFzjwHXKsVnkmEYrJYG8VNNzvD1tAXaPPWR97S6rhKI5uh2yOfV5TAzhDkZoq4h+chxEplFDc8GeyFtw==",
           "dev": true,
           "requires": {
             "postcss-value-parser": "^4.2.0"
           }
         },
         "postcss-color-hex-alpha": {
    -      "version": "8.0.3",
    -      "resolved": "https://registry.npmjs.org/postcss-color-hex-alpha/-/postcss-color-hex-alpha-8.0.3.tgz",
    -      "integrity": "sha512-fESawWJCrBV035DcbKRPAVmy21LpoyiXdPTuHUfWJ14ZRjY7Y7PA6P4g8z6LQGYhU1WAxkTxjIjurXzoe68Glw==",
    +      "version": "8.0.4",
    +      "resolved": "https://registry.npmjs.org/postcss-color-hex-alpha/-/postcss-color-hex-alpha-8.0.4.tgz",
    +      "integrity": "sha512-nLo2DCRC9eE4w2JmuKgVA3fGL3d01kGq752pVALF68qpGLmx2Qrk91QTKkdUqqp45T1K1XV8IhQpcu1hoAQflQ==",
           "dev": true,
           "requires": {
             "postcss-value-parser": "^4.2.0"
           }
         },
         "postcss-color-rebeccapurple": {
    -      "version": "7.0.2",
    -      "resolved": "https://registry.npmjs.org/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-7.0.2.tgz",
    -      "integrity": "sha512-SFc3MaocHaQ6k3oZaFwH8io6MdypkUtEy/eXzXEB1vEQlO3S3oDc/FSZA8AsS04Z25RirQhlDlHLh3dn7XewWw==",
    +      "version": "7.1.0",
    +      "resolved": "https://registry.npmjs.org/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-7.1.0.tgz",
    +      "integrity": "sha512-1jtE5AKnZcKq4pjOrltFHcbEM2/IvtbD1OdhZ/wqds18//bh0UmQkffcCkzDJU+/vGodfIsVQeKn+45CJvX9Bw==",
           "dev": true,
           "requires": {
             "postcss-value-parser": "^4.2.0"
    @@ -26619,34 +26845,37 @@
           }
         },
         "postcss-convert-values": {
    -      "version": "5.1.0",
    -      "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-5.1.0.tgz",
    -      "integrity": "sha512-GkyPbZEYJiWtQB0KZ0X6qusqFHUepguBCNFi9t5JJc7I2OTXG7C0twbTLvCfaKOLl3rSXmpAwV7W5txd91V84g==",
    +      "version": "5.1.2",
    +      "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-5.1.2.tgz",
    +      "integrity": "sha512-c6Hzc4GAv95B7suy4udszX9Zy4ETyMCgFPUDtWjdFTKH1SE9eFY/jEpHSwTH1QPuwxHpWslhckUQWbNRM4ho5g==",
           "dev": true,
           "requires": {
    +        "browserslist": "^4.20.3",
             "postcss-value-parser": "^4.2.0"
           }
         },
         "postcss-custom-media": {
    -      "version": "8.0.0",
    -      "resolved": "https://registry.npmjs.org/postcss-custom-media/-/postcss-custom-media-8.0.0.tgz",
    -      "integrity": "sha512-FvO2GzMUaTN0t1fBULDeIvxr5IvbDXcIatt6pnJghc736nqNgsGao5NT+5+WVLAQiTt6Cb3YUms0jiPaXhL//g==",
    +      "version": "8.0.2",
    +      "resolved": "https://registry.npmjs.org/postcss-custom-media/-/postcss-custom-media-8.0.2.tgz",
    +      "integrity": "sha512-7yi25vDAoHAkbhAzX9dHx2yc6ntS4jQvejrNcC+csQJAXjj15e7VcWfMgLqBNAbOvqi5uIa9huOVwdHbf+sKqg==",
           "dev": true,
    -      "requires": {}
    +      "requires": {
    +        "postcss-value-parser": "^4.2.0"
    +      }
         },
         "postcss-custom-properties": {
    -      "version": "12.1.5",
    -      "resolved": "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-12.1.5.tgz",
    -      "integrity": "sha512-FHbbB/hRo/7cxLGkc2NS7cDRIDN1oFqQnUKBiyh4b/gwk8DD8udvmRDpUhEK836kB8ggUCieHVOvZDnF9XhI3g==",
    +      "version": "12.1.8",
    +      "resolved": "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-12.1.8.tgz",
    +      "integrity": "sha512-8rbj8kVu00RQh2fQF81oBqtduiANu4MIxhyf0HbbStgPtnFlWn0yiaYTpLHrPnJbffVY1s9apWsIoVZcc68FxA==",
           "dev": true,
           "requires": {
             "postcss-value-parser": "^4.2.0"
           }
         },
         "postcss-custom-selectors": {
    -      "version": "6.0.0",
    -      "resolved": "https://registry.npmjs.org/postcss-custom-selectors/-/postcss-custom-selectors-6.0.0.tgz",
    -      "integrity": "sha512-/1iyBhz/W8jUepjGyu7V1OPcGbc636snN1yXEQCinb6Bwt7KxsiU7/bLQlp8GwAXzCh7cobBU5odNn/2zQWR8Q==",
    +      "version": "6.0.3",
    +      "resolved": "https://registry.npmjs.org/postcss-custom-selectors/-/postcss-custom-selectors-6.0.3.tgz",
    +      "integrity": "sha512-fgVkmyiWDwmD3JbpCmB45SvvlCD6z9CG6Ie6Iere22W5aHea6oWa7EM2bpnv2Fj3I94L3VbtvX9KqwSi5aFzSg==",
           "dev": true,
           "requires": {
             "postcss-selector-parser": "^6.0.4"
    @@ -26662,9 +26891,9 @@
           }
         },
         "postcss-discard-comments": {
    -      "version": "5.1.1",
    -      "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-5.1.1.tgz",
    -      "integrity": "sha512-5JscyFmvkUxz/5/+TB3QTTT9Gi9jHkcn8dcmmuN68JQcv3aQg4y88yEHHhwFB52l/NkaJ43O0dbksGMAo49nfQ==",
    +      "version": "5.1.2",
    +      "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-5.1.2.tgz",
    +      "integrity": "sha512-+L8208OVbHVF2UQf1iDmRcbdjJkuBF6IS29yBDSiWUIzpYaAhtNl6JYnYm12FnkeCwQqF5LeklOu6rAqgfBZqQ==",
           "dev": true,
           "requires": {}
         },
    @@ -26756,6 +26985,17 @@
             "postcss-value-parser": "^4.2.0"
           }
         },
    +    "postcss-import": {
    +      "version": "14.1.0",
    +      "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-14.1.0.tgz",
    +      "integrity": "sha512-flwI+Vgm4SElObFVPpTIT7SU7R3qk2L7PyduMcokiaVKuWv9d/U+Gm/QAd8NDLuykTWTkcrjOeD2Pp1rMeBTGw==",
    +      "dev": true,
    +      "requires": {
    +        "postcss-value-parser": "^4.0.0",
    +        "read-cache": "^1.0.0",
    +        "resolve": "^1.1.7"
    +      }
    +    },
         "postcss-initial": {
           "version": "4.0.1",
           "resolved": "https://registry.npmjs.org/postcss-initial/-/postcss-initial-4.0.1.tgz",
    @@ -26773,9 +27013,9 @@
           }
         },
         "postcss-lab-function": {
    -      "version": "4.1.2",
    -      "resolved": "https://registry.npmjs.org/postcss-lab-function/-/postcss-lab-function-4.1.2.tgz",
    -      "integrity": "sha512-isudf5ldhg4fk16M8viAwAbg6Gv14lVO35N3Z/49NhbwPQ2xbiEoHgrRgpgQojosF4vF7jY653ktB6dDrUOR8Q==",
    +      "version": "4.2.0",
    +      "resolved": "https://registry.npmjs.org/postcss-lab-function/-/postcss-lab-function-4.2.0.tgz",
    +      "integrity": "sha512-Zb1EO9DGYfa3CP8LhINHCcTTCTLI+R3t7AX2mKsDzdgVQ/GkCpHOTgOr6HBHslP7XDdVbqgHW5vvRPMdVANQ8w==",
           "dev": true,
           "requires": {
             "@csstools/postcss-progressive-custom-properties": "^1.1.0",
    @@ -26783,12 +27023,12 @@
           }
         },
         "postcss-load-config": {
    -      "version": "3.1.3",
    -      "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-3.1.3.tgz",
    -      "integrity": "sha512-5EYgaM9auHGtO//ljHH+v/aC/TQ5LHXtL7bQajNAUBKUVKiYE8rYpFms7+V26D9FncaGe2zwCoPQsFKb5zF/Hw==",
    +      "version": "3.1.4",
    +      "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-3.1.4.tgz",
    +      "integrity": "sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==",
           "dev": true,
           "requires": {
    -        "lilconfig": "^2.0.4",
    +        "lilconfig": "^2.0.5",
             "yaml": "^1.10.2"
           }
         },
    @@ -26804,9 +27044,9 @@
           },
           "dependencies": {
             "semver": {
    -          "version": "7.3.5",
    -          "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz",
    -          "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==",
    +          "version": "7.3.7",
    +          "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz",
    +          "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==",
               "dev": true,
               "requires": {
                 "lru-cache": "^6.0.0"
    @@ -26829,9 +27069,9 @@
           "requires": {}
         },
         "postcss-merge-longhand": {
    -      "version": "5.1.3",
    -      "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-5.1.3.tgz",
    -      "integrity": "sha512-lX8GPGvZ0iGP/IboM7HXH5JwkXvXod1Rr8H8ixwiA372hArk0zP4ZcCy4z4Prg/bfNlbbTf0KCOjCF9kKnpP/w==",
    +      "version": "5.1.5",
    +      "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-5.1.5.tgz",
    +      "integrity": "sha512-NOG1grw9wIO+60arKa2YYsrbgvP6tp+jqc7+ZD5/MalIw234ooH2C6KlR6FEn4yle7GqZoBxSK1mLBE9KPur6w==",
           "dev": true,
           "requires": {
             "postcss-value-parser": "^4.2.0",
    @@ -26839,9 +27079,9 @@
           }
         },
         "postcss-merge-rules": {
    -      "version": "5.1.1",
    -      "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-5.1.1.tgz",
    -      "integrity": "sha512-8wv8q2cXjEuCcgpIB1Xx1pIy8/rhMPIQqYKNzEdyx37m6gpq83mQQdCxgIkFgliyEnKvdwJf/C61vN4tQDq4Ww==",
    +      "version": "5.1.2",
    +      "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-5.1.2.tgz",
    +      "integrity": "sha512-zKMUlnw+zYCWoPN6yhPjtcEdlJaMUZ0WyVcxTAmw3lkkN/NDMRkOkiuctQEoWAOvH7twaxUUdvBWl0d4+hifRQ==",
           "dev": true,
           "requires": {
             "browserslist": "^4.16.6",
    @@ -26871,9 +27111,9 @@
           }
         },
         "postcss-minify-params": {
    -      "version": "5.1.2",
    -      "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-5.1.2.tgz",
    -      "integrity": "sha512-aEP+p71S/urY48HWaRHasyx4WHQJyOYaKpQ6eXl8k0kxg66Wt/30VR6/woh8THgcpRbonJD5IeD+CzNhPi1L8g==",
    +      "version": "5.1.3",
    +      "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-5.1.3.tgz",
    +      "integrity": "sha512-bkzpWcjykkqIujNL+EVEPOlLYi/eZ050oImVtHU7b4lFS82jPnsCb44gvC6pxaNt38Els3jWYDHTjHKf0koTgg==",
           "dev": true,
           "requires": {
             "browserslist": "^4.16.6",
    @@ -26882,9 +27122,9 @@
           }
         },
         "postcss-minify-selectors": {
    -      "version": "5.2.0",
    -      "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-5.2.0.tgz",
    -      "integrity": "sha512-vYxvHkW+iULstA+ctVNx0VoRAR4THQQRkG77o0oa4/mBS0OzGvvzLIvHDv/nNEM0crzN2WIyFU5X7wZhaUK3RA==",
    +      "version": "5.2.1",
    +      "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-5.2.1.tgz",
    +      "integrity": "sha512-nPJu7OjZJTsVUmPdm2TcaiohIwxP+v8ha9NehQ2ye9szv4orirRU3SDdtUmKH+10nzn0bAyOXZ0UEr7OpvLehg==",
           "dev": true,
           "requires": {
             "postcss-selector-parser": "^6.0.5"
    @@ -26936,12 +27176,13 @@
           }
         },
         "postcss-nesting": {
    -      "version": "10.1.3",
    -      "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-10.1.3.tgz",
    -      "integrity": "sha512-wUC+/YCik4wH3StsbC5fBG1s2Z3ZV74vjGqBFYtmYKlVxoio5TYGM06AiaKkQPPlkXWn72HKfS7Cw5PYxnoXSw==",
    +      "version": "10.1.8",
    +      "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-10.1.8.tgz",
    +      "integrity": "sha512-txdb3/idHYsBbNDFo1PFY0ExCgH5nfWi8G5lO49e6iuU42TydbODTzJgF5UuL5bhgeSlnAtDgfFTDG0Cl1zaSQ==",
           "dev": true,
           "requires": {
    -        "postcss-selector-parser": "^6.0.9"
    +        "@csstools/selector-specificity": "^2.0.0",
    +        "postcss-selector-parser": "^6.0.10"
           }
         },
         "postcss-normalize": {
    @@ -27043,9 +27284,9 @@
           "dev": true
         },
         "postcss-ordered-values": {
    -      "version": "5.1.1",
    -      "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-5.1.1.tgz",
    -      "integrity": "sha512-7lxgXF0NaoMIgyihL/2boNAEZKiW0+HkMhdKMTD93CjW8TdCy2hSdj8lsAo+uwm7EDG16Da2Jdmtqpedl0cMfw==",
    +      "version": "5.1.2",
    +      "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-5.1.2.tgz",
    +      "integrity": "sha512-wr2avRbW4HS2XE2ZCqpfp4N/tDC6GZKZ+SVP8UBTOVS8QWrc4TD8MYrebJrvVVlGPKszmiSCzue43NDiVtgDmg==",
           "dev": true,
           "requires": {
             "cssnano-utils": "^3.1.0",
    @@ -27076,33 +27317,37 @@
           }
         },
         "postcss-preset-env": {
    -      "version": "7.4.3",
    -      "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-7.4.3.tgz",
    -      "integrity": "sha512-dlPA65g9KuGv7YsmGyCKtFkZKCPLkoVMUE3omOl6yM+qrynVHxFvf0tMuippIrXB/sB/MyhL1FgTIbrO+qMERg==",
    +      "version": "7.7.1",
    +      "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-7.7.1.tgz",
    +      "integrity": "sha512-1sx6+Nl1wMVJzaYLVaz4OAR6JodIN/Z1upmVqLwSPCLT6XyxrEoePgNMHPH08kseLe3z06i9Vfkt/32BYEKDeA==",
           "dev": true,
           "requires": {
    -        "@csstools/postcss-color-function": "^1.0.3",
    +        "@csstools/postcss-cascade-layers": "^1.0.2",
    +        "@csstools/postcss-color-function": "^1.1.0",
             "@csstools/postcss-font-format-keywords": "^1.0.0",
    -        "@csstools/postcss-hwb-function": "^1.0.0",
    +        "@csstools/postcss-hwb-function": "^1.0.1",
             "@csstools/postcss-ic-unit": "^1.0.0",
    -        "@csstools/postcss-is-pseudo-class": "^2.0.1",
    +        "@csstools/postcss-is-pseudo-class": "^2.0.4",
             "@csstools/postcss-normalize-display-values": "^1.0.0",
    -        "@csstools/postcss-oklab-function": "^1.0.2",
    +        "@csstools/postcss-oklab-function": "^1.1.0",
             "@csstools/postcss-progressive-custom-properties": "^1.3.0",
    -        "autoprefixer": "^10.4.4",
    -        "browserslist": "^4.20.2",
    +        "@csstools/postcss-stepped-value-functions": "^1.0.0",
    +        "@csstools/postcss-trigonometric-functions": "^1.0.1",
    +        "@csstools/postcss-unset-value": "^1.0.1",
    +        "autoprefixer": "^10.4.7",
    +        "browserslist": "^4.20.3",
             "css-blank-pseudo": "^3.0.3",
             "css-has-pseudo": "^3.0.4",
             "css-prefers-color-scheme": "^6.0.3",
    -        "cssdb": "^6.5.0",
    -        "postcss-attribute-case-insensitive": "^5.0.0",
    +        "cssdb": "^6.6.3",
    +        "postcss-attribute-case-insensitive": "^5.0.1",
             "postcss-clamp": "^4.1.0",
    -        "postcss-color-functional-notation": "^4.2.2",
    +        "postcss-color-functional-notation": "^4.2.3",
             "postcss-color-hex-alpha": "^8.0.3",
             "postcss-color-rebeccapurple": "^7.0.2",
    -        "postcss-custom-media": "^8.0.0",
    -        "postcss-custom-properties": "^12.1.5",
    -        "postcss-custom-selectors": "^6.0.0",
    +        "postcss-custom-media": "^8.0.1",
    +        "postcss-custom-properties": "^12.1.7",
    +        "postcss-custom-selectors": "^6.0.2",
             "postcss-dir-pseudo-class": "^6.0.4",
             "postcss-double-position-gradients": "^3.1.1",
             "postcss-env-function": "^4.0.6",
    @@ -27112,27 +27357,27 @@
             "postcss-gap-properties": "^3.0.3",
             "postcss-image-set-function": "^4.0.6",
             "postcss-initial": "^4.0.1",
    -        "postcss-lab-function": "^4.1.2",
    +        "postcss-lab-function": "^4.2.0",
             "postcss-logical": "^5.0.4",
             "postcss-media-minmax": "^5.0.0",
    -        "postcss-nesting": "^10.1.3",
    +        "postcss-nesting": "^10.1.7",
             "postcss-opacity-percentage": "^1.1.2",
             "postcss-overflow-shorthand": "^3.0.3",
             "postcss-page-break": "^3.0.4",
             "postcss-place": "^7.0.4",
    -        "postcss-pseudo-class-any-link": "^7.1.1",
    +        "postcss-pseudo-class-any-link": "^7.1.4",
             "postcss-replace-overflow-wrap": "^4.0.0",
    -        "postcss-selector-not": "^5.0.0",
    +        "postcss-selector-not": "^6.0.0",
             "postcss-value-parser": "^4.2.0"
           }
         },
         "postcss-pseudo-class-any-link": {
    -      "version": "7.1.1",
    -      "resolved": "https://registry.npmjs.org/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-7.1.1.tgz",
    -      "integrity": "sha512-JRoLFvPEX/1YTPxRxp1JO4WxBVXJYrSY7NHeak5LImwJ+VobFMwYDQHvfTXEpcn+7fYIeGkC29zYFhFWIZD8fg==",
    +      "version": "7.1.4",
    +      "resolved": "https://registry.npmjs.org/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-7.1.4.tgz",
    +      "integrity": "sha512-JxRcLXm96u14N3RzFavPIE9cRPuOqLDuzKeBsqi4oRk4vt8n0A7I0plFs/VXTg7U2n7g/XkQi0OwqTO3VWBfEg==",
           "dev": true,
           "requires": {
    -        "postcss-selector-parser": "^6.0.9"
    +        "postcss-selector-parser": "^6.0.10"
           }
         },
         "postcss-reduce-initial": {
    @@ -27162,18 +27407,18 @@
           "requires": {}
         },
         "postcss-selector-not": {
    -      "version": "5.0.0",
    -      "resolved": "https://registry.npmjs.org/postcss-selector-not/-/postcss-selector-not-5.0.0.tgz",
    -      "integrity": "sha512-/2K3A4TCP9orP4TNS7u3tGdRFVKqz/E6pX3aGnriPG0jU78of8wsUcqE4QAhWEU0d+WnMSF93Ah3F//vUtK+iQ==",
    +      "version": "6.0.0",
    +      "resolved": "https://registry.npmjs.org/postcss-selector-not/-/postcss-selector-not-6.0.0.tgz",
    +      "integrity": "sha512-i/HI/VNd3V9e1WOLCwJsf9nePBRXqcGtVibcJ9FsVo0agfDEfsLSlFt94aYjY35wUNcdG0KrvdyjEr7It50wLQ==",
           "dev": true,
           "requires": {
    -        "balanced-match": "^1.0.0"
    +        "postcss-selector-parser": "^6.0.10"
           }
         },
         "postcss-selector-parser": {
    -      "version": "6.0.9",
    -      "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.9.tgz",
    -      "integrity": "sha512-UO3SgnZOVTwu4kyLR22UQ1xZh086RyNZppb7lLAKBFK8a32ttG5i87Y/P3+2bRSjZNyJ1B7hfFNo273tKe9YxQ==",
    +      "version": "6.0.10",
    +      "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz",
    +      "integrity": "sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==",
           "dev": true,
           "requires": {
             "cssesc": "^3.0.0",
    @@ -27196,6 +27441,19 @@
               "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==",
               "dev": true
             },
    +        "css-select": {
    +          "version": "4.3.0",
    +          "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz",
    +          "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==",
    +          "dev": true,
    +          "requires": {
    +            "boolbase": "^1.0.0",
    +            "css-what": "^6.0.1",
    +            "domhandler": "^4.3.1",
    +            "domutils": "^2.8.0",
    +            "nth-check": "^2.0.1"
    +          }
    +        },
             "css-tree": {
               "version": "1.1.3",
               "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz",
    @@ -27206,18 +27464,49 @@
                 "source-map": "^0.6.1"
               }
             },
    +        "dom-serializer": {
    +          "version": "1.4.1",
    +          "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz",
    +          "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==",
    +          "dev": true,
    +          "requires": {
    +            "domelementtype": "^2.0.1",
    +            "domhandler": "^4.2.0",
    +            "entities": "^2.0.0"
    +          }
    +        },
    +        "domhandler": {
    +          "version": "4.3.1",
    +          "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz",
    +          "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==",
    +          "dev": true,
    +          "requires": {
    +            "domelementtype": "^2.2.0"
    +          }
    +        },
    +        "domutils": {
    +          "version": "2.8.0",
    +          "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz",
    +          "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==",
    +          "dev": true,
    +          "requires": {
    +            "dom-serializer": "^1.0.1",
    +            "domelementtype": "^2.2.0",
    +            "domhandler": "^4.2.0"
    +          }
    +        },
    +        "entities": {
    +          "version": "2.2.0",
    +          "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz",
    +          "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==",
    +          "dev": true
    +        },
             "mdn-data": {
               "version": "2.0.14",
               "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz",
               "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==",
               "dev": true
             },
    -        "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
    -        },
             "svgo": {
               "version": "2.8.0",
               "resolved": "https://registry.npmjs.org/svgo/-/svgo-2.8.0.tgz",
    @@ -27257,9 +27546,9 @@
           "dev": true
         },
         "prettier": {
    -      "version": "2.6.1",
    -      "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.6.1.tgz",
    -      "integrity": "sha512-8UVbTBYGwN37Bs9LERmxCPjdvPxlEowx2urIL6urHzdb3SDq4B/Z6xLFCblrSnE4iKWcS6ziJ3aOYrc1kz/E2A==",
    +      "version": "2.6.2",
    +      "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.6.2.tgz",
    +      "integrity": "sha512-PkUpF+qoXTqhOeWL9fu7As8LXsIUZ1WYaJiY/a7McAQzxjk82OF0tibkFXVCDImZtWxbvojFjerkiLb0/q8mew==",
           "dev": true
         },
         "prettier-linter-helpers": {
    @@ -27393,14 +27682,17 @@
         "q": {
           "version": "1.5.1",
           "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz",
    -      "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=",
    +      "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==",
           "dev": true
         },
         "qs": {
    -      "version": "6.9.7",
    -      "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.7.tgz",
    -      "integrity": "sha512-IhMFgUmuNpyRfxA90umL7ByLlgRXu6tIfKPpF5TmcfRLlLCckfP/g3IQmju6jjpu+Hh8rA+2p6A27ZSPOOHdKw==",
    -      "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"
    +      }
         },
         "queue-microtask": {
           "version": "1.2.3",
    @@ -27426,7 +27718,7 @@
         "railroad-diagrams": {
           "version": "1.0.0",
           "resolved": "https://registry.npmjs.org/railroad-diagrams/-/railroad-diagrams-1.0.0.tgz",
    -      "integrity": "sha1-635iZ1SN3t+4mcG5Dlc3RVnN234=",
    +      "integrity": "sha512-cz93DjNeLY0idrCNOH6PviZGRN9GJhsdm9hpn1YCS879fj4W+x5IFJhhkRZcwVgMmFF7R82UA/7Oh+R8lLZg6A==",
           "dev": true
         },
         "randexp": {
    @@ -27455,13 +27747,13 @@
           "dev": true
         },
         "raw-body": {
    -      "version": "2.4.3",
    -      "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.3.tgz",
    -      "integrity": "sha512-UlTNLIcu0uzb4D2f4WltY6cVjLi+/jEN4lgEUj3E04tpMDpUlkBo/eSn6zou9hum2VMNpCCUone0O0WeJim07g==",
    +      "version": "2.5.1",
    +      "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz",
    +      "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==",
           "dev": true,
           "requires": {
             "bytes": "3.1.2",
    -        "http-errors": "1.8.1",
    +        "http-errors": "2.0.0",
             "iconv-lite": "0.4.24",
             "unpipe": "1.0.0"
           },
    @@ -27507,18 +27799,18 @@
           }
         },
         "react-copy-to-clipboard": {
    -      "version": "5.0.4",
    -      "resolved": "https://registry.npmjs.org/react-copy-to-clipboard/-/react-copy-to-clipboard-5.0.4.tgz",
    -      "integrity": "sha512-IeVAiNVKjSPeGax/Gmkqfa/+PuMTBhutEvFUaMQLwE2tS0EXrAdgOpWDX26bWTXF3HrioorR7lr08NqeYUWQCQ==",
    +      "version": "5.1.0",
    +      "resolved": "https://registry.npmjs.org/react-copy-to-clipboard/-/react-copy-to-clipboard-5.1.0.tgz",
    +      "integrity": "sha512-k61RsNgAayIJNoy9yDsYzDe/yAZAzEbEgcz3DZMhF686LEyukcE1hzurxe85JandPUG+yTfGVFzuEw3xt8WP/A==",
           "requires": {
    -        "copy-to-clipboard": "^3",
    -        "prop-types": "^15.5.8"
    +        "copy-to-clipboard": "^3.3.1",
    +        "prop-types": "^15.8.1"
           }
         },
         "react-dev-utils": {
    -      "version": "12.0.0",
    -      "resolved": "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-12.0.0.tgz",
    -      "integrity": "sha512-xBQkitdxozPxt1YZ9O1097EJiVpwHr9FoAuEVURCKV0Av8NBERovJauzP7bo1ThvuhZ4shsQ1AJiu4vQpoT1AQ==",
    +      "version": "12.0.1",
    +      "resolved": "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-12.0.1.tgz",
    +      "integrity": "sha512-84Ivxmr17KjUupyqzFode6xKhjwuEJDROWKJy/BthkL7Wn6NJ8h4WE6k/exAv6ImS+0oZLRRW5j/aINMHyeGeQ==",
           "dev": true,
           "requires": {
             "@babel/code-frame": "^7.16.0",
    @@ -27540,7 +27832,7 @@
             "open": "^8.4.0",
             "pkg-up": "^3.1.0",
             "prompts": "^2.4.2",
    -        "react-error-overlay": "^6.0.10",
    +        "react-error-overlay": "^6.0.11",
             "recursive-readdir": "^2.2.2",
             "shell-quote": "^1.7.3",
             "strip-ansi": "^6.0.1",
    @@ -27618,9 +27910,9 @@
           }
         },
         "react-error-overlay": {
    -      "version": "6.0.10",
    -      "resolved": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-6.0.10.tgz",
    -      "integrity": "sha512-mKR90fX7Pm5seCOfz8q9F+66VCc1PGsWSBxKbITjfKVQHMNF2zudxHnMdJiB1fRCb+XsbQV9sO9DCkgsMQgBIA==",
    +      "version": "6.0.11",
    +      "resolved": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-6.0.11.tgz",
    +      "integrity": "sha512-/6UZ2qgEyH2aqzYZgQPxEnz33NJ2gNsnHA2o5+o4wW9bLM/JYQitNP9xPhsXwC08hMMovfGe/8retsdDsczPRg==",
           "dev": true
         },
         "react-infinite-scroll-component": {
    @@ -27672,9 +27964,9 @@
           }
         },
         "react-router": {
    -      "version": "5.2.1",
    -      "resolved": "https://registry.npmjs.org/react-router/-/react-router-5.2.1.tgz",
    -      "integrity": "sha512-lIboRiOtDLFdg1VTemMwud9vRVuOCZmUIT/7lUoZiSpPODiiH1UQlfXy+vPLC/7IWdFYnhRwAyNqA/+I7wnvKQ==",
    +      "version": "5.3.3",
    +      "resolved": "https://registry.npmjs.org/react-router/-/react-router-5.3.3.tgz",
    +      "integrity": "sha512-mzQGUvS3bM84TnbtMYR8ZjKnuPJ71IjSzR+DE6UkUqvN4czWIqEs17yLL8xkAycv4ev0AiN+IGrWu88vJs/p2w==",
           "requires": {
             "@babel/runtime": "^7.12.13",
             "history": "^4.9.0",
    @@ -27688,19 +27980,6 @@
             "tiny-warning": "^1.0.0"
           },
           "dependencies": {
    -        "isarray": {
    -          "version": "0.0.1",
    -          "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
    -          "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8="
    -        },
    -        "path-to-regexp": {
    -          "version": "1.8.0",
    -          "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz",
    -          "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==",
    -          "requires": {
    -            "isarray": "0.0.1"
    -          }
    -        },
             "react-is": {
               "version": "16.13.1",
               "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz",
    @@ -27709,23 +27988,23 @@
           }
         },
         "react-router-dom": {
    -      "version": "5.3.0",
    -      "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-5.3.0.tgz",
    -      "integrity": "sha512-ObVBLjUZsphUUMVycibxgMdh5jJ1e3o+KpAZBVeHcNQZ4W+uUGGWsokurzlF4YOldQYRQL4y6yFRWM4m3svmuQ==",
    +      "version": "5.3.3",
    +      "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-5.3.3.tgz",
    +      "integrity": "sha512-Ov0tGPMBgqmbu5CDmN++tv2HQ9HlWDuWIIqn4b88gjlAN5IHI+4ZUZRcpz9Hl0azFIwihbLDYw1OiHGRo7ZIng==",
           "requires": {
             "@babel/runtime": "^7.12.13",
             "history": "^4.9.0",
             "loose-envify": "^1.3.1",
             "prop-types": "^15.6.2",
    -        "react-router": "5.2.1",
    +        "react-router": "5.3.3",
             "tiny-invariant": "^1.0.2",
             "tiny-warning": "^1.0.0"
           }
         },
         "react-scripts": {
    -      "version": "5.0.0",
    -      "resolved": "https://registry.npmjs.org/react-scripts/-/react-scripts-5.0.0.tgz",
    -      "integrity": "sha512-3i0L2CyIlROz7mxETEdfif6Sfhh9Lfpzi10CtcGs1emDQStmZfWjJbAIMtRD0opVUjQuFWqHZyRZ9PPzKCFxWg==",
    +      "version": "5.0.1",
    +      "resolved": "https://registry.npmjs.org/react-scripts/-/react-scripts-5.0.1.tgz",
    +      "integrity": "sha512-8VAmEm/ZAwQzJ+GOMLbBsTdDKOpuZh7RPs0UymvBR2vRk4iZWCskjbFnxqjrzoIvlNNRZ3QJFx6/qDSi6zSnaQ==",
           "dev": true,
           "requires": {
             "@babel/core": "^7.16.0",
    @@ -27744,7 +28023,7 @@
             "dotenv": "^10.0.0",
             "dotenv-expand": "^5.1.0",
             "eslint": "^8.3.0",
    -        "eslint-config-react-app": "^7.0.0",
    +        "eslint-config-react-app": "^7.0.1",
             "eslint-webpack-plugin": "^3.1.1",
             "file-loader": "^6.2.0",
             "fs-extra": "^10.0.0",
    @@ -27762,7 +28041,7 @@
             "postcss-preset-env": "^7.0.1",
             "prompts": "^2.4.2",
             "react-app-polyfill": "^3.0.0",
    -        "react-dev-utils": "^12.0.0",
    +        "react-dev-utils": "^12.0.1",
             "react-refresh": "^0.11.0",
             "resolve": "^1.20.0",
             "resolve-url-loader": "^4.0.0",
    @@ -27778,10 +28057,16 @@
             "workbox-webpack-plugin": "^6.4.1"
           },
           "dependencies": {
    +        "camelcase": {
    +          "version": "6.3.0",
    +          "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz",
    +          "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==",
    +          "dev": true
    +        },
             "semver": {
    -          "version": "7.3.5",
    -          "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz",
    -          "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==",
    +          "version": "7.3.7",
    +          "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz",
    +          "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==",
               "dev": true,
               "requires": {
                 "lru-cache": "^6.0.0"
    @@ -27790,12 +28075,12 @@
           }
         },
         "react-shallow-renderer": {
    -      "version": "16.14.1",
    -      "resolved": "https://registry.npmjs.org/react-shallow-renderer/-/react-shallow-renderer-16.14.1.tgz",
    -      "integrity": "sha512-rkIMcQi01/+kxiTE9D3fdS959U1g7gs+/rborw++42m1O9FAQiNI/UNRZExVUoAOprn4umcXf+pFRou8i4zuBg==",
    +      "version": "16.15.0",
    +      "resolved": "https://registry.npmjs.org/react-shallow-renderer/-/react-shallow-renderer-16.15.0.tgz",
    +      "integrity": "sha512-oScf2FqQ9LFVQgA73vr86xl2NaOIX73rh+YFqcOp68CWj56tSfgtGKrEbyhCj0rSijyG9M1CYprTh39fBi5hzA==",
           "requires": {
             "object-assign": "^4.1.1",
    -        "react-is": "^16.12.0 || ^17.0.0"
    +        "react-is": "^16.12.0 || ^17.0.0 || ^18.0.0"
           }
         },
         "react-test-renderer": {
    @@ -27832,6 +28117,15 @@
             "react-transition-group": "^3.0.0"
           }
         },
    +    "read-cache": {
    +      "version": "1.0.0",
    +      "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz",
    +      "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==",
    +      "dev": true,
    +      "requires": {
    +        "pify": "^2.3.0"
    +      }
    +    },
         "readable-stream": {
           "version": "3.6.0",
           "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz",
    @@ -27892,9 +28186,9 @@
           "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA=="
         },
         "regenerator-transform": {
    -      "version": "0.14.5",
    -      "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.5.tgz",
    -      "integrity": "sha512-eOf6vka5IO151Jfsw2NO9WpGX58W6wWmefK3I1zEGr0lOD0u8rwPaNqQL1aRxUaxLeKO3ArNh3VYg1KbaD+FFw==",
    +      "version": "0.15.0",
    +      "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.0.tgz",
    +      "integrity": "sha512-LsrGtPmbYg19bcPHwdtmXwbW+TqNvtY4riE3P83foeHRroMbH6/2ddFBfab3t7kbzc7v7p4wbkIecHImqt0QNg==",
           "dev": true,
           "requires": {
             "@babel/runtime": "^7.8.4"
    @@ -27907,12 +28201,13 @@
           "dev": true
         },
         "regexp.prototype.flags": {
    -      "version": "1.4.1",
    -      "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.1.tgz",
    -      "integrity": "sha512-pMR7hBVUUGI7PMA37m2ofIdQCsomVnas+Jn5UPGAHQ+/LlwKm/aTLJHdasmHRzlfeZwHiAOaRSo2rbBDm3nNUQ==",
    +      "version": "1.4.3",
    +      "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz",
    +      "integrity": "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==",
           "requires": {
             "call-bind": "^1.0.2",
    -        "define-properties": "^1.1.3"
    +        "define-properties": "^1.1.3",
    +        "functions-have-names": "^1.2.2"
           }
         },
         "regexpp": {
    @@ -27953,7 +28248,7 @@
             "jsesc": {
               "version": "0.5.0",
               "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz",
    -          "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=",
    +          "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==",
               "dev": true
             }
           }
    @@ -27961,7 +28256,7 @@
         "relateurl": {
           "version": "0.2.7",
           "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz",
    -      "integrity": "sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=",
    +      "integrity": "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==",
           "dev": true
         },
         "renderkid": {
    @@ -27975,12 +28270,64 @@
             "htmlparser2": "^6.1.0",
             "lodash": "^4.17.21",
             "strip-ansi": "^6.0.1"
    +      },
    +      "dependencies": {
    +        "css-select": {
    +          "version": "4.3.0",
    +          "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz",
    +          "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==",
    +          "dev": true,
    +          "requires": {
    +            "boolbase": "^1.0.0",
    +            "css-what": "^6.0.1",
    +            "domhandler": "^4.3.1",
    +            "domutils": "^2.8.0",
    +            "nth-check": "^2.0.1"
    +          }
    +        },
    +        "dom-serializer": {
    +          "version": "1.4.1",
    +          "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz",
    +          "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==",
    +          "dev": true,
    +          "requires": {
    +            "domelementtype": "^2.0.1",
    +            "domhandler": "^4.2.0",
    +            "entities": "^2.0.0"
    +          }
    +        },
    +        "domhandler": {
    +          "version": "4.3.1",
    +          "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz",
    +          "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==",
    +          "dev": true,
    +          "requires": {
    +            "domelementtype": "^2.2.0"
    +          }
    +        },
    +        "domutils": {
    +          "version": "2.8.0",
    +          "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz",
    +          "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==",
    +          "dev": true,
    +          "requires": {
    +            "dom-serializer": "^1.0.1",
    +            "domelementtype": "^2.2.0",
    +            "domhandler": "^4.2.0"
    +          }
    +        },
    +        "entities": {
    +          "version": "2.2.0",
    +          "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz",
    +          "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==",
    +          "dev": true
    +        }
           }
         },
         "require-directory": {
           "version": "2.1.1",
           "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
    -      "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=",
    +      "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==",
           "dev": true
         },
         "require-from-string": {
    @@ -27992,7 +28339,7 @@
         "requires-port": {
           "version": "1.0.0",
           "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz",
    -      "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8="
    +      "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ=="
         },
         "resize-observer-polyfill": {
           "version": "1.5.1",
    @@ -28066,12 +28413,6 @@
                 "picocolors": "^0.2.1",
                 "source-map": "^0.6.1"
               }
    -        },
    -        "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
             }
           }
         },
    @@ -28109,9 +28450,9 @@
           }
         },
         "rollup": {
    -      "version": "2.70.1",
    -      "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.70.1.tgz",
    -      "integrity": "sha512-CRYsI5EuzLbXdxC6RnYhOuRdtz4bhejPMSWjsFLfVM/7w/85n2szZv6yExqUXsBdz5KT8eoubeyDUDjhLHEslA==",
    +      "version": "2.75.6",
    +      "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.75.6.tgz",
    +      "integrity": "sha512-OEf0TgpC9vU6WGROJIk1JA3LR5vk/yvqlzxqdrE2CzzXnqKXNzbAwlWUXis8RS3ZPe7LAq+YUxsRa0l3r27MLA==",
           "dev": true,
           "requires": {
             "fsevents": "~2.3.2"
    @@ -28154,7 +28495,7 @@
         "rst-selector-parser": {
           "version": "2.2.3",
           "resolved": "https://registry.npmjs.org/rst-selector-parser/-/rst-selector-parser-2.2.3.tgz",
    -      "integrity": "sha1-gbIw6i/MYGbInjRy3nlChdmwPZE=",
    +      "integrity": "sha512-nDG1rZeP6oFTLN6yNDV/uiAvs1+FS/KlrEwh7+y7dpuApDBy6bI2HTBcc0/V8lv9OTqfyD34eF7au2pm8aBbhA==",
           "dev": true,
           "requires": {
             "lodash.flattendeep": "^4.4.0",
    @@ -28259,16 +28600,16 @@
         "select-hose": {
           "version": "2.0.0",
           "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz",
    -      "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=",
    +      "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==",
           "dev": true
         },
         "selfsigned": {
    -      "version": "2.0.0",
    -      "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.0.0.tgz",
    -      "integrity": "sha512-cUdFiCbKoa1mZ6osuJs2uDHrs0k0oprsKveFiiaBKCNq3SYyb5gs2HxhQyDNLCmL51ZZThqi4YNDpCK6GOP1iQ==",
    +      "version": "2.0.1",
    +      "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.0.1.tgz",
    +      "integrity": "sha512-LmME957M1zOsUhG+67rAjKfiWFox3SBxE/yymatMZsAx+oMrJ0YQ8AToOnyCm7xbeg2ep37IHLxdu0o2MavQOQ==",
           "dev": true,
           "requires": {
    -        "node-forge": "^1.2.0"
    +        "node-forge": "^1"
           }
         },
         "semver": {
    @@ -28278,24 +28619,24 @@
           "dev": true
         },
         "send": {
    -      "version": "0.17.2",
    -      "resolved": "https://registry.npmjs.org/send/-/send-0.17.2.tgz",
    -      "integrity": "sha512-UJYB6wFSJE3G00nEivR5rgWp8c2xXvJ3OPWPhmuteU0IKj8nKbG3DrjiOmLwpnHGYWAVwA69zmTm++YG0Hmwww==",
    +      "version": "0.18.0",
    +      "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz",
    +      "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==",
           "dev": true,
           "requires": {
             "debug": "2.6.9",
    -        "depd": "~1.1.2",
    -        "destroy": "~1.0.4",
    +        "depd": "2.0.0",
    +        "destroy": "1.2.0",
             "encodeurl": "~1.0.2",
             "escape-html": "~1.0.3",
             "etag": "~1.8.1",
             "fresh": "0.5.2",
    -        "http-errors": "1.8.1",
    +        "http-errors": "2.0.0",
             "mime": "1.6.0",
             "ms": "2.1.3",
    -        "on-finished": "~2.3.0",
    +        "on-finished": "2.4.1",
             "range-parser": "~1.2.1",
    -        "statuses": "~1.5.0"
    +        "statuses": "2.0.1"
           },
           "dependencies": {
             "debug": {
    @@ -28310,7 +28651,7 @@
                 "ms": {
                   "version": "2.0.0",
                   "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
    -              "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
    +              "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
                   "dev": true
                 }
               }
    @@ -28335,7 +28676,7 @@
         "serve-index": {
           "version": "1.9.1",
           "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz",
    -      "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=",
    +      "integrity": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==",
           "dev": true,
           "requires": {
             "accepts": "~1.3.4",
    @@ -28356,10 +28697,16 @@
                 "ms": "2.0.0"
               }
             },
    +        "depd": {
    +          "version": "1.1.2",
    +          "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
    +          "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==",
    +          "dev": true
    +        },
             "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=",
    +          "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==",
               "dev": true,
               "requires": {
                 "depd": "~1.1.2",
    @@ -28371,13 +28718,13 @@
             "inherits": {
               "version": "2.0.3",
               "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
    -          "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
    +          "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==",
               "dev": true
             },
             "ms": {
               "version": "2.0.0",
               "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
    -          "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
    +          "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
               "dev": true
             },
             "setprototypeof": {
    @@ -28385,19 +28732,25 @@
               "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz",
               "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==",
               "dev": true
    +        },
    +        "statuses": {
    +          "version": "1.5.0",
    +          "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz",
    +          "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==",
    +          "dev": true
             }
           }
         },
         "serve-static": {
    -      "version": "1.14.2",
    -      "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.2.tgz",
    -      "integrity": "sha512-+TMNA9AFxUEGuC0z2mevogSnn9MXKb4fa7ngeRMJaaGv8vTwnIEkKi+QGvPt33HSnf8pRS+WGM0EbMtCJLKMBQ==",
    +      "version": "1.15.0",
    +      "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz",
    +      "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==",
           "dev": true,
           "requires": {
             "encodeurl": "~1.0.2",
             "escape-html": "~1.0.3",
             "parseurl": "~1.3.3",
    -        "send": "0.17.2"
    +        "send": "0.18.0"
           }
         },
         "setprototypeof": {
    @@ -28445,13 +28798,13 @@
           "dev": true
         },
         "sinon": {
    -      "version": "13.0.1",
    -      "resolved": "https://registry.npmjs.org/sinon/-/sinon-13.0.1.tgz",
    -      "integrity": "sha512-8yx2wIvkBjIq/MGY1D9h1LMraYW+z1X0mb648KZnKSdvLasvDu7maa0dFaNYdTDczFgbjNw2tOmWdTk9saVfwQ==",
    +      "version": "13.0.2",
    +      "resolved": "https://registry.npmjs.org/sinon/-/sinon-13.0.2.tgz",
    +      "integrity": "sha512-KvOrztAVqzSJWMDoxM4vM+GPys1df2VBoXm+YciyB/OLMamfS3VXh3oGh5WtrAGSzrgczNWFFY22oKb7Fi5eeA==",
           "dev": true,
           "requires": {
             "@sinonjs/commons": "^1.8.3",
    -        "@sinonjs/fake-timers": "^9.0.0",
    +        "@sinonjs/fake-timers": "^9.1.2",
             "@sinonjs/samsam": "^6.1.1",
             "diff": "^5.0.0",
             "nise": "^5.1.1",
    @@ -28459,9 +28812,9 @@
           },
           "dependencies": {
             "@sinonjs/fake-timers": {
    -          "version": "9.1.1",
    -          "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-9.1.1.tgz",
    -          "integrity": "sha512-Wp5vwlZ0lOqpSYGKqr53INws9HLkt6JDc/pDZcPf7bchQnrXJMXPns8CXx0hFikMSGSWfvtvvpb2gtMVfkWagA==",
    +          "version": "9.1.2",
    +          "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-9.1.2.tgz",
    +          "integrity": "sha512-BPS4ynJW/o92PUR4wgriz2Ud5gpST5vz6GQfMixEDK0Z8ZCUv2M7SkBLykH56T++Xs+8ln9zTGbOvNGIe02/jw==",
               "dev": true,
               "requires": {
                 "@sinonjs/commons": "^1.7.0"
    @@ -28499,9 +28852,9 @@
           "dev": true
         },
         "source-map": {
    -      "version": "0.5.7",
    -      "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
    -      "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
    +      "version": "0.6.1",
    +      "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
    +      "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
           "dev": true
         },
         "source-map-js": {
    @@ -28528,14 +28881,6 @@
           "requires": {
             "buffer-from": "^1.0.0",
             "source-map": "^0.6.0"
    -      },
    -      "dependencies": {
    -        "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
    -        }
           }
         },
         "sourcemap-codec": {
    @@ -28574,7 +28919,7 @@
         "sprintf-js": {
           "version": "1.0.3",
           "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
    -      "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=",
    +      "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==",
           "dev": true
         },
         "stable": {
    @@ -28601,15 +28946,15 @@
           }
         },
         "stackframe": {
    -      "version": "1.2.1",
    -      "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.2.1.tgz",
    -      "integrity": "sha512-h88QkzREN/hy8eRdyNhhsO7RSJ5oyTqxxmmn0dzBIMUclZsjpfmrsg81vp8mjjAs2vAZ72nyWxRUwSwmh0e4xg==",
    +      "version": "1.3.4",
    +      "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.3.4.tgz",
    +      "integrity": "sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==",
           "dev": true
         },
         "statuses": {
    -      "version": "1.5.0",
    -      "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz",
    -      "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=",
    +      "version": "2.0.1",
    +      "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz",
    +      "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==",
           "dev": true
         },
         "string_decoder": {
    @@ -28681,34 +29026,36 @@
           }
         },
         "string.prototype.trim": {
    -      "version": "1.2.5",
    -      "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.5.tgz",
    -      "integrity": "sha512-Lnh17webJVsD6ECeovpVN17RlAKjmz4rF9S+8Y45CkMc/ufVpTkU3vZIyIC7sllQ1FCvObZnnCdNs/HXTUOTlg==",
    +      "version": "1.2.6",
    +      "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.6.tgz",
    +      "integrity": "sha512-8lMR2m+U0VJTPp6JjvJTtGyc4FIGq9CdRt7O9p6T0e6K4vjU+OP+SQJpbe/SBmRcCUIvNUnjsbmY6lnMp8MhsQ==",
           "dev": true,
           "requires": {
             "call-bind": "^1.0.2",
    -        "define-properties": "^1.1.3",
    -        "es-abstract": "^1.19.1"
    +        "define-properties": "^1.1.4",
    +        "es-abstract": "^1.19.5"
           }
         },
         "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==",
    +      "version": "1.0.5",
    +      "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.5.tgz",
    +      "integrity": "sha512-I7RGvmjV4pJ7O3kdf+LXFpVfdNOxtCW/2C8f6jNiW4+PQchwxkCDzlk1/7p+Wl4bqFIZeF47qAHXLuHHWKAxog==",
           "dev": true,
           "requires": {
             "call-bind": "^1.0.2",
    -        "define-properties": "^1.1.3"
    +        "define-properties": "^1.1.4",
    +        "es-abstract": "^1.19.5"
           }
         },
         "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==",
    +      "version": "1.0.5",
    +      "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.5.tgz",
    +      "integrity": "sha512-THx16TJCGlsN0o6dl2o6ncWUsdgnLRSA23rRE5pyGBw/mLr3Ej/R2LaqCtgP8VNMGZsvMWnf9ooZPyY2bHvUFg==",
           "dev": true,
           "requires": {
             "call-bind": "^1.0.2",
    -        "define-properties": "^1.1.3"
    +        "define-properties": "^1.1.4",
    +        "es-abstract": "^1.19.5"
           }
         },
         "stringify-object": {
    @@ -28870,7 +29217,7 @@
             "color-name": {
               "version": "1.1.3",
               "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
    -          "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
    +          "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==",
               "dev": true
             },
             "css-select": {
    @@ -28919,16 +29266,22 @@
                 }
               }
             },
    +        "entities": {
    +          "version": "2.2.0",
    +          "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz",
    +          "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==",
    +          "dev": true
    +        },
             "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=",
    +          "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
               "dev": true
             },
             "has-flag": {
               "version": "3.0.0",
               "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
    -          "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
    +          "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==",
               "dev": true
             },
             "js-yaml": {
    @@ -28968,29 +29321,30 @@
           "dev": true
         },
         "tailwindcss": {
    -      "version": "3.0.23",
    -      "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.0.23.tgz",
    -      "integrity": "sha512-+OZOV9ubyQ6oI2BXEhzw4HrqvgcARY38xv3zKcjnWtMIZstEsXdI9xftd1iB7+RbOnj2HOEzkA0OyB5BaSxPQA==",
    +      "version": "3.1.2",
    +      "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.1.2.tgz",
    +      "integrity": "sha512-yJ6L5s1U5AeS5g7HHy212zdQfjwD426FBfm59pet/JsyneuZuD4C2W7PpJEg4ppisiB21uLqtNagv8KXury3+Q==",
           "dev": true,
           "requires": {
             "arg": "^5.0.1",
    -        "chalk": "^4.1.2",
             "chokidar": "^3.5.3",
             "color-name": "^1.1.4",
    -        "cosmiconfig": "^7.0.1",
    -        "detective": "^5.2.0",
    +        "detective": "^5.2.1",
             "didyoumean": "^1.2.2",
             "dlv": "^1.1.3",
             "fast-glob": "^3.2.11",
             "glob-parent": "^6.0.2",
             "is-glob": "^4.0.3",
    +        "lilconfig": "^2.0.5",
             "normalize-path": "^3.0.0",
    -        "object-hash": "^2.2.0",
    -        "postcss": "^8.4.6",
    +        "object-hash": "^3.0.0",
    +        "picocolors": "^1.0.0",
    +        "postcss": "^8.4.14",
    +        "postcss-import": "^14.1.0",
             "postcss-js": "^4.0.0",
    -        "postcss-load-config": "^3.1.0",
    +        "postcss-load-config": "^3.1.4",
             "postcss-nested": "5.0.6",
    -        "postcss-selector-parser": "^6.0.9",
    +        "postcss-selector-parser": "^6.0.10",
             "postcss-value-parser": "^4.2.0",
             "quick-lru": "^5.1.1",
             "resolve": "^1.22.0"
    @@ -29009,32 +29363,25 @@
           "dev": true
         },
         "tempusdominus-bootstrap-4": {
    -      "version": "5.39.0",
    -      "resolved": "https://registry.npmjs.org/tempusdominus-bootstrap-4/-/tempusdominus-bootstrap-4-5.39.0.tgz",
    -      "integrity": "sha512-vYnkmQYQq4+A51WyRc/6e03eM0BHDoPaxd556K1pd4Nhr0eGeB3+Mi9b+3CDx4189fg3gQlrsKzgJiHPRwSX3Q==",
    +      "version": "5.39.2",
    +      "resolved": "https://registry.npmjs.org/tempusdominus-bootstrap-4/-/tempusdominus-bootstrap-4-5.39.2.tgz",
    +      "integrity": "sha512-8Au4miSAsMGdsElPg87EUmsN7aGJFaRA5Y8Ale7dDTfhhnQL1Za53LclIJkq+t/7NO5+Ufr1jY7tmEPvWGHaVg==",
           "requires": {
    -        "bootstrap": "^4.5.2",
    -        "jquery": "^3.5.1",
    -        "moment": "^2.29.0",
    -        "moment-timezone": "^0.5.31",
    +        "bootstrap": "^4.6.1",
    +        "jquery": "^3.6.0",
    +        "moment": "^2.29.2",
    +        "moment-timezone": "^0.5.34",
             "popper.js": "^1.16.1"
           }
         },
         "tempusdominus-core": {
    -      "version": "5.19.0",
    -      "resolved": "https://registry.npmjs.org/tempusdominus-core/-/tempusdominus-core-5.19.0.tgz",
    -      "integrity": "sha512-7a4oBQw4cjz6C87BLRg3KHVvzpnPlnRTkuDZ7SwcJayQQ4QgOryX5u6wj0q07TXhgtMQLCntZO6nVhHIKPaeUw==",
    +      "version": "5.19.3",
    +      "resolved": "https://registry.npmjs.org/tempusdominus-core/-/tempusdominus-core-5.19.3.tgz",
    +      "integrity": "sha512-WXBVXcBG/hErB6u9gdUs+vzANvCU1kd1ykzL4kolPB3h1OEv20OKUW5qz1iynxyqRFPa1NWY9gwRu5d+MjXEuQ==",
           "requires": {
    -        "jquery": "^3.5.0",
    -        "moment": "~2.24.0",
    -        "moment-timezone": "^0.5.28"
    -      },
    -      "dependencies": {
    -        "moment": {
    -          "version": "2.24.0",
    -          "resolved": "https://registry.npmjs.org/moment/-/moment-2.24.0.tgz",
    -          "integrity": "sha512-bV7f+6l2QigeBBZSM/6yTNq4P2fNpSWj/0e7jQcy87A8e7o2nAfP/34/2ky5Vw4B9S446EtIhodAzkFCcR4dQg=="
    -        }
    +        "jquery": "^3.6.0",
    +        "moment": "~2.29.2",
    +        "moment-timezone": "^0.5.34"
           }
         },
         "tempy": {
    @@ -29068,14 +29415,14 @@
           }
         },
         "terser": {
    -      "version": "5.12.1",
    -      "resolved": "https://registry.npmjs.org/terser/-/terser-5.12.1.tgz",
    -      "integrity": "sha512-NXbs+7nisos5E+yXwAD+y7zrcTkMqb0dEJxIGtSKPdCBzopf7ni4odPul2aechpV7EXNvOudYOX2bb5tln1jbQ==",
    +      "version": "5.14.1",
    +      "resolved": "https://registry.npmjs.org/terser/-/terser-5.14.1.tgz",
    +      "integrity": "sha512-+ahUAE+iheqBTDxXhTisdA8hgvbEG1hHOQ9xmNjeUJSoi6DU/gMrKNcfZjHkyY6Alnuyc+ikYJaxxfHkT3+WuQ==",
           "dev": true,
           "requires": {
    +        "@jridgewell/source-map": "^0.3.2",
             "acorn": "^8.5.0",
             "commander": "^2.20.0",
    -        "source-map": "~0.7.2",
             "source-map-support": "~0.5.20"
           },
           "dependencies": {
    @@ -29084,34 +29431,20 @@
               "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
               "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
               "dev": true
    -        },
    -        "source-map": {
    -          "version": "0.7.3",
    -          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz",
    -          "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==",
    -          "dev": true
             }
           }
         },
         "terser-webpack-plugin": {
    -      "version": "5.3.1",
    -      "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.1.tgz",
    -      "integrity": "sha512-GvlZdT6wPQKbDNW/GDQzZFg/j4vKU96yl2q6mcUkzKOgW4gwf1Z8cZToUCrz31XHlPWH8MVb1r2tFtdDtTGJ7g==",
    +      "version": "5.3.3",
    +      "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.3.tgz",
    +      "integrity": "sha512-Fx60G5HNYknNTNQnzQ1VePRuu89ZVYWfjRAeT5rITuCY/1b08s49e5kSQwHDirKZWuoKOBRFS98EUUoZ9kLEwQ==",
           "dev": true,
           "requires": {
    +        "@jridgewell/trace-mapping": "^0.3.7",
             "jest-worker": "^27.4.5",
             "schema-utils": "^3.1.1",
             "serialize-javascript": "^6.0.0",
    -        "source-map": "^0.6.1",
             "terser": "^5.7.2"
    -      },
    -      "dependencies": {
    -        "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
    -        }
           }
         },
         "test-exclude": {
    @@ -29128,7 +29461,7 @@
         "text-table": {
           "version": "0.2.0",
           "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
    -      "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=",
    +      "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==",
           "dev": true
         },
         "throat": {
    @@ -29148,12 +29481,6 @@
           "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==",
           "dev": true
         },
    -    "timsort": {
    -      "version": "0.3.0",
    -      "resolved": "https://registry.npmjs.org/timsort/-/timsort-0.3.0.tgz",
    -      "integrity": "sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q=",
    -      "dev": true
    -    },
         "tiny-invariant": {
           "version": "1.2.0",
           "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.2.0.tgz",
    @@ -29173,7 +29500,7 @@
         "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=",
    +      "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==",
           "dev": true
         },
         "to-regex-range": {
    @@ -29187,7 +29514,7 @@
         "toggle-selection": {
           "version": "1.0.6",
           "resolved": "https://registry.npmjs.org/toggle-selection/-/toggle-selection-1.0.6.tgz",
    -      "integrity": "sha1-bkWxJj8gF/oKzH2J14sVuL932jI="
    +      "integrity": "sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ=="
         },
         "toidentifier": {
           "version": "1.0.1",
    @@ -29215,10 +29542,13 @@
           }
         },
         "tr46": {
    -      "version": "0.0.3",
    -      "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz",
    -      "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=",
    -      "dev": true
    +      "version": "2.1.0",
    +      "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz",
    +      "integrity": "sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==",
    +      "dev": true,
    +      "requires": {
    +        "punycode": "^2.1.1"
    +      }
         },
         "tryer": {
           "version": "1.0.1",
    @@ -29227,9 +29557,9 @@
           "dev": true
         },
         "ts-jest": {
    -      "version": "27.1.4",
    -      "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-27.1.4.tgz",
    -      "integrity": "sha512-qjkZlVPWVctAezwsOD1OPzbZ+k7zA5z3oxII4dGdZo5ggX/PL7kvwTM0pXTr10fAtbiVpJaL3bWd502zAhpgSQ==",
    +      "version": "27.1.5",
    +      "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-27.1.5.tgz",
    +      "integrity": "sha512-Xv6jBQPoBEvBq/5i2TeSG9tt/nqkbpcurrEG1b+2yfBrcJelOZF9Ml6dmyMh7bcW9JyFbRYpR5rxROSlBLTZHA==",
           "dev": true,
           "requires": {
             "bs-logger": "0.x",
    @@ -29243,9 +29573,9 @@
           },
           "dependencies": {
             "semver": {
    -          "version": "7.3.5",
    -          "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz",
    -          "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==",
    +          "version": "7.3.7",
    +          "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz",
    +          "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==",
               "dev": true,
               "requires": {
                 "lru-cache": "^6.0.0"
    @@ -29253,64 +29583,15 @@
             }
           }
         },
    -    "ts-node": {
    -      "version": "10.7.0",
    -      "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.7.0.tgz",
    -      "integrity": "sha512-TbIGS4xgJoX2i3do417KSaep1uRAW/Lu+WAL2doDHC0D6ummjirVOXU5/7aiZotbQ5p1Zp9tP7U6cYhA0O7M8A==",
    -      "dev": true,
    -      "optional": true,
    -      "peer": true,
    -      "requires": {
    -        "@cspotcode/source-map-support": "0.7.0",
    -        "@tsconfig/node10": "^1.0.7",
    -        "@tsconfig/node12": "^1.0.7",
    -        "@tsconfig/node14": "^1.0.0",
    -        "@tsconfig/node16": "^1.0.2",
    -        "acorn": "^8.4.1",
    -        "acorn-walk": "^8.1.1",
    -        "arg": "^4.1.0",
    -        "create-require": "^1.1.0",
    -        "diff": "^4.0.1",
    -        "make-error": "^1.1.1",
    -        "v8-compile-cache-lib": "^3.0.0",
    -        "yn": "3.1.1"
    -      },
    -      "dependencies": {
    -        "acorn-walk": {
    -          "version": "8.2.0",
    -          "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz",
    -          "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==",
    -          "dev": true,
    -          "optional": true,
    -          "peer": true
    -        },
    -        "arg": {
    -          "version": "4.1.3",
    -          "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz",
    -          "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==",
    -          "dev": true,
    -          "optional": true,
    -          "peer": true
    -        },
    -        "diff": {
    -          "version": "4.0.2",
    -          "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz",
    -          "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==",
    -          "dev": true,
    -          "optional": true,
    -          "peer": true
    -        }
    -      }
    -    },
         "tsconfig-paths": {
    -      "version": "3.14.0",
    -      "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.0.tgz",
    -      "integrity": "sha512-cg/1jAZoL57R39+wiw4u/SCC6Ic9Q5NqjBOb+9xISedOYurfog9ZNmKJSxAnb2m/5Bq4lE9lhUcau33Ml8DM0g==",
    +      "version": "3.14.1",
    +      "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz",
    +      "integrity": "sha512-fxDhWnFSLt3VuTwtvJt5fpwxBHg5AdKWMsgcPOOIilyjymcYVZoCQF8fvFRezCNfblEXmi+PcM1eYHeOAgXCOQ==",
           "dev": true,
           "requires": {
             "@types/json5": "^0.0.29",
             "json5": "^1.0.1",
    -        "minimist": "^1.2.0",
    +        "minimist": "^1.2.6",
             "strip-bom": "^3.0.0"
           },
           "dependencies": {
    @@ -29326,15 +29607,15 @@
             "strip-bom": {
               "version": "3.0.0",
               "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz",
    -          "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=",
    +          "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==",
               "dev": true
             }
           }
         },
         "tslib": {
    -      "version": "2.3.1",
    -      "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz",
    -      "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw=="
    +      "version": "2.4.0",
    +      "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz",
    +      "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ=="
         },
         "tsutils": {
           "version": "3.21.0",
    @@ -29399,20 +29680,20 @@
           }
         },
         "typescript": {
    -      "version": "4.6.3",
    -      "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.6.3.tgz",
    -      "integrity": "sha512-yNIatDa5iaofVozS/uQJEl3JRWLKKGJKh6Yaiv0GLGSuhpFJe7P3SbHZ8/yjAHRQwKRoA6YZqlfjXWmVzoVSMw==",
    +      "version": "4.7.3",
    +      "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.7.3.tgz",
    +      "integrity": "sha512-WOkT3XYvrpXx4vMMqlD+8R8R37fZkjyLGlxavMc4iB8lrl8L0DeTcHbYgw/v0N/z9wAFsgBhcsF0ruoySS22mA==",
           "dev": true
         },
         "unbox-primitive": {
    -      "version": "1.0.1",
    -      "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz",
    -      "integrity": "sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==",
    +      "version": "1.0.2",
    +      "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz",
    +      "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==",
           "dev": true,
           "requires": {
    -        "function-bind": "^1.1.1",
    -        "has-bigints": "^1.0.1",
    -        "has-symbols": "^1.0.2",
    +        "call-bind": "^1.0.2",
    +        "has-bigints": "^1.0.2",
    +        "has-symbols": "^1.0.3",
             "which-boxed-primitive": "^1.0.2"
           }
         },
    @@ -29462,13 +29743,13 @@
         "unpipe": {
           "version": "1.0.0",
           "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
    -      "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=",
    +      "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==",
           "dev": true
         },
         "unquote": {
           "version": "1.1.1",
           "resolved": "https://registry.npmjs.org/unquote/-/unquote-1.1.1.tgz",
    -      "integrity": "sha1-j97XMk7G6IoP+LkF58CYzcCG1UQ=",
    +      "integrity": "sha512-vRCqFv6UhXpWxZPyGDh/F3ZpNv8/qo7w6iufLpQg9aKnQ71qM4B5KiI7Mia9COcjEhrO9LueHpMYjYzsWH3OIg==",
           "dev": true
         },
         "upath": {
    @@ -29489,7 +29770,7 @@
         "util-deprecate": {
           "version": "1.0.2",
           "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
    -      "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=",
    +      "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==",
           "dev": true
         },
         "util.promisify": {
    @@ -29507,13 +29788,13 @@
         "utila": {
           "version": "0.4.0",
           "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz",
    -      "integrity": "sha1-ihagXURWV6Oupe7MWxKk+lN5dyw=",
    +      "integrity": "sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==",
           "dev": true
         },
         "utils-merge": {
           "version": "1.0.1",
           "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
    -      "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=",
    +      "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==",
           "dev": true
         },
         "uuid": {
    @@ -29528,14 +29809,6 @@
           "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==",
           "dev": true
         },
    -    "v8-compile-cache-lib": {
    -      "version": "3.0.0",
    -      "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.0.tgz",
    -      "integrity": "sha512-mpSYqfsFvASnSn5qMiwrr4VKfumbPyONLCOPmsR3A6pTY/r0+tSaVbgPWSAIuzbk3lCTa+FForeTiO+wBQGkjA==",
    -      "dev": true,
    -      "optional": true,
    -      "peer": true
    -    },
         "v8-to-istanbul": {
           "version": "8.1.1",
           "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-8.1.1.tgz",
    @@ -29548,9 +29821,9 @@
           },
           "dependencies": {
             "source-map": {
    -          "version": "0.7.3",
    -          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz",
    -          "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==",
    +          "version": "0.7.4",
    +          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz",
    +          "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==",
               "dev": true
             }
           }
    @@ -29563,7 +29836,7 @@
         "vary": {
           "version": "1.1.2",
           "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
    -      "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=",
    +      "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==",
           "dev": true
         },
         "w3c-hr-time": {
    @@ -29607,9 +29880,9 @@
           }
         },
         "watchpack": {
    -      "version": "2.3.1",
    -      "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.3.1.tgz",
    -      "integrity": "sha512-x0t0JuydIo8qCNctdDrn1OzH/qDzk2+rdCOC3YzumZ42fiMqmQ7T3xQurykYMhYfHaPHTp4ZxAx2NfUo1K6QaA==",
    +      "version": "2.4.0",
    +      "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz",
    +      "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==",
           "dev": true,
           "requires": {
             "glob-to-regexp": "^0.4.1",
    @@ -29632,9 +29905,9 @@
           "dev": true
         },
         "webpack": {
    -      "version": "5.70.0",
    -      "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.70.0.tgz",
    -      "integrity": "sha512-ZMWWy8CeuTTjCxbeaQI21xSswseF2oNOwc70QSKNePvmxE7XW36i7vpBMYZFAUHPwQiEbNGCEYIOOlyRbdGmxw==",
    +      "version": "5.73.0",
    +      "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.73.0.tgz",
    +      "integrity": "sha512-svjudQRPPa0YiOYa2lM/Gacw0r6PvxptHj4FuEKQ2kX05ZLkjbVc5MnPs6its5j7IZljnIqSVo/OsY2X0IpHGA==",
           "dev": true,
           "requires": {
             "@types/eslint-scope": "^3.7.3",
    @@ -29646,13 +29919,13 @@
             "acorn-import-assertions": "^1.7.6",
             "browserslist": "^4.14.5",
             "chrome-trace-event": "^1.0.2",
    -        "enhanced-resolve": "^5.9.2",
    +        "enhanced-resolve": "^5.9.3",
             "es-module-lexer": "^0.9.0",
             "eslint-scope": "5.1.1",
             "events": "^3.2.0",
             "glob-to-regexp": "^0.4.1",
             "graceful-fs": "^4.2.9",
    -        "json-parse-better-errors": "^1.0.2",
    +        "json-parse-even-better-errors": "^2.3.1",
             "loader-runner": "^4.2.0",
             "mime-types": "^2.1.27",
             "neo-async": "^2.6.2",
    @@ -29682,22 +29955,22 @@
           }
         },
         "webpack-dev-middleware": {
    -      "version": "5.3.1",
    -      "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.1.tgz",
    -      "integrity": "sha512-81EujCKkyles2wphtdrnPg/QqegC/AtqNH//mQkBYSMqwFVCQrxM6ktB2O/SPlZy7LqeEfTbV3cZARGQz6umhg==",
    +      "version": "5.3.3",
    +      "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.3.tgz",
    +      "integrity": "sha512-hj5CYrY0bZLB+eTO+x/j67Pkrquiy7kWepMHmUMoPsmcUaeEnQJqFzHJOyxgWlq746/wUuA64p9ta34Kyb01pA==",
           "dev": true,
           "requires": {
             "colorette": "^2.0.10",
    -        "memfs": "^3.4.1",
    +        "memfs": "^3.4.3",
             "mime-types": "^2.1.31",
             "range-parser": "^1.2.1",
             "schema-utils": "^4.0.0"
           },
           "dependencies": {
             "ajv": {
    -          "version": "8.10.0",
    -          "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.10.0.tgz",
    -          "integrity": "sha512-bzqAEZOjkrUMl2afH8dknrq5KEk2SrwdBROR+vH1EKVQTqaUbJVPdc/gEdggTMM0Se+s+Ja4ju4TlNcStKl2Hw==",
    +          "version": "8.11.0",
    +          "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz",
    +          "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==",
               "dev": true,
               "requires": {
                 "fast-deep-equal": "^3.1.1",
    @@ -29736,47 +30009,46 @@
           }
         },
         "webpack-dev-server": {
    -      "version": "4.7.4",
    -      "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.7.4.tgz",
    -      "integrity": "sha512-nfdsb02Zi2qzkNmgtZjkrMOcXnYZ6FLKcQwpxT7MvmHKc+oTtDsBju8j+NMyAygZ9GW1jMEUpy3itHtqgEhe1A==",
    +      "version": "4.9.2",
    +      "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.9.2.tgz",
    +      "integrity": "sha512-H95Ns95dP24ZsEzO6G9iT+PNw4Q7ltll1GfJHV4fKphuHWgKFzGHWi4alTlTnpk1SPPk41X+l2RB7rLfIhnB9Q==",
           "dev": true,
           "requires": {
             "@types/bonjour": "^3.5.9",
             "@types/connect-history-api-fallback": "^1.3.5",
             "@types/express": "^4.17.13",
             "@types/serve-index": "^1.9.1",
    +        "@types/serve-static": "^1.13.10",
             "@types/sockjs": "^0.3.33",
    -        "@types/ws": "^8.2.2",
    +        "@types/ws": "^8.5.1",
             "ansi-html-community": "^0.0.8",
    -        "bonjour": "^3.5.0",
    +        "bonjour-service": "^1.0.11",
             "chokidar": "^3.5.3",
             "colorette": "^2.0.10",
             "compression": "^1.7.4",
             "connect-history-api-fallback": "^1.6.0",
             "default-gateway": "^6.0.3",
    -        "del": "^6.0.0",
    -        "express": "^4.17.1",
    +        "express": "^4.17.3",
             "graceful-fs": "^4.2.6",
             "html-entities": "^2.3.2",
    -        "http-proxy-middleware": "^2.0.0",
    +        "http-proxy-middleware": "^2.0.3",
             "ipaddr.js": "^2.0.1",
             "open": "^8.0.9",
             "p-retry": "^4.5.0",
    -        "portfinder": "^1.0.28",
    +        "rimraf": "^3.0.2",
             "schema-utils": "^4.0.0",
    -        "selfsigned": "^2.0.0",
    +        "selfsigned": "^2.0.1",
             "serve-index": "^1.9.1",
    -        "sockjs": "^0.3.21",
    +        "sockjs": "^0.3.24",
             "spdy": "^4.0.2",
    -        "strip-ansi": "^7.0.0",
             "webpack-dev-middleware": "^5.3.1",
             "ws": "^8.4.2"
           },
           "dependencies": {
             "ajv": {
    -          "version": "8.10.0",
    -          "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.10.0.tgz",
    -          "integrity": "sha512-bzqAEZOjkrUMl2afH8dknrq5KEk2SrwdBROR+vH1EKVQTqaUbJVPdc/gEdggTMM0Se+s+Ja4ju4TlNcStKl2Hw==",
    +          "version": "8.11.0",
    +          "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz",
    +          "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==",
               "dev": true,
               "requires": {
                 "fast-deep-equal": "^3.1.1",
    @@ -29794,12 +30066,6 @@
                 "fast-deep-equal": "^3.1.3"
               }
             },
    -        "ansi-regex": {
    -          "version": "6.0.1",
    -          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz",
    -          "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==",
    -          "dev": true
    -        },
             "json-schema-traverse": {
               "version": "1.0.0",
               "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
    @@ -29818,19 +30084,10 @@
                 "ajv-keywords": "^5.0.0"
               }
             },
    -        "strip-ansi": {
    -          "version": "7.0.1",
    -          "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz",
    -          "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==",
    -          "dev": true,
    -          "requires": {
    -            "ansi-regex": "^6.0.1"
    -          }
    -        },
             "ws": {
    -          "version": "8.5.0",
    -          "resolved": "https://registry.npmjs.org/ws/-/ws-8.5.0.tgz",
    -          "integrity": "sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg==",
    +          "version": "8.8.0",
    +          "resolved": "https://registry.npmjs.org/ws/-/ws-8.8.0.tgz",
    +          "integrity": "sha512-JDAgSYQ1ksuwqfChJusw1LSJ8BizJ2e/vVu5Lxjq3YvNJNlROv1ui4i+c/kUUrPheBvQl4c5UbERhTwKa6QBJQ==",
               "dev": true,
               "requires": {}
             }
    @@ -29846,12 +30103,6 @@
             "webpack-sources": "^2.2.0"
           },
           "dependencies": {
    -        "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
    -        },
             "webpack-sources": {
               "version": "2.3.1",
               "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-2.3.1.tgz",
    @@ -29920,21 +30171,14 @@
           "dev": true
         },
         "whatwg-url": {
    -      "version": "5.0.0",
    -      "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz",
    -      "integrity": "sha1-lmRU6HZUYuN2RNNib2dCzotwll0=",
    +      "version": "8.7.0",
    +      "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.7.0.tgz",
    +      "integrity": "sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==",
           "dev": true,
           "requires": {
    -        "tr46": "~0.0.3",
    -        "webidl-conversions": "^3.0.0"
    -      },
    -      "dependencies": {
    -        "webidl-conversions": {
    -          "version": "3.0.1",
    -          "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz",
    -          "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=",
    -          "dev": true
    -        }
    +        "lodash": "^4.7.0",
    +        "tr46": "^2.1.0",
    +        "webidl-conversions": "^6.1.0"
           }
         },
         "which": {
    @@ -29966,28 +30210,28 @@
           "dev": true
         },
         "workbox-background-sync": {
    -      "version": "6.5.1",
    -      "resolved": "https://registry.npmjs.org/workbox-background-sync/-/workbox-background-sync-6.5.1.tgz",
    -      "integrity": "sha512-T5a35fagLXQvV8Dr4+bDU+XYsP90jJ3eBLjZMKuCNELMQZNj+VekCODz1QK44jgoBeQk+vp94pkZV6G+e41pgg==",
    +      "version": "6.5.3",
    +      "resolved": "https://registry.npmjs.org/workbox-background-sync/-/workbox-background-sync-6.5.3.tgz",
    +      "integrity": "sha512-0DD/V05FAcek6tWv9XYj2w5T/plxhDSpclIcAGjA/b7t/6PdaRkQ7ZgtAX6Q/L7kV7wZ8uYRJUoH11VjNipMZw==",
           "dev": true,
           "requires": {
             "idb": "^6.1.4",
    -        "workbox-core": "6.5.1"
    +        "workbox-core": "6.5.3"
           }
         },
         "workbox-broadcast-update": {
    -      "version": "6.5.1",
    -      "resolved": "https://registry.npmjs.org/workbox-broadcast-update/-/workbox-broadcast-update-6.5.1.tgz",
    -      "integrity": "sha512-mb/oyblyEpDbw167cCTyHnC3RqCnCQHtFYuYZd+QTpuExxM60qZuBH1AuQCgvLtDcztBKdEYK2VFD9SZYgRbaQ==",
    +      "version": "6.5.3",
    +      "resolved": "https://registry.npmjs.org/workbox-broadcast-update/-/workbox-broadcast-update-6.5.3.tgz",
    +      "integrity": "sha512-4AwCIA5DiDrYhlN+Miv/fp5T3/whNmSL+KqhTwRBTZIL6pvTgE4lVuRzAt1JltmqyMcQ3SEfCdfxczuI4kwFQg==",
           "dev": true,
           "requires": {
    -        "workbox-core": "6.5.1"
    +        "workbox-core": "6.5.3"
           }
         },
         "workbox-build": {
    -      "version": "6.5.1",
    -      "resolved": "https://registry.npmjs.org/workbox-build/-/workbox-build-6.5.1.tgz",
    -      "integrity": "sha512-coDUDzHvFZ1ADOl3wKCsCSyOBvkPKlPgcQDb6LMMShN1zgF31Mev/1HzN3+9T2cjjWAgFwZKkuRyExqc1v21Zw==",
    +      "version": "6.5.3",
    +      "resolved": "https://registry.npmjs.org/workbox-build/-/workbox-build-6.5.3.tgz",
    +      "integrity": "sha512-8JNHHS7u13nhwIYCDea9MNXBNPHXCs5KDZPKI/ZNTr3f4sMGoD7hgFGecbyjX1gw4z6e9bMpMsOEJNyH5htA/w==",
           "dev": true,
           "requires": {
             "@apideck/better-ajv-errors": "^0.3.1",
    @@ -30012,27 +30256,27 @@
             "strip-comments": "^2.0.1",
             "tempy": "^0.6.0",
             "upath": "^1.2.0",
    -        "workbox-background-sync": "6.5.1",
    -        "workbox-broadcast-update": "6.5.1",
    -        "workbox-cacheable-response": "6.5.1",
    -        "workbox-core": "6.5.1",
    -        "workbox-expiration": "6.5.1",
    -        "workbox-google-analytics": "6.5.1",
    -        "workbox-navigation-preload": "6.5.1",
    -        "workbox-precaching": "6.5.1",
    -        "workbox-range-requests": "6.5.1",
    -        "workbox-recipes": "6.5.1",
    -        "workbox-routing": "6.5.1",
    -        "workbox-strategies": "6.5.1",
    -        "workbox-streams": "6.5.1",
    -        "workbox-sw": "6.5.1",
    -        "workbox-window": "6.5.1"
    +        "workbox-background-sync": "6.5.3",
    +        "workbox-broadcast-update": "6.5.3",
    +        "workbox-cacheable-response": "6.5.3",
    +        "workbox-core": "6.5.3",
    +        "workbox-expiration": "6.5.3",
    +        "workbox-google-analytics": "6.5.3",
    +        "workbox-navigation-preload": "6.5.3",
    +        "workbox-precaching": "6.5.3",
    +        "workbox-range-requests": "6.5.3",
    +        "workbox-recipes": "6.5.3",
    +        "workbox-routing": "6.5.3",
    +        "workbox-strategies": "6.5.3",
    +        "workbox-streams": "6.5.3",
    +        "workbox-sw": "6.5.3",
    +        "workbox-window": "6.5.3"
           },
           "dependencies": {
             "@apideck/better-ajv-errors": {
    -          "version": "0.3.3",
    -          "resolved": "https://registry.npmjs.org/@apideck/better-ajv-errors/-/better-ajv-errors-0.3.3.tgz",
    -          "integrity": "sha512-9o+HO2MbJhJHjDYZaDxJmSDckvDpiuItEsrIShV0DXeCshXWRHhqYyU/PKHMkuClOmFnZhRd6wzv4vpDu/dRKg==",
    +          "version": "0.3.4",
    +          "resolved": "https://registry.npmjs.org/@apideck/better-ajv-errors/-/better-ajv-errors-0.3.4.tgz",
    +          "integrity": "sha512-Ic2d8ZT6HJiSikGVQvSklaFyw1OUv4g8sDOxa0PXSlbmN/3gL5IO1WYY9DOwTDqOFmjWoqG1yaaKnPDqYCE9KA==",
               "dev": true,
               "requires": {
                 "json-schema": "^0.4.0",
    @@ -30041,9 +30285,9 @@
               }
             },
             "ajv": {
    -          "version": "8.10.0",
    -          "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.10.0.tgz",
    -          "integrity": "sha512-bzqAEZOjkrUMl2afH8dknrq5KEk2SrwdBROR+vH1EKVQTqaUbJVPdc/gEdggTMM0Se+s+Ja4ju4TlNcStKl2Hw==",
    +          "version": "8.11.0",
    +          "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz",
    +          "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==",
               "dev": true,
               "requires": {
                 "fast-deep-equal": "^3.1.1",
    @@ -30082,7 +30326,7 @@
             "tr46": {
               "version": "1.0.1",
               "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz",
    -          "integrity": "sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk=",
    +          "integrity": "sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==",
               "dev": true,
               "requires": {
                 "punycode": "^2.1.0"
    @@ -30108,138 +30352,132 @@
           }
         },
         "workbox-cacheable-response": {
    -      "version": "6.5.1",
    -      "resolved": "https://registry.npmjs.org/workbox-cacheable-response/-/workbox-cacheable-response-6.5.1.tgz",
    -      "integrity": "sha512-3TdtH/luDiytmM+Cn72HCBLZXmbeRNJqZx2yaVOfUZhj0IVwZqQXhNarlGE9/k6U5Jelb+TtpH2mLVhnzfiSMg==",
    +      "version": "6.5.3",
    +      "resolved": "https://registry.npmjs.org/workbox-cacheable-response/-/workbox-cacheable-response-6.5.3.tgz",
    +      "integrity": "sha512-6JE/Zm05hNasHzzAGKDkqqgYtZZL2H06ic2GxuRLStA4S/rHUfm2mnLFFXuHAaGR1XuuYyVCEey1M6H3PdZ7SQ==",
           "dev": true,
           "requires": {
    -        "workbox-core": "6.5.1"
    +        "workbox-core": "6.5.3"
           }
         },
         "workbox-core": {
    -      "version": "6.5.1",
    -      "resolved": "https://registry.npmjs.org/workbox-core/-/workbox-core-6.5.1.tgz",
    -      "integrity": "sha512-qObXZ39aFJ2N8X7IUbGrJHKWguliCuU1jOXM/I4MTT84u9BiKD2rHMkIzgeRP1Ixu9+cXU4/XHJq3Cy0Qqc5hw==",
    +      "version": "6.5.3",
    +      "resolved": "https://registry.npmjs.org/workbox-core/-/workbox-core-6.5.3.tgz",
    +      "integrity": "sha512-Bb9ey5n/M9x+l3fBTlLpHt9ASTzgSGj6vxni7pY72ilB/Pb3XtN+cZ9yueboVhD5+9cNQrC9n/E1fSrqWsUz7Q==",
           "dev": true
         },
         "workbox-expiration": {
    -      "version": "6.5.1",
    -      "resolved": "https://registry.npmjs.org/workbox-expiration/-/workbox-expiration-6.5.1.tgz",
    -      "integrity": "sha512-iY/cTADAQATMmPkUBRmQdacqq0TJd2wMHimBQz+tRnPGHSMH+/BoLPABPnu7O7rT/g/s59CUYYRGxe3mEgoJCA==",
    +      "version": "6.5.3",
    +      "resolved": "https://registry.npmjs.org/workbox-expiration/-/workbox-expiration-6.5.3.tgz",
    +      "integrity": "sha512-jzYopYR1zD04ZMdlbn/R2Ik6ixiXbi15c9iX5H8CTi6RPDz7uhvMLZPKEndZTpfgmUk8mdmT9Vx/AhbuCl5Sqw==",
           "dev": true,
           "requires": {
             "idb": "^6.1.4",
    -        "workbox-core": "6.5.1"
    +        "workbox-core": "6.5.3"
           }
         },
         "workbox-google-analytics": {
    -      "version": "6.5.1",
    -      "resolved": "https://registry.npmjs.org/workbox-google-analytics/-/workbox-google-analytics-6.5.1.tgz",
    -      "integrity": "sha512-qZU46/h4dbionYT6Yk6iBkUwpiEzAfnO1W7KkI+AMmY7G9/gA03dQQ7rpTw8F4vWrG7ahTUGWDFv6fERtaw1BQ==",
    +      "version": "6.5.3",
    +      "resolved": "https://registry.npmjs.org/workbox-google-analytics/-/workbox-google-analytics-6.5.3.tgz",
    +      "integrity": "sha512-3GLCHotz5umoRSb4aNQeTbILETcrTVEozSfLhHSBaegHs1PnqCmN0zbIy2TjTpph2AGXiNwDrWGF0AN+UgDNTw==",
           "dev": true,
           "requires": {
    -        "workbox-background-sync": "6.5.1",
    -        "workbox-core": "6.5.1",
    -        "workbox-routing": "6.5.1",
    -        "workbox-strategies": "6.5.1"
    +        "workbox-background-sync": "6.5.3",
    +        "workbox-core": "6.5.3",
    +        "workbox-routing": "6.5.3",
    +        "workbox-strategies": "6.5.3"
           }
         },
         "workbox-navigation-preload": {
    -      "version": "6.5.1",
    -      "resolved": "https://registry.npmjs.org/workbox-navigation-preload/-/workbox-navigation-preload-6.5.1.tgz",
    -      "integrity": "sha512-aKrgAbn2IMgzTowTi/ZyKdQUcES2m++9aGtpxqsX7Gn9ovCY8zcssaMEAMMwrIeveij5HiWNBrmj6MWDHi+0rg==",
    +      "version": "6.5.3",
    +      "resolved": "https://registry.npmjs.org/workbox-navigation-preload/-/workbox-navigation-preload-6.5.3.tgz",
    +      "integrity": "sha512-bK1gDFTc5iu6lH3UQ07QVo+0ovErhRNGvJJO/1ngknT0UQ702nmOUhoN9qE5mhuQSrnK+cqu7O7xeaJ+Rd9Tmg==",
           "dev": true,
           "requires": {
    -        "workbox-core": "6.5.1"
    +        "workbox-core": "6.5.3"
           }
         },
         "workbox-precaching": {
    -      "version": "6.5.1",
    -      "resolved": "https://registry.npmjs.org/workbox-precaching/-/workbox-precaching-6.5.1.tgz",
    -      "integrity": "sha512-EzlPBxvmjGfE56YZzsT/vpVkpLG1XJhoplgXa5RPyVWLUL1LbwEAxhkrENElSS/R9tgiTw80IFwysidfUqLihg==",
    +      "version": "6.5.3",
    +      "resolved": "https://registry.npmjs.org/workbox-precaching/-/workbox-precaching-6.5.3.tgz",
    +      "integrity": "sha512-sjNfgNLSsRX5zcc63H/ar/hCf+T19fRtTqvWh795gdpghWb5xsfEkecXEvZ8biEi1QD7X/ljtHphdaPvXDygMQ==",
           "dev": true,
           "requires": {
    -        "workbox-core": "6.5.1",
    -        "workbox-routing": "6.5.1",
    -        "workbox-strategies": "6.5.1"
    +        "workbox-core": "6.5.3",
    +        "workbox-routing": "6.5.3",
    +        "workbox-strategies": "6.5.3"
           }
         },
         "workbox-range-requests": {
    -      "version": "6.5.1",
    -      "resolved": "https://registry.npmjs.org/workbox-range-requests/-/workbox-range-requests-6.5.1.tgz",
    -      "integrity": "sha512-57Da/qRbd9v33YlHX0rlSUVFmE4THCjKqwkmfhY3tNLnSKN2L5YBS3qhWeDO0IrMNgUj+rGve2moKYXeUqQt4A==",
    +      "version": "6.5.3",
    +      "resolved": "https://registry.npmjs.org/workbox-range-requests/-/workbox-range-requests-6.5.3.tgz",
    +      "integrity": "sha512-pGCP80Bpn/0Q0MQsfETSfmtXsQcu3M2QCJwSFuJ6cDp8s2XmbUXkzbuQhCUzKR86ZH2Vex/VUjb2UaZBGamijA==",
           "dev": true,
           "requires": {
    -        "workbox-core": "6.5.1"
    +        "workbox-core": "6.5.3"
           }
         },
         "workbox-recipes": {
    -      "version": "6.5.1",
    -      "resolved": "https://registry.npmjs.org/workbox-recipes/-/workbox-recipes-6.5.1.tgz",
    -      "integrity": "sha512-DGsyKygHggcGPQpWafC/Nmbm1Ny3sB2vE9r//3UbeidXiQ+pLF14KEG1/0NNGRaY+lfOXOagq6d1H7SC8KA+rA==",
    +      "version": "6.5.3",
    +      "resolved": "https://registry.npmjs.org/workbox-recipes/-/workbox-recipes-6.5.3.tgz",
    +      "integrity": "sha512-IcgiKYmbGiDvvf3PMSEtmwqxwfQ5zwI7OZPio3GWu4PfehA8jI8JHI3KZj+PCfRiUPZhjQHJ3v1HbNs+SiSkig==",
           "dev": true,
           "requires": {
    -        "workbox-cacheable-response": "6.5.1",
    -        "workbox-core": "6.5.1",
    -        "workbox-expiration": "6.5.1",
    -        "workbox-precaching": "6.5.1",
    -        "workbox-routing": "6.5.1",
    -        "workbox-strategies": "6.5.1"
    +        "workbox-cacheable-response": "6.5.3",
    +        "workbox-core": "6.5.3",
    +        "workbox-expiration": "6.5.3",
    +        "workbox-precaching": "6.5.3",
    +        "workbox-routing": "6.5.3",
    +        "workbox-strategies": "6.5.3"
           }
         },
         "workbox-routing": {
    -      "version": "6.5.1",
    -      "resolved": "https://registry.npmjs.org/workbox-routing/-/workbox-routing-6.5.1.tgz",
    -      "integrity": "sha512-yAAncdTwanvlR8KPjubyvFKeAok8ZcIws6UKxvIAg0I+wsf7UYi93DXNuZr6RBSQrByrN6HkCyjuhmk8P63+PA==",
    +      "version": "6.5.3",
    +      "resolved": "https://registry.npmjs.org/workbox-routing/-/workbox-routing-6.5.3.tgz",
    +      "integrity": "sha512-DFjxcuRAJjjt4T34RbMm3MCn+xnd36UT/2RfPRfa8VWJGItGJIn7tG+GwVTdHmvE54i/QmVTJepyAGWtoLPTmg==",
           "dev": true,
           "requires": {
    -        "workbox-core": "6.5.1"
    +        "workbox-core": "6.5.3"
           }
         },
         "workbox-strategies": {
    -      "version": "6.5.1",
    -      "resolved": "https://registry.npmjs.org/workbox-strategies/-/workbox-strategies-6.5.1.tgz",
    -      "integrity": "sha512-JNaTXPy8wXzKkr+6za7/eJX9opoZk7UgY261I2kPxl80XQD8lMjz0vo9EOcBwvD72v3ZhGJbW84ZaDwFEhFvWA==",
    +      "version": "6.5.3",
    +      "resolved": "https://registry.npmjs.org/workbox-strategies/-/workbox-strategies-6.5.3.tgz",
    +      "integrity": "sha512-MgmGRrDVXs7rtSCcetZgkSZyMpRGw8HqL2aguszOc3nUmzGZsT238z/NN9ZouCxSzDu3PQ3ZSKmovAacaIhu1w==",
           "dev": true,
           "requires": {
    -        "workbox-core": "6.5.1"
    +        "workbox-core": "6.5.3"
           }
         },
         "workbox-streams": {
    -      "version": "6.5.1",
    -      "resolved": "https://registry.npmjs.org/workbox-streams/-/workbox-streams-6.5.1.tgz",
    -      "integrity": "sha512-7jaTWm6HRGJ/ewECnhb+UgjTT50R42E0/uNCC4eTKQwnLO/NzNGjoXTdQgFjo4zteR+L/K6AtFAiYKH3ZJbAYw==",
    +      "version": "6.5.3",
    +      "resolved": "https://registry.npmjs.org/workbox-streams/-/workbox-streams-6.5.3.tgz",
    +      "integrity": "sha512-vN4Qi8o+b7zj1FDVNZ+PlmAcy1sBoV7SC956uhqYvZ9Sg1fViSbOpydULOssVJ4tOyKRifH/eoi6h99d+sJ33w==",
           "dev": true,
           "requires": {
    -        "workbox-core": "6.5.1",
    -        "workbox-routing": "6.5.1"
    +        "workbox-core": "6.5.3",
    +        "workbox-routing": "6.5.3"
           }
         },
         "workbox-sw": {
    -      "version": "6.5.1",
    -      "resolved": "https://registry.npmjs.org/workbox-sw/-/workbox-sw-6.5.1.tgz",
    -      "integrity": "sha512-hVrQa19yo9wzN1fQQ/h2JlkzFpkuH2qzYT2/rk7CLaWt6tLnTJVFCNHlGRRPhytZSf++LoIy7zThT714sowT/Q==",
    +      "version": "6.5.3",
    +      "resolved": "https://registry.npmjs.org/workbox-sw/-/workbox-sw-6.5.3.tgz",
    +      "integrity": "sha512-BQBzm092w+NqdIEF2yhl32dERt9j9MDGUTa2Eaa+o3YKL4Qqw55W9yQC6f44FdAHdAJrJvp0t+HVrfh8AiGj8A==",
           "dev": true
         },
         "workbox-webpack-plugin": {
    -      "version": "6.5.1",
    -      "resolved": "https://registry.npmjs.org/workbox-webpack-plugin/-/workbox-webpack-plugin-6.5.1.tgz",
    -      "integrity": "sha512-SHtlQBpKruI16CAYhICDMkgjXE2fH5Yp+D+1UmBfRVhByZYzusVOykvnPm8ObJb9d/tXgn9yoppoxafFS7D4vQ==",
    +      "version": "6.5.3",
    +      "resolved": "https://registry.npmjs.org/workbox-webpack-plugin/-/workbox-webpack-plugin-6.5.3.tgz",
    +      "integrity": "sha512-Es8Xr02Gi6Kc3zaUwR691ZLy61hz3vhhs5GztcklQ7kl5k2qAusPh0s6LF3wEtlpfs9ZDErnmy5SErwoll7jBA==",
           "dev": true,
           "requires": {
             "fast-json-stable-stringify": "^2.1.0",
             "pretty-bytes": "^5.4.1",
             "upath": "^1.2.0",
             "webpack-sources": "^1.4.3",
    -        "workbox-build": "6.5.1"
    +        "workbox-build": "6.5.3"
           },
           "dependencies": {
    -        "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
    -        },
             "webpack-sources": {
               "version": "1.4.3",
               "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz",
    @@ -30253,13 +30491,13 @@
           }
         },
         "workbox-window": {
    -      "version": "6.5.1",
    -      "resolved": "https://registry.npmjs.org/workbox-window/-/workbox-window-6.5.1.tgz",
    -      "integrity": "sha512-oRlun9u7b7YEjo2fIDBqJkU2hXtrEljXcOytRhfeQRbqXxjUOpFgXSGRSAkmDx1MlKUNOSbr+zfi8h5n7In3yA==",
    +      "version": "6.5.3",
    +      "resolved": "https://registry.npmjs.org/workbox-window/-/workbox-window-6.5.3.tgz",
    +      "integrity": "sha512-GnJbx1kcKXDtoJBVZs/P7ddP0Yt52NNy4nocjBpYPiRhMqTpJCNrSL+fGHZ/i/oP6p/vhE8II0sA6AZGKGnssw==",
           "dev": true,
           "requires": {
             "@types/trusted-types": "^2.0.2",
    -        "workbox-core": "6.5.1"
    +        "workbox-core": "6.5.3"
           }
         },
         "wrap-ansi": {
    @@ -30276,7 +30514,7 @@
         "wrappy": {
           "version": "1.0.2",
           "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
    -      "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
    +      "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==",
           "dev": true
         },
         "write-file-atomic": {
    @@ -30292,9 +30530,9 @@
           }
         },
         "ws": {
    -      "version": "7.5.7",
    -      "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.7.tgz",
    -      "integrity": "sha512-KMvVuFzpKBuiIXW3E4u3mySRO2/mCHSyZDJQM5NQ9Q9KHWHWh0NHgfbRMLLrceUK5qAL4ytALJbpRMjixFZh8A==",
    +      "version": "7.5.8",
    +      "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.8.tgz",
    +      "integrity": "sha512-ri1Id1WinAX5Jqn9HejiGb8crfRio0Qgu8+MtL36rlTA6RLsMdWt1Az/19A2Qij6uSHUMphEFaTKa4WG+UNHNw==",
           "dev": true,
           "requires": {}
         },
    @@ -30354,14 +30592,6 @@
           "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==",
           "dev": true
         },
    -    "yn": {
    -      "version": "3.1.1",
    -      "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz",
    -      "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==",
    -      "dev": true,
    -      "optional": true,
    -      "peer": true
    -    },
         "yocto-queue": {
           "version": "0.1.0",
           "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
    diff --git a/web/ui/react-app/package.json b/web/ui/react-app/package.json
    index aaf8166e52b..f9800685f93 100644
    --- a/web/ui/react-app/package.json
    +++ b/web/ui/react-app/package.json
    @@ -3,22 +3,20 @@
       "version": "0.1.0",
       "private": true,
       "dependencies": {
    -    "@codemirror/autocomplete": "^0.19.9",
    -    "@codemirror/closebrackets": "^0.19.0",
    -    "@codemirror/commands": "^0.19.5",
    -    "@codemirror/comment": "^0.19.0",
    -    "@codemirror/highlight": "^0.19.6",
    -    "@codemirror/history": "^0.19.2",
    -    "@codemirror/language": "^0.19.7",
    -    "@codemirror/lint": "^0.19.3",
    -    "@codemirror/matchbrackets": "^0.19.3",
    -    "@codemirror/search": "^0.19.3",
    -    "@codemirror/state": "^0.19.6",
    -    "@codemirror/view": "^0.19.27",
    +    "@codemirror/autocomplete": "^6.0.0",
    +    "@codemirror/commands": "^6.0.0",
    +    "@codemirror/language": "^6.0.0",
    +    "@codemirror/lint": "^6.0.0",
    +    "@codemirror/search": "^6.0.0",
    +    "@codemirror/state": "^6.0.0",
    +    "@codemirror/view": "^6.0.0",
         "@forevolve/bootstrap-dark": "^1.0.0",
         "@fortawesome/fontawesome-svg-core": "6.1.1",
         "@fortawesome/free-solid-svg-icons": "6.1.1",
         "@fortawesome/react-fontawesome": "0.1.17",
    +    "@lezer/lr": "^1.0.0",
    +    "@lezer/highlight": "^1.0.0",
    +    "@lezer/common": "^1.0.0",
         "@nexucis/fuzzy": "^0.4.0",
         "@nexucis/kvsearch": "^0.7.0",
         "@prometheus-io/codemirror-promql": "0.19.0",
    diff --git a/web/ui/react-app/src/pages/graph/CMTheme.tsx b/web/ui/react-app/src/pages/graph/CMTheme.tsx
    index cd2aa69a4c5..55b319dc28f 100644
    --- a/web/ui/react-app/src/pages/graph/CMTheme.tsx
    +++ b/web/ui/react-app/src/pages/graph/CMTheme.tsx
    @@ -1,5 +1,6 @@
    -import { HighlightStyle, tags } from '@codemirror/highlight';
     import { EditorView } from '@codemirror/view';
    +import { HighlightStyle } from '@codemirror/language';
    +import { tags } from '@lezer/highlight';
     
     export const baseTheme = EditorView.theme({
       '&.cm-editor': {
    diff --git a/web/ui/react-app/src/pages/graph/ExpressionInput.tsx b/web/ui/react-app/src/pages/graph/ExpressionInput.tsx
    index 05f4c7ba6e9..d93014ef2e4 100644
    --- a/web/ui/react-app/src/pages/graph/ExpressionInput.tsx
    +++ b/web/ui/react-app/src/pages/graph/ExpressionInput.tsx
    @@ -3,15 +3,18 @@ import { Button, InputGroup, InputGroupAddon, InputGroupText } from 'reactstrap'
     
     import { EditorView, highlightSpecialChars, keymap, ViewUpdate, placeholder } from '@codemirror/view';
     import { EditorState, Prec, Compartment } from '@codemirror/state';
    -import { indentOnInput, syntaxTree } from '@codemirror/language';
    -import { history, historyKeymap } from '@codemirror/history';
    -import { defaultKeymap, insertNewlineAndIndent } from '@codemirror/commands';
    -import { bracketMatching } from '@codemirror/matchbrackets';
    -import { closeBrackets, closeBracketsKeymap } from '@codemirror/closebrackets';
    +import { bracketMatching, indentOnInput, syntaxHighlighting, syntaxTree } from '@codemirror/language';
    +import { defaultKeymap, history, historyKeymap, insertNewlineAndIndent } from '@codemirror/commands';
     import { highlightSelectionMatches } from '@codemirror/search';
    -import { commentKeymap } from '@codemirror/comment';
     import { lintKeymap } from '@codemirror/lint';
    -import { autocompletion, completionKeymap, CompletionContext, CompletionResult } from '@codemirror/autocomplete';
    +import {
    +  autocompletion,
    +  completionKeymap,
    +  CompletionContext,
    +  CompletionResult,
    +  closeBrackets,
    +  closeBracketsKeymap,
    +} from '@codemirror/autocomplete';
     import { baseTheme, lightTheme, darkTheme, promqlHighlighter } from './CMTheme';
     
     import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
    @@ -67,7 +70,7 @@ export class HistoryCompleteStrategy implements CompleteStrategy {
               apply: q,
               info: q.length < 80 ? undefined : q,
             })),
    -        span: /^[a-zA-Z0-9_:]+$/,
    +        validFor: /^[a-zA-Z0-9_:]+$/,
           };
     
           if (res !== null) {
    @@ -110,7 +113,7 @@ const ExpressionInput: FC = ({
             ),
           });
         const dynamicConfig = [
    -      enableHighlighting ? promqlHighlighter : [],
    +      enableHighlighting ? syntaxHighlighting(promqlHighlighter) : [],
           promqlExtension.asExtension(),
           theme === 'dark' ? darkTheme : lightTheme,
         ];
    @@ -136,14 +139,7 @@ const ExpressionInput: FC = ({
               autocompletion(),
               highlightSelectionMatches(),
               EditorView.lineWrapping,
    -          keymap.of([
    -            ...closeBracketsKeymap,
    -            ...defaultKeymap,
    -            ...historyKeymap,
    -            ...commentKeymap,
    -            ...completionKeymap,
    -            ...lintKeymap,
    -          ]),
    +          keymap.of([...closeBracketsKeymap, ...defaultKeymap, ...historyKeymap, ...completionKeymap, ...lintKeymap]),
               placeholder('Expression (press Shift+Enter for newlines)'),
               dynamicConfigCompartment.of(dynamicConfig),
               // This keymap is added without precedence so that closing the autocomplete dropdown
    @@ -157,7 +153,7 @@ const ExpressionInput: FC = ({
                   },
                 },
               ]),
    -          Prec.override(
    +          Prec.highest(
                 keymap.of([
                   {
                     key: 'Enter',
    
    From df1187c3eb1a5125780296330a11563dcdc09689 Mon Sep 17 00:00:00 2001
    From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
    Date: Tue, 1 Nov 2022 20:22:40 +0000
    Subject: [PATCH 135/135] build(deps): bump github.com/stretchr/testify
    
    Bumps [github.com/stretchr/testify](https://github.com/stretchr/testify) from 1.7.2 to 1.8.1.
    - [Release notes](https://github.com/stretchr/testify/releases)
    - [Commits](https://github.com/stretchr/testify/compare/v1.7.2...v1.8.1)
    
    ---
    updated-dependencies:
    - dependency-name: github.com/stretchr/testify
      dependency-type: direct:production
      update-type: version-update:semver-minor
    ...
    
    Signed-off-by: dependabot[bot] 
    ---
     documentation/examples/remote_storage/go.mod | 2 +-
     documentation/examples/remote_storage/go.sum | 8 ++++++--
     2 files changed, 7 insertions(+), 3 deletions(-)
    
    diff --git a/documentation/examples/remote_storage/go.mod b/documentation/examples/remote_storage/go.mod
    index 10b33e51f28..a8eb2e4eac7 100644
    --- a/documentation/examples/remote_storage/go.mod
    +++ b/documentation/examples/remote_storage/go.mod
    @@ -10,7 +10,7 @@ require (
     	github.com/prometheus/client_golang v1.12.2
     	github.com/prometheus/common v0.34.0
     	github.com/prometheus/prometheus v1.8.2-0.20220202104425-d819219dd438
    -	github.com/stretchr/testify v1.7.2
    +	github.com/stretchr/testify v1.8.1
     	gopkg.in/alecthomas/kingpin.v2 v2.2.6
     )
     
    diff --git a/documentation/examples/remote_storage/go.sum b/documentation/examples/remote_storage/go.sum
    index bedf519ed00..c4062860812 100644
    --- a/documentation/examples/remote_storage/go.sum
    +++ b/documentation/examples/remote_storage/go.sum
    @@ -1224,6 +1224,8 @@ github.com/stretchr/objx v0.0.0-20180129172003-8a3f7159479f/go.mod h1:HFkY916IF+
     github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
     github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
     github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE=
    +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
    +github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=
     github.com/stretchr/testify v0.0.0-20180303142811-b89eecf5ca5d/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
     github.com/stretchr/testify v1.2.0/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
     github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
    @@ -1232,8 +1234,10 @@ github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81P
     github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=
     github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
     github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
    -github.com/stretchr/testify v1.7.2 h1:4jaiDzPyXQvSd7D0EjG45355tLlV3VOECpq10pLC+8s=
    -github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals=
    +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
    +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
    +github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk=
    +github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
     github.com/syndtr/gocapability v0.0.0-20170704070218-db04d3cc01c8/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww=
     github.com/syndtr/gocapability v0.0.0-20180916011248-d98352740cb2/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww=
     github.com/syndtr/gocapability v0.0.0-20200815063812-42c35b437635/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww=